diff options
-rwxr-xr-x | configure | 11 | ||||
-rw-r--r-- | doc/user-guide/commands.xml | 10 | ||||
-rw-r--r-- | protocols/nogaim.c | 5 | ||||
-rw-r--r-- | protocols/yahoo/Makefile | 47 | ||||
-rw-r--r-- | protocols/yahoo/libyahoo2.c | 5711 | ||||
-rw-r--r-- | protocols/yahoo/yahoo.c | 1024 | ||||
-rw-r--r-- | protocols/yahoo/yahoo2.h | 245 | ||||
-rw-r--r-- | protocols/yahoo/yahoo2_callbacks.h | 786 | ||||
-rw-r--r-- | protocols/yahoo/yahoo2_types.h | 396 | ||||
-rw-r--r-- | protocols/yahoo/yahoo_debug.h | 40 | ||||
-rw-r--r-- | protocols/yahoo/yahoo_httplib.c | 431 | ||||
-rw-r--r-- | protocols/yahoo/yahoo_httplib.h | 48 | ||||
-rw-r--r-- | protocols/yahoo/yahoo_list.h | 48 | ||||
-rw-r--r-- | protocols/yahoo/yahoo_util.c | 114 | ||||
-rw-r--r-- | protocols/yahoo/yahoo_util.h | 105 |
15 files changed, 0 insertions, 9021 deletions
@@ -34,7 +34,6 @@ configure_args="$@" msn="default-on" jabber="default-on" oscar="default-on" -yahoo="default-on" twitter=1 purple=0 @@ -129,7 +128,6 @@ Option Description Default --msn=0/1 Disable/enable MSN part $msn --jabber=0/1 Disable/enable Jabber part $jabber --oscar=0/1 Disable/enable Oscar part (ICQ, AIM) $oscar ---yahoo=0/1 Disable/enable Yahoo part $yahoo --twitter=0/1 Disable/enable Twitter part $twitter --purple=0/1 Disable/enable libpurple support $purple @@ -816,7 +814,6 @@ EOF [ "$msn" = "default-on" ] && msn=0 [ "$jabber" = "default-on" ] && jabber=0 [ "$oscar" = "default-on" ] && oscar=0 - [ "$yahoo" = "default-on" ] && yahoo=0 echo '#undef PACKAGE' >> config.h echo '#define PACKAGE "BitlBee-LIBPURPLE"' >> config.h @@ -861,14 +858,6 @@ else protoobjs=$protoobjs'oscar_mod.o ' fi -if [ "$yahoo" = 0 ]; then - echo '#undef WITH_YAHOO' >> config.h -else - echo '#define WITH_YAHOO' >> config.h - protocols=$protocols'yahoo ' - protoobjs=$protoobjs'yahoo_mod.o ' -fi - if [ "$twitter" = 0 ]; then echo '#undef WITH_TWITTER' >> config.h else diff --git a/doc/user-guide/commands.xml b/doc/user-guide/commands.xml index ef1023cd..ee361b0f 100644 --- a/doc/user-guide/commands.xml +++ b/doc/user-guide/commands.xml @@ -103,16 +103,6 @@ </description> </bitlbee-command> - <bitlbee-command name="yahoo"> - <syntax>account add yahoo <handle> [<password>]</syntax> - - <description> - <para> - For Yahoo! connections there are no special arguments. - </para> - </description> - </bitlbee-command> - </bitlbee-command> <bitlbee-command name="del"> diff --git a/protocols/nogaim.c b/protocols/nogaim.c index 608e4d33..8a22654e 100644 --- a/protocols/nogaim.c +++ b/protocols/nogaim.c @@ -246,7 +246,6 @@ void nogaim_init() { extern void msn_initmodule(); extern void oscar_initmodule(); - extern void byahoo_initmodule(); extern void jabber_initmodule(); extern void twitter_initmodule(); extern void purple_initmodule(); @@ -262,10 +261,6 @@ void nogaim_init() oscar_initmodule(); #endif -#ifdef WITH_YAHOO - byahoo_initmodule(); -#endif - #ifdef WITH_JABBER jabber_initmodule(); #endif diff --git a/protocols/yahoo/Makefile b/protocols/yahoo/Makefile deleted file mode 100644 index 8ac73e49..00000000 --- a/protocols/yahoo/Makefile +++ /dev/null @@ -1,47 +0,0 @@ -########################### -## Makefile for BitlBee ## -## ## -## Copyright 2002 Lintux ## -########################### - -### DEFINITIONS - --include ../../Makefile.settings -ifdef _SRCDIR_ -_SRCDIR_ := $(_SRCDIR_)protocols/yahoo/ -endif - -# [SH] Program variables -objects = yahoo.o libyahoo2.o yahoo_httplib.o yahoo_util.o - -CFLAGS += -DSTDC_HEADERS -DHAVE_STRING_H -DHAVE_STRCHR -DHAVE_MEMCPY -DHAVE_GLIB -LFLAGS += -r - -# [SH] Phony targets -all: yahoo_mod.o -check: all -lcov: check -gcov: - gcov *.c - -.PHONY: all clean distclean - -clean: - rm -f *.o core - -distclean: clean - rm -rf .depend - -### MAIN PROGRAM - -$(objects): ../../Makefile.settings Makefile - -$(objects): %.o: $(_SRCDIR_)%.c - @echo '*' Compiling $< - @$(CC) -c $(CFLAGS) $(CFLAGS_BITLBEE) $< -o $@ - -yahoo_mod.o: $(objects) - @echo '*' Linking yahoo_mod.o - @$(LD) $(LFLAGS) $(objects) -o yahoo_mod.o - --include .depend/*.d diff --git a/protocols/yahoo/libyahoo2.c b/protocols/yahoo/libyahoo2.c deleted file mode 100644 index b6f20e16..00000000 --- a/protocols/yahoo/libyahoo2.c +++ /dev/null @@ -1,5711 +0,0 @@ -/* - * libyahoo2: libyahoo2.c - * - * Some code copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net> - * YMSG16 code copyright (C) 2009, - * Siddhesh Poyarekar <siddhesh dot poyarekar at gmail dot com> - * - * Yahoo Search copyright (C) 2003, Konstantin Klyagin <konst AT konst.org.ua> - * - * Much of this code was taken and adapted from the yahoo module for - * gaim released under the GNU GPL. This code is also released under the - * GNU GPL. - * - * This code is derivative of Gaim <http://gaim.sourceforge.net> - * copyright (C) 1998-1999, Mark Spencer <markster@marko.net> - * 1998-1999, Adam Fritzler <afritz@marko.net> - * 1998-2002, Rob Flynn <rob@marko.net> - * 2000-2002, Eric Warmenhoven <eric@warmenhoven.org> - * 2001-2002, Brian Macke <macke@strangelove.net> - * 2001, Anand Biligiri S <abiligiri@users.sf.net> - * 2001, Valdis Kletnieks - * 2002, Sean Egan <bj91704@binghamton.edu> - * 2002, Toby Gray <toby.gray@ntlworld.com> - * - * This library also uses code from other libraries, namely: - * Portions from libfaim copyright 1998, 1999 Adam Fritzler - * <afritz@auk.cx> - * Portions of Sylpheed copyright 2000-2002 Hiroyuki Yamamoto - * <hiro-y@kcn.ne.jp> - * - * YMSG16 authentication code based mostly on write-up at: - * http://www.carbonize.co.uk/ymsg16.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include <unistd.h> -#include <errno.h> -#include <stdio.h> -#include <stdarg.h> - -#if STDC_HEADERS -# include <string.h> -#else -# if !HAVE_STRCHR -# define strchr index -# define strrchr rindex -# endif -char *strchr(), *strrchr(); -# if !HAVE_MEMCPY -# define memcpy(d, s, n) bcopy((s), (d), (n)) -# define memmove(d, s, n) bcopy((s), (d), (n)) -# endif -#endif - -#include <sys/types.h> - -#ifdef __MINGW32__ -# include <winsock2.h> -#endif - -#include <stdlib.h> -#include <ctype.h> - -#include "sha1.h" -#include "md5.h" -#include "yahoo2.h" -#include "yahoo_httplib.h" -#include "yahoo_util.h" - -#include "yahoo2_callbacks.h" -#include "yahoo_debug.h" -#if defined(__MINGW32__) && !defined(HAVE_GLIB) -#define snprintf _snprintf -#define vsnprintf _vsnprintf -#endif - -#include "base64.h" -#include "http_client.h" - -#ifdef USE_STRUCT_CALLBACKS -struct yahoo_callbacks *yc = NULL; - -void yahoo_register_callbacks(struct yahoo_callbacks *tyc) -{ - yc = tyc; -} - -#define YAHOO_CALLBACK(x) yc->x -#else -#define YAHOO_CALLBACK(x) x -#endif - -static int yahoo_send_data(void *fd, void *data, int len); -static void _yahoo_http_connected(int id, void *fd, int error, void *data); -static void yahoo_connected(void *fd, int error, void *data); - -int yahoo_log_message(char *fmt, ...) -{ - char out[1024]; - va_list ap; - - va_start(ap, fmt); - vsnprintf(out, sizeof(out), fmt, ap); - va_end(ap); - return YAHOO_CALLBACK (ext_yahoo_log) ("%s", out); -} - -static enum yahoo_log_level log_level = YAHOO_LOG_NONE; - -enum yahoo_log_level yahoo_get_log_level() -{ - return log_level; -} - -int yahoo_set_log_level(enum yahoo_log_level level) -{ - enum yahoo_log_level l = log_level; - - log_level = level; - return l; -} - -/* default values for servers */ -static char *default_pager_hosts[] = { "scs.msg.yahoo.com", - "scsa.msg.yahoo.com", - "scsb.msg.yahoo.com", - "scsc.msg.yahoo.com", - NULL }; - -static int pager_port = 5050; -static int fallback_ports[] = { 23, 25, 80, 20, 119, 8001, 8002, 5050, 0 }; - -static char filetransfer_host[] = "filetransfer.msg.yahoo.com"; -static int filetransfer_port = 80; -static char webcam_host[] = "webcam.yahoo.com"; -static int webcam_port = 5100; -static char webcam_description[] = ""; -static char local_host[] = ""; -static int conn_type = Y_WCM_DSL; - -static char profile_url[] = "http://profiles.yahoo.com/"; - -struct connect_callback_data { - struct yahoo_data *yd; - int tag; - int i; - int server_i; -}; - -struct yahoo_pair { - int key; - char *value; -}; - -struct yahoo_packet { - unsigned short int service; - unsigned int status; - unsigned int id; - YList *hash; -}; - -struct yahoo_search_state { - int lsearch_type; - char *lsearch_text; - int lsearch_gender; - int lsearch_agerange; - int lsearch_photo; - int lsearch_yahoo_only; - int lsearch_nstart; - int lsearch_nfound; - int lsearch_ntotal; -}; - -struct data_queue { - unsigned char *queue; - int len; -}; - -struct yahoo_input_data { - struct yahoo_data *yd; - struct yahoo_webcam *wcm; - struct yahoo_webcam_data *wcd; - struct yahoo_search_state *ys; - - void *fd; - enum yahoo_connection_type type; - - unsigned char *rxqueue; - int rxlen; - int read_tag; - - YList *txqueues; - int write_tag; -}; - -struct yahoo_server_settings { - char *pager_host; - int pager_port; - char *filetransfer_host; - int filetransfer_port; - char *webcam_host; - int webcam_port; - char *webcam_description; - char *local_host; - int conn_type; - char **pager_host_list; -}; - -static void yahoo_process_ft_connection(struct yahoo_input_data *yid, int over); - -static void yahoo_process_filetransfer(struct yahoo_input_data *yid, - struct yahoo_packet *pkt); -static void yahoo_process_filetransferinfo(struct yahoo_input_data *yid, - struct yahoo_packet *pkt); -static void yahoo_process_filetransferaccept(struct yahoo_input_data *yid, - struct yahoo_packet *pkt); - -static void yahoo_https_auth(struct yahoo_input_data *yid, const char *seed, const char *sn); - -static void *_yahoo_default_server_settings() -{ - struct yahoo_server_settings *yss = - y_new0(struct yahoo_server_settings, 1); - - /* Give preference to the default host list - * Make sure that only one of the two is set at any time - */ - yss->pager_host = NULL; - yss->pager_host_list = default_pager_hosts; - - yss->pager_port = pager_port; - yss->filetransfer_host = strdup(filetransfer_host); - yss->filetransfer_port = filetransfer_port; - yss->webcam_host = strdup(webcam_host); - yss->webcam_port = webcam_port; - yss->webcam_description = strdup(webcam_description); - yss->local_host = strdup(local_host); - yss->conn_type = conn_type; - - return yss; -} - -static void *_yahoo_assign_server_settings(va_list ap) -{ - struct yahoo_server_settings *yss = _yahoo_default_server_settings(); - char *key; - char *svalue; - int nvalue; - char **pvalue; - - while (1) { - key = va_arg(ap, char *); - if (key == NULL) { - break; - } - - if (!strcmp(key, "pager_host")) { - svalue = va_arg(ap, char *); - free(yss->pager_host); - yss->pager_host = strdup(svalue); - yss->pager_host_list = NULL; - } else if (!strcmp(key, "pager_host_list")) { - pvalue = va_arg(ap, char **); - yss->pager_host_list = pvalue; - free(yss->pager_host); - yss->pager_host = NULL; - } else if (!strcmp(key, "pager_port")) { - nvalue = va_arg(ap, int); - yss->pager_port = nvalue; - } else if (!strcmp(key, "filetransfer_host")) { - svalue = va_arg(ap, char *); - free(yss->filetransfer_host); - yss->filetransfer_host = strdup(svalue); - } else if (!strcmp(key, "filetransfer_port")) { - nvalue = va_arg(ap, int); - yss->filetransfer_port = nvalue; - } else if (!strcmp(key, "webcam_host")) { - svalue = va_arg(ap, char *); - free(yss->webcam_host); - yss->webcam_host = strdup(svalue); - } else if (!strcmp(key, "webcam_port")) { - nvalue = va_arg(ap, int); - yss->webcam_port = nvalue; - } else if (!strcmp(key, "webcam_description")) { - svalue = va_arg(ap, char *); - free(yss->webcam_description); - yss->webcam_description = strdup(svalue); - } else if (!strcmp(key, "local_host")) { - svalue = va_arg(ap, char *); - free(yss->local_host); - yss->local_host = strdup(svalue); - } else if (!strcmp(key, "conn_type")) { - nvalue = va_arg(ap, int); - yss->conn_type = nvalue; - } else { - WARNING(("Unknown key passed to yahoo_init, " - "perhaps you didn't terminate the list " - "with NULL")); - } - } - - return yss; -} - -static void yahoo_free_server_settings(struct yahoo_server_settings *yss) -{ - if (!yss) { - return; - } - - free(yss->pager_host); - free(yss->filetransfer_host); - free(yss->webcam_host); - free(yss->webcam_description); - free(yss->local_host); - - free(yss); -} - -static YList *conns = NULL; -static YList *inputs = NULL; -static int last_id = 0; - -static void add_to_list(struct yahoo_data *yd) -{ - conns = y_list_prepend(conns, yd); -} - -static struct yahoo_data *find_conn_by_id(int id) -{ - YList *l; - - for (l = conns; l; l = y_list_next(l)) { - struct yahoo_data *yd = l->data; - if (yd->client_id == id) { - return yd; - } - } - return NULL; -} - -static void del_from_list(struct yahoo_data *yd) -{ - conns = y_list_remove(conns, yd); -} - -/* call repeatedly to get the next one */ -/* -static struct yahoo_input_data * find_input_by_id(int id) -{ - YList *l; - for(l = inputs; l; l = y_list_next(l)) { - struct yahoo_input_data *yid = l->data; - if(yid->yd->client_id == id) - return yid; - } - return NULL; -} -*/ - -#if 0 -static struct yahoo_input_data *find_input_by_id_and_webcam_user(int id, - const char *who) -{ - YList *l; - - LOG(("find_input_by_id_and_webcam_user")); - for (l = inputs; l; l = y_list_next(l)) { - struct yahoo_input_data *yid = l->data; - if (yid->type == YAHOO_CONNECTION_WEBCAM - && yid->yd->client_id == id && yid->wcm && ((who - && yid->wcm->user - && !strcmp(who, yid->wcm->user)) - || !(yid->wcm->user && !who))) { - return yid; - } - } - return NULL; -} -#endif - -static struct yahoo_input_data *find_input_by_id_and_type(int id, - enum yahoo_connection_type type) -{ - YList *l; - - LOG(("find_input_by_id_and_type")); - for (l = inputs; l; l = y_list_next(l)) { - struct yahoo_input_data *yid = l->data; - if (yid->type == type && yid->yd->client_id == id) { - return yid; - } - } - return NULL; -} - -static struct yahoo_input_data *find_input_by_id_and_fd(int id, void *fd) -{ - YList *l; - - LOG(("find_input_by_id_and_fd")); - for (l = inputs; l; l = y_list_next(l)) { - struct yahoo_input_data *yid = l->data; - if (yid->fd == fd && yid->yd->client_id == id) { - return yid; - } - } - return NULL; -} - -static int count_inputs_with_id(int id) -{ - int c = 0; - YList *l; - - LOG(("counting %d", id)); - for (l = inputs; l; l = y_list_next(l)) { - struct yahoo_input_data *yid = l->data; - if (yid->yd->client_id == id) { - c++; - } - } - LOG(("%d", c)); - return c; -} - -/* Free a buddy list */ -static void yahoo_free_buddies(YList *list) -{ - YList *l; - - for (l = list; l; l = l->next) { - struct yahoo_buddy *bud = l->data; - if (!bud) { - continue; - } - - FREE(bud->group); - FREE(bud->id); - FREE(bud->real_name); - if (bud->yab_entry) { - FREE(bud->yab_entry->fname); - FREE(bud->yab_entry->lname); - FREE(bud->yab_entry->nname); - FREE(bud->yab_entry->id); - FREE(bud->yab_entry->email); - FREE(bud->yab_entry->hphone); - FREE(bud->yab_entry->wphone); - FREE(bud->yab_entry->mphone); - FREE(bud->yab_entry); - } - FREE(bud); - l->data = bud = NULL; - } - - y_list_free(list); -} - -/* Free an identities list */ -static void yahoo_free_identities(YList *list) -{ - while (list) { - YList *n = list; - FREE(list->data); - list = y_list_remove_link(list, list); - y_list_free_1(n); - } -} - -/* Free webcam data */ -static void yahoo_free_webcam(struct yahoo_webcam *wcm) -{ - if (wcm) { - FREE(wcm->user); - FREE(wcm->server); - FREE(wcm->key); - FREE(wcm->description); - FREE(wcm->my_ip); - } - FREE(wcm); -} - -static void yahoo_free_data(struct yahoo_data *yd) -{ - FREE(yd->user); - FREE(yd->password); - FREE(yd->cookie_y); - FREE(yd->cookie_t); - FREE(yd->cookie_b); - FREE(yd->cookie_c); - FREE(yd->login_cookie); - FREE(yd->login_id); - - yahoo_free_buddies(yd->buddies); - yahoo_free_buddies(yd->ignore); - yahoo_free_identities(yd->identities); - - yahoo_free_server_settings(yd->server_settings); - - FREE(yd); -} - -#define YAHOO_PACKET_HDRLEN (4 + 2 + 2 + 2 + 2 + 4 + 4) - -static struct yahoo_packet *yahoo_packet_new(enum yahoo_service service, - enum ypacket_status status, int id) -{ - struct yahoo_packet *pkt = y_new0(struct yahoo_packet, 1); - - pkt->service = service; - pkt->status = status; - pkt->id = id; - - return pkt; -} - -static void yahoo_packet_hash(struct yahoo_packet *pkt, int key, - const char *value) -{ - struct yahoo_pair *pair = y_new0(struct yahoo_pair, 1); - - pair->key = key; - pair->value = strdup(value); - pkt->hash = y_list_append(pkt->hash, pair); -} - -static int yahoo_packet_length(struct yahoo_packet *pkt) -{ - YList *l; - - int len = 0; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - int tmp = pair->key; - do { - tmp /= 10; - len++; - } while (tmp); - len += 2; - len += strlen(pair->value); - len += 2; - } - - return len; -} - -#define yahoo_put16(buf, data) ( \ - (*(buf) = (unsigned char) ((data) >> 8) & 0xff), \ - (*((buf) + 1) = (unsigned char) (data) & 0xff), \ - 2) -#define yahoo_get16(buf) ((((*(buf)) & 0xff) << 8) + ((*((buf) + 1)) & 0xff)) -#define yahoo_put32(buf, data) ( \ - (*((buf)) = (unsigned char) ((data) >> 24) & 0xff), \ - (*((buf) + 1) = (unsigned char) ((data) >> 16) & 0xff), \ - (*((buf) + 2) = (unsigned char) ((data) >> 8) & 0xff), \ - (*((buf) + 3) = (unsigned char) (data) & 0xff), \ - 4) -#define yahoo_get32(buf) ((((*(buf)) & 0xff) << 24) + \ - (((*((buf) + 1)) & 0xff) << 16) + \ - (((*((buf) + 2)) & 0xff) << 8) + \ - (((*((buf) + 3)) & 0xff))) - -static void yahoo_packet_read(struct yahoo_packet *pkt, unsigned char *data, - int len) -{ - int pos = 0; - - while (pos + 1 < len) { - char *key, *value = NULL; - int accept; - int x; - - struct yahoo_pair *pair = y_new0(struct yahoo_pair, 1); - - key = malloc(len + 1); - x = 0; - while (pos + 1 < len) { - if (data[pos] == 0xc0 && data[pos + 1] == 0x80) { - break; - } - key[x++] = data[pos++]; - } - key[x] = 0; - pos += 2; - pair->key = strtol(key, NULL, 10); - free(key); - - /* Libyahoo2 developer(s) don't seem to have the time to fix - this problem, so for now try to work around it: - - Sometimes we receive an invalid packet with not any more - data at this point. I don't know how to handle this in a - clean way, but let's hope this is clean enough: */ - - if (pos + 1 < len) { - accept = x; - /* if x is 0 there was no key, so don't accept it */ - if (accept) { - value = malloc(len - pos + 1); - } - x = 0; - while (pos + 1 < len) { - if (data[pos] == 0xc0 && data[pos + 1] == 0x80) { - break; - } - if (accept) { - value[x++] = data[pos++]; - } - } - if (accept) { - value[x] = 0; - } - pos += 2; - } else { - accept = 0; - } - - if (accept) { - pair->value = strdup(value); - FREE(value); - pkt->hash = y_list_append(pkt->hash, pair); - DEBUG_MSG(("Key: %d \tValue: %s", pair->key, - pair->value)); - } else { - FREE(pair); - } - } -} - -static void yahoo_packet_write(struct yahoo_packet *pkt, unsigned char *data) -{ - YList *l; - int pos = 0; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - unsigned char buf[100]; - - snprintf((char *) buf, sizeof(buf), "%d", pair->key); - strcpy((char *) data + pos, (char *) buf); - pos += strlen((char *) buf); - data[pos++] = 0xc0; - data[pos++] = 0x80; - - strcpy((char *) data + pos, pair->value); - pos += strlen(pair->value); - data[pos++] = 0xc0; - data[pos++] = 0x80; - } -} - -static void yahoo_dump_unhandled(struct yahoo_packet *pkt) -{ - YList *l; - - NOTICE(("Service: 0x%02x\tStatus: %d", pkt->service, pkt->status)); - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - NOTICE(("\t%d => %s", pair->key, pair->value)); - } -} - -static void yahoo_packet_dump(unsigned char *data, int len) -{ - if (yahoo_get_log_level() >= YAHOO_LOG_DEBUG) { - int i; - for (i = 0; i < len; i++) { - if ((i % 8 == 0) && i) { - YAHOO_CALLBACK (ext_yahoo_log) (" "); - } - if ((i % 16 == 0) && i) { - YAHOO_CALLBACK (ext_yahoo_log) ("\n"); - } - YAHOO_CALLBACK (ext_yahoo_log) ("%02x ", data[i]); - } - YAHOO_CALLBACK (ext_yahoo_log) ("\n"); - for (i = 0; i < len; i++) { - if ((i % 8 == 0) && i) { - YAHOO_CALLBACK (ext_yahoo_log) (" "); - } - if ((i % 16 == 0) && i) { - YAHOO_CALLBACK (ext_yahoo_log) ("\n"); - } - if (isprint(data[i])) { - YAHOO_CALLBACK (ext_yahoo_log) (" %c ", data[i]); - } else { - YAHOO_CALLBACK (ext_yahoo_log) (" . "); - } - } - YAHOO_CALLBACK (ext_yahoo_log) ("\n"); - } -} - -/* yahoo's variant of base64 */ -static void to_y64(unsigned char *out, const unsigned char *in, int inlen) -{ - char *encoded = base64_encode(in, inlen); - int i = 0; - - do { - if (encoded[i] == '+') { - out[i] = '.'; - } else if (encoded[i] == '/') { - out[i] = '_'; - } else if (encoded[i] == '=') { - out[i] = '-'; - } else { - out[i] = encoded[i]; - } - } while (encoded[i++]); - - g_free(encoded); -} - -static void yahoo_add_to_send_queue(struct yahoo_input_data *yid, void *data, - int length) -{ - struct data_queue *tx = y_new0(struct data_queue, 1); - - tx->queue = y_new0(unsigned char, length); - tx->len = length; - memcpy(tx->queue, data, length); - - yid->txqueues = y_list_append(yid->txqueues, tx); - - if (!yid->write_tag) { - yid->write_tag = - YAHOO_CALLBACK (ext_yahoo_add_handler) (yid->yd-> - client_id, yid->fd, YAHOO_INPUT_WRITE, yid); - } -} - -static void yahoo_send_packet(struct yahoo_input_data *yid, - struct yahoo_packet *pkt, int extra_pad) -{ - int pktlen = yahoo_packet_length(pkt); - int len = YAHOO_PACKET_HDRLEN + pktlen; - unsigned char *data; - int pos = 0; - - if (yid->fd < 0) { - return; - } - - data = y_new0(unsigned char, len + 1); - - memcpy(data + pos, "YMSG", 4); - pos += 4; - pos += yahoo_put16(data + pos, YAHOO_PROTO_VER); /* version [latest 12 0x000c] */ - pos += yahoo_put16(data + pos, 0x0000); /* HIWORD pkt length??? */ - pos += yahoo_put16(data + pos, pktlen + extra_pad); /* LOWORD pkt length? */ - pos += yahoo_put16(data + pos, pkt->service); /* service */ - pos += yahoo_put32(data + pos, pkt->status); /* status [4bytes] */ - pos += yahoo_put32(data + pos, pkt->id); /* session [4bytes] */ - - yahoo_packet_write(pkt, data + pos); - - yahoo_packet_dump(data, len); - - if (yid->type == YAHOO_CONNECTION_FT) { - yahoo_send_data(yid->fd, data, len); - } else { - yahoo_add_to_send_queue(yid, data, len); - } - FREE(data); -} - -static void yahoo_packet_free(struct yahoo_packet *pkt) -{ - while (pkt->hash) { - struct yahoo_pair *pair = pkt->hash->data; - YList *tmp; - FREE(pair->value); - FREE(pair); - tmp = pkt->hash; - pkt->hash = y_list_remove_link(pkt->hash, pkt->hash); - y_list_free_1(tmp); - } - FREE(pkt); -} - -static int yahoo_send_data(void *fd, void *data, int len) -{ - int ret; - int e; - - if (fd == NULL) { - return -1; - } - - yahoo_packet_dump(data, len); - - do { - ret = YAHOO_CALLBACK (ext_yahoo_write) (fd, data, len); - } while (ret == -1 && errno == EINTR); - e = errno; - - if (ret == -1) { - LOG(("wrote data: ERR %s", strerror(errno))); - } else { - LOG(("wrote data: OK")); - } - - errno = e; - return ret; -} - -void yahoo_close(int id) -{ - struct yahoo_data *yd = find_conn_by_id(id); - - if (!yd) { - return; - } - - del_from_list(yd); - - yahoo_free_data(yd); - if (id == last_id) { - last_id--; - } -} - -static void yahoo_input_close(struct yahoo_input_data *yid) -{ - inputs = y_list_remove(inputs, yid); - - LOG(("yahoo_input_close(read)")); - YAHOO_CALLBACK (ext_yahoo_remove_handler) (yid->yd->client_id, - yid->read_tag); - LOG(("yahoo_input_close(write)")); - YAHOO_CALLBACK (ext_yahoo_remove_handler) (yid->yd->client_id, - yid->write_tag); - yid->read_tag = yid->write_tag = 0; - if (yid->fd) { - YAHOO_CALLBACK (ext_yahoo_close) (yid->fd); - } - yid->fd = 0; - FREE(yid->rxqueue); - if (count_inputs_with_id(yid->yd->client_id) == 0) { - LOG(("closing %d", yid->yd->client_id)); - yahoo_close(yid->yd->client_id); - } - yahoo_free_webcam(yid->wcm); - if (yid->wcd) { - FREE(yid->wcd); - } - if (yid->ys) { - FREE(yid->ys->lsearch_text); - FREE(yid->ys); - } - FREE(yid); -} - -static int is_same_bud(const void *a, const void *b) -{ - const struct yahoo_buddy *subject = a; - const struct yahoo_buddy *object = b; - - return strcmp(subject->id, object->id); -} - -static char *getcookie(char *rawcookie) -{ - char *cookie = NULL; - char *tmpcookie; - char *cookieend; - - if (strlen(rawcookie) < 2) { - return NULL; - } - - tmpcookie = strdup(rawcookie + 2); - cookieend = strchr(tmpcookie, ';'); - - if (cookieend) { - *cookieend = '\0'; - } - - cookie = strdup(tmpcookie); - FREE(tmpcookie); - /* cookieend=NULL; not sure why this was there since the value is not preserved in the stack -dd */ - - return cookie; -} - -static char *getlcookie(char *cookie) -{ - char *tmp; - char *tmpend; - char *login_cookie = NULL; - - tmpend = strstr(cookie, "n="); - if (tmpend) { - tmp = strdup(tmpend + 2); - tmpend = strchr(tmp, '&'); - if (tmpend) { - *tmpend = '\0'; - } - login_cookie = strdup(tmp); - FREE(tmp); - } - - return login_cookie; -} - -static void yahoo_process_notify(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = yid->yd; - char *msg = NULL; - char *from = NULL; - char *to = NULL; - int stat = 0; - int accept = 0; - char *ind = NULL; - YList *l; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - if (pair->key == 4) { - from = pair->value; - } - if (pair->key == 5) { - to = pair->value; - } - if (pair->key == 49) { - msg = pair->value; - } - if (pair->key == 13) { - stat = atoi(pair->value); - } - if (pair->key == 14) { - ind = pair->value; - } - if (pair->key == 16) { /* status == -1 */ - NOTICE((pair->value)); - return; - } - - } - - if (!msg) { - return; - } - - if (!strncasecmp(msg, "TYPING", strlen("TYPING"))) { - YAHOO_CALLBACK (ext_yahoo_typing_notify) (yd->client_id, to, - from, stat); - } else if (!strncasecmp(msg, "GAME", strlen("GAME"))) { - YAHOO_CALLBACK (ext_yahoo_game_notify) (yd->client_id, to, from, - stat, ind); - } else if (!strncasecmp(msg, "WEBCAMINVITE", strlen("WEBCAMINVITE"))) { - if (!strcmp(ind, " ")) { - YAHOO_CALLBACK (ext_yahoo_webcam_invite) (yd->client_id, - to, from); - } else { - accept = atoi(ind); - /* accept the invitation (-1 = deny 1 = accept) */ - if (accept < 0) { - accept = 0; - } - YAHOO_CALLBACK (ext_yahoo_webcam_invite_reply) (yd-> - client_id, to, from, accept); - } - } else { - LOG(("Got unknown notification: %s", msg)); - } -} - -static void yahoo_process_conference(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = yid->yd; - char *msg = NULL; - char *host = NULL; - char *who = NULL; - char *room = NULL; - char *id = NULL; - int utf8 = 0; - YList *members = NULL; - YList *l; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - if (pair->key == 50) { - host = pair->value; - } - - if (pair->key == 52) { /* invite */ - members = y_list_append(members, strdup(pair->value)); - } - if (pair->key == 53) { /* logon */ - who = pair->value; - } - if (pair->key == 54) { /* decline */ - who = pair->value; - } - if (pair->key == 55) { /* unavailable (status == 2) */ - who = pair->value; - } - if (pair->key == 56) { /* logoff */ - who = pair->value; - } - - if (pair->key == 57) { - room = pair->value; - } - - if (pair->key == 58) { /* join message */ - msg = pair->value; - } - if (pair->key == 14) { /* decline/conf message */ - msg = pair->value; - } - - if (pair->key == 13) { - ; - } - if (pair->key == 16) { /* error */ - msg = pair->value; - } - - if (pair->key == 1) { /* my id */ - id = pair->value; - } - if (pair->key == 3) { /* message sender */ - who = pair->value; - } - - if (pair->key == 97) { - utf8 = atoi(pair->value); - } - } - - if (!room) { - return; - } - - if (host) { - for (l = members; l; l = l->next) { - char *w = l->data; - if (!strcmp(w, host)) { - break; - } - } - if (!l) { - members = y_list_append(members, strdup(host)); - } - } - /* invite, decline, join, left, message -> status == 1 */ - - switch (pkt->service) { - case YAHOO_SERVICE_CONFINVITE: - if (pkt->status == 2) { - ; - } else if (members) { - YAHOO_CALLBACK (ext_yahoo_got_conf_invite) (yd-> - client_id, id, host, room, msg, members); - } else if (msg) { - YAHOO_CALLBACK (ext_yahoo_error) (yd->client_id, msg, 0, - E_CONFNOTAVAIL); - } - break; - case YAHOO_SERVICE_CONFADDINVITE: - if (pkt->status == 1) { - YAHOO_CALLBACK (ext_yahoo_got_conf_invite) (yd-> - client_id, id, host, room, msg, members); - } - break; - case YAHOO_SERVICE_CONFDECLINE: - if (who) { - YAHOO_CALLBACK (ext_yahoo_conf_userdecline) (yd-> - client_id, id, who, room, msg); - } - break; - case YAHOO_SERVICE_CONFLOGON: - if (who) { - YAHOO_CALLBACK (ext_yahoo_conf_userjoin) (yd->client_id, - id, who, room); - } - break; - case YAHOO_SERVICE_CONFLOGOFF: - if (who) { - YAHOO_CALLBACK (ext_yahoo_conf_userleave) (yd->client_id, - id, who, room); - } - break; - case YAHOO_SERVICE_CONFMSG: - if (who) { - YAHOO_CALLBACK (ext_yahoo_conf_message) (yd->client_id, - id, who, room, msg, utf8); - } - break; - } -} - -static void yahoo_process_chat(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - char *msg = NULL; - char *id = NULL; - char *who = NULL; - char *room = NULL; - char *topic = NULL; - YList *members = NULL; - struct yahoo_chat_member *currentmember = NULL; - int msgtype = 1; - int utf8 = 0; - int firstjoin = 0; - int membercount = 0; - int chaterr = 0; - YList *l; - - yahoo_dump_unhandled(pkt); - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - - if (pair->key == 1) { - /* My identity */ - id = pair->value; - } - - if (pair->key == 104) { - /* Room name */ - room = pair->value; - } - - if (pair->key == 105) { - /* Room topic */ - topic = pair->value; - } - - if (pair->key == 108) { - /* Number of members in this packet */ - membercount = atoi(pair->value); - } - - if (pair->key == 109) { - /* message sender */ - who = pair->value; - - if (pkt->service == YAHOO_SERVICE_CHATJOIN) { - currentmember = - y_new0(struct yahoo_chat_member, 1); - currentmember->id = strdup(pair->value); - members = y_list_append(members, currentmember); - } - } - - if (pair->key == 110) { - /* age */ - if (pkt->service == YAHOO_SERVICE_CHATJOIN) { - currentmember->age = atoi(pair->value); - } - } - - if (pair->key == 113) { - /* attribs */ - if (pkt->service == YAHOO_SERVICE_CHATJOIN) { - currentmember->attribs = atoi(pair->value); - } - } - - if (pair->key == 141) { - /* alias */ - if (pkt->service == YAHOO_SERVICE_CHATJOIN) { - currentmember->alias = strdup(pair->value); - } - } - - if (pair->key == 142) { - /* location */ - if (pkt->service == YAHOO_SERVICE_CHATJOIN) { - currentmember->location = strdup(pair->value); - } - } - - if (pair->key == 130) { - /* first join */ - firstjoin = 1; - } - - if (pair->key == 117) { - /* message */ - msg = pair->value; - } - - if (pair->key == 124) { - /* Message type */ - msgtype = atoi(pair->value); - } - if (pair->key == 114) { - /* message error not sure what all the pair values mean */ - /* but -1 means no session in room */ - chaterr = atoi(pair->value); - } - } - - if (!room) { - if (pkt->service == YAHOO_SERVICE_CHATLOGOUT) { /* yahoo originated chat logout */ - YAHOO_CALLBACK (ext_yahoo_chat_yahoologout) (yid->yd-> - client_id, id); - return; - } - if (pkt->service == YAHOO_SERVICE_COMMENT && chaterr) { - YAHOO_CALLBACK (ext_yahoo_chat_yahooerror) (yid->yd-> - client_id, id); - return; - } - - WARNING(("We didn't get a room name, ignoring packet")); - return; - } - - switch (pkt->service) { - case YAHOO_SERVICE_CHATJOIN: - if (y_list_length(members) != membercount) { - WARNING(("Count of members doesn't match No. of members we got")); - } - if (firstjoin && members) { - YAHOO_CALLBACK (ext_yahoo_chat_join) (yid->yd->client_id, - id, room, topic, members, yid->fd); - } else if (who) { - if (y_list_length(members) != 1) { - WARNING(("Got more than 1 member on a normal join")); - } - /* this should only ever have one, but just in case */ - while (members) { - YList *n = members->next; - currentmember = members->data; - YAHOO_CALLBACK (ext_yahoo_chat_userjoin) (yid-> - yd->client_id, id, room, currentmember); - y_list_free_1(members); - members = n; - } - } - break; - case YAHOO_SERVICE_CHATEXIT: - if (who) { - YAHOO_CALLBACK (ext_yahoo_chat_userleave) (yid->yd-> - client_id, id, room, who); - } - break; - case YAHOO_SERVICE_COMMENT: - if (who) { - YAHOO_CALLBACK (ext_yahoo_chat_message) (yid->yd-> - client_id, id, who, room, msg, msgtype, utf8); - } - break; - } -} - -static void yahoo_process_message(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = yid->yd; - YList *l; - YList *messages = NULL; - - struct m { - int i_31; - int i_32; - char *to; - char *from; - long tm; - char *msg; - int utf8; - char *gunk; - } *message = y_new0(struct m, 1); - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - if (pair->key == 1 || pair->key == 4) { - if (!message->from) { - message->from = pair->value; - } - } else if (pair->key == 5) { - message->to = pair->value; - } else if (pair->key == 15) { - message->tm = strtol(pair->value, NULL, 10); - } else if (pair->key == 97) { - message->utf8 = atoi(pair->value); - } - /* This comes when the official client sends us a message */ - else if (pair->key == 429) { - message->gunk = pair->value; - } - /* user message *//* sys message */ - else if (pair->key == 14 || pair->key == 16) { - message->msg = pair->value; - } else if (pair->key == 31) { - if (message->i_31) { - messages = y_list_append(messages, message); - message = y_new0(struct m, 1); - } - message->i_31 = atoi(pair->value); - } else if (pair->key == 32) { - message->i_32 = atoi(pair->value); - } else { - LOG(("yahoo_process_message: status: %d, key: %d, value: %s", pkt->status, pair->key, - pair->value)); - } - } - - messages = y_list_append(messages, message); - - for (l = messages; l; l = l->next) { - message = l->data; - if (pkt->service == YAHOO_SERVICE_SYSMESSAGE) { - YAHOO_CALLBACK (ext_yahoo_system_message) (yd->client_id, - message->to, message->from, message->msg); - } else if (pkt->status <= 2 || pkt->status == 5) { - /* Confirm message receipt if we got the gunk */ - if (message->gunk) { - struct yahoo_packet *outpkt; - - outpkt = yahoo_packet_new(YAHOO_SERVICE_MESSAGE_CONFIRM, - YPACKET_STATUS_DEFAULT, 0); - yahoo_packet_hash(outpkt, 1, yd->user); - yahoo_packet_hash(outpkt, 5, message->from); - yahoo_packet_hash(outpkt, 302, "430"); - yahoo_packet_hash(outpkt, 430, message->gunk); - yahoo_packet_hash(outpkt, 303, "430"); - yahoo_packet_hash(outpkt, 450, "0"); - yahoo_send_packet(yid, outpkt, 0); - - yahoo_packet_free(outpkt); - } - - if (!strcmp(message->msg, "<ding>")) { - YAHOO_CALLBACK (ext_yahoo_got_buzz) (yd->client_id, - message->to, message->from, message->tm); - } else { - YAHOO_CALLBACK (ext_yahoo_got_im) (yd->client_id, - message->to, message->from, message->msg, - message->tm, pkt->status, message->utf8); - } - } else if (pkt->status == 0xffffffff) { - YAHOO_CALLBACK (ext_yahoo_error) (yd->client_id, - message->msg, 0, E_SYSTEM); - } - FREE(message); - } - - y_list_free(messages); -} - -/* - * Here's what multi-level packets look like. Data in brackets is the value. - * - * 3 level: - * ======= - * - * 302 (318) - Beginning level 1 - * 300 (318) - Begin level 2 - * 302 (319) - End level 2 header - * 300 (319) - Begin level 3 - * 301 (319) - End level 3 - * 303 (319) - End level 2 - * 303 (318) - End level 1 - * - * 2 level: - * ======= - * - * 302 (315) - Beginning level 1 - * 300 (315) - Begin level 2 - * 301 (315) - End level 2 - * 303 (315) - End level 1 - * - */ -static void yahoo_process_status(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - YList *l; - struct yahoo_data *yd = yid->yd; - - struct yahoo_process_status_entry *u; - - YList *users = 0; - - if (pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == -1) { - YAHOO_CALLBACK (ext_yahoo_login_response) (yd->client_id, - YAHOO_LOGIN_DUPL, NULL); - return; - } - - /* - * Status updates may be spread across multiple packets and not - * even on buddy boundaries, so keeping some state is important. - * So, continue where we left off, and only add a user entry to - * the list once it's complete (301-315 End buddy). - */ - u = yd->half_user; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - - switch (pair->key) { - case 300: /* Begin buddy */ - if (!strcmp(pair->value, "315") && !u) { - u = yd->half_user = y_new0(struct yahoo_process_status_entry, 1); - } - break; - case 301: /* End buddy */ - if (!strcmp(pair->value, "315") && u) { - /* Sometimes user info comes in an odd format with no - "begin buddy" but *with* an "end buddy". Don't add - it twice. */ - if (!y_list_find(users, u)) { - users = y_list_prepend(users, u); - } - u = yd->half_user = NULL; - } - break; - case 0: /* we won't actually do anything with this */ - NOTICE(("key %d:%s", pair->key, pair->value)); - break; - case 1: /* we don't get the full buddy list here. */ - if (!yd->logged_in) { - yd->logged_in = 1; - if (yd->current_status < 0) { - yd->current_status = yd->initial_status; - } - YAHOO_CALLBACK (ext_yahoo_login_response) (yd-> - client_id, YAHOO_LOGIN_OK, NULL); - } - break; - case 8: /* how many online buddies we have */ - NOTICE(("key %d:%s", pair->key, pair->value)); - break; - case 7: /* the current buddy */ - if (!u) { - /* This will only happen in case of a single level message */ - u = y_new0(struct yahoo_process_status_entry, 1); - users = y_list_prepend(users, u); - } - u->name = pair->value; - break; - case 10: /* state */ - u->state = strtol(pair->value, NULL, 10); - break; - case 19: /* custom status message */ - u->msg = pair->value; - break; - case 47: /* is it an away message or not. Not applicable for YMSG16 anymore */ - u->away = atoi(pair->value); - break; - case 137: /* seconds idle */ - u->idle = atoi(pair->value); - break; - case 11: /* this is the buddy's session id */ - u->buddy_session = atoi(pair->value); - break; - case 17: /* in chat? */ - u->f17 = atoi(pair->value); - break; - case 13: /* bitmask, bit 0 = pager, bit 1 = chat, bit 2 = game */ - u->flags = atoi(pair->value); - break; - case 60: /* SMS -> 1 MOBILE USER */ - /* sometimes going offline makes this 2, but invisible never sends it */ - u->mobile = atoi(pair->value); - break; - case 138: - u->f138 = atoi(pair->value); - break; - case 184: - u->f184 = pair->value; - break; - case 192: - u->f192 = atoi(pair->value); - break; - case 10001: - u->f10001 = atoi(pair->value); - break; - case 10002: - u->f10002 = atoi(pair->value); - break; - case 198: - u->f198 = atoi(pair->value); - break; - case 197: - u->f197 = pair->value; - break; - case 205: - u->f205 = pair->value; - break; - case 213: - u->f213 = atoi(pair->value); - break; - case 16: /* Custom error message */ - YAHOO_CALLBACK (ext_yahoo_error) (yd->client_id, - pair->value, 0, E_CUSTOM); - break; - default: - WARNING(("unknown status key %d:%s", pair->key, - pair->value)); - break; - } - } - - while (users) { - YList *t = users; - struct yahoo_process_status_entry *u = users->data; - - if (u->name != NULL) { - if (pkt->service == - YAHOO_SERVICE_LOGOFF - /*|| u->flags == 0 No flags for YMSG16 */) { - YAHOO_CALLBACK (ext_yahoo_status_changed) (yd-> - client_id, u->name, - YAHOO_STATUS_OFFLINE, NULL, 1, 0, 0); - } else { - /* Key 47 always seems to be 1 for YMSG16 */ - if (!u->state) { - u->away = 0; - } else { - u->away = 1; - } - - YAHOO_CALLBACK (ext_yahoo_status_changed) (yd-> - client_id, u->name, u->state, u->msg, - u->away, u->idle, u->mobile); - } - } - - users = y_list_remove_link(users, users); - y_list_free_1(t); - FREE(u); - } -} - -static void yahoo_process_buddy_list(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = yid->yd; - YList *l; - int last_packet = 0; - char *cur_group = NULL; - struct yahoo_buddy *newbud = NULL; - - /* we could be getting multiple packets here */ - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - - switch (pair->key) { - case 300: - case 301: - case 302: - break; /* Separators. Our logic does not need them */ - case 303: - if (318 == atoi(pair->value)) { - last_packet = 1; - } - break; - case 65: - cur_group = strdup(pair->value); - break; - case 7: - newbud = y_new0(struct yahoo_buddy, 1); - newbud->id = strdup(pair->value); - if (cur_group) { - newbud->group = strdup(cur_group); - } else if (yd->buddies) { - struct yahoo_buddy *lastbud = - (struct yahoo_buddy *) y_list_nth(yd-> - buddies, - y_list_length(yd->buddies) - 1)->data; - newbud->group = strdup(lastbud->group); - } else { - newbud->group = strdup("Buddies"); - } - - yd->buddies = y_list_append(yd->buddies, newbud); - - break; - } - } - - /* we could be getting multiple packets here */ - if (pkt->hash && !last_packet) { - return; - } - - YAHOO_CALLBACK (ext_yahoo_got_buddies) (yd->client_id, yd->buddies); - - /* Logged in */ - if (!yd->logged_in) { - yd->logged_in = 1; - if (yd->current_status < 0) { - yd->current_status = yd->initial_status; - } - YAHOO_CALLBACK (ext_yahoo_login_response) (yd->client_id, - YAHOO_LOGIN_OK, NULL); - - /* - yahoo_set_away(yd->client_id, yd->initial_status, NULL, - (yd->initial_status == YAHOO_STATUS_AVAILABLE) ? 0 : 1); - - yahoo_get_yab(yd->client_id); - */ - } - -} - -static void yahoo_process_list(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = yid->yd; - YList *l; - - /* we could be getting multiple packets here */ - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - - switch (pair->key) { - case 89: /* identities */ - { - char **identities = - y_strsplit(pair->value, ",", -1); - int i; - for (i = 0; identities[i]; i++) { - yd->identities = - y_list_append(yd->identities, - strdup(identities[i])); - } - y_strfreev(identities); - } - YAHOO_CALLBACK (ext_yahoo_got_identities) (yd->client_id, - yd->identities); - break; - case 59: /* cookies */ - if (pair->value[0] == 'Y') { - FREE(yd->cookie_y); - FREE(yd->login_cookie); - - yd->cookie_y = getcookie(pair->value); - yd->login_cookie = getlcookie(yd->cookie_y); - - } else if (pair->value[0] == 'T') { - FREE(yd->cookie_t); - yd->cookie_t = getcookie(pair->value); - - } else if (pair->value[0] == 'C') { - FREE(yd->cookie_c); - yd->cookie_c = getcookie(pair->value); - } - - break; - case 3: /* my id */ - case 90: /* 1 */ - case 100: /* 0 */ - case 101: /* NULL */ - case 102: /* NULL */ - case 93: /* 86400/1440 */ - break; - } - } - - if (yd->cookie_y && yd->cookie_t) { /* We don't get cookie_c anymore */ - YAHOO_CALLBACK (ext_yahoo_got_cookies) (yd->client_id); - } -} - -static void yahoo_process_verify(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = yid->yd; - - if (pkt->status != 0x01) { - DEBUG_MSG(("expected status: 0x01, got: %d", pkt->status)); - YAHOO_CALLBACK (ext_yahoo_login_response) (yd->client_id, - YAHOO_LOGIN_LOCK, ""); - return; - } - - pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH, YPACKET_STATUS_DEFAULT, - yd->session_id); - - yahoo_packet_hash(pkt, 1, yd->user); - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); - -} - -static void yahoo_process_picture_checksum(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = yid->yd; - char *from = NULL; - char *to = NULL; - int checksum = 0; - YList *l; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - - switch (pair->key) { - case 1: - case 4: - from = pair->value; - case 5: - to = pair->value; - break; - case 212: - break; - case 192: - checksum = atoi(pair->value); - break; - } - } - - YAHOO_CALLBACK (ext_yahoo_got_buddyicon_checksum) (yd->client_id, to, - from, checksum); -} - -static void yahoo_process_picture(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = yid->yd; - char *url = NULL; - char *from = NULL; - char *to = NULL; - int status = 0; - int checksum = 0; - YList *l; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - - switch (pair->key) { - case 1: - case 4: /* sender */ - from = pair->value; - break; - case 5: /* we */ - to = pair->value; - break; - case 13: /* request / sending */ - status = atoi(pair->value); - break; - case 20: /* url */ - url = pair->value; - break; - case 192: /*checksum */ - checksum = atoi(pair->value); - break; - } - } - - switch (status) { - case 1: /* this is a request, ignore for now */ - YAHOO_CALLBACK (ext_yahoo_got_buddyicon_request) (yd->client_id, - to, from); - break; - case 2: /* this is cool - we get a picture :) */ - YAHOO_CALLBACK (ext_yahoo_got_buddyicon) (yd->client_id, to, - from, url, checksum); - break; - } -} - -static void yahoo_process_picture_upload(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = yid->yd; - YList *l; - char *url = NULL; - - if (pkt->status != 1) { - return; /* something went wrong */ - - } - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - - switch (pair->key) { - case 5: /* we */ - break; - case 20: /* url */ - url = pair->value; - break; - case 27: /* local filename */ - break; - case 38: /* time */ - break; - } - } - - YAHOO_CALLBACK (ext_yahoo_buddyicon_uploaded) (yd->client_id, url); -} - -void yahoo_login(int id, int initial) -{ - struct yahoo_data *yd = find_conn_by_id(id); - struct connect_callback_data *ccd; - struct yahoo_server_settings *yss; - int tag; - - char *host; - - struct yahoo_input_data *yid = y_new0(struct yahoo_input_data, 1); - - yid->yd = yd; - yid->type = YAHOO_CONNECTION_PAGER; - inputs = y_list_prepend(inputs, yid); - - yd->initial_status = initial; - yss = yd->server_settings; - - ccd = y_new0(struct connect_callback_data, 1); - ccd->yd = yd; - - host = yss->pager_host; - - if (!host) { - host = yss->pager_host_list[0]; - } - - tag = YAHOO_CALLBACK (ext_yahoo_connect_async) (yd->client_id, - host, yss->pager_port, yahoo_connected, ccd, 0); - - /* - * if tag <= 0, then callback has already been called - * so ccd will have been freed - */ - if (tag > 0) { - ccd->tag = tag; - } else if (tag < 0) { - YAHOO_CALLBACK (ext_yahoo_login_response) (yd->client_id, - YAHOO_LOGIN_SOCK, NULL); - } -} - -struct yahoo_https_auth_data { - struct yahoo_input_data *yid; - char *token; - char *chal; -}; - -static void yahoo_https_auth_token_init(struct yahoo_https_auth_data *had); -static void yahoo_https_auth_token_finish(struct http_request *req); -static void yahoo_https_auth_init(struct yahoo_https_auth_data *had); -static void yahoo_https_auth_finish(struct http_request *req); - -/* Extract a value from a login.yahoo.com response. Assume CRLF-linebreaks - and FAIL miserably if they're not there... */ -static char *yahoo_ha_find_key(char *response, char *key) -{ - char *s, *end; - int len = strlen(key); - - s = response; - do { - if (strncmp(s, key, len) == 0 && s[len] == '=') { - s += len + 1; - if ((end = strchr(s, '\r'))) { - return g_strndup(s, end - s); - } else { - return g_strdup(s); - } - } - - if ((s = strchr(s, '\n'))) { - s++; - } - } while (s && *s); - - return NULL; -} - -static enum yahoo_status yahoo_https_status_parse(int code) -{ - switch (code) { - case 1212: return (enum yahoo_status) YAHOO_LOGIN_PASSWD; - case 1213: return (enum yahoo_status) YAHOO_LOGIN_LOCK; - case 1235: return (enum yahoo_status) YAHOO_LOGIN_UNAME; - default: return (enum yahoo_status) code; - } -} - -static void yahoo_https_auth(struct yahoo_input_data *yid, const char *seed, const char *sn) -{ - struct yahoo_https_auth_data *had = g_new0(struct yahoo_https_auth_data, 1); - - had->yid = yid; - had->chal = g_strdup(seed); - - yahoo_https_auth_token_init(had); -} - -static void yahoo_https_auth_token_init(struct yahoo_https_auth_data *had) -{ - struct yahoo_input_data *yid = had->yid; - struct yahoo_data *yd = yid->yd; - char *login, *passwd, *chal; - char *url; - - login = g_strndup(yd->user, 3 * strlen(yd->user)); - http_encode(login); - passwd = g_strndup(yd->password, 3 * strlen(yd->password)); - http_encode(passwd); - chal = g_strndup(had->chal, 3 * strlen(had->chal)); - http_encode(chal); - - url = g_strdup_printf("https://login.yahoo.com/config/pwtoken_get?src=ymsgr&ts=%d&login=%s&passwd=%s&chal=%s", - (int) time(NULL), login, passwd, chal); - - http_dorequest_url(url, yahoo_https_auth_token_finish, had); - - g_free(url); - g_free(chal); - g_free(passwd); - g_free(login); -} - -static void yahoo_https_auth_token_finish(struct http_request *req) -{ - struct yahoo_https_auth_data *had = req->data; - struct yahoo_input_data *yid; - struct yahoo_data *yd; - int st; - - if (y_list_find(inputs, had->yid) == NULL) { - return; - } - - yid = had->yid; - yd = yid->yd; - - if (req->status_code != 200) { - YAHOO_CALLBACK (ext_yahoo_login_response) (yd->client_id, 2000 + req->status_code, NULL); - goto fail; - } - - if (sscanf(req->reply_body, "%d", &st) != 1 || st != 0) { - YAHOO_CALLBACK (ext_yahoo_login_response) (yd->client_id, yahoo_https_status_parse(st), NULL); - goto fail; - } - - if ((had->token = yahoo_ha_find_key(req->reply_body, "ymsgr")) == NULL) { - YAHOO_CALLBACK (ext_yahoo_login_response) (yd->client_id, 3001, NULL); - goto fail; - } - - yahoo_https_auth_init(had); - return; - -fail: - g_free(had->token); - g_free(had->chal); - g_free(had); -} - -static void yahoo_https_auth_init(struct yahoo_https_auth_data *had) -{ - char *url; - - url = g_strdup_printf("https://login.yahoo.com/config/pwtoken_login?src=ymsgr&ts=%d&token=%s", - (int) time(NULL), had->token); - - http_dorequest_url(url, yahoo_https_auth_finish, had); - - g_free(url); -} - -static void yahoo_https_auth_finish(struct http_request *req) -{ - struct yahoo_https_auth_data *had = req->data; - struct yahoo_input_data *yid; - struct yahoo_data *yd; - struct yahoo_packet *pack; - char *crumb = NULL; - int st; - - if (y_list_find(inputs, had->yid) == NULL) { - return; - } - - yid = had->yid; - yd = yid->yd; - - md5_byte_t result[16]; - md5_state_t ctx; - - unsigned char yhash[32]; - - if (req->status_code != 200) { - YAHOO_CALLBACK (ext_yahoo_login_response) (yd->client_id, 2000 + req->status_code, NULL); - goto fail; - } - - if (sscanf(req->reply_body, "%d", &st) != 1 || st != 0) { - YAHOO_CALLBACK (ext_yahoo_login_response) (yd->client_id, yahoo_https_status_parse(st), NULL); - goto fail; - } - - if ((yd->cookie_y = yahoo_ha_find_key(req->reply_body, "Y")) == NULL || - (yd->cookie_t = yahoo_ha_find_key(req->reply_body, "T")) == NULL || - (crumb = yahoo_ha_find_key(req->reply_body, "crumb")) == NULL) { - YAHOO_CALLBACK (ext_yahoo_login_response) (yd->client_id, 3002, NULL); - goto fail; - } - - md5_init(&ctx); - md5_append(&ctx, (unsigned char *) crumb, 11); - md5_append(&ctx, (unsigned char *) had->chal, strlen(had->chal)); - md5_finish(&ctx, result); - to_y64(yhash, result, 16); - - pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, yd->initial_status, yd->session_id); - yahoo_packet_hash(pack, 1, yd->user); - yahoo_packet_hash(pack, 0, yd->user); - yahoo_packet_hash(pack, 277, yd->cookie_y); - yahoo_packet_hash(pack, 278, yd->cookie_t); - yahoo_packet_hash(pack, 307, (char *) yhash); - yahoo_packet_hash(pack, 244, "524223"); - yahoo_packet_hash(pack, 2, yd->user); - yahoo_packet_hash(pack, 2, "1"); - yahoo_packet_hash(pack, 98, "us"); - yahoo_packet_hash(pack, 135, "7.5.0.647"); - - yahoo_send_packet(yid, pack, 0); - - yahoo_packet_free(pack); - -fail: - g_free(crumb); - g_free(had->token); - g_free(had->chal); - g_free(had); -} - -static void yahoo_process_auth(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - char *seed = NULL; - char *sn = NULL; - YList *l = pkt->hash; - int m = 0; - struct yahoo_data *yd = yid->yd; - - while (l) { - struct yahoo_pair *pair = l->data; - - switch (pair->key) { - case 94: - seed = pair->value; - break; - case 1: - sn = pair->value; - break; - case 13: - m = atoi(pair->value); - break; - } - l = l->next; - } - - if (!seed) { - return; - } - - if (m == 2) { - yahoo_https_auth(yid, seed, sn); - } else { - /* call error */ - WARNING(("unknown auth type %d", m)); - YAHOO_CALLBACK (ext_yahoo_login_response) (yd->client_id, - YAHOO_LOGIN_UNKNOWN, NULL); - } -} - -static void yahoo_process_auth_resp(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = yid->yd; - char *url = NULL; - int login_status = -1; - - YList *l; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - if (pair->key == 0) { - ; /* login_id */ - } else if (pair->key == 1) { - ; /* handle */ - } else if (pair->key == 20) { - url = pair->value; - } else if (pair->key == 66) { - login_status = atoi(pair->value); - } - } - - if (pkt->status == YPACKET_STATUS_DISCONNECTED) { - YAHOO_CALLBACK (ext_yahoo_login_response) (yd->client_id, - login_status, url); - /* yahoo_logoff(yd->client_id); */ - } -} - -static void yahoo_process_mail(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = yid->yd; - char *who = NULL; - char *email = NULL; - char *subj = NULL; - int count = 0; - YList *l; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - if (pair->key == 9) { - count = strtol(pair->value, NULL, 10); - } else if (pair->key == 43) { - who = pair->value; - } else if (pair->key == 42) { - email = pair->value; - } else if (pair->key == 18) { - subj = pair->value; - } else { - LOG(("key: %d => value: %s", pair->key, pair->value)); - } - } - - if (who && email && subj) { - char from[1024]; - snprintf(from, sizeof(from), "%s (%s)", who, email); - YAHOO_CALLBACK (ext_yahoo_mail_notify) (yd->client_id, from, - subj, count); - } else if (count > 0) { - YAHOO_CALLBACK (ext_yahoo_mail_notify) (yd->client_id, NULL, - NULL, count); - } -} - -static void yahoo_process_new_contact(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = yid->yd; - char *me = NULL; - char *who = NULL; - char *msg = NULL; - int online = -1; - - YList *l; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - if (pair->key == 4) { - who = pair->value; - } else if (pair->key == 5) { - me = pair->value; - } else if (pair->key == 14) { - msg = pair->value; - } else if (pair->key == 13) { - online = strtol(pair->value, NULL, 10); - } - } - - if (who && online < 0) { - YAHOO_CALLBACK (ext_yahoo_contact_added) (yd->client_id, me, who, - msg); - } else if (online == 2) { - YAHOO_CALLBACK (ext_yahoo_rejected) (yd->client_id, who, msg); - } -} - -/* UNUSED? */ -static void yahoo_process_contact(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = yid->yd; - char *id = NULL; - char *who = NULL; - char *msg = NULL; - char *name = NULL; - int state = YAHOO_STATUS_AVAILABLE; - int away = 0; - int idle = 0; - int mobile = 0; - - YList *l; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - if (pair->key == 1) { - id = pair->value; - } else if (pair->key == 3) { - who = pair->value; - } else if (pair->key == 14) { - msg = pair->value; - } else if (pair->key == 7) { - name = pair->value; - } else if (pair->key == 10) { - state = strtol(pair->value, NULL, 10); - } else if (pair->key == 15) { - ; /* tm */ - } else if (pair->key == 13) { - ; /* online */ - } else if (pair->key == 47) { - away = strtol(pair->value, NULL, 10); - } else if (pair->key == 137) { - idle = strtol(pair->value, NULL, 10); - } else if (pair->key == 60) { - mobile = strtol(pair->value, NULL, 10); - } - - } - - if (id) { - YAHOO_CALLBACK (ext_yahoo_contact_added) (yd->client_id, id, who, - msg); - } else if (name) { - YAHOO_CALLBACK (ext_yahoo_status_changed) (yd->client_id, name, - state, msg, away, idle, mobile); - } else if (pkt->status == 0x07) { - YAHOO_CALLBACK (ext_yahoo_rejected) (yd->client_id, who, msg); - } -} - -static void yahoo_process_buddyadd(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = yid->yd; - char *who = NULL; - char *where = NULL; - int status = 0; - - struct yahoo_buddy *bud = NULL; - - YList *l; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - if (pair->key == 1) { - ; /* Me... don't care */ - } - if (pair->key == 7) { - who = pair->value; - } - if (pair->key == 65) { - where = pair->value; - } - if (pair->key == 66) { - status = strtol(pair->value, NULL, 10); - } - } - - if (!who) { - return; - } - if (!where) { - where = "Unknown"; - } - - bud = y_new0(struct yahoo_buddy, 1); - bud->id = strdup(who); - bud->group = strdup(where); - bud->real_name = NULL; - - yd->buddies = y_list_append(yd->buddies, bud); - -#if 0 - /* BitlBee: This seems to be wrong in my experience. I think: - status = 0: Success - status = 2: Already on list - status = 3: Doesn't exist - status = 42: Invalid handle (possibly banned/reserved, I get it for - handles like joe or jjjjjj) - Haven't seen others yet. But whenever the add is successful, there - will be a separate "went online" packet when the auth. request is - accepted. Couldn't find any test account that doesn't require auth. - unfortunately (if there is even such a thing?) */ - - /* A non-zero status (i've seen 2) seems to mean the buddy is already - * added and is online */ - if (status) { - LOG(("Setting online see packet for info")); - yahoo_dump_unhandled(pkt); - YAHOO_CALLBACK (ext_yahoo_status_changed) (yd->client_id, who, - YAHOO_STATUS_AVAILABLE, NULL, 0, 0, 0); - } -#endif - /* BitlBee: Need ACK of added buddy, if it was successful. */ - if (status == 0) { - YList *tmp = y_list_append(NULL, bud); - YAHOO_CALLBACK (ext_yahoo_got_buddies) (yd->client_id, tmp); - y_list_free(tmp); - } -} - -static void yahoo_process_buddydel(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - struct yahoo_data *yd = yid->yd; - char *who = NULL; - char *where = NULL; - struct yahoo_buddy *bud; - - YList *buddy; - - YList *l; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - if (pair->key == 1) { - ; /* Me... don't care */ - } else if (pair->key == 7) { - who = pair->value; - } else if (pair->key == 65) { - where = pair->value; - } else if (pair->key == 66) { - ; /* unk_66 */ - } else { - DEBUG_MSG(("unknown key: %d = %s", pair->key, - pair->value)); - } - } - - if (!who || !where) { - return; - } - - bud = y_new0(struct yahoo_buddy, 1); - bud->id = strdup(who); - bud->group = strdup(where); - - buddy = y_list_find_custom(yd->buddies, bud, is_same_bud); - - FREE(bud->id); - FREE(bud->group); - FREE(bud); - - if (buddy) { - bud = buddy->data; - yd->buddies = y_list_remove_link(yd->buddies, buddy); - y_list_free_1(buddy); - - FREE(bud->id); - FREE(bud->group); - FREE(bud->real_name); - FREE(bud); - - bud = NULL; - } -} - -static void yahoo_process_ignore(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - YList *l; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - if (pair->key == 0) { - ; /* who */ - } - if (pair->key == 1) { - ; /* Me... don't care */ - } - if (pair->key == 13) { /* 1 == ignore, 2 == unignore */ - ; - } - if (pair->key == 66) { - ; /* status */ - } - } - - /* - * status - * 0 - ok - * 2 - already in ignore list, could not add - * 3 - not in ignore list, could not delete - * 12 - is a buddy, could not add - */ - -/* if(status) - YAHOO_CALLBACK(ext_yahoo_error)(yd->client_id, who, 0, status); -*/ -} - -static void yahoo_process_voicechat(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - char *who = NULL; - char *me = NULL; - char *room = NULL; - - YList *l; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - if (pair->key == 4) { - who = pair->value; - } - if (pair->key == 5) { - me = pair->value; - } - if (pair->key == 13) { - ; /* voice room */ - } - if (pair->key == 57) { - room = pair->value; - } - } - - NOTICE(("got voice chat invite from %s in %s to identity %s", who, room, - me)); - /* - * send: s:0 1:me 5:who 57:room 13:1 - * ???? s:4 5:who 10:99 19:-1615114531 - * gotr: s:4 5:who 10:99 19:-1615114615 - * ???? s:1 5:me 4:who 57:room 13:3room - * got: s:1 5:me 4:who 57:room 13:1room - * rej: s:0 1:me 5:who 57:room 13:3 - * rejr: s:4 5:who 10:99 19:-1617114599 - */ -} - -static void yahoo_process_ping(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - char *errormsg = NULL; - - YList *l; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - if (pair->key == 16) { - errormsg = pair->value; - } - } - - NOTICE(("got ping packet")); - YAHOO_CALLBACK (ext_yahoo_got_ping) (yid->yd->client_id, errormsg); -} - -static void yahoo_process_buddy_change_group(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - YList *l; - char *me = NULL; - char *who = NULL; - char *old_group = NULL; - char *new_group = NULL; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - if (pair->key == 1) { - me = pair->value; - } - if (pair->key == 7) { - who = pair->value; - } - if (pair->key == 224) { - old_group = pair->value; - } - if (pair->key == 264) { - new_group = pair->value; - } - } - - YAHOO_CALLBACK (ext_yahoo_got_buddy_change_group) (yid->yd->client_id, - me, who, old_group, new_group); -} - -static void _yahoo_webcam_get_server_connected(void *fd, int error, void *d) -{ - struct yahoo_input_data *yid = d; - char *who = yid->wcm->user; - char *data = NULL; - char *packet = NULL; - unsigned char magic_nr[] = { 0, 1, 0 }; - unsigned char header_len = 8; - unsigned int len = 0; - unsigned int pos = 0; - - if (error || !fd) { - FREE(who); - FREE(yid); - return; - } - - yid->fd = fd; - inputs = y_list_prepend(inputs, yid); - - /* send initial packet */ - if (who) { - data = strdup("<RVWCFG>"); - } else { - data = strdup("<RUPCFG>"); - } - yahoo_add_to_send_queue(yid, data, strlen(data)); - FREE(data); - - /* send data */ - if (who) { - data = strdup("g="); - data = y_string_append(data, who); - data = y_string_append(data, "\r\n"); - } else { - data = strdup("f=1\r\n"); - } - len = strlen(data); - packet = y_new0(char, header_len + len); - packet[pos++] = header_len; - memcpy(packet + pos, magic_nr, sizeof(magic_nr)); - pos += sizeof(magic_nr); - pos += yahoo_put32(packet + pos, len); - memcpy(packet + pos, data, len); - pos += len; - yahoo_add_to_send_queue(yid, packet, pos); - FREE(packet); - FREE(data); - - yid->read_tag = - YAHOO_CALLBACK (ext_yahoo_add_handler) (yid->yd->client_id, fd, - YAHOO_INPUT_READ, yid); -} - -static void yahoo_webcam_get_server(struct yahoo_input_data *y, char *who, - char *key) -{ - struct yahoo_input_data *yid = y_new0(struct yahoo_input_data, 1); - struct yahoo_server_settings *yss = y->yd->server_settings; - - yid->type = YAHOO_CONNECTION_WEBCAM_MASTER; - yid->yd = y->yd; - yid->wcm = y_new0(struct yahoo_webcam, 1); - yid->wcm->user = who ? strdup(who) : NULL; - yid->wcm->direction = who ? YAHOO_WEBCAM_DOWNLOAD : YAHOO_WEBCAM_UPLOAD; - yid->wcm->key = strdup(key); - - YAHOO_CALLBACK (ext_yahoo_connect_async) (yid->yd->client_id, - yss->webcam_host, yss->webcam_port, - _yahoo_webcam_get_server_connected, yid, 0); - -} - -static YList *webcam_queue = NULL; -static void yahoo_process_webcam_key(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - char *key = NULL; - char *who = NULL; - - YList *l; - - yahoo_dump_unhandled(pkt); - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - if (pair->key == 5) { - ; /* me */ - } - if (pair->key == 61) { - key = pair->value; - } - } - - l = webcam_queue; - if (!l) { - return; - } - who = l->data; - webcam_queue = y_list_remove_link(webcam_queue, webcam_queue); - y_list_free_1(l); - yahoo_webcam_get_server(yid, who, key); - FREE(who); -} - -static void yahoo_packet_process(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - DEBUG_MSG(("yahoo_packet_process: 0x%02x", pkt->service)); - switch (pkt->service) { - case YAHOO_SERVICE_USERSTAT: - case YAHOO_SERVICE_LOGON: - case YAHOO_SERVICE_LOGOFF: - case YAHOO_SERVICE_ISAWAY: - case YAHOO_SERVICE_ISBACK: - case YAHOO_SERVICE_GAMELOGON: - case YAHOO_SERVICE_GAMELOGOFF: - case YAHOO_SERVICE_IDACT: - case YAHOO_SERVICE_IDDEACT: - case YAHOO_SERVICE_Y6_STATUS_UPDATE: - case YAHOO_SERVICE_Y8_STATUS: - yahoo_process_status(yid, pkt); - break; - case YAHOO_SERVICE_NOTIFY: - yahoo_process_notify(yid, pkt); - break; - case YAHOO_SERVICE_MESSAGE: - case YAHOO_SERVICE_GAMEMSG: - case YAHOO_SERVICE_SYSMESSAGE: - yahoo_process_message(yid, pkt); - break; - case YAHOO_SERVICE_NEWMAIL: - yahoo_process_mail(yid, pkt); - break; - case YAHOO_SERVICE_Y7_AUTHORIZATION: - yahoo_process_new_contact(yid, pkt); - break; - case YAHOO_SERVICE_NEWCONTACT: - yahoo_process_contact(yid, pkt); - break; - case YAHOO_SERVICE_LIST: - yahoo_process_list(yid, pkt); - break; - case YAHOO_SERVICE_VERIFY: - yahoo_process_verify(yid, pkt); - break; - case YAHOO_SERVICE_AUTH: - yahoo_process_auth(yid, pkt); - break; - case YAHOO_SERVICE_AUTHRESP: - yahoo_process_auth_resp(yid, pkt); - break; - case YAHOO_SERVICE_CONFINVITE: - case YAHOO_SERVICE_CONFADDINVITE: - case YAHOO_SERVICE_CONFDECLINE: - case YAHOO_SERVICE_CONFLOGON: - case YAHOO_SERVICE_CONFLOGOFF: - case YAHOO_SERVICE_CONFMSG: - yahoo_process_conference(yid, pkt); - break; - case YAHOO_SERVICE_CHATONLINE: - case YAHOO_SERVICE_CHATGOTO: - case YAHOO_SERVICE_CHATJOIN: - case YAHOO_SERVICE_CHATLEAVE: - case YAHOO_SERVICE_CHATEXIT: - case YAHOO_SERVICE_CHATLOGOUT: - case YAHOO_SERVICE_CHATPING: - case YAHOO_SERVICE_COMMENT: - yahoo_process_chat(yid, pkt); - break; - case YAHOO_SERVICE_P2PFILEXFER: - case YAHOO_SERVICE_Y7_FILETRANSFER: - yahoo_process_filetransfer(yid, pkt); - break; - case YAHOO_SERVICE_Y7_FILETRANSFERINFO: - yahoo_process_filetransferinfo(yid, pkt); - break; - case YAHOO_SERVICE_Y7_FILETRANSFERACCEPT: - yahoo_process_filetransferaccept(yid, pkt); - break; - case YAHOO_SERVICE_ADDBUDDY: - yahoo_process_buddyadd(yid, pkt); - break; - case YAHOO_SERVICE_REMBUDDY: - yahoo_process_buddydel(yid, pkt); - break; - case YAHOO_SERVICE_IGNORECONTACT: - yahoo_process_ignore(yid, pkt); - break; - case YAHOO_SERVICE_VOICECHAT: - yahoo_process_voicechat(yid, pkt); - break; - case YAHOO_SERVICE_WEBCAM: - yahoo_process_webcam_key(yid, pkt); - break; - case YAHOO_SERVICE_PING: - yahoo_process_ping(yid, pkt); - break; - case YAHOO_SERVICE_Y7_CHANGE_GROUP: - yahoo_process_buddy_change_group(yid, pkt); - break; - case YAHOO_SERVICE_IDLE: - case YAHOO_SERVICE_MAILSTAT: - case YAHOO_SERVICE_CHATINVITE: - case YAHOO_SERVICE_CALENDAR: - case YAHOO_SERVICE_NEWPERSONALMAIL: - case YAHOO_SERVICE_ADDIDENT: - case YAHOO_SERVICE_ADDIGNORE: - case YAHOO_SERVICE_GOTGROUPRENAME: - case YAHOO_SERVICE_GROUPRENAME: - case YAHOO_SERVICE_PASSTHROUGH2: - case YAHOO_SERVICE_CHATLOGON: - case YAHOO_SERVICE_CHATLOGOFF: - case YAHOO_SERVICE_CHATMSG: - case YAHOO_SERVICE_REJECTCONTACT: - case YAHOO_SERVICE_PEERTOPEER: - WARNING(("unhandled service 0x%02x", pkt->service)); - yahoo_dump_unhandled(pkt); - break; - case YAHOO_SERVICE_PICTURE: - yahoo_process_picture(yid, pkt); - break; - case YAHOO_SERVICE_PICTURE_CHECKSUM: - yahoo_process_picture_checksum(yid, pkt); - break; - case YAHOO_SERVICE_PICTURE_UPLOAD: - yahoo_process_picture_upload(yid, pkt); - break; - case YAHOO_SERVICE_Y8_LIST: /* Buddy List */ - yahoo_process_buddy_list(yid, pkt); - break; - default: - WARNING(("unknown service 0x%02x", pkt->service)); - yahoo_dump_unhandled(pkt); - break; - } -} - -static struct yahoo_packet *yahoo_getdata(struct yahoo_input_data *yid) -{ - struct yahoo_packet *pkt; - struct yahoo_data *yd = yid->yd; - int pos = 0; - int pktlen; - - if (!yd) { - return NULL; - } - - DEBUG_MSG(("rxlen is %d", yid->rxlen)); - if (yid->rxlen < YAHOO_PACKET_HDRLEN) { - DEBUG_MSG(("len < YAHOO_PACKET_HDRLEN")); - return NULL; - } - - pos += 4; /* YMSG */ - pos += 2; - pos += 2; - - pktlen = yahoo_get16(yid->rxqueue + pos); - pos += 2; - DEBUG_MSG(("%d bytes to read, rxlen is %d", pktlen, yid->rxlen)); - - if (yid->rxlen < (YAHOO_PACKET_HDRLEN + pktlen)) { - DEBUG_MSG(("len < YAHOO_PACKET_HDRLEN + pktlen")); - return NULL; - } - - LOG(("reading packet")); - yahoo_packet_dump(yid->rxqueue, YAHOO_PACKET_HDRLEN + pktlen); - - pkt = yahoo_packet_new(0, 0, 0); - - pkt->service = yahoo_get16(yid->rxqueue + pos); - pos += 2; - pkt->status = yahoo_get32(yid->rxqueue + pos); - pos += 4; - DEBUG_MSG(("Yahoo Service: 0x%02x Status: %d", pkt->service, - pkt->status)); - pkt->id = yahoo_get32(yid->rxqueue + pos); - pos += 4; - - yd->session_id = pkt->id; - - yahoo_packet_read(pkt, yid->rxqueue + pos, pktlen); - - yid->rxlen -= YAHOO_PACKET_HDRLEN + pktlen; - DEBUG_MSG(("rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue)); - if (yid->rxlen > 0) { - unsigned char *tmp = y_memdup(yid->rxqueue + YAHOO_PACKET_HDRLEN - + pktlen, yid->rxlen); - FREE(yid->rxqueue); - yid->rxqueue = tmp; - DEBUG_MSG(("new rxlen == %d, rxqueue == %p", yid->rxlen, - yid->rxqueue)); - } else { - DEBUG_MSG(("freed rxqueue == %p", yid->rxqueue)); - FREE(yid->rxqueue); - } - - return pkt; -} - -#if 0 -static struct yab *yahoo_yab_read(unsigned char *d, int len) -{ - char *st, *en; - char *data = (char *) d; - struct yab *yab = NULL; - - data[len] = '\0'; - - DEBUG_MSG(("Got yab: %s", data)); - st = en = strstr(data, "e0=\""); - if (st) { - yab = y_new0(struct yab, 1); - - st += strlen("e0=\""); - en = strchr(st, '"'); - *en++ = '\0'; - yab->email = yahoo_xmldecode(st); - } - - if (!en) { - return NULL; - } - - st = strstr(en, "id=\""); - if (st) { - st += strlen("id=\""); - en = strchr(st, '"'); - *en++ = '\0'; - yab->yid = atoi(yahoo_xmldecode(st)); - } - - st = strstr(en, "fn=\""); - if (st) { - st += strlen("fn=\""); - en = strchr(st, '"'); - *en++ = '\0'; - yab->fname = yahoo_xmldecode(st); - } - - st = strstr(en, "ln=\""); - if (st) { - st += strlen("ln=\""); - en = strchr(st, '"'); - *en++ = '\0'; - yab->lname = yahoo_xmldecode(st); - } - - st = strstr(en, "nn=\""); - if (st) { - st += strlen("nn=\""); - en = strchr(st, '"'); - *en++ = '\0'; - yab->nname = yahoo_xmldecode(st); - } - - st = strstr(en, "yi=\""); - if (st) { - st += strlen("yi=\""); - en = strchr(st, '"'); - *en++ = '\0'; - yab->id = yahoo_xmldecode(st); - } - - st = strstr(en, "hphone=\""); - if (st) { - st += strlen("hphone=\""); - en = strchr(st, '"'); - *en++ = '\0'; - yab->hphone = yahoo_xmldecode(st); - } - - st = strstr(en, "wphone=\""); - if (st) { - st += strlen("wphone=\""); - en = strchr(st, '"'); - *en++ = '\0'; - yab->wphone = yahoo_xmldecode(st); - } - - st = strstr(en, "mphone=\""); - if (st) { - st += strlen("mphone=\""); - en = strchr(st, '"'); - *en++ = '\0'; - yab->mphone = yahoo_xmldecode(st); - } - - st = strstr(en, "dbid=\""); - if (st) { - st += strlen("dbid=\""); - en = strchr(st, '"'); - *en++ = '\0'; - yab->dbid = atoi(st); - } - - return yab; -} - -static struct yab *yahoo_getyab(struct yahoo_input_data *yid) -{ - struct yab *yab = NULL; - int pos = 0, end = 0; - struct yahoo_data *yd = yid->yd; - - if (!yd) { - return NULL; - } - - do { - DEBUG_MSG(("rxlen is %d", yid->rxlen)); - - if (yid->rxlen <= strlen("<ct")) { - return NULL; - } - - /* start with <ct */ - while (pos < yid->rxlen - strlen("<ct") + 1 - && memcmp(yid->rxqueue + pos, "<ct", strlen("<ct"))) { - pos++; - } - - if (pos >= yid->rxlen - 1) { - return NULL; - } - - end = pos + 2; - /* end with > */ - while (end < yid->rxlen - strlen(">") - && memcmp(yid->rxqueue + end, ">", strlen(">"))) { - end++; - } - - if (end >= yid->rxlen - 1) { - return NULL; - } - - yab = yahoo_yab_read(yid->rxqueue + pos, end + 2 - pos); - - yid->rxlen -= end + 1; - DEBUG_MSG(("rxlen == %d, rxqueue == %p", yid->rxlen, - yid->rxqueue)); - if (yid->rxlen > 0) { - unsigned char *tmp = - y_memdup(yid->rxqueue + end + 1, yid->rxlen); - FREE(yid->rxqueue); - yid->rxqueue = tmp; - DEBUG_MSG(("new rxlen == %d, rxqueue == %p", yid->rxlen, - yid->rxqueue)); - } else { - DEBUG_MSG(("freed rxqueue == %p", yid->rxqueue)); - FREE(yid->rxqueue); - } - - } while (!yab && end < yid->rxlen - 1); - - return yab; -} -#endif - -static char *yahoo_getwebcam_master(struct yahoo_input_data *yid) -{ - unsigned int pos = 0; - unsigned int len = 0; - unsigned int status = 0; - char *server = NULL; - struct yahoo_data *yd = yid->yd; - - if (!yid || !yd) { - return NULL; - } - - DEBUG_MSG(("rxlen is %d", yid->rxlen)); - - len = yid->rxqueue[pos++]; - if (yid->rxlen < len) { - return NULL; - } - - /* extract status (0 = ok, 6 = webcam not online) */ - status = yid->rxqueue[pos++]; - - if (status == 0) { - pos += 2; /* skip next 2 bytes */ - server = y_memdup(yid->rxqueue + pos, 16); - pos += 16; - } else if (status == 6) { - YAHOO_CALLBACK (ext_yahoo_webcam_closed) - (yd->client_id, yid->wcm->user, 4); - } - - /* skip rest of the data */ - - yid->rxlen -= len; - DEBUG_MSG(("rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue)); - if (yid->rxlen > 0) { - unsigned char *tmp = y_memdup(yid->rxqueue + pos, yid->rxlen); - FREE(yid->rxqueue); - yid->rxqueue = tmp; - DEBUG_MSG(("new rxlen == %d, rxqueue == %p", yid->rxlen, - yid->rxqueue)); - } else { - DEBUG_MSG(("freed rxqueue == %p", yid->rxqueue)); - FREE(yid->rxqueue); - } - - return server; -} - -static int yahoo_get_webcam_data(struct yahoo_input_data *yid) -{ - unsigned char reason = 0; - unsigned int pos = 0; - unsigned int begin = 0; - unsigned int end = 0; - unsigned int closed = 0; - unsigned char header_len = 0; - char *who; - int connect = 0; - struct yahoo_data *yd = yid->yd; - - if (!yd) { - return -1; - } - - if (!yid->wcm || !yid->wcd || !yid->rxlen) { - return -1; - } - - DEBUG_MSG(("rxlen is %d", yid->rxlen)); - - /* if we are not reading part of image then read header */ - if (!yid->wcd->to_read) { - header_len = yid->rxqueue[pos++]; - yid->wcd->packet_type = 0; - - if (yid->rxlen < header_len) { - return 0; - } - - if (header_len >= 8) { - reason = yid->rxqueue[pos++]; - /* next 2 bytes should always be 05 00 */ - pos += 2; - yid->wcd->data_size = yahoo_get32(yid->rxqueue + pos); - pos += 4; - yid->wcd->to_read = yid->wcd->data_size; - } - if (header_len >= 13) { - yid->wcd->packet_type = yid->rxqueue[pos++]; - yid->wcd->timestamp = yahoo_get32(yid->rxqueue + pos); - pos += 4; - } - - /* skip rest of header */ - pos = header_len; - } - - begin = pos; - pos += yid->wcd->to_read; - if (pos > yid->rxlen) { - pos = yid->rxlen; - } - - /* if it is not an image then make sure we have the whole packet */ - if (yid->wcd->packet_type != 0x02) { - if ((pos - begin) != yid->wcd->data_size) { - yid->wcd->to_read = 0; - return 0; - } else { - yahoo_packet_dump(yid->rxqueue + begin, pos - begin); - } - } - - DEBUG_MSG(("packet type %.2X, data length %d", yid->wcd->packet_type, - yid->wcd->data_size)); - - /* find out what kind of packet we got */ - switch (yid->wcd->packet_type) { - case 0x00: - /* user requests to view webcam (uploading) */ - if (yid->wcd->data_size && - yid->wcm->direction == YAHOO_WEBCAM_UPLOAD) { - end = begin; - while (end <= yid->rxlen && yid->rxqueue[end++] != 13) { - ; - } - if (end > begin) { - who = y_memdup(yid->rxqueue + begin, - end - begin); - who[end - begin - 1] = 0; - YAHOO_CALLBACK (ext_yahoo_webcam_viewer) (yd-> - client_id, who + 2, 2); - FREE(who); - } - } - - if (yid->wcm->direction == YAHOO_WEBCAM_DOWNLOAD) { - /* timestamp/status field */ - /* 0 = declined viewing permission */ - /* 1 = accepted viewing permission */ - if (yid->wcd->timestamp == 0) { - YAHOO_CALLBACK (ext_yahoo_webcam_closed) (yd-> - client_id, yid->wcm->user, 3); - } - } - break; - case 0x01: /* status packets?? */ - /* timestamp contains status info */ - /* 00 00 00 01 = we have data?? */ - break; - case 0x02: /* image data */ - YAHOO_CALLBACK (ext_yahoo_got_webcam_image) (yd->client_id, - yid->wcm->user, yid->rxqueue + begin, - yid->wcd->data_size, pos - begin, yid->wcd->timestamp); - break; - case 0x05: /* response packets when uploading */ - if (!yid->wcd->data_size) { - YAHOO_CALLBACK (ext_yahoo_webcam_data_request) (yd-> - client_id, yid->wcd->timestamp); - } - break; - case 0x07: /* connection is closing */ - switch (reason) { - case 0x01: /* user closed connection */ - closed = 1; - break; - case 0x0F: /* user cancelled permission */ - closed = 2; - break; - } - YAHOO_CALLBACK (ext_yahoo_webcam_closed) (yd->client_id, - yid->wcm->user, closed); - break; - case 0x0C: /* user connected */ - case 0x0D: /* user disconnected */ - if (yid->wcd->data_size) { - who = y_memdup(yid->rxqueue + begin, pos - begin + 1); - who[pos - begin] = 0; - if (yid->wcd->packet_type == 0x0C) { - connect = 1; - } else { - connect = 0; - } - YAHOO_CALLBACK (ext_yahoo_webcam_viewer) (yd->client_id, - who, connect); - FREE(who); - } - break; - case 0x13: /* user data */ - /* i=user_ip (ip of the user we are viewing) */ - /* j=user_ext_ip (external ip of the user we */ - /* are viewing) */ - break; - case 0x17: /* ?? */ - break; - } - yid->wcd->to_read -= pos - begin; - - yid->rxlen -= pos; - DEBUG_MSG(("rxlen == %d, rxqueue == %p", yid->rxlen, yid->rxqueue)); - if (yid->rxlen > 0) { - unsigned char *tmp = y_memdup(yid->rxqueue + pos, yid->rxlen); - FREE(yid->rxqueue); - yid->rxqueue = tmp; - DEBUG_MSG(("new rxlen == %d, rxqueue == %p", yid->rxlen, - yid->rxqueue)); - } else { - DEBUG_MSG(("freed rxqueue == %p", yid->rxqueue)); - FREE(yid->rxqueue); - } - - /* If we read a complete packet return success */ - if (!yid->wcd->to_read) { - return 1; - } - - return 0; -} - -int yahoo_write_ready(int id, void *fd, void *data) -{ - struct yahoo_input_data *yid = data; - int len; - struct data_queue *tx; - - LOG(("write callback: id=%d fd=%p data=%p", id, fd, data)); - if (!yid || !yid->txqueues) { - return -2; - } - - tx = yid->txqueues->data; - LOG(("writing %d bytes", tx->len)); - len = yahoo_send_data(fd, tx->queue, MIN(1024, tx->len)); - - if (len == -1 && errno == EAGAIN) { - return 1; - } - - if (len <= 0) { - int e = errno; - DEBUG_MSG(("len == %d (<= 0)", len)); - while (yid->txqueues) { - YList *l = yid->txqueues; - tx = l->data; - free(tx->queue); - free(tx); - yid->txqueues = - y_list_remove_link(yid->txqueues, - yid->txqueues); - y_list_free_1(l); - } - LOG(("yahoo_write_ready(%d, %p) len < 0", id, fd)); - YAHOO_CALLBACK (ext_yahoo_remove_handler) (id, yid->write_tag); - yid->write_tag = 0; - errno = e; - return 0; - } - - - tx->len -= len; - if (tx->len > 0) { - unsigned char *tmp = y_memdup(tx->queue + len, tx->len); - FREE(tx->queue); - tx->queue = tmp; - } else { - YList *l = yid->txqueues; - free(tx->queue); - free(tx); - yid->txqueues = - y_list_remove_link(yid->txqueues, yid->txqueues); - y_list_free_1(l); - /* - if(!yid->txqueues) - LOG(("yahoo_write_ready(%d, %d) !yxqueues", id, fd)); - */ - if (!yid->txqueues) { - LOG(("yahoo_write_ready(%d, %p) !txqueues", id, fd)); - YAHOO_CALLBACK (ext_yahoo_remove_handler) (id, - yid->write_tag); - yid->write_tag = 0; - } - } - - return 1; -} - -static void yahoo_process_pager_connection(struct yahoo_input_data *yid, - int over) -{ - struct yahoo_packet *pkt; - struct yahoo_data *yd = yid->yd; - int id = yd->client_id; - - if (over) { - return; - } - - while (find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER) - && (pkt = yahoo_getdata(yid)) != NULL) { - - yahoo_packet_process(yid, pkt); - - yahoo_packet_free(pkt); - } -} - -static void yahoo_process_chatcat_connection(struct yahoo_input_data *yid, - int over) -{ - if (over) { - return; - } - - if (strstr((char *) yid->rxqueue + (yid->rxlen - 20), "</content>")) { - YAHOO_CALLBACK (ext_yahoo_chat_cat_xml) (yid->yd->client_id, - (char *) yid->rxqueue); - } -} - -#if 0 -static void yahoo_process_yab_connection(struct yahoo_input_data *yid, int over) -{ - struct yahoo_data *yd = yid->yd; - struct yab *yab; - YList *buds; - int changed = 0; - int id = yd->client_id; - int yab_used = 0; - - LOG(("Got data for YAB")); - - if (over) { - return; - } - - while (find_input_by_id_and_type(id, YAHOO_CONNECTION_YAB) - && (yab = yahoo_getyab(yid)) != NULL) { - if (!yab->id) { - continue; - } - - changed = 1; - yab_used = 0; - for (buds = yd->buddies; buds; buds = buds->next) { - struct yahoo_buddy *bud = buds->data; - if (!strcmp(bud->id, yab->id)) { - yab_used = 1; - bud->yab_entry = yab; - if (yab->nname) { - bud->real_name = strdup(yab->nname); - } else if (yab->fname && yab->lname) { - bud->real_name = y_new0(char, - strlen(yab->fname) + - strlen(yab->lname) + 2); - sprintf(bud->real_name, "%s %s", - yab->fname, yab->lname); - } else if (yab->fname) { - bud->real_name = strdup(yab->fname); - } - break; /* for */ - } - } - - if (!yab_used) { - FREE(yab->fname); - FREE(yab->lname); - FREE(yab->nname); - FREE(yab->id); - FREE(yab->email); - FREE(yab->hphone); - FREE(yab->wphone); - FREE(yab->mphone); - FREE(yab); - } - - } - - if (changed) { - YAHOO_CALLBACK (ext_yahoo_got_buddies) (yd->client_id, - yd->buddies); - } -} -#endif - -static void yahoo_process_search_connection(struct yahoo_input_data *yid, - int over) -{ - struct yahoo_found_contact *yct = NULL; - char *p = (char *) yid->rxqueue, *np, *cp; - int k, n; - int start = 0, found = 0, total = 0; - YList *contacts = NULL; - struct yahoo_input_data *pyid = - find_input_by_id_and_type(yid->yd->client_id, - YAHOO_CONNECTION_PAGER); - - if (!over || !pyid) { - return; - } - - if (p && (p = strstr(p, "\r\n\r\n"))) { - p += 4; - - for (k = 0; (p = strchr(p, 4)) && (k < 4); k++) { - p++; - n = atoi(p); - switch (k) { - case 0: - found = pyid->ys->lsearch_nfound = n; - break; - case 2: - start = pyid->ys->lsearch_nstart = n; - break; - case 3: - total = pyid->ys->lsearch_ntotal = n; - break; - } - } - - if (p) { - p++; - } - - k = 0; - while (p && *p) { - cp = p; - np = strchr(p, 4); - - if (!np) { - break; - } - *np = 0; - p = np + 1; - - switch (k++) { - case 1: - if (strlen(cp) > 2 - && y_list_length(contacts) < total) { - yct = y_new0(struct yahoo_found_contact, - 1); - contacts = y_list_append(contacts, yct); - yct->id = cp + 2; - } else { - *p = 0; - } - break; - case 2: - yct->online = !strcmp(cp, "2") ? 1 : 0; - break; - case 3: - yct->gender = cp; - break; - case 4: - yct->age = atoi(cp); - break; - case 5: - /* not worth the context switch for strcmp */ - if (cp[0] != '\005' || cp[1] != '\000') { - yct->location = cp; - } - k = 0; - break; - } - } - } - - YAHOO_CALLBACK (ext_yahoo_got_search_result) (yid->yd->client_id, found, - start, total, contacts); - - while (contacts) { - YList *node = contacts; - contacts = y_list_remove_link(contacts, node); - free(node->data); - y_list_free_1(node); - } -} - -static void _yahoo_webcam_connected(void *fd, int error, void *d) -{ - struct yahoo_input_data *yid = d; - struct yahoo_webcam *wcm = yid->wcm; - struct yahoo_data *yd = yid->yd; - char conn_type[100]; - char *data = NULL; - char *packet = NULL; - unsigned char magic_nr[] = { 1, 0, 0, 0, 1 }; - unsigned header_len = 0; - unsigned int len = 0; - unsigned int pos = 0; - - if (error || !fd) { - FREE(yid); - return; - } - - yid->fd = fd; - inputs = y_list_prepend(inputs, yid); - - LOG(("Connected")); - /* send initial packet */ - switch (wcm->direction) { - case YAHOO_WEBCAM_DOWNLOAD: - data = strdup("<REQIMG>"); - break; - case YAHOO_WEBCAM_UPLOAD: - data = strdup("<SNDIMG>"); - break; - default: - return; - } - yahoo_add_to_send_queue(yid, data, strlen(data)); - FREE(data); - - /* send data */ - switch (wcm->direction) { - case YAHOO_WEBCAM_DOWNLOAD: - header_len = 8; - data = strdup("a=2\r\nc=us\r\ne=21\r\nu="); - data = y_string_append(data, yd->user); - data = y_string_append(data, "\r\nt="); - data = y_string_append(data, wcm->key); - data = y_string_append(data, "\r\ni="); - data = y_string_append(data, wcm->my_ip); - data = y_string_append(data, "\r\ng="); - data = y_string_append(data, wcm->user); - data = y_string_append(data, "\r\no=w-2-5-1\r\np="); - snprintf(conn_type, sizeof(conn_type), "%d", wcm->conn_type); - data = y_string_append(data, conn_type); - data = y_string_append(data, "\r\n"); - break; - case YAHOO_WEBCAM_UPLOAD: - header_len = 13; - data = strdup("a=2\r\nc=us\r\nu="); - data = y_string_append(data, yd->user); - data = y_string_append(data, "\r\nt="); - data = y_string_append(data, wcm->key); - data = y_string_append(data, "\r\ni="); - data = y_string_append(data, wcm->my_ip); - data = y_string_append(data, "\r\no=w-2-5-1\r\np="); - snprintf(conn_type, sizeof(conn_type), "%d", wcm->conn_type); - data = y_string_append(data, conn_type); - data = y_string_append(data, "\r\nb="); - data = y_string_append(data, wcm->description); - data = y_string_append(data, "\r\n"); - break; - } - - len = strlen(data); - packet = y_new0(char, header_len + len); - packet[pos++] = header_len; - packet[pos++] = 0; - switch (wcm->direction) { - case YAHOO_WEBCAM_DOWNLOAD: - packet[pos++] = 1; - packet[pos++] = 0; - break; - case YAHOO_WEBCAM_UPLOAD: - packet[pos++] = 5; - packet[pos++] = 0; - break; - } - - pos += yahoo_put32(packet + pos, len); - if (wcm->direction == YAHOO_WEBCAM_UPLOAD) { - memcpy(packet + pos, magic_nr, sizeof(magic_nr)); - pos += sizeof(magic_nr); - } - memcpy(packet + pos, data, len); - yahoo_add_to_send_queue(yid, packet, header_len + len); - FREE(packet); - FREE(data); - - yid->read_tag = - YAHOO_CALLBACK (ext_yahoo_add_handler) (yid->yd->client_id, - yid->fd, YAHOO_INPUT_READ, yid); -} - -static void yahoo_webcam_connect(struct yahoo_input_data *y) -{ - struct yahoo_webcam *wcm = y->wcm; - struct yahoo_input_data *yid; - - if (!wcm || !wcm->server || !wcm->key) { - return; - } - - yid = y_new0(struct yahoo_input_data, 1); - yid->type = YAHOO_CONNECTION_WEBCAM; - yid->yd = y->yd; - - /* copy webcam data to new connection */ - yid->wcm = y->wcm; - y->wcm = NULL; - - yid->wcd = y_new0(struct yahoo_webcam_data, 1); - - LOG(("Connecting to: %s:%d", wcm->server, wcm->port)); - YAHOO_CALLBACK (ext_yahoo_connect_async) (y->yd->client_id, wcm->server, - wcm->port, _yahoo_webcam_connected, yid, 0); - -} - -static void yahoo_process_webcam_master_connection(struct yahoo_input_data *yid, - int over) -{ - char *server; - struct yahoo_server_settings *yss; - - if (over) { - return; - } - - server = yahoo_getwebcam_master(yid); - - if (server) { - yss = yid->yd->server_settings; - yid->wcm->server = strdup(server); - yid->wcm->port = yss->webcam_port; - yid->wcm->conn_type = yss->conn_type; - yid->wcm->my_ip = strdup(yss->local_host); - if (yid->wcm->direction == YAHOO_WEBCAM_UPLOAD) { - yid->wcm->description = strdup(yss->webcam_description); - } - yahoo_webcam_connect(yid); - FREE(server); - } -} - -static void yahoo_process_webcam_connection(struct yahoo_input_data *yid, - int over) -{ - int id = yid->yd->client_id; - void *fd = yid->fd; - - if (over) { - return; - } - - /* as long as we still have packets available keep processing them */ - while (find_input_by_id_and_fd(id, fd) - && yahoo_get_webcam_data(yid) == 1) { - ; - } -} - -static void(*yahoo_process_connection[]) (struct yahoo_input_data *, - int over) = { - yahoo_process_pager_connection, yahoo_process_ft_connection, - NULL, /*yahoo_process_yab_connection, */ - yahoo_process_webcam_master_connection, - yahoo_process_webcam_connection, - yahoo_process_chatcat_connection, - yahoo_process_search_connection -}; - -int yahoo_read_ready(int id, void *fd, void *data) -{ - struct yahoo_input_data *yid = data; - char buf[1024]; - int len; - - LOG(("read callback: id=%d fd=%p data=%p", id, fd, data)); - if (!yid) { - return -2; - } - - do { - len = YAHOO_CALLBACK (ext_yahoo_read) (fd, buf, sizeof(buf)); - } while (len == -1 && errno == EINTR); - - if (len == -1 && (errno == EAGAIN || errno == EINTR)) { /* we'll try again later */ - return 1; - } - - if (len <= 0) { - int e = errno; - DEBUG_MSG(("len == %d (<= 0)", len)); - - if (yid->type == YAHOO_CONNECTION_PAGER) { - YAHOO_CALLBACK (ext_yahoo_login_response) (yid->yd-> - client_id, YAHOO_LOGIN_SOCK, NULL); - } - - yahoo_process_connection[yid->type] (yid, 1); - yahoo_input_close(yid); - - /* no need to return an error, because we've already fixed it */ - if (len == 0) { - return 1; - } - - errno = e; - LOG(("read error: %s", strerror(errno))); - return -1; - } - - yid->rxqueue = - y_renew(unsigned char, yid->rxqueue, len + yid->rxlen + 1); - memcpy(yid->rxqueue + yid->rxlen, buf, len); - yid->rxlen += len; - yid->rxqueue[yid->rxlen] = 0; - - yahoo_process_connection[yid->type] (yid, 0); - - return len; -} - -int yahoo_init_with_attributes(const char *username, const char *password, ...) -{ - va_list ap; - struct yahoo_data *yd; - - yd = y_new0(struct yahoo_data, 1); - - if (!yd) { - return 0; - } - - yd->user = strdup(username); - yd->password = strdup(password); - - yd->initial_status = -1; - yd->current_status = -1; - - yd->client_id = ++last_id; - - add_to_list(yd); - - va_start(ap, password); - yd->server_settings = _yahoo_assign_server_settings(ap); - va_end(ap); - - return yd->client_id; -} - -int yahoo_init(const char *username, const char *password) -{ - return yahoo_init_with_attributes(username, password, NULL); -} - -static void yahoo_connected(void *fd, int error, void *data) -{ - struct connect_callback_data *ccd = data; - struct yahoo_data *yd = ccd->yd; - struct yahoo_packet *pkt; - struct yahoo_input_data *yid; - struct yahoo_server_settings *yss = yd->server_settings; - - if (error) { - int tag; - if (fallback_ports[ccd->i]) { - char *host = yss->pager_host; - - if (!host) { - host = yss->pager_host_list[ccd->server_i]; - } - - yss->pager_port = fallback_ports[ccd->i++]; - tag = YAHOO_CALLBACK (ext_yahoo_connect_async) (yd-> - client_id, host, yss->pager_port, - yahoo_connected, ccd, 0); - - if (tag > 0) { - ccd->tag = tag; - } - } else if (yss->pager_host_list - && yss->pager_host_list[ccd->server_i]) { - - /* Get back to the default port */ - yss->pager_port = pager_port; - ccd->server_i++; - LOG(("Fallback: Connecting to %s:%d", yss->pager_host_list[ccd->server_i], yss->pager_port)); - - ccd->i = 0; - tag = YAHOO_CALLBACK (ext_yahoo_connect_async) (yd->client_id, - yss->pager_host_list[ccd->server_i], - yss->pager_port, - yahoo_connected, ccd, 0); - } else { - FREE(ccd); - YAHOO_CALLBACK (ext_yahoo_login_response) (yd->client_id, - YAHOO_LOGIN_SOCK, NULL); - } - return; - } - - FREE(ccd); - - /* fd == NULL && error == 0 means connect was cancelled */ - if (!fd) { - return; - } - - pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH, YPACKET_STATUS_DEFAULT, - yd->session_id); - NOTICE(("Sending initial packet")); - - yahoo_packet_hash(pkt, 1, yd->user); - - yid = find_input_by_id_and_type(yd->client_id, YAHOO_CONNECTION_PAGER); - yid->fd = fd; - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); - - yid->read_tag = - YAHOO_CALLBACK (ext_yahoo_add_handler) (yid->yd->client_id, - yid->fd, YAHOO_INPUT_READ, yid); -} - -void *yahoo_get_fd(int id) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - - if (!yid) { - return 0; - } else { - return yid->fd; - } -} - -#if 0 -void yahoo_send_buzz(int id, const char *from, const char *who) -{ - yahoo_send_im(id, from, who, "<ding>", 1, 0); -} -#endif - -void yahoo_send_im(int id, const char *from, const char *who, const char *what, - int utf8, int picture) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_packet *pkt = NULL; - struct yahoo_data *yd; - char pic_str[10]; - - if (!yid) { - return; - } - - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_MESSAGE, (enum ypacket_status) YAHOO_STATUS_OFFLINE, - yd->session_id); - - snprintf(pic_str, sizeof(pic_str), "%d", picture); - - if (from && strcmp(from, yd->user)) { - yahoo_packet_hash(pkt, 0, yd->user); - } - yahoo_packet_hash(pkt, 1, from ? from : yd->user); - yahoo_packet_hash(pkt, 5, who); - yahoo_packet_hash(pkt, 14, what); - - if (utf8) { - yahoo_packet_hash(pkt, 97, "1"); - } - - yahoo_packet_hash(pkt, 63, ";0"); /* imvironment name; or ;0 */ - yahoo_packet_hash(pkt, 64, "0"); - yahoo_packet_hash(pkt, 206, pic_str); - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -void yahoo_send_typing(int id, const char *from, const char *who, int typ) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt = NULL; - - if (!yid) { - return; - } - - yd = yid->yd; - pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YPACKET_STATUS_NOTIFY, - yd->session_id); - - yahoo_packet_hash(pkt, 5, who); - yahoo_packet_hash(pkt, 1, from ? from : yd->user); - yahoo_packet_hash(pkt, 14, " "); - yahoo_packet_hash(pkt, 13, typ ? "1" : "0"); - yahoo_packet_hash(pkt, 49, "TYPING"); - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -void yahoo_set_away(int id, enum yahoo_status state, const char *msg, int away) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt = NULL; - int old_status; - char s[4]; - - if (!yid) { - return; - } - - yd = yid->yd; - - old_status = yd->current_status; - yd->current_status = state; - - /* Thank you libpurple :) */ - if (yd->current_status == YAHOO_STATUS_INVISIBLE) { - pkt = yahoo_packet_new(YAHOO_SERVICE_Y6_VISIBLE_TOGGLE, - (enum ypacket_status) YAHOO_STATUS_AVAILABLE, 0); - yahoo_packet_hash(pkt, 13, "2"); - yahoo_send_packet(yid, pkt, 0); - yahoo_packet_free(pkt); - - return; - } - - pkt = yahoo_packet_new(YAHOO_SERVICE_Y6_STATUS_UPDATE, - yd->current_status, yd->session_id); - snprintf(s, sizeof(s), "%d", yd->current_status); - yahoo_packet_hash(pkt, 10, s); - yahoo_packet_hash(pkt, 19, msg && state == YAHOO_STATUS_CUSTOM ? msg : ""); - yahoo_packet_hash(pkt, 47, (away == 2) ? "2" : (away) ? "1" : "0"); - yahoo_send_packet(yid, pkt, 0); - yahoo_packet_free(pkt); - - if (old_status == YAHOO_STATUS_INVISIBLE) { - pkt = yahoo_packet_new(YAHOO_SERVICE_Y6_VISIBLE_TOGGLE, - (enum ypacket_status) YAHOO_STATUS_AVAILABLE, 0); - yahoo_packet_hash(pkt, 13, "1"); - yahoo_send_packet(yid, pkt, 0); - yahoo_packet_free(pkt); - } -} - -void yahoo_logoff(int id) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt = NULL; - - if (!yid) { - return; - } - yd = yid->yd; - - LOG(("yahoo_logoff: current status: %d", yd->current_status)); - - if (yd->current_status != -1 && 0) { - /* Meh. Don't send this. The event handlers are not going to - get to do this so it'll just leak memory. And the TCP - connection reset will hopefully be clear enough. */ - pkt = yahoo_packet_new(YAHOO_SERVICE_LOGOFF, - YPACKET_STATUS_DEFAULT, yd->session_id); - yd->current_status = -1; - - if (pkt) { - yahoo_send_packet(yid, pkt, 0); - yahoo_packet_free(pkt); - } - } - -/* do { - yahoo_input_close(yid); - } while((yid = find_input_by_id(id)));*/ - -} - -#if 0 -void yahoo_get_list(int id) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt = NULL; - - if (!yid) { - return; - } - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_LIST, YPACKET_STATUS_DEFAULT, - yd->session_id); - yahoo_packet_hash(pkt, 1, yd->user); - if (pkt) { - yahoo_send_packet(yid, pkt, 0); - yahoo_packet_free(pkt); - } -} -#endif - -static void _yahoo_http_connected(int id, void *fd, int error, void *data) -{ - struct yahoo_input_data *yid = data; - - if (fd == NULL || error) { - inputs = y_list_remove(inputs, yid); - FREE(yid); - return; - } - - yid->fd = fd; - yid->read_tag = - YAHOO_CALLBACK (ext_yahoo_add_handler) (yid->yd->client_id, fd, - YAHOO_INPUT_READ, yid); -} - -#if 0 -/* FIXME Get address book from address.yahoo.com instead */ -void yahoo_get_yab(int id) -{ - struct yahoo_data *yd = find_conn_by_id(id); - struct yahoo_input_data *yid; - char url[1024]; - char buff[2048]; - - if (!yd) { - return; - } - - yid = y_new0(struct yahoo_input_data, 1); - yid->yd = yd; - yid->type = YAHOO_CONNECTION_YAB; - - LOG(("Sending request for Address Book")); - - snprintf(url, 1024, - "http://address.yahoo.com/yab/us?v=XM&prog=ymsgr&.intl=us" - "&diffs=1&t=0&tags=short&rt=0&prog-ver=8.1.0.249&useutf8=1&legenc=codepage-1252"); - - snprintf(buff, sizeof(buff), "Y=%s; T=%s", yd->cookie_y, yd->cookie_t); - - inputs = y_list_prepend(inputs, yid); - - yahoo_http_get(yid->yd->client_id, url, buff, 0, 0, - _yahoo_http_connected, yid); -} - -struct yahoo_post_data { - struct yahoo_input_data *yid; - char *data; -}; - -static void _yahoo_http_post_connected(int id, void *fd, int error, void *data) -{ - struct yahoo_post_data *yad = data; - struct yahoo_input_data *yid = yad->yid; - char *buff = yad->data; - - if (!fd) { - inputs = y_list_remove(inputs, yid); - FREE(yid); - return; - } - - YAHOO_CALLBACK (ext_yahoo_write) (fd, buff, strlen(buff)); - - yid->fd = fd; - yid->read_tag = - YAHOO_CALLBACK (ext_yahoo_add_handler) (yid->yd->client_id, fd, - YAHOO_INPUT_READ, yid); - - FREE(buff); - FREE(yad); -} - -/* FIXME This is also likely affected */ -void yahoo_set_yab(int id, struct yab *yab) -{ - struct yahoo_post_data *yad = y_new0(struct yahoo_post_data, 1); - struct yahoo_data *yd = find_conn_by_id(id); - struct yahoo_input_data *yid; - char url[1024]; - char buff[1024]; - char post[1024]; - int size = 0; - - if (!yd) { - return; - } - - yid = y_new0(struct yahoo_input_data, 1); - yid->type = YAHOO_CONNECTION_YAB; - yid->yd = yd; - - if (yab->yid) { - size = snprintf(post, sizeof(post), "<?xml version=\"1.0\" encoding=\"utf-8\"?>" - "<ab k=\"%s\" cc=\"%d\">" - "<ct id=\"%d\" e=\"1\" yi=\"%s\" nn=\"%s\" />" - "</ab>", yd->user, 9, yab->yid, /* Don't know why */ - yab->id, yab->nname ? yab->nname : ""); - } else { - size = snprintf(post, sizeof(post), "<?xml version=\"1.0\" encoding=\"utf-8\"?>" - "<ab k=\"%s\" cc=\"%d\">" - "<ct a=\"1\" yi=\"%s\" nn=\"%s\" />" - "</ab>", yd->user, 1, /* Don't know why */ - yab->id, yab->nname ? yab->nname : ""); - } - - yad->yid = yid; - yad->data = strdup(post); - - strcpy(url, "http://address.yahoo.com/yab/us?v=XM&prog=ymsgr&.intl=us" - "&sync=1&tags=short&noclear=1&useutf8=1&legenc=codepage-1252"); - - snprintf(buff, sizeof(buff), "Y=%s; T=%s", yd->cookie_y, yd->cookie_t); - - inputs = y_list_prepend(inputs, yid); - - yahoo_http_post(yid->yd->client_id, url, buff, size, - _yahoo_http_post_connected, yad); -} - -void yahoo_set_identity_status(int id, const char *identity, int active) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt = NULL; - - if (!yid) { - return; - } - yd = yid->yd; - - pkt = yahoo_packet_new(active ? YAHOO_SERVICE_IDACT : - YAHOO_SERVICE_IDDEACT, YPACKET_STATUS_DEFAULT, yd->session_id); - yahoo_packet_hash(pkt, 3, identity); - if (pkt) { - yahoo_send_packet(yid, pkt, 0); - yahoo_packet_free(pkt); - } -} - -void yahoo_refresh(int id) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt = NULL; - - if (!yid) { - return; - } - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_USERSTAT, YPACKET_STATUS_DEFAULT, - yd->session_id); - if (pkt) { - yahoo_send_packet(yid, pkt, 0); - yahoo_packet_free(pkt); - } -} -#endif - -void yahoo_keepalive(int id) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt = NULL; - - if (!yid) { - return; - } - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_PING, YPACKET_STATUS_DEFAULT, - yd->session_id); - yahoo_send_packet(yid, pkt, 0); - yahoo_packet_free(pkt); -} - -#if 0 -void yahoo_chat_keepalive(int id) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt = NULL; - - if (!yid) { - return; - } - - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_CHATPING, YPACKET_STATUS_DEFAULT, - yd->session_id); - yahoo_send_packet(yid, pkt, 0); - yahoo_packet_free(pkt); -} -#endif - -void yahoo_add_buddy(int id, const char *who, const char *group, - const char *msg) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - - if (!yid) { - return; - } - yd = yid->yd; - - if (!yd->logged_in) { - return; - } - - pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YPACKET_STATUS_DEFAULT, - yd->session_id); - if (msg != NULL) { /* add message/request "it's me add me" */ - yahoo_packet_hash(pkt, 14, msg); - } else { - yahoo_packet_hash(pkt, 14, ""); - } - yahoo_packet_hash(pkt, 65, group); - yahoo_packet_hash(pkt, 97, "1"); - yahoo_packet_hash(pkt, 1, yd->user); - yahoo_packet_hash(pkt, 302, "319"); - yahoo_packet_hash(pkt, 300, "319"); - yahoo_packet_hash(pkt, 7, who); - yahoo_packet_hash(pkt, 334, "0"); - yahoo_packet_hash(pkt, 301, "319"); - yahoo_packet_hash(pkt, 303, "319"); - yahoo_send_packet(yid, pkt, 0); - yahoo_packet_free(pkt); -} - -void yahoo_remove_buddy(int id, const char *who, const char *group) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt = NULL; - - if (!yid) { - return; - } - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YPACKET_STATUS_DEFAULT, - yd->session_id); - - yahoo_packet_hash(pkt, 1, yd->user); - yahoo_packet_hash(pkt, 7, who); - yahoo_packet_hash(pkt, 65, group); - yahoo_send_packet(yid, pkt, 0); - yahoo_packet_free(pkt); -} - -void yahoo_confirm_buddy(int id, const char *who, int reject, const char *msg) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - - if (!yid) { - return; - } - yd = yid->yd; - - if (!yd->logged_in) { - return; - } - - pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_AUTHORIZATION, - YPACKET_STATUS_DEFAULT, yd->session_id); - yahoo_packet_hash(pkt, 1, yd->user); - yahoo_packet_hash(pkt, 5, who); - if (reject) { - yahoo_packet_hash(pkt, 13, "2"); - } else { - yahoo_packet_hash(pkt, 241, "0"); - yahoo_packet_hash(pkt, 13, "1"); - } - - yahoo_packet_hash(pkt, 334, "0"); - - if (reject) { - yahoo_packet_hash(pkt, 14, msg ? msg : ""); - yahoo_packet_hash(pkt, 97, "1"); - } - - yahoo_send_packet(yid, pkt, 0); - yahoo_packet_free(pkt); -} - -#if 0 -void yahoo_ignore_buddy(int id, const char *who, int unignore) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - - if (!yid) { - return; - } - yd = yid->yd; - - if (!yd->logged_in) { - return; - } - - pkt = yahoo_packet_new(YAHOO_SERVICE_IGNORECONTACT, - YPACKET_STATUS_DEFAULT, yd->session_id); - yahoo_packet_hash(pkt, 1, yd->user); - yahoo_packet_hash(pkt, 7, who); - yahoo_packet_hash(pkt, 13, unignore ? "2" : "1"); - yahoo_send_packet(yid, pkt, 0); - yahoo_packet_free(pkt); -} - -void yahoo_stealth_buddy(int id, const char *who, int unstealth) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - - if (!yid) { - return; - } - yd = yid->yd; - - if (!yd->logged_in) { - return; - } - - pkt = yahoo_packet_new(YAHOO_SERVICE_STEALTH_PERM, - YPACKET_STATUS_DEFAULT, yd->session_id); - yahoo_packet_hash(pkt, 1, yd->user); - yahoo_packet_hash(pkt, 7, who); - yahoo_packet_hash(pkt, 31, unstealth ? "2" : "1"); - yahoo_packet_hash(pkt, 13, "2"); - yahoo_send_packet(yid, pkt, 0); - yahoo_packet_free(pkt); -} -#endif - -void yahoo_change_buddy_group(int id, const char *who, const char *old_group, - const char *new_group) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt = NULL; - - if (!yid) { - return; - } - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_CHANGE_GROUP, - YPACKET_STATUS_DEFAULT, yd->session_id); - yahoo_packet_hash(pkt, 1, yd->user); - yahoo_packet_hash(pkt, 302, "240"); - yahoo_packet_hash(pkt, 300, "240"); - yahoo_packet_hash(pkt, 7, who); - yahoo_packet_hash(pkt, 224, old_group); - yahoo_packet_hash(pkt, 264, new_group); - yahoo_packet_hash(pkt, 301, "240"); - yahoo_packet_hash(pkt, 303, "240"); - - yahoo_send_packet(yid, pkt, 0); - yahoo_packet_free(pkt); -} - -#if 0 -void yahoo_group_rename(int id, const char *old_group, const char *new_group) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt = NULL; - - if (!yid) { - return; - } - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_GROUPRENAME, - YPACKET_STATUS_DEFAULT, yd->session_id); - yahoo_packet_hash(pkt, 1, yd->user); - yahoo_packet_hash(pkt, 65, old_group); - yahoo_packet_hash(pkt, 67, new_group); - - yahoo_send_packet(yid, pkt, 0); - yahoo_packet_free(pkt); -} - -void yahoo_conference_addinvite(int id, const char *from, const char *who, - const char *room, const YList *members, const char *msg) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - - if (!yid) { - return; - } - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_CONFADDINVITE, - YPACKET_STATUS_DEFAULT, yd->session_id); - - yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); - yahoo_packet_hash(pkt, 51, who); - yahoo_packet_hash(pkt, 57, room); - yahoo_packet_hash(pkt, 58, msg); - yahoo_packet_hash(pkt, 13, "0"); - for (; members; members = members->next) { - yahoo_packet_hash(pkt, 52, (char *) members->data); - yahoo_packet_hash(pkt, 53, (char *) members->data); - } - /* 52, 53 -> other members? */ - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} -#endif - -void yahoo_conference_invite(int id, const char *from, YList *who, - const char *room, const char *msg) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - - if (!yid) { - return; - } - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_CONFINVITE, YPACKET_STATUS_DEFAULT, - yd->session_id); - - yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); - yahoo_packet_hash(pkt, 50, yd->user); - for (; who; who = who->next) { - yahoo_packet_hash(pkt, 52, (char *) who->data); - } - yahoo_packet_hash(pkt, 57, room); - yahoo_packet_hash(pkt, 58, msg); - yahoo_packet_hash(pkt, 13, "0"); - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -void yahoo_conference_logon(int id, const char *from, YList *who, - const char *room) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - - if (!yid) { - return; - } - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_CONFLOGON, YPACKET_STATUS_DEFAULT, - yd->session_id); - - yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); - yahoo_packet_hash(pkt, 3, (from ? from : yd->user)); - yahoo_packet_hash(pkt, 57, room); - for (; who; who = who->next) { - yahoo_packet_hash(pkt, 3, (char *) who->data); - } - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -void yahoo_conference_decline(int id, const char *from, YList *who, - const char *room, const char *msg) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - - if (!yid) { - return; - } - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_CONFDECLINE, - YPACKET_STATUS_DEFAULT, yd->session_id); - - yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); - yahoo_packet_hash(pkt, 3, (from ? from : yd->user)); - for (; who; who = who->next) { - yahoo_packet_hash(pkt, 3, (char *) who->data); - } - yahoo_packet_hash(pkt, 57, room); - yahoo_packet_hash(pkt, 14, msg); - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -void yahoo_conference_logoff(int id, const char *from, YList *who, - const char *room) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - - if (!yid) { - return; - } - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_CONFLOGOFF, YPACKET_STATUS_DEFAULT, - yd->session_id); - - yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); - yahoo_packet_hash(pkt, 3, (from ? from : yd->user)); - for (; who; who = who->next) { - yahoo_packet_hash(pkt, 3, (char *) who->data); - } - - yahoo_packet_hash(pkt, 57, room); - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -void yahoo_conference_message(int id, const char *from, YList *who, - const char *room, const char *msg, int utf8) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - - if (!yid) { - return; - } - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_CONFMSG, YPACKET_STATUS_DEFAULT, - yd->session_id); - - yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); - yahoo_packet_hash(pkt, 53, (from ? from : yd->user)); - for (; who; who = who->next) { - yahoo_packet_hash(pkt, 53, (char *) who->data); - } - - yahoo_packet_hash(pkt, 57, room); - yahoo_packet_hash(pkt, 14, msg); - - if (utf8) { - yahoo_packet_hash(pkt, 97, "1"); - } - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -#if 0 -void yahoo_get_chatrooms(int id, int chatroomid) -{ - struct yahoo_data *yd = find_conn_by_id(id); - struct yahoo_input_data *yid; - char url[1024]; - char buff[1024]; - - if (!yd) { - return; - } - - yid = y_new0(struct yahoo_input_data, 1); - yid->yd = yd; - yid->type = YAHOO_CONNECTION_CHATCAT; - - if (chatroomid == 0) { - snprintf(url, 1024, - "http://insider.msg.yahoo.com/ycontent/?chatcat=0"); - } else { - snprintf(url, 1024, - "http://insider.msg.yahoo.com/ycontent/?chatroom_%d=0", - chatroomid); - } - - snprintf(buff, sizeof(buff), "Y=%s; T=%s", yd->cookie_y, yd->cookie_t); - - inputs = y_list_prepend(inputs, yid); - - yahoo_http_get(yid->yd->client_id, url, buff, 0, 0, - _yahoo_http_connected, yid); -} - -void yahoo_chat_logon(int id, const char *from, const char *room, - const char *roomid) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - - if (!yid) { - return; - } - - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_CHATONLINE, YPACKET_STATUS_DEFAULT, - yd->session_id); - - yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); - yahoo_packet_hash(pkt, 109, yd->user); - yahoo_packet_hash(pkt, 6, "abcde"); - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); - - pkt = yahoo_packet_new(YAHOO_SERVICE_CHATJOIN, YPACKET_STATUS_DEFAULT, - yd->session_id); - - yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); - yahoo_packet_hash(pkt, 104, room); - yahoo_packet_hash(pkt, 129, roomid); - yahoo_packet_hash(pkt, 62, "2"); /* ??? */ - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -void yahoo_chat_message(int id, const char *from, const char *room, - const char *msg, const int msgtype, const int utf8) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - char buf[2]; - - if (!yid) { - return; - } - - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_COMMENT, YPACKET_STATUS_DEFAULT, - yd->session_id); - - yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); - yahoo_packet_hash(pkt, 104, room); - yahoo_packet_hash(pkt, 117, msg); - - snprintf(buf, sizeof(buf), "%d", msgtype); - yahoo_packet_hash(pkt, 124, buf); - - if (utf8) { - yahoo_packet_hash(pkt, 97, "1"); - } - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -void yahoo_chat_logoff(int id, const char *from) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - - if (!yid) { - return; - } - - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_CHATLOGOUT, YPACKET_STATUS_DEFAULT, - yd->session_id); - - yahoo_packet_hash(pkt, 1, (from ? from : yd->user)); - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -void yahoo_buddyicon_request(int id, const char *who) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - - if (!yid) { - return; - } - - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE, YPACKET_STATUS_DEFAULT, - 0); - yahoo_packet_hash(pkt, 4, yd->user); - yahoo_packet_hash(pkt, 5, who); - yahoo_packet_hash(pkt, 13, "1"); - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -void yahoo_send_picture_info(int id, const char *who, const char *url, - int checksum) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - char checksum_str[10]; - - if (!yid) { - return; - } - - yd = yid->yd; - - snprintf(checksum_str, sizeof(checksum_str), "%d", checksum); - - pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE, YPACKET_STATUS_DEFAULT, - 0); - yahoo_packet_hash(pkt, 1, yd->user); - yahoo_packet_hash(pkt, 4, yd->user); - yahoo_packet_hash(pkt, 5, who); - yahoo_packet_hash(pkt, 13, "2"); - yahoo_packet_hash(pkt, 20, url); - yahoo_packet_hash(pkt, 192, checksum_str); - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -void yahoo_send_picture_update(int id, const char *who, int type) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - char type_str[10]; - - if (!yid) { - return; - } - - yd = yid->yd; - - snprintf(type_str, sizeof(type_str), "%d", type); - - pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE_UPDATE, - YPACKET_STATUS_DEFAULT, 0); - yahoo_packet_hash(pkt, 1, yd->user); - yahoo_packet_hash(pkt, 5, who); - yahoo_packet_hash(pkt, 206, type_str); - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -void yahoo_send_picture_checksum(int id, const char *who, int checksum) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - char checksum_str[10]; - - if (!yid) { - return; - } - - yd = yid->yd; - - snprintf(checksum_str, sizeof(checksum_str), "%d", checksum); - - pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE_CHECKSUM, - YPACKET_STATUS_DEFAULT, 0); - yahoo_packet_hash(pkt, 1, yd->user); - if (who != 0) { - yahoo_packet_hash(pkt, 5, who); - } - yahoo_packet_hash(pkt, 192, checksum_str); - yahoo_packet_hash(pkt, 212, "1"); - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -void yahoo_webcam_close_feed(int id, const char *who) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_webcam_user(id, who); - - if (yid) { - yahoo_input_close(yid); - } -} - -void yahoo_webcam_get_feed(int id, const char *who) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_data *yd; - struct yahoo_packet *pkt; - - if (!yid) { - return; - } - - /* - * add the user to the queue. this is a dirty hack, since - * the yahoo server doesn't tell us who's key it's returning, - * we have to just hope that it sends back keys in the same - * order that we request them. - * The queue is popped in yahoo_process_webcam_key - */ - webcam_queue = y_list_append(webcam_queue, who ? strdup(who) : NULL); - - yd = yid->yd; - - pkt = yahoo_packet_new(YAHOO_SERVICE_WEBCAM, YPACKET_STATUS_DEFAULT, - yd->session_id); - - yahoo_packet_hash(pkt, 1, yd->user); - if (who != NULL) { - yahoo_packet_hash(pkt, 5, who); - } - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -void yahoo_webcam_send_image(int id, unsigned char *image, unsigned int length, - unsigned int timestamp) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_WEBCAM); - unsigned char *packet; - unsigned char header_len = 13; - unsigned int pos = 0; - - if (!yid) { - return; - } - - packet = y_new0(unsigned char, header_len); - - packet[pos++] = header_len; - packet[pos++] = 0; - packet[pos++] = 5; /* version byte?? */ - packet[pos++] = 0; - pos += yahoo_put32(packet + pos, length); - packet[pos++] = 2; /* packet type, image */ - pos += yahoo_put32(packet + pos, timestamp); - yahoo_add_to_send_queue(yid, packet, header_len); - FREE(packet); - - if (length) { - yahoo_add_to_send_queue(yid, image, length); - } -} - -void yahoo_webcam_accept_viewer(int id, const char *who, int accept) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_WEBCAM); - char *packet = NULL; - char *data = NULL; - unsigned char header_len = 13; - unsigned int pos = 0; - unsigned int len = 0; - - if (!yid) { - return; - } - - data = strdup("u="); - data = y_string_append(data, (char *) who); - data = y_string_append(data, "\r\n"); - len = strlen(data); - - packet = y_new0(char, header_len + len); - packet[pos++] = header_len; - packet[pos++] = 0; - packet[pos++] = 5; /* version byte?? */ - packet[pos++] = 0; - pos += yahoo_put32(packet + pos, len); - packet[pos++] = 0; /* packet type */ - pos += yahoo_put32(packet + pos, accept); - memcpy(packet + pos, data, len); - FREE(data); - yahoo_add_to_send_queue(yid, packet, header_len + len); - FREE(packet); -} - -void yahoo_webcam_invite(int id, const char *who) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_packet *pkt; - - if (!yid) { - return; - } - - pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YPACKET_STATUS_NOTIFY, - yid->yd->session_id); - - yahoo_packet_hash(pkt, 49, "WEBCAMINVITE"); - yahoo_packet_hash(pkt, 14, " "); - yahoo_packet_hash(pkt, 13, "0"); - yahoo_packet_hash(pkt, 1, yid->yd->user); - yahoo_packet_hash(pkt, 5, who); - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -static void yahoo_search_internal(int id, int t, const char *text, int g, - int ar, int photo, int yahoo_only, int startpos, int total) -{ - struct yahoo_data *yd = find_conn_by_id(id); - struct yahoo_input_data *yid; - char url[1024]; - char buff[1024]; - char *ctext, *p; - - if (!yd) { - return; - } - - yid = y_new0(struct yahoo_input_data, 1); - yid->yd = yd; - yid->type = YAHOO_CONNECTION_SEARCH; - - /* - age range - .ar=1 - 13-18, 2 - 18-25, 3 - 25-35, 4 - 35-50, 5 - 50-70, 6 - 70+ - */ - - snprintf(buff, sizeof(buff), "&.sq=%%20&.tt=%d&.ss=%d", total, - startpos); - - ctext = strdup(text); - while ((p = strchr(ctext, ' '))) { - *p = '+'; - } - - snprintf(url, 1024, - "http://members.yahoo.com/interests?.oc=m&.kw=%s&.sb=%d&.g=%d&.ar=0%s%s%s", - ctext, t, g, photo ? "&.p=y" : "", yahoo_only ? "&.pg=y" : "", - startpos ? buff : ""); - - FREE(ctext); - - snprintf(buff, sizeof(buff), "Y=%s; T=%s", yd->cookie_y, yd->cookie_t); - - inputs = y_list_prepend(inputs, yid); - yahoo_http_get(yid->yd->client_id, url, buff, 0, 0, - _yahoo_http_connected, yid); -} - -void yahoo_search(int id, enum yahoo_search_type t, const char *text, - enum yahoo_search_gender g, enum yahoo_search_agerange ar, int photo, - int yahoo_only) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_search_state *yss; - - if (!yid) { - return; - } - - if (!yid->ys) { - yid->ys = y_new0(struct yahoo_search_state, 1); - } - - yss = yid->ys; - - FREE(yss->lsearch_text); - yss->lsearch_type = t; - yss->lsearch_text = strdup(text); - yss->lsearch_gender = g; - yss->lsearch_agerange = ar; - yss->lsearch_photo = photo; - yss->lsearch_yahoo_only = yahoo_only; - - yahoo_search_internal(id, t, text, g, ar, photo, yahoo_only, 0, 0); -} - -void yahoo_search_again(int id, int start) -{ - struct yahoo_input_data *yid = - find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - struct yahoo_search_state *yss; - - if (!yid || !yid->ys) { - return; - } - - yss = yid->ys; - - if (start == -1) { - start = yss->lsearch_nstart + yss->lsearch_nfound; - } - - yahoo_search_internal(id, yss->lsearch_type, yss->lsearch_text, - yss->lsearch_gender, yss->lsearch_agerange, - yss->lsearch_photo, yss->lsearch_yahoo_only, - start, yss->lsearch_ntotal); -} - -void yahoo_send_picture(int id, const char *name, unsigned long size, - yahoo_get_fd_callback callback, void *data) -{ - /* Not Implemented */ -} -#endif - -/* File Transfer */ -static YList *active_file_transfers = NULL; - -enum { - FT_STATE_HEAD = 1, - FT_STATE_RECV, - FT_STATE_RECV_START, - FT_STATE_SEND -}; - -struct send_file_data { - int client_id; - char *id; - char *who; - char *filename; - char *ip_addr; - char *token; - int size; - - struct yahoo_input_data *yid; - int state; - - yahoo_get_fd_callback callback; - void *data; -}; - -#if 0 -static char *yahoo_get_random(void) -{ - int i = 0; - int r = 0; - int c = 0; - char out[25]; - - out[24] = '\0'; - out[23] = '$'; - out[22] = '$'; - - for (i = 0; i < 22; i++) { - if (r == 0) { - r = rand(); - } - - c = r % 61; - - if (c < 26) { - out[i] = c + 'a'; - } else if (c < 52) { - out[i] = c - 26 + 'A'; - } else { - out[i] = c - 52 + '0'; - } - - r /= 61; - } - - return strdup(out); -} -#endif - -static int _are_same_id(const void *sfd1, const void *id) -{ - return strcmp(((struct send_file_data *) sfd1)->id, (char *) id); -} - -static int _are_same_yid(const void *sfd1, const void *yid) -{ - if (((struct send_file_data *) sfd1)->yid == yid) { - return 0; - } else { - return 1; - } -} - -static struct send_file_data *yahoo_get_active_transfer(char *id) -{ - YList *l = y_list_find_custom(active_file_transfers, id, - _are_same_id); - - if (l) { - return (struct send_file_data *) l->data; - } - - return NULL; -} - -static struct send_file_data *yahoo_get_active_transfer_with_yid(void *yid) -{ - YList *l = y_list_find_custom(active_file_transfers, yid, - _are_same_yid); - - if (l) { - return (struct send_file_data *) l->data; - } - - return NULL; -} - -static void yahoo_add_active_transfer(struct send_file_data *sfd) -{ - active_file_transfers = y_list_prepend(active_file_transfers, sfd); -} - -static void yahoo_remove_active_transfer(struct send_file_data *sfd) -{ - if (sfd == NULL) { - return; - } - - active_file_transfers = y_list_remove(active_file_transfers, sfd); - free(sfd->id); - free(sfd->who); - free(sfd->filename); - free(sfd->ip_addr); - FREE(sfd); -} - -static void _yahoo_ft_upload_connected(int id, void *fd, int error, void *data) -{ - struct send_file_data *sfd = data; - struct yahoo_input_data *yid = sfd->yid; - - if (!fd) { - inputs = y_list_remove(inputs, yid); - FREE(yid); - return; - } - - sfd->callback(id, fd, error, sfd->data); - - yid->fd = fd; - yid->read_tag = - YAHOO_CALLBACK (ext_yahoo_add_handler) (yid->yd->client_id, fd, - YAHOO_INPUT_READ, yid); -} - -static void yahoo_file_transfer_upload(struct yahoo_data *yd, - struct send_file_data *sfd) -{ - char url[256]; - char buff[4096]; - char *sender_enc = NULL, *recv_enc = NULL, *token_enc = NULL; - - struct yahoo_input_data *yid = y_new0(struct yahoo_input_data, 1); - - yid->yd = yd; - yid->type = YAHOO_CONNECTION_FT; - - inputs = y_list_prepend(inputs, yid); - sfd->yid = yid; - sfd->state = FT_STATE_SEND; - - token_enc = yahoo_urlencode(sfd->token); - sender_enc = yahoo_urlencode(yd->user); - recv_enc = yahoo_urlencode(sfd->who); - - snprintf(url, sizeof(url), - "http://%s/relay?token=%s&sender=%s&recver=%s", sfd->ip_addr, - token_enc, sender_enc, recv_enc); - - snprintf(buff, sizeof(buff), "T=%s; Y=%s", yd->cookie_t, yd->cookie_y); - - yahoo_http_post(yd->client_id, url, buff, sfd->size, - _yahoo_ft_upload_connected, sfd); - - FREE(token_enc); - FREE(sender_enc); - FREE(recv_enc); -} - -static void yahoo_init_ft_recv(struct yahoo_data *yd, - struct send_file_data *sfd) -{ - char url[256]; - char buff[1024]; - char *sender_enc = NULL, *recv_enc = NULL, *token_enc = NULL; - - struct yahoo_input_data *yid = y_new0(struct yahoo_input_data, 1); - - yid->yd = yd; - yid->type = YAHOO_CONNECTION_FT; - - inputs = y_list_prepend(inputs, yid); - sfd->yid = yid; - sfd->state = FT_STATE_HEAD; - - token_enc = yahoo_urlencode(sfd->token); - sender_enc = yahoo_urlencode(sfd->who); - recv_enc = yahoo_urlencode(yd->user); - - snprintf(url, sizeof(url), - "http://%s/relay?token=%s&sender=%s&recver=%s", sfd->ip_addr, - token_enc, sender_enc, recv_enc); - - snprintf(buff, sizeof(buff), "Y=%s; T=%s", yd->cookie_y, yd->cookie_t); - - yahoo_http_head(yid->yd->client_id, url, buff, 0, NULL, - _yahoo_http_connected, yid); - - FREE(token_enc); - FREE(sender_enc); - FREE(recv_enc); -} - -static void yahoo_file_transfer_accept(struct yahoo_input_data *yid, - struct send_file_data *sfd) -{ - struct yahoo_packet *pkt; - - pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFERACCEPT, - YPACKET_STATUS_DEFAULT, yid->yd->session_id); - - yahoo_packet_hash(pkt, 1, yid->yd->user); - yahoo_packet_hash(pkt, 5, sfd->who); - yahoo_packet_hash(pkt, 265, sfd->id); - yahoo_packet_hash(pkt, 27, sfd->filename); - yahoo_packet_hash(pkt, 249, "3"); - yahoo_packet_hash(pkt, 251, sfd->token); - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); - - yahoo_init_ft_recv(yid->yd, sfd); -} - -static void yahoo_process_filetransferaccept(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - YList *l; - struct send_file_data *sfd; - char *id = NULL; - char *token = NULL; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - switch (pair->key) { - case 4: - /* who */ - break; - case 5: - /* Me... don't care */ - break; - case 249: - break; - case 265: - id = pair->value; - break; - case 251: - token = pair->value; - break; - case 27: - /* filename */ - break; - } - } - - sfd = yahoo_get_active_transfer(id); - - if (sfd) { - sfd->token = strdup(token); - - yahoo_file_transfer_upload(yid->yd, sfd); - } else { - YAHOO_CALLBACK (ext_yahoo_file_transfer_done) - (yid->yd->client_id, YAHOO_FILE_TRANSFER_UNKNOWN, - sfd ? sfd->data : NULL); - - yahoo_remove_active_transfer(sfd); - } -} - -static void yahoo_process_filetransferinfo(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - YList *l; - char *id = NULL; - char *token = NULL; - char *ip_addr = NULL; - - struct send_file_data *sfd; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - switch (pair->key) { - case 1: - case 4: - /* who */ - break; - case 5: - /* Me... don't care */ - break; - case 249: - break; - case 265: - id = pair->value; - break; - case 250: - ip_addr = pair->value; - break; - case 251: - token = pair->value; - break; - case 27: - /* filename */ - break; - } - } - - sfd = yahoo_get_active_transfer(id); - - if (sfd) { - sfd->token = strdup(token); - sfd->ip_addr = strdup(ip_addr); - - yahoo_file_transfer_accept(yid, sfd); - } else { - YAHOO_CALLBACK (ext_yahoo_file_transfer_done) - (yid->yd->client_id, YAHOO_FILE_TRANSFER_UNKNOWN, - sfd ? sfd->data : NULL); - - yahoo_remove_active_transfer(sfd); - } -} - -static void yahoo_send_filetransferinfo(struct yahoo_data *yd, - struct send_file_data *sfd) -{ - struct yahoo_input_data *yid; - struct yahoo_packet *pkt; - - yid = find_input_by_id_and_type(yd->client_id, YAHOO_CONNECTION_PAGER); - sfd->ip_addr = YAHOO_CALLBACK (ext_yahoo_get_ip_addr)("relay.yahoo.com"); - - if (!sfd->ip_addr) { - YAHOO_CALLBACK (ext_yahoo_file_transfer_done) - (yd->client_id, YAHOO_FILE_TRANSFER_RELAY, sfd->data); - - yahoo_remove_active_transfer(sfd); - - return; - } - - pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFERINFO, - YPACKET_STATUS_DEFAULT, yd->session_id); - - yahoo_packet_hash(pkt, 1, yd->user); - yahoo_packet_hash(pkt, 5, sfd->who); - yahoo_packet_hash(pkt, 265, sfd->id); - yahoo_packet_hash(pkt, 27, sfd->filename); - yahoo_packet_hash(pkt, 249, "3"); - yahoo_packet_hash(pkt, 250, sfd->ip_addr); - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -static void yahoo_process_filetransfer(struct yahoo_input_data *yid, - struct yahoo_packet *pkt) -{ - YList *l; - char *who = NULL; - char *filename = NULL; - char *msg = NULL; - char *id = NULL; - int action = 0; - int size = 0; - struct yahoo_data *yd = yid->yd; - - struct send_file_data *sfd; - - for (l = pkt->hash; l; l = l->next) { - struct yahoo_pair *pair = l->data; - switch (pair->key) { - case 4: - who = pair->value; - break; - case 5: - /* Me... don't care */ - break; - case 222: - action = atoi(pair->value); - break; - case 265: - id = pair->value; - break; - case 266: /* Don't know */ - break; - case 302: /* Start Data? */ - break; - case 300: - break; - case 27: - filename = pair->value; - break; - case 28: - size = atoi(pair->value); - break; - case 14: - msg = pair->value; - case 301: /* End Data? */ - break; - case 303: - break; - - } - } - - if (action == YAHOO_FILE_TRANSFER_INIT) { - /* Received a FT request from buddy */ - sfd = y_new0(struct send_file_data, 1); - - sfd->client_id = yd->client_id; - sfd->id = strdup(id); - sfd->who = strdup(who); - sfd->filename = strdup(filename); - sfd->size = size; - - yahoo_add_active_transfer(sfd); - - YAHOO_CALLBACK (ext_yahoo_got_file) (yd->client_id, yd->user, - who, msg, filename, size, sfd->id); - } else { - /* Response to our request */ - sfd = yahoo_get_active_transfer(id); - - if (sfd && action == YAHOO_FILE_TRANSFER_ACCEPT) { - yahoo_send_filetransferinfo(yd, sfd); - } else if (!sfd || action == YAHOO_FILE_TRANSFER_REJECT) { - YAHOO_CALLBACK (ext_yahoo_file_transfer_done) - (yd->client_id, YAHOO_FILE_TRANSFER_REJECT, - sfd ? sfd->data : NULL); - - yahoo_remove_active_transfer(sfd); - } - } -} - -#if 0 -void yahoo_send_file(int id, const char *who, const char *msg, - const char *name, unsigned long size, - yahoo_get_fd_callback callback, void *data) -{ - struct yahoo_packet *pkt = NULL; - char size_str[10]; - struct yahoo_input_data *yid; - struct yahoo_data *yd; - struct send_file_data *sfd; - - yid = find_input_by_id_and_type(id, YAHOO_CONNECTION_PAGER); - yd = find_conn_by_id(id); - sfd = y_new0(struct send_file_data, 1); - - sfd->client_id = id; - sfd->id = yahoo_get_random(); - sfd->who = strdup(who); - sfd->filename = strdup(name); - sfd->size = size; - sfd->callback = callback; - sfd->data = data; - - yahoo_add_active_transfer(sfd); - - if (!yd) { - return; - } - - pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER, - YPACKET_STATUS_DEFAULT, yd->session_id); - - snprintf(size_str, sizeof(size_str), "%ld", size); - - yahoo_packet_hash(pkt, 1, yd->user); - yahoo_packet_hash(pkt, 5, who); - yahoo_packet_hash(pkt, 265, sfd->id); - yahoo_packet_hash(pkt, 222, "1"); - yahoo_packet_hash(pkt, 266, "1"); - yahoo_packet_hash(pkt, 302, "268"); - yahoo_packet_hash(pkt, 300, "268"); - yahoo_packet_hash(pkt, 27, name); - yahoo_packet_hash(pkt, 28, size_str); - yahoo_packet_hash(pkt, 301, "268"); - yahoo_packet_hash(pkt, 303, "268"); - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); -} - -void yahoo_send_file_transfer_response(int client_id, int response, char *id, void *data) -{ - struct yahoo_packet *pkt = NULL; - char resp[2]; - struct yahoo_input_data *yid; - - struct send_file_data *sfd = yahoo_get_active_transfer(id); - - sfd->data = data; - - yid = find_input_by_id_and_type(client_id, YAHOO_CONNECTION_PAGER); - - pkt = yahoo_packet_new(YAHOO_SERVICE_Y7_FILETRANSFER, - YPACKET_STATUS_DEFAULT, yid->yd->session_id); - - snprintf(resp, sizeof(resp), "%d", response); - - yahoo_packet_hash(pkt, 1, yid->yd->user); - yahoo_packet_hash(pkt, 5, sfd->who); - yahoo_packet_hash(pkt, 265, sfd->id); - yahoo_packet_hash(pkt, 222, resp); - - yahoo_send_packet(yid, pkt, 0); - - yahoo_packet_free(pkt); - - if (response == YAHOO_FILE_TRANSFER_REJECT) { - yahoo_remove_active_transfer(sfd); - } -} -#endif - -static void yahoo_process_ft_connection(struct yahoo_input_data *yid, int over) -{ - struct send_file_data *sfd; - struct yahoo_data *yd = yid->yd; - - sfd = yahoo_get_active_transfer_with_yid(yid); - - if (!sfd) { - LOG(("Something funny happened. yid %p has no sfd.\n", yid)); - return; - } - - /* - * We want to handle only the complete data with HEAD since we don't - * want a situation where both the GET and HEAD are active. - * With SEND, we really can't do much with partial response - */ - if ((sfd->state == FT_STATE_HEAD || sfd->state == FT_STATE_SEND) - && !over) { - return; - } - - if (sfd->state == FT_STATE_HEAD) { - /* Do a GET */ - char url[256]; - char buff[1024]; - char *sender_enc = NULL, *recv_enc = NULL, *token_enc = NULL; - - struct yahoo_input_data *yid_ft = - y_new0(struct yahoo_input_data, 1); - - yid_ft->yd = yid->yd; - yid_ft->type = YAHOO_CONNECTION_FT; - - inputs = y_list_prepend(inputs, yid_ft); - sfd->yid = yid_ft; - sfd->state = FT_STATE_RECV; - - token_enc = yahoo_urlencode(sfd->token); - sender_enc = yahoo_urlencode(sfd->who); - recv_enc = yahoo_urlencode(yd->user); - - snprintf(url, sizeof(url), - "http://%s/relay?token=%s&sender=%s&recver=%s", sfd->ip_addr, - token_enc, sender_enc, recv_enc); - - snprintf(buff, sizeof(buff), "Y=%s; T=%s", yd->cookie_y, - yd->cookie_t); - - - yahoo_http_get(yd->client_id, url, buff, 1, 1, - _yahoo_http_connected, yid_ft); - - FREE(token_enc); - FREE(sender_enc); - FREE(recv_enc); - } else if (sfd->state == FT_STATE_RECV || - sfd->state == FT_STATE_RECV_START) { - - unsigned char *data_begin = NULL; - - if (yid->rxlen == 0) { - yahoo_remove_active_transfer(sfd); - } - - if (sfd->state != FT_STATE_RECV_START && - (data_begin = - (unsigned char *) strstr((char *) yid->rxqueue, - "\r\n\r\n"))) { - - sfd->state = FT_STATE_RECV_START; - - yid->rxlen -= 4 + (data_begin - yid->rxqueue) / sizeof(char); - data_begin += 4; - - if (yid->rxlen > 0) { - YAHOO_CALLBACK (ext_yahoo_got_ft_data) - (yd->client_id, data_begin, - yid->rxlen, sfd->data); - } - } else if (sfd->state == FT_STATE_RECV_START) { - YAHOO_CALLBACK (ext_yahoo_got_ft_data) (yd->client_id, - yid->rxqueue, yid->rxlen, sfd->data); - } - - FREE(yid->rxqueue); - yid->rxqueue = NULL; - yid->rxlen = 0; - } else if (sfd->state == FT_STATE_SEND) { - /* Sent file completed */ - int len = 0; - char *off = strstr((char *) yid->rxqueue, "Content-Length: "); - - if (off) { - off += 16; - len = atoi(off); - } - - if (len < sfd->size) { - YAHOO_CALLBACK (ext_yahoo_file_transfer_done) - (yd->client_id, - YAHOO_FILE_TRANSFER_FAILED, sfd->data); - } else { - YAHOO_CALLBACK (ext_yahoo_file_transfer_done) - (yd->client_id, - YAHOO_FILE_TRANSFER_DONE, sfd->data); - } - - yahoo_remove_active_transfer(sfd); - } -} - -/* End File Transfer */ - -#if 0 -enum yahoo_status yahoo_current_status(int id) -{ - struct yahoo_data *yd = find_conn_by_id(id); - - if (!yd) { - return YAHOO_STATUS_OFFLINE; - } - return yd->current_status; -} - -const YList *yahoo_get_buddylist(int id) -{ - struct yahoo_data *yd = find_conn_by_id(id); - - if (!yd) { - return NULL; - } - return yd->buddies; -} - -const YList *yahoo_get_ignorelist(int id) -{ - struct yahoo_data *yd = find_conn_by_id(id); - - if (!yd) { - return NULL; - } - return yd->ignore; -} - -const YList *yahoo_get_identities(int id) -{ - struct yahoo_data *yd = find_conn_by_id(id); - - if (!yd) { - return NULL; - } - return yd->identities; -} - -const char *yahoo_get_cookie(int id, const char *which) -{ - struct yahoo_data *yd = find_conn_by_id(id); - - if (!yd) { - return NULL; - } - if (!strncasecmp(which, "y", 1)) { - return yd->cookie_y; - } - if (!strncasecmp(which, "b", 1)) { - return yd->cookie_b; - } - if (!strncasecmp(which, "t", 1)) { - return yd->cookie_t; - } - if (!strncasecmp(which, "c", 1)) { - return yd->cookie_c; - } - if (!strncasecmp(which, "login", 5)) { - return yd->login_cookie; - } - return NULL; -} -#endif - -const char *yahoo_get_profile_url(void) -{ - return profile_url; -} diff --git a/protocols/yahoo/yahoo.c b/protocols/yahoo/yahoo.c deleted file mode 100644 index e7a7e749..00000000 --- a/protocols/yahoo/yahoo.c +++ /dev/null @@ -1,1024 +0,0 @@ -/* - * libyahoo2 wrapper to BitlBee - * - * Mostly Copyright 2004-2012 Wilmer van der Gaast <wilmer@gaast.net> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - - -#include <errno.h> -#include <string.h> -#include <stdlib.h> -#include <stdio.h> -#include <time.h> -#include <sys/stat.h> -#include <ctype.h> -#include "nogaim.h" -#include "yahoo2.h" -#include "yahoo2_callbacks.h" - -#define BYAHOO_DEFAULT_GROUP "Buddies" - -/* A hack to handle removal of buddies not in the group "Buddies" correctly */ -struct byahoo_buddygroups { - char *buddy; - char *group; -}; - -struct byahoo_data { - int y2_id; - int current_status; - gboolean logged_in; - GSList *buddygroups; -}; - -struct byahoo_input_data { - int h; - void *d; -}; - -struct byahoo_conf_invitation { - char *name; - struct groupchat *c; - int yid; - YList *members; - struct im_connection *ic; -}; - -static GSList *byahoo_inputs = NULL; -static int byahoo_chat_id = 0; - -static char *byahoo_strip(const char *in) -{ - int len; - - /* This should get rid of the markup noise at the beginning of the string. */ - while (*in) { - if (g_strncasecmp(in, "<font", 5) == 0 || - g_strncasecmp(in, "<fade", 5) == 0 || - g_strncasecmp(in, "<alt", 4) == 0) { - char *s = strchr(in, '>'); - if (!s) { - break; - } - - in = s + 1; - } else if (strncmp(in, "\e[", 2) == 0) { - const char *s; - - for (s = in + 2; *s && *s != 'm'; s++) { - ; - } - - if (*s != 'm') { - break; - } - - in = s + 1; - } else { - break; - } - } - - /* This is supposed to get rid of the noise at the end of the line. */ - len = strlen(in); - while (len > 0 && (in[len - 1] == '>' || in[len - 1] == 'm')) { - int blen = len; - const char *search; - - if (in[len - 1] == '>') { - search = "</"; - } else { - search = "\e["; - } - - len -= 3; - while (len > 0 && strncmp(in + len, search, 2) != 0) { - len--; - } - - if (len <= 0 && strncmp(in, search, 2) != 0) { - len = blen; - break; - } - } - - return(g_strndup(in, len)); -} - -static void byahoo_init(account_t *acc) -{ - set_t *s; - - s = set_add(&acc->set, "mail_notifications", "false", set_eval_bool, acc); - s->flags |= ACC_SET_OFFLINE_ONLY; - - s = set_add(&acc->set, "mail_notifications_handle", NULL, NULL, acc); - s->flags |= ACC_SET_OFFLINE_ONLY | SET_NULL_OK; - - acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE; -} - -static void byahoo_login(account_t *acc) -{ - struct im_connection *ic = imcb_new(acc); - struct byahoo_data *yd = ic->proto_data = g_new0(struct byahoo_data, 1); - char *s; - - yd->logged_in = FALSE; - yd->current_status = YAHOO_STATUS_AVAILABLE; - - if ((s = strchr(acc->user, '@')) && g_strcasecmp(s, "@yahoo.com") == 0) { - imcb_error(ic, "Your Yahoo! username should just be a username. " - "Do not include any @domain part."); - } - - imcb_log(ic, "Connecting"); - yd->y2_id = yahoo_init(acc->user, acc->pass); - yahoo_login(yd->y2_id, yd->current_status); - - if (set_getbool(&acc->set, "mail_notifications") && set_getstr(&acc->set, "mail_notifications_handle")) { - imcb_add_buddy(ic, set_getstr(&acc->set, "mail_notifications_handle"), NULL); - } -} - -static void byahoo_logout(struct im_connection *ic) -{ - struct byahoo_data *yd = (struct byahoo_data *) ic->proto_data; - GSList *l; - - while (ic->groupchats) { - imcb_chat_free(ic->groupchats->data); - } - - for (l = yd->buddygroups; l; l = l->next) { - struct byahoo_buddygroups *bg = l->data; - - g_free(bg->buddy); - g_free(bg->group); - g_free(bg); - } - g_slist_free(yd->buddygroups); - - yahoo_logoff(yd->y2_id); - - g_free(yd); -} - -static void byahoo_get_info(struct im_connection *ic, char *who) -{ - /* Just make an URL and let the user fetch the info */ - imcb_log(ic, "%s\n%s: %s%s", _("User Info"), - _("For now, fetch yourself"), yahoo_get_profile_url(), - who); -} - -static int byahoo_buddy_msg(struct im_connection *ic, char *who, char *what, int flags) -{ - struct byahoo_data *yd = ic->proto_data; - - yahoo_send_im(yd->y2_id, NULL, who, what, 1, 0); - - return 1; -} - -static int byahoo_send_typing(struct im_connection *ic, char *who, int typing) -{ - struct byahoo_data *yd = ic->proto_data; - - yahoo_send_typing(yd->y2_id, NULL, who, (typing & OPT_TYPING) != 0); - - return 1; -} - -static void byahoo_set_away(struct im_connection *ic, char *state, char *msg) -{ - struct byahoo_data *yd = (struct byahoo_data *) ic->proto_data; - - if (state && msg == NULL) { - /* Use these states only if msg doesn't contain additional - info since away messages are only supported with CUSTOM. */ - if (g_strcasecmp(state, "Be Right Back") == 0) { - yd->current_status = YAHOO_STATUS_BRB; - } else if (g_strcasecmp(state, "Busy") == 0) { - yd->current_status = YAHOO_STATUS_BUSY; - } else if (g_strcasecmp(state, "Not At Home") == 0) { - yd->current_status = YAHOO_STATUS_NOTATHOME; - } else if (g_strcasecmp(state, "Not At Desk") == 0) { - yd->current_status = YAHOO_STATUS_NOTATDESK; - } else if (g_strcasecmp(state, "Not In Office") == 0) { - yd->current_status = YAHOO_STATUS_NOTINOFFICE; - } else if (g_strcasecmp(state, "On Phone") == 0) { - yd->current_status = YAHOO_STATUS_ONPHONE; - } else if (g_strcasecmp(state, "On Vacation") == 0) { - yd->current_status = YAHOO_STATUS_ONVACATION; - } else if (g_strcasecmp(state, "Out To Lunch") == 0) { - yd->current_status = YAHOO_STATUS_OUTTOLUNCH; - } else if (g_strcasecmp(state, "Stepped Out") == 0) { - yd->current_status = YAHOO_STATUS_STEPPEDOUT; - } else if (g_strcasecmp(state, "Invisible") == 0) { - yd->current_status = YAHOO_STATUS_INVISIBLE; - } else { - yd->current_status = YAHOO_STATUS_CUSTOM; - } - } else if (msg) { - yd->current_status = YAHOO_STATUS_CUSTOM; - } else { - yd->current_status = YAHOO_STATUS_AVAILABLE; - } - - yahoo_set_away(yd->y2_id, yd->current_status, msg, state ? 2 : 0); -} - -static GList *byahoo_away_states(struct im_connection *ic) -{ - static GList *m = NULL; - - if (m == NULL) { - m = g_list_append(m, "Be Right Back"); - m = g_list_append(m, "Busy"); - m = g_list_append(m, "Not At Home"); - m = g_list_append(m, "Not At Desk"); - m = g_list_append(m, "Not In Office"); - m = g_list_append(m, "On Phone"); - m = g_list_append(m, "On Vacation"); - m = g_list_append(m, "Out To Lunch"); - m = g_list_append(m, "Stepped Out"); - m = g_list_append(m, "Invisible"); - } - - return m; -} - -static void byahoo_keepalive(struct im_connection *ic) -{ - struct byahoo_data *yd = ic->proto_data; - - yahoo_keepalive(yd->y2_id); -} - -static void byahoo_add_buddy(struct im_connection *ic, char *who, char *group) -{ - struct byahoo_data *yd = (struct byahoo_data *) ic->proto_data; - bee_user_t *bu; - - if (group && (bu = bee_user_by_handle(ic->bee, ic, who)) && bu->group) { - GSList *bgl; - - /* If the person is in our list already, this is a group change. */ - yahoo_change_buddy_group(yd->y2_id, who, bu->group->name, group); - - /* No idea how often people have people in multiple groups and - BitlBee doesn't currently support this anyway .. but keep - this struct up-to-date for now. */ - for (bgl = yd->buddygroups; bgl; bgl = bgl->next) { - struct byahoo_buddygroups *bg = bgl->data; - - if (g_strcasecmp(bg->buddy, who) == 0 && - g_strcasecmp(bg->group, bu->group->name) == 0) { - g_free(bg->group); - bg->group = g_strdup(group); - } - } - } else { - yahoo_add_buddy(yd->y2_id, who, group ? group : BYAHOO_DEFAULT_GROUP, NULL); - } -} - -static void byahoo_remove_buddy(struct im_connection *ic, char *who, char *group) -{ - struct byahoo_data *yd = (struct byahoo_data *) ic->proto_data; - GSList *bgl; - - yahoo_remove_buddy(yd->y2_id, who, BYAHOO_DEFAULT_GROUP); - - for (bgl = yd->buddygroups; bgl; bgl = bgl->next) { - struct byahoo_buddygroups *bg = bgl->data; - - if (g_strcasecmp(bg->buddy, who) == 0) { - yahoo_remove_buddy(yd->y2_id, who, bg->group); - } - } -} - -static void byahoo_chat_msg(struct groupchat *c, char *message, int flags) -{ - struct byahoo_data *yd = (struct byahoo_data *) c->ic->proto_data; - - yahoo_conference_message(yd->y2_id, NULL, c->data, c->title, message, 1); -} - -static void byahoo_chat_invite(struct groupchat *c, char *who, char *msg) -{ - struct byahoo_data *yd = (struct byahoo_data *) c->ic->proto_data; - - yahoo_conference_invite(yd->y2_id, NULL, c->data, c->title, msg ? msg : ""); -} - -static void byahoo_chat_leave(struct groupchat *c) -{ - struct byahoo_data *yd = (struct byahoo_data *) c->ic->proto_data; - - yahoo_conference_logoff(yd->y2_id, NULL, c->data, c->title); - imcb_chat_free(c); -} - -static struct groupchat *byahoo_chat_with(struct im_connection *ic, char *who) -{ - struct byahoo_data *yd = (struct byahoo_data *) ic->proto_data; - struct groupchat *c; - char *roomname; - YList *members; - - roomname = g_strdup_printf("%s-Bee-%d", ic->acc->user, byahoo_chat_id); - - c = imcb_chat_new(ic, roomname); - imcb_chat_add_buddy(c, ic->acc->user); - - /* FIXME: Free this thing when the chat's destroyed. We can't *always* - do this because it's not always created here. */ - c->data = members = g_new0(YList, 1); - members->data = g_strdup(who); - - yahoo_conference_invite(yd->y2_id, NULL, members, roomname, "Please join my groupchat..."); - - g_free(roomname); - - return c; -} - -static void byahoo_auth_allow(struct im_connection *ic, const char *who) -{ - struct byahoo_data *yd = (struct byahoo_data *) ic->proto_data; - - yahoo_confirm_buddy(yd->y2_id, who, 0, ""); -} - -static void byahoo_auth_deny(struct im_connection *ic, const char *who) -{ - struct byahoo_data *yd = (struct byahoo_data *) ic->proto_data; - - yahoo_confirm_buddy(yd->y2_id, who, 1, ""); -} - -void byahoo_initmodule() -{ - struct prpl *ret = g_new0(struct prpl, 1); - - ret->name = "yahoo"; - ret->mms = 832; /* this guess taken from libotr UPGRADING file */ - ret->init = byahoo_init; - - ret->login = byahoo_login; - ret->keepalive = byahoo_keepalive; - ret->logout = byahoo_logout; - - ret->buddy_msg = byahoo_buddy_msg; - ret->get_info = byahoo_get_info; - ret->away_states = byahoo_away_states; - ret->set_away = byahoo_set_away; - ret->add_buddy = byahoo_add_buddy; - ret->remove_buddy = byahoo_remove_buddy; - ret->send_typing = byahoo_send_typing; - - ret->chat_msg = byahoo_chat_msg; - ret->chat_invite = byahoo_chat_invite; - ret->chat_leave = byahoo_chat_leave; - ret->chat_with = byahoo_chat_with; - - ret->handle_cmp = g_strcasecmp; - - ret->auth_allow = byahoo_auth_allow; - ret->auth_deny = byahoo_auth_deny; - - register_protocol(ret); -} - -static struct im_connection *byahoo_get_ic_by_id(int id) -{ - GSList *l; - struct im_connection *ic; - struct byahoo_data *yd; - - for (l = get_connections(); l; l = l->next) { - ic = l->data; - yd = ic->proto_data; - - if (strcmp(ic->acc->prpl->name, "yahoo") == 0 && yd->y2_id == id) { - return(ic); - } - } - - return(NULL); -} - - -/* Now it's callback time! */ - -struct byahoo_connect_callback_data { - int fd; - yahoo_connect_callback callback; - gpointer data; - int id; -}; - -void byahoo_connect_callback(gpointer data, gint source, b_input_condition cond) -{ - struct byahoo_connect_callback_data *d = data; - struct im_connection *ic; - - if (!(ic = byahoo_get_ic_by_id(d->id))) { - g_free(d); - return; - } - - if (source == -1) { - d->callback(NULL, 0, d->data); - imcb_error(ic, "Could not connect to server"); - imc_logout(ic, TRUE); - g_free(d); - return; - } - - d->callback(NULL + d->fd, 0, d->data); - g_free(d); -} - -struct byahoo_read_ready_data { - int id; - int fd; - int tag; - gpointer data; -}; - -gboolean byahoo_read_ready_callback(gpointer data, gint source, b_input_condition cond) -{ - struct byahoo_read_ready_data *d = data; - - if (!byahoo_get_ic_by_id(d->id)) { - /* WTF doesn't libyahoo clean this up? */ - return FALSE; - } - - yahoo_read_ready(d->id, NULL + d->fd, d->data); - - return TRUE; -} - -struct byahoo_write_ready_data { - int id; - int fd; - int tag; - gpointer data; -}; - -gboolean byahoo_write_ready_callback(gpointer data, gint source, b_input_condition cond) -{ - struct byahoo_write_ready_data *d = data; - - return yahoo_write_ready(d->id, NULL + d->fd, d->data); -} - -void ext_yahoo_login_response(int id, int succ, const char *url) -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - struct byahoo_data *yd = NULL; - - if (ic == NULL) { - /* libyahoo2 seems to call this one twice when something - went wrong sometimes. Don't know why. Because we clean - up the connection on the first failure, the second - should be ignored. */ - - return; - } - - yd = (struct byahoo_data *) ic->proto_data; - - if (succ == YAHOO_LOGIN_OK) { - imcb_connected(ic); - - yd->logged_in = TRUE; - } else { - char *errstr; - int allow_reconnect = FALSE; - - yd->logged_in = FALSE; - - if (succ == YAHOO_LOGIN_UNAME) { - errstr = "Incorrect Yahoo! username"; - } else if (succ == YAHOO_LOGIN_PASSWD) { - errstr = "Incorrect Yahoo! password"; - } else if (succ == YAHOO_LOGIN_LOCK) { - errstr = "Yahoo! account locked"; - } else if (succ == 1236) { - errstr = "Yahoo! account locked or machine temporarily banned"; - } else if (succ == YAHOO_LOGIN_DUPL) { - errstr = "Logged in on a different machine or device"; - } else if (succ == YAHOO_LOGIN_SOCK) { - errstr = "Socket problem"; - allow_reconnect = TRUE; - } else { - errstr = "Unknown error"; - } - - if (url && *url) { - imcb_error(ic, "Error %d (%s). See %s for more information.", succ, errstr, url); - } else { - imcb_error(ic, "Error %d (%s)", succ, errstr); - } - - imc_logout(ic, allow_reconnect); - } -} - -void ext_yahoo_got_buddies(int id, YList *buds) -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - struct byahoo_data *yd = ic->proto_data; - YList *bl = buds; - - while (bl) { - struct yahoo_buddy *b = bl->data; - struct byahoo_buddygroups *bg; - - if (strcmp(b->group, BYAHOO_DEFAULT_GROUP) != 0) { - bg = g_new0(struct byahoo_buddygroups, 1); - - bg->buddy = g_strdup(b->id); - bg->group = g_strdup(b->group); - yd->buddygroups = g_slist_append(yd->buddygroups, bg); - } - - imcb_add_buddy(ic, b->id, b->group); - imcb_rename_buddy(ic, b->id, b->real_name); - - bl = bl->next; - } -} - -void ext_yahoo_got_identities(int id, YList *ids) -{ -} - -void ext_yahoo_got_cookies(int id) -{ -} - -void ext_yahoo_status_changed(int id, const char *who, int stat, const char *msg, int away, int idle, int mobile) -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - char *state_string = NULL; - int flags = OPT_LOGGED_IN; - - if (away) { - flags |= OPT_AWAY; - } - if (mobile) { - flags |= OPT_MOBILE; - } - - switch (stat) { - case YAHOO_STATUS_BRB: - state_string = "Be Right Back"; - break; - case YAHOO_STATUS_BUSY: - state_string = "Busy"; - break; - case YAHOO_STATUS_NOTATHOME: - state_string = "Not At Home"; - break; - case YAHOO_STATUS_NOTATDESK: - state_string = "Not At Desk"; - break; - case YAHOO_STATUS_NOTINOFFICE: - state_string = "Not In Office"; - break; - case YAHOO_STATUS_ONPHONE: - state_string = "On Phone"; - break; - case YAHOO_STATUS_ONVACATION: - state_string = "On Vacation"; - break; - case YAHOO_STATUS_OUTTOLUNCH: - state_string = "Out To Lunch"; - break; - case YAHOO_STATUS_STEPPEDOUT: - state_string = "Stepped Out"; - break; - case YAHOO_STATUS_INVISIBLE: - state_string = "Invisible"; - break; - case YAHOO_STATUS_CUSTOM: - state_string = "Away"; - break; - case YAHOO_STATUS_IDLE: - state_string = "Idle"; - break; - case YAHOO_STATUS_OFFLINE: - state_string = "Offline"; - flags = 0; - break; - } - - imcb_buddy_status(ic, who, flags, state_string, msg); - - if (stat == YAHOO_STATUS_IDLE) { - imcb_buddy_times(ic, who, 0, idle); - } -} - -void ext_yahoo_got_buzz(int id, const char *me, const char *who, long tm) -{ -} - -void ext_yahoo_got_im(int id, const char *me, const char *who, const char *msg, long tm, int stat, int utf8) -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - char *m; - - if (msg) { - m = byahoo_strip(msg); - imcb_buddy_msg(ic, (char *) who, (char *) m, 0, 0); - g_free(m); - } -} - -void ext_yahoo_got_file(int id, const char *ignored, const char *who, const char *msg, - const char *fname, unsigned long fesize, char *trid) -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - - imcb_log(ic, "Got a file transfer (file = %s) from %s. Ignoring for now due to lack of support.", fname, who); -} - -void ext_yahoo_got_ft_data(int id, const unsigned char *in, int len, void *data) -{ -} - -void ext_yahoo_file_transfer_done(int id, int result, void *data) -{ -} - -void ext_yahoo_typing_notify(int id, const char *ignored, const char *who, int stat) -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - - if (stat == 1) { - imcb_buddy_typing(ic, (char *) who, OPT_TYPING); - } else { - imcb_buddy_typing(ic, (char *) who, 0); - } -} - -void ext_yahoo_system_message(int id, const char *me, const char *who, const char *msg) -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - - imcb_log(ic, "Yahoo! system message: %s", msg); -} - -void ext_yahoo_webcam_invite(int id, const char *ignored, const char *from) -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - - imcb_log(ic, "Got a webcam invitation from %s. IRC+webcams is a no-no though...", from); -} - -void ext_yahoo_error(int id, const char *err, int fatal, int num) -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - - imcb_error(ic, "%s", err); -} - -/* TODO: Clear up the mess of inp and d structures */ -int ext_yahoo_add_handler(int id, void *fd_, yahoo_input_condition cond, void *data) -{ - struct byahoo_input_data *inp = g_new0(struct byahoo_input_data, 1); - int fd = (long) fd_; - - if (cond == YAHOO_INPUT_READ) { - struct byahoo_read_ready_data *d = g_new0(struct byahoo_read_ready_data, 1); - - d->id = id; - d->fd = fd; - d->data = data; - - inp->d = d; - d->tag = inp->h = b_input_add(fd, B_EV_IO_READ, (b_event_handler) byahoo_read_ready_callback, - (gpointer) d); - } else if (cond == YAHOO_INPUT_WRITE) { - struct byahoo_write_ready_data *d = g_new0(struct byahoo_write_ready_data, 1); - - d->id = id; - d->fd = fd; - d->data = data; - - inp->d = d; - d->tag = inp->h = - b_input_add(fd, B_EV_IO_WRITE, (b_event_handler) byahoo_write_ready_callback, - (gpointer) d); - } else { - g_free(inp); - return -1; - /* Panic... */ - } - - byahoo_inputs = g_slist_append(byahoo_inputs, inp); - return inp->h; -} - -void ext_yahoo_remove_handler(int id, int tag) -{ - struct byahoo_input_data *inp; - GSList *l = byahoo_inputs; - - while (l) { - inp = l->data; - if (inp->h == tag) { - byahoo_inputs = g_slist_remove(byahoo_inputs, inp); - g_free(inp->d); - g_free(inp); - break; - } - l = l->next; - } - - b_event_remove(tag); -} - -int ext_yahoo_connect_async(int id, const char *host, int port, yahoo_connect_callback callback, void *data, - int use_ssl) -{ - struct byahoo_connect_callback_data *d; - int fd; - - d = g_new0(struct byahoo_connect_callback_data, 1); - if ((fd = proxy_connect(host, port, (b_event_handler) byahoo_connect_callback, (gpointer) d)) < 0) { - g_free(d); - return(fd); - } - d->fd = fd; - d->callback = callback; - d->data = data; - d->id = id; - - return fd; -} - -char *ext_yahoo_get_ip_addr(const char *domain) -{ - return NULL; -} - -int ext_yahoo_write(void *fd, char *buf, int len) -{ - return write((long) fd, buf, len); -} - -int ext_yahoo_read(void *fd, char *buf, int len) -{ - return read((long) fd, buf, len); -} - -void ext_yahoo_close(void *fd) -{ - close((long) fd); -} - -void ext_yahoo_got_buddy_change_group(int id, const char *me, const char *who, - const char *old_group, const char *new_group) -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - - imcb_add_buddy(ic, who, new_group); -} - -static void byahoo_accept_conf(void *data) -{ - struct byahoo_conf_invitation *inv = data; - struct groupchat *b = NULL; - GSList *l; - - for (l = inv->ic->groupchats; l; l = l->next) { - b = l->data; - if (b == inv->c) { - break; - } - } - - if (b != NULL) { - yahoo_conference_logon(inv->yid, NULL, inv->members, inv->name); - imcb_chat_add_buddy(inv->c, inv->ic->acc->user); - } else { - imcb_log(inv->ic, "Duplicate/corrupted invitation to `%s'.", inv->name); - } - - g_free(inv->name); - g_free(inv); -} - -static void byahoo_reject_conf(void *data) -{ - struct byahoo_conf_invitation *inv = data; - - yahoo_conference_decline(inv->yid, NULL, inv->members, inv->name, "User rejected groupchat"); - imcb_chat_free(inv->c); - g_free(inv->name); - g_free(inv); -} - -void ext_yahoo_got_conf_invite(int id, const char *ignored, - const char *who, const char *room, const char *msg, YList *members) -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - struct byahoo_conf_invitation *inv; - char txt[1024]; - YList *m; - - if (g_strcasecmp(who, ic->acc->user) == 0) { - /* WTF, Yahoo! seems to echo these now? */ - return; - } - - inv = g_malloc(sizeof(struct byahoo_conf_invitation)); - memset(inv, 0, sizeof(struct byahoo_conf_invitation)); - inv->name = g_strdup(room); - inv->c = imcb_chat_new(ic, (char *) room); - inv->c->data = members; - inv->yid = id; - inv->members = members; - inv->ic = ic; - - for (m = members; m; m = m->next) { - if (g_strcasecmp(m->data, ic->acc->user) != 0) { - imcb_chat_add_buddy(inv->c, m->data); - } - } - - g_snprintf(txt, 1024, "Got an invitation to chatroom %s from %s: %s", room, who, msg); - - imcb_ask(ic, txt, inv, byahoo_accept_conf, byahoo_reject_conf); -} - -void ext_yahoo_conf_userdecline(int id, const char *ignored, const char *who, const char *room, const char *msg) -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - - imcb_log(ic, "Invite to chatroom %s rejected by %s: %s", room, who, msg); -} - -void ext_yahoo_conf_userjoin(int id, const char *ignored, const char *who, const char *room) -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - struct groupchat *c = bee_chat_by_title(ic->bee, ic, room); - - if (c) { - imcb_chat_add_buddy(c, (char *) who); - } -} - -void ext_yahoo_conf_userleave(int id, const char *ignored, const char *who, const char *room) - -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - struct groupchat *c = bee_chat_by_title(ic->bee, ic, room); - - if (c) { - imcb_chat_remove_buddy(c, (char *) who, ""); - } -} - -void ext_yahoo_conf_message(int id, const char *ignored, const char *who, const char *room, const char *msg, int utf8) -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - char *m = byahoo_strip(msg); - struct groupchat *c = bee_chat_by_title(ic->bee, ic, room); - - if (c) { - imcb_chat_msg(c, (char *) who, (char *) m, 0, 0); - } - g_free(m); -} - -void ext_yahoo_chat_cat_xml(int id, const char *xml) -{ -} - -void ext_yahoo_chat_join(int id, const char *who, const char *room, const char *topic, YList *members, void *fd) -{ -} - -void ext_yahoo_chat_userjoin(int id, const char *me, const char *room, struct yahoo_chat_member *who) -{ - free(who->id); - free(who->alias); - free(who->location); - free(who); -} - -void ext_yahoo_chat_userleave(int id, const char *me, const char *room, const char *who) -{ -} - -void ext_yahoo_chat_message(int id, const char *me, const char *who, const char *room, const char *msg, int msgtype, - int utf8) -{ -} - -void ext_yahoo_chat_yahoologout(int id, const char *me) -{ -} - -void ext_yahoo_chat_yahooerror(int id, const char *me) -{ -} - -void ext_yahoo_contact_added(int id, const char *myid, const char *who, const char *msg) -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - - imcb_ask_auth(ic, who, msg); -} - -void ext_yahoo_rejected(int id, const char *who, const char *msg) -{ -} - -void ext_yahoo_game_notify(int id, const char *me, const char *who, int stat, const char *msg) -{ -} - -void ext_yahoo_mail_notify(int id, const char *from, const char *subj, int cnt) -{ - struct im_connection *ic = byahoo_get_ic_by_id(id); - - if (from && subj) { - imcb_notify_email(ic, "Received e-mail message from %s with subject `%s'", from, subj); - } else if (cnt > 0) { - imcb_notify_email(ic, "Received %d new e-mails", cnt); - } -} - -void ext_yahoo_webcam_invite_reply(int id, const char *me, const char *from, int accept) -{ -} - -void ext_yahoo_webcam_closed(int id, const char *who, int reason) -{ -} - -void ext_yahoo_got_search_result(int id, int found, int start, int total, YList *contacts) -{ -} - -void ext_yahoo_webcam_viewer(int id, const char *who, int connect) -{ -} - -void ext_yahoo_webcam_data_request(int id, int send) -{ -} - -int ext_yahoo_log(const char *fmt, ...) -{ - return(0); -} - -void ext_yahoo_got_webcam_image(int id, const char * who, const unsigned char *image, unsigned int image_size, - unsigned int real_size, unsigned int timestamp) -{ -} - -void ext_yahoo_got_ping(int id, const char *msg) -{ -} - -void ext_yahoo_got_buddyicon(int id, const char *me, const char *who, const char *url, int checksum) -{ -} -void ext_yahoo_got_buddyicon_checksum(int id, const char *me, const char *who, int checksum) -{ -} - -void ext_yahoo_got_buddyicon_request(int id, const char *me, const char *who) -{ -} -void ext_yahoo_buddyicon_uploaded(int id, const char *url) -{ -} diff --git a/protocols/yahoo/yahoo2.h b/protocols/yahoo/yahoo2.h deleted file mode 100644 index b9d0e176..00000000 --- a/protocols/yahoo/yahoo2.h +++ /dev/null @@ -1,245 +0,0 @@ -/* - * libyahoo2: yahoo2.h - * - * Copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef YAHOO2_H -#define YAHOO2_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* *** BitlBee: *** */ -#include "bitlbee.h" -#undef free -#define free(x) g_free(x) -#undef malloc -#define malloc(x) g_malloc(x) -#undef realloc -#define realloc(x, y) g_realloc(x, y) -#undef strdup -#define strdup(x) g_strdup(x) -#undef strndup -#define strndup(x, y) g_strndup(x, y) -#undef snprintf -// #define snprintf( x... ) g_snprintf( x ) -#undef strcasecmp -#define strcasecmp(x, y) g_strcasecmp(x, y) -#undef strncasecmp -#define strncasecmp(x, y, z) g_strncasecmp(x, y, z) - - -#include "yahoo2_types.h" - -/* returns the socket descriptor object for a given pager connection. shouldn't be needed */ -void *yahoo_get_fd(int id); - -/* says how much logging to do */ -/* see yahoo2_types.h for the different values */ -int yahoo_set_log_level(enum yahoo_log_level level); -enum yahoo_log_level yahoo_get_log_level(void); - -/* these functions should be self explanatory */ -/* who always means the buddy you're acting on */ -/* id is the successful value returned by yahoo_init */ - -/* init returns a connection id used to identify the connection hereon */ -/* or 0 on failure */ -/* you must call init before calling any other function */ -/* - * The optional parameters to init are key/value pairs that specify - * server settings to use. This list must be NULL terminated - even - * if the list is empty. If a parameter isn't set, a default value - * will be used. Parameter keys are strings, parameter values are - * either strings or ints, depending on the key. Values passed in - * are copied, so you can use const/auto/static/pointers/whatever - * you want. Parameters are: - * NAME TYPE DEFAULT - * pager_host char * scs.msg.yahoo.com - * pager_port int 5050 - * filetransfer_host char * filetransfer.msg.yahoo.com - * filetransfer_port int 80 - * webcam_host char * webcam.yahoo.com - * webcam_port int 5100 - * webcam_description char * "" - * local_host char * "" - * conn_type int Y_WCM_DSL - * - * You should set at least local_host if you intend to use webcams - */ -int yahoo_init_with_attributes(const char *username, - const char *password, ...); - -/* yahoo_init does the same as yahoo_init_with_attributes, assuming defaults - * for all attributes */ -int yahoo_init(const char *username, const char *password); - -/* release all resources held by this session */ -/* you need to call yahoo_close for a session only if - * yahoo_logoff is never called for it (ie, it was never logged in) */ -void yahoo_close(int id); -/* login logs in to the server */ -/* initial is of type enum yahoo_status. see yahoo2_types.h */ -void yahoo_login(int id, int initial); -void yahoo_logoff(int id); -/* reloads status of all buddies */ -void yahoo_refresh(int id); -/* activates/deactivates an identity */ -void yahoo_set_identity_status(int id, const char *identity, - int active); -/* regets the entire buddy list from the server */ -void yahoo_get_list(int id); -/* download buddy contact information from your yahoo addressbook */ -void yahoo_get_yab(int id); -/* add/modify an address book entry. if yab->dbid is set, it will */ -/* modify that entry else it creates a new entry */ -void yahoo_set_yab(int id, struct yab *yab); -void yahoo_keepalive(int id); -void yahoo_chat_keepalive(int id); - -/* from is the identity you're sending from. if NULL, the default is used */ -/* utf8 is whether msg is a utf8 string or not. */ -void yahoo_send_im(int id, const char *from, const char *who, - const char *msg, int utf8, int picture); -// void yahoo_send_buzz(int id, const char *from, const char *who); -/* if type is true, send typing notice, else send stopped typing notice */ -void yahoo_send_typing(int id, const char *from, const char *who, - int typ); - -/* used to set away/back status. */ -/* away says whether the custom message is an away message or a sig */ -void yahoo_set_away(int id, enum yahoo_status state, const char *msg, - int away); - -void yahoo_add_buddy(int id, const char *who, const char *group, - const char *msg); -void yahoo_remove_buddy(int id, const char *who, const char *group); -void yahoo_confirm_buddy(int id, const char *who, int reject, - const char *msg); -void yahoo_stealth_buddy(int id, const char *who, int unstealth); -/* if unignore is true, unignore, else ignore */ -void yahoo_ignore_buddy(int id, const char *who, int unignore); -void yahoo_change_buddy_group(int id, const char *who, - const char *old_group, const char *new_group); -void yahoo_group_rename(int id, const char *old_group, - const char *new_group); - -void yahoo_conference_invite(int id, const char *from, YList *who, - const char *room, const char *msg); -void yahoo_conference_addinvite(int id, const char *from, - const char *who, const char *room, const YList *members, - const char *msg); -void yahoo_conference_decline(int id, const char *from, YList *who, - const char *room, const char *msg); -void yahoo_conference_message(int id, const char *from, YList *who, - const char *room, const char *msg, int utf8); -void yahoo_conference_logon(int id, const char *from, YList *who, - const char *room); -void yahoo_conference_logoff(int id, const char *from, YList *who, - const char *room); - -/* Get a list of chatrooms */ -void yahoo_get_chatrooms(int id, int chatroomid); -/* join room with specified roomname and roomid */ -void yahoo_chat_logon(int id, const char *from, const char *room, - const char *roomid); -/* Send message "msg" to room with specified roomname, msgtype is 1-normal message or 2-/me mesage */ -void yahoo_chat_message(int id, const char *from, const char *room, - const char *msg, const int msgtype, const int utf8); -/* Log off chat */ -void yahoo_chat_logoff(int id, const char *from); - -/* requests a webcam feed */ -/* who is the person who's webcam you would like to view */ -/* if who is null, then you're the broadcaster */ -void yahoo_webcam_get_feed(int id, const char *who); -void yahoo_webcam_close_feed(int id, const char *who); - -/* sends an image when uploading */ -/* image points to a JPEG-2000 image, length is the length of the image */ -/* in bytes. The timestamp is the time in milliseconds since we started the */ -/* webcam. */ -void yahoo_webcam_send_image(int id, unsigned char *image, - unsigned int length, unsigned int timestamp); - -/* this function should be called if we want to allow a user to watch the */ -/* webcam. Who is the user we want to accept. */ -/* Accept user (accept = 1), decline user (accept = 0) */ -void yahoo_webcam_accept_viewer(int id, const char *who, int accept); - -/* send an invitation to a user to view your webcam */ -void yahoo_webcam_invite(int id, const char *who); - -/* will set up a connection and initiate file transfer. - * callback will be called with the fd that you should write - * the file data to - */ -void yahoo_send_file(int id, const char *who, const char *msg, - const char *name, unsigned long size, - yahoo_get_fd_callback callback, void *data); - -/* - * Respond to a file transfer request. Be sure to provide the callback data - * since that is your only chance to recognize future callbacks - */ -void yahoo_send_file_transfer_response(int client_id, int response, - char *id, void *data); - - -/* send a search request - */ -void yahoo_search(int id, enum yahoo_search_type t, const char *text, - enum yahoo_search_gender g, enum yahoo_search_agerange ar, - int photo, int yahoo_only); - -/* continue last search - * should be called if only (start+found >= total) - * - * where the above three are passed to ext_yahoo_got_search_result - */ -void yahoo_search_again(int id, int start); - -/* these should be called when input is available on a fd */ -/* registered by ext_yahoo_add_handler */ -/* if these return negative values, errno may be set */ -int yahoo_read_ready(int id, void *fd, void *data); -int yahoo_write_ready(int id, void *fd, void *data); - -/* utility functions. these do not hit the server */ -enum yahoo_status yahoo_current_status(int id); -const YList *yahoo_get_buddylist(int id); -const YList *yahoo_get_ignorelist(int id); -const YList *yahoo_get_identities(int id); -/* 'which' could be y, t, c or login. This may change in later versions. */ -const char *yahoo_get_cookie(int id, const char *which); - -/* returns the url used to get user profiles - you must append the user id */ -/* as of now this is http://profiles.yahoo.com/ */ -/* You'll have to do urlencoding yourself, but see yahoo_httplib.h first */ -const char *yahoo_get_profile_url(void); - -void yahoo_buddyicon_request(int id, const char *who); - -#include "yahoo_httplib.h" - -#ifdef __cplusplus -} -#endif -#endif diff --git a/protocols/yahoo/yahoo2_callbacks.h b/protocols/yahoo/yahoo2_callbacks.h deleted file mode 100644 index 728040e4..00000000 --- a/protocols/yahoo/yahoo2_callbacks.h +++ /dev/null @@ -1,786 +0,0 @@ -/* - * libyahoo2: yahoo2_callbacks.h - * - * Copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -/* - * The functions in this file *must* be defined in your client program - * If you want to use a callback structure instead of direct functions, - * then you must define USE_STRUCT_CALLBACKS in all files that #include - * this one. - * - * Register the callback structure by calling yahoo_register_callbacks - - * declared in this file and defined in libyahoo2.c - */ - -#ifndef YAHOO2_CALLBACKS_H -#define YAHOO2_CALLBACKS_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "yahoo2_types.h" - -/* - * yahoo2_callbacks.h - * - * Callback interface for libyahoo2 - */ - -typedef enum { - YAHOO_INPUT_READ = 1 << 0, - YAHOO_INPUT_WRITE = 1 << 1, - YAHOO_INPUT_EXCEPTION = 1 << 2 -} yahoo_input_condition; - -/* - * A callback function called when an asynchronous connect completes. - * - * Params: - * fd - The file descriptor object that has been connected, or NULL on - * error - * error - The value of errno set by the call to connect or 0 if no error - * Set both fd and error to 0 if the connect was cancelled by the - * user - * callback_data - the callback_data passed to the ext_yahoo_connect_async - * function - */ -typedef void (*yahoo_connect_callback) (void *fd, int error, - void *callback_data); - -/* - * The following functions need to be implemented in the client - * interface. They will be called by the library when each - * event occurs. - */ - -/* - * should we use a callback structure or directly call functions - * if you want the structure, you *must* define USE_STRUCT_CALLBACKS - * both when you compile the library, and when you compile your code - * that uses the library - */ - -#ifdef USE_STRUCT_CALLBACKS -#define YAHOO_CALLBACK_TYPE(x) (*x) -struct yahoo_callbacks { -#else -#define YAHOO_CALLBACK_TYPE(x) x -#endif - -/* - * Name: ext_yahoo_login_response - * Called when the login process is complete - * Params: - * id - the id that identifies the server connection - * succ - enum yahoo_login_status - * url - url to reactivate account if locked - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_login_response) (int id, int succ, - const char *url); - -/* - * Name: ext_yahoo_got_buddies - * Called when the contact list is got from the server - * Params: - * id - the id that identifies the server connection - * buds - the buddy list - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_got_buddies) (int id, YList *buds); - -/* - * Name: ext_yahoo_got_ignore - * Called when the ignore list is got from the server - * Params: - * id - the id that identifies the server connection - * igns - the ignore list - */ -// void YAHOO_CALLBACK_TYPE(ext_yahoo_got_ignore) (int id, YList *igns); - -/* - * Name: ext_yahoo_got_identities - * Called when the contact list is got from the server - * Params: - * id - the id that identifies the server connection - * ids - the identity list - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_got_identities) (int id, YList *ids); - -/* - * Name: ext_yahoo_got_cookies - * Called when the cookie list is got from the server - * Params: - * id - the id that identifies the server connection - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_got_cookies) (int id); - -/* - * Name: ext_yahoo_got_ping - * Called when the ping packet is received from the server - * Params: - * id - the id that identifies the server connection - * errormsg - optional error message - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_got_ping) (int id, - const char *errormsg); - -/* - * Name: ext_yahoo_status_changed - * Called when remote user's status changes. - * Params: - * id - the id that identifies the server connection - * who - the handle of the remote user - * stat - status code (enum yahoo_status) - * msg - the message if stat == YAHOO_STATUS_CUSTOM - * away - whether the contact is away or not (YAHOO_STATUS_CUSTOM) - * idle - this is the number of seconds he is idle [if he is idle] - * mobile - this is set for mobile users/buddies - * TODO: add support for pager, chat, and game states - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_status_changed) (int id, - const char *who, int stat, const char *msg, int away, - int idle, - int mobile); - -/* - * Name: ext_yahoo_got_buzz - * Called when remote user sends you a buzz. - * Params: - * id - the id that identifies the server connection - * me - the identity the message was sent to - * who - the handle of the remote user - * tm - timestamp of message if offline - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_got_buzz) (int id, const char *me, - const char *who, long tm); - -/* - * Name: ext_yahoo_got_im - * Called when remote user sends you a message. - * Params: - * id - the id that identifies the server connection - * me - the identity the message was sent to - * who - the handle of the remote user - * msg - the message - NULL if stat == 2 - * tm - timestamp of message if offline - * stat - message status - 0 - * 1 - * 2 == error sending message - * 5 - * utf8 - whether the message is encoded as utf8 or not - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_got_im) (int id, const char *me, - const char *who, const char *msg, long tm, int stat, int utf8); - -/* - * Name: ext_yahoo_got_conf_invite - * Called when remote user sends you a conference invitation. - * Params: - * id - the id that identifies the server connection - * me - the identity the invitation was sent to - * who - the user inviting you - * room - the room to join - * msg - the message - * members - the initial members of the conference (null terminated list) - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_got_conf_invite) (int id, - const char *me, const char *who, const char *room, - const char *msg, YList *members); - -/* - * Name: ext_yahoo_conf_userdecline - * Called when someone declines to join the conference. - * Params: - * id - the id that identifies the server connection - * me - the identity in the conference - * who - the user who has declined - * room - the room - * msg - the declining message - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_conf_userdecline) (int id, - const char *me, const char *who, const char *room, - const char *msg); - -/* - * Name: ext_yahoo_conf_userjoin - * Called when someone joins the conference. - * Params: - * id - the id that identifies the server connection - * me - the identity in the conference - * who - the user who has joined - * room - the room joined - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_conf_userjoin) (int id, - const char *me, const char *who, const char *room); - -/* - * Name: ext_yahoo_conf_userleave - * Called when someone leaves the conference. - * Params: - * id - the id that identifies the server connection - * me - the identity in the conference - * who - the user who has left - * room - the room left - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_conf_userleave) (int id, - const char *me, const char *who, const char *room); - -/* - * Name: ext_yahoo_chat_cat_xml - * Called when ? - * Params: - * id - the id that identifies the server connection - * xml - ? - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_cat_xml) (int id, - const char *xml); - -/* - * Name: ext_yahoo_chat_join - * Called when joining the chatroom. - * Params: - * id - the id that identifies the server connection - * me - the identity in the chatroom - * room - the room joined, used in all other chat calls, freed by - * library after call - * topic - the topic of the room, freed by library after call - * members - the initial members of the chatroom (null terminated YList - * of yahoo_chat_member's) Must be freed by the client - * fd - the object where the connection is coming from (for tracking) - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_join) (int id, const char *me, - const char *room, const char *topic, YList *members, void *fd); - -/* - * Name: ext_yahoo_chat_userjoin - * Called when someone joins the chatroom. - * Params: - * id - the id that identifies the server connection - * me - the identity in the chatroom - * room - the room joined - * who - the user who has joined, Must be freed by the client - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_userjoin) (int id, - const char *me, const char *room, - struct yahoo_chat_member *who); - -/* - * Name: ext_yahoo_chat_userleave - * Called when someone leaves the chatroom. - * Params: - * id - the id that identifies the server connection - * me - the identity in the chatroom - * room - the room left - * who - the user who has left (Just the User ID) - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_userleave) (int id, - const char *me, const char *room, const char *who); - -/* - * Name: ext_yahoo_chat_message - * Called when someone messages in the chatroom. - * Params: - * id - the id that identifies the server connection - * me - the identity in the chatroom - * room - the room - * who - the user who messaged (Just the user id) - * msg - the message - * msgtype - 1 = Normal message - * 2 = /me type message - * utf8 - whether the message is utf8 encoded or not - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_message) (int id, - const char *me, const char *who, const char *room, - const char *msg, int msgtype, int utf8); - -/* - * - * Name: ext_yahoo_chat_yahoologout - * called when yahoo disconnects your chat session - * Note this is called whenver a disconnect happens, client or server - * requested. Care should be taken to make sure you know the origin - * of the disconnect request before doing anything here (auto-join's etc) - * Params: - * id - the id that identifies this connection - * me - the identity in the chatroom - * Returns: - * nothing. - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_yahoologout) (int id, - const char *me); - -/* - * - * Name: ext_yahoo_chat_yahooerror - * called when yahoo sends back an error to you - * Note this is called whenver chat message is sent into a room - * in error (fd not connected, room doesn't exists etc) - * Care should be taken to make sure you know the origin - * of the error before doing anything about it. - * Params: - * id - the id that identifies this connection - * me - the identity in the chatroom - * Returns: - * nothing. - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_chat_yahooerror) (int id, - const char *me); - -/* - * Name: ext_yahoo_conf_message - * Called when someone messages in the conference. - * Params: - * id - the id that identifies the server connection - * me - the identity the conf message was sent to - * who - the user who messaged - * room - the room - * msg - the message - * utf8 - whether the message is utf8 encoded or not - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_conf_message) (int id, - const char *me, const char *who, const char *room, - const char *msg, int utf8); - -/* - * Name: ext_yahoo_got_file - * Called when someone sends you a file - * Params: - * id - the id that identifies the server connection - * me - the identity the file was sent to - * who - the user who sent the file - * msg - the message - * fname- the file name if direct transfer - * fsize- the file size if direct transfer - * trid - transfer id. Unique for this transfer - * - * NOTE: Subsequent callbacks for file transfer do not send all of this - * information again since it is wasteful. Implementations are expected to - * save this information and supply it as callback data when the file or - * confirmation is sent - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_got_file) (int id, const char *me, - const char *who, const char *msg, const char *fname, - unsigned long fesize, char *trid); - -/* - * Name: ext_yahoo_got_ft_data - * Called multiple times when parts of the file are received - * Params: - * id - the id that identifies the server connection - * in - The data - * len - Length of the data - * data - callback data - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_got_ft_data) (int id, - const unsigned char *in, int len, void *data); - -/* - * Name: ext_yahoo_file_transfer_done - * File transfer is done - * Params: - * id - the id that identifies the server connection - * result - To notify if it finished successfully or with a failure - * data - callback data - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_file_transfer_done) (int id, - int result, void *data); - -/* - * Name: ext_yahoo_contact_added - * Called when a contact is added to your list - * Params: - * id - the id that identifies the server connection - * myid - the identity he was added to - * who - who was added - * msg - any message sent - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_contact_added) (int id, - const char *myid, const char *who, const char *msg); - -/* - * Name: ext_yahoo_rejected - * Called when a contact rejects your add - * Params: - * id - the id that identifies the server connection - * who - who rejected you - * msg - any message sent - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_rejected) (int id, const char *who, - const char *msg); - -/* - * Name: ext_yahoo_typing_notify - * Called when remote user starts or stops typing. - * Params: - * id - the id that identifies the server connection - * me - the handle of the identity the notification is sent to - * who - the handle of the remote user - * stat - 1 if typing, 0 if stopped typing - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_typing_notify) (int id, - const char *me, const char *who, int stat); - -/* - * Name: ext_yahoo_game_notify - * Called when remote user starts or stops a game. - * Params: - * id - the id that identifies the server connection - * me - the handle of the identity the notification is sent to - * who - the handle of the remote user - * stat - 1 if game, 0 if stopped gaming - * msg - game description and/or other text - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_game_notify) (int id, const char *me, - const char *who, int stat, const char *msg); - -/* - * Name: ext_yahoo_mail_notify - * Called when you receive mail, or with number of messages - * Params: - * id - the id that identifies the server connection - * from - who the mail is from - NULL if only mail count - * subj - the subject of the mail - NULL if only mail count - * cnt - mail count - 0 if new mail notification - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_mail_notify) (int id, - const char *from, const char *subj, int cnt); - -/* - * Name: ext_yahoo_system_message - * System message - * Params: - * id - the id that identifies the server connection - * me - the handle of the identity the notification is sent to - * who - the source of the system message (there are different types) - * msg - the message - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_system_message) (int id, - const char *me, const char *who, const char *msg); - -/* - * Name: ext_yahoo_got_buddyicon - * Buddy icon received - * Params: - * id - the id that identifies the server connection - * me - the handle of the identity the notification is sent to - * who - the person the buddy icon is for - * url - the url to use to load the icon - * checksum - the checksum of the icon content - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_got_buddyicon) (int id, - const char *me, const char *who, const char *url, - int checksum); - -/* - * Name: ext_yahoo_got_buddyicon_checksum - * Buddy icon checksum received - * Params: - * id - the id that identifies the server connection - * me - the handle of the identity the notification is sent to - * who - the yahoo id of the buddy icon checksum is for - * checksum - the checksum of the icon content - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_got_buddyicon_checksum) (int id, - const char *me, const char *who, int checksum); - -/* - * Name: ext_yahoo_got_buddyicon_request - * Buddy icon request received - * Params: - * id - the id that identifies the server connection - * me - the handle of the identity the notification is sent to - * who - the yahoo id of the buddy that requested the buddy icon - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_got_buddyicon_request) (int id, - const char *me, const char *who); - -/* - * Name: ext_yahoo_got_buddyicon_request - * Buddy icon request received - * Params: - * id - the id that identifies the server connection - * url - remote url, the uploaded buddy icon can be fetched from - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_buddyicon_uploaded) (int id, - const char *url); - -/* - * Name: ext_yahoo_got_webcam_image - * Called when you get a webcam update - * An update can either be receiving an image, a part of an image or - * just an update with a timestamp - * Params: - * id - the id that identifies the server connection - * who - the user who's webcam we're viewing - * image - image data - * image_size - length of the image in bytes - * real_size - actual length of image data - * timestamp - milliseconds since the webcam started - * - * If the real_size is smaller then the image_size then only part of - * the image has been read. This function will keep being called till - * the total amount of bytes in image_size has been read. The image - * received is in JPEG-2000 Code Stream Syntax (ISO/IEC 15444-1). - * The size of the image will be either 160x120 or 320x240. - * Each webcam image contains a timestamp. This timestamp should be - * used to keep the image in sync since some images can take longer - * to transport then others. When image_size is 0 we can still receive - * a timestamp to stay in sync - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_got_webcam_image) (int id, - const char *who, const unsigned char *image, - unsigned int image_size, unsigned int real_size, - unsigned int timestamp); - -/* - * Name: ext_yahoo_webcam_invite - * Called when you get a webcam invitation - * Params: - * id - the id that identifies the server connection - * me - identity the invitation is to - * from - who the invitation is from - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_webcam_invite) (int id, - const char *me, const char *from); - -/* - * Name: ext_yahoo_webcam_invite_reply - * Called when you get a response to a webcam invitation - * Params: - * id - the id that identifies the server connection - * me - identity the invitation response is to - * from - who the invitation response is from - * accept - 0 (decline), 1 (accept) - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_webcam_invite_reply) (int id, - const char *me, const char *from, int accept); - -/* - * Name: ext_yahoo_webcam_closed - * Called when the webcam connection closed - * Params: - * id - the id that identifies the server connection - * who - the user who we where connected to - * reason - reason why the connection closed - * 1 = user stopped broadcasting - * 2 = user cancelled viewing permission - * 3 = user declines permission - * 4 = user does not have webcam online - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_webcam_closed) (int id, - const char *who, int reason); - -/* - * Name: ext_yahoo_got_search_result - * Called when the search result received from server - * Params: - * id - the id that identifies the server connection - * found - total number of results returned in the current result set - * start - offset from where the current result set starts - * total - total number of results available (start + found <= total) - * contacts - the list of results as a YList of yahoo_found_contact - * these will be freed after this function returns, so - * if you need to use the information, make a copy - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_got_search_result) (int id, - int found, int start, int total, YList *contacts); - -/* - * Name: ext_yahoo_error - * Called on error. - * Params: - * id - the id that identifies the server connection - * err - the error message - * fatal- whether this error is fatal to the connection or not - * num - Which error is this - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_error) (int id, const char *err, - int fatal, int num); - -/* - * Name: ext_yahoo_webcam_viewer - * Called when a viewer disconnects/connects/requests to connect - * Params: - * id - the id that identifies the server connection - * who - the viewer - * connect - 0=disconnect 1=connect 2=request - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_webcam_viewer) (int id, - const char *who, int connect); - -/* - * Name: ext_yahoo_webcam_data_request - * Called when you get a request for webcam images - * Params: - * id - the id that identifies the server connection - * send - whether to send images or not - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_webcam_data_request) (int id, - int send); - -/* - * Name: ext_yahoo_log - * Called to log a message. - * Params: - * fmt - the printf formatted message - * Returns: - * 0 - */ - int YAHOO_CALLBACK_TYPE(ext_yahoo_log) (const char *fmt, ...); - -/* - * Name: ext_yahoo_add_handler - * Add a listener for the fd. Must call yahoo_read_ready - * when a YAHOO_INPUT_READ fd is ready and yahoo_write_ready - * when a YAHOO_INPUT_WRITE fd is ready. - * Params: - * id - the id that identifies the server connection - * fd - the fd object on which to listen - * cond - the condition on which to call the callback - * data - callback data to pass to yahoo_*_ready - * - * Returns: a tag to be used when removing the handler - */ - int YAHOO_CALLBACK_TYPE(ext_yahoo_add_handler) (int id, void *fd, - yahoo_input_condition cond, void *data); - -/* - * Name: ext_yahoo_remove_handler - * Remove the listener for the fd. - * Params: - * id - the id that identifies the connection - * tag - the handler tag to remove - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_remove_handler) (int id, int tag); - -/* - * Name: ext_yahoo_connect - * Connect to a host:port - * Params: - * host - the host to connect to - * port - the port to connect on - * Returns: - * a unix file descriptor to the socket - */ -// int YAHOO_CALLBACK_TYPE(ext_yahoo_connect) (const char *host, int port); - -/* - * Name: ext_yahoo_connect_async - * Connect to a host:port asynchronously. This function should return - * immediately returning a tag used to identify the connection handler, - * or a pre-connect error (eg: host name lookup failure). - * Once the connect completes (successfully or unsuccessfully), callback - * should be called (see the signature for yahoo_connect_callback). - * The callback may safely be called before this function returns, but - * it should not be called twice. - * Params: - * id - the id that identifies this connection - * host - the host to connect to - * port - the port to connect on - * callback - function to call when connect completes - * callback_data - data to pass to the callback function - * use_ssl - Whether we need an SSL connection - * Returns: - * a tag signifying the connection attempt - */ - int YAHOO_CALLBACK_TYPE(ext_yahoo_connect_async) (int id, - const char *host, int port, yahoo_connect_callback callback, - void *callback_data, int use_ssl); - -/* - * Name: ext_yahoo_get_ip_addr - * get IP Address for a domain name - * Params: - * domain - Domain name - * Returns: - * Newly allocated string containing the IP Address in IPv4 notation - */ - char *YAHOO_CALLBACK_TYPE(ext_yahoo_get_ip_addr) (const char *domain); - -/* - * Name: ext_yahoo_write - * Write data from the buffer into the socket for the specified connection - * Params: - * fd - the file descriptor object that identifies this connection - * buf - Buffer to write the data from - * len - Length of the data - * Returns: - * Number of bytes written or -1 for error - */ - int YAHOO_CALLBACK_TYPE(ext_yahoo_write) (void *fd, char *buf, int len); - -/* - * Name: ext_yahoo_read - * Read data into a buffer from socket for the specified connection - * Params: - * fd - the file descriptor object that identifies this connection - * buf - Buffer to read the data into - * len - Max length to read - * Returns: - * Number of bytes read or -1 for error - */ - int YAHOO_CALLBACK_TYPE(ext_yahoo_read) (void *fd, char *buf, int len); - -/* - * Name: ext_yahoo_close - * Close the file descriptor object and free its resources. Libyahoo2 will not - * use this object again. - * Params: - * fd - the file descriptor object that identifies this connection - * Returns: - * Nothing - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_close) (void *fd); - -/* - * Name: ext_yahoo_got_buddy_change_group - * Acknowledgement of buddy changing group - * Params: - * id: client id - * me: The user - * who: Buddy name - * old_group: Old group name - * new_group: New group name - * Returns: - * Nothing - */ - void YAHOO_CALLBACK_TYPE(ext_yahoo_got_buddy_change_group) (int id, - const char *me, const char *who, - const char *old_group, - const char *new_group); - -#ifdef USE_STRUCT_CALLBACKS -}; - -/* - * if using a callback structure, call yahoo_register_callbacks - * before doing anything else - */ -void yahoo_register_callbacks(struct yahoo_callbacks *tyc); - -#undef YAHOO_CALLBACK_TYPE - -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/protocols/yahoo/yahoo2_types.h b/protocols/yahoo/yahoo2_types.h deleted file mode 100644 index 551670d6..00000000 --- a/protocols/yahoo/yahoo2_types.h +++ /dev/null @@ -1,396 +0,0 @@ -/* - * libyahoo2: yahoo2_types.h - * - * Copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef YAHOO2_TYPES_H -#define YAHOO2_TYPES_H - -#include "yahoo_list.h" - -#ifdef __cplusplus -extern "C" { -#endif - -enum yahoo_service { /* these are easier to see in hex */ - YAHOO_SERVICE_LOGON = 1, - YAHOO_SERVICE_LOGOFF, - YAHOO_SERVICE_ISAWAY, - YAHOO_SERVICE_ISBACK, - YAHOO_SERVICE_IDLE, /* 5 (placemarker) */ - YAHOO_SERVICE_MESSAGE, - YAHOO_SERVICE_IDACT, - YAHOO_SERVICE_IDDEACT, - YAHOO_SERVICE_MAILSTAT, - YAHOO_SERVICE_USERSTAT, /* 0xa */ - YAHOO_SERVICE_NEWMAIL, - YAHOO_SERVICE_CHATINVITE, - YAHOO_SERVICE_CALENDAR, - YAHOO_SERVICE_NEWPERSONALMAIL, - YAHOO_SERVICE_NEWCONTACT, - YAHOO_SERVICE_ADDIDENT, /* 0x10 */ - YAHOO_SERVICE_ADDIGNORE, - YAHOO_SERVICE_PING, - YAHOO_SERVICE_GOTGROUPRENAME, /* < 1, 36(old), 37(new) */ - YAHOO_SERVICE_SYSMESSAGE = 0x14, - YAHOO_SERVICE_SKINNAME = 0x15, - YAHOO_SERVICE_PASSTHROUGH2 = 0x16, - YAHOO_SERVICE_CONFINVITE = 0x18, - YAHOO_SERVICE_CONFLOGON, - YAHOO_SERVICE_CONFDECLINE, - YAHOO_SERVICE_CONFLOGOFF, - YAHOO_SERVICE_CONFADDINVITE, - YAHOO_SERVICE_CONFMSG, - YAHOO_SERVICE_CHATLOGON, - YAHOO_SERVICE_CHATLOGOFF, - YAHOO_SERVICE_CHATMSG = 0x20, - YAHOO_SERVICE_GAMELOGON = 0x28, - YAHOO_SERVICE_GAMELOGOFF, - YAHOO_SERVICE_GAMEMSG = 0x2a, - YAHOO_SERVICE_FILETRANSFER = 0x46, - YAHOO_SERVICE_VOICECHAT = 0x4A, - YAHOO_SERVICE_NOTIFY, - YAHOO_SERVICE_VERIFY, - YAHOO_SERVICE_P2PFILEXFER, - YAHOO_SERVICE_PEERTOPEER = 0x4F, /* Checks if P2P possible */ - YAHOO_SERVICE_WEBCAM, - YAHOO_SERVICE_AUTHRESP = 0x54, - YAHOO_SERVICE_LIST, - YAHOO_SERVICE_AUTH = 0x57, - YAHOO_SERVICE_AUTHBUDDY = 0x6d, - YAHOO_SERVICE_ADDBUDDY = 0x83, - YAHOO_SERVICE_REMBUDDY, - YAHOO_SERVICE_IGNORECONTACT, /* > 1, 7, 13 < 1, 66, 13, 0 */ - YAHOO_SERVICE_REJECTCONTACT, - YAHOO_SERVICE_GROUPRENAME = 0x89, /* > 1, 65(new), 66(0), 67(old) */ - YAHOO_SERVICE_Y7_PING = 0x8A, - YAHOO_SERVICE_CHATONLINE = 0x96, /* > 109(id), 1, 6(abcde) < 0,1 */ - YAHOO_SERVICE_CHATGOTO, - YAHOO_SERVICE_CHATJOIN, /* > 1 104-room 129-1600326591 62-2 */ - YAHOO_SERVICE_CHATLEAVE, - YAHOO_SERVICE_CHATEXIT = 0x9b, - YAHOO_SERVICE_CHATADDINVITE = 0x9d, - YAHOO_SERVICE_CHATLOGOUT = 0xa0, - YAHOO_SERVICE_CHATPING, - YAHOO_SERVICE_COMMENT = 0xa8, - YAHOO_SERVICE_GAME_INVITE = 0xb7, - YAHOO_SERVICE_STEALTH_PERM = 0xb9, - YAHOO_SERVICE_STEALTH_SESSION = 0xba, - YAHOO_SERVICE_AVATAR = 0xbc, - YAHOO_SERVICE_PICTURE_CHECKSUM = 0xbd, - YAHOO_SERVICE_PICTURE = 0xbe, - YAHOO_SERVICE_PICTURE_UPDATE = 0xc1, - YAHOO_SERVICE_PICTURE_UPLOAD = 0xc2, - YAHOO_SERVICE_YAB_UPDATE = 0xc4, - YAHOO_SERVICE_Y6_VISIBLE_TOGGLE = 0xc5, /* YMSG13, key 13: 2 = invisible, 1 = visible */ - YAHOO_SERVICE_Y6_STATUS_UPDATE = 0xc6, /* YMSG13 */ - YAHOO_SERVICE_PICTURE_STATUS = 0xc7, /* YMSG13, key 213: 0 = none, 1 = avatar, 2 = picture */ - YAHOO_SERVICE_VERIFY_ID_EXISTS = 0xc8, - YAHOO_SERVICE_AUDIBLE = 0xd0, - YAHOO_SERVICE_Y7_PHOTO_SHARING = 0xd2, - YAHOO_SERVICE_Y7_CONTACT_DETAILS = 0xd3, /* YMSG13 */ - YAHOO_SERVICE_Y7_CHAT_SESSION = 0xd4, - YAHOO_SERVICE_Y7_AUTHORIZATION = 0xd6, /* YMSG13 */ - YAHOO_SERVICE_Y7_FILETRANSFER = 0xdc, /* YMSG13 */ - YAHOO_SERVICE_Y7_FILETRANSFERINFO, /* YMSG13 */ - YAHOO_SERVICE_Y7_FILETRANSFERACCEPT, /* YMSG13 */ - YAHOO_SERVICE_Y7_MINGLE = 0xe1, /* YMSG13 */ - YAHOO_SERVICE_Y7_CHANGE_GROUP = 0xe7, /* YMSG13 */ - YAHOO_SERVICE_MYSTERY = 0xef, /* Don't know what this is for */ - YAHOO_SERVICE_Y8_STATUS = 0xf0, /* YMSG15 */ - YAHOO_SERVICE_Y8_LIST = 0Xf1, /* YMSG15 */ - YAHOO_SERVICE_MESSAGE_CONFIRM = 0xfb, - YAHOO_SERVICE_WEBLOGIN = 0x0226, - YAHOO_SERVICE_SMS_MSG = 0x02ea -}; - -enum yahoo_status { - YAHOO_STATUS_AVAILABLE = 0, - YAHOO_STATUS_BRB, - YAHOO_STATUS_BUSY, - YAHOO_STATUS_NOTATHOME, - YAHOO_STATUS_NOTATDESK, - YAHOO_STATUS_NOTINOFFICE, - YAHOO_STATUS_ONPHONE, - YAHOO_STATUS_ONVACATION, - YAHOO_STATUS_OUTTOLUNCH, - YAHOO_STATUS_STEPPEDOUT, - YAHOO_STATUS_INVISIBLE = 12, - YAHOO_STATUS_CUSTOM = 99, - YAHOO_STATUS_IDLE = 999, - YAHOO_STATUS_OFFLINE = 0x5a55aa56 /* don't ask */ -}; - -enum ypacket_status { - YPACKET_STATUS_DISCONNECTED = -1, - YPACKET_STATUS_DEFAULT = 0, - YPACKET_STATUS_SERVERACK = 1, - YPACKET_STATUS_GAME = 0x2, - YPACKET_STATUS_AWAY = 0x4, - YPACKET_STATUS_CONTINUED = 0x5, - YPACKET_STATUS_INVISIBLE = 12, - YPACKET_STATUS_NOTIFY = 0x16, /* TYPING */ - YPACKET_STATUS_WEBLOGIN = 0x5a55aa55, - YPACKET_STATUS_OFFLINE = 0x5a55aa56 -}; - -#define YAHOO_STATUS_GAME 0x2 /* Games don't fit into the regular status model */ - -enum yahoo_login_status { - YAHOO_LOGIN_OK = 0, - YAHOO_LOGIN_LOGOFF = 1, - YAHOO_LOGIN_UNAME = 3, - YAHOO_LOGIN_PASSWD = 13, - YAHOO_LOGIN_LOCK = 14, - YAHOO_LOGIN_DUPL = 99, - YAHOO_LOGIN_SOCK = -1, - YAHOO_LOGIN_UNKNOWN = 999 -}; - -enum yahoo_error { - E_UNKNOWN = -1, - E_CONNECTION = -2, - E_SYSTEM = -3, - E_CUSTOM = 0, - - /* responses from ignore buddy */ - E_IGNOREDUP = 2, - E_IGNORENONE = 3, - E_IGNORECONF = 12, - - /* conference */ - E_CONFNOTAVAIL = 20 -}; - -enum yahoo_log_level { - YAHOO_LOG_NONE = 0, - YAHOO_LOG_FATAL, - YAHOO_LOG_ERR, - YAHOO_LOG_WARNING, - YAHOO_LOG_NOTICE, - YAHOO_LOG_INFO, - YAHOO_LOG_DEBUG -}; - -enum yahoo_file_transfer { - YAHOO_FILE_TRANSFER_INIT = 1, - YAHOO_FILE_TRANSFER_ACCEPT = 3, - YAHOO_FILE_TRANSFER_REJECT = 4, - YAHOO_FILE_TRANSFER_DONE = 5, - YAHOO_FILE_TRANSFER_RELAY, - YAHOO_FILE_TRANSFER_FAILED, - YAHOO_FILE_TRANSFER_UNKNOWN -}; - -#define YAHOO_PROTO_VER 0x0010 - -/* Yahoo style/color directives */ -#define YAHOO_COLOR_BLACK "\033[30m" -#define YAHOO_COLOR_BLUE "\033[31m" -#define YAHOO_COLOR_LIGHTBLUE "\033[32m" -#define YAHOO_COLOR_GRAY "\033[33m" -#define YAHOO_COLOR_GREEN "\033[34m" -#define YAHOO_COLOR_PINK "\033[35m" -#define YAHOO_COLOR_PURPLE "\033[36m" -#define YAHOO_COLOR_ORANGE "\033[37m" -#define YAHOO_COLOR_RED "\033[38m" -#define YAHOO_COLOR_OLIVE "\033[39m" -#define YAHOO_COLOR_ANY "\033[#" -#define YAHOO_STYLE_ITALICON "\033[2m" -#define YAHOO_STYLE_ITALICOFF "\033[x2m" -#define YAHOO_STYLE_BOLDON "\033[1m" -#define YAHOO_STYLE_BOLDOFF "\033[x1m" -#define YAHOO_STYLE_UNDERLINEON "\033[4m" -#define YAHOO_STYLE_UNDERLINEOFF "\033[x4m" -#define YAHOO_STYLE_URLON "\033[lm" -#define YAHOO_STYLE_URLOFF "\033[xlm" - -enum yahoo_connection_type { - YAHOO_CONNECTION_PAGER = 0, - YAHOO_CONNECTION_FT, - YAHOO_CONNECTION_YAB, - YAHOO_CONNECTION_WEBCAM_MASTER, - YAHOO_CONNECTION_WEBCAM, - YAHOO_CONNECTION_CHATCAT, - YAHOO_CONNECTION_SEARCH, - YAHOO_CONNECTION_AUTH -}; - -enum yahoo_webcam_direction_type { - YAHOO_WEBCAM_DOWNLOAD = 0, - YAHOO_WEBCAM_UPLOAD -}; - -enum yahoo_stealth_visibility_type { - YAHOO_STEALTH_DEFAULT = 0, - YAHOO_STEALTH_ONLINE, - YAHOO_STEALTH_PERM_OFFLINE -}; - -/* chat member attribs */ -#define YAHOO_CHAT_MALE 0x8000 -#define YAHOO_CHAT_FEMALE 0x10000 -#define YAHOO_CHAT_FEMALE 0x10000 -#define YAHOO_CHAT_DUNNO 0x400 -#define YAHOO_CHAT_WEBCAM 0x10 - -enum yahoo_webcam_conn_type { Y_WCM_DIALUP, Y_WCM_DSL, Y_WCM_T1 }; - -struct yahoo_webcam { - int direction; /* Uploading or downloading */ - int conn_type; /* 0=Dialup, 1=DSL/Cable, 2=T1/Lan */ - - char *user; /* user we are viewing */ - char *server; /* webcam server to connect to */ - int port; /* webcam port to connect on */ - char *key; /* key to connect to the server with */ - char *description; /* webcam description */ - char *my_ip; /* own ip number */ -}; - -struct yahoo_webcam_data { - unsigned int data_size; - unsigned int to_read; - unsigned int timestamp; - unsigned char packet_type; -}; - -struct yahoo_data { - char *user; - char *password; - - char *cookie_y; - char *cookie_t; - char *cookie_c; - char *cookie_b; - char *login_cookie; - char *crumb; - char *seed; - - YList *buddies; - YList *ignore; - YList *identities; - char *login_id; - - int current_status; - int initial_status; - int logged_in; - - int session_id; - - int client_id; - - char *rawbuddylist; - char *ignorelist; - - void *server_settings; - - struct yahoo_process_status_entry *half_user; -}; - -struct yab { - int yid; - char *id; - char *fname; - char *lname; - char *nname; - char *email; - char *hphone; - char *wphone; - char *mphone; - int dbid; -}; - -struct yahoo_buddy { - char *group; - char *id; - char *real_name; - struct yab *yab_entry; -}; - -enum yahoo_search_type { - YAHOO_SEARCH_KEYWORD = 0, - YAHOO_SEARCH_YID, - YAHOO_SEARCH_NAME -}; - -enum yahoo_search_gender { - YAHOO_GENDER_NONE = 0, - YAHOO_GENDER_MALE, - YAHOO_GENDER_FEMALE -}; - -enum yahoo_search_agerange { - YAHOO_AGERANGE_NONE = 0 -}; - -struct yahoo_found_contact { - char *id; - char *gender; - char *location; - int age; - int online; -}; - -/* - * Function pointer to be passed to http get/post and send file - */ -typedef void (*yahoo_get_fd_callback) (int id, void *fd, int error, - void *data); - -/* - * Function pointer to be passed to yahoo_get_url_handle - */ -typedef void (*yahoo_get_url_handle_callback) (int id, void *fd, - int error, const char *filename, unsigned long size, - void *data); - -struct yahoo_chat_member { - char *id; - int age; - int attribs; - char *alias; - char *location; -}; - -struct yahoo_process_status_entry { - char *name; /* 7 name */ - int state; /* 10 state */ - int flags; /* 13 flags, bit 0 = pager, bit 1 = chat, bit 2 = game */ - int mobile; /* 60 mobile */ - char *msg; /* 19 custom status message */ - int away; /* 47 away (or invisible) */ - int buddy_session; /* 11 state */ - int f17; /* 17 in chat? then what about flags? */ - int idle; /* 137 seconds idle */ - int f138; /* 138 state */ - char *f184; /* 184 state */ - int f192; /* 192 state */ - int f10001; /* 10001 state */ - int f10002; /* 10002 state */ - int f198; /* 198 state */ - char *f197; /* 197 state */ - char *f205; /* 205 state */ - int f213; /* 213 state */ -}; - -#ifdef __cplusplus -} -#endif -#endif diff --git a/protocols/yahoo/yahoo_debug.h b/protocols/yahoo/yahoo_debug.h deleted file mode 100644 index ddcd91c5..00000000 --- a/protocols/yahoo/yahoo_debug.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * libyahoo2: yahoo_debug.h - * - * Copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -extern int yahoo_log_message(char *fmt, ...); - -#define NOTICE(x) if (yahoo_get_log_level() >= YAHOO_LOG_NOTICE) { yahoo_log_message x; yahoo_log_message("\n"); } - -#define LOG(x) if (yahoo_get_log_level() >= YAHOO_LOG_INFO) { yahoo_log_message("%s:%d: ", __FILE__, __LINE__); \ - yahoo_log_message x; \ - yahoo_log_message("\n"); } - -#define WARNING(x) if (yahoo_get_log_level() >= YAHOO_LOG_WARNING) { yahoo_log_message("%s:%d: warning: ", __FILE__, \ - __LINE__); \ - yahoo_log_message x; \ - yahoo_log_message("\n"); } - -#define DEBUG_MSG(x) if (yahoo_get_log_level() >= YAHOO_LOG_DEBUG) { yahoo_log_message("%s:%d: debug: ", __FILE__, \ - __LINE__); \ - yahoo_log_message x; \ - yahoo_log_message("\n"); } - - diff --git a/protocols/yahoo/yahoo_httplib.c b/protocols/yahoo/yahoo_httplib.c deleted file mode 100644 index 968a2696..00000000 --- a/protocols/yahoo/yahoo_httplib.c +++ /dev/null @@ -1,431 +0,0 @@ -/* - * libyahoo2: yahoo_httplib.c - * - * Copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include <stdio.h> -#include <stdlib.h> - -#if STDC_HEADERS -# include <string.h> -#else -# if !HAVE_STRCHR -# define strchr index -# define strrchr rindex -# endif -char *strchr(), *strrchr(); -# if !HAVE_MEMCPY -# define memcpy(d, s, n) bcopy((s), (d), (n)) -# define memmove(d, s, n) bcopy((s), (d), (n)) -# endif -#endif - -#include <errno.h> -#include <unistd.h> -#include <ctype.h> -#include "yahoo2.h" -#include "yahoo2_callbacks.h" -#include "yahoo_httplib.h" -#include "yahoo_util.h" - -#include "yahoo_debug.h" -#ifdef __MINGW32__ -# include <winsock2.h> -# define snprintf _snprintf -#endif - -#ifdef USE_STRUCT_CALLBACKS -extern struct yahoo_callbacks *yc; -#define YAHOO_CALLBACK(x) yc->x -#else -#define YAHOO_CALLBACK(x) x -#endif - -extern enum yahoo_log_level log_level; - -#if 0 -int yahoo_tcp_readline(char *ptr, int maxlen, void *fd) -{ - int n, rc; - char c; - - for (n = 1; n < maxlen; n++) { - - do { - rc = YAHOO_CALLBACK (ext_yahoo_read) (fd, &c, 1); - } while (rc == -1 && (errno == EINTR || errno == EAGAIN)); /* this is bad - it should be done asynchronously */ - - if (rc == 1) { - if (c == '\r') { /* get rid of \r */ - continue; - } - *ptr = c; - if (c == '\n') { - break; - } - ptr++; - } else if (rc == 0) { - if (n == 1) { - return (0); /* EOF, no data */ - } else { - break; /* EOF, w/ data */ - } - } else { - return -1; - } - } - - *ptr = 0; - return (n); -} -#endif - -static int url_to_host_port_path(const char *url, - char *host, int *port, char *path, int *ssl) -{ - char *urlcopy = NULL; - char *slash = NULL; - char *colon = NULL; - - /* - * http://hostname - * http://hostname/ - * http://hostname/path - * http://hostname/path:foo - * http://hostname:port - * http://hostname:port/ - * http://hostname:port/path - * http://hostname:port/path:foo - * and https:// variants of the above - */ - - if (strstr(url, "http://") == url) { - urlcopy = strdup(url + 7); - } else if (strstr(url, "https://") == url) { - urlcopy = strdup(url + 8); - *ssl = 1; - } else { - WARNING(("Weird url - unknown protocol: %s", url)); - return 0; - } - - slash = strchr(urlcopy, '/'); - colon = strchr(urlcopy, ':'); - - if (!colon || (slash && slash < colon)) { - if (*ssl) { - *port = 443; - } else { - *port = 80; - } - } else { - *colon = 0; - *port = atoi(colon + 1); - } - - if (!slash) { - strcpy(path, "/"); - } else { - strcpy(path, slash); - *slash = 0; - } - - strcpy(host, urlcopy); - - FREE(urlcopy); - - return 1; -} - -static int isurlchar(unsigned char c) -{ - return (g_ascii_isalnum(c)); -} - -char *yahoo_urlencode(const char *instr) -{ - int ipos = 0, bpos = 0; - char *str = NULL; - int len = strlen(instr); - - if (!(str = y_new(char, 3 * len + 1))) { - return ""; - } - - while (instr[ipos]) { - while (isurlchar(instr[ipos])) { - str[bpos++] = instr[ipos++]; - } - if (!instr[ipos]) { - break; - } - - snprintf(&str[bpos], 4, "%%%02x", instr[ipos] & 0xff); - bpos += 3; - ipos++; - } - str[bpos] = '\0'; - - /* free extra alloc'ed mem. */ - len = strlen(str); - str = y_renew(char, str, len + 1); - - return (str); -} - -#if 0 -char *yahoo_urldecode(const char *instr) -{ - int ipos = 0, bpos = 0; - char *str = NULL; - char entity[3] = { 0, 0, 0 }; - unsigned dec; - int len = strlen(instr); - - if (!(str = y_new(char, len + 1))) { - return ""; - } - - while (instr[ipos]) { - while (instr[ipos] && instr[ipos] != '%') { - if (instr[ipos] == '+') { - str[bpos++] = ' '; - ipos++; - } else { - str[bpos++] = instr[ipos++]; - } - } - if (!instr[ipos]) { - break; - } - - if (instr[ipos + 1] && instr[ipos + 2]) { - ipos++; - entity[0] = instr[ipos++]; - entity[1] = instr[ipos++]; - sscanf(entity, "%2x", &dec); - str[bpos++] = (char) dec; - } else { - str[bpos++] = instr[ipos++]; - } - } - str[bpos] = '\0'; - - /* free extra alloc'ed mem. */ - len = strlen(str); - str = y_renew(char, str, len + 1); - - return (str); -} - -char *yahoo_xmldecode(const char *instr) -{ - int ipos = 0, bpos = 0, epos = 0; - char *str = NULL; - char entity[4] = { 0, 0, 0, 0 }; - char *entitymap[5][2] = { - { "amp;", "&" }, - { "quot;", "\"" }, - { "lt;", "<" }, - { "gt;", "<" }, - { "nbsp;", " " } - }; - unsigned dec; - int len = strlen(instr); - - if (!(str = y_new(char, len + 1))) { - return ""; - } - - while (instr[ipos]) { - while (instr[ipos] && instr[ipos] != '&') { - if (instr[ipos] == '+') { - str[bpos++] = ' '; - ipos++; - } else { - str[bpos++] = instr[ipos++]; - } - } - if (!instr[ipos] || !instr[ipos + 1]) { - break; - } - ipos++; - - if (instr[ipos] == '#') { - ipos++; - epos = 0; - while (instr[ipos] != ';') { - entity[epos++] = instr[ipos++]; - } - sscanf(entity, "%u", &dec); - str[bpos++] = (char) dec; - ipos++; - } else { - int i; - for (i = 0; i < 5; i++) { - if (!strncmp(instr + ipos, entitymap[i][0], - strlen(entitymap[i][0]))) { - str[bpos++] = entitymap[i][1][0]; - ipos += strlen(entitymap[i][0]); - break; - } - } - } - } - str[bpos] = '\0'; - - /* free extra alloc'ed mem. */ - len = strlen(str); - str = y_renew(char, str, len + 1); - - return (str); -} -#endif - -typedef void (*http_connected) (int id, void *fd, int error); - -struct callback_data { - int id; - yahoo_get_fd_callback callback; - char *request; - void *user_data; -}; - -static void connect_complete(void *fd, int error, void *data) -{ - struct callback_data *ccd = data; - - if (error == 0) { - YAHOO_CALLBACK (ext_yahoo_write) (fd, ccd->request, - strlen(ccd->request)); - } - free(ccd->request); - ccd->callback(ccd->id, fd, error, ccd->user_data); - FREE(ccd); -} - -static void yahoo_send_http_request(int id, char *host, int port, char *request, - yahoo_get_fd_callback callback, void *data, int use_ssl) -{ - struct callback_data *ccd = y_new0(struct callback_data, 1); - - ccd->callback = callback; - ccd->id = id; - ccd->request = strdup(request); - ccd->user_data = data; - - YAHOO_CALLBACK (ext_yahoo_connect_async) (id, host, port, - connect_complete, ccd, use_ssl); -} - -void yahoo_http_post(int id, const char *url, const char *cookies, - long content_length, yahoo_get_fd_callback callback, void *data) -{ - char host[255]; - int port = 80; - char path[255]; - char buff[1024]; - int ssl = 0; - - if (!url_to_host_port_path(url, host, &port, path, &ssl)) { - return; - } - - /* thanks to kopete dumpcap */ - snprintf(buff, sizeof(buff), - "POST %s HTTP/1.1\r\n" - "Cookie: %s\r\n" - "User-Agent: Mozilla/5.0\r\n" - "Host: %s\r\n" - "Content-Length: %ld\r\n" - "Cache-Control: no-cache\r\n" - "\r\n", path, cookies, host, content_length); - - yahoo_send_http_request(id, host, port, buff, callback, data, ssl); -} - -void yahoo_http_get(int id, const char *url, const char *cookies, int http11, - int keepalive, yahoo_get_fd_callback callback, void *data) -{ - char host[255]; - int port = 80; - char path[255]; - char buff[2048]; - char cookiebuff[1024]; - int ssl = 0; - - if (!url_to_host_port_path(url, host, &port, path, &ssl)) { - return; - } - - /* Allow cases when we don't need to send a cookie */ - if (cookies) { - snprintf(cookiebuff, sizeof(cookiebuff), "Cookie: %s\r\n", - cookies); - } else { - cookiebuff[0] = '\0'; - } - - snprintf(buff, sizeof(buff), - "GET %s HTTP/1.%s\r\n" - "%sHost: %s\r\n" - "User-Agent: Mozilla/4.5 [en] (" PACKAGE "/" VERSION ")\r\n" - "Accept: */*\r\n" - "%s" "\r\n", path, http11 ? "1" : "0", cookiebuff, host, - keepalive ? "Connection: Keep-Alive\r\n" : "Connection: close\r\n"); - - yahoo_send_http_request(id, host, port, buff, callback, data, ssl); -} - -void yahoo_http_head(int id, const char *url, const char *cookies, int len, - char *payload, yahoo_get_fd_callback callback, void *data) -{ - char host[255]; - int port = 80; - char path[255]; - char buff[2048]; - char cookiebuff[1024]; - int ssl = 0; - - if (!url_to_host_port_path(url, host, &port, path, &ssl)) { - return; - } - - /* Allow cases when we don't need to send a cookie */ - if (cookies) { - snprintf(cookiebuff, sizeof(cookiebuff), "Cookie: %s\r\n", - cookies); - } else { - cookiebuff[0] = '\0'; - } - - snprintf(buff, sizeof(buff), - "HEAD %s HTTP/1.0\r\n" - "Accept: */*\r\n" - "Host: %s:%d\r\n" - "User-Agent: Mozilla/4.5 [en] (" PACKAGE "/" VERSION ")\r\n" - "%s" - "Content-Length: %d\r\n" - "Cache-Control: no-cache\r\n" - "\r\n%s", path, host, port, cookiebuff, len, - payload ? payload : ""); - - yahoo_send_http_request(id, host, port, buff, callback, data, ssl); -} - diff --git a/protocols/yahoo/yahoo_httplib.h b/protocols/yahoo/yahoo_httplib.h deleted file mode 100644 index 9ee30ad6..00000000 --- a/protocols/yahoo/yahoo_httplib.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * libyahoo2: yahoo_httplib.h - * - * Copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef YAHOO_HTTPLIB_H -#define YAHOO_HTTPLIB_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "yahoo2_types.h" - -char *yahoo_urlencode(const char *instr); -char *yahoo_urldecode(const char *instr); -char *yahoo_xmldecode(const char *instr); - -int yahoo_tcp_readline(char *ptr, int maxlen, void *fd); -void yahoo_http_post(int id, const char *url, const char *cookies, - long size, yahoo_get_fd_callback callback, void *data); -void yahoo_http_get(int id, const char *url, const char *cookies, - int http11, int keepalive, yahoo_get_fd_callback callback, - void *data); -void yahoo_http_head(int id, const char *url, const char *cookies, - int size, char *payload, yahoo_get_fd_callback callback, - void *data); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/protocols/yahoo/yahoo_list.h b/protocols/yahoo/yahoo_list.h deleted file mode 100644 index 21bd4f06..00000000 --- a/protocols/yahoo/yahoo_list.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * yahoo_list.h: linked list routines - * - * Some code copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net> - * Other code copyright Meredydd Luff <meredydd AT everybuddy.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef __YLIST_H__ -#define __YLIST_H__ - -/* BitlBee already uses GLib so use it. */ - -typedef GList YList; - -#define y_list_append g_list_append -#define y_list_concat g_list_concat -#define y_list_copy g_list_copy -#define y_list_empty g_list_empty -#define y_list_find g_list_find -#define y_list_find_custom g_list_find_custom -#define y_list_foreach g_list_foreach -#define y_list_free g_list_free -#define y_list_free_1 g_list_free_1 -#define y_list_insert_sorted g_list_insert_sorted -#define y_list_length g_list_length -#define y_list_next g_list_next -#define y_list_nth g_list_nth -#define y_list_prepend g_list_prepend -#define y_list_remove g_list_remove -#define y_list_remove_link g_list_remove_link -#define y_list_singleton g_list_singleton - -#endif diff --git a/protocols/yahoo/yahoo_util.c b/protocols/yahoo/yahoo_util.c deleted file mode 100644 index 7fc50fda..00000000 --- a/protocols/yahoo/yahoo_util.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * libyahoo2: yahoo_util.c - * - * Copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#if STDC_HEADERS -# include <string.h> -#else -# if !HAVE_STRCHR -# define strchr index -# define strrchr rindex -# endif -char *strchr(), *strrchr(); -# if !HAVE_MEMCPY -# define memcpy(d, s, n) bcopy((s), (d), (n)) -# define memmove(d, s, n) bcopy((s), (d), (n)) -# endif -#endif - -#include "yahoo_util.h" - -char *y_string_append(char *string, char *append) -{ - int size = strlen(string) + strlen(append) + 1; - char *new_string = y_renew(char, string, size); - - if (new_string == NULL) { - new_string = y_new(char, size); - strcpy(new_string, string); - FREE(string); - } - - strcat(new_string, append); - - return new_string; -} - -#if !HAVE_GLIB - -void y_strfreev(char ** vector) -{ - char **v; - - for (v = vector; *v; v++) { - FREE(*v); - } - FREE(vector); -} - -char ** y_strsplit(char * str, char * sep, int nelem) -{ - char ** vector; - char *s, *p; - int i = 0; - int l = strlen(sep); - - if (nelem <= 0) { - char * s; - nelem = 0; - if (*str) { - for (s = strstr(str, sep); s; s = strstr(s + l, sep), nelem++) { - ; - } - if (strcmp(str + strlen(str) - l, sep)) { - nelem++; - } - } - } - - vector = y_new(char *, nelem + 1); - - for (p = str, s = strstr(p, sep); i < nelem && s; p = s + l, s = strstr(p, sep), i++) { - int len = s - p; - vector[i] = y_new(char, len + 1); - strncpy(vector[i], p, len); - vector[i][len] = '\0'; - } - - if (i < nelem && *str) { /* str didn't end with sep, and str isn't empty */ - vector[i++] = strdup(p); - } - - vector[i] = NULL; - - return vector; -} - -void * y_memdup(const void * addr, int n) -{ - void * new_chunk = malloc(n); - - if (new_chunk) { - memcpy(new_chunk, addr, n); - } - return new_chunk; -} - -#endif diff --git a/protocols/yahoo/yahoo_util.h b/protocols/yahoo/yahoo_util.h deleted file mode 100644 index 1a033a66..00000000 --- a/protocols/yahoo/yahoo_util.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * libyahoo2: yahoo_util.h - * - * Copyright (C) 2002-2004, Philip S Tellis <philip.tellis AT gmx.net> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef __YAHOO_UTIL_H__ -#define __YAHOO_UTIL_H__ - -#if HAVE_CONFIG_H -# include <config.h> -#endif - -#if HAVE_GLIB -# include <glib.h> - -# define FREE(x) if (x) { g_free(x); x = NULL; } - -# define y_new g_new -# define y_new0 g_new0 -# define y_renew g_renew - -# define y_memdup g_memdup -# define y_strsplit g_strsplit -# define y_strfreev g_strfreev -# ifndef strdup -# define strdup g_strdup -# endif -# ifndef strncasecmp -# define strncasecmp g_strncasecmp -# define strcasecmp g_strcasecmp -# endif - -# define snprintf g_snprintf -#ifdef vsnprintf -#undef vsnprintf -#endif -# define vsnprintf g_vsnprintf - -#else - -# include <stdlib.h> -# include <stdarg.h> - -# define FREE(x) if (x) { free(x); x = NULL; } - -# define y_new(type, n) (type *) malloc(sizeof(type) * (n)) -# define y_new0(type, n) (type *) calloc((n), sizeof(type)) -# define y_renew(type, mem, n) (type *) realloc(mem, n) - -void *y_memdup(const void *addr, int n); -char **y_strsplit(char *str, char *sep, int nelem); -void y_strfreev(char **vector); - -int strncasecmp(const char *s1, const char *s2, size_t n); -int strcasecmp(const char *s1, const char *s2); - -char *strdup(const char *s); - -int snprintf(char *str, size_t size, const char *format, ...); -int vsnprintf(char *str, size_t size, const char *format, va_list ap); - -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef MIN -#define MIN(x, y) ((x) < (y) ? (x) : (y)) -#endif - -#ifndef MAX -#define MAX(x, y) ((x) > (y) ? (x) : (y)) -#endif - -/* - * The following three functions return newly allocated memory. - * You must free it yourself - */ -char *y_string_append(char *str, char *append); -char *y_str_to_utf8(const char *in); -char *y_utf8_to_str(const char *in); - -#endif - |