From: <mar...@us...> - 2006-08-19 02:33:03
|
Revision: 16867 Author: markhuetsch Date: 2006-08-18 19:32:55 -0700 (Fri, 18 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16867&view=rev Log Message: ----------- Revamped the QQ proxy code. Fixed an infinite loop that was occurring if we hit qq_input_pending() with an unexpected value of cond. Rewrote part of qq_proxy.c so that we use Gaim's non-blocking dns lookups. Quieted some warnings created by new code in proxy.c and passed appropriate error messages to _qq_got_login(). Added some extra error handling to qq_proxy_write(). I was beginning to do major clean-up on this this code when I realized that once that clean-up is done, I will have duplicated a very large amount of code from proxy.c. Therefore, I am submitting this working code now and will later submit a patch to gaim-devel that will add support for UDP proxying in proxy.c, thus eliminating the need for such code in the individual prpls. Modified Paths: -------------- trunk/libgaim/protocols/qq/qq.c trunk/libgaim/protocols/qq/qq.h trunk/libgaim/protocols/qq/qq_proxy.c trunk/libgaim/protocols/qq/qq_proxy.h trunk/libgaim/protocols/qq/recv_core.c trunk/libgaim/protocols/qq/send_core.c trunk/libgaim/protocols/qq/udp_proxy_s5.c Modified: trunk/libgaim/protocols/qq/qq.c =================================================================== --- trunk/libgaim/protocols/qq/qq.c 2006-08-19 02:26:57 UTC (rev 16866) +++ trunk/libgaim/protocols/qq/qq.c 2006-08-19 02:32:55 UTC (rev 16867) @@ -64,25 +64,26 @@ #define QQ_UDP_PORT "8000" const gchar *udp_server_list[] = { - "sz.tencent.com", /* 61.144.238.145 */ - "sz2.tencent.com", /* 61.144.238.146 */ - "sz3.tencent.com", /* 202.104.129.251 */ - "sz4.tencent.com", /* 202.104.129.254 */ - "sz5.tencent.com", /* 61.141.194.203 */ - "sz6.tencent.com", /* 202.104.129.252 */ - "sz7.tencent.com", /* 202.104.129.253 */ - "202.96.170.64", - "64.144.238.155", - "202.104.129.254" + "sz.tencent.com", + "sz2.tencent.com", + "sz3.tencent.com", + "sz4.tencent.com", + "sz5.tencent.com", + "sz6.tencent.com", + "sz7.tencent.com", + "sz8.tencent.com", + "sz9.tencent.com" }; const gint udp_server_amount = (sizeof(udp_server_list) / sizeof(udp_server_list[0])); const gchar *tcp_server_list[] = { - "tcpconn.tencent.com", /* 218.17.209.23 */ - "tcpconn2.tencent.com", /* 218.18.95.153 */ - "tcpconn3.tencent.com", /* 218.17.209.23 */ - "tcpconn4.tencent.com" /* 218.18.95.153 */ + "tcpconn.tencent.com", + "tcpconn2.tencent.com", + "tcpconn3.tencent.com", + "tcpconn4.tencent.com", + "tcpconn5.tencent.com", + "tcpconn6.tencent.com" }; const gint tcp_server_amount = (sizeof(tcp_server_list) / sizeof(tcp_server_list[0])); @@ -102,6 +103,7 @@ gc->flags |= GAIM_CONNECTION_HTML | GAIM_CONNECTION_NO_BGCOLOR | GAIM_CONNECTION_AUTO_RESP; qd = g_new0(qq_data, 1); + qd->gc = gc; gc->proto_data = qd; qq_server = gaim_account_get_string(account, "server", NULL); @@ -122,13 +124,14 @@ if (qq_server == NULL || strlen(qq_server) == 0) qq_server = use_tcp ? - tcp_server_list[random() % tcp_server_amount] : udp_server_list[random() % udp_server_amount]; + tcp_server_list[random() % tcp_server_amount] : + udp_server_list[random() % udp_server_amount]; if (qq_port == NULL || strtol(qq_port, NULL, 10) == 0) qq_port = use_tcp ? QQ_TCP_QUERY_PORT : QQ_UDP_PORT; gaim_connection_update_progress(gc, _("Connecting"), 0, QQ_CONNECT_STEPS); - + if (qq_connect(account, qq_server, strtol(qq_port, NULL, 10), use_tcp, FALSE) < 0) gaim_connection_error(gc, _("Unable to connect.")); } Modified: trunk/libgaim/protocols/qq/qq.h =================================================================== --- trunk/libgaim/protocols/qq/qq.h 2006-08-19 02:26:57 UTC (rev 16866) +++ trunk/libgaim/protocols/qq/qq.h 2006-08-19 02:32:55 UTC (rev 16867) @@ -67,7 +67,9 @@ gboolean logged_in; /* used by qq-add_buddy */ gboolean use_tcp; /* network in tcp or udp */ - GaimProxyType proxy_type; /* proxy type */ + GaimProxyType proxy_type; + GaimConnection *gc; + GaimXfer *xfer; /* file transfer handler */ struct sockaddr_in dest_sin; Modified: trunk/libgaim/protocols/qq/qq_proxy.c =================================================================== --- trunk/libgaim/protocols/qq/qq_proxy.c 2006-08-19 02:26:57 UTC (rev 16866) +++ trunk/libgaim/protocols/qq/qq_proxy.c 2006-08-19 02:32:55 UTC (rev 16867) @@ -43,11 +43,11 @@ #include "udp_proxy_s5.h" #include "utils.h" -/* These functions are used only in development phase - * +/* These functions are used only in development phase */ +/* static void _qq_show_socket(gchar *desc, gint fd) { struct sockaddr_in sin; - gint len = sizeof(sin); + socklen_t len = sizeof(sin); getsockname(fd, (struct sockaddr *)&sin, &len); gaim_debug(GAIM_DEBUG_INFO, desc, "%s:%d\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); @@ -88,22 +88,24 @@ return g_memdup(pwkey_tmp, QQ_KEY_LENGTH); } -gint _qq_fill_host(struct sockaddr_in *addr, const gchar *host, guint16 port) +static gboolean _qq_fill_host(GSList *hosts, struct sockaddr_in *addr, gint *addr_size) { - if (!inet_aton(host, &(addr->sin_addr))) { - struct hostent *hp; - if (!(hp = gethostbyname(host))) { - return -1; - } - memset(addr, 0, sizeof(struct sockaddr_in)); - memcpy(&(addr->sin_addr.s_addr), hp->h_addr, hp->h_length); - addr->sin_family = hp->h_addrtype; - } else { - addr->sin_family = AF_INET; + if (!hosts || !hosts->data) + return FALSE; + + *addr_size = GPOINTER_TO_INT(hosts->data); + + hosts = g_slist_remove(hosts, hosts->data); + memcpy(addr, hosts->data, *addr_size); + g_free(hosts->data); + hosts = g_slist_remove(hosts, hosts->data); + while(hosts) { + hosts = g_slist_remove(hosts, hosts->data); + g_free(hosts->data); + hosts = g_slist_remove(hosts, hosts->data); } - addr->sin_port = htons(port); - return 0; + return TRUE; } /* set up any finalizing start-up stuff */ @@ -136,12 +138,16 @@ g_return_if_fail(gc != NULL && gc->proto_data != NULL); if (source < 0) { /* socket returns -1 */ - gaim_connection_error(gc, _("Unable to connect.")); + gaim_connection_error(gc, error_message); return; } qd = (qq_data *) gc->proto_data; + /* + _qq_show_socket("Got login socket", source); + */ + /* QQ use random seq, to minimize duplicated packets */ srandom(time(NULL)); qd->send_seq = random() & 0x0000ffff; @@ -201,6 +207,54 @@ qq_buddies_list_free(gc->account, qd); } +static void no_one_calls(gpointer data, gint source, GaimInputCondition cond) +{ + struct PHB *phb = data; + socklen_t len; + int error=0, ret; + + gaim_debug_info("proxy", "Connected.\n"); + + len = sizeof(error); + + /* + * getsockopt after a non-blocking connect returns -1 if something is + * really messed up (bad descriptor, usually). Otherwise, it returns 0 and + * error holds what connect would have returned if it blocked until now. + * Thus, error == 0 is success, error == EINPROGRESS means "try again", + * and anything else is a real error. + * + * (error == EINPROGRESS can happen after a select because the kernel can + * be overly optimistic sometimes. select is just a hint that you might be + * able to do something.) + */ + ret = getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len); + if (ret == 0 && error == EINPROGRESS) + return; /* we'll be called again later */ + if (ret < 0 || error != 0) { + if(ret!=0) + error = errno; + close(source); + gaim_input_remove(phb->inpa); + + gaim_debug_error("proxy", "getsockopt SO_ERROR check: %s\n", strerror(error)); + + phb->func(phb->data, -1, _("Unable to connect")); + return; + } + + gaim_input_remove(phb->inpa); + + if (phb->account == NULL || gaim_account_get_connection(phb->account) != NULL) { + + phb->func(phb->data, source, NULL); + } + + g_free(phb->host); + g_free(phb); +} + +/* returns -1 if fails, otherwise returns the file handle */ static gint _qq_proxy_none(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen) { gint fd = -1; @@ -209,7 +263,8 @@ fd = socket(PF_INET, SOCK_DGRAM, 0); if (fd < 0) { - gaim_debug(GAIM_DEBUG_ERROR, "QQ Redirect", "Unable to create socket: %s\n", strerror(errno)); + gaim_debug(GAIM_DEBUG_ERROR, "QQ Redirect", + "Unable to create socket: %s\n", strerror(errno)); return -1; } @@ -238,8 +293,9 @@ */ if ((errno == EINPROGRESS) || (errno == EINTR)) { gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Connect in asynchronous mode.\n"); + phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, no_one_calls, phb); } else { - gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Faiil connection: %d\n", strerror(errno)); + gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Connection failed: %d\n", strerror(errno)); close(fd); return -1; } /* if errno */ @@ -252,20 +308,80 @@ return fd; } -/* returns the socket handler, or -1 if there is any error */ +static void _qq_proxy_resolved(GSList *hosts, gpointer data, const char *error_message) +{ + struct PHB *phb = (struct PHB *) data; + struct sockaddr_in addr; + gint addr_size, ret = -1; + + if(_qq_fill_host(hosts, &addr, &addr_size)) + ret = qq_proxy_socks5(phb, (struct sockaddr *) &addr, addr_size); + + if (ret < 0) { + phb->func(phb->data, -1, _("Unable to connect")); + g_free(phb->host); + g_free(phb); + } +} + +static void _qq_server_resolved(GSList *hosts, gpointer data, const char *error_message) +{ + struct PHB *phb = (struct PHB *) data; + GaimConnection *gc = (GaimConnection *) phb->data; + qq_data *qd = (qq_data *) gc->proto_data; + struct sockaddr_in addr; + gint addr_size, ret = -1; + + if(_qq_fill_host(hosts, &addr, &addr_size)) { + switch (gaim_proxy_info_get_type(phb->gpi)) { + case GAIM_PROXY_NONE: + ret = _qq_proxy_none(phb, (struct sockaddr *) &addr, addr_size); + break; + case GAIM_PROXY_SOCKS5: + ret = 0; + if (gaim_proxy_info_get_host(phb->gpi) == NULL || + gaim_proxy_info_get_port(phb->gpi) == 0) { + gaim_debug(GAIM_DEBUG_ERROR, "QQ", + "Use of socks5 proxy selected but host or port info doesn't exist.\n"); + ret = -1; + } else { + /* as the destination is always QQ server during the session, + * we can set dest_sin here, instead of _qq_s5_canread_again */ + memcpy(&qd->dest_sin, &addr, addr_size); + if (gaim_dnsquery_a(gaim_proxy_info_get_host(phb->gpi), + gaim_proxy_info_get_port(phb->gpi), + _qq_proxy_resolved, phb) == NULL) + ret = -1; + } + break; + default: + gaim_debug(GAIM_DEBUG_WARNING, "QQ", + "Proxy type %i is unsupported, not using a proxy.\n", + gaim_proxy_info_get_type(phb->gpi)); + ret = _qq_proxy_none(phb, (struct sockaddr *) &addr, addr_size); + } + } + + if (ret < 0) { + phb->func(gc, -1, _("Unable to connect")); + g_free(phb->host); + g_free(phb); + } +} + +/* returns -1 if dns lookup fails, otherwise returns 0 */ static gint _qq_udp_proxy_connect(GaimAccount *account, - const gchar *server, - guint16 port, void callback(gpointer, gint, const gchar *error_message), GaimConnection *gc) + const gchar *server, guint16 port, + void callback(gpointer, gint, const gchar *error_message), + GaimConnection *gc) { - struct sockaddr_in sin; + GaimProxyInfo *info; struct PHB *phb; - GaimProxyInfo *info; - qq_data *qd; + qq_data *qd = (qq_data *) gc->proto_data; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); - qd = (qq_data *) gc->proto_data; + g_return_val_if_fail(gc != NULL && qd != NULL, -1); - info = gaim_account_get_proxy_info(account); + info = gaim_proxy_get_setup(account); phb = g_new0(struct PHB, 1); phb->host = g_strdup(server); @@ -274,41 +390,24 @@ phb->gpi = info; phb->func = callback; phb->data = gc; + qd->proxy_type = gaim_proxy_info_get_type(phb->gpi); - if (_qq_fill_host(&sin, server, port) < 0) { - gaim_debug(GAIM_DEBUG_ERROR, "QQ", - "gethostbyname(\"%s\", %d) failed: %s\n", server, port, hstrerror(h_errno)); + gaim_debug(GAIM_DEBUG_INFO, "QQ", "Choosing proxy type %d\n", + gaim_proxy_info_get_type(phb->gpi)); + + if (gaim_dnsquery_a(server, port, _qq_server_resolved, phb) == NULL) { + phb->func(gc, -1, _("Unable to connect")); + g_free(phb->host); + g_free(phb); return -1; + } else { + return 0; } - - if (info == NULL) { - qd->proxy_type = GAIM_PROXY_NONE; - return _qq_proxy_none(phb, (struct sockaddr *) &sin, sizeof(sin)); - } - - qd->proxy_type = info->type; - gaim_debug(GAIM_DEBUG_INFO, "QQ", "Choosing proxy type %d\n", info->type); - - switch (info->type) { - case GAIM_PROXY_NONE: - return _qq_proxy_none(phb, (struct sockaddr *) &sin, sizeof(sin)); - case GAIM_PROXY_SOCKS5: - /* as the destination is always QQ server during the session, - * we can set dest_sin here, instead of _qq_s5_canread_again */ - _qq_fill_host(&qd->dest_sin, phb->host, phb->port); - _qq_fill_host(&sin, phb->gpi->host, phb->gpi->port); - return qq_proxy_socks5(phb, (struct sockaddr *) &sin, sizeof(sin)); - default: - return _qq_proxy_none(phb, (struct sockaddr *) &sin, sizeof(sin)); - } - - return -1; } /* QQ connection via UDP/TCP. - * I use GAIM proxy function to provide TCP proxy support, - * and qq_udp_proxy.c to add UDP proxy support (thanks henry) - * return the socket handle, -1 means fail */ + * I use Gaim proxy function to provide TCP proxy support, + * and qq_udp_proxy.c to add UDP proxy support (thanks henry) */ static gint _proxy_connect_full (GaimAccount *account, const gchar *host, guint16 port, GaimProxyConnectFunction func, gpointer data, gboolean use_tcp) { @@ -320,18 +419,16 @@ qd->server_ip = g_strdup(host); qd->server_port = port; - if (use_tcp) - /* TCP mode */ + if(use_tcp) return (gaim_proxy_connect(account, host, port, func, data) == NULL); else - /* UDP mode */ return _qq_udp_proxy_connect(account, host, port, func, data); } /* establish a generic QQ connection - * TCP/UDP, and direct/redirected - * return the socket handler, or -1 if there is any error */ -gint qq_connect(GaimAccount *account, const gchar *host, guint16 port, gboolean use_tcp, gboolean is_redirect) + * TCP/UDP, and direct/redirected */ +gint qq_connect(GaimAccount *account, const gchar *host, guint16 port, + gboolean use_tcp, gboolean is_redirect) { GaimConnection *gc; @@ -385,10 +482,19 @@ g_memmove(buf + 4, &(qd->dest_sin.sin_addr.s_addr), 4); g_memmove(buf + 8, &(qd->dest_sin.sin_port), 2); g_memmove(buf + 10, data, len); + errno = 0; ret = send(qd->fd, buf, len + 10, 0); } else { + errno = 0; ret = send(qd->fd, data, len, 0); } + if (ret == -1) { + gaim_connection_error(qd->gc, _("Socket send error")); + return ret; + } else if (errno == ECONNREFUSED) { + gaim_connection_error(qd->gc, _("Connection refused")); + return ret; + } return ret; } Modified: trunk/libgaim/protocols/qq/qq_proxy.h =================================================================== --- trunk/libgaim/protocols/qq/qq_proxy.h 2006-08-19 02:26:57 UTC (rev 16866) +++ trunk/libgaim/protocols/qq/qq_proxy.h 2006-08-19 02:32:55 UTC (rev 16867) @@ -25,7 +25,9 @@ #define _QQ_PROXY_H #include <glib.h> +#include "dnsquery.h" #include "proxy.h" + #include "qq.h" #define QQ_CONNECT_STEPS 2 /* steps in connection */ @@ -48,8 +50,6 @@ gint qq_connect(GaimAccount *account, const gchar *host, guint16 port, gboolean use_tcp, gboolean is_redirect); void qq_disconnect(GaimConnection *gc); -gint _qq_fill_host(struct sockaddr_in *addr, const gchar *host, guint16 port); - void _qq_show_packet(const gchar *desc, const guint8 *buf, gint len); #endif Modified: trunk/libgaim/protocols/qq/recv_core.c =================================================================== --- trunk/libgaim/protocols/qq/recv_core.c 2006-08-19 02:26:57 UTC (rev 16866) +++ trunk/libgaim/protocols/qq/recv_core.c 2006-08-19 02:32:55 UTC (rev 16867) @@ -296,7 +296,10 @@ gint len; gc = (GaimConnection *) data; - g_return_if_fail(gc != NULL && gc->proto_data != NULL && cond == GAIM_INPUT_READ); + if(gc == NULL || gc->proto_data == NULL || cond != GAIM_INPUT_READ) { + gaim_connection_error(gc, _("Socket error")); + return; + } qd = (qq_data *) gc->proto_data; buf = g_newa(guint8, MAX_PACKET_SIZE); Modified: trunk/libgaim/protocols/qq/send_core.c =================================================================== --- trunk/libgaim/protocols/qq/send_core.c 2006-08-19 02:26:57 UTC (rev 16866) +++ trunk/libgaim/protocols/qq/send_core.c 2006-08-19 02:32:55 UTC (rev 16867) @@ -73,7 +73,7 @@ /* for those need ack and resend no ack feed back from server * return number of bytes written to the socket, * return -1 if there is any error */ -gint _qq_send_packet(GaimConnection * gc, guint8 *buf, gint len, guint16 cmd) +gint _qq_send_packet(GaimConnection *gc, guint8 *buf, gint len, guint16 cmd) { qq_data *qd; qq_sendpacket *p; Modified: trunk/libgaim/protocols/qq/udp_proxy_s5.c =================================================================== --- trunk/libgaim/protocols/qq/udp_proxy_s5.c 2006-08-19 02:26:57 UTC (rev 16866) +++ trunk/libgaim/protocols/qq/udp_proxy_s5.c 2006-08-19 02:32:55 UTC (rev 16867) @@ -25,15 +25,13 @@ #include "udp_proxy_s5.h" -extern gint /* defined in qq_proxy.c */ - _qq_fill_host(struct sockaddr_in *addr, const gchar * host, guint16 port); - static void _qq_s5_canread_again(gpointer data, gint source, GaimInputCondition cond) { unsigned char buf[512]; struct PHB *phb = data; struct sockaddr_in sin; int len, error; + socklen_t errlen; gaim_input_remove(phb->inpa); gaim_debug(GAIM_DEBUG_INFO, "socks5 proxy", "Able to read again.\n"); @@ -61,7 +59,7 @@ if (phb->account == NULL || gaim_account_get_connection(phb->account) != NULL) { - phb->func(phb->data, -1, NULL); + phb->func(phb->data, -1, _("Unable to connect")); } g_free(phb->host); @@ -84,8 +82,8 @@ error = ETIMEDOUT; gaim_debug(GAIM_DEBUG_INFO, "QQ", "Connect didn't block\n"); - len = sizeof(error); - if (getsockopt(phb->udpsock, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { + errlen = sizeof(error); + if (getsockopt(phb->udpsock, SOL_SOCKET, SO_ERROR, &error, &errlen) < 0) { gaim_debug(GAIM_DEBUG_ERROR, "QQ", "getsockopt failed.\n"); close(phb->udpsock); return; @@ -105,7 +103,8 @@ unsigned char buf[512]; struct PHB *phb = data; struct sockaddr_in sin, ctlsin; - int port, ctllen; + int port; + socklen_t ctllen; gaim_debug(GAIM_DEBUG_INFO, "s5_sendconnect", "remote host is %s:%d\n", phb->host, phb->port); @@ -137,7 +136,9 @@ port = ntohs(ctlsin.sin_port) + 1; while (1) { - _qq_fill_host(&sin, "0.0.0.0", port); + inet_aton("0.0.0.0", &(sin.sin_addr)); + sin.sin_family = AF_INET; + sin.sin_port = htons(port); if (bind(phb->udpsock, (struct sockaddr *) &sin, sizeof(sin)) < 0) { port++; if (port > 65500) { @@ -158,7 +159,7 @@ gaim_debug(GAIM_DEBUG_INFO, "s5_sendconnect", "packet too small\n"); if (phb->account == NULL || gaim_account_get_connection(phb->account) != NULL) { - phb->func(phb->data, -1, NULL); + phb->func(phb->data, -1, _("Unable to connect")); } g_free(phb->host); @@ -182,7 +183,7 @@ if (phb->account == NULL || gaim_account_get_connection(phb->account) != NULL) { - phb->func(phb->data, -1, NULL); + phb->func(phb->data, -1, _("Unable to connect")); } g_free(phb->host); @@ -195,7 +196,7 @@ if (phb->account == NULL || gaim_account_get_connection(phb->account) != NULL) { - phb->func(phb->data, -1, NULL); + phb->func(phb->data, -1, _("Unable to connect")); } g_free(phb->host); @@ -238,7 +239,7 @@ if (phb->account == NULL || gaim_account_get_connection(phb->account) != NULL) { - phb->func(phb->data, -1, NULL); + phb->func(phb->data, -1, _("Unable to connect")); } g_free(phb->host); @@ -263,7 +264,7 @@ if (phb->account == NULL || gaim_account_get_connection(phb->account) != NULL) { - phb->func(phb->data, -1, NULL); + phb->func(phb->data, -1, _("Unable to connect")); } g_free(phb->host); @@ -297,7 +298,7 @@ close(source); if (phb->account == NULL || gaim_account_get_connection(phb->account) != NULL) { - phb->func(phb->data, -1, NULL); + phb->func(phb->data, -1, _("Unable to connect")); } g_free(phb->host); @@ -327,7 +328,7 @@ if (phb->account == NULL || gaim_account_get_connection(phb->account) != NULL) { - phb->func(phb->data, -1, NULL); + phb->func(phb->data, -1, _("Unable to connect")); } g_free(phb->host); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-08-20 21:37:51
|
Revision: 16918 Author: markhuetsch Date: 2006-08-20 14:37:45 -0700 (Sun, 20 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16918&view=rev Log Message: ----------- Const-correctness to eliminate some warnings. Modified Paths: -------------- trunk/libgaim/protocols/qq/crypt.c trunk/libgaim/protocols/qq/crypt.h trunk/libgaim/protocols/qq/utils.c trunk/libgaim/protocols/qq/utils.h Modified: trunk/libgaim/protocols/qq/crypt.c =================================================================== --- trunk/libgaim/protocols/qq/crypt.c 2006-08-20 20:14:12 UTC (rev 16917) +++ trunk/libgaim/protocols/qq/crypt.c 2006-08-20 21:37:45 UTC (rev 16918) @@ -49,10 +49,9 @@ * encryption *******************************************************************/ -/* TODO: convert these data types to proper glib ones */ -static void qq_encipher(unsigned long *const v, const unsigned long *const k, unsigned long *const w) +static void qq_encipher(guint32 *const v, const guint32 *const k, guint32 *const w) { - register unsigned long y = ntohl(v[0]), + register guint32 y = ntohl(v[0]), z = ntohl(v[1]), a = ntohl(k[0]), b = ntohl(k[1]), @@ -72,13 +71,14 @@ w[1] = htonl(z); } -static int rand(void) { /* it can be the real random seed function */ +static gint rand(void) { /* it can be the real random seed function */ return 0xdead; } /* override with number, convenient for debug */ -/* we encrypt every eight byte block */ -static void encrypt_every_8_byte(unsigned char *plain, unsigned char *plain_pre_8, unsigned char **crypted, - unsigned char **crypted_pre_8, unsigned char *key, int *count, int *pos_in_byte, int *is_header) +/* we encrypt every eight byte chunk */ +static void encrypt_every_8_byte(guint8 *plain, guint8 *plain_pre_8, guint8 **crypted, + guint8 **crypted_pre_8, const guint8 *const key, gint *count, + gint *pos_in_byte, gint *is_header) { /* prepare plain text */ for (*pos_in_byte = 0; *pos_in_byte < 8; (*pos_in_byte)++) { @@ -89,7 +89,7 @@ } } /* encrypt it */ - qq_encipher((unsigned long *) plain, (unsigned long *) key, (unsigned long *) *crypted); + qq_encipher((guint32 *) plain, (guint32 *) key, (guint32 *) *crypted); for (*pos_in_byte = 0; *pos_in_byte < 8; (*pos_in_byte)++) { (*crypted)[*pos_in_byte] ^= plain_pre_8[*pos_in_byte]; @@ -104,15 +104,16 @@ } /* encrypt_every_8_byte */ -static void qq_encrypt(unsigned char *instr, int instrlen, unsigned char *key, - unsigned char *outstr, int *outstrlen_prt) +static void qq_encrypt(const guint8 *const instr, gint instrlen, + const guint8 *const key, + guint8 *outstr, gint *outstrlen_prt) { - unsigned char plain[8], /* plain text buffer */ + guint8 plain[8], /* plain text buffer */ plain_pre_8[8], /* plain text buffer, previous 8 bytes */ *crypted, /* crypted text */ - *crypted_pre_8, /* crypted test, previous 8 bytes */ - *inp; /* current position in instr */ - int pos_in_byte = 1, /* loop in the byte */ + *crypted_pre_8; /* crypted test, previous 8 bytes */ + const guint8 *inp; /* current position in instr */ + gint pos_in_byte = 1, /* loop in the byte */ is_header = 1, /* header is one byte */ count = 0, /* number of bytes being crypted */ padding = 0; /* number of padding stuff */ @@ -135,7 +136,8 @@ padding++; } if (pos_in_byte == 8) { - encrypt_every_8_byte(plain, plain_pre_8, &crypted, &crypted_pre_8, key, &count, &pos_in_byte, &is_header); + encrypt_every_8_byte(plain, plain_pre_8, &crypted, &crypted_pre_8, + key, &count, &pos_in_byte, &is_header); } } @@ -146,7 +148,8 @@ instrlen--; } if (pos_in_byte == 8) { - encrypt_every_8_byte(plain, plain_pre_8, &crypted, &crypted_pre_8, key, &count, &pos_in_byte, &is_header); + encrypt_every_8_byte(plain, plain_pre_8, &crypted, &crypted_pre_8, + key, &count, &pos_in_byte, &is_header); } } @@ -157,7 +160,8 @@ padding++; } if (pos_in_byte == 8) { - encrypt_every_8_byte(plain, plain_pre_8, &crypted, &crypted_pre_8, key, &count, &pos_in_byte, &is_header); + encrypt_every_8_byte(plain, plain_pre_8, &crypted, &crypted_pre_8, + key, &count, &pos_in_byte, &is_header); } } @@ -169,9 +173,9 @@ * decryption ********************************************************************/ -static void qq_decipher(unsigned long *const v, const unsigned long *const k, unsigned long *const w) +static void qq_decipher(guint32 *const v, const guint32 *const k, guint32 *const w) { - register unsigned long y = ntohl(v[0]), + register guint32 y = ntohl(v[0]), z = ntohl(v[1]), a = ntohl(k[0]), b = ntohl(k[1]), @@ -192,15 +196,16 @@ w[1] = htonl(z); } -static int decrypt_every_8_byte(unsigned char **crypt_buff, const int instrlen, const unsigned char * const key, - int *context_start, unsigned char *decrypted, int *pos_in_byte) +static gint decrypt_every_8_byte(const guint8 **crypt_buff, const gint instrlen, + const guint8 *const key, gint *context_start, + guint8 *decrypted, gint *pos_in_byte) { for (*pos_in_byte = 0; *pos_in_byte < 8; (*pos_in_byte)++) { if (*context_start + *pos_in_byte >= instrlen) return 1; decrypted[*pos_in_byte] ^= (*crypt_buff)[*pos_in_byte]; } - qq_decipher((unsigned long *) decrypted, (unsigned long *) key, (unsigned long *) decrypted); + qq_decipher((guint32 *) decrypted, (guint32 *) key, (guint32 *) decrypted); *context_start += 8; *crypt_buff += 8; @@ -210,25 +215,29 @@ } /* return 0 if failed, 1 otherwise */ -static int qq_decrypt(unsigned char *instr, int instrlen, unsigned char *key, - unsigned char *outstr, int *outstrlen_ptr) +static gint qq_decrypt(const guint8 *const instr, gint instrlen, + const guint8 *const key, + guint8 *outstr, gint *outstrlen_ptr) { - unsigned char decrypted[8], m[8], *crypt_buff, *crypt_buff_pre_8, *outp; - int count, context_start, pos_in_byte, padding; + guint8 decrypted[8], m[8], *outp; + const guint8 *crypt_buff, *crypt_buff_pre_8; + gint count, context_start, pos_in_byte, padding; /* at least 16 bytes and %8 == 0 */ if ((instrlen % 8) || (instrlen < 16)) { gaim_debug(GAIM_DEBUG_ERROR, "QQ", - "Packet len is either too short or not a multiple of 8 bytes, read %d bytes\n", instrlen); + "Packet len is either too short or not a multiple of 8 bytes, read %d bytes\n", + instrlen); return 0; } /* get information from header */ - qq_decipher((unsigned long *) instr, (unsigned long *) key, (unsigned long *) decrypted); + qq_decipher((guint32 *) instr, (guint32 *) key, (guint32 *) decrypted); pos_in_byte = decrypted[0] & 0x7; count = instrlen - pos_in_byte - 10; /* this is the plaintext length */ /* return if outstr buffer is not large enough or error plaintext length */ if (*outstrlen_ptr < count || count < 0) { - gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Buffer len %d is less than real len %d", *outstrlen_ptr, count); + gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Buffer len %d is less than real len %d", + *outstrlen_ptr, count); return 0; } @@ -248,7 +257,8 @@ } if (pos_in_byte == 8) { crypt_buff_pre_8 = instr; - if (!decrypt_every_8_byte(&crypt_buff, instrlen, key, &context_start, decrypted, &pos_in_byte)) { + if (!decrypt_every_8_byte(&crypt_buff, instrlen, key, + &context_start, decrypted, &pos_in_byte)) { gaim_debug(GAIM_DEBUG_ERROR, "QQ", "decrypt every 8 bytes error A"); return 0; } @@ -265,7 +275,8 @@ } if (pos_in_byte == 8) { crypt_buff_pre_8 = crypt_buff - 8; - if (!decrypt_every_8_byte(&crypt_buff, instrlen, key, &context_start, decrypted, &pos_in_byte)) { + if (!decrypt_every_8_byte(&crypt_buff, instrlen, key, + &context_start, decrypted, &pos_in_byte)) { gaim_debug(GAIM_DEBUG_ERROR, "QQ", "decrypt every 8 bytes error B"); return 0; } @@ -280,7 +291,8 @@ } if (pos_in_byte == 8) { crypt_buff_pre_8 = crypt_buff; - if (!decrypt_every_8_byte(&crypt_buff, instrlen, key, &context_start, decrypted, &pos_in_byte)) { + if (!decrypt_every_8_byte(&crypt_buff, instrlen, key, + &context_start, decrypted, &pos_in_byte)) { gaim_debug(GAIM_DEBUG_ERROR, "QQ", "decrypt every 8 bytes error C"); return 0; } @@ -289,10 +301,11 @@ return 1; } -/* This is the Public Function */ /* return 1 is succeed, otherwise return 0 */ -int qq_crypt(unsigned char flag, - unsigned char *instr, int instrlen, unsigned char *key, unsigned char *outstr, int *outstrlen_ptr) +gint qq_crypt(gint flag, + const guint8 *const instr, gint instrlen, + const guint8 *const key, + guint8 *outstr, gint *outstrlen_ptr) { if (flag == DECRYPT) return qq_decrypt(instr, instrlen, key, outstr, outstrlen_ptr); Modified: trunk/libgaim/protocols/qq/crypt.h =================================================================== --- trunk/libgaim/protocols/qq/crypt.h 2006-08-20 20:14:12 UTC (rev 16917) +++ trunk/libgaim/protocols/qq/crypt.h 2006-08-20 21:37:45 UTC (rev 16918) @@ -23,10 +23,14 @@ #ifndef _QQ_CRYPT_H_ #define _QQ_CRYPT_H_ +#include <glib.h> + #define DECRYPT 0x00 #define ENCRYPT 0x01 -int qq_crypt(unsigned char flag, - unsigned char *instr, int instrlen, unsigned char *key, unsigned char *outstr, int *outstrlen_ptr); +gint qq_crypt(gint flag, + const guint8 *const instr, gint instrlen, + const guint8 *const key, + guint8 *outstr, gint *outstrlen_ptr); #endif Modified: trunk/libgaim/protocols/qq/utils.c =================================================================== --- trunk/libgaim/protocols/qq/utils.c 2006-08-20 20:14:12 UTC (rev 16917) +++ trunk/libgaim/protocols/qq/utils.c 2006-08-20 21:37:45 UTC (rev 16918) @@ -125,7 +125,8 @@ guint8 *str_ip_gen(gchar *str) { guint8 *ip = g_new(guint8, 4); - int a, b, c, d; + gint a, b, c, d; + sscanf(str, "%d.%d.%d.%d", &a, &b, &c, &d); ip[0] = a; ip[1] = b; @@ -149,7 +150,7 @@ } /* convert GAIM name to original QQ UID */ -guint32 gaim_name_to_uid(const gchar *name) +guint32 gaim_name_to_uid(const gchar *const name) { gchar *p; @@ -160,7 +161,7 @@ } /* try to dump the data as GBK */ -void try_dump_as_gbk(guint8 *data, gint len) +void try_dump_as_gbk(const guint8 *const data, gint len) { gint i; guint8 *incoming; @@ -186,7 +187,7 @@ } /* strips whitespace */ -static gchar *strstrip(const gchar *buffer) +static gchar *strstrip(const gchar *const buffer) { GString *stripped; gchar *ret; @@ -206,10 +207,9 @@ return ret; } -/* Dumps an ASCII hex string to a string of bytes. The return should be freed later. - * Returns NULL if a string with an odd number of nibbles is passed in or if buffer - * isn't a valid hex string */ -guint8 *hex_str_to_bytes(const gchar *buffer, gint *out_len) +/* Attempts to dump an ASCII hex string to a string of bytes. + * The return should be freed later. */ +guint8 *hex_str_to_bytes(const gchar *const buffer, gint *out_len) { gchar *hex_str, *hex_buffer, *cursor, tmp; guint8 *bytes, nibble1, nibble2; @@ -259,8 +259,9 @@ return g_memdup(bytes, *out_len); } -/* Dumps a chunk of raw data into an ASCII hex string. The return should be freed later. */ -gchar *hex_dump_to_str(const guint8 *buffer, gint bytes) +/* Dumps a chunk of raw data into an ASCII hex string. + * The return should be freed later. */ +gchar *hex_dump_to_str(const guint8 *const buffer, gint bytes) { GString *str; gchar *ret; Modified: trunk/libgaim/protocols/qq/utils.h =================================================================== --- trunk/libgaim/protocols/qq/utils.h 2006-08-20 20:14:12 UTC (rev 16917) +++ trunk/libgaim/protocols/qq/utils.h 2006-08-20 21:37:45 UTC (rev 16918) @@ -41,7 +41,7 @@ gchar *get_icon_name(gint set, gint suffix); -void try_dump_as_gbk(guint8 *data, gint len); +void try_dump_as_gbk(const guint8 *const data, gint len); guint8 *hex_str_to_bytes(const gchar *buf, gint *out_len); gchar *hex_dump_to_str(const guint8 *buf, gint buf_len); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-08-20 22:16:19
|
Revision: 16919 Author: markhuetsch Date: 2006-08-20 15:16:13 -0700 (Sun, 20 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16919&view=rev Log Message: ----------- Enhancements for easier protocol testing. Not much use until I can figure out the new QQ login scheme :-/ Modified Paths: -------------- trunk/libgaim/protocols/qq/qq.c trunk/libgaim/protocols/qq/utils.c Modified: trunk/libgaim/protocols/qq/qq.c =================================================================== --- trunk/libgaim/protocols/qq/qq.c 2006-08-20 21:37:45 UTC (rev 16918) +++ trunk/libgaim/protocols/qq/qq.c 2006-08-20 22:16:13 UTC (rev 16919) @@ -40,6 +40,7 @@ #include "buddy_opt.h" #include "buddy_status.h" #include "char_conv.h" +#include "crypt.h" #include "group.h" #include "group_find.h" #include "group_im.h" @@ -582,22 +583,26 @@ } */ +/* attempt to output the value and byte length of a given field */ +/* static gboolean _qq_parse_custom_packet_field(GaimRequestFields *fields, - const gchar *id, guint8 **value) + const gchar *id, guint8 **value, gint *len, gboolean allow_null) { GaimRequestField *field; const gchar *str; - gint len, i; + gint i; gboolean success; success = FALSE; field = gaim_request_fields_get_field(fields, id); str = gaim_request_field_string_get_value(field); - if (str) { + if (!str && allow_null) { + return TRUE; + } else if (str) { success = TRUE; if (strcmp(id, "uid") != 0) { - *value = hex_str_to_bytes(str, &len); - if (!*value || len != 2) + *value = hex_str_to_bytes(str, len); + if (!*value) success = FALSE; } else { for (i = 0; i < strlen(str); i++) { @@ -617,64 +622,84 @@ gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Invalid entry: %s\n", id); return success; } +*/ +/* attempt to output the field values and body length */ +/* static gboolean _qq_parse_custom_packet_fields(GaimRequestFields *fields, guint8 **client, guint8 **cmd, guint8 **seq, guint32 *uid, - guint8 **body, gint *body_len) + guint8 **body, guint8 **key, gint *body_len) { - GaimRequestField *field; + gint len; gboolean success; - success = TRUE; - *client = *cmd = *seq = *body = NULL; - *uid = 0; - success = _qq_parse_custom_packet_field(fields, "client", client); - if (success) - success = _qq_parse_custom_packet_field(fields, "cmd", cmd); - if (success) - success = _qq_parse_custom_packet_field(fields, "uid", (guint8 **) uid); - if (success) - success = _qq_parse_custom_packet_field(fields, "seq", seq); - if (success) { - field = gaim_request_fields_get_field(fields, "body"); - *body = hex_str_to_bytes(gaim_request_field_string_get_value(field), - body_len); - } else { + success = FALSE; + *client = *cmd = *seq = *body = *key = NULL; + *uid = *body_len = 0; + if ((_qq_parse_custom_packet_field(fields, "client", client, &len, FALSE) + && len == 2 + && _qq_parse_custom_packet_field(fields, "cmd", cmd, &len, FALSE) + && len == 2 + && _qq_parse_custom_packet_field(fields, "uid", (guint8 **) uid, &len, FALSE) + && _qq_parse_custom_packet_field(fields, "seq", seq, &len, FALSE) + && len == 2 + && _qq_parse_custom_packet_field(fields, "body", body, body_len, TRUE))) { + if (*body_len > MAX_PACKET_SIZE / 8) { + g_free(*client); + g_free(*cmd); + g_free(*seq); + g_free(*body); + return FALSE; + } + if (!gaim_request_fields_get_bool(fields, "encrypt")) + return TRUE; + else + success = _qq_parse_custom_packet_field(fields, + "key", key, &len, FALSE) + && len == 16 + && *body_len > 0; + } + if (!success) { if (*client) g_free(*client); if (*cmd) g_free(*cmd); if (*seq) g_free(*seq); + if (*key) + g_free(*key); + return FALSE; } - return success; + return TRUE; } +*/ +/* parses the request fields and attempts to send the packet */ +/* static void _qq_send_custom_packet_cb(GaimConnection *gc, GaimRequestFields *fields) { guint32 uid; - guint8 *buf, *client, *cmd, *seq, *body, *cursor; - gint bytes, len; + guint8 *buf, *client, *cmd, *seq, *body, *encr_body, *key, *cursor; + gint bytes, len, encr_len; qq_data *qd; gboolean success; qd = (qq_data *) gc->proto_data; success = _qq_parse_custom_packet_fields(fields, &client, &cmd, - &seq, &uid, &body, &len); + &seq, &uid, &body, &key, &len); if (!success) { - gaim_notify_error(gc, _("Error"), _("Invalid packet entry"), NULL); + gaim_notify_error(gc, _("Error"), _("Invalid entry"), NULL); return; } - if (body) - g_return_if_fail(len+12 <= MAX_PACKET_SIZE); - bytes = 0; buf = g_newa(guint8, MAX_PACKET_SIZE); cursor = buf; +*/ /* QQ TCP packet has two bytes in the beginning to define packet length * so I leave room here for size */ +/* if (qd->use_tcp) bytes += create_packet_w(buf, &cursor, 0x0000); bytes += create_packet_b(buf, &cursor, QQ_PACKET_TAG); @@ -683,7 +708,17 @@ bytes += create_packet_w(buf, &cursor, *(guint16 *) seq); bytes += create_packet_dw(buf, &cursor, uid); if (body) { - bytes += create_packet_data(buf, &cursor, body, len); + if (gaim_request_fields_get_bool(fields, "encrypt")) { + if (gaim_request_fields_get_bool(fields, "prepend")) + bytes += create_packet_data(buf, &cursor, key, 16); + encr_body = g_newa(guint8, MAX_PACKET_SIZE); + qq_crypt(ENCRYPT, body, len, key, encr_body, &encr_len); + bytes += create_packet_data(buf, &cursor, encr_body, encr_len); + g_free(key); + } else { + bytes += create_packet_data(buf, &cursor, body, len); + } + g_free(body); } bytes += create_packet_b(buf, &cursor, QQ_PACKET_TAIL); @@ -696,8 +731,10 @@ g_free(cmd); g_free(seq); } +*/ /* send a custom packet to the server - for protocol testing */ +/* static void _qq_menu_send_custom_packet(GaimPluginAction *action) { GaimConnection *gc; @@ -712,7 +749,7 @@ g_return_if_fail(gc != NULL && qd != NULL); fields = gaim_request_fields_new(); - group = gaim_request_field_group_new(_("Packet Elements")); + group = gaim_request_field_group_new(_("Basic Elements")); gaim_request_fields_add_group(fields, group); tmp = g_strdup_printf("%04X", QQ_CLIENT); field = gaim_request_field_string_new("client", _("Client (hex)"), tmp, FALSE); @@ -726,15 +763,25 @@ field = gaim_request_field_string_new("uid", _("QQ Number (decimal)"), tmp, FALSE); g_free(tmp); gaim_request_field_group_add_field(group, field); - field = gaim_request_field_string_new("body", _("Body (hex)"), NULL, FALSE); + field = gaim_request_field_string_new("body", _("Body (hex)"), NULL, TRUE); gaim_request_field_group_add_field(group, field); + group = gaim_request_field_group_new(_("Encryption")); + gaim_request_fields_add_group(fields, group); + field = gaim_request_field_bool_new("encrypt", _("Encrypt Packet Body"), FALSE); + gaim_request_field_group_add_field(group, field); + field = gaim_request_field_bool_new("prepend", _("Prepend Key to Body"), FALSE); + gaim_request_field_group_add_field(group, field); + field = gaim_request_field_string_new("key", _("Encryption Key (hex)"), NULL, FALSE); + gaim_request_field_group_add_field(group, field); + gaim_request_fields(gc, _("Send a custom packet"), _("Send a custom packet"), NULL, fields, _("Send"), G_CALLBACK(_qq_send_custom_packet_cb), _("Cancel"), NULL, gc); } +*/ /* protocol related menus */ static GList *_qq_actions(GaimPlugin *plugin, gpointer context) @@ -752,10 +799,10 @@ act = gaim_plugin_action_new(_("Show Login Information"), _qq_menu_show_login_info); m = g_list_append(m, act); - /* +/* act = gaim_plugin_action_new(_("Send Custom Packet"), _qq_menu_send_custom_packet); m = g_list_append(m, act); - */ +*/ /* XXX consider re-enabling this act = gaim_plugin_action_new(_("Show System Message"), _qq_menu_show_system_message); Modified: trunk/libgaim/protocols/qq/utils.c =================================================================== --- trunk/libgaim/protocols/qq/utils.c 2006-08-20 21:37:45 UTC (rev 16918) +++ trunk/libgaim/protocols/qq/utils.c 2006-08-20 22:16:13 UTC (rev 16919) @@ -190,16 +190,16 @@ static gchar *strstrip(const gchar *const buffer) { GString *stripped; - gchar *ret; - int i; + gchar *ret, cur; + gint i; g_return_val_if_fail(buffer != NULL, NULL); stripped = g_string_new(""); for (i=0; i<strlen(buffer); i++) { - if ((int) buffer[i] != 32) { + cur = buffer[i]; + if (cur != ' ' && cur != '\n') g_string_append_c(stripped, buffer[i]); - } } ret = stripped->str; g_string_free(stripped, FALSE); @@ -236,7 +236,7 @@ nibble1 = (gint) *cursor - 87; } else { gaim_debug(GAIM_DEBUG_WARNING, "QQ", - "Invalid char found in hex string!\n"); + "Invalid char \'%c\' found in hex string!\n", *cursor); g_free(hex_str); return NULL; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-08-20 23:16:56
|
Revision: 16924 Author: markhuetsch Date: 2006-08-20 16:16:44 -0700 (Sun, 20 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16924&view=rev Log Message: ----------- Got rid of a bunch of warnings. Modified Paths: -------------- trunk/libgaim/protocols/qq/file_trans.c trunk/libgaim/protocols/qq/group_opt.c trunk/libgaim/protocols/qq/im.c trunk/libgaim/protocols/qq/qq.c trunk/libgaim/protocols/qq/send_core.h trunk/libgaim/protocols/qq/send_file.c trunk/libgaim/protocols/qq/send_file.h trunk/libgaim/protocols/qq/utils.c trunk/libgaim/protocols/qq/utils.h Modified: trunk/libgaim/protocols/qq/file_trans.c =================================================================== --- trunk/libgaim/protocols/qq/file_trans.c 2006-08-20 23:08:42 UTC (rev 16923) +++ trunk/libgaim/protocols/qq/file_trans.c 2006-08-20 23:16:44 UTC (rev 16924) @@ -38,9 +38,8 @@ #include "proxy.h" #include "send_core.h" #include "send_file.h" +#include "utils.h" -extern gchar *hex_dump_to_str (const guint8 *buffer, gint bytes); - struct _qq_file_header { guint8 tag; guint16 client_ver; @@ -76,7 +75,7 @@ return (~uid) ^ key; } -static void _fill_filename_md5(const gchar *filename, gchar *md5) +static void _fill_filename_md5(const gchar *filename, guint8 *md5) { GaimCipher *cipher; GaimCipherContext *context; @@ -90,7 +89,7 @@ gaim_cipher_context_destroy(context); } -static void _fill_file_md5(const gchar *filename, gint filelen, gchar *md5) +static void _fill_file_md5(const gchar *filename, gint filelen, guint8 *md5) { FILE *fp; guint8 *buffer; @@ -274,7 +273,6 @@ bytes += create_packet_dw(buf, &cursor, _encrypt_qq_uid(to_uid, file_key)); bytes += create_packet_data(buf, &cursor, data, len); - ssize_t _qq_xfer_write(const char *buf, size_t len, GaimXfer *xfer); if (bytes == len + 12) { _qq_xfer_write(buf, bytes, qd->xfer); } else @@ -282,15 +280,12 @@ return bytes; } -extern gchar *_gen_session_md5(gint uid, guint8 *session_key); - /* send a file to udp channel with QQ_FILE_CONTROL_PACKET_TAG */ void qq_send_file_ctl_packet(GaimConnection *gc, guint16 packet_type, guint32 to_uid, guint8 hellobyte) { qq_data *qd; gint bytes, bytes_expected, encrypted_len; - guint8 *raw_data, *cursor, *encrypted_data; - gchar *md5; + guint8 *raw_data, *cursor, *encrypted_data, *md5; time_t now; ft_info *info; @@ -393,9 +388,9 @@ guint32 fragment_index, guint16 seq, guint8 *data, gint len) { gint bytes; - guint8 *raw_data, *cursor; + guint8 *raw_data, *cursor, filename_md5[QQ_KEY_LENGTH], file_md5[QQ_KEY_LENGTH]; guint32 fragment_size = 1000; - gchar file_md5[16], filename_md5[16], *filename; + gchar *filename; gint filename_len, filesize; qq_data *qd; ft_info *info; @@ -529,7 +524,7 @@ guint16 packet_type; guint16 seq; guint8 hellobyte; - gchar *md5; + guint8 *md5; ft_info *info = (ft_info *) qd->xfer->data; decrypted_data = g_newa(guint8, len); Modified: trunk/libgaim/protocols/qq/group_opt.c =================================================================== --- trunk/libgaim/protocols/qq/group_opt.c 2006-08-20 23:08:42 UTC (rev 16923) +++ trunk/libgaim/protocols/qq/group_opt.c 2006-08-20 23:16:44 UTC (rev 16924) @@ -75,7 +75,7 @@ gint i; for (i = 0; list[i] < 0xffffffff; i++) {; } - _quick_sort(list, 0, i - 1); + _quick_sort((gint *) list, 0, i - 1); } static void _qq_group_member_opt(GaimConnection *gc, qq_group *group, gint operation, guint32 *members) Modified: trunk/libgaim/protocols/qq/im.c =================================================================== --- trunk/libgaim/protocols/qq/im.c 2006-08-20 23:08:42 UTC (rev 16923) +++ trunk/libgaim/protocols/qq/im.c 2006-08-20 23:16:44 UTC (rev 16924) @@ -23,7 +23,6 @@ #include "conversation.h" #include "debug.h" #include "internal.h" -#include "cipher.h" #include "notify.h" #include "server.h" #include "util.h" @@ -209,27 +208,6 @@ } } -/* generate a md5 key using uid and session_key */ -gchar *_gen_session_md5(gint uid, guint8 *session_key) -{ - guint8 *src, md5_str[QQ_KEY_LENGTH], *cursor; - GaimCipher *cipher; - GaimCipherContext *context; - - src = g_newa(guint8, 20); - cursor = src; - create_packet_dw(src, &cursor, uid); - create_packet_data(src, &cursor, session_key, QQ_KEY_LENGTH); - - cipher = gaim_ciphers_find_cipher("md5"); - context = gaim_cipher_context_new(cipher, NULL); - gaim_cipher_context_append(context, src, 20); - gaim_cipher_context_digest(context, sizeof(md5_str), md5_str, NULL); - gaim_cipher_context_destroy(context); - - return g_memdup(md5_str, QQ_KEY_LENGTH); -} - /* when we receive a message, * we send an ACK which is the first 16 bytes of incoming packet */ static void _qq_send_packet_recv_im_ack(GaimConnection *gc, guint16 seq, guint8 *data) @@ -449,11 +427,11 @@ void qq_send_packet_im(GaimConnection *gc, guint32 to_uid, gchar *msg, gint type) { qq_data *qd; - guint8 *cursor, *raw_data, *send_im_tail; + guint8 *cursor, *raw_data, *send_im_tail, *md5; guint16 client_tag, normal_im_type; gint msg_len, raw_len, font_name_len, tail_len, bytes; time_t now; - gchar *md5, *msg_filtered; + gchar *msg_filtered; GData *attribs; gchar *font_size = NULL, *font_color = NULL, *font_name = NULL, *tmp; gboolean is_bold = FALSE, is_italic = FALSE, is_underline = FALSE; Modified: trunk/libgaim/protocols/qq/qq.c =================================================================== --- trunk/libgaim/protocols/qq/qq.c 2006-08-20 23:08:42 UTC (rev 16923) +++ trunk/libgaim/protocols/qq/qq.c 2006-08-20 23:16:44 UTC (rev 16924) @@ -511,10 +511,12 @@ g_string_free(info, TRUE); } +/* static void _qq_menu_search_or_add_permanent_group(GaimPluginAction *action) { gaim_roomlist_show_with_account(NULL); } +*/ /* static void _qq_menu_create_permanent_group(GaimPluginAction * action) Modified: trunk/libgaim/protocols/qq/send_core.h =================================================================== --- trunk/libgaim/protocols/qq/send_core.h 2006-08-20 23:08:42 UTC (rev 16923) +++ trunk/libgaim/protocols/qq/send_core.h 2006-08-20 23:16:44 UTC (rev 16924) @@ -33,5 +33,7 @@ gint qq_send_cmd(GaimConnection *gc, guint16 cmd, gboolean is_auto_seq, guint16 seq, gboolean need_ack, guint8 *data, gint len); gint _qq_send_packet(GaimConnection * gc, guint8 *buf, gint len, guint16 cmd); +gint _create_packet_head_seq(guint8 *buf, guint8 **cursor, + GaimConnection *gc, guint16 cmd, gboolean is_auto_seq, guint16 *seq); #endif Modified: trunk/libgaim/protocols/qq/send_file.c =================================================================== --- trunk/libgaim/protocols/qq/send_file.c 2006-08-20 23:08:42 UTC (rev 16923) +++ trunk/libgaim/protocols/qq/send_file.c 2006-08-20 23:16:44 UTC (rev 16924) @@ -166,6 +166,7 @@ } /* start file transfer process */ +/* static void _qq_xfer_send_start (GaimXfer *xfer) { GaimAccount *account; @@ -176,7 +177,9 @@ gc = gaim_account_get_connection(account); info = (ft_info *) xfer->data; } +*/ +/* static void _qq_xfer_send_ack (GaimXfer *xfer, const char *buffer, size_t len) { GaimAccount *account; @@ -186,10 +189,13 @@ gc = gaim_account_get_connection(account); qq_process_recv_file(gc, (guint8 *) buffer, len); } +*/ +/* static void _qq_xfer_recv_start(GaimXfer *xfer) { } +*/ static void _qq_xfer_end(GaimXfer *xfer) { @@ -269,15 +275,13 @@ } -extern gchar *_gen_session_md5(gint uid, guint8 *session_key); - /* fill in the common information of file transfer */ static gint _qq_create_packet_file_header (guint8 *raw_data, guint8 **cursor, guint32 to_uid, guint16 message_type, qq_data *qd, gboolean seq_ack) { gint bytes; time_t now; - gchar *md5; + guint8 *md5; guint16 seq; ft_info *info; @@ -934,6 +938,7 @@ gaim_xfer_request (xfer); } +/* static void qq_send_packet_request_key(GaimConnection *gc, guint8 key) { qq_send_cmd(gc, QQ_CMD_REQUEST_KEY, TRUE, 0, TRUE, &key, 1); @@ -942,3 +947,4 @@ static void qq_process_recv_request_key(GaimConnection *gc) { } +*/ Modified: trunk/libgaim/protocols/qq/send_file.h =================================================================== --- trunk/libgaim/protocols/qq/send_file.h 2006-08-20 23:08:42 UTC (rev 16923) +++ trunk/libgaim/protocols/qq/send_file.h 2006-08-20 23:16:44 UTC (rev 16924) @@ -58,4 +58,6 @@ void qq_send_file(GaimConnection *gc, const char *who, const char *file); void qq_get_conn_info(guint8 *data, guint8 **cursor, gint data_len, ft_info *info); gint qq_fill_conn_info(guint8 *data, guint8 **cursor, ft_info *info); +gssize _qq_xfer_write(const guint8 *buf, size_t len, GaimXfer *xfer); + #endif Modified: trunk/libgaim/protocols/qq/utils.c =================================================================== --- trunk/libgaim/protocols/qq/utils.c 2006-08-20 23:08:42 UTC (rev 16923) +++ trunk/libgaim/protocols/qq/utils.c 2006-08-20 23:16:44 UTC (rev 16924) @@ -20,8 +20,9 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "cipher.h" +#include "limits.h" #include "stdlib.h" -#include "limits.h" #include "string.h" #ifdef _WIN32 @@ -31,6 +32,7 @@ #include "char_conv.h" #include "debug.h" #include "prefs.h" +#include "qq.h" #include "util.h" #include "utils.h" @@ -109,6 +111,26 @@ return segments; } +/* generate a md5 key using uid and session_key */ +guint8 *_gen_session_md5(gint uid, guint8 *session_key) +{ + guint8 *src, md5_str[QQ_KEY_LENGTH]; + GaimCipher *cipher; + GaimCipherContext *context; + + src = g_newa(guint8, 20); + memcpy(src, &uid, 4); + memcpy(src, session_key, QQ_KEY_LENGTH); + + cipher = gaim_ciphers_find_cipher("md5"); + context = gaim_cipher_context_new(cipher, NULL); + gaim_cipher_context_append(context, src, 20); + gaim_cipher_context_digest(context, sizeof(md5_str), md5_str, NULL); + gaim_cipher_context_destroy(context); + + return g_memdup(md5_str, QQ_KEY_LENGTH); +} + /* given a four-byte ip data, convert it into a human readable ip string * the return needs to be freed */ gchar *gen_ip_str(guint8 *ip) Modified: trunk/libgaim/protocols/qq/utils.h =================================================================== --- trunk/libgaim/protocols/qq/utils.h 2006-08-20 23:08:42 UTC (rev 16923) +++ trunk/libgaim/protocols/qq/utils.h 2006-08-20 23:16:44 UTC (rev 16924) @@ -33,6 +33,7 @@ gint qq_string_to_dec_value(const gchar *str); gchar **split_data(guint8 *data, gint len, const gchar *delimit, gint expected_fields); +guint8 *_gen_session_md5(gint uid, guint8 *session_key); gchar *gen_ip_str(guint8 *ip); guint8 *str_ip_gen(gchar *str); gchar *uid_to_gaim_name(guint32 uid); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-08-21 07:19:31
|
Revision: 16947 Author: markhuetsch Date: 2006-08-21 00:17:40 -0700 (Mon, 21 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16947&view=rev Log Message: ----------- Added support for QQ faces. Thanks to cs...@gm... for the images and protocol update. Modified Paths: -------------- trunk/gtk/pixmaps/status/default/Makefile.am trunk/libgaim/protocols/qq/buddy_info.c trunk/libgaim/protocols/qq/buddy_list.c trunk/libgaim/protocols/qq/buddy_status.c trunk/libgaim/protocols/qq/buddy_status.h trunk/libgaim/protocols/qq/group_info.c trunk/libgaim/protocols/qq/im.c trunk/libgaim/protocols/qq/login_logout.c trunk/libgaim/protocols/qq/qq.c trunk/libgaim/protocols/qq/qq.h trunk/libgaim/protocols/qq/utils.c trunk/libgaim/protocols/qq/utils.h Added Paths: ----------- trunk/gtk/pixmaps/status/default/qq_1.png trunk/gtk/pixmaps/status/default/qq_10.png trunk/gtk/pixmaps/status/default/qq_100.png trunk/gtk/pixmaps/status/default/qq_11.png trunk/gtk/pixmaps/status/default/qq_12.png trunk/gtk/pixmaps/status/default/qq_13.png trunk/gtk/pixmaps/status/default/qq_14.png trunk/gtk/pixmaps/status/default/qq_15.png trunk/gtk/pixmaps/status/default/qq_16.png trunk/gtk/pixmaps/status/default/qq_17.png trunk/gtk/pixmaps/status/default/qq_18.png trunk/gtk/pixmaps/status/default/qq_19.png trunk/gtk/pixmaps/status/default/qq_2.png trunk/gtk/pixmaps/status/default/qq_20.png trunk/gtk/pixmaps/status/default/qq_21.png trunk/gtk/pixmaps/status/default/qq_22.png trunk/gtk/pixmaps/status/default/qq_23.png trunk/gtk/pixmaps/status/default/qq_24.png trunk/gtk/pixmaps/status/default/qq_25.png trunk/gtk/pixmaps/status/default/qq_26.png trunk/gtk/pixmaps/status/default/qq_27.png trunk/gtk/pixmaps/status/default/qq_28.png trunk/gtk/pixmaps/status/default/qq_29.png trunk/gtk/pixmaps/status/default/qq_3.png trunk/gtk/pixmaps/status/default/qq_30.png trunk/gtk/pixmaps/status/default/qq_31.png trunk/gtk/pixmaps/status/default/qq_32.png trunk/gtk/pixmaps/status/default/qq_33.png trunk/gtk/pixmaps/status/default/qq_34.png trunk/gtk/pixmaps/status/default/qq_35.png trunk/gtk/pixmaps/status/default/qq_36.png trunk/gtk/pixmaps/status/default/qq_37.png trunk/gtk/pixmaps/status/default/qq_38.png trunk/gtk/pixmaps/status/default/qq_39.png trunk/gtk/pixmaps/status/default/qq_4.png trunk/gtk/pixmaps/status/default/qq_40.png trunk/gtk/pixmaps/status/default/qq_41.png trunk/gtk/pixmaps/status/default/qq_42.png trunk/gtk/pixmaps/status/default/qq_43.png trunk/gtk/pixmaps/status/default/qq_44.png trunk/gtk/pixmaps/status/default/qq_45.png trunk/gtk/pixmaps/status/default/qq_46.png trunk/gtk/pixmaps/status/default/qq_47.png trunk/gtk/pixmaps/status/default/qq_48.png trunk/gtk/pixmaps/status/default/qq_49.png trunk/gtk/pixmaps/status/default/qq_5.png trunk/gtk/pixmaps/status/default/qq_50.png trunk/gtk/pixmaps/status/default/qq_51.png trunk/gtk/pixmaps/status/default/qq_52.png trunk/gtk/pixmaps/status/default/qq_53.png trunk/gtk/pixmaps/status/default/qq_54.png trunk/gtk/pixmaps/status/default/qq_55.png trunk/gtk/pixmaps/status/default/qq_56.png trunk/gtk/pixmaps/status/default/qq_57.png trunk/gtk/pixmaps/status/default/qq_58.png trunk/gtk/pixmaps/status/default/qq_59.png trunk/gtk/pixmaps/status/default/qq_6.png trunk/gtk/pixmaps/status/default/qq_60.png trunk/gtk/pixmaps/status/default/qq_61.png trunk/gtk/pixmaps/status/default/qq_62.png trunk/gtk/pixmaps/status/default/qq_63.png trunk/gtk/pixmaps/status/default/qq_64.png trunk/gtk/pixmaps/status/default/qq_65.png trunk/gtk/pixmaps/status/default/qq_66.png trunk/gtk/pixmaps/status/default/qq_67.png trunk/gtk/pixmaps/status/default/qq_68.png trunk/gtk/pixmaps/status/default/qq_69.png trunk/gtk/pixmaps/status/default/qq_7.png trunk/gtk/pixmaps/status/default/qq_70.png trunk/gtk/pixmaps/status/default/qq_71.png trunk/gtk/pixmaps/status/default/qq_72.png trunk/gtk/pixmaps/status/default/qq_73.png trunk/gtk/pixmaps/status/default/qq_74.png trunk/gtk/pixmaps/status/default/qq_75.png trunk/gtk/pixmaps/status/default/qq_76.png trunk/gtk/pixmaps/status/default/qq_77.png trunk/gtk/pixmaps/status/default/qq_78.png trunk/gtk/pixmaps/status/default/qq_79.png trunk/gtk/pixmaps/status/default/qq_8.png trunk/gtk/pixmaps/status/default/qq_80.png trunk/gtk/pixmaps/status/default/qq_81.png trunk/gtk/pixmaps/status/default/qq_82.png trunk/gtk/pixmaps/status/default/qq_83.png trunk/gtk/pixmaps/status/default/qq_84.png trunk/gtk/pixmaps/status/default/qq_85.png trunk/gtk/pixmaps/status/default/qq_86.png trunk/gtk/pixmaps/status/default/qq_87.png trunk/gtk/pixmaps/status/default/qq_88.png trunk/gtk/pixmaps/status/default/qq_89.png trunk/gtk/pixmaps/status/default/qq_9.png trunk/gtk/pixmaps/status/default/qq_90.png trunk/gtk/pixmaps/status/default/qq_91.png trunk/gtk/pixmaps/status/default/qq_92.png trunk/gtk/pixmaps/status/default/qq_93.png trunk/gtk/pixmaps/status/default/qq_94.png trunk/gtk/pixmaps/status/default/qq_95.png trunk/gtk/pixmaps/status/default/qq_96.png trunk/gtk/pixmaps/status/default/qq_97.png trunk/gtk/pixmaps/status/default/qq_98.png trunk/gtk/pixmaps/status/default/qq_99.png Modified: trunk/gtk/pixmaps/status/default/Makefile.am =================================================================== --- trunk/gtk/pixmaps/status/default/Makefile.am 2006-08-21 06:06:54 UTC (rev 16946) +++ trunk/gtk/pixmaps/status/default/Makefile.am 2006-08-21 07:17:40 UTC (rev 16947) @@ -42,6 +42,108 @@ yahoo.png \ zephyr.png +QQ_FACES = \ + qq_1.png \ + qq_2.png \ + qq_3.png \ + qq_4.png \ + qq_5.png \ + qq_6.png \ + qq_7.png \ + qq_8.png \ + qq_9.png \ + qq_10.png \ + qq_11.png \ + qq_12.png \ + qq_13.png \ + qq_14.png \ + qq_15.png \ + qq_16.png \ + qq_17.png \ + qq_18.png \ + qq_19.png \ + qq_20.png \ + qq_21.png \ + qq_22.png \ + qq_23.png \ + qq_24.png \ + qq_25.png \ + qq_26.png \ + qq_27.png \ + qq_28.png \ + qq_29.png \ + qq_30.png \ + qq_31.png \ + qq_32.png \ + qq_33.png \ + qq_34.png \ + qq_35.png \ + qq_36.png \ + qq_37.png \ + qq_38.png \ + qq_39.png \ + qq_40.png \ + qq_41.png \ + qq_42.png \ + qq_43.png \ + qq_44.png \ + qq_45.png \ + qq_46.png \ + qq_47.png \ + qq_48.png \ + qq_49.png \ + qq_50.png \ + qq_51.png \ + qq_52.png \ + qq_53.png \ + qq_54.png \ + qq_55.png \ + qq_56.png \ + qq_57.png \ + qq_58.png \ + qq_59.png \ + qq_60.png \ + qq_61.png \ + qq_62.png \ + qq_63.png \ + qq_64.png \ + qq_65.png \ + qq_66.png \ + qq_67.png \ + qq_68.png \ + qq_69.png \ + qq_70.png \ + qq_71.png \ + qq_72.png \ + qq_73.png \ + qq_74.png \ + qq_75.png \ + qq_76.png \ + qq_77.png \ + qq_78.png \ + qq_79.png \ + qq_80.png \ + qq_81.png \ + qq_82.png \ + qq_83.png \ + qq_84.png \ + qq_85.png \ + qq_86.png \ + qq_87.png \ + qq_88.png \ + qq_89.png \ + qq_90.png \ + qq_91.png \ + qq_92.png \ + qq_93.png \ + qq_94.png \ + qq_95.png \ + qq_96.png \ + qq_97.png \ + qq_98.png \ + qq_99.png \ + qq_100.png + gaimstatuspixdir = $(datadir)/pixmaps/gaim/status/default -gaimstatuspix_DATA = $(EXTRA_DIST) +gaimstatuspix_DATA = $(EXTRA_DIST) $(QQ_FACES) Added: trunk/gtk/pixmaps/status/default/qq_1.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_1.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_10.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_10.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_100.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_100.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_11.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_11.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_12.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_12.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_13.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_13.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_14.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_14.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_15.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_15.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_16.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_16.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_17.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_17.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_18.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_18.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_19.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_19.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_2.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_2.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_20.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_20.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_21.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_21.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_22.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_22.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_23.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_23.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_24.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_24.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_25.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_25.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_26.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_26.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_27.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_27.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_28.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_28.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_29.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_29.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_3.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_3.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_30.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_30.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_31.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_31.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_32.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_32.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_33.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_33.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_34.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_34.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_35.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_35.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_36.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_36.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_37.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_37.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_38.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_38.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_39.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_39.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_4.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_4.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_40.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_40.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_41.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_41.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_42.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_42.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_43.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_43.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_44.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_44.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_45.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_45.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_46.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_46.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_47.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_47.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_48.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_48.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_49.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_49.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_5.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_5.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_50.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_50.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_51.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_51.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_52.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_52.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_53.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_53.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_54.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_54.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_55.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_55.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_56.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_56.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_57.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_57.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_58.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_58.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_59.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_59.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_6.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_6.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_60.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_60.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_61.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_61.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_62.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_62.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_63.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_63.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_64.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_64.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_65.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_65.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_66.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_66.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_67.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_67.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_68.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_68.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_69.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_69.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_7.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_7.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_70.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_70.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_71.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_71.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_72.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_72.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_73.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_73.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_74.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_74.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_75.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_75.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_76.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_76.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_77.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_77.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_78.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_78.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_79.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_79.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_8.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_8.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_80.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_80.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_81.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_81.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_82.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_82.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_83.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_83.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_84.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_84.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_85.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_85.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_86.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_86.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_87.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_87.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_88.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_88.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_89.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_89.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_9.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_9.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_90.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_90.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_91.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_91.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_92.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_92.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_93.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_93.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_94.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_94.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_95.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_95.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_96.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_96.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_97.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_97.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_98.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_98.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/gtk/pixmaps/status/default/qq_99.png =================================================================== (Binary files differ) Property changes on: trunk/gtk/pixmaps/status/default/qq_99.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Modified: trunk/libgaim/protocols/qq/buddy_info.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_info.c 2006-08-21 06:06:54 UTC (rev 16946) +++ trunk/libgaim/protocols/qq/buddy_info.c 2006-08-21 07:17:40 UTC (rev 16947) @@ -282,7 +282,7 @@ /************************ packets and UI management **************************/ /* send a packet to get detailed information of uid */ -void qq_send_packet_get_info(GaimConnection * gc, guint32 uid, gboolean show_window) +void qq_send_packet_get_info(GaimConnection *gc, guint32 uid, gboolean show_window) { qq_data *qd; gchar *uid_str; @@ -597,6 +597,14 @@ return; info = (contact_info *) segments; + if (qd->modifying_face && strtol(info->face, NULL, 10) != qd->my_icon) { + gchar *icon = g_strdup_printf("%i", qd->my_icon); + qd->modifying_face = FALSE; + memcpy(info->face, icon, 2); + qq_send_packet_modify_info(gc, info); + g_free(icon); + } + qq_refresh_buddy_and_myself(info, gc); query_list = qd->info_query; Modified: trunk/libgaim/protocols/qq/buddy_list.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_list.c 2006-08-21 06:06:54 UTC (rev 16946) +++ trunk/libgaim/protocols/qq/buddy_list.c 2006-08-21 07:17:40 UTC (rev 16947) @@ -255,7 +255,7 @@ qq_buddy *q_bud; gint len, bytes, bytes_expected, i; guint16 position, unknown; - guint8 *data, *cursor, bar, pascal_len; + guint8 *data, *cursor, pascal_len; gchar *name; GaimBuddy *b; @@ -276,10 +276,8 @@ bytes = 0; /* 000-003: uid */ bytes += read_packet_dw(data, &cursor, len, &q_bud->uid); - /* 004-004: 0xff if buddy is self, 0x00 otherwise */ - bytes += read_packet_b(data, &cursor, len, &bar); - /* 005-005: icon index (1-255) */ - bytes += read_packet_b(data, &cursor, len, &q_bud->icon); + /* 004-005: icon index (1-255) */ + bytes += read_packet_w(data, &cursor, len, &q_bud->icon); /* 006-006: age */ bytes += read_packet_b(data, &cursor, len, &q_bud->age); /* 007-007: gender */ Modified: trunk/libgaim/protocols/qq/buddy_status.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_status.c 2006-08-21 06:06:54 UTC (rev 16946) +++ trunk/libgaim/protocols/qq/buddy_status.c 2006-08-21 07:17:40 UTC (rev 16947) @@ -120,20 +120,22 @@ return FALSE; } -/* the icon suffix is detemined by status - * although QQ server may return the right icon, I set it here myself */ -gchar get_suffix_from_status(guint8 status) +/* The QQ client seems to use a separate icon for each + * face/status combo, but we only use one and let Gaim + * handle the rest. We need to use this function to report + * the correct icon file back to the server. */ +gint get_icon_offset_from_self_status(guint8 status) { switch (status) { - case QQ_BUDDY_ONLINE_NORMAL: - return QQ_ICON_SUFFIX_NORMAL; - case QQ_BUDDY_ONLINE_AWAY: - return QQ_ICON_SUFFIX_AWAY; - case QQ_BUDDY_ONLINE_INVISIBLE: - case QQ_BUDDY_ONLINE_OFFLINE: - return QQ_ICON_SUFFIX_OFFLINE; + case QQ_SELF_STATUS_AVAILABLE: + return 0; + case QQ_SELF_STATUS_AWAY: + case QQ_SELF_STATUS_CUSTOM: + return 1; + case QQ_SELF_STATUS_INVISIBLE: + return 2; default: - return QQ_ICON_SUFFIX_DEFAULT; + return 2; } } Modified: trunk/libgaim/protocols/qq/buddy_status.h =================================================================== --- trunk/libgaim/protocols/qq/buddy_status.h 2006-08-21 06:06:54 UTC (rev 16946) +++ trunk/libgaim/protocols/qq/buddy_status.h 2006-08-21 07:17:40 UTC (rev 16947) @@ -59,7 +59,7 @@ gboolean is_online(guint8 status); gint qq_buddy_status_read(guint8 *data, guint8 **cursor, gint len, qq_buddy_status *s); -gchar get_suffix_from_status(guint8 status); +gint get_icon_offset_from_self_status(guint8 status); void qq_send_packet_change_status(GaimConnection *gc); Modified: trunk/libgaim/protocols/qq/group_info.c =================================================================== --- trunk/libgaim/protocols/qq/group_info.c 2006-08-21 06:06:54 UTC (rev 16946) +++ trunk/libgaim/protocols/qq/group_info.c 2006-08-21 07:17:40 UTC (rev 16947) @@ -283,7 +283,6 @@ { guint32 internal_group_id, member_uid; guint16 unknown; - guint8 bar; gint pascal_len, i; qq_group *group; qq_buddy *member; @@ -305,8 +304,7 @@ g_return_if_fail(member != NULL); i++; - read_packet_b(data, cursor, len, &bar); - read_packet_b(data, cursor, len, &(member->icon)); + read_packet_w(data, cursor, len, &(member->icon)); read_packet_b(data, cursor, len, &(member->age)); read_packet_b(data, cursor, len, &(member->gender)); pascal_len = convert_as_pascal_string(*cursor, &(member->nickname), QQ_CHARSET_DEFAULT); Modified: trunk/libgaim/protocols/qq/im.c =================================================================== --- trunk/libgaim/protocols/qq/im.c 2006-08-21 06:06:54 UTC (rev 16946) +++ trunk/libgaim/protocols/qq/im.c 2006-08-21 07:17:40 UTC (rev 16947) @@ -87,8 +87,7 @@ /* now comes the part for text only */ guint16 msg_seq; guint32 send_time; - guint8 unknown1; - guint8 sender_icon; + guint16 sender_icon; guint8 unknown2[3]; guint8 is_there_font_attr; guint8 unknown3[4]; @@ -268,8 +267,7 @@ /* push data into im_text */ read_packet_w(data, cursor, len, &(im_text->msg_seq)); read_packet_dw(data, cursor, len, &(im_text->send_time)); - read_packet_b(data, cursor, len, &(im_text->unknown1)); - read_packet_b(data, cursor, len, &(im_text->sender_icon)); + read_packet_w(data, cursor, len, &(im_text->sender_icon)); read_packet_data(data, cursor, len, (guint8 *) & (im_text->unknown2), 3); read_packet_b(data, cursor, len, &(im_text->is_there_font_attr)); /** @@ -515,10 +513,8 @@ bytes += create_packet_w(raw_data, &cursor, qd->send_seq); /* 038-041: send time */ bytes += create_packet_dw(raw_data, &cursor, (guint32) now); - /* 042-042: always 0x00 */ - bytes += create_packet_b(raw_data, &cursor, 0x00); - /* 043-043: sender icon */ - bytes += create_packet_b(raw_data, &cursor, qd->my_icon); + /* 042-043: sender icon */ + bytes += create_packet_w(raw_data, &cursor, qd->my_icon); /* 044-046: always 0x00 */ bytes += create_packet_w(raw_data, &cursor, 0x0000); bytes += create_packet_b(raw_data, &cursor, 0x00); Modified: trunk/libgaim/protocols/qq/login_logout.c =================================================================== --- trunk/libgaim/protocols/qq/login_logout.c 2006-08-21 06:06:54 UTC (rev 16946) +++ trunk/libgaim/protocols/qq/login_logout.c 2006-08-21 07:17:40 UTC (rev 16947) @@ -229,6 +229,7 @@ qq_group_init(gc); /* Now goes on updating my icon/nickname, not showing info_window */ + qd->modifying_face = FALSE; qq_send_packet_get_info(gc, qd->uid, FALSE); /* change my status manually, even server may broadcast my online */ qd->status = (qd->login_mode == QQ_LOGIN_MODE_HIDDEN) ? QQ_SELF_STATUS_INVISIBLE : QQ_SELF_STATUS_AVAILABLE; Modified: trunk/libgaim/protocols/qq/qq.c =================================================================== --- trunk/libgaim/protocols/qq/qq.c 2006-08-21 06:06:54 UTC (rev 16946) +++ trunk/libgaim/protocols/qq/qq.c 2006-08-21 07:17:40 UTC (rev 16947) @@ -147,27 +147,17 @@ /* returns the icon name for a buddy or protocol */ static const gchar *_qq_list_icon(GaimAccount *a, GaimBuddy *b) { - /* XXX temp commented out until we figure out what to do with - * status icons */ - /* gchar *filename; qq_buddy *q_bud; - gchar icon_suffix; - */ /* do not use g_return_val_if_fail, as it is not assertion */ if (b == NULL || b->proto_data == NULL) return "qq"; - /* q_bud = (qq_buddy *) b->proto_data; + filename = get_icon_name(q_bud->icon / 3 + 1); - icon_suffix = get_suffix_from_status(q_bud->status); - filename = get_icon_name(q_bud->icon / 3 + 1, icon_suffix); - return filename; - */ - return "qq"; } @@ -282,17 +272,20 @@ qq_buddy *q_bud = b->proto_data; const char *emblems[4] = { NULL, NULL, NULL, NULL }; - int i = 0; + int i = 1; if (q_bud == NULL) { emblems[0] = "offline"; } else { + /* TODO the wireless icon is a bit too big to look good with QQ faces */ + if (q_bud->status == QQ_BUDDY_ONLINE_AWAY || q_bud->status == QQ_SELF_STATUS_AWAY) + emblems[i++] = "away"; if (q_bud->comm_flag & QQ_COMM_FLAG_QQ_MEMBER) emblems[i++] = "qq_member"; if (q_bud->comm_flag & QQ_COMM_FLAG_BIND_MOBILE) emblems[i++] = "wireless"; if (q_bud->comm_flag & QQ_COMM_FLAG_VIDEO) - emblems[i++] = "video"; + emblems[i%4] = "video"; } @@ -437,6 +430,85 @@ qq_prepare_modify_info(gc); } +static void _qq_change_face_cb(GaimConnection *gc, GaimRequestFields *fields) +{ + qq_data *qd; + GaimRequestField *field; + gint suffix; + + g_return_if_fail(gc != NULL && gc->proto_data != NULL); + qd = (qq_data *) gc->proto_data; + + field = gaim_request_fields_get_field(fields, "face_num"); + suffix = get_icon_offset_from_self_status(qd->status); + qd->my_icon = gaim_request_field_choice_get_value(field) * 3 + suffix; + qd->modifying_face = TRUE; + qq_send_packet_get_info(gc, qd->uid, FALSE); +} + +static void _qq_add_face_choice(GaimRequestFieldGroup *group, gint face_num) +{ + GaimRequestField *field; + struct stat img_stat; + FILE *file; + gchar *filename, *prefix, *img_data, *face; + gint size; + + face = g_strdup_printf("qq_%i.png", face_num); + prefix = br_extract_prefix(DATADIR); + filename = g_build_filename(prefix, "share","pixmaps", + "gaim","status","default", face, NULL); + g_free(face); + face = g_strdup_printf("%i", face_num); + stat(filename, &img_stat); + file = g_fopen(filename, "rb"); + if (file) { + img_data = g_malloc(img_stat.st_size); + size = fread(img_data, 1, img_stat.st_size, file); + + field = gaim_request_field_image_new(face, face, img_data, size); + gaim_request_field_group_add_field(group, field); + + g_free(img_data); + fclose(file); + } + g_free(face); + g_free(prefix); +} + +static void _qq_menu_change_face(GaimPluginAction *action) +{ + GaimConnection *gc = (GaimConnection *) action->context; + qq_data *qd = (qq_data *) gc->proto_data; + GaimRequestFields *fields; + GaimRequestFieldGroup *group; + GaimRequestField *field; + gchar *label; + gint i; + + fields = gaim_request_fields_new(); + group = gaim_request_field_group_new(_("Selection")); + gaim_request_fields_add_group(fields, group); + field = gaim_request_field_choice_new("face_num", + _("Select a number"), qd->my_icon / 3); + for(i = 1; i <= QQ_FACES; i++) { + label = g_strdup_printf("%i", i); + gaim_request_field_choice_add(field, label); + g_free(label); + } + gaim_request_field_group_add_field(group, field); + group = gaim_request_field_group_new(_("Faces")); + gaim_request_fields_add_group(fields, group); + for(i = 1; i <= QQ_FACES; i++) + _qq_add_face_choice(group, i); + + gaim_request_fields(gc, _("Change Your QQ Face"), + _("Change Face"), NULL, fields, + _("Update"), G_CALLBACK(_qq_change_face_cb), + _("Cancel"), NULL, + gc); +} + static void _qq_menu_change_password(GaimPluginAction *action) { gaim_notify_uri(NULL, "https://password.qq.com"); @@ -795,6 +867,9 @@ act = gaim_plugin_action_new(_("Modify My Information"), _qq_menu_modify_my_info); m = g_list_append(m, act); + act = gaim_plugin_action_new(_("Change My Face"), _qq_menu_change_face); + m = g_list_append(m, act); + act = gaim_plugin_action_new(_("Change Password"), _qq_menu_change_password); m = g_list_append(m, act); Modified: trunk/libgaim/protocols/qq/qq.h =================================================================== --- trunk/libgaim/protocols/qq/qq.h 2006-08-21 06:06:54 UTC (rev 16946) +++ trunk/libgaim/protocols/qq/qq.h 2006-08-21 07:17:40 UTC (rev 16947) @@ -29,6 +29,7 @@ #include "proxy.h" #include "roomlist.h" +#define QQ_FACES 100 #define QQ_KEY_LENGTH 16 #define QQ_DEBUG 1 /* whether we are doing DEBUG */ @@ -37,7 +38,7 @@ struct _qq_buddy { guint32 uid; - guint8 icon; /* index: 01 - 85 */ + guint16 icon; /* index: 01 - 85 */ guint8 age; guint8 gender; gchar *nickname; @@ -83,7 +84,7 @@ /* get from keep_alive packet */ gchar *my_ip; /* my ip address detected by server */ guint16 my_port; /* my port detected by server */ - guint8 my_icon; /* my icon index */ + guint16 my_icon; /* my icon index */ guint32 all_online; /* the number of online QQ users */ time_t last_get_online; /* last time send get_friends_online packet */ @@ -103,7 +104,9 @@ GList *add_buddy_request; GQueue *before_login_packets; + /* TODO is there a better way of handling these? */ gboolean modifying_info; + gboolean modifying_face; }; void qq_function_not_implemented(GaimConnection *gc); Modified: trunk/libgaim/protocols/qq/utils.c =================================================================== --- trunk/libgaim/protocols/qq/utils.c 2006-08-21 06:06:54 UTC (rev 16946) +++ trunk/libgaim/protocols/qq/utils.c 2006-08-21 07:17:40 UTC (rev 16947) @@ -159,9 +159,9 @@ /* return the QQ icon file name * the return needs to be freed */ -gchar *get_icon_name(gint set, gint suffix) +gchar *get_icon_name(gint set) { - return g_strdup_printf("qq_%d-%d", set, suffix); + return g_strdup_printf("qq_%d", set); } /* convert a QQ UID to a unique name of GAIM Modified: trunk/libgaim/protocols/qq/utils.h =================================================================== --- trunk/libgaim/protocols/qq/utils.h 2006-08-21 06:06:54 UTC (rev 16946) +++ trunk/libgaim/protocols/qq/utils.h 2006-08-21 07:17:40 UTC (rev 16947) @@ -40,7 +40,7 @@ guint32 gaim_name_to_uid(const gchar *name); -gchar *get_icon_name(gint set, gint suffix); +gchar *get_icon_name(gint set); void try_dump_as_gbk(const guint8 *const data, gint len); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ma...@us...> - 2006-08-22 05:52:11
|
Revision: 16972 Author: marv_sf Date: 2006-08-21 22:52:03 -0700 (Mon, 21 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16972&view=rev Log Message: ----------- iirc, you shouldn't call the functions in prefix.h directly as they might not exist. also add DATADIR to Makefile.am so EvilDennisR can find something else to complain about. Modified Paths: -------------- trunk/libgaim/protocols/qq/Makefile.am trunk/libgaim/protocols/qq/qq.c Modified: trunk/libgaim/protocols/qq/Makefile.am =================================================================== --- trunk/libgaim/protocols/qq/Makefile.am 2006-08-22 05:30:30 UTC (rev 16971) +++ trunk/libgaim/protocols/qq/Makefile.am 2006-08-22 05:52:03 UTC (rev 16972) @@ -92,7 +92,8 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/libgaim \ - -DVERSION=\"$(VERSION)\" \ - $(DEBUG_CFLAGS) \ - $(GLIB_CFLAGS) \ + -DVERSION=\"$(VERSION)\" \ + -DDATADIR=\"$(datadir)\" \ + $(DEBUG_CFLAGS) \ + $(GLIB_CFLAGS) \ $(GAIM_CFLAGS) Modified: trunk/libgaim/protocols/qq/qq.c =================================================================== --- trunk/libgaim/protocols/qq/qq.c 2006-08-22 05:30:30 UTC (rev 16971) +++ trunk/libgaim/protocols/qq/qq.c 2006-08-22 05:52:03 UTC (rev 16972) @@ -431,12 +431,11 @@ GaimRequestField *field; struct stat img_stat; FILE *file; - gchar *filename, *prefix, *img_data, *face; + gchar *filename, *img_data, *face; gint size; face = g_strdup_printf("qq_%i.png", face_num); - prefix = br_extract_prefix(DATADIR); - filename = g_build_filename(prefix, "share","pixmaps", + filename = g_build_filename(DATADIR, "pixmaps", "gaim","status","default", face, NULL); g_free(face); face = g_strdup_printf("%i", face_num); @@ -453,7 +452,6 @@ fclose(file); } g_free(face); - g_free(prefix); } /* Change your status icon (face) */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dat...@us...> - 2006-08-22 18:10:53
|
Revision: 16983 Author: datallah Date: 2006-08-22 11:10:43 -0700 (Tue, 22 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16983&view=rev Log Message: ----------- Restructure updates for some makefiles that are not used by default and may not fully work. Remove gtk import stuff from oscar Makefile.mingw Modified Paths: -------------- trunk/libgaim/protocols/bonjour/Makefile.mingw trunk/libgaim/protocols/oscar/Makefile.mingw trunk/libgaim/protocols/qq/Makefile.mingw trunk/libgaim/protocols/toc/Makefile.mingw trunk/libgaim/protocols/zephyr/Makefile.mingw Modified: trunk/libgaim/protocols/bonjour/Makefile.mingw =================================================================== --- trunk/libgaim/protocols/bonjour/Makefile.mingw 2006-08-22 17:02:20 UTC (rev 16982) +++ trunk/libgaim/protocols/bonjour/Makefile.mingw 2006-08-22 18:10:43 UTC (rev 16983) @@ -8,9 +8,9 @@ # PATHS # -INCLUDE_DIR := . GTK_TOP := ../../../../win32-dev/gtk_2_0 GAIM_TOP := ../../.. +LIBGAIM_TOP := ../.. BONJOUR_ROOT := . GAIM_INSTALL_DIR := $(GAIM_TOP)/win32-install-dir HOWL_DIR := $(GAIM_TOP)/../win32-dev/howl-1.0.0 @@ -29,7 +29,7 @@ DEFINES = -# Static or Plugin... +# Static or Plugin... ifeq ($(TYPE),STATIC) DEFINES += -DSTATIC DLL_INSTALL_DIR = $(GAIM_INSTALL_DIR) @@ -44,7 +44,7 @@ ## INCLUDE MAKEFILES ## -include $(GAIM_TOP)/src/win32/global.mak +include $(LIBGAIM_TOP)/win32/global.mak ## ## INCLUDE PATHS @@ -52,21 +52,17 @@ INCLUDE_PATHS += -I$(BONJOUR_ROOT) \ -I$(GTK_TOP)/include \ - -I$(GTK_TOP)/include/gtk-2.0 \ -I$(GTK_TOP)/include/glib-2.0 \ - -I$(GTK_TOP)/include/pango-1.0 \ - -I$(GTK_TOP)/include/atk-1.0 \ -I$(GTK_TOP)/lib/glib-2.0/include \ - -I$(GTK_TOP)/lib/gtk-2.0/include \ - -I$(HOWL_DIR)/include/howl \ - -I$(GAIM_TOP)/src \ - -I$(GAIM_TOP)/src/win32 \ + -I$(HOWL_DIR)/include \ + -I$(LIBGAIM_TOP) \ + -I$(LIBGAIM_TOP)/win32 \ -I$(GAIM_TOP) LIB_PATHS = -L$(GTK_TOP)/lib \ -L$(HOWL_DIR)/lib \ - -L$(GAIM_TOP)/src + -L$(LIBGAIM_TOP) ## @@ -86,11 +82,8 @@ ## LIBRARIES ## -LIBS = -lgtk-win32-2.0 \ +LIBS = \ -lglib-2.0 \ - -lgdk-win32-2.0 \ - -lgmodule-2.0 \ - -lgobject-2.0 \ -lws2_32 \ -lintl \ -lhowl \ @@ -123,15 +116,15 @@ ## BUILD Dependencies ## -$(GAIM_TOP)/src/gaim.lib: - $(MAKE) -C $(GAIM_TOP)/src -f Makefile.mingw gaim.lib +$(LIBGAIM_TOP)/libgaim.dll.a: + $(MAKE) -C $(LIBGAIM_TOP) -f Makefile.mingw libgaim.dll.a ## ## BUILD DLL ## -$(TARGET).dll: $(OBJECTS) $(GAIM_TOP)/src/gaim.lib - $(CC) -shared $(OBJECTS) $(LIB_PATHS) $(LIBS) $(DLL_LD_FLAGS) -Wl,--out-implib,$(TARGET).lib -o $(TARGET).dll +$(TARGET).dll: $(OBJECTS) $(LIBGAIM_TOP)/libgaim.dll.a + $(CC) -shared $(OBJECTS) $(LIB_PATHS) $(LIBS) $(DLL_LD_FLAGS) -o $(TARGET).dll ## ## CLEAN RULES @@ -140,4 +133,3 @@ clean: rm -rf *.o rm -rf $(TARGET).dll - rm -rf $(TARGET).lib Modified: trunk/libgaim/protocols/oscar/Makefile.mingw =================================================================== --- trunk/libgaim/protocols/oscar/Makefile.mingw 2006-08-22 17:02:20 UTC (rev 16982) +++ trunk/libgaim/protocols/oscar/Makefile.mingw 2006-08-22 18:10:43 UTC (rev 16983) @@ -49,12 +49,8 @@ INCLUDE_PATHS += -I$(OSCAR_ROOT) \ -I$(GTK_TOP)/include \ - -I$(GTK_TOP)/include/gtk-2.0 \ -I$(GTK_TOP)/include/glib-2.0 \ - -I$(GTK_TOP)/include/pango-1.0 \ - -I$(GTK_TOP)/include/atk-1.0 \ -I$(GTK_TOP)/lib/glib-2.0/include \ - -I$(GTK_TOP)/lib/gtk-2.0/include \ -I$(LIBGAIM_TOP) \ -I$(LIBGAIM_TOP)/win32 \ -I$(GAIM_TOP) Modified: trunk/libgaim/protocols/qq/Makefile.mingw =================================================================== --- trunk/libgaim/protocols/qq/Makefile.mingw 2006-08-22 17:02:20 UTC (rev 16982) +++ trunk/libgaim/protocols/qq/Makefile.mingw 2006-08-22 18:10:43 UTC (rev 16983) @@ -12,6 +12,7 @@ OPENQ_TOP := ../ GTK_TOP := ../../../../win32-dev/gtk_2_0 GAIM_TOP := ../../.. +LIBGAIM_TOP := ../.. OPENQ_ROOT := . GAIM_INSTALL_DIR := $(GAIM_TOP)/win32-install-dir @@ -31,7 +32,7 @@ DEFINES = -DOPENQ_VERSION=\"$(OPENQ_VERSION)\" -# Static or Plugin... +# Static or Plugin... ifeq ($(TYPE),STATIC) DEFINES += -DSTATIC DLL_INSTALL_DIR = $(GAIM_INSTALL_DIR) @@ -46,7 +47,7 @@ ## INCLUDE MAKEFILES ## -include $(GAIM_TOP)/src/win32/global.mak +include $(LIBGAIM_TOP)/win32/global.mak ## ## INCLUDE PATHS @@ -55,19 +56,15 @@ INCLUDE_PATHS += \ -I$(OPENQ_ROOT) \ -I$(GTK_TOP)/include \ - -I$(GTK_TOP)/include/gtk-2.0 \ -I$(GTK_TOP)/include/glib-2.0 \ - -I$(GTK_TOP)/include/pango-1.0 \ - -I$(GTK_TOP)/include/atk-1.0 \ -I$(GTK_TOP)/lib/glib-2.0/include \ - -I$(GTK_TOP)/lib/gtk-2.0/include \ - -I$(GAIM_TOP)/src \ - -I$(GAIM_TOP)/src/win32 \ + -I$(LIBGAIM_TOP) \ + -I$(LIBGAIM_TOP)/win32 \ -I$(GAIM_TOP) LIB_PATHS = \ -L$(GTK_TOP)/lib \ - -L$(GAIM_TOP)/src + -L$(LIBGAIM_TOP) ## ## SOURCES, OBJECTS @@ -116,12 +113,7 @@ ## LIBS = \ - -lgtk-win32-2.0 \ -lglib-2.0 \ - -lgdk-win32-2.0 \ - -lgdk_pixbuf-2.0 \ - -lgmodule-2.0 \ - -lgobject-2.0 \ -lws2_32 \ -lintl \ -lgaim @@ -152,14 +144,14 @@ ## BUILD Dependencies ## -$(GAIM_TOP)/src/gaim.lib: - $(MAKE) -C $(GAIM_TOP)/src -f Makefile.mingw gaim.lib +$(LIBGAIM_TOP)/libgaim.dll.a: + $(MAKE) -C $(LIBGAIM_TOP) -f Makefile.mingw libgaim.dll.a ## ## BUILD DLL ## -$(TARGET).dll: $(OBJECTS) $(GAIM_TOP)/src/gaim.lib +$(TARGET).dll: $(OBJECTS) $(LIBGAIM_TOP)/libgaim.dll.a $(CC) -shared $(OBJECTS) $(LIB_PATHS) $(LIBS) $(DLL_LD_FLAGS) -o $(TARGET).dll ## @@ -169,5 +161,4 @@ clean: rm -rf *.o rm -rf $(TARGET).dll - rm -rf $(TARGET).lib Modified: trunk/libgaim/protocols/toc/Makefile.mingw =================================================================== --- trunk/libgaim/protocols/toc/Makefile.mingw 2006-08-22 17:02:20 UTC (rev 16982) +++ trunk/libgaim/protocols/toc/Makefile.mingw 2006-08-22 18:10:43 UTC (rev 16983) @@ -11,6 +11,7 @@ INCLUDE_DIR := . GTK_TOP := ../../../../win32-dev/gtk_2_0 GAIM_TOP := ../../.. +LIBGAIM_TOP := ../.. TOC_ROOT := . GAIM_INSTALL_DIR := $(GAIM_TOP)/win32-install-dir @@ -26,7 +27,7 @@ DEFINES = -# Static or Plugin... +# Static or Plugin... ifeq ($(TYPE),STATIC) DEFINES += -DSTATIC DLL_INSTALL_DIR = $(GAIM_INSTALL_DIR) @@ -41,7 +42,7 @@ ## INCLUDE MAKEFILES ## -include $(GAIM_TOP)/src/win32/global.mak +include $(LIBGAIM_TOP)/win32/global.mak ## ## INCLUDE PATHS @@ -49,19 +50,15 @@ INCLUDE_PATHS += -I$(TOC_ROOT) \ -I$(GTK_TOP)/include \ - -I$(GTK_TOP)/include/gtk-2.0 \ -I$(GTK_TOP)/include/glib-2.0 \ - -I$(GTK_TOP)/include/pango-1.0 \ - -I$(GTK_TOP)/include/atk-1.0 \ -I$(GTK_TOP)/lib/glib-2.0/include \ - -I$(GTK_TOP)/lib/gtk-2.0/include \ - -I$(GAIM_TOP)/src \ - -I$(GAIM_TOP)/src/win32 \ + -I$(LIBGAIM_TOP) \ + -I$(LIBGAIM_TOP)/win32 \ -I$(GAIM_TOP) LIB_PATHS = -L$(GTK_TOP)/lib \ - -L$(GAIM_TOP)/src + -L$(LIBGAIM_TOP) ## @@ -78,11 +75,8 @@ ## LIBRARIES ## -LIBS = -lgtk-win32-2.0 \ +LIBS = \ -lglib-2.0 \ - -lgdk-win32-2.0 \ - -lgmodule-2.0 \ - -lgobject-2.0 \ -lws2_32 \ -lintl \ -lgaim @@ -112,15 +106,15 @@ ## BUILD Dependencies ## -$(GAIM_TOP)/src/gaim.lib: - $(MAKE) -C $(GAIM_TOP)/src -f Makefile.mingw gaim.lib +$(LIBGAIM_TOP)/libgaim.dll.a: + $(MAKE) -C $(LIBGAIM_TOP) -f Makefile.mingw libgaim.dll.a ## ## BUILD DLL ## -$(TARGET).dll: $(OBJECTS) $(GAIM_TOP)/src/gaim.lib - $(CC) -shared $(OBJECTS) $(LIB_PATHS) $(LIBS) $(DLL_LD_FLAGS) -Wl,--out-implib,$(TARGET).lib -o $(TARGET).dll +$(TARGET).dll: $(OBJECTS) $(LIBGAIM_TOP)/libgaim.dll.a + $(CC) -shared $(OBJECTS) $(LIB_PATHS) $(LIBS) $(DLL_LD_FLAGS) -o $(TARGET).dll ## @@ -130,4 +124,3 @@ clean: rm -rf *.o rm -rf $(TARGET).dll - rm -rf $(TARGET).lib Modified: trunk/libgaim/protocols/zephyr/Makefile.mingw =================================================================== --- trunk/libgaim/protocols/zephyr/Makefile.mingw 2006-08-22 17:02:20 UTC (rev 16982) +++ trunk/libgaim/protocols/zephyr/Makefile.mingw 2006-08-22 18:10:43 UTC (rev 16983) @@ -11,6 +11,7 @@ INCLUDE_DIR := . GTK_TOP := ../../../../win32-dev/gtk_2_0 GAIM_TOP := ../../.. +LIBGAIM_TOP := ../.. ZEPHYR_ROOT := . KRB4_TOP := ../../../../win32-dev/kfw-2.6.3-final.fixed GAIM_INSTALL_DIR := $(GAIM_TOP)/win32-install-dir @@ -29,7 +30,7 @@ DEFINES = -# Static or Plugin... +# Static or Plugin... ifeq ($(TYPE),STATIC) DEFINES += -DSTATIC DLL_INSTALL_DIR = $(GAIM_INSTALL_DIR) @@ -39,7 +40,7 @@ endif endif -DEFINES += -DWIN32 -DKRB5_SYSTYPES__ +DEFINES += -DWIN32 -DKRB5_SYSTYPES__ ifeq ($(USE_KRB4),true) DEFINES += -DZEPHYR_USES_KERBEROS @@ -49,7 +50,7 @@ ## INCLUDE MAKEFILES ## -include $(GAIM_TOP)/src/win32/global.mak +include $(LIBGAIM_TOP)/win32/global.mak ## ## INCLUDE PATHS @@ -57,14 +58,10 @@ INCLUDE_PATHS += -I$(ZEPHYR_ROOT) \ -I$(GTK_TOP)/include \ - -I$(GTK_TOP)/include/gtk-2.0 \ -I$(GTK_TOP)/include/glib-2.0 \ - -I$(GTK_TOP)/include/pango-1.0 \ - -I$(GTK_TOP)/include/atk-1.0 \ -I$(GTK_TOP)/lib/glib-2.0/include \ - -I$(GTK_TOP)/lib/gtk-2.0/include \ - -I$(GAIM_TOP)/src \ - -I$(GAIM_TOP)/src/win32 \ + -I$(LIBGAIM_TOP) \ + -I$(LIBGAIM_TOP)/win32 \ -I$(GAIM_TOP) ifeq ($(USE_KRB4), true) @@ -72,7 +69,7 @@ endif LIB_PATHS = -L$(GTK_TOP)/lib \ - -L$(GAIM_TOP)/src + -L$(LIBGAIM_TOP) ifeq ($(USE_KRB4), true) LIB_PATHS+=-L$(KRB4_TOP)/lib/i386 @@ -145,17 +142,14 @@ ## LIBRARIES ## -LIBS = -lgtk-win32-2.0 \ +LIBS = \ -lglib-2.0 \ - -lgdk-win32-2.0 \ - -lgmodule-2.0 \ - -lgobject-2.0 \ -lws2_32 \ -lintl \ -lgaim -ifeq ($(USE_KRB4),true) - LIBS+= -lkrbv4w32 +ifeq ($(USE_KRB4),true) + LIBS+= -lkrbv4w32 endif ## @@ -183,15 +177,15 @@ ## BUILD Dependencies ## -$(GAIM_TOP)/src/gaim.lib: - $(MAKE) -C $(GAIM_TOP)/src -f Makefile.mingw gaim.lib +$(LIBGAIM_TOP)/libgaim.dll.a: + $(MAKE) -C $(LIBGAIM_TOP) -f Makefile.mingw libgaim.dll.a ## ## BUILD DLL ## -$(TARGET).dll: $(OBJECTS) $(GAIM_TOP)/src/gaim.lib - $(CC) -shared $(OBJECTS) $(LIB_PATHS) $(LIBS) $(DLL_LD_FLAGS) -Wl,--enable-stdcall-fixup -Wl,--out-implib,$(TARGET).lib -o $(TARGET).dll +$(TARGET).dll: $(OBJECTS) $(LIBGAIM_TOP)/libgaim.dll.a + $(CC) -shared $(OBJECTS) $(LIB_PATHS) $(LIBS) $(DLL_LD_FLAGS) -Wl,--enable-stdcall-fixup -o $(TARGET).dll ## @@ -201,4 +195,3 @@ clean: rm -rf *.o rm -rf $(TARGET).dll - rm -rf $(TARGET).lib This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-08-24 07:00:42
|
Revision: 17011 Author: markhuetsch Date: 2006-08-24 00:00:34 -0700 (Thu, 24 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=17011&view=rev Log Message: ----------- Use GaimPresence to keep track of our status instead of qd->status. Also allow invisible logins. Modified Paths: -------------- trunk/libgaim/protocols/qq/buddy_status.c trunk/libgaim/protocols/qq/buddy_status.h trunk/libgaim/protocols/qq/keep_alive.c trunk/libgaim/protocols/qq/login_logout.c trunk/libgaim/protocols/qq/login_logout.h trunk/libgaim/protocols/qq/qq.c trunk/libgaim/protocols/qq/qq.h Modified: trunk/libgaim/protocols/qq/buddy_status.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_status.c 2006-08-24 02:35:15 UTC (rev 17010) +++ trunk/libgaim/protocols/qq/buddy_status.c 2006-08-24 07:00:34 UTC (rev 17011) @@ -35,16 +35,8 @@ #include "qq_proxy.h" #define QQ_MISC_STATUS_HAVING_VIIDEO 0x00000001 - -#define QQ_ICON_SUFFIX_DEFAULT QQ_ICON_SUFFIX_OFFLINE #define QQ_CHANGE_ONLINE_STATUS_REPLY_OK 0x30 /* ASCII value of "0" */ -enum { - QQ_ICON_SUFFIX_NORMAL = 1, - QQ_ICON_SUFFIX_OFFLINE = 2, - QQ_ICON_SUFFIX_AWAY = 3, -}; - void qq_buddy_status_dump_unclear(qq_buddy_status *s) { GString *dump; @@ -120,22 +112,25 @@ return FALSE; } -/* The QQ client seems to use a separate icon for each - * face/status combo, but we only use one and let Gaim - * handle the rest. We need to use this function to report - * the correct icon file back to the server. */ -gint get_icon_offset_from_self_status(guint8 status) -{ - switch (status) { - case QQ_SELF_STATUS_AVAILABLE: + /* Help calculate the correct icon index to tell the server. */ +gint get_icon_offset(GaimConnection *gc) +{ + GaimAccount *account; + GaimPresence *presence; + + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, 2); + + account = gaim_connection_get_account(gc); + presence = gaim_account_get_presence(account); + + if (gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_INVISIBLE)) { + return 2; + } else if (gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_AWAY) + || gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_EXTENDED_AWAY) + || gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_UNAVAILABLE)) { + return 1; + } else { return 0; - case QQ_SELF_STATUS_AWAY: - case QQ_SELF_STATUS_CUSTOM: - return 1; - case QQ_SELF_STATUS_INVISIBLE: - return 2; - default: - return 2; } } @@ -146,26 +141,25 @@ guint8 *raw_data, *cursor, away_cmd; guint32 misc_status; gboolean fake_video; + GaimAccount *account; + GaimPresence *presence; g_return_if_fail(gc != NULL && gc->proto_data != NULL); + account = gaim_connection_get_account(gc); + presence = gaim_account_get_presence(account); + qd = (qq_data *) gc->proto_data; if (!qd->logged_in) return; - switch (qd->status) { - case QQ_SELF_STATUS_AVAILABLE: - away_cmd = QQ_BUDDY_ONLINE_NORMAL; - break; - case QQ_SELF_STATUS_INVISIBLE: + if (gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_INVISIBLE)) { away_cmd = QQ_BUDDY_ONLINE_INVISIBLE; - break; - case QQ_SELF_STATUS_AWAY: - case QQ_SELF_STATUS_IDLE: - case QQ_SELF_STATUS_CUSTOM: + } else if (gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_AWAY) + || gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_EXTENDED_AWAY) + || gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_UNAVAILABLE)) { away_cmd = QQ_BUDDY_ONLINE_AWAY; - break; - default: + } else { away_cmd = QQ_BUDDY_ONLINE_NORMAL; } @@ -191,6 +185,9 @@ qq_data *qd; gint len; guint8 *data, *cursor, reply; + GaimBuddy *b; + qq_buddy *q_bud; + gchar *name; g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); @@ -204,11 +201,17 @@ read_packet_b(data, &cursor, len, &reply); if (reply != QQ_CHANGE_ONLINE_STATUS_REPLY_OK) { gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Change status fail\n"); - } else + } else { gaim_debug(GAIM_DEBUG_INFO, "QQ", "Change status OK\n"); - } else + name = uid_to_gaim_name(qd->uid); + b = gaim_find_buddy(gc->account, name); + g_free(name); + q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data; + qq_update_buddy_contact(gc, q_bud); + } + } else { gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Error decrypt chg status reply\n"); - + } } /* it is a server message indicating that one of my buddies has changed its status */ @@ -236,11 +239,13 @@ bytes = 0; /* 000-030: qq_buddy_status */ bytes += qq_buddy_status_read(data, &cursor, len, s); - /* 031-034: my uid */ + /* 031-034: my uid */ + /* This has a value of 0 when we've changed our status to + * QQ_BUDDY_ONLINE_INVISIBLE */ bytes += read_packet_dw(data, &cursor, len, &my_uid); - if (my_uid == 0 || bytes != 35) { - gaim_debug(GAIM_DEBUG_ERROR, "QQ", "my_uid == 0 || bytes(%d) != 35\n", bytes); + if (bytes != 35) { + gaim_debug(GAIM_DEBUG_ERROR, "QQ", "bytes(%d) != 35\n", bytes); g_free(s->ip); g_free(s->unknown_key); g_free(s); @@ -263,7 +268,7 @@ qq_update_buddy_contact(gc, q_bud); } else { gaim_debug(GAIM_DEBUG_ERROR, "QQ", - "got information of unknown buddy by gfhuang %d\n", s->uid); + "got information of unknown buddy %d\n", s->uid); } g_free(s->ip); Modified: trunk/libgaim/protocols/qq/buddy_status.h =================================================================== --- trunk/libgaim/protocols/qq/buddy_status.h 2006-08-24 02:35:15 UTC (rev 17010) +++ trunk/libgaim/protocols/qq/buddy_status.h 2006-08-24 07:00:34 UTC (rev 17011) @@ -47,19 +47,11 @@ QQ_BUDDY_ONLINE_INVISIBLE = 0x28 }; -enum { - QQ_SELF_STATUS_AVAILABLE = 0x11, - QQ_SELF_STATUS_AWAY = 0x12, - QQ_SELF_STATUS_INVISIBLE = 0x13, - QQ_SELF_STATUS_CUSTOM = 0x14, - QQ_SELF_STATUS_IDLE = 0x15 -}; - void qq_buddy_status_dump_unclear(qq_buddy_status *s); gboolean is_online(guint8 status); gint qq_buddy_status_read(guint8 *data, guint8 **cursor, gint len, qq_buddy_status *s); -gint get_icon_offset_from_self_status(guint8 status); +gint get_icon_offset(GaimConnection *gc); void qq_send_packet_change_status(GaimConnection *gc); Modified: trunk/libgaim/protocols/qq/keep_alive.c =================================================================== --- trunk/libgaim/protocols/qq/keep_alive.c 2006-08-24 02:35:15 UTC (rev 17010) +++ trunk/libgaim/protocols/qq/keep_alive.c 2006-08-24 07:00:34 UTC (rev 17011) @@ -160,13 +160,13 @@ break; default: status_id = "invisible"; - gaim_debug(GAIM_DEBUG_ERROR, "QQ", "unknown status by gfhuang: %x\n", q_bud->status); + gaim_debug(GAIM_DEBUG_ERROR, "QQ", "unknown status: %x\n", q_bud->status); break; } gaim_debug(GAIM_DEBUG_INFO, "QQ", "set buddy %d to %s\n", q_bud->uid, status_id); gaim_prpl_got_user_status(gc->account, name, status_id, NULL); } else { - gaim_debug(GAIM_DEBUG_ERROR, "QQ", "unknown buddy by gfhuang: %d\n", q_bud->uid); + gaim_debug(GAIM_DEBUG_ERROR, "QQ", "unknown buddy: %d\n", q_bud->uid); } gaim_debug(GAIM_DEBUG_INFO, "QQ", "qq_update_buddy_contact, client=%04x\n", q_bud->client_version); Modified: trunk/libgaim/protocols/qq/login_logout.c =================================================================== --- trunk/libgaim/protocols/qq/login_logout.c 2006-08-24 02:35:15 UTC (rev 17010) +++ trunk/libgaim/protocols/qq/login_logout.c 2006-08-24 07:00:34 UTC (rev 17011) @@ -231,11 +231,10 @@ /* Now goes on updating my icon/nickname, not showing info_window */ qd->modifying_face = FALSE; qq_send_packet_get_info(gc, qd->uid, FALSE); - /* change my status manually, even server may broadcast my online */ - qd->status = (qd->login_mode == QQ_LOGIN_MODE_HIDDEN) ? QQ_SELF_STATUS_INVISIBLE : QQ_SELF_STATUS_AVAILABLE; + qq_send_packet_change_status(gc); - /* now refresh buddy list */ + /* now refresh buddy list */ /* changed by gfhuang, using With Qun version, error, not working still */ qq_send_packet_get_buddies_list(gc, QQ_FRIENDS_LIST_POSITION_START); /* qq_send_packet_get_all_list_with_group(gc, QQ_FRIENDS_LIST_POSITION_START); */ Modified: trunk/libgaim/protocols/qq/login_logout.h =================================================================== --- trunk/libgaim/protocols/qq/login_logout.h 2006-08-24 02:35:15 UTC (rev 17010) +++ trunk/libgaim/protocols/qq/login_logout.h 2006-08-24 07:00:34 UTC (rev 17011) @@ -27,6 +27,7 @@ #include "connection.h" #define QQ_LOGIN_MODE_NORMAL 0x0a +#define QQ_LOGIN_MODE_AWAY 0x1e #define QQ_LOGIN_MODE_HIDDEN 0x28 void qq_send_packet_request_login_token(GaimConnection *gc); Modified: trunk/libgaim/protocols/qq/qq.c =================================================================== --- trunk/libgaim/protocols/qq/qq.c 2006-08-24 02:35:15 UTC (rev 17010) +++ trunk/libgaim/protocols/qq/qq.c 2006-08-24 07:00:34 UTC (rev 17011) @@ -94,7 +94,7 @@ qq_data *qd; GaimConnection *gc; GaimPresence *presence; - gboolean login_hidden, use_tcp; + gboolean use_tcp; g_return_if_fail(account != NULL); @@ -111,16 +111,16 @@ qq_port = gaim_account_get_string(account, "port", NULL); use_tcp = gaim_account_get_bool(account, "use_tcp", FALSE); presence = gaim_account_get_presence(account); - login_hidden = gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_INVISIBLE); qd->use_tcp = use_tcp; - if (login_hidden) { + if(gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_INVISIBLE)) { qd->login_mode = QQ_LOGIN_MODE_HIDDEN; - gaim_debug(GAIM_DEBUG_INFO, "QQ", "Login in hidden mode\n"); + } else if(gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_AWAY) + || gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_EXTENDED_AWAY)) { + qd->login_mode = QQ_LOGIN_MODE_AWAY; } else { qd->login_mode = QQ_LOGIN_MODE_NORMAL; - gaim_debug(GAIM_DEBUG_INFO, "QQ", "Login in normal mode\n"); } if (qq_server == NULL || strlen(qq_server) == 0) @@ -258,7 +258,7 @@ emblems[0] = "offline"; } else { /* TODO the wireless icon is a bit too big to look good with QQ faces */ - if (q_bud->status == QQ_BUDDY_ONLINE_AWAY || q_bud->status == QQ_SELF_STATUS_AWAY) + if (q_bud->status == QQ_BUDDY_ONLINE_AWAY) emblems[i++] = "away"; if (q_bud->comm_flag & QQ_COMM_FLAG_QQ_MEMBER) emblems[i++] = "qq_member"; @@ -306,24 +306,7 @@ static void _qq_set_away(GaimAccount *account, GaimStatus *status) { GaimConnection *gc = gaim_account_get_connection(account); - const char *state = gaim_status_get_id(status); - qq_data *qd; - - - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - - qd = (qq_data *) gc->proto_data; - - if(0 == strcmp(state, "available")) - qd->status = QQ_SELF_STATUS_AVAILABLE; - else if (0 == strcmp(state, "away")) - qd->status = QQ_SELF_STATUS_AWAY; - else if (0 == strcmp(state, "invisible")) - qd->status = QQ_SELF_STATUS_INVISIBLE; - else - qd->status = QQ_SELF_STATUS_AVAILABLE; - qq_send_packet_change_status(gc); } @@ -420,7 +403,7 @@ qd = (qq_data *) gc->proto_data; field = gaim_request_fields_get_field(fields, "face_num"); - suffix = get_icon_offset_from_self_status(qd->status); + suffix = get_icon_offset(gc); qd->my_icon = gaim_request_field_choice_get_value(field) * 3 + suffix; qd->modifying_face = TRUE; qq_send_packet_get_info(gc, qd->uid, FALSE); Modified: trunk/libgaim/protocols/qq/qq.h =================================================================== --- trunk/libgaim/protocols/qq/qq.h 2006-08-24 02:35:15 UTC (rev 17010) +++ trunk/libgaim/protocols/qq/qq.h 2006-08-24 07:00:34 UTC (rev 17011) @@ -64,7 +64,6 @@ guint16 send_seq; /* send sequence number */ guint8 login_mode; /* online of invisible */ - guint8 status; gboolean logged_in; /* used by qq-add_buddy */ gboolean use_tcp; /* network in tcp or udp */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-08-24 08:04:51
|
Revision: 17012 Author: markhuetsch Date: 2006-08-24 01:04:46 -0700 (Thu, 24 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=17012&view=rev Log Message: ----------- Removed the prefix before user IDs, it was giving the Adium folks a hard time. Modified Paths: -------------- trunk/libgaim/protocols/qq/buddy_opt.c trunk/libgaim/protocols/qq/group_find.c trunk/libgaim/protocols/qq/qq.c trunk/libgaim/protocols/qq/utils.c trunk/libgaim/protocols/qq/utils.h Modified: trunk/libgaim/protocols/qq/buddy_opt.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_opt.c 2006-08-24 07:00:34 UTC (rev 17011) +++ trunk/libgaim/protocols/qq/buddy_opt.c 2006-08-24 08:04:46 UTC (rev 17012) @@ -511,7 +511,7 @@ gaim_blist_remove_buddy(b); gaim_notify_error(gc, NULL, _("QQid Error"), - _("Invalid QQid, to add buddy 1234567, \nyou should input qq-1234567")); + _("Invalid QQid")); } } Modified: trunk/libgaim/protocols/qq/group_find.c =================================================================== --- trunk/libgaim/protocols/qq/group_find.c 2006-08-24 07:00:34 UTC (rev 17011) +++ trunk/libgaim/protocols/qq/group_find.c 2006-08-24 08:04:46 UTC (rev 17012) @@ -38,10 +38,13 @@ g_return_val_if_fail(gc != NULL && who != NULL, NULL); + /* TODO checkbox for this in UI */ /* if it starts with QQ_NAME_PREFIX, we think it is valid name already * otherwise we think it is nickname and try to find the matching gaim_name */ + /* if (gaim_str_has_prefix(who, QQ_NAME_PREFIX) && gaim_name_to_uid(who) > 0) return (gchar *) who; + */ group = qq_group_find_by_channel(gc, channel); g_return_val_if_fail(group != NULL, NULL); Modified: trunk/libgaim/protocols/qq/qq.c =================================================================== --- trunk/libgaim/protocols/qq/qq.c 2006-08-24 07:00:34 UTC (rev 17011) +++ trunk/libgaim/protocols/qq/qq.c 2006-08-24 08:04:46 UTC (rev 17012) @@ -374,7 +374,7 @@ if (uid <= 0) { gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Not valid QQid: %s\n", who); - gaim_notify_error(gc, NULL, _("Invalid name, please input in qq-xxxxxxxx format"), NULL); + gaim_notify_error(gc, NULL, _("Invalid name"), NULL); return; } Modified: trunk/libgaim/protocols/qq/utils.c =================================================================== --- trunk/libgaim/protocols/qq/utils.c 2006-08-24 07:00:34 UTC (rev 17011) +++ trunk/libgaim/protocols/qq/utils.c 2006-08-24 08:04:46 UTC (rev 17012) @@ -36,7 +36,7 @@ #include "util.h" #include "utils.h" -#define QQ_NAME_FORMAT "qq-%d" +#define QQ_NAME_FORMAT "%d" gchar *get_name_by_index_str(gchar **array, const gchar *index_str, gint amount) { @@ -164,22 +164,24 @@ return g_strdup_printf("qq_%d", set); } -/* convert a QQ UID to a unique name of GAIM +/* convert a QQ UID to a unique name of Gaim * the return needs to be freed */ gchar *uid_to_gaim_name(guint32 uid) { return g_strdup_printf(QQ_NAME_FORMAT, uid); } -/* convert GAIM name to original QQ UID */ +/* convert Gaim name to original QQ UID */ guint32 gaim_name_to_uid(const gchar *const name) { - gchar *p; + guint32 ret; + g_return_val_if_fail(name != NULL, 0); - g_return_val_if_fail(gaim_str_has_prefix(name, QQ_NAME_PREFIX), 0); - - p = g_strrstr(name, QQ_NAME_PREFIX); - return (p == NULL) ? 0 : strtol(p + strlen(QQ_NAME_PREFIX), NULL, 10); + ret = strtol(name, NULL, 10); + if (errno == ERANGE) + return 0; + else + return ret; } /* try to dump the data as GBK */ Modified: trunk/libgaim/protocols/qq/utils.h =================================================================== --- trunk/libgaim/protocols/qq/utils.h 2006-08-24 07:00:34 UTC (rev 17011) +++ trunk/libgaim/protocols/qq/utils.h 2006-08-24 08:04:46 UTC (rev 17012) @@ -26,8 +26,6 @@ #include <stdio.h> #include <glib.h> -#define QQ_NAME_PREFIX "qq-" - gchar *get_name_by_index_str(gchar **array, const gchar *index_str, gint amount); gchar *get_index_str_by_name(gchar **array, const gchar *name, gint amount); gint qq_string_to_dec_value(const gchar *str); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-08-26 17:22:30
|
Revision: 17047 Author: markhuetsch Date: 2006-08-26 10:22:24 -0700 (Sat, 26 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=17047&view=rev Log Message: ----------- Fixed a comment and a user notification. Modified Paths: -------------- trunk/libgaim/protocols/qq/im.c trunk/libgaim/protocols/qq/sys_msg.c Modified: trunk/libgaim/protocols/qq/im.c =================================================================== --- trunk/libgaim/protocols/qq/im.c 2006-08-26 13:53:10 UTC (rev 17046) +++ trunk/libgaim/protocols/qq/im.c 2006-08-26 17:22:24 UTC (rev 17047) @@ -310,7 +310,7 @@ /* send encoded to gaim, note that we use im_text->send_time, * not the time we receive the message - * as it may have been dealyed when I am not online. */ + * as it may have been delayed when I am not online. */ serv_got_im(gc, name, msg_utf8_encoded, gaim_msg_type, (time_t) im_text->send_time); g_free(msg_utf8_encoded); Modified: trunk/libgaim/protocols/qq/sys_msg.c =================================================================== --- trunk/libgaim/protocols/qq/sys_msg.c 2006-08-26 13:53:10 UTC (rev 17046) +++ trunk/libgaim/protocols/qq/sys_msg.c 2006-08-26 17:22:24 UTC (rev 17047) @@ -195,7 +195,7 @@ qd = (qq_data *) gc->proto_data; qq_add_buddy_by_recv_packet(gc, strtol(from, NULL, 10), TRUE, TRUE); - message = g_strdup_printf(_("Use %s has approved your request"), from); + message = g_strdup_printf(_("User %s has approved your request"), from); _qq_sys_msg_log_write(gc, message, from); gaim_notify_info(gc, NULL, message, NULL); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-09-01 11:03:41
|
Revision: 17112 http://svn.sourceforge.net/gaim/?rev=17112&view=rev Author: markhuetsch Date: 2006-09-01 04:03:18 -0700 (Fri, 01 Sep 2006) Log Message: ----------- Fixed chat support. Modified Paths: -------------- trunk/libgaim/protocols/qq/Makefile.am trunk/libgaim/protocols/qq/Makefile.mingw trunk/libgaim/protocols/qq/buddy_list.c trunk/libgaim/protocols/qq/group.c trunk/libgaim/protocols/qq/group.h trunk/libgaim/protocols/qq/group_conv.c trunk/libgaim/protocols/qq/group_find.c trunk/libgaim/protocols/qq/group_find.h trunk/libgaim/protocols/qq/group_free.c trunk/libgaim/protocols/qq/group_free.h trunk/libgaim/protocols/qq/group_im.c trunk/libgaim/protocols/qq/group_info.c trunk/libgaim/protocols/qq/group_info.h trunk/libgaim/protocols/qq/group_join.c trunk/libgaim/protocols/qq/group_join.h trunk/libgaim/protocols/qq/group_network.c trunk/libgaim/protocols/qq/group_opt.c trunk/libgaim/protocols/qq/group_search.c trunk/libgaim/protocols/qq/login_logout.c trunk/libgaim/protocols/qq/qq.c trunk/libgaim/protocols/qq/qq.h trunk/libgaim/protocols/qq/utils.c trunk/libgaim/protocols/qq/utils.h Added Paths: ----------- trunk/libgaim/protocols/qq/group_internal.c trunk/libgaim/protocols/qq/group_internal.h Removed Paths: ------------- trunk/libgaim/protocols/qq/group_hash.c trunk/libgaim/protocols/qq/group_hash.h Modified: trunk/libgaim/protocols/qq/Makefile.am =================================================================== --- trunk/libgaim/protocols/qq/Makefile.am 2006-09-01 10:05:30 UTC (rev 17111) +++ trunk/libgaim/protocols/qq/Makefile.am 2006-09-01 11:03:18 UTC (rev 17112) @@ -22,15 +22,15 @@ crypt.c \ crypt.h \ group.c \ + group.h \ group_conv.c \ group_conv.h \ group_find.c \ group_find.h \ group_free.c \ group_free.h \ - group.h \ - group_hash.c \ - group_hash.h \ + group_internal.c \ + group_internal.h \ group_im.c \ group_im.h \ group_info.c \ Modified: trunk/libgaim/protocols/qq/Makefile.mingw =================================================================== --- trunk/libgaim/protocols/qq/Makefile.mingw 2006-09-01 10:05:30 UTC (rev 17111) +++ trunk/libgaim/protocols/qq/Makefile.mingw 2006-09-01 11:03:18 UTC (rev 17112) @@ -54,7 +54,7 @@ group_conv.c \ group_find.c \ group_free.c \ - group_hash.c \ + group_internal.c \ group_im.c \ group_info.c \ group_join.c \ Modified: trunk/libgaim/protocols/qq/buddy_list.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_list.c 2006-09-01 10:05:30 UTC (rev 17111) +++ trunk/libgaim/protocols/qq/buddy_list.c 2006-09-01 11:03:18 UTC (rev 17112) @@ -37,7 +37,7 @@ #include "qq.h" #include "group.h" #include "group_find.h" -#include "group_hash.h" +#include "group_internal.h" #include "group_info.h" #include "qq_proxy.h" @@ -222,7 +222,7 @@ } else { gaim_debug(GAIM_DEBUG_ERROR, "QQ", - "Got an online buddy %d, but not in my buddy list", fe->s->uid); + "Got an online buddy %d, but not in my buddy list\n", fe->s->uid); } g_free(fe->s->ip); @@ -231,11 +231,11 @@ if(cursor > (data + len)) { gaim_debug(GAIM_DEBUG_ERROR, "QQ", - "qq_process_get_buddies_online_reply: Dangerous error! maybe protocol changed, notify developers!"); + "qq_process_get_buddies_online_reply: Dangerous error! maybe protocol changed, notify developers!\n"); } if (position != QQ_FRIENDS_ONLINE_POSITION_END) { - gaim_debug(GAIM_DEBUG_INFO, "QQ", "Has more online buddies, position from %d", position); + gaim_debug(GAIM_DEBUG_INFO, "QQ", "Has more online buddies, position from %d\n", position); qq_send_packet_get_buddies_online(gc, position); } @@ -352,10 +352,6 @@ guint32 unknown, position; guint32 uid; guint8 type, groupid; - - qq_buddy *q_bud; - gchar *name; - GaimBuddy *b; qq_group *group; g_return_if_fail(gc != NULL && gc->proto_data != NULL); @@ -384,41 +380,28 @@ read_packet_dw(data, &cursor, len, &uid); /* 04: type 0x1:buddy 0x4:Qun */ read_packet_b(data, &cursor, len, &type); - /* 05: groupid*4 */ + /* 05: groupid*4 */ /* seems to always be 0 */ read_packet_b(data, &cursor, len, &groupid); - groupid >>= 2; /* these 2 bits might not be 0, faint! */ + /* + gaim_debug(GAIM_DEBUG_INFO, "QQ", "groupid: %i\n", groupid); + groupid >>= 2; + */ if (uid == 0 || (type != 0x1 && type != 0x4)) { - gaim_debug(GAIM_DEBUG_WARNING, "QQ", + gaim_debug(GAIM_DEBUG_INFO, "QQ", "Buddy entry, uid=%d, type=%d", uid, type); continue; } if(0x1 == type) { /* a buddy */ - name = uid_to_gaim_name(uid); - b = gaim_find_buddy(gc->account, name); - g_free(name); - - if (b == NULL) { - b = qq_add_buddy_by_recv_packet(gc, uid, TRUE, TRUE); - q_bud = b->proto_data; - } - else { - q_bud = NULL; - b->proto_data = q_bud; /* wrong !!!! */ - } - qd->buddies = g_list_append(qd->buddies, q_bud); - qq_update_buddy_contact(gc, q_bud); + /* don't do anything but count - buddies are handled by + * qq_send_packet_get_buddies_list */ ++i; } else { /* a group */ - group = qq_group_find_by_internal_group_id(gc, uid); + group = qq_group_find_by_id(gc, uid, QQ_INTERNAL_ID); if(group == NULL) { - /*XXX not working - group = qq_group_create_by_id(gc, uid, 0); + qq_set_pending_id(&qd->adding_groups_from_server, uid, TRUE); + group = g_newa(qq_group, 1); + group->internal_group_id = uid; qq_send_cmd_group_get_group_info(gc, group); - */ - gaim_debug(GAIM_DEBUG_ERROR, "QQ", - "Get a Qun with internal group %d\n", uid); - gaim_notify_info(gc, _("QQ Qun Operation"), - _("Find one Qun in the server list, but i don't know its external id, please re-rejoin it manually"), NULL); } else { group->my_status = QQ_GROUP_MEMBER_STATUS_IS_MEMBER; qq_group_refresh(gc, group); Modified: trunk/libgaim/protocols/qq/group.c =================================================================== --- trunk/libgaim/protocols/qq/group.c 2006-09-01 10:05:30 UTC (rev 17111) +++ trunk/libgaim/protocols/qq/group.c 2006-09-01 11:03:18 UTC (rev 17112) @@ -26,7 +26,7 @@ #include "prpl.h" #include "request.h" -#include "group_hash.h" +#include "group_internal.h" #include "group_info.h" #include "group_search.h" #include "utils.h" @@ -43,6 +43,15 @@ qq_send_cmd_group_search_group(gc, external_group_id); } +static void _qq_group_search_cancel_callback(GaimConnection *gc, const gchar *input) +{ + qq_data *qd; + g_return_if_fail(gc != NULL && gc->proto_data != NULL); + + qd = (qq_data *) gc->proto_data; + gaim_roomlist_set_in_progress(qd->roomlist, FALSE); +} + /* This is needed for GaimChat node to be valid */ GList *qq_chat_info(GaimConnection *gc) { @@ -55,18 +64,20 @@ pce->label = _("ID: "); pce->identifier = QQ_GROUP_KEY_EXTERNAL_ID; m = g_list_append(m, pce); + + return m; +} - pce = g_new0(struct proto_chat_entry, 1); - pce->label = _("Admin: "); - pce->identifier = QQ_GROUP_KEY_CREATOR_UID; - m = g_list_append(m, pce); +GHashTable *qq_chat_info_defaults(GaimConnection *gc, const gchar *chat_name) +{ + GHashTable *defaults; - pce = g_new0(struct proto_chat_entry, 1); - pce->label = _("Status: "); - pce->identifier = QQ_GROUP_KEY_MEMBER_STATUS_DESC; - m = g_list_append(m, pce); + defaults = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); - return m; + if (chat_name != NULL) + g_hash_table_insert(defaults, QQ_GROUP_KEY_EXTERNAL_ID, g_strdup(chat_name)); + + return defaults; } /* get a list of qq groups */ @@ -107,9 +118,11 @@ gaim_request_input(gc, _("QQ Qun"), _("Please input external group ID"), - _("You can only search for permanent QQ group\nInput 0 or leave it blank to search for demo groups"), - NULL, FALSE, FALSE, NULL, _("Search"), - G_CALLBACK(_qq_group_search_callback), _("Cancel"), NULL, gc); + _("You can only search for permanent QQ groups\n"), + NULL, FALSE, FALSE, NULL, + _("Search"), G_CALLBACK(_qq_group_search_callback), + _("Cancel"), G_CALLBACK(_qq_group_search_cancel_callback), + gc); return qd->roomlist; } Modified: trunk/libgaim/protocols/qq/group.h =================================================================== --- trunk/libgaim/protocols/qq/group.h 2006-09-01 10:05:30 UTC (rev 17111) +++ trunk/libgaim/protocols/qq/group.h 2006-09-01 11:03:18 UTC (rev 17112) @@ -39,7 +39,7 @@ } qq_group_member_status; typedef struct _qq_group { - /* all these will be saved when exit GAIM */ + /* all these will be saved when we exit Gaim */ qq_group_member_status my_status; /* my status for this group */ gchar *my_status_desc; /* my status description */ guint32 internal_group_id; @@ -50,12 +50,13 @@ guint8 auth_type; gchar *group_name_utf8; gchar *group_desc_utf8; - /* all these will loaded from network only */ + /* all these will be loaded from the network */ gchar *notice_utf8; /* group notice by admin */ - GList *members; /* those evert appear in the group */ + GList *members; } qq_group; GList *qq_chat_info(GaimConnection *gc); +GHashTable *qq_chat_info_defaults(GaimConnection *gc, const gchar *chat_name); void qq_group_init(GaimConnection *gc); Modified: trunk/libgaim/protocols/qq/group_conv.c =================================================================== --- trunk/libgaim/protocols/qq/group_conv.c 2006-09-01 10:05:30 UTC (rev 17111) +++ trunk/libgaim/protocols/qq/group_conv.c 2006-09-01 11:03:18 UTC (rev 17112) @@ -37,7 +37,8 @@ g_return_if_fail(gc != NULL && gc->proto_data != NULL && group != NULL); qd = (qq_data *) gc->proto_data; - conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, group->group_name_utf8, gaim_connection_get_account(gc)); + conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, + group->group_name_utf8, gaim_connection_get_account(gc)); if (conv == NULL) /* show only one window per group */ serv_got_joined_chat(gc, qd->channel++, group->group_name_utf8); } @@ -54,17 +55,19 @@ names = NULL; flags = NULL; - conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, group->group_name_utf8, gaim_connection_get_account(gc)); + conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, + group->group_name_utf8, gaim_connection_get_account(gc)); if (conv != NULL && group->members != NULL) { list = group->members; while (list != NULL) { member = (qq_buddy *) list->data; /* always put it even offline */ names = g_list_append(names, - (member->nickname != - NULL) ? - g_strdup(member->nickname) : uid_to_gaim_name(member->uid)); - + /* we need unique identifiers for everyone in the chat or else we'll + * run into problems with functions like get_cb_real_name from qq.c */ + (member->nickname != NULL && *(member->nickname) != '\0') ? + g_strdup_printf("%s (qq-%u)", member->nickname, member->uid) : + g_strdup_printf("(qq-%u)", member->uid)); flag = 0; /* TYPING to put online above OP and FOUNDER */ if (is_online(member->status)) flag |= (GAIM_CBFLAGS_TYPING | GAIM_CBFLAGS_VOICE); Modified: trunk/libgaim/protocols/qq/group_find.c =================================================================== --- trunk/libgaim/protocols/qq/group_find.c 2006-09-01 10:05:30 UTC (rev 17111) +++ trunk/libgaim/protocols/qq/group_find.c 2006-09-01 11:03:18 UTC (rev 17112) @@ -29,38 +29,6 @@ #include "qq.h" #include "utils.h" -/* find a chat member's valid gaim_name of its nickname and chat room channel */ -gchar *qq_group_find_member_by_channel_and_nickname(GaimConnection *gc, gint channel, const gchar *who) -{ - qq_group *group; - qq_buddy *member; - GList *list; - - g_return_val_if_fail(gc != NULL && who != NULL, NULL); - - /* TODO checkbox for this in UI */ - /* if it starts with QQ_NAME_PREFIX, we think it is valid name already - * otherwise we think it is nickname and try to find the matching gaim_name */ - /* - if (gaim_str_has_prefix(who, QQ_NAME_PREFIX) && gaim_name_to_uid(who) > 0) - return (gchar *) who; - */ - - group = qq_group_find_by_channel(gc, channel); - g_return_val_if_fail(group != NULL, NULL); - - list = group->members; - member = NULL; - while (list != NULL) { - member = (qq_buddy *) list->data; - if (member->nickname != NULL && !g_ascii_strcasecmp(member->nickname, who)) - break; - list = list->next; - } - - return (member == NULL) ? NULL : uid_to_gaim_name(member->uid); -} - /* find the internal_group_id by the reply packet sequence * return TRUE if we have a record of it, return FALSE if not */ gboolean qq_group_find_internal_group_id_by_seq(GaimConnection *gc, guint16 seq, guint32 *internal_group_id) @@ -69,7 +37,10 @@ qq_data *qd; group_packet *p; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL && internal_group_id != NULL, FALSE); + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, FALSE); + + if (internal_group_id == NULL) + return FALSE; qd = (qq_data *) gc->proto_data; list = qd->group_packets; @@ -87,7 +58,7 @@ return FALSE; } -/* find a qq_buddy by uid, called by qq_im.c */ +/* find a qq_buddy by uid, called by im.c */ qq_buddy *qq_group_find_member_by_uid(qq_group *group, guint32 uid) { GList *list; @@ -138,7 +109,7 @@ buddy = gaim_find_buddy(gaim_connection_get_account(gc), uid_to_gaim_name(member_uid)); if (buddy != NULL) { q_bud = (qq_buddy *) buddy->proto_data; - if (q_bud != NULL) + if (q_bud != NULL && q_bud->nickname != NULL) member->nickname = g_strdup(q_bud->nickname); else if (buddy->alias != NULL) member->nickname = g_strdup(buddy->alias); @@ -175,23 +146,24 @@ return group; } -/* find a qq_group by internal_group_id */ -qq_group *qq_group_find_by_internal_group_id(GaimConnection *gc, guint32 internal_group_id) +/* find a qq_group by its id, flag is QQ_INTERNAL_ID or QQ_EXTERNAL_ID */ +qq_group *qq_group_find_by_id(GaimConnection *gc, guint32 id, gboolean flag) { GList *list; qq_group *group; qq_data *qd; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL && internal_group_id > 0, NULL); - + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL); qd = (qq_data *) gc->proto_data; - if (qd->groups == NULL) + + if (qd->groups == NULL || id <= 0) return NULL; list = qd->groups; while (list != NULL) { group = (qq_group *) list->data; - if (group->internal_group_id == internal_group_id) + if (flag == QQ_INTERNAL_ID ? + (group->internal_group_id == id) : (group->external_group_id == id)) return group; list = list->next; } Modified: trunk/libgaim/protocols/qq/group_find.h =================================================================== --- trunk/libgaim/protocols/qq/group_find.h 2006-09-01 10:05:30 UTC (rev 17111) +++ trunk/libgaim/protocols/qq/group_find.h 2006-09-01 11:03:18 UTC (rev 17112) @@ -27,12 +27,14 @@ #include "connection.h" #include "group.h" -gchar *qq_group_find_member_by_channel_and_nickname(GaimConnection *gc, gint channel, const gchar *who); +#define QQ_INTERNAL_ID 0 +#define QQ_EXTERNAL_ID 1 + qq_buddy *qq_group_find_member_by_uid(qq_group *group, guint32 uid); void qq_group_remove_member_by_uid(qq_group *group, guint32 uid); qq_buddy *qq_group_find_or_add_member(GaimConnection *gc, qq_group *group, guint32 member_uid); gboolean qq_group_find_internal_group_id_by_seq(GaimConnection *gc, guint16 seq, guint32 *internal_group_id); qq_group *qq_group_find_by_channel(GaimConnection *gc, gint channel); -qq_group *qq_group_find_by_internal_group_id(GaimConnection *gc, guint32 internal_group_id); +qq_group *qq_group_find_by_id(GaimConnection *gc, guint32 id, gboolean flag); #endif Modified: trunk/libgaim/protocols/qq/group_free.c =================================================================== --- trunk/libgaim/protocols/qq/group_free.c 2006-09-01 10:05:30 UTC (rev 17111) +++ trunk/libgaim/protocols/qq/group_free.c 2006-09-01 11:03:18 UTC (rev 17112) @@ -23,12 +23,11 @@ #include "debug.h" #include "buddy_status.h" -#include "group.h" #include "group_free.h" #include "group_network.h" /* gracefully free all members in a group */ -static void _qq_group_free_member(qq_group *group) +static void qq_group_free_member(qq_group *group) { gint i; GList *list; @@ -48,10 +47,10 @@ } /* gracefully free the memory for one qq_group */ -static void _qq_group_free(qq_group *group) +void qq_group_free(qq_group *group) { g_return_if_fail(group != NULL); - _qq_group_free_member(group); + qq_group_free_member(group); g_free(group->group_name_utf8); g_free(group->group_desc_utf8); g_free(group); @@ -73,25 +72,6 @@ gaim_debug(GAIM_DEBUG_INFO, "QQ", "%d group packets are freed!\n", i); } -void qq_group_remove_by_internal_group_id(qq_data *qd, guint32 internal_group_id) -{ - qq_group *group; - GList *list; - g_return_if_fail(qd != NULL); - - list = qd->groups; - while (list != NULL) { - group = (qq_group *) qd->groups->data; - if (internal_group_id == group->internal_group_id) { - qd->groups = g_list_remove(qd->groups, group); - _qq_group_free(group); - break; - } else { - list = list->next; - } - } -} - void qq_group_free_all(qq_data *qd) { qq_group *group; @@ -103,7 +83,7 @@ i++; group = (qq_group *) qd->groups->data; qd->groups = g_list_remove(qd->groups, group); - _qq_group_free(group); + qq_group_free(group); } gaim_debug(GAIM_DEBUG_INFO, "QQ", "%d groups are freed\n", i); Modified: trunk/libgaim/protocols/qq/group_free.h =================================================================== --- trunk/libgaim/protocols/qq/group_free.h 2006-09-01 10:05:30 UTC (rev 17111) +++ trunk/libgaim/protocols/qq/group_free.h 2006-09-01 11:03:18 UTC (rev 17112) @@ -25,11 +25,11 @@ #include <glib.h> #include "qq.h" +#include "group.h" void qq_group_packets_free(qq_data *qd); +void qq_group_free(qq_group *group); void qq_group_free_all(qq_data *qd); -void qq_group_remove_by_internal_group_id(qq_data *qd, guint32 internal_group_id); - #endif Deleted: trunk/libgaim/protocols/qq/group_hash.c =================================================================== --- trunk/libgaim/protocols/qq/group_hash.c 2006-09-01 10:05:30 UTC (rev 17111) +++ trunk/libgaim/protocols/qq/group_hash.c 2006-09-01 11:03:18 UTC (rev 17112) @@ -1,195 +0,0 @@ -/** -* The QQ2003C protocol plugin - * - * for gaim - * - * Copyright (C) 2004 Puzzlebird - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "blist.h" -#include "debug.h" - -#include "buddy_opt.h" -#include "group_hash.h" -#include "group_misc.h" -#include "utils.h" - -static gchar *_qq_group_set_my_status_desc(qq_group *group) -{ - const char *status_desc; - g_return_val_if_fail(group != NULL, g_strdup("")); - - switch (group->my_status) { - case QQ_GROUP_MEMBER_STATUS_NOT_MEMBER: - status_desc = _("I am not member"); - break; - case QQ_GROUP_MEMBER_STATUS_IS_MEMBER: - status_desc = _("I am a member"); - break; - case QQ_GROUP_MEMBER_STATUS_APPLYING: - status_desc = _("I am applying to join"); - break; - case QQ_GROUP_MEMBER_STATUS_IS_ADMIN: - status_desc = _("I am the admin"); - break; - default: - status_desc = _("Unknown status"); - } - - return g_strdup(status_desc); -} - -static void _qq_group_add_to_blist(GaimConnection *gc, qq_group *group) -{ - GHashTable *components; - GaimGroup *g; - GaimChat *chat; - components = qq_group_to_hashtable(group); - chat = gaim_chat_new(gaim_connection_get_account(gc), group->group_name_utf8, components); - g = qq_get_gaim_group(GAIM_GROUP_QQ_QUN); - gaim_blist_add_chat(chat, g, NULL); - gaim_debug(GAIM_DEBUG_INFO, "QQ", "You have add group \"%s\" to blist locally\n", group->group_name_utf8); -} - -/* create a dummy qq_group, which includes only internal_id and external_id - * all other attributes should be set to empty. - * and we need to send a get_group_info to QQ server to update it right away */ -qq_group *qq_group_create_by_id(GaimConnection *gc, guint32 internal_id, guint32 external_id) -{ - qq_group *group; - qq_data *qd; - - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL); - g_return_val_if_fail(internal_id > 0, NULL); - qd = (qq_data *) gc->proto_data; - - group = g_new0(qq_group, 1); - group->my_status = QQ_GROUP_MEMBER_STATUS_NOT_MEMBER; - group->my_status_desc = _qq_group_set_my_status_desc(group); - group->internal_group_id = internal_id; - group->external_group_id = external_id; - group->group_type = 0x01; /* assume permanent Qun */ - group->creator_uid = 10000; /* assume by QQ admin */ - group->group_category = 0x01; - group->auth_type = 0x02; /* assume need auth */ - group->group_name_utf8 = g_strdup(""); - group->group_desc_utf8 = g_strdup(""); - group->notice_utf8 = g_strdup(""); - group->members = NULL; - - qd->groups = g_list_append(qd->groups, group); - _qq_group_add_to_blist(gc, group); - - return group; -} - -/* convert a qq_group to hash-table, which could be component of GaimChat */ -GHashTable *qq_group_to_hashtable(qq_group *group) -{ - GHashTable *components; - components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); - g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_MEMBER_STATUS), g_strdup_printf("%d", group->my_status)); - group->my_status_desc = _qq_group_set_my_status_desc(group); - - g_hash_table_insert(components, - g_strdup(QQ_GROUP_KEY_INTERNAL_ID), g_strdup_printf("%d", group->internal_group_id)); - g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_EXTERNAL_ID), - g_strdup_printf("%d", group->external_group_id)); - g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_GROUP_TYPE), g_strdup_printf("%d", group->group_type)); - g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_CREATOR_UID), g_strdup_printf("%d", group->creator_uid)); - g_hash_table_insert(components, - g_strdup(QQ_GROUP_KEY_GROUP_CATEGORY), g_strdup_printf("%d", group->group_category)); - g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_AUTH_TYPE), g_strdup_printf("%d", group->auth_type)); - g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_MEMBER_STATUS_DESC), g_strdup(group->my_status_desc)); - g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_GROUP_NAME_UTF8), g_strdup(group->group_name_utf8)); - g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_GROUP_DESC_UTF8), g_strdup(group->group_desc_utf8)); - return components; -} - -/* create a qq_group from hashtable */ -qq_group *qq_group_from_hashtable(GaimConnection *gc, GHashTable *data) -{ - qq_data *qd; - qq_group *group; - - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL); - g_return_val_if_fail(data != NULL, NULL); - qd = (qq_data *) gc->proto_data; - - group = g_new0(qq_group, 1); - group->my_status = - qq_string_to_dec_value - (NULL == - g_hash_table_lookup(data, - QQ_GROUP_KEY_MEMBER_STATUS) ? - g_strdup_printf("%d", - QQ_GROUP_MEMBER_STATUS_NOT_MEMBER) : - g_hash_table_lookup(data, QQ_GROUP_KEY_MEMBER_STATUS)); - group->internal_group_id = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_INTERNAL_ID)); - group->external_group_id = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_EXTERNAL_ID)); - group->group_type = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_GROUP_TYPE)); - group->creator_uid = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_CREATOR_UID)); - group->group_category = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_GROUP_CATEGORY)); - group->auth_type = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_AUTH_TYPE)); - group->group_name_utf8 = g_strdup(g_hash_table_lookup(data, QQ_GROUP_KEY_GROUP_NAME_UTF8)); - group->group_desc_utf8 = g_strdup(g_hash_table_lookup(data, QQ_GROUP_KEY_GROUP_DESC_UTF8)); - group->my_status_desc = _qq_group_set_my_status_desc(group); - - qd->groups = g_list_append(qd->groups, group); - - return group; -} - -/* refresh group local subscription */ -void qq_group_refresh(GaimConnection *gc, qq_group *group) -{ - GaimChat *chat; - g_return_if_fail(gc != NULL && group != NULL); - - chat = gaim_blist_find_chat(gaim_connection_get_account(gc), g_strdup_printf("%d", group->external_group_id)); - if (chat == NULL && group->my_status != QQ_GROUP_MEMBER_STATUS_NOT_MEMBER) { - _qq_group_add_to_blist(gc, group); - } else if (chat != NULL) { /* we have a local record, update its info */ - /* if there is group_name_utf8, we update the group name */ - if (group->group_name_utf8 != NULL && strlen(group->group_name_utf8) > 0) - gaim_blist_alias_chat(chat, group->group_name_utf8); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_MEMBER_STATUS), g_strdup_printf("%d", group->my_status)); - group->my_status_desc = _qq_group_set_my_status_desc(group); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_MEMBER_STATUS_DESC), g_strdup(group->my_status_desc)); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_INTERNAL_ID), - g_strdup_printf("%d", group->internal_group_id)); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_EXTERNAL_ID), - g_strdup_printf("%d", group->external_group_id)); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_GROUP_TYPE), g_strdup_printf("%d", group->group_type)); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_CREATOR_UID), g_strdup_printf("%d", group->creator_uid)); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_GROUP_CATEGORY), - g_strdup_printf("%d", group->group_category)); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_AUTH_TYPE), g_strdup_printf("%d", group->auth_type)); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_GROUP_NAME_UTF8), g_strdup(group->group_name_utf8)); - g_hash_table_replace(chat->components, - g_strdup(QQ_GROUP_KEY_GROUP_DESC_UTF8), g_strdup(group->group_desc_utf8)); - } -} Deleted: trunk/libgaim/protocols/qq/group_hash.h =================================================================== --- trunk/libgaim/protocols/qq/group_hash.h 2006-09-01 10:05:30 UTC (rev 17111) +++ trunk/libgaim/protocols/qq/group_hash.h 2006-09-01 11:03:18 UTC (rev 17112) @@ -1,46 +0,0 @@ -/** -* The QQ2003C protocol plugin - * - * for gaim - * - * Copyright (C) 2004 Puzzlebird - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _QQ_GROUP_HASH_H_ -#define _QQ_GROUP_HASH_H_ - -#include <glib.h> -#include "group.h" - -#define QQ_GROUP_KEY_MEMBER_STATUS "my_status_code" -#define QQ_GROUP_KEY_MEMBER_STATUS_DESC "my_status_desc" -#define QQ_GROUP_KEY_INTERNAL_ID "internal_group_id" -#define QQ_GROUP_KEY_EXTERNAL_ID "external_group_id" -#define QQ_GROUP_KEY_GROUP_TYPE "group_type" -#define QQ_GROUP_KEY_CREATOR_UID "creator_uid" -#define QQ_GROUP_KEY_GROUP_CATEGORY "group_category" -#define QQ_GROUP_KEY_AUTH_TYPE "auth_type" -#define QQ_GROUP_KEY_GROUP_NAME_UTF8 "group_name_utf8" -#define QQ_GROUP_KEY_GROUP_DESC_UTF8 "group_desc_utf8" - -qq_group *qq_group_create_by_id(GaimConnection *gc, guint32 internal_id, guint32 external_id); -GHashTable *qq_group_to_hashtable(qq_group *group); - -qq_group *qq_group_from_hashtable(GaimConnection *gc, GHashTable *data); -void qq_group_refresh(GaimConnection *gc, qq_group *group); - -#endif Modified: trunk/libgaim/protocols/qq/group_im.c =================================================================== --- trunk/libgaim/protocols/qq/group_im.c 2006-09-01 10:05:30 UTC (rev 17111) +++ trunk/libgaim/protocols/qq/group_im.c 2006-09-01 11:03:18 UTC (rev 17112) @@ -29,7 +29,7 @@ #include "char_conv.h" #include "group_find.h" -#include "group_hash.h" +#include "group_internal.h" #include "group_info.h" #include "group_im.h" #include "group_network.h" @@ -171,7 +171,7 @@ gaim_notify_warning(gc, _("QQ Qun Operation"), msg, reason); - group = qq_group_find_by_internal_group_id(gc, internal_group_id); + group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); if (group != NULL) { group->my_status = QQ_GROUP_MEMBER_STATUS_NOT_MEMBER; qq_group_refresh(gc, group); @@ -211,7 +211,7 @@ gaim_notify_warning(gc, _("QQ Qun Operation"), msg, NULL); - group = qq_group_find_by_internal_group_id(gc, internal_group_id); + group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); if (group != NULL) { group->my_status = QQ_GROUP_MEMBER_STATUS_IS_MEMBER; qq_group_refresh(gc, group); @@ -246,7 +246,7 @@ msg = g_strdup_printf(_("You [%d] has exit group \"%d\""), uid, external_group_id); gaim_notify_info(gc, _("QQ Qun Operation"), msg, NULL); - group = qq_group_find_by_internal_group_id(gc, internal_group_id); + group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); if (group != NULL) { group->my_status = QQ_GROUP_MEMBER_STATUS_NOT_MEMBER; qq_group_refresh(gc, group); @@ -278,14 +278,14 @@ g_return_if_fail(external_group_id > 0 && uid > 0); msg = g_strdup_printf(_("You [%d] has been added by group \"%d\""), uid, external_group_id); - gaim_notify_info(gc, _("QQ Qun Operation"), msg, _("OpenQ has added this group to your buddy list")); + gaim_notify_info(gc, _("QQ Qun Operation"), msg, _("This group has been added to your buddy list")); - group = qq_group_find_by_internal_group_id(gc, internal_group_id); + group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); if (group != NULL) { group->my_status = QQ_GROUP_MEMBER_STATUS_IS_MEMBER; qq_group_refresh(gc, group); } else { /* no such group, try to create a dummy first, and then update */ - group = qq_group_create_by_id(gc, internal_group_id, external_group_id); + group = qq_group_create_internal_record(gc, internal_group_id, external_group_id, NULL); group->my_status = QQ_GROUP_MEMBER_STATUS_IS_MEMBER; qq_group_refresh(gc, group); qq_send_cmd_group_get_group_info(gc, group); @@ -379,7 +379,7 @@ else msg_utf8_encoded = qq_to_utf8(msg_with_gaim_smiley, QQ_CHARSET_DEFAULT); - group = qq_group_find_by_internal_group_id(gc, internal_group_id); + group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); g_return_if_fail(group != NULL); conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, group->group_name_utf8, gaim_connection_get_account(gc)); Modified: trunk/libgaim/protocols/qq/group_info.c =================================================================== --- trunk/libgaim/protocols/qq/group_info.c 2006-09-01 10:05:30 UTC (rev 17111) +++ trunk/libgaim/protocols/qq/group_info.c 2006-09-01 11:03:18 UTC (rev 17112) @@ -26,7 +26,7 @@ #include "buddy_status.h" #include "char_conv.h" #include "group_find.h" -#include "group_hash.h" +#include "group_internal.h" #include "group_info.h" #include "buddy_status.h" #include "group_network.h" @@ -42,7 +42,7 @@ (time(NULL) - member->last_refresh) > QQ_GROUP_CHAT_REFRESH_NICKNAME_INTERNAL; } -/* this is done when we receive the reply to get_online_member sub_cmd +/* this is done when we receive the reply to get_online_members sub_cmd * all member are set offline, and then only those in reply packets are online */ static void _qq_group_set_members_all_offline(qq_group *group) { @@ -82,7 +82,7 @@ } /* send packet to get online group member, called by keep_alive */ -void qq_send_cmd_group_get_online_member(GaimConnection *gc, qq_group *group) +void qq_send_cmd_group_get_online_members(GaimConnection *gc, qq_group *group) { guint8 *raw_data, *cursor; gint bytes, data_len; @@ -111,8 +111,8 @@ qq_send_group_cmd(gc, group, raw_data, data_len); } -/* send packet to get group member info */ -void qq_send_cmd_group_get_member_info(GaimConnection *gc, qq_group *group) +/* send packet to get info for each group member */ +void qq_send_cmd_group_get_members_info(GaimConnection *gc, qq_group *group) { guint8 *raw_data, *cursor; gint bytes, data_len, i; @@ -160,9 +160,10 @@ qq_buddy *member; qq_data *qd; GaimConversation *gaim_conv; - guint8 orgnization, role; - guint16 unknown; - guint32 member_uid, internal_group_id; + guint8 organization, role; + guint16 unknown, max_members; + guint32 member_uid, internal_group_id, external_group_id; + GSList *pending_id; gint pascal_len, i; guint32 unknown4; guint8 unknown1; @@ -173,11 +174,18 @@ read_packet_dw(data, cursor, len, &(internal_group_id)); g_return_if_fail(internal_group_id > 0); + read_packet_dw(data, cursor, len, &(external_group_id)); + g_return_if_fail(internal_group_id > 0); - group = qq_group_find_by_internal_group_id(gc, internal_group_id); + pending_id = qq_get_pending_id(qd->adding_groups_from_server, internal_group_id); + if (pending_id != NULL) { + qq_set_pending_id(&qd->adding_groups_from_server, internal_group_id, FALSE); + qq_group_create_internal_record(gc, internal_group_id, external_group_id, NULL); + } + + group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); g_return_if_fail(group != NULL); - read_packet_dw(data, cursor, len, &(group->external_group_id)); read_packet_b(data, cursor, len, &(group->group_type)); read_packet_dw(data, cursor, len, &unknown4); /* unknown 4 bytes */ read_packet_dw(data, cursor, len, &(group->creator_uid)); @@ -185,7 +193,7 @@ read_packet_dw(data, cursor, len, &unknown4); /* oldCategory */ read_packet_w(data, cursor, len, &unknown); read_packet_dw(data, cursor, len, &(group->group_category)); - read_packet_w(data, cursor, len, &(unknown)); /* 0x0000 */ + read_packet_w(data, cursor, len, &max_members); read_packet_b(data, cursor, len, &unknown1); read_packet_dw(data, cursor, len, &(unknown4)); /* versionID */ @@ -202,17 +210,18 @@ while (*cursor < data + len) { read_packet_dw(data, cursor, len, &member_uid); i++; - read_packet_b(data, cursor, len, &orgnization); + read_packet_b(data, cursor, len, &organization); read_packet_b(data, cursor, len, &role); - if(orgnization != 0 || role != 0) { - gaim_debug(GAIM_DEBUG_INFO, "QQ", "group member %d: orgnizatio=%d, role=%d\n", member_uid, orgnization, role); + if(organization != 0 || role != 0) { + gaim_debug(GAIM_DEBUG_INFO, "QQ", "group member %d: organization=%d, role=%d\n", member_uid, organization, role); } member = qq_group_find_or_add_member(gc, group, member_uid); - member->role = role; + if (member != NULL) + member->role = role; } if(*cursor > (data + len)) { - gaim_debug(GAIM_DEBUG_ERROR, "QQ", "group_cmd_get_group_info: Dangerous error! maybe protocal changed, notify me!"); + gaim_debug(GAIM_DEBUG_ERROR, "QQ", "group_cmd_get_group_info: Dangerous error! maybe protocol changed, notify me!"); } gaim_debug(GAIM_DEBUG_INFO, "QQ", "group \"%s\" has %d members\n", group->group_name_utf8, i); @@ -233,7 +242,7 @@ } } -void qq_process_group_cmd_get_online_member(guint8 *data, guint8 **cursor, gint len, GaimConnection *gc) +void qq_process_group_cmd_get_online_members(guint8 *data, guint8 **cursor, gint len, GaimConnection *gc) { guint32 internal_group_id, member_uid; guint8 unknown; @@ -254,7 +263,7 @@ bytes += read_packet_b(data, cursor, len, &unknown); /* 0x3c ?? */ g_return_if_fail(internal_group_id > 0); - group = qq_group_find_by_internal_group_id(gc, internal_group_id); + group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); if (group == NULL) { gaim_debug(GAIM_DEBUG_ERROR, "QQ", "We have no group info for internal id [%d]\n", internal_group_id); @@ -272,14 +281,14 @@ } if(*cursor > (data + len)) { gaim_debug(GAIM_DEBUG_ERROR, "QQ", - "group_cmd_get_online_member: Dangerous error! maybe protocol changed, notify developers!"); + "group_cmd_get_online_members: Dangerous error! maybe protocol changed, notify developers!"); } gaim_debug(GAIM_DEBUG_INFO, "QQ", "Group \"%s\" has %d online members\n", group->group_name_utf8, i); } -/* process the reply to get_member_info packet */ -void qq_process_group_cmd_get_member_info(guint8 *data, guint8 **cursor, gint len, GaimConnection *gc) +/* process the reply to get_members_info packet */ +void qq_process_group_cmd_get_members_info(guint8 *data, guint8 **cursor, gint len, GaimConnection *gc) { guint32 internal_group_id, member_uid; guint16 unknown; @@ -292,10 +301,13 @@ read_packet_dw(data, cursor, len, &internal_group_id); g_return_if_fail(internal_group_id > 0); - group = qq_group_find_by_internal_group_id(gc, internal_group_id); + group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); g_return_if_fail(group != NULL); i = 0; + /* TODO: Something is off. I get an entry with strange values + * (including a nick of "") buried in here. I need to find more + * groups to join before I can figure this out */ /* now starts the member info, as get buddy list reply */ while (*cursor < data + len) { read_packet_dw(data, cursor, len, &member_uid); @@ -317,7 +329,7 @@ } if(*cursor > (data + len)) { gaim_debug(GAIM_DEBUG_ERROR, "QQ", - "group_cmd_get_member_info: Dangerous error! maybe protocol changed, notify developers!"); + "group_cmd_get_members_info: Dangerous error! maybe protocol changed, notify developers!"); } gaim_debug(GAIM_DEBUG_INFO, "QQ", "Group \"%s\" obtained %d member info\n", group->group_name_utf8, i); } Modified: trunk/libgaim/protocols/qq/group_info.h =================================================================== --- trunk/libgaim/protocols/qq/group_info.h 2006-09-01 10:05:30 UTC (rev 17111) +++ trunk/libgaim/protocols/qq/group_info.h 2006-09-01 11:03:18 UTC (rev 17112) @@ -28,10 +28,10 @@ #include "group.h" void qq_send_cmd_group_get_group_info(GaimConnection *gc, qq_group *group); -void qq_send_cmd_group_get_online_member(GaimConnection *gc, qq_group *group); -void qq_send_cmd_group_get_member_info(GaimConnection *gc, qq_group *group); +void qq_send_cmd_group_get_online_members(GaimConnection *gc, qq_group *group); +void qq_send_cmd_group_get_members_info(GaimConnection *gc, qq_group *group); void qq_process_group_cmd_get_group_info(guint8 *data, guint8 **cursor, gint len, GaimConnection *gc); -void qq_process_group_cmd_get_online_member(guint8 *data, guint8 **cursor, gint len, GaimConnection *gc); -void qq_process_group_cmd_get_member_info(guint8 *data, guint8 **cursor, gint len, GaimConnection *gc); +void qq_process_group_cmd_get_online_members(guint8 *data, guint8 **cursor, gint len, GaimConnection *gc); +void qq_process_group_cmd_get_members_info(guint8 *data, guint8 **cursor, gint len, GaimConnection *gc); #endif Added: trunk/libgaim/protocols/qq/group_internal.c =================================================================== --- trunk/libgaim/protocols/qq/group_internal.c (rev 0) +++ trunk/libgaim/protocols/qq/group_internal.c 2006-09-01 11:03:18 UTC (rev 17112) @@ -0,0 +1,238 @@ +/** +* The QQ2003C protocol plugin + * + * for gaim + * + * Copyright (C) 2004 Puzzlebird + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "blist.h" +#include "debug.h" + +#include "buddy_opt.h" +#include "group_free.h" +#include "group_internal.h" +#include "group_misc.h" +#include "utils.h" + +static gchar *_qq_group_set_my_status_desc(qq_group *group) +{ + const char *status_desc; + g_return_val_if_fail(group != NULL, g_strdup("")); + + switch (group->my_status) { + case QQ_GROUP_MEMBER_STATUS_NOT_MEMBER: + status_desc = _("I am not member"); + break; + case QQ_GROUP_MEMBER_STATUS_IS_MEMBER: + status_desc = _("I am a member"); + break; + case QQ_GROUP_MEMBER_STATUS_APPLYING: + status_desc = _("I am applying to join"); + break; + case QQ_GROUP_MEMBER_STATUS_IS_ADMIN: + status_desc = _("I am the admin"); + break; + default: + status_desc = _("Unknown status"); + } + + return g_strdup(status_desc); +} + +static void _qq_group_add_to_blist(GaimConnection *gc, qq_group *group) +{ + GHashTable *components; + GaimGroup *g; + GaimChat *chat; + components = qq_group_to_hashtable(group); + chat = gaim_chat_new(gaim_connection_get_account(gc), group->group_name_utf8, components); + g = qq_get_gaim_group(GAIM_GROUP_QQ_QUN); + gaim_blist_add_chat(chat, g, NULL); + gaim_debug(GAIM_DEBUG_INFO, "QQ", "You have added group \"%s\" to blist locally\n", group->group_name_utf8); +} + +/* Create a dummy qq_group, which includes only internal_id, external_id, + * and potentially group_name_utf8, in case we need to call group_conv_show_window + * right after creation. All other attributes are set to empty. + * We need to send a get_group_info to the QQ server to update it right away */ +qq_group *qq_group_create_internal_record(GaimConnection *gc, + guint32 internal_id, guint32 external_id, gchar *group_name_utf8) +{ + qq_group *group; + qq_data *qd; + + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL); + g_return_val_if_fail(internal_id > 0, NULL); + qd = (qq_data *) gc->proto_data; + + group = g_new0(qq_group, 1); + group->my_status = QQ_GROUP_MEMBER_STATUS_NOT_MEMBER; + group->my_status_desc = _qq_group_set_my_status_desc(group); + group->internal_group_id = internal_id; + group->external_group_id = external_id; + group->group_type = 0x01; /* assume permanent Qun */ + group->creator_uid = 10000; /* assume by QQ admin */ + group->group_category = 0x01; + group->auth_type = 0x02; /* assume need auth */ + group->group_name_utf8 = g_strdup(group_name_utf8 == NULL ? "" : group_name_utf8); + group->group_desc_utf8 = g_strdup(""); + group->notice_utf8 = g_strdup(""); + group->members = NULL; + + qd->groups = g_list_append(qd->groups, group); + _qq_group_add_to_blist(gc, group); + + return group; +} + +void qq_group_delete_internal_record(qq_data *qd, guint32 internal_group_id) +{ + qq_group *group; + GList *list; + g_return_if_fail(qd != NULL); + + list = qd->groups; + while (list != NULL) { + group = (qq_group *) qd->groups->data; + if (internal_group_id == group->internal_group_id) { + qd->groups = g_list_remove(qd->groups, group); + qq_group_free(group); + break; + } else { + list = list->next; + } + } +} + +/* convert a qq_group to hash-table, which could be component of GaimChat */ +GHashTable *qq_group_to_hashtable(qq_group *group) +{ + GHashTable *components; + components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_MEMBER_STATUS), g_strdup_printf("%d", group->my_status)); + group->my_status_desc = _qq_group_set_my_status_desc(group); + + g_hash_table_insert(components, + g_strdup(QQ_GROUP_KEY_INTERNAL_ID), g_strdup_printf("%d", group->internal_group_id)); + g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_EXTERNAL_ID), + g_strdup_printf("%d", group->external_group_id)); + g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_GROUP_TYPE), g_strdup_printf("%d", group->group_type)); + g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_CREATOR_UID), g_strdup_printf("%d", group->creator_uid)); + g_hash_table_insert(components, + g_strdup(QQ_GROUP_KEY_GROUP_CATEGORY), g_strdup_printf("%d", group->group_category)); + g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_AUTH_TYPE), g_strdup_printf("%d", group->auth_type)); + g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_MEMBER_STATUS_DESC), g_strdup(group->my_status_desc)); + g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_GROUP_NAME_UTF8), g_strdup(group->group_name_utf8)); + g_hash_table_insert(components, g_strdup(QQ_GROUP_KEY_GROUP_DESC_UTF8), g_strdup(group->group_desc_utf8)); + return components; +} + +/* create a qq_group from hashtable */ +qq_group *qq_group_from_hashtable(GaimConnection *gc, GHashTable *data) +{ + qq_data *qd; + qq_group *group; + + g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL); + g_return_val_if_fail(data != NULL, NULL); + qd = (qq_data *) gc->proto_data; + + group = g_new0(qq_group, 1); + group->my_status = + qq_string_to_dec_value + (NULL == + g_hash_table_lookup(data, + QQ_GROUP_KEY_MEMBER_STATUS) ? + g_strdup_printf("%d", + QQ_GROUP_MEMBER_STATUS_NOT_MEMBER) : + g_hash_table_lookup(data, QQ_GROUP_KEY_MEMBER_STATUS)); + group->internal_group_id = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_INTERNAL_ID)); + group->external_group_id = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_EXTERNAL_ID)); + group->group_type = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_GROUP_TYPE)); + group->creator_uid = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_CREATOR_UID)); + group->group_category = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_GROUP_CATEGORY)); + group->auth_type = qq_string_to_dec_value(g_hash_table_lookup(data, QQ_GROUP_KEY_AUTH_TYPE)); + group->group_name_utf8 = g_strdup(g_hash_table_lookup(data, QQ_GROUP_KEY_GROUP_NAME_UTF8)); + group->group_desc_utf8 = g_strdup(g_hash_table_lookup(data, QQ_GROUP_KEY_GROUP_DESC_UTF8)); + group->my_status_desc = _qq_group_set_my_status_desc(group); + + qd->groups = g_list_append(qd->groups, group); + + return group; +} + +/* refresh group local subscription */ +void qq_group_refresh(GaimConnection *gc, qq_group *group) +{ + GaimChat *chat; + gchar *external_group_id; + g_return_if_fail(gc != NULL && group != NULL); + + external_group_id = g_strdup_printf("%d", group->external_group_id); + chat = gaim_blist_find_chat(gaim_connection_get_account(gc), external_group_id); + g_free(external_group_id); + if (chat == NULL && group->my_status != QQ_GROUP_MEMBER_STATUS_NOT_MEMBER) { + _qq_group_add_to_blist(gc, group); + } else if (chat != NULL) { /* we have a local record, update its info */ + /* if there is group_name_utf8, we update the group name */ + if (group->group_name_utf8 != NULL && strlen(group->group_name_utf8) > 0) + gaim_blist_alias_chat(chat, group->group_name_utf8); + g_hash_table_replace(chat->components, + g_strdup(QQ_GROUP_KEY_MEMBER_STATUS), g_strdup_printf("%d", group->my_status)); + group->my_status_desc = _qq_group_set_my_status_desc(group); + g_hash_table_replace(chat->components, + g_strdup(QQ_GROUP_KEY_MEMBER_STATUS_DESC), g_strdup(group->my_status_desc)); + g_hash_table_replace(chat->components, + g_strdup(QQ_GROUP_KEY_INTERNAL_ID), + g_strdup_printf("%d", group->internal_group_id)); + g_hash_table_replace(chat->components, + g_strdup(QQ_GROUP_KEY_EXTERNAL_ID), + g_strdup_printf("%d", group->external_group_id)); + g_hash_table_replace(chat->components, + g_strdup(QQ_GROUP_KEY_GROUP_TYPE), g_strdup_printf("%d", group->group_type)); + g_hash_table_replace(chat->components, + g_strdup(QQ_GROUP_KEY_CREATOR_UID), g_strdup_printf("%d", group->creator_uid)); + g_hash_table_replace(chat->components, + g_strdup(QQ_GROUP_KEY_GROUP_CATEGORY), + g_strdup_printf("%d", group->group_category)); + g_hash_table_replace(chat->components, + g_strdup(QQ_GROUP_KEY_AUTH_TYPE), g_strdup_printf("%d", group->auth_type)); + g_hash_table_replace(chat->components, + g_strdup(QQ_GROUP_KEY_GROUP_NAME_UTF8), g_strdup(group->group_name_utf8)); + g_hash_table_replace(chat->components, + g_strdup(QQ_GROUP_KEY_GROUP_DESC_UTF8), g_strdup(group->group_desc_utf8)); + } +} + +/* NOTE: If we knew how to convert between an external and internal group id, as the official + * client seems to, the following would be unnecessary. That would be ideal. */ + +/* Use list to specify if id's alternate id is pending discovery. */ +void qq_set_pending_id(GSList **list, guint32 id, gboolean pending) +{ + if (pending) + *list = g_slist_prepend(*list, GINT_TO_POINTER(id)); + else + *list = g_slist_remove(*list, GINT_TO_POINTER(id)); +} + +/* Return the location of id in list, or NULL if not found */ +GSList *qq_get_pending_id(GSList *list, guint32 id) +{ + return g_slist_find(list, GINT_TO_POINTER(id)); +} Property changes on: trunk/libgaim/protocols/qq/group_internal.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: trunk/libgaim/protocols/qq/group_internal.h =================================================================== --- trunk/libgaim/protocols/qq/group_internal.h (rev 0) +++ trunk/libgaim/protocols/qq/group_internal.h 2006-09-01 11:03:18 UTC (rev 17112) @@ -0,0 +1,52 @@ +/** +* The QQ2003C protocol plugin + * + * for gaim + * + * Copyright (C) 2004 Puzzlebird + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _QQ_GROUP_HASH_H_ +#define _QQ_GROUP_HASH_H_ + +#include <glib.h> +#include "group.h" + +#define QQ_GROUP_KEY_MEMBER_STATUS "my_status_code" +#define QQ_GROUP_KEY_MEMBER_STATUS_DESC "my_status_desc" +#define QQ_GROUP_KEY_INTERNAL_ID "internal_group_id" +#define QQ_GROUP_KEY_EXTERNAL_ID "external_group_id" +#define QQ_GROUP_KEY_GROUP_TYPE "group_type" +#define QQ_GROUP_KEY_CREATOR_UID "creator_uid" +#define QQ_GROUP_KEY_GROUP_CATEGORY "group_category" +#define QQ_GROUP_KEY_AUTH_TYPE "auth_type" +#define QQ_GROUP_KEY_GROUP_NAME_UTF8 "group_name_utf8" +#define QQ_GROUP_KEY_GROUP_DESC_UTF8 "group_desc_utf8" + +qq_group *qq_group_create_internal_record(GaimConnection *gc, + guint32 internal_id, guint32 external_id, gchar *group_name_utf8); +void qq_group_delete_internal_record(qq_data *qd, guint32 internal_group_id); + +GHashTable *qq_group_to_hashtable(qq_group *group); +qq_group *qq_group_from_hashtable(GaimConnection *gc, GHashTable *data); + +void qq_group_refresh(GaimConnection *gc, qq_group *group); + +void qq_set_pending_id(GSList **list, guint32 id, gboolean pending); +GSList *qq_get_pending_id(GSList *list, guint32 id); + +#endif Property changes on: trunk/libgaim/protocols/qq/group_internal.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: trunk/libgaim/protocols/qq/group_join.c =================================================================== --- trunk/libgaim/protocols/qq/group_join.c 2006-09-01 10:05:30 UTC (rev 17111) +++ trunk/libgaim/protocols/qq/group_join.c 2006-09-01 11:03:18 UTC (rev 17112) @@ -30,11 +30,12 @@ #include "group_conv.h" #include "group_find.h" #include "group_free.h" -#include "group_hash.h" +#include "group_internal.h" #include "group_info.h" #include "group_join.h" #include "group_opt.h" #include "group_network.h" +#include "group_search.h" enum { QQ_GROUP_JOIN_OK = 0x01, @@ -51,24 +52,37 @@ gc = g->gc; internal_group_id = g->uid; - group = qq_group_find_by_internal_group_id(gc, internal_group_id); + group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); g_return_if_fail(group != NULL); qq_send_cmd_group_exit_group(gc, group); } /* send packet to join a group without auth */ -static void _qq_send_cmd_group_join_group(GaimConnection *gc, qq_group *group) +void qq_send_cmd_group_join_group(GaimConnection *gc, qq_group *group) { guint8 *raw_data, *cursor; gint bytes, data_len; g_return_if_fail(gc != NULL && group != NULL); + if (group->my_status == QQ_GROUP_MEMBER_STATUS_NOT_MEMBER) { group->my_status = QQ_GROUP_MEMBER_STATUS_APPLYING; qq_group_refresh(gc, group); } + switch (group->auth_type) { + case QQ_GROUP_AUTH_TYPE_NO_AUTH: + case QQ_GROUP_AUTH_TYPE_NEED_AUTH: + break; + case QQ_GROUP_AUTH_TYPE_NO_ADD: + gaim_notify_warning(gc, NULL, _("This group does not allow others to join"), NULL); + return; + default: + gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Unknown group auth type: %d\n", group->auth_type); + break; + } + data_len = 5; raw_data = g_newa(guint8, data_len); cursor = raw_data; @@ -94,7 +108,7 @@ gc = g->gc; internal_group_id = g->uid; - group = qq_group_find_by_internal_group_id(gc, internal_group_id); + group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); if (group == NULL) { gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Can not find qq_group by internal_id: %d\n", internal_group_id); return; @@ -163,15 +177,7 @@ qq_send_group_cmd(gc, group, raw_data, data_len); } -/* send packet to exit one group - * In fact, this will never be used for GAIM - * when we remove a GaimChat node, there is no user controlable callback - * so we only remove the GaimChat node, - * but we never use this cmd to update the server side - * anyway, it is function, as when we remove the GaimChat node, - * user has no way to start up the chat conversation window - * therefore even we are still in it, - * the group IM will not show up to bother us. (Limited by GAIM) */ +/* send a packet to exit a group */ void qq_send_cmd_group_exit_group(GaimConnection *gc, qq_group *group) { guint8 *raw_data, *cursor; @@ -212,16 +218,16 @@ bytes += read_packet_dw(data, cursor, len, &internal_group_id); if (bytes == expected_bytes) { - group = qq_group_find_by_internal_group_id(gc, internal_group_id); + group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); if (group != NULL) { chat = gaim_blist_find_chat (gaim_connection_get_account(gc), g_strdup_printf("%d", group->external_group_id)); if (chat != NULL) gaim_blist_remove_chat(chat); - qq_group_remove_by_internal_group_id(qd, internal_group_id); + qq_group_delete_internal_record(qd, internal_group_id); } - gaim_notify_info(gc, _("QQ Qun Operation"), _("You have successfully exit group"), NULL); + gaim_notify_info(gc, _("QQ Qun Operation"), _("You have successfully exited the group"), NULL); } else { gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Invalid exit group reply, expect %d bytes, read %d bytes\n", expected_bytes, bytes); @@ -246,7 +252,8 @@ if (bytes == expected_bytes) gaim_notify_info - (gc, _("QQ Group Auth"), _("You authorization operation has been accepted by QQ server"), NULL); + (gc, _("QQ Group Auth"), + _("Your authorization operation has been accepted by the QQ server"), NULL); else gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Invalid join group reply, expect %d bytes, read %d bytes\n", expected_bytes, bytes); @@ -272,7 +279,7 @@ "Invalid join group reply, expect %d bytes, read %d bytes\n", expected_bytes, bytes); return; } else { /* join group OK */ - group = qq_group_find_by_internal_group_id(gc, internal_group_id); + group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); /* need to check if group is NULL or not. */ g_return_if_fail(group != NULL); switch (reply) { @@ -280,7 +287,7 @@ gaim_debug(GAIM_DEBUG_INFO, "QQ", "Succeed joining group \"%s\"\n", group->group_name_utf8); group->my_status = QQ_GROUP_MEMBER_STATUS_IS_MEMBER; qq_group_refresh(gc, group); - /* this must be show before getting online member */ + /* this must be shown before getting online members */ qq_group_conv_show_window(gc, group); qq_send_cmd_group_get_group_info(gc, group); break; @@ -300,38 +307,33 @@ } } -/* Apply to join one group without auth */ +/* Attempt to join a group without auth */ void qq_group_join(GaimConnection *gc, GHashTable *data) { - gchar *internal_group_id_ptr; - guint32 internal_group_id; + qq_data *qd; + gchar *external_group_id_ptr; + guint32 external_group_id; qq_group *group; - g_return_if_fail(gc != NULL && data != NULL); + g_return_if_fail(gc != NULL && gc->proto_data != NULL && data != NULL); + qd = (qq_data *) gc->proto_data; - internal_group_id_ptr = g_hash_table_lookup(data, "internal_group_id"); - internal_group_id = strtol(internal_group_id_ptr, NULL, 10); + external_group_id_ptr = g_hash_table_lookup(data, QQ_GROUP_KEY_EXTERNAL_ID); + g_return_if_fail(external_group_id_ptr != NULL); + errno = 0; + external_group_id = strtol(external_group_id_ptr, NULL, 10); + if (errno != 0) { + gaim_notify_error(gc, _("Error"), + _("You inputted a group id outside the acceptable range"), NULL); + return; + } - g_return_if_fail(internal_group_id > 0); - - /* for those we have subscribed, they should have been put into - * qd->groups in qq_group_init subroutine */ - group = qq_group_find_by_internal_group_id(gc, internal_group_id); - if (group == NULL) - group = qq_group_from_hashtable(gc, data); - - g_return_if_fail(group != NULL); - - switch (group->auth_type) { - case QQ_GROUP_AUTH_TYPE_NO_AUTH: - case QQ_GROUP_AUTH_TYPE_NEED_AUTH: - _qq_send_cmd_group_join_group(gc, group); - break; - case QQ_GROUP_AUTH_TYPE_NO_ADD: - gaim_notify_warning(gc, NULL, _("This group does not allow others to join"), NULL); - break; - default: - gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Unknown group auth type: %d\n", group->auth_type); + group = qq_group_find_by_id(gc, external_group_id, QQ_EXTERNAL_ID); + if (group) { + qq_send_cmd_group_join_group(gc, group); + } else { + qq_set_pending_id(&qd->joining_groups, external_group_id, TRUE); + qq_send_cmd_group_search_group(gc, external_group_id); } } Modified: trunk/libgaim/protocols/qq/group_join.h =================================================================== --- trunk/libgaim/protocols/qq/group_join.h 2... [truncated message content] |
From: <mar...@us...> - 2006-09-11 02:02:36
|
Revision: 17239 http://svn.sourceforge.net/gaim/?rev=17239&view=rev Author: markhuetsch Date: 2006-09-10 19:02:18 -0700 (Sun, 10 Sep 2006) Log Message: ----------- We don't need to dynamically allocate all of these buffers. Modified Paths: -------------- trunk/libgaim/protocols/qq/buddy_info.c trunk/libgaim/protocols/qq/buddy_opt.c trunk/libgaim/protocols/qq/group_search.c Modified: trunk/libgaim/protocols/qq/buddy_info.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_info.c 2006-09-11 01:57:20 UTC (rev 17238) +++ trunk/libgaim/protocols/qq/buddy_info.c 2006-09-11 02:02:18 UTC (rev 17239) @@ -285,13 +285,13 @@ void qq_send_packet_get_info(GaimConnection *gc, guint32 uid, gboolean show_window) { qq_data *qd; - gchar *uid_str; + gchar uid_str[11]; qq_info_query *query; g_return_if_fail(gc != NULL && gc->proto_data != NULL && uid != 0); qd = (qq_data *) gc->proto_data; - uid_str = g_strdup_printf("%d", uid); + g_snprintf(uid_str, sizeof(uid_str), "%d", uid); qq_send_cmd(gc, QQ_CMD_GET_USER_INFO, TRUE, 0, TRUE, (guint8 *) uid_str, strlen(uid_str)); query = g_new0(qq_info_query, 1); @@ -299,8 +299,6 @@ query->show_window = show_window; query->modify_info = FALSE; qd->info_query = g_list_append(qd->info_query, query); - - g_free(uid_str); } /* set up the fields requesting personal information and send a get_info packet Modified: trunk/libgaim/protocols/qq/buddy_opt.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_opt.c 2006-09-11 01:57:20 UTC (rev 17238) +++ trunk/libgaim/protocols/qq/buddy_opt.c 2006-09-11 02:02:18 UTC (rev 17239) @@ -59,15 +59,13 @@ /* send packet to remove a buddy from my buddy list */ static void _qq_send_packet_remove_buddy(GaimConnection *gc, guint32 uid) { - gchar *uid_str; + gchar uid_str[11]; g_return_if_fail(gc != NULL && uid > 0); - uid_str = g_strdup_printf("%d", uid); + g_snprintf(uid_str, sizeof(uid_str), "%d", uid); qq_send_cmd(gc, QQ_CMD_DEL_FRIEND, TRUE, 0, TRUE, (guint8 *) uid_str, strlen(uid_str)); - - g_free(uid_str); } /* try to remove myself from someone's buddy list */ @@ -89,15 +87,14 @@ { qq_data *qd; qq_add_buddy_request *req; - gchar *uid_str; + gchar uid_str[11]; g_return_if_fail(gc != NULL && gc->proto_data != NULL && uid > 0); /* we need to send the ascii code of this uid to qq server */ - uid_str = g_strdup_printf("%d", uid); + g_snprintf(uid_str, sizeof(uid_str), "%d", uid); qq_send_cmd(gc, QQ_CMD_ADD_FRIEND_WO_AUTH, TRUE, 0, TRUE, (guint8 *) uid_str, strlen(uid_str)); - g_free(uid_str); /* must be set after sending packet to get the correct send_seq */ qd = (qq_data *) gc->proto_data; @@ -110,12 +107,12 @@ /* this buddy needs authentication, text conversion is done at lowest level */ static void _qq_send_packet_buddy_auth(GaimConnection *gc, guint32 uid, const gchar response, const gchar *text) { - gchar *text_qq, *uid_str; + gchar *text_qq, uid_str[11]; guint8 bar, *cursor, *raw_data; g_return_if_fail(gc != NULL && uid != 0); - uid_str = g_strdup_printf("%d", uid); + g_snprintf(uid_str, sizeof(uid_str), "%d", uid); bar = 0x1f; raw_data = g_newa(guint8, QQ_MSG_IM_MAX); cursor = raw_data; @@ -132,7 +129,6 @@ } qq_send_cmd(gc, QQ_CMD_BUDDY_AUTH, TRUE, 0, TRUE, raw_data, cursor - raw_data); - g_free(uid_str); } static void _qq_send_packet_add_buddy_auth_with_gc_and_uid(gc_and_uid *g, const gchar *text) Modified: trunk/libgaim/protocols/qq/group_search.c =================================================================== --- trunk/libgaim/protocols/qq/group_search.c 2006-09-11 01:57:20 UTC (rev 17238) +++ trunk/libgaim/protocols/qq/group_search.c 2006-09-11 02:02:18 UTC (rev 17239) @@ -64,28 +64,22 @@ static void _qq_setup_roomlist(qq_data *qd, qq_group *group) { GaimRoomlistRoom *room; - gchar *field; + gchar field[11]; room = gaim_roomlist_room_new(GAIM_ROOMLIST_ROOMTYPE_ROOM, group->group_name_utf8, NULL); - field = g_strdup_printf("%d", group->external_group_id); + g_snprintf(field, sizeof(field), "%d", group->external_group_id); gaim_roomlist_room_add_field(qd->roomlist, room, field); - g_free(field); - field = g_strdup_printf("%d", group->creator_uid); + g_snprintf(field, sizeof(field), "%d", group->creator_uid); gaim_roomlist_room_add_field(qd->roomlist, room, field); - g_free(field); gaim_roomlist_room_add_field(qd->roomlist, room, group->group_desc_utf8); - field = g_strdup_printf("%d", group->internal_group_id); + g_snprintf(field, sizeof(field), "%d", group->internal_group_id); gaim_roomlist_room_add_field(qd->roomlist, room, field); - g_free(field); - field = g_strdup_printf("%d", group->group_type); + g_snprintf(field, sizeof(field), "%d", group->group_type); gaim_roomlist_room_add_field(qd->roomlist, room, field); - g_free(field); - field = g_strdup_printf("%d", group->auth_type); + g_snprintf(field, sizeof(field), "%d", group->auth_type); gaim_roomlist_room_add_field(qd->roomlist, room, field); - g_free(field); - field = g_strdup_printf("%d", group->group_category); + g_snprintf(field, sizeof(field), "%d", group->group_category); gaim_roomlist_room_add_field(qd->roomlist, room, field); - g_free(field); gaim_roomlist_room_add_field(qd->roomlist, room, group->group_name_utf8); gaim_roomlist_room_add(qd->roomlist, room); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dat...@us...> - 2006-09-14 19:26:11
|
Revision: 17277 http://svn.sourceforge.net/gaim/?rev=17277&view=rev Author: datallah Date: 2006-09-14 12:26:04 -0700 (Thu, 14 Sep 2006) Log Message: ----------- Patch from Joymarquis to make qq compile on win32. Modified Paths: -------------- trunk/libgaim/protocols/qq/Makefile.mingw trunk/libgaim/protocols/qq/crypt.c Property Changed: ---------------- trunk/libgaim/protocols/qq/ Property changes on: trunk/libgaim/protocols/qq ___________________________________________________________________ Name: svn:ignore - Makefile.in Makefile .deps .libs *.la *.lo + Makefile.in Makefile .deps .libs *.la *.lo *.dll Modified: trunk/libgaim/protocols/qq/Makefile.mingw =================================================================== --- trunk/libgaim/protocols/qq/Makefile.mingw 2006-09-14 18:53:56 UTC (rev 17276) +++ trunk/libgaim/protocols/qq/Makefile.mingw 2006-09-14 19:26:04 UTC (rev 17277) @@ -1,17 +1,14 @@ # # Makefile.mingw # -# Description: Makefile for win32 (mingw) version of OpenQ src +# Description: Makefile for win32 (mingw) version of the QQ prpl # GAIM_TOP := ../../.. include $(GAIM_TOP)/libgaim/win32/global.mak -TARGET = openq -OPENQ_TOP := .. +TARGET = libqq TYPE = PLUGIN -OPENQ_VERSION := $(shell cat $(OPENQ_TOP)/VERSION) -DEFINES += -DOPENQ_VERSION=\"$(OPENQ_VERSION)\" # Static or Plugin... ifeq ($(TYPE),STATIC) @@ -27,7 +24,6 @@ ## INCLUDE PATHS ## INCLUDE_PATHS += \ - -I$(OPENQ_ROOT) \ -I$(GTK_TOP)/include \ -I$(GTK_TOP)/include/glib-2.0 \ -I$(GTK_TOP)/lib/glib-2.0/include \ @@ -73,7 +69,6 @@ send_core.c \ send_file.c \ sendqueue.c \ - show.c \ sys_msg.c \ udp_proxy_s5.c \ utils.c @@ -110,7 +105,7 @@ ## CLEAN RULES ## clean: - rm -rf $(OBJECTS) - rm -rf $(TARGET).dll + rm -f $(OBJECTS) + rm -f $(TARGET).dll include $(GAIM_COMMON_TARGETS) Modified: trunk/libgaim/protocols/qq/crypt.c =================================================================== --- trunk/libgaim/protocols/qq/crypt.c 2006-09-14 18:53:56 UTC (rev 17276) +++ trunk/libgaim/protocols/qq/crypt.c 2006-09-14 19:26:04 UTC (rev 17277) @@ -38,7 +38,11 @@ 0x61C88647 is what we can track on the ASM codes.!! */ +#ifdef _WIN32 +#include "win32dep.h" +#else #include <arpa/inet.h> +#endif #include <string.h> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-09-22 16:05:28
|
Revision: 17338 http://svn.sourceforge.net/gaim/?rev=17338&view=rev Author: markhuetsch Date: 2006-09-22 09:05:09 -0700 (Fri, 22 Sep 2006) Log Message: ----------- Eliminate a dependency in crypt.c by replacing ntohl() (etc) with g_ntohl() (etc). Also replace those calls in the rest of the QQ prpl, to be consistent. Modified Paths: -------------- trunk/libgaim/protocols/qq/crypt.c trunk/libgaim/protocols/qq/packet_parse.c trunk/libgaim/protocols/qq/qq_proxy.c trunk/libgaim/protocols/qq/send_file.c trunk/libgaim/protocols/qq/udp_proxy_s5.c Modified: trunk/libgaim/protocols/qq/crypt.c =================================================================== --- trunk/libgaim/protocols/qq/crypt.c 2006-09-22 06:45:01 UTC (rev 17337) +++ trunk/libgaim/protocols/qq/crypt.c 2006-09-22 16:05:09 UTC (rev 17338) @@ -38,12 +38,6 @@ 0x61C88647 is what we can track on the ASM codes.!! */ -#ifdef _WIN32 -#include "win32dep.h" -#else -#include <arpa/inet.h> -#endif - #include <string.h> #include "crypt.h" @@ -56,12 +50,12 @@ /* Tiny Encryption Algorithm (TEA) */ static void qq_encipher(guint32 *const v, const guint32 *const k, guint32 *const w) { - register guint32 y = ntohl(v[0]), - z = ntohl(v[1]), - a = ntohl(k[0]), - b = ntohl(k[1]), - c = ntohl(k[2]), - d = ntohl(k[3]), + register guint32 y = g_ntohl(v[0]), + z = g_ntohl(v[1]), + a = g_ntohl(k[0]), + b = g_ntohl(k[1]), + c = g_ntohl(k[2]), + d = g_ntohl(k[3]), n = 0x10, sum = 0, delta = 0x9E3779B9; /* 0x9E3779B9 - 0x100000000 = -0x61C88647 */ @@ -72,8 +66,8 @@ z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); } - w[0] = htonl(y); - w[1] = htonl(z); + w[0] = g_htonl(y); + w[1] = g_htonl(z); } static gint rand(void) { /* it can be the real random seed function */ @@ -175,12 +169,12 @@ static void qq_decipher(guint32 *const v, const guint32 *const k, guint32 *const w) { - register guint32 y = ntohl(v[0]), - z = ntohl(v[1]), - a = ntohl(k[0]), - b = ntohl(k[1]), - c = ntohl(k[2]), - d = ntohl(k[3]), + register guint32 y = g_ntohl(v[0]), + z = g_ntohl(v[1]), + a = g_ntohl(k[0]), + b = g_ntohl(k[1]), + c = g_ntohl(k[2]), + d = g_ntohl(k[3]), n = 0x10, sum = 0xE3779B90, /* why this ? must be related with n value */ delta = 0x9E3779B9; @@ -192,8 +186,8 @@ sum -= delta; } - w[0] = htonl(y); - w[1] = htonl(z); + w[0] = g_htonl(y); + w[1] = g_htonl(z); } static gint decrypt_block(const guint8 **crypt_buff, const gint instrlen, Modified: trunk/libgaim/protocols/qq/packet_parse.c =================================================================== --- trunk/libgaim/protocols/qq/packet_parse.c 2006-09-22 06:45:01 UTC (rev 17337) +++ trunk/libgaim/protocols/qq/packet_parse.c 2006-09-22 16:05:09 UTC (rev 17338) @@ -20,12 +20,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifndef _WIN32 -#include <arpa/inet.h> -#else -#include "win32dep.h" -#endif - #include <string.h> #include "packet_parse.h" @@ -48,7 +42,7 @@ gint read_packet_w(guint8 *buf, guint8 **cursor, gint buflen, guint16 *w) { if (*cursor <= buf + buflen - sizeof(*w)) { - *w = ntohs(**(guint16 **) cursor); + *w = g_ntohs(**(guint16 **) cursor); *cursor += sizeof(*w); return sizeof(*w); } else { @@ -61,7 +55,7 @@ gint read_packet_dw(guint8 *buf, guint8 **cursor, gint buflen, guint32 *dw) { if (*cursor <= buf + buflen - sizeof(*dw)) { - *dw = ntohl(**(guint32 **) cursor); + *dw = g_ntohl(**(guint32 **) cursor); *cursor += sizeof(*dw); return sizeof(*dw); } else { @@ -99,7 +93,7 @@ gint create_packet_w(guint8 *buf, guint8 **cursor, guint16 w) { if (*cursor <= buf + MAX_PACKET_SIZE - sizeof(guint16)) { - **(guint16 **) cursor = htons(w); + **(guint16 **) cursor = g_htons(w); *cursor += sizeof(guint16); return sizeof(guint16); } else { @@ -112,7 +106,7 @@ gint create_packet_dw(guint8 *buf, guint8 **cursor, guint32 dw) { if (*cursor <= buf + MAX_PACKET_SIZE - sizeof(guint32)) { - **(guint32 **) cursor = htonl(dw); + **(guint32 **) cursor = g_htonl(dw); *cursor += sizeof(guint32); return sizeof(guint32); } else { Modified: trunk/libgaim/protocols/qq/qq_proxy.c =================================================================== --- trunk/libgaim/protocols/qq/qq_proxy.c 2006-09-22 06:45:01 UTC (rev 17337) +++ trunk/libgaim/protocols/qq/qq_proxy.c 2006-09-22 16:05:09 UTC (rev 17338) @@ -50,7 +50,7 @@ socklen_t len = sizeof(sin); getsockname(fd, (struct sockaddr *)&sin, &len); gaim_debug(GAIM_DEBUG_INFO, desc, "%s:%d\n", - inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); + inet_ntoa(sin.sin_addr), g_ntohs(sin.sin_port)); } */ Modified: trunk/libgaim/protocols/qq/send_file.c =================================================================== --- trunk/libgaim/protocols/qq/send_file.c 2006-09-22 06:45:01 UTC (rev 17337) +++ trunk/libgaim/protocols/qq/send_file.c 2006-09-22 16:05:09 UTC (rev 17338) @@ -67,11 +67,11 @@ memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; if (!_qq_in_same_lan(info)) { - sin.sin_port = htons(info->remote_major_port); - sin.sin_addr.s_addr = htonl(info->remote_internet_ip); + sin.sin_port = g_htons(info->remote_major_port); + sin.sin_addr.s_addr = g_htonl(info->remote_internet_ip); } else { - sin.sin_port = htons(info->remote_minor_port); - sin.sin_addr.s_addr = htonl(info->remote_real_ip); + sin.sin_port = g_htons(info->remote_minor_port); + sin.sin_addr.s_addr = g_htonl(info->remote_real_ip); } return 0; } @@ -89,7 +89,7 @@ r = recvfrom(info->recv_fd, buf, len, 0, (struct sockaddr *) &sin, &sinlen); gaim_debug(GAIM_DEBUG_INFO, "QQ", "==> recv %d bytes from File UDP Channel, remote ip[%s], remote port[%d]\n", - r, inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); + r, inet_ntoa(sin.sin_addr), g_ntohs(sin.sin_port)); return r; } @@ -111,21 +111,21 @@ memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; if (!_qq_in_same_lan(info)) { - sin.sin_port = htons(info->remote_major_port); - sin.sin_addr.s_addr = htonl(info->remote_internet_ip); + sin.sin_port = g_htons(info->remote_major_port); + sin.sin_addr.s_addr = g_htonl(info->remote_internet_ip); } else if (info->use_major) { - sin.sin_port = htons(info->remote_major_port); - sin.sin_addr.s_addr = htonl(info->remote_real_ip); + sin.sin_port = g_htons(info->remote_major_port); + sin.sin_addr.s_addr = g_htonl(info->remote_real_ip); } else { - sin.sin_port = htons(info->remote_minor_port); - sin.sin_addr.s_addr = htonl(info->remote_real_ip); + sin.sin_port = g_htons(info->remote_minor_port); + sin.sin_addr.s_addr = g_htonl(info->remote_real_ip); } gaim_debug(GAIM_DEBUG_INFO, "QQ", "sending to channel: %d.%d.%d.%d:%d\n", sin.sin_addr.s_addr & 0xff, (sin.sin_addr.s_addr >> 8) & 0xff, (sin.sin_addr.s_addr >> 16) & 0xff, sin.sin_addr.s_addr >> 24, - ntohs(sin.sin_port) + g_ntohs(sin.sin_port) ); return sendto(info->sender_fd, buf, len, 0, (struct sockaddr *) &sin, sizeof(sin)); } @@ -230,9 +230,9 @@ gchar *internet_ip_str, *real_ip_str; guint32 ip; - ip = htonl(info->remote_real_ip); + ip = g_htonl(info->remote_real_ip); real_ip_str = gen_ip_str((guint8 *) &ip); - ip = htonl(info->remote_internet_ip); + ip = g_htonl(info->remote_internet_ip); internet_ip_str = gen_ip_str((guint8 *) &ip); gaim_debug(GAIM_DEBUG_INFO, "QQ", "remote internet ip[%s:%d], major port[%d], real ip[%s], minor port[%d]\n", internet_ip_str, info->remote_internet_port, @@ -369,7 +369,7 @@ if (ioctl(fd, SIOCGIFADDR, (char *) &buf[i]) >= 0) { ret = (((struct sockaddr_in *)(&buf[i].ifr_addr))->sin_addr).s_addr; - if (ret == ntohl(0x7f000001)) continue; + if (ret == g_ntohl(0x7f000001)) continue; return ret; } } @@ -391,7 +391,7 @@ /* debug info->local_real_ip = 0x7f000001; */ - info->local_real_ip = ntohl(inet_addr(gaim_network_get_my_ip(-1))); + info->local_real_ip = g_ntohl(inet_addr(gaim_network_get_my_ip(-1))); gaim_debug(GAIM_DEBUG_INFO, "QQ", "local real ip is %x", info->local_real_ip); for (i = 0; i < 2; i++) { @@ -405,7 +405,7 @@ sin_len = sizeof(sin); bind(sockfd, (struct sockaddr *) &sin, sin_len); getsockname(sockfd, (struct sockaddr *) &sin, &sin_len); - listen_port = ntohs(sin.sin_port); + listen_port = g_ntohs(sin.sin_port); switch (i) { case 0: @@ -445,7 +445,7 @@ info = g_new0(ft_info, 1); info->to_uid = to_uid; info->send_seq = qd->send_seq; - info->local_internet_ip = ntohl(inet_addr(qd->my_ip)); + info->local_internet_ip = g_ntohl(inet_addr(qd->my_ip)); info->local_internet_port = qd->my_port; info->local_real_ip = 0x00000000; info->conn_method = 0x00; @@ -800,7 +800,7 @@ } info = g_new0(ft_info, 1); - info->local_internet_ip = ntohl(inet_addr(qd->my_ip)); + info->local_internet_ip = g_ntohl(inet_addr(qd->my_ip)); info->local_internet_port = qd->my_port; info->local_real_ip = 0x00000000; info->to_uid = sender_uid; Modified: trunk/libgaim/protocols/qq/udp_proxy_s5.c =================================================================== --- trunk/libgaim/protocols/qq/udp_proxy_s5.c 2006-09-22 06:45:01 UTC (rev 17337) +++ trunk/libgaim/protocols/qq/udp_proxy_s5.c 2006-09-22 16:05:09 UTC (rev 17338) @@ -134,11 +134,11 @@ fcntl(phb->udpsock, F_SETFL, O_NONBLOCK); - port = ntohs(ctlsin.sin_port) + 1; + port = g_ntohs(ctlsin.sin_port) + 1; while (1) { inet_aton("0.0.0.0", &(sin.sin_addr)); sin.sin_family = AF_INET; - sin.sin_port = htons(port); + sin.sin_port = g_htons(port); if (bind(phb->udpsock, (struct sockaddr *) &sin, sizeof(sin)) < 0) { port++; if (port > 65500) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-09-22 17:03:57
|
Revision: 17339 http://svn.sourceforge.net/gaim/?rev=17339&view=rev Author: markhuetsch Date: 2006-09-22 10:03:54 -0700 (Fri, 22 Sep 2006) Log Message: ----------- My previous implementation was a bit awkward. This requires less overhead. Also, let's only show those info fields that a buddy has actually filled out. Modified Paths: -------------- trunk/libgaim/protocols/qq/buddy_info.c trunk/libgaim/protocols/qq/buddy_info.h Modified: trunk/libgaim/protocols/qq/buddy_info.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_info.c 2006-09-22 16:05:09 UTC (rev 17338) +++ trunk/libgaim/protocols/qq/buddy_info.c 2006-09-22 17:03:54 UTC (rev 17339) @@ -34,253 +34,200 @@ #include "keep_alive.h" #include "send_core.h" -/* Below is all of the information necessary to reconstruct the various - * information fields that one can set in the official client. When we need - * to know about a specific field (e.g., should "city" be a choice - * or text field?), we can simply look it up from the template. Note that - * there are a number of unidentified fields. */ -typedef struct _info_field { - gchar *title; - gchar *id; /* used by gaim_request fields */ - gint pos; - gchar *group; - gint group_pos; /* for display order in the UI */ - gint choice; /* indicates which character array contains the choices */ - gboolean customizable; /* whether a user can enter any text as a value, regardless of choice arrays */ - gchar *value; -} info_field; +#define QQ_PRIMARY_INFORMATION _("Primary Information") +#define QQ_ADDITIONAL_INFORMATION _("Additional Information") +#define QQ_INTRO _("Personal Introduction") +#define QQ_NUMBER _("QQ Number") +#define QQ_NICKNAME _("Nickname") +#define QQ_NAME _("Name") +#define QQ_AGE _("Age") +#define QQ_GENDER _("Gender") +#define QQ_COUNTRY _("Country/Region") +#define QQ_PROVINCE _("Province/State") +#define QQ_CITY _("City") +#define QQ_HOROSCOPE _("Horoscope Symbol") +#define QQ_OCCUPATION _("Occupation") +#define QQ_ZODIAC _("Zodiac Sign") +#define QQ_BLOOD _("Blood Type") +#define QQ_COLLEGE _("College") +#define QQ_EMAIL _("Email") +#define QQ_ADDRESS _("Address") +#define QQ_ZIPCODE _("Zipcode") +#define QQ_CELL _("Cellphone Number") +#define QQ_TELEPHONE _("Phone Number") +#define QQ_HOMEPAGE _("Homepage") -static const info_field info_template_data[] = { - { N_("User ID"), "uid", 0, QQ_MAIN_INFO, 0, QQ_NO_CHOICE, TRUE, NULL }, - { N_("Nickname"), "nick", 1, QQ_MAIN_INFO, 1, QQ_NO_CHOICE, TRUE, NULL }, - { N_("Country/Region"), "country", 2, QQ_MAIN_INFO, 5, QQ_COUNTRY, TRUE, NULL }, - { N_("Province/State"), "province", 3, QQ_MAIN_INFO, 6, QQ_PROVINCE, TRUE, NULL }, - { N_("Zipcode"), "zipcode", 4, QQ_EXTRA_INFO, 7, QQ_NO_CHOICE, TRUE, NULL }, - { N_("Address"), "address", 5, QQ_EXTRA_INFO, 6, QQ_NO_CHOICE, TRUE, NULL }, - { N_("Phone Number"), "tel", 6, QQ_EXTRA_INFO, 9, QQ_NO_CHOICE, TRUE, NULL }, - { N_("Age"), "age", 7, QQ_MAIN_INFO, 3, QQ_NO_CHOICE, TRUE, NULL }, - { N_("Gender"), "gender", 8, QQ_MAIN_INFO, 4, QQ_GENDER, FALSE, NULL }, - { N_("Name"), "name", 9, QQ_MAIN_INFO, 2, QQ_NO_CHOICE, TRUE, NULL }, - { N_("Email"), "email", 10, QQ_EXTRA_INFO, 5, QQ_NO_CHOICE, TRUE, NULL }, - { "pager_sn", "pager_sn", 11, QQ_MISC, 0, QQ_NO_CHOICE, TRUE, NULL }, - { "pager_num", "pager_num", 12, QQ_MISC, 1, QQ_NO_CHOICE, TRUE, NULL }, - { "pager_sp", "pager_sp", 13, QQ_MISC, 2, QQ_NO_CHOICE, TRUE, NULL }, - { "pager_base_num", "pager_base_num", 14, QQ_MISC, 3, QQ_NO_CHOICE, TRUE, NULL }, - { "pager_type", "pager_type", 15, QQ_MISC, 4, QQ_NO_CHOICE, TRUE, NULL }, - { N_("Occupation"), "occupation", 16, QQ_EXTRA_INFO, 1, QQ_OCCUPATION, TRUE, NULL }, - { N_("Homepage"), "homepage", 17, QQ_EXTRA_INFO, 10, QQ_NO_CHOICE, TRUE, NULL }, - { "auth_type", "auth_type", 18, QQ_MISC, 5, QQ_NO_CHOICE, TRUE, NULL }, - { "unknown1", "unknown1", 19, QQ_MISC, 6, QQ_NO_CHOICE, TRUE, NULL }, - { "unknown2", "unknown2", 20, QQ_MISC, 7, QQ_NO_CHOICE, TRUE, NULL }, - { "face", "face", 21, QQ_MISC, 8, QQ_NO_CHOICE, TRUE, NULL }, - { N_("Cellphone Number"), "hp_num", 22, QQ_EXTRA_INFO, 8, QQ_NO_CHOICE, TRUE, NULL }, - { "hp_type", "hp_type", 23, QQ_MISC, 9, QQ_NO_CHOICE, TRUE, NULL }, - { N_("Personal Introduction"), "intro", 24, QQ_PERSONAL_INTRO, 0, QQ_NO_CHOICE, TRUE, NULL }, - { N_("City"), "city", 25, QQ_MAIN_INFO, 7, QQ_NO_CHOICE, TRUE, NULL }, - { "unknown3", "unknown3", 26, QQ_MISC, 10, QQ_NO_CHOICE, TRUE, NULL }, - { "unknown4", "unknown4", 27, QQ_MISC, 11, QQ_NO_CHOICE, TRUE, NULL }, - { "unknown5", "unknown5", 28, QQ_MISC, 12, QQ_NO_CHOICE, TRUE, NULL }, - { "is_open_hp", "is_open_hp", 29, QQ_MISC, 13, QQ_NO_CHOICE, TRUE, NULL }, - { "is_open_contact", "is_open_contact", 30, QQ_MISC, 14, QQ_NO_CHOICE, TRUE, NULL }, - { N_("College"), "college", 31, QQ_EXTRA_INFO, 4, QQ_NO_CHOICE, TRUE, NULL }, - { N_("Horoscope Symbol"), "horoscope", 32, QQ_EXTRA_INFO, 0, QQ_HOROSCOPE, FALSE, NULL }, - { N_("Zodiac Symbol"), "zodiac", 33, QQ_EXTRA_INFO, 2, QQ_ZODIAC, FALSE, NULL }, - { N_("Blood Type"), "blood", 34, QQ_EXTRA_INFO, 3, QQ_BLOOD, FALSE, NULL }, - { "qq_show", "qq_show", 35, QQ_MISC, 15, QQ_NO_CHOICE, TRUE, NULL }, - { "unknown6", "unknown6", 36, QQ_MISC, 16, QQ_NO_CHOICE, TRUE, NULL }, - { NULL, NULL, 0, NULL, 0, 0, 0, NULL } -}; - -/* TODO: translate these arrays to their English equivalents - * and move these characters to the zh_CN po file */ +#define QQ_HOROSCOPE_SIZE 13 static const gchar *horoscope_names[] = { - "-", "水瓶座", "双鱼座", "牡羊座", "金牛座", - "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", - "天蝎座", "射手座", "魔羯座", NULL + "-", N_("Aquarius"), N_("Pisces"), N_("Aries"), N_("Taurus"), + N_("Gemini"), N_("Cancer"), N_("Leo"), N_("Virgo"), N_("Libra"), + N_("Scorpio"), N_("Sagittarius"), N_("Capricorn") }; +#define QQ_ZODIAC_SIZE 13 static const gchar *zodiac_names[] = { - "-", "鼠", "牛", "虎", "兔", - "龙", "蛇", "马", "羊", "猴", - "鸡", "狗", "猪", NULL + "-", N_("Rat"), N_("Ox"), N_("Tiger"), N_("Rabbit"), + N_("Dragon"), N_("Snake"), N_("Horse"), N_("Goat"), N_("Monkey"), + N_("Rooster"), N_("Dog"), N_("Pig") }; +#define QQ_BLOOD_SIZE 6 static const gchar *blood_types[] = { - "-", N_("A"), N_("B"), N_("O"), N_("AB"), N_("Other"), NULL + "-", "A", "B", "O", "AB", N_("Other") }; +#define QQ_GENDER_SIZE 2 static const gchar *genders[] = { N_("Male"), - N_("Female"), - NULL + N_("Female") }; -static const gchar *country_names[] = { - "中国", "中国香港", "中国澳门", "中国台湾", - "新加坡", "马来西亚", "美国", NULL -}; +#define QQ_CONTACT_FIELDS 37 -static const gchar *province_names[] = { - "北京", "天津", "上海", "重庆", "香港", - "河北", "山西", "内蒙古", "辽宁", "吉林", - "黑龙江", "江西", "浙江", "江苏", "安徽", - "福建", "山东", "河南", "湖北", "湖南", - "广东", "广西", "海南", "四川", "贵州", - "云南", "西藏", "陕西", "甘肃", "宁夏", - "青海", "新疆", "台湾", "澳门", NULL -}; +/* There is no user id stored in the reply packet for information query + * we have to manually store the query, so that we know the query source */ +typedef struct _qq_info_query { + guint32 uid; + gboolean show_window; + gboolean modify_info; +} qq_info_query; -static const gchar *occupation_names[] = { - "全职", "兼职", "制造业", "商业", "失业中", - "学生", "工程师", "政府部门", "教育业", "服务行业", - "老板", "计算机业", "退休", "金融业", - "销售/广告/市场", NULL -}; +/* We get an info packet on ourselves before we modify our information. + * Even though not all of the information is modifiable, it still + * all needs to be there when we send out the modify info packet */ +typedef struct _modify_info_data { + GaimConnection *gc; + contact_info *info; +} modify_info_data; -static const gint choice_sizes[] = { 0, 13, 13, 6, 2, 7, 34, 15 }; - - -static const gchar *info_group_headers[] = { - QQ_MAIN_INFO, - QQ_EXTRA_INFO, - QQ_PERSONAL_INTRO, - QQ_MISC -}; - -static const gchar **choices[] = { - NULL, - horoscope_names, - zodiac_names, - blood_types, - genders, - country_names, - province_names, - occupation_names -}; - -/************************ info and info_field methods ************************/ - -/* Given an id, return the template for that field. - * Returns NULL if the id is not found. */ -static const info_field *info_field_get_template(const gchar *id) +/* return -1 as a sentinel */ +static gint choice_index(const gchar *value, const gchar **choice, gint choice_size) { - const info_field *cur_field; - const gchar *cur_id; - - cur_field = info_template_data; - cur_id = cur_field->id; - while(cur_id != NULL) { - if (g_ascii_strcasecmp(cur_id, id) == 0) - return cur_field; - cur_field++; - cur_id = cur_field->id; + gint len, i; + + len = strlen(value); + if (len > 3 || len == 0) return -1; + for (i = 0; i < len; i++) { + if (!g_ascii_isdigit(value[i])) + return -1; } - gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Info field with id %s not found!", id); - return NULL; -} + i = strtol(value, NULL, 10); + if (i >= choice_size) + return -1; -/* info_fields are compared by their group positions */ -static gint info_field_compare(gconstpointer a, gconstpointer b) -{ - return ((info_field *) a)->group_pos - ((info_field *) b)->group_pos; + return i; } -static void info_field_free(info_field *i) +/* return should be freed */ +static gchar *field_value(const gchar *field, const gchar **choice, gint choice_size) { - g_free(i->value); - g_free(i); -} + gint index, len; -/* Parses the info_template_data above and returns a newly-allocated list - * containing the desired fields from segments. This list is ordered by - * group_pos. */ -static GList *info_get_group(const gchar **info, const gchar *group_name) -{ - const info_field *cur; - info_field *entry; - GList *group = NULL; - - cur = info_template_data; - while (cur->id != NULL) { - if (g_ascii_strcasecmp(group_name, cur->group) == 0) { - entry = g_memdup(cur, sizeof(info_field)); - entry->value = g_strdup(info[entry->pos]); - group = g_list_insert_sorted(group, entry, info_field_compare); + len = strlen(field); + if (len == 0) { + return NULL; + } else if (choice != NULL) { + /* some choice fields are also customizable */ + index = choice_index(field, choice, choice_size); + if (index == -1) { + if (strcmp(field, "-") != 0) { + return qq_to_utf8(field, QQ_CHARSET_DEFAULT); + } else { + return NULL; + } + /* else ASCIIized index */ + } else { + if (strcmp(choice[index], "-") != 0) + return g_strdup(choice[index]); + else + return NULL; } - cur++; + } else { + if (strcmp(field, "-") != 0) { + return qq_to_utf8(field, QQ_CHARSET_DEFAULT); + } else { + return NULL; + } } - - return group; } -/* Determines if the given text value and choice group require - * a lookup from the choice arrays. */ -static gboolean is_valid_index(gchar *value, gint choice) +static void append_field_value(GString *info_text, const gchar *field, + const gchar *title, const gchar **choice, gint choice_size) { - gint len, i; - - if (choice == 0) return FALSE; - len = strlen(value); - /* the server sends us an ascii index and none of the arrays has more than 99 - * elements */ - if (len > 3 || len == 0) return FALSE; - for (i = 0; i < len; i++) - if (!g_ascii_isdigit(value[i])) - return FALSE; - i = atoi(value); - if (i < 0 || i >= choice_sizes[choice]) - return FALSE; - return TRUE; + gchar *value = field_value(field, choice, choice_size); + + if (value != NULL) { + g_string_append_printf(info_text, "<br /><b>%s:</b> %s", title, value); + g_free(value); + } } -/* formats a field for printing */ -static void append_field_to_str(gpointer field, gpointer str) +static GString *info_to_str(const contact_info *info) { - info_field *f; - gint choice; - gboolean valid_index; - gchar *value; + GString *info_text, *extra_info; + const gchar *intro; + gint len; - f = (info_field *) field; - choice = f->choice; - valid_index = is_valid_index(f->value, choice); - if (choice && valid_index) value = g_strdup(choices[choice][atoi(f->value)]); - else value = qq_to_utf8(f->value, QQ_CHARSET_DEFAULT); - g_string_append_printf((GString *) str, "<b>%s:</b> %s<br />", - f->title, value); - g_free(value); - info_field_free(f); -} + info_text = g_string_new(""); + g_string_append_printf(info_text, "<b>%s</b><br /><br />", QQ_PRIMARY_INFORMATION); + g_string_append_printf(info_text, "<b>%s:</b> %s", QQ_NUMBER, info->uid); + append_field_value(info_text, info->nick, QQ_NICKNAME, NULL, 0); + append_field_value(info_text, info->name, QQ_NAME, NULL, 0); + append_field_value(info_text, info->age, QQ_AGE, NULL, 0); + append_field_value(info_text, info->gender, QQ_GENDER, genders, QQ_GENDER_SIZE); + append_field_value(info_text, info->country, QQ_COUNTRY, NULL, 0); + append_field_value(info_text, info->province, QQ_PROVINCE, NULL, 0); + append_field_value(info_text, info->city, QQ_CITY, NULL, 0); -/* formats a group of information for printing */ -static void append_group_to_str(GString *str, const gchar *group_name, const gchar **info) -{ - GList *group; + extra_info = g_string_new(""); + g_string_append_printf(extra_info, "<br /><br /><b>%s</b><br />", QQ_ADDITIONAL_INFORMATION); + len = extra_info->len; + append_field_value(extra_info, info->horoscope, QQ_HOROSCOPE, horoscope_names, QQ_HOROSCOPE_SIZE); + append_field_value(extra_info, info->occupation, QQ_OCCUPATION, NULL, 0); + append_field_value(extra_info, info->zodiac, QQ_ZODIAC, zodiac_names, QQ_ZODIAC_SIZE); + append_field_value(extra_info, info->blood, QQ_BLOOD, blood_types, QQ_BLOOD_SIZE); + append_field_value(extra_info, info->college, QQ_COLLEGE, NULL, 0); + append_field_value(extra_info, info->email, QQ_EMAIL, NULL, 0); + append_field_value(extra_info, info->address, QQ_ADDRESS, NULL, 0); + append_field_value(extra_info, info->zipcode, QQ_ZIPCODE, NULL, 0); + append_field_value(extra_info, info->hp_num, QQ_CELL, NULL, 0); + append_field_value(extra_info, info->tel, QQ_TELEPHONE, NULL, 0); + append_field_value(extra_info, info->homepage, QQ_HOMEPAGE, NULL, 0); + if (len != extra_info->len) + g_string_append(info_text, extra_info->str); + g_string_free(extra_info, TRUE); - group = info_get_group(info, group_name); - g_string_append_printf(str, "<b>%s</b><br /><br />", (*(info_field *) group->data).group); - g_list_foreach(group, append_field_to_str, str); - g_list_free(group); - g_string_append_printf(str, "<br />"); -} + intro = field_value(info->intro, NULL, 0); + if (intro) { + g_string_append_printf(info_text, "<br /><br /><b>%s</b><br /><br />", QQ_INTRO); + g_string_append(info_text, intro); + } -/* Takes a contact_info struct and outputs the appropriate fields in - * a printable format for our upcoming call to gaim_notify_userinfo. */ -static GString *info_to_str(const gchar **info) -{ - GString *info_text; + /* for debugging */ + /* + g_string_append_printf(info_text, "<br /><br /><b>%s</b><br />", "Miscellaneous"); + append_field_value(info_text, info->pager_sn, "pager_sn", NULL, 0); + append_field_value(info_text, info->pager_num, "pager_num", NULL, 0); + append_field_value(info_text, info->pager_sp, "pager_sp", NULL, 0); + append_field_value(info_text, info->pager_base_num, "pager_base_num", NULL, 0); + append_field_value(info_text, info->pager_type, "pager_type", NULL, 0); + append_field_value(info_text, info->auth_type, "auth_type", NULL, 0); + append_field_value(info_text, info->unknown1, "unknown1", NULL, 0); + append_field_value(info_text, info->unknown2, "unknown2", NULL, 0); + append_field_value(info_text, info->face, "face", NULL, 0); + append_field_value(info_text, info->hp_type, "hp_type", NULL, 0); + append_field_value(info_text, info->unknown3, "unknown3", NULL, 0); + append_field_value(info_text, info->unknown4, "unknown4", NULL, 0); + append_field_value(info_text, info->unknown5, "unknown5", NULL, 0); + append_field_value(info_text, info->is_open_hp, "is_open_hp", NULL, 0); + append_field_value(info_text, info->is_open_contact, "is_open_contact", NULL, 0); + append_field_value(info_text, info->qq_show, "qq_show", NULL, 0); + append_field_value(info_text, info->unknown6, "unknown6", NULL, 0); + */ - info_text = g_string_new(""); - append_group_to_str(info_text, QQ_MAIN_INFO, info); - append_group_to_str(info_text, QQ_EXTRA_INFO, info); - append_group_to_str(info_text, QQ_PERSONAL_INTRO, info); - /* append_group_to_str(info_text, QQ_MISC, info); */ - return info_text; } -/************************ packets and UI management **************************/ - /* send a packet to get detailed information of uid */ void qq_send_packet_get_info(GaimConnection *gc, guint32 uid, gboolean show_window) { @@ -320,26 +267,23 @@ } /* send packet to modify personal information */ -void qq_send_packet_modify_info(GaimConnection *gc, contact_info *info) +static void qq_send_packet_modify_info(GaimConnection *gc, gchar **segments) { - gchar *info_field[QQ_CONTACT_FIELDS]; gint i; guint8 *raw_data, *cursor, bar; - g_return_if_fail(gc != NULL && info != NULL); + g_return_if_fail(gc != NULL && segments != NULL); bar = 0x1f; raw_data = g_newa(guint8, MAX_PACKET_SIZE - 128); cursor = raw_data; - g_memmove(info_field, info, sizeof(gchar *) * QQ_CONTACT_FIELDS); - create_packet_b(raw_data, &cursor, bar); - /* important!, skip the first uid entry */ + /* important! skip the first uid entry */ for (i = 1; i < QQ_CONTACT_FIELDS; i++) { create_packet_b(raw_data, &cursor, bar); - create_packet_data(raw_data, &cursor, (guint8 *) info_field[i], strlen(info_field[i])); + create_packet_data(raw_data, &cursor, (guint8 *) segments[i], strlen(segments[i])); } create_packet_b(raw_data, &cursor, bar); @@ -354,133 +298,122 @@ qd = (qq_data *) mid->gc->proto_data; qd->modifying_info = FALSE; - g_list_free(mid->misc); + g_strfreev((gchar **) mid->info); g_free(mid); } -/* Runs through all of the fields in the modify info UI and puts - * their values into the outgoing packet. */ -static void parse_field(gpointer field, gpointer outgoing_info) +static gchar *parse_field(GList **list, gboolean choice) { - GaimRequestField *f; - gchar **segments, *value; - const info_field *ft; - const gchar *id; + gchar *value; + GaimRequestField *field; - f = (GaimRequestField *) field; - segments = (gchar **) outgoing_info; - id = gaim_request_field_get_id(f); - ft = info_field_get_template(id); - if (ft->choice && !ft->customizable) { - value = g_strdup_printf("%d", gaim_request_field_choice_get_value(f)); + field = (GaimRequestField *) (*list)->data; + if (choice) { + value = g_strdup_printf("%d", gaim_request_field_choice_get_value(field)); } else { - value = (gchar *) gaim_request_field_string_get_value(f); + value = (gchar *) gaim_request_field_string_get_value(field); if (value == NULL) value = g_strdup("-"); else value = utf8_to_qq(value, QQ_CHARSET_DEFAULT); } - segments[ft->pos] = value; -} + *list = g_list_remove_link(*list, *list); -/* dumps the uneditable information straight into the outgoing packet */ -static void parse_misc_field(gpointer field, gpointer outgoing_info) -{ - info_field *f; - gchar **segments; - - f = (info_field *) field; - segments = (gchar **) outgoing_info; - segments[f->pos] = g_strdup(f->value); - info_field_free(f); + return value; } -/* Runs through all of the information fields and copies them into an - * outgoing packet, then sends that packet. */ +/* parse fields and send info packet */ static void modify_info_ok_cb(modify_info_data *mid, GaimRequestFields *fields) { GaimConnection *gc; qq_data *qd; - GList *list, *groups, *group_node; - gchar *info_field[QQ_CONTACT_FIELDS]; + GList *list, *groups; contact_info *info; - gint i; gc = mid->gc; qd = (qq_data *) gc->proto_data; qd->modifying_info = FALSE; - list = mid->misc; - g_list_foreach(list, parse_misc_field, info_field); - g_list_free(list); + + info = mid->info; + groups = gaim_request_fields_get_groups(fields); - while(groups) { - group_node = groups; - list = gaim_request_field_group_get_fields(group_node->data); - g_list_foreach(list, parse_field, info_field); - groups = g_list_remove_link(groups, group_node); - } - info = (contact_info *) info_field; + list = gaim_request_field_group_get_fields(groups->data); + info->uid = parse_field(&list, FALSE); + info->nick = parse_field(&list, FALSE); + info->name = parse_field(&list, FALSE); + info->age = parse_field(&list, FALSE); + info->gender = parse_field(&list, TRUE); + info->country = parse_field(&list, FALSE); + info->province = parse_field(&list, FALSE); + info->city = parse_field(&list, FALSE); + groups = g_list_remove_link(groups, groups); + list = gaim_request_field_group_get_fields(groups->data); + info->horoscope = parse_field(&list, TRUE); + info->occupation = parse_field(&list, FALSE); + info->zodiac = parse_field(&list, TRUE); + info->blood = parse_field(&list, TRUE); + info->college = parse_field(&list, FALSE); + info->email = parse_field(&list, FALSE); + info->address = parse_field(&list, FALSE); + info->zipcode = parse_field(&list, FALSE); + info->hp_num = parse_field(&list, FALSE); + info->tel = parse_field(&list, FALSE); + info->homepage = parse_field(&list, FALSE); + groups = g_list_remove_link(groups, groups); + list = gaim_request_field_group_get_fields(groups->data); + info->intro = parse_field(&list, FALSE); + groups = g_list_remove_link(groups, groups); - qq_send_packet_modify_info(gc, info); + qq_send_packet_modify_info(gc, (gchar **) info); + + g_strfreev((gchar **) mid->info); g_free(mid); - for (i = 0; i < QQ_CONTACT_FIELDS; i++) - g_free(info_field[i]); } -/* Sets up the display for one group of information. This includes - * managing which fields in the UI should be textfields and - * which choices, and also mapping ints to choice values when appropriate. */ -static void setup_group(gpointer field, gpointer group) +static GaimRequestFieldGroup *setup_field_group(GaimRequestFields *fields, const gchar *title) { - info_field *f; - GaimRequestFieldGroup *g; - GaimRequestField *rf; - gint choice, index, j; - gboolean customizable, valid_index, multiline; - gchar *id, *value; + GaimRequestFieldGroup *group; - f = (info_field *) field; - g = (GaimRequestFieldGroup *) group; - choice = f->choice; - customizable = f->customizable; - id = f->id; - valid_index = TRUE; + group = gaim_request_field_group_new(title); + gaim_request_fields_add_group(fields, group); - if (!choice || customizable) { - valid_index = is_valid_index(f->value, choice); - multiline = id == "intro"; - if (valid_index) { - index = atoi(f->value); - value = (gchar *) choices[choice][index]; - } else { - value = qq_to_utf8(f->value, QQ_CHARSET_DEFAULT); - } - rf = gaim_request_field_string_new(id, f->title, value, multiline); - } else { - index = atoi(f->value); - value = (gchar *) choices[choice][index]; - rf = gaim_request_field_choice_new(id, f->title, index); - j = 0; - while(choices[choice][j] != NULL) - gaim_request_field_choice_add(rf, choices[choice][j++]); - } - gaim_request_field_group_add_field(g, rf); - if (!valid_index) - g_free(value); - info_field_free(f); + return group; } -/* Takes the info returned by a get_info packet for the user and sets up - * a form using those values and the info_template. */ -static void create_modify_info_dialogue(GaimConnection *gc, const gchar **info) +static void add_string_field_to_group(GaimRequestFieldGroup *group, + const gchar *id, const gchar *title, const gchar *value) { + GaimRequestField *field; + gchar *utf8_value; + + utf8_value = qq_to_utf8(value, QQ_CHARSET_DEFAULT); + field = gaim_request_field_string_new(id, title, utf8_value, FALSE); + gaim_request_field_group_add_field(group, field); + g_free(utf8_value); +} + +static void add_choice_field_to_group(GaimRequestFieldGroup *group, + const gchar *id, const gchar *title, const gchar *value, + const gchar **choice, gint choice_size) +{ + GaimRequestField *field; + gint i, index; + + index = choice_index(value, choice, choice_size); + field = gaim_request_field_choice_new(id, title, index); + for (i = 0; i < choice_size; i++) + gaim_request_field_choice_add(field, choice[i]); + gaim_request_field_group_add_field(group, field); +} + +/* take the info returned by a get_info packet for myself and set up a request form */ +static void create_modify_info_dialogue(GaimConnection *gc, const contact_info *info) +{ qq_data *qd; - GaimRequestFields *fields; GaimRequestFieldGroup *group; + GaimRequestFields *fields; GaimRequestField *field; - GList *group_list; modify_info_data *mid; - gint i; /* so we only have one dialog open at a time */ qd = (qq_data *) gc->proto_data; @@ -488,22 +421,58 @@ qd->modifying_info = TRUE; fields = gaim_request_fields_new(); - - /* we only care about the first 3 groups, not the miscellaneous stuff */ - for (i = 0; i < 3; i++) { - group = gaim_request_field_group_new(info_group_headers[i]); - gaim_request_fields_add_group(fields, group); - group_list = info_get_group(info, info_group_headers[i]); - g_list_foreach(group_list, setup_group, group); - g_list_free(group_list); - } - field = gaim_request_fields_get_field(fields, "uid"); + group = setup_field_group(fields, QQ_PRIMARY_INFORMATION); + field = gaim_request_field_string_new("uid", QQ_NUMBER, info->uid, FALSE); + gaim_request_field_group_add_field(group, field); gaim_request_field_string_set_editable(field, FALSE); + add_string_field_to_group(group, "nick", QQ_NICKNAME, info->nick); + add_string_field_to_group(group, "name", QQ_NAME, info->name); + add_string_field_to_group(group, "age", QQ_AGE, info->age); + add_choice_field_to_group(group, "gender", QQ_GENDER, info->gender, genders, QQ_GENDER_SIZE); + add_string_field_to_group(group, "country", QQ_COUNTRY, info->country); + add_string_field_to_group(group, "province", QQ_PROVINCE, info->province); + add_string_field_to_group(group, "city", QQ_CITY, info->city); + group = setup_field_group(fields, QQ_ADDITIONAL_INFORMATION); + add_choice_field_to_group(group, "horoscope", QQ_HOROSCOPE, info->horoscope, horoscope_names, QQ_HOROSCOPE_SIZE); + add_string_field_to_group(group, "occupation", QQ_OCCUPATION, info->occupation); + add_choice_field_to_group(group, "zodiac", QQ_ZODIAC, info->zodiac, zodiac_names, QQ_ZODIAC_SIZE); + add_choice_field_to_group(group, "blood", QQ_BLOOD, info->blood, blood_types, QQ_BLOOD_SIZE); + add_string_field_to_group(group, "college", QQ_COLLEGE, info->college); + add_string_field_to_group(group, "email", QQ_EMAIL, info->email); + add_string_field_to_group(group, "address", QQ_ADDRESS, info->address); + add_string_field_to_group(group, "zipcode", QQ_ZIPCODE, info->zipcode); + add_string_field_to_group(group, "hp_num", QQ_CELL, info->hp_num); + add_string_field_to_group(group, "tel", QQ_TELEPHONE, info->tel); + add_string_field_to_group(group, "homepage", QQ_HOMEPAGE, info->homepage); + group = setup_field_group(fields, QQ_INTRO); + field = gaim_request_field_string_new("intro", QQ_INTRO, info->intro, TRUE); + gaim_request_field_group_add_field(group, field); + + /* prepare unmodifiable info */ mid = g_new0(modify_info_data, 1); mid->gc = gc; - mid->misc = info_get_group(info, info_group_headers[3]); + /* QQ_CONTACT_FIELDS+1 so that the array is NULL-terminated and can be g_strfreev()'ed later */ + mid->info = (contact_info *) g_new0(gchar *, QQ_CONTACT_FIELDS+1); + mid->info->pager_sn = g_strdup(info->pager_sn); + mid->info->pager_num = g_strdup(info->pager_num); + mid->info->pager_sp = g_strdup(info->pager_sp); + mid->info->pager_base_num = g_strdup(info->pager_base_num); + mid->info->pager_type = g_strdup(info->pager_type); + mid->info->auth_type = g_strdup(info->auth_type); + mid->info->unknown1 = g_strdup(info->unknown1); + mid->info->unknown2 = g_strdup(info->unknown2); + mid->info->face = g_strdup(info->face); + mid->info->hp_type = g_strdup(info->hp_type); + mid->info->unknown3 = g_strdup(info->unknown3); + mid->info->unknown4 = g_strdup(info->unknown4); + mid->info->unknown5 = g_strdup(info->unknown5); + /* TODO stop hiding these 2 */ + mid->info->is_open_hp = g_strdup(info->is_open_hp); + mid->info->is_open_contact = g_strdup(info->is_open_contact); + mid->info->qq_show = g_strdup(info->qq_show); + mid->info->unknown6 = g_strdup(info->unknown6); gaim_request_fields(gc, _("Modify my information"), _("Modify my information"), NULL, fields, @@ -599,7 +568,7 @@ gchar *icon = g_strdup_printf("%i", qd->my_icon); qd->modifying_face = FALSE; memcpy(info->face, icon, 2); - qq_send_packet_modify_info(gc, info); + qq_send_packet_modify_info(gc, segments); g_free(icon); } @@ -611,11 +580,11 @@ query = (qq_info_query *) query_list->data; if (query->uid == atoi(info->uid)) { if (query->show_window) { - info_text = info_to_str((const gchar **) segments); + info_text = info_to_str(info); gaim_notify_userinfo(gc, info->uid, info_text->str, NULL, NULL); g_string_free(info_text, TRUE); } else if (query->modify_info) { - create_modify_info_dialogue(gc, (const gchar **) segments); + create_modify_info_dialogue(gc, info); } qd->info_query = g_list_remove(qd->info_query, qd->info_query->data); g_free(query); Modified: trunk/libgaim/protocols/qq/buddy_info.h =================================================================== --- trunk/libgaim/protocols/qq/buddy_info.h 2006-09-22 16:05:09 UTC (rev 17338) +++ trunk/libgaim/protocols/qq/buddy_info.h 2006-09-22 17:03:54 UTC (rev 17339) @@ -25,6 +25,7 @@ #include <glib.h> #include "connection.h" + #include "buddy_opt.h" #include "qq.h" @@ -39,80 +40,47 @@ #define QQ_BUDDY_GENDER_UNKNOWN 0xff typedef struct _contact_info { - gchar *uid; - gchar *nick; - gchar *country; - gchar *province; - gchar *zipcode; - gchar *address; - gchar *tel; - gchar *age; - gchar *gender; - gchar *name; - gchar *email; - gchar *pager_sn; - gchar *pager_num; - gchar *pager_sp; - gchar *pager_base_num; - gchar *pager_type; - gchar *occupation; - gchar *homepage; - gchar *auth_type; - gchar *unknown1; - gchar *unknown2; - gchar *face; - gchar *hp_num; - gchar *hp_type; - gchar *intro; - gchar *city; - gchar *unknown3; - gchar *unknown4; - gchar *unknown5; - gchar *is_open_hp; - gchar *is_open_contact; - gchar *college; - gchar *horoscope; - gchar *zodiac; - gchar *blood; - gchar *qq_show; - gchar *unknown6; /* always 0x2D */ + gchar *uid; + gchar *nick; + gchar *country; + gchar *province; + gchar *zipcode; + gchar *address; + gchar *tel; + gchar *age; + gchar *gender; + gchar *name; + gchar *email; + gchar *pager_sn; + gchar *pager_num; + gchar *pager_sp; + gchar *pager_base_num; + gchar *pager_type; + gchar *occupation; + gchar *homepage; + gchar *auth_type; + gchar *unknown1; + gchar *unknown2; + gchar *face; + gchar *hp_num; + gchar *hp_type; + gchar *intro; + gchar *city; + gchar *unknown3; + gchar *unknown4; + gchar *unknown5; + gchar *is_open_hp; + gchar *is_open_contact; + gchar *college; + gchar *horoscope; + gchar *zodiac; + gchar *blood; + gchar *qq_show; + gchar *unknown6; /* always 0x2D */ } contact_info; -/* There is no user id stored in the reply packet for information query - * we have to manually store the query, so that we know the query source */ -typedef struct _qq_info_query { - guint32 uid; - gboolean show_window; - gboolean modify_info; -} qq_info_query; - -/* We get an info packet on ourselves before we modify our information. - * Even though not all of the information is currently modifiable, it still - * all needs to be there when we send out the modify info packet */ -typedef struct _modify_info_data { - GaimConnection *gc; - GList *misc, *node; -} modify_info_data; - -#define QQ_CONTACT_FIELDS 37 - -#define QQ_MAIN_INFO "Primary Information" -#define QQ_EXTRA_INFO "Detailed Information" -#define QQ_PERSONAL_INTRO "Personal Introduction" -#define QQ_MISC "Miscellaneous" - -#define QQ_NO_CHOICE 0 -#define QQ_HOROSCOPE 1 -#define QQ_ZODIAC 2 -#define QQ_BLOOD 3 -#define QQ_GENDER 4 -#define QQ_COUNTRY 5 -#define QQ_PROVINCE 6 -#define QQ_OCCUPATION 7 - void qq_refresh_buddy_and_myself(contact_info *info, GaimConnection *gc); void qq_send_packet_get_info(GaimConnection *gc, guint32 uid, gboolean show_window); -void qq_send_packet_modify_info(GaimConnection *gc, contact_info *info); void qq_prepare_modify_info(GaimConnection *gc); void qq_process_modify_info_reply(guint8 *buf, gint buf_len, GaimConnection *gc); void qq_process_get_info_reply(guint8 *buf, gint buf_len, GaimConnection *gc); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-09-26 22:54:31
|
Revision: 17375 http://svn.sourceforge.net/gaim/?rev=17375&view=rev Author: markhuetsch Date: 2006-09-26 15:54:24 -0700 (Tue, 26 Sep 2006) Log Message: ----------- Get rid of these useless checks. Modified Paths: -------------- trunk/libgaim/protocols/qq/buddy_info.c trunk/libgaim/protocols/qq/buddy_list.c trunk/libgaim/protocols/qq/buddy_opt.c trunk/libgaim/protocols/qq/buddy_status.c trunk/libgaim/protocols/qq/file_trans.c trunk/libgaim/protocols/qq/group.c trunk/libgaim/protocols/qq/group_conv.c trunk/libgaim/protocols/qq/group_find.c trunk/libgaim/protocols/qq/group_im.c trunk/libgaim/protocols/qq/group_info.c trunk/libgaim/protocols/qq/group_internal.c trunk/libgaim/protocols/qq/group_join.c trunk/libgaim/protocols/qq/group_network.c trunk/libgaim/protocols/qq/group_opt.c trunk/libgaim/protocols/qq/group_search.c trunk/libgaim/protocols/qq/im.c trunk/libgaim/protocols/qq/keep_alive.c trunk/libgaim/protocols/qq/login_logout.c trunk/libgaim/protocols/qq/qq.c trunk/libgaim/protocols/qq/recv_core.c trunk/libgaim/protocols/qq/send_core.c trunk/libgaim/protocols/qq/send_file.c trunk/libgaim/protocols/qq/sendqueue.c trunk/libgaim/protocols/qq/sys_msg.c Modified: trunk/libgaim/protocols/qq/buddy_info.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_info.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/buddy_info.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -235,7 +235,7 @@ gchar uid_str[11]; qq_info_query *query; - g_return_if_fail(gc != NULL && gc->proto_data != NULL && uid != 0); + g_return_if_fail(uid != 0); qd = (qq_data *) gc->proto_data; g_snprintf(uid_str, sizeof(uid_str), "%d", uid); @@ -272,7 +272,7 @@ gint i; guint8 *raw_data, *cursor, bar; - g_return_if_fail(gc != NULL && segments != NULL); + g_return_if_fail(segments != NULL); bar = 0x1f; raw_data = g_newa(guint8, MAX_PACKET_SIZE - 128); @@ -489,7 +489,6 @@ gint len; guint8 *data; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; @@ -515,7 +514,6 @@ qq_buddy *q_bud; gchar *alias_utf8; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); qd = (qq_data *) gc->proto_data; alias_utf8 = qq_to_utf8(info->nick, QQ_CHARSET_DEFAULT); @@ -550,7 +548,6 @@ GList *list, *query_list; GString *info_text; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; Modified: trunk/libgaim/protocols/qq/buddy_list.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_list.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/buddy_list.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -62,8 +62,6 @@ qq_data *qd; guint8 *raw_data, *cursor; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - qd = (qq_data *) gc->proto_data; raw_data = g_newa(guint8, 5); cursor = raw_data; @@ -91,8 +89,6 @@ guint8 *raw_data, *cursor; gint data_len; - g_return_if_fail(gc != NULL); - data_len = 3; raw_data = g_newa(guint8, data_len); cursor = raw_data; @@ -114,8 +110,6 @@ guint8 *raw_data, *cursor; gint data_len; - g_return_if_fail(gc != NULL); - data_len = 10; raw_data = g_newa(guint8, data_len); cursor = raw_data; @@ -159,7 +153,6 @@ qq_buddy *q_bud; qq_friends_online_entry *fe; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; @@ -259,7 +252,6 @@ gchar *name; GaimBuddy *b; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; @@ -354,7 +346,6 @@ guint8 type, groupid; qq_group *group; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; Modified: trunk/libgaim/protocols/qq/buddy_opt.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_opt.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/buddy_opt.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -61,7 +61,7 @@ { gchar uid_str[11]; - g_return_if_fail(gc != NULL && uid > 0); + g_return_if_fail(uid > 0); g_snprintf(uid_str, sizeof(uid_str), "%d", uid); qq_send_cmd(gc, QQ_CMD_DEL_FRIEND, TRUE, 0, @@ -73,7 +73,7 @@ { guint8 *raw_data, *cursor; - g_return_if_fail(gc != NULL && gc->proto_data != NULL && uid > 0); + g_return_if_fail(uid > 0); raw_data = g_newa(guint8, 4); cursor = raw_data; @@ -89,7 +89,7 @@ qq_add_buddy_request *req; gchar uid_str[11]; - g_return_if_fail(gc != NULL && gc->proto_data != NULL && uid > 0); + g_return_if_fail(uid > 0); /* we need to send the ascii code of this uid to qq server */ g_snprintf(uid_str, sizeof(uid_str), "%d", uid); @@ -110,7 +110,7 @@ gchar *text_qq, uid_str[11]; guint8 bar, *cursor, *raw_data; - g_return_if_fail(gc != NULL && uid != 0); + g_return_if_fail(uid != 0); g_snprintf(uid_str, sizeof(uid_str), "%d", uid); bar = 0x1f; @@ -139,7 +139,7 @@ gc = g->gc; uid = g->uid; - g_return_if_fail(gc != NULL && uid != 0); + g_return_if_fail(uid != 0); _qq_send_packet_buddy_auth(gc, uid, QQ_MY_AUTH_REQUEST, text); g_free(g); @@ -155,7 +155,7 @@ gc = g->gc; uid = g->uid; - g_return_if_fail(gc != NULL && uid != 0); + g_return_if_fail(uid != 0); _qq_send_packet_buddy_auth(gc, uid, QQ_MY_AUTH_REJECT, reason); g_free(g); @@ -171,7 +171,7 @@ gc = g->gc; uid = g->uid; - g_return_if_fail(gc != NULL && uid != 0); + g_return_if_fail(uid != 0); _qq_send_packet_buddy_auth(gc, uid, QQ_MY_AUTH_APPROVE, NULL); g_free(g); @@ -194,7 +194,7 @@ gc = g->gc; uid = g->uid; - g_return_if_fail(gc != NULL && uid != 0); + g_return_if_fail(uid != 0); g_free(g); @@ -219,7 +219,7 @@ gc = g->gc; uid = g->uid; - g_return_if_fail(gc != NULL && uid != 0); + g_return_if_fail(uid != 0); _qq_send_packet_add_buddy(gc, uid); g_free(g); @@ -236,7 +236,7 @@ gc = g->gc; uid = g->uid; - g_return_if_fail(gc != NULL && uid > 0); + g_return_if_fail(uid > 0); buddy.name = uid_to_gaim_name(uid); group.name = GAIM_GROUP_QQ_BLOCKED; @@ -253,7 +253,6 @@ guint8 *data, *cursor, reply; gchar **segments, *msg_utf8; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; @@ -285,7 +284,6 @@ gint len; guint8 *data, *cursor, reply; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; @@ -314,7 +312,6 @@ gint len; guint8 *data, *cursor, reply; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; @@ -347,7 +344,6 @@ gc_and_uid *g; qq_add_buddy_request *req; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); for_uid = 0; @@ -442,8 +438,6 @@ qq_buddy *q_bud; gchar *name, *group_name; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL); - a = gc->account; qd = (qq_data *) gc->proto_data; g_return_val_if_fail(a != NULL && uid != 0, NULL); @@ -492,8 +486,6 @@ guint32 uid; GaimBuddy *b; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - qd = (qq_data *) gc->proto_data; if (!qd->logged_in) return; /* IMPORTANT ! */ @@ -519,8 +511,6 @@ qq_buddy *q_bud; guint32 uid; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - qd = (qq_data *) gc->proto_data; uid = gaim_name_to_uid(buddy->name); @@ -551,8 +541,6 @@ gint i; qq_add_buddy_request *p; - g_return_if_fail(qd != NULL); - i = 0; while (qd->add_buddy_request) { p = (qq_add_buddy_request *) (qd->add_buddy_request->data); @@ -571,8 +559,6 @@ gchar *name; GaimBuddy *b; - g_return_if_fail(qd != NULL); - i = 0; while (qd->buddies) { p = (qq_buddy *) (qd->buddies->data); Modified: trunk/libgaim/protocols/qq/buddy_status.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_status.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/buddy_status.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -118,8 +118,6 @@ GaimAccount *account; GaimPresence *presence; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, 2); - account = gaim_connection_get_account(gc); presence = gaim_account_get_presence(account); @@ -144,8 +142,6 @@ GaimAccount *account; GaimPresence *presence; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - account = gaim_connection_get_account(gc); presence = gaim_account_get_presence(account); @@ -189,7 +185,6 @@ qq_buddy *q_bud; gchar *name; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; @@ -226,7 +221,6 @@ qq_buddy_status *s; gchar *name; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; Modified: trunk/libgaim/protocols/qq/file_trans.c =================================================================== --- trunk/libgaim/protocols/qq/file_trans.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/file_trans.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -256,9 +256,8 @@ qq_data *qd; ft_info *info; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); qd = (qq_data *) gc->proto_data; - g_return_val_if_fail(qd != NULL && qd->session_key != NULL, -1); + g_return_val_if_fail(qd->session_key != NULL, -1); info = (ft_info *) qd->xfer->data; bytes = 0; @@ -289,7 +288,6 @@ time_t now; ft_info *info; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); qd = (qq_data *) gc->proto_data; info = (ft_info *) qd->xfer->data; @@ -395,7 +393,6 @@ qq_data *qd; ft_info *info; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); qd = (qq_data *) gc->proto_data; info = (ft_info *) qd->xfer->data; @@ -820,7 +817,6 @@ qq_file_header fh; qq_data *qd; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); qd = (qq_data *) gc->proto_data; cursor = data; Modified: trunk/libgaim/protocols/qq/group.c =================================================================== --- trunk/libgaim/protocols/qq/group.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/group.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -37,7 +37,7 @@ { guint32 external_group_id; - g_return_if_fail(gc != NULL && input != NULL); + g_return_if_fail(input != NULL); external_group_id = qq_string_to_dec_value(input); /* 0x00000000 means search for demo group */ qq_send_cmd_group_search_group(gc, external_group_id); @@ -46,7 +46,6 @@ static void _qq_group_search_cancel_callback(GaimConnection *gc, const gchar *input) { qq_data *qd; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); qd = (qq_data *) gc->proto_data; gaim_roomlist_set_in_progress(qd->roomlist, FALSE); @@ -88,7 +87,6 @@ GaimRoomlist *rl; GaimRoomlistField *f; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL); qd = (qq_data *) gc->proto_data; fields = NULL; @@ -136,9 +134,7 @@ g_return_if_fail(list != NULL); gc = gaim_account_get_connection(list->account); - g_return_if_fail(gc != NULL && gc->proto_data != NULL); qd = (qq_data *) gc->proto_data; - gaim_roomlist_set_in_progress(list, FALSE); gaim_roomlist_unref(list); } @@ -153,10 +149,8 @@ GaimBlistNode *node; qq_group *group; - g_return_if_fail(gc != NULL); account = gaim_connection_get_account(gc); - gaim_group = gaim_find_group(GAIM_GROUP_QQ_QUN); if (gaim_group == NULL) { gaim_debug(GAIM_DEBUG_INFO, "QQ", "We have no QQ Qun\n"); Modified: trunk/libgaim/protocols/qq/group_conv.c =================================================================== --- trunk/libgaim/protocols/qq/group_conv.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/group_conv.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -34,7 +34,7 @@ GaimConversation *conv; qq_data *qd; - g_return_if_fail(gc != NULL && gc->proto_data != NULL && group != NULL); + g_return_if_fail(group != NULL); qd = (qq_data *) gc->proto_data; conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, @@ -51,7 +51,7 @@ gchar *member_name; GaimConversation *conv; gint flag; - g_return_if_fail(gc != NULL && group != NULL); + g_return_if_fail(group != NULL); names = NULL; flags = NULL; Modified: trunk/libgaim/protocols/qq/group_find.c =================================================================== --- trunk/libgaim/protocols/qq/group_find.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/group_find.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -37,8 +37,6 @@ qq_data *qd; group_packet *p; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, FALSE); - if (internal_group_id == NULL) return FALSE; qd = (qq_data *) gc->proto_data; @@ -100,7 +98,7 @@ { qq_buddy *member, *q_bud; GaimBuddy *buddy; - g_return_val_if_fail(gc != NULL && group != NULL && member_uid > 0, NULL); + g_return_val_if_fail(group != NULL && member_uid > 0, NULL); member = qq_group_find_member_by_uid(group, member_uid); if (member == NULL) { /* first appear during my session */ @@ -128,7 +126,6 @@ qq_group *group; GList *list; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL); qd = (qq_data *) gc->proto_data; conv = gaim_find_chat(gc, channel); @@ -153,7 +150,6 @@ qq_group *group; qq_data *qd; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL); qd = (qq_data *) gc->proto_data; if (qd->groups == NULL || id <= 0) Modified: trunk/libgaim/protocols/qq/group_im.c =================================================================== --- trunk/libgaim/protocols/qq/group_im.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/group_im.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -58,7 +58,7 @@ guint16 msg_len; gchar *msg_filtered; - g_return_if_fail(gc != NULL && group != NULL && msg != NULL); + g_return_if_fail(group != NULL && msg != NULL); msg_filtered = gaim_markup_strip_html(msg); msg_len = strlen(msg_filtered); @@ -102,7 +102,7 @@ gchar *reason_utf8, *msg, *reason; group_member_opt *g; - g_return_if_fail(gc != NULL && internal_group_id > 0 && data != NULL && len > 0); + g_return_if_fail(internal_group_id > 0 && data != NULL && len > 0); if (*cursor >= (data + len - 1)) { gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Received group msg apply_join is empty\n"); @@ -150,7 +150,7 @@ gchar *reason_utf8, *msg, *reason; qq_group *group; - g_return_if_fail(gc != NULL && data != NULL && len > 0); + g_return_if_fail(data != NULL && len > 0); if (*cursor >= (data + len - 1)) { gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Received group msg been_rejected is empty\n"); @@ -191,7 +191,7 @@ gchar *reason_utf8, *msg; qq_group *group; - g_return_if_fail(gc != NULL && data != NULL && len > 0); + g_return_if_fail(data != NULL && len > 0); if (*cursor >= (data + len - 1)) { gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Received group msg been_approved is empty\n"); @@ -230,7 +230,7 @@ gchar *msg; qq_group *group; - g_return_if_fail(gc != NULL && data != NULL && len > 0); + g_return_if_fail(data != NULL && len > 0); if (*cursor >= (data + len - 1)) { gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Received group msg been_removed is empty\n"); @@ -264,7 +264,7 @@ qq_group *group; gchar *msg; - g_return_if_fail(gc != NULL && data != NULL && len > 0); + g_return_if_fail(data != NULL && len > 0); if (*cursor >= (data + len - 1)) { gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Received group msg been_added is empty\n"); @@ -309,7 +309,7 @@ qq_recv_group_im *im_group; gint skip_len; - g_return_if_fail(gc != NULL && gc->proto_data != NULL && data != NULL && data_len > 0); + g_return_if_fail(data != NULL && data_len > 0); qd = (qq_data *) gc->proto_data; gaim_debug(GAIM_DEBUG_INFO, "QQ", Modified: trunk/libgaim/protocols/qq/group_info.c =================================================================== --- trunk/libgaim/protocols/qq/group_info.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/group_info.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -64,7 +64,7 @@ guint8 *raw_data, *cursor; gint bytes, data_len; - g_return_if_fail(gc != NULL && group != NULL); + g_return_if_fail(group != NULL); data_len = 5; raw_data = g_newa(guint8, data_len); @@ -87,7 +87,7 @@ guint8 *raw_data, *cursor; gint bytes, data_len; - g_return_if_fail(gc != NULL && group != NULL); + g_return_if_fail(group != NULL); /* only get online members when conversation window is on */ if (NULL == gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT,group->group_name_utf8, gaim_connection_get_account(gc))) { @@ -119,7 +119,7 @@ GList *list; qq_buddy *member; - g_return_if_fail(gc != NULL && group != NULL); + g_return_if_fail(group != NULL); for (i = 0, list = group->members; list != NULL; list = list->next) { member = (qq_buddy *) list->data; if (_is_group_member_need_update_info(member)) @@ -168,7 +168,6 @@ guint32 unknown4; guint8 unknown1; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(data != NULL && len > 0); qd = (qq_data *) gc->proto_data; @@ -250,7 +249,7 @@ qq_group *group; qq_buddy *member; - g_return_if_fail(gc != NULL && data != NULL && len > 0); + g_return_if_fail(data != NULL && len > 0); if (data + len - *cursor < 4) { gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Invalid group online member reply, discard it!\n"); @@ -296,7 +295,7 @@ qq_group *group; qq_buddy *member; - g_return_if_fail(gc != NULL && data != NULL && len > 0); + g_return_if_fail(data != NULL && len > 0); read_packet_dw(data, cursor, len, &internal_group_id); g_return_if_fail(internal_group_id > 0); Modified: trunk/libgaim/protocols/qq/group_internal.c =================================================================== --- trunk/libgaim/protocols/qq/group_internal.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/group_internal.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -76,7 +76,6 @@ qq_group *group; qq_data *qd; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL); g_return_val_if_fail(internal_id > 0, NULL); qd = (qq_data *) gc->proto_data; @@ -104,7 +103,6 @@ { qq_group *group; GList *list; - g_return_if_fail(qd != NULL); list = qd->groups; while (list != NULL) { @@ -148,7 +146,6 @@ qq_data *qd; qq_group *group; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL); g_return_val_if_fail(data != NULL, NULL); qd = (qq_data *) gc->proto_data; @@ -181,7 +178,7 @@ { GaimChat *chat; gchar *external_group_id; - g_return_if_fail(gc != NULL && group != NULL); + g_return_if_fail(group != NULL); external_group_id = g_strdup_printf("%d", group->external_group_id); chat = gaim_blist_find_chat(gaim_connection_get_account(gc), external_group_id); Modified: trunk/libgaim/protocols/qq/group_join.c =================================================================== --- trunk/libgaim/protocols/qq/group_join.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/group_join.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -48,7 +48,6 @@ guint32 internal_group_id; qq_group *group; - g_return_if_fail(g != NULL && g->gc != NULL && g->uid > 0); gc = g->gc; internal_group_id = g->uid; @@ -64,7 +63,7 @@ guint8 *raw_data, *cursor; gint bytes, data_len; - g_return_if_fail(gc != NULL && group != NULL); + g_return_if_fail(group != NULL); if (group->my_status == QQ_GROUP_MEMBER_STATUS_NOT_MEMBER) { group->my_status = QQ_GROUP_MEMBER_STATUS_APPLYING; @@ -104,7 +103,6 @@ qq_group *group; guint32 internal_group_id; - g_return_if_fail(g != NULL && g->gc != NULL && g->uid > 0); gc = g->gc; internal_group_id = g->uid; @@ -121,7 +119,7 @@ { gchar *msg; gc_and_uid *g; - g_return_if_fail(gc != NULL && group != NULL); + g_return_if_fail(group != NULL); gaim_debug(GAIM_DEBUG_INFO, "QQ", "Group (internal id: %d) needs authentication\n", group->internal_group_id); @@ -145,7 +143,7 @@ gchar *reason_qq; gint bytes, data_len; - g_return_if_fail(gc != NULL && group != NULL); + g_return_if_fail(group != NULL); if (reason_utf8 == NULL || strlen(reason_utf8) == 0) reason_qq = g_strdup(""); @@ -183,7 +181,7 @@ guint8 *raw_data, *cursor; gint bytes, data_len; - g_return_if_fail(gc != NULL && group != NULL); + g_return_if_fail(group != NULL); data_len = 5; raw_data = g_newa(guint8, data_len); @@ -209,7 +207,6 @@ qq_group *group; qq_data *qd; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(data != NULL && len > 0); qd = (qq_data *) gc->proto_data; @@ -241,7 +238,6 @@ guint32 internal_group_id; qq_data *qd; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(data != NULL && len > 0); qd = (qq_data *) gc->proto_data; @@ -267,7 +263,7 @@ guint8 reply; qq_group *group; - g_return_if_fail(gc != NULL && data != NULL && len > 0); + g_return_if_fail(data != NULL && len > 0); bytes = 0; expected_bytes = 5; @@ -315,7 +311,7 @@ guint32 external_group_id; qq_group *group; - g_return_if_fail(gc != NULL && gc->proto_data != NULL && data != NULL); + g_return_if_fail(data != NULL); qd = (qq_data *) gc->proto_data; external_group_id_ptr = g_hash_table_lookup(data, QQ_GROUP_KEY_EXTERNAL_ID); @@ -343,7 +339,7 @@ guint32 internal_group_id; gc_and_uid *g; - g_return_if_fail(gc != NULL && data != NULL); + g_return_if_fail(data != NULL); internal_group_id_ptr = g_hash_table_lookup(data, "internal_group_id"); internal_group_id = strtol(internal_group_id_ptr, NULL, 10); Modified: trunk/libgaim/protocols/qq/group_network.c =================================================================== --- trunk/libgaim/protocols/qq/group_network.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/group_network.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -80,7 +80,7 @@ static void _qq_process_group_cmd_reply_error_default(guint8 reply, guint8 *cursor, gint len, GaimConnection *gc) { gchar *msg, *msg_utf8; - g_return_if_fail(cursor != NULL && len > 0 && gc != NULL); + g_return_if_fail(cursor != NULL && len > 0); msg = g_strndup((gchar *) cursor, len); /* it will append 0x00 */ msg_utf8 = qq_to_utf8(msg, QQ_CHARSET_DEFAULT); @@ -94,7 +94,7 @@ /* default process, dump only */ static void _qq_process_group_cmd_reply_default(guint8 *data, guint8 **cursor, gint len, GaimConnection *gc) { - g_return_if_fail(gc != NULL && data != NULL && len > 0); + g_return_if_fail(data != NULL && len > 0); gaim_debug(GAIM_DEBUG_INFO, "QQ", "Dump unprocessed group cmd reply:\n%s", hex_dump_to_str(data, len)); } @@ -104,11 +104,9 @@ qq_data *qd; group_packet *p; - g_return_if_fail(gc != NULL); g_return_if_fail(raw_data != NULL && data_len > 0); qd = (qq_data *) gc->proto_data; - g_return_if_fail(qd != NULL); qq_send_cmd(gc, QQ_CMD_GROUP_CMD, TRUE, 0, TRUE, raw_data, data_len); @@ -132,7 +130,6 @@ guint32 internal_group_id; guint8 *data, *cursor, sub_cmd, reply; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; Modified: trunk/libgaim/protocols/qq/group_opt.c =================================================================== --- trunk/libgaim/protocols/qq/group_opt.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/group_opt.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -81,7 +81,7 @@ { guint8 *data, *cursor; gint i, count, data_len; - g_return_if_fail(gc != NULL && group != NULL && members != NULL); + g_return_if_fail(members != NULL); for (i = 0; members[i] != 0xffffffff; i++) {; } @@ -162,7 +162,7 @@ gint i = 0, old = 0, new = 0, del = 0, add = 0; GList *list; - g_return_if_fail(gc != NULL && gc->proto_data != NULL && group != NULL); + g_return_if_fail(group != NULL); qd = (qq_data *) gc->proto_data; if (new_members[0] == 0xffffffff) return; @@ -214,7 +214,7 @@ { guint32 internal_group_id; qq_group *group; - g_return_if_fail(data != NULL && gc != NULL); + g_return_if_fail(data != NULL); read_packet_dw(data, cursor, len, &internal_group_id); g_return_if_fail(internal_group_id > 0); @@ -234,7 +234,7 @@ guint8 *data, *cursor; gchar *group_name, *group_desc, *notice; - g_return_if_fail(gc != NULL && group != NULL); + g_return_if_fail(group != NULL); group_name = group->group_name_utf8 == NULL ? "" : utf8_to_qq(group->group_name_utf8, QQ_CHARSET_DEFAULT); group_desc = group->group_desc_utf8 == NULL ? "" : utf8_to_qq(group->group_desc_utf8, QQ_CHARSET_DEFAULT); @@ -283,7 +283,7 @@ { guint32 internal_group_id; qq_group *group; - g_return_if_fail(data != NULL && gc != NULL); + g_return_if_fail(data != NULL); read_packet_dw(data, cursor, len, &internal_group_id); g_return_if_fail(internal_group_id > 0); @@ -304,7 +304,7 @@ gint data_len, data_written; guint8 *data, *cursor; qq_data *qd; - g_return_if_fail(gc != NULL && name != NULL); + g_return_if_fail(name != NULL); qd = (qq_data *) gc->proto_data; data_len = 7 + 1 + strlen(name) + 2 + 1 + 1 + 4; @@ -359,7 +359,7 @@ gc_and_uid *g; qq_data *qd; - g_return_if_fail(data != NULL && gc != NULL); + g_return_if_fail(data != NULL); g_return_if_fail(gc->proto_data != NULL); qd = (qq_data *) gc->proto_data; @@ -395,7 +395,7 @@ { gint data_len, data_written; guint8 *data, *cursor; - g_return_if_fail(gc != NULL && internal_group_id > 0); + g_return_if_fail(internal_group_id > 0); data_len = 5; data = g_newa(guint8, data_len); @@ -420,7 +420,7 @@ { guint32 internal_group_id; qq_group *group; - g_return_if_fail(data != NULL && gc != NULL); + g_return_if_fail(data != NULL); read_packet_dw(data, cursor, len, &internal_group_id); g_return_if_fail(internal_group_id > 0); @@ -438,7 +438,7 @@ guint32 internal_group_id; qq_group *group; - g_return_if_fail(gc != NULL && data != NULL); + g_return_if_fail(data != NULL); internal_group_id_ptr = g_hash_table_lookup(data, "internal_group_id"); internal_group_id = strtol(internal_group_id_ptr, NULL, 10); Modified: trunk/libgaim/protocols/qq/group_search.c =================================================================== --- trunk/libgaim/protocols/qq/group_search.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/group_search.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -42,8 +42,6 @@ guint8 *raw_data, *cursor, type; gint bytes, data_len; - g_return_if_fail(gc != NULL); - data_len = 6; raw_data = g_newa(guint8, data_len); cursor = raw_data; @@ -96,7 +94,6 @@ qq_group *group; GSList *pending_id; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(data != NULL && len > 0); qd = (qq_data *) gc->proto_data; Modified: trunk/libgaim/protocols/qq/im.c =================================================================== --- trunk/libgaim/protocols/qq/im.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/im.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -252,7 +252,7 @@ qq_data *qd; qq_recv_normal_im_text *im_text; - g_return_if_fail(gc != NULL && gc->proto_data != NULL && common != NULL); + g_return_if_fail(common != NULL); qd = (qq_data *) gc->proto_data; /* now it is QQ_NORMAL_IM_TEXT */ @@ -402,7 +402,7 @@ guint8 reply; gchar **segments, *msg_utf8; - g_return_if_fail(gc != NULL && data != NULL && data_len != 0); + g_return_if_fail(data != NULL && data_len != 0); if (*cursor >= (data + data_len - 1)) { gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Received sys IM is empty\n"); @@ -435,8 +435,6 @@ gboolean is_bold = FALSE, is_italic = FALSE, is_underline = FALSE; const gchar *start, *end, *last; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - qd = (qq_data *) gc->proto_data; client_tag = QQ_CLIENT; normal_im_type = QQ_NORMAL_IM_TEXT; @@ -554,7 +552,6 @@ gint len; guint8 *data, *cursor, reply; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = gc->proto_data; @@ -584,7 +581,6 @@ guint8 *data, *cursor; qq_recv_im_header *im_header; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; Modified: trunk/libgaim/protocols/qq/keep_alive.c =================================================================== --- trunk/libgaim/protocols/qq/keep_alive.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/keep_alive.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -46,8 +46,6 @@ qq_data *qd; guint8 *raw_data, *cursor; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - qd = (qq_data *) gc->proto_data; raw_data = g_newa(guint8, 4); cursor = raw_data; @@ -67,7 +65,6 @@ gchar **segments; guint8 *data; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; @@ -104,12 +101,9 @@ qq_data *qd; qq_buddy *q_bud; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - qd = (qq_data *) (gc->proto_data); now = time(NULL); list = qd->buddies; - g_return_if_fail(qd != NULL); while (list != NULL) { q_bud = (qq_buddy *) list->data; @@ -128,7 +122,7 @@ GaimBuddy *bud; gchar *status_id; - g_return_if_fail(gc != NULL && q_bud != NULL); + g_return_if_fail(q_bud != NULL); name = uid_to_gaim_name(q_bud->uid); bud = gaim_find_buddy(gc->account, name); Modified: trunk/libgaim/protocols/qq/login_logout.c =================================================================== --- trunk/libgaim/protocols/qq/login_logout.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/login_logout.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -157,8 +157,6 @@ qq_data *qd; qq_login_reply_ok_packet lrop; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, QQ_LOGIN_REPLY_MISC_ERROR); - qd = (qq_data *) gc->proto_data; cursor = data; bytes = 0; @@ -251,8 +249,6 @@ qq_data *qd; qq_login_reply_redirect_packet lrrp; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, QQ_LOGIN_REPLY_MISC_ERROR); - qd = (qq_data *) gc->proto_data; cursor = data; bytes = 0; @@ -304,8 +300,6 @@ guint16 seq_ret; gint bytes; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - qd = (qq_data *) gc->proto_data; buf = g_newa(guint8, MAX_PACKET_SIZE); @@ -335,8 +329,6 @@ gint encrypted_len, bytes; gint pos; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - qd = (qq_data *) gc->proto_data; buf = g_newa(guint8, MAX_PACKET_SIZE); raw_data = g_newa(guint8, QQ_LOGIN_DATA_LENGTH); @@ -391,7 +383,6 @@ { qq_data *qd; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; @@ -422,8 +413,6 @@ gint i; qq_data *qd; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - qd = (qq_data *) gc->proto_data; for (i = 0; i < 4; i++) qq_send_cmd(gc, QQ_CMD_LOGOUT, FALSE, 0xffff, FALSE, qd->pwkey, QQ_KEY_LENGTH); @@ -438,7 +427,6 @@ guint8 *data; qq_data *qd; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; Modified: trunk/libgaim/protocols/qq/qq.c =================================================================== --- trunk/libgaim/protocols/qq/qq.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/qq.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -314,7 +314,7 @@ gchar *msg, *msg_with_qq_smiley; qq_data *qd; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL && who != NULL, -1); + g_return_val_if_fail(who != NULL, -1); qd = (qq_data *) gc->proto_data; @@ -343,7 +343,7 @@ gchar *msg, *msg_with_qq_smiley; qq_group *group; - g_return_val_if_fail(gc != NULL && message != NULL, -1); + g_return_val_if_fail(message != NULL, -1); g_return_val_if_fail(strlen(message) <= QQ_MSG_IM_MAX, -E2BIG); group = qq_group_find_by_channel(gc, channel); @@ -364,7 +364,6 @@ guint32 uid; qq_data *qd; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); qd = gc->proto_data; uid = gaim_name_to_uid(who); @@ -383,8 +382,6 @@ GaimConnection *gc = (GaimConnection *) action->context; qq_data *qd; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - qd = (qq_data *) gc->proto_data; qq_prepare_modify_info(gc); } @@ -395,7 +392,6 @@ GaimRequestField *field; gint suffix; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); qd = (qq_data *) gc->proto_data; field = gaim_request_fields_get_field(fields, "face_num"); @@ -485,7 +481,7 @@ buddy = (GaimBuddy *) node; gc = gaim_account_get_connection(buddy->account); who = buddy->name; - g_return_if_fail(gc != NULL && who != NULL); + g_return_if_fail(who != NULL); uid = gaim_name_to_uid(who); g_return_if_fail(uid > 0); @@ -510,8 +506,6 @@ qq_data *qd; GString *info; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - qd = (qq_data *) gc->proto_data; info = g_string_new("<html><body>\n"); @@ -549,7 +543,6 @@ static void _qq_menu_create_permanent_group(GaimPluginAction * action) { GaimConnection *gc = (GaimConnection *) action->context; - g_return_if_fail(gc != NULL); gaim_request_input(gc, _("Create QQ Qun"), _("Input Qun name here"), _("Only QQ member can create permanent Qun"), @@ -566,7 +559,7 @@ g_return_if_fail(GAIM_BLIST_NODE_IS_CHAT(node)); - g_return_if_fail(gc != NULL && components != NULL); + g_return_if_fail(components != NULL); qq_group_exit(gc, components); } @@ -579,7 +572,7 @@ g_return_if_fail(GAIM_BLIST_NODE_IS_CHAT(node)); - g_return_if_fail(gc != NULL && components != NULL); + g_return_if_fail(components != NULL); qq_group_manage_group(gc, components); } */ @@ -765,7 +758,6 @@ gc = (GaimConnection *) action->context; qd = (qq_data *) gc->proto_data; - g_return_if_fail(gc != NULL && qd != NULL); fields = gaim_request_fields_new(); group = gaim_request_field_group_new(_("Basic Elements")); @@ -886,7 +878,6 @@ qq_data *qd; GList *list; - g_return_if_fail(gc != NULL); if (NULL == (qd = (qq_data *) gc->proto_data)) return; @@ -910,7 +901,7 @@ static void _qq_get_chat_buddy_info(GaimConnection *gc, gint channel, const gchar *who) { gchar *gaim_name; - g_return_if_fail(gc != NULL && gc->proto_data != NULL && who != NULL); + g_return_if_fail(who != NULL); gaim_name = chat_name_to_gaim_name(who); if (gaim_name != NULL) @@ -921,7 +912,7 @@ /* who is the nickname of buddy in QQ chat-room (Qun) */ static gchar *_qq_get_chat_buddy_real_name(GaimConnection *gc, gint channel, const gchar *who) { - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL && who != NULL, NULL); + g_return_val_if_fail(who != NULL, NULL); return chat_name_to_gaim_name(who); } Modified: trunk/libgaim/protocols/qq/recv_core.c =================================================================== --- trunk/libgaim/protocols/qq/recv_core.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/recv_core.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -63,7 +63,6 @@ qq_data *qd; guint8 *byte, mask; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, FALSE); qd = (qq_data *) gc->proto_data; byte = &(qd->window[seq / 8]); mask = (1 << (seq % 8)); @@ -72,7 +71,7 @@ return TRUE; /* check mask */ (*byte) |= mask; return FALSE; /* set mask */ -} /* _qq_check_packet_set_window */ +} /* default process, decrypt and dump */ static void _qq_process_packet_default(guint8 *buf, gint buf_len, guint16 cmd, guint16 seq, GaimConnection *gc) @@ -82,7 +81,6 @@ gchar *msg_utf8; gint len; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; @@ -111,7 +109,6 @@ qq_recv_msg_header header; packet_before_login *b4_packet; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len > 0); qd = (qq_data *) gc->proto_data; @@ -297,8 +294,6 @@ gc = (GaimConnection *) data; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); - if(cond != GAIM_INPUT_READ) { gaim_connection_error(gc, _("Socket error")); return; Modified: trunk/libgaim/protocols/qq/send_core.c =================================================================== --- trunk/libgaim/protocols/qq/send_core.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/send_core.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -40,8 +40,7 @@ qq_data *qd; gint bytes_expected, bytes_written; - g_return_val_if_fail(gc != NULL && - gc->proto_data != NULL && buf != NULL && cursor != NULL && *cursor != NULL, -1); + g_return_val_if_fail(buf != NULL && cursor != NULL && *cursor != NULL, -1); qd = (qq_data *) gc->proto_data; if (is_auto_seq) @@ -80,8 +79,6 @@ gint bytes_sent; guint8 *cursor; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); - qd = (qq_data *) gc->proto_data; if (qd->use_tcp) { @@ -124,8 +121,6 @@ guint16 seq_ret; gint encrypted_len, bytes_written, bytes_expected, bytes_sent; - g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, -1); - qd = (qq_data *) gc->proto_data; g_return_val_if_fail(qd->session_key != NULL, -1); Modified: trunk/libgaim/protocols/qq/send_file.c =================================================================== --- trunk/libgaim/protocols/qq/send_file.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/send_file.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -496,7 +496,6 @@ gint packet_len, bytes; ft_info *info; - g_return_if_fail (gc != NULL && gc->proto_data != NULL); qd = (qq_data *) gc->proto_data; info = (ft_info *) qd->xfer->data; @@ -567,7 +566,6 @@ gint packet_len, bytes; gaim_debug(GAIM_DEBUG_INFO, "_qq_send_packet_file_reject", "start"); - g_return_if_fail(gc != NULL && gc->proto_data != NULL); qd = (qq_data *) gc->proto_data; packet_len = 64; @@ -594,7 +592,6 @@ gint packet_len, bytes; gaim_debug(GAIM_DEBUG_INFO, "_qq_send_packet_file_cancel", "start\n"); - g_return_if_fail(gc != NULL && gc->proto_data != NULL); qd = (qq_data *) gc->proto_data; packet_len = 64; @@ -631,7 +628,6 @@ g_return_if_fail (xfer != NULL); account = gaim_xfer_get_account(xfer); gc = gaim_account_get_connection(account); - g_return_if_fail (gc != NULL && gc->proto_data != NULL); to_uid = gaim_name_to_uid (xfer->who); g_return_if_fail (to_uid != 0); @@ -700,9 +696,9 @@ gchar *msg, *filename; qq_data *qd; - g_return_if_fail (gc != NULL && data != NULL && data_len != 0); + g_return_if_fail (data != NULL && data_len != 0); qd = (qq_data *) gc->proto_data; - g_return_if_fail (qd != NULL && qd->xfer != NULL); + g_return_if_fail (qd->xfer != NULL); if (*cursor >= (data + data_len - 1)) { gaim_debug (GAIM_DEBUG_WARNING, "QQ", @@ -724,14 +720,14 @@ /* process cancel im for file transfer request */ void qq_process_recv_file_cancel (guint8 *data, guint8 **cursor, gint data_len, - guint32 sender_uid, GaimConnection * gc) + guint32 sender_uid, GaimConnection *gc) { gchar *msg, *filename; qq_data *qd; - g_return_if_fail (gc != NULL && data != NULL && data_len != 0); + g_return_if_fail (data != NULL && data_len != 0); qd = (qq_data *) gc->proto_data; - g_return_if_fail (qd != NULL && qd->xfer != NULL + g_return_if_fail (qd->xfer != NULL && gaim_xfer_get_filename(qd->xfer) != NULL); if (*cursor >= (data + data_len - 1)) { @@ -753,13 +749,13 @@ /* process accept im for file transfer request */ void qq_process_recv_file_accept(guint8 *data, guint8 **cursor, gint data_len, - guint32 sender_uid, GaimConnection * gc) + guint32 sender_uid, GaimConnection *gc) { qq_data *qd; ft_info *info; GaimXfer *xfer; - g_return_if_fail (gc != NULL && data != NULL && data_len != 0); + g_return_if_fail (data != NULL && data_len != 0); qd = (qq_data *) gc->proto_data; xfer = qd->xfer; @@ -790,7 +786,7 @@ GaimBuddy *b; qq_buddy *q_bud; - g_return_if_fail (gc != NULL && data != NULL && data_len != 0); + g_return_if_fail (data != NULL && data_len != 0); qd = (qq_data *) gc->proto_data; if (*cursor >= (data + data_len - 1)) { @@ -892,7 +888,7 @@ ft_info *info; GaimXfer *xfer; - g_return_if_fail (gc != NULL && data != NULL && data_len != 0); + g_return_if_fail (data != NULL && data_len != 0); qd = (qq_data *) gc->proto_data; if (*cursor >= (data + data_len - 1)) { @@ -925,7 +921,6 @@ qq_data *qd; GaimXfer *xfer; - g_return_if_fail (gc != NULL && gc->proto_data != NULL); qd = (qq_data *) gc->proto_data; xfer = gaim_xfer_new (gc->account, GAIM_XFER_SEND, Modified: trunk/libgaim/protocols/qq/sendqueue.c =================================================================== --- trunk/libgaim/protocols/qq/sendqueue.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/sendqueue.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -46,8 +46,6 @@ GList *list; qq_sendpacket *p; - g_return_if_fail(qd != NULL); - list = qd->sendqueue; while (list != NULL) { p = (qq_sendpacket *) (list->data); Modified: trunk/libgaim/protocols/qq/sys_msg.c =================================================================== --- trunk/libgaim/protocols/qq/sys_msg.c 2006-09-26 22:27:02 UTC (rev 17374) +++ trunk/libgaim/protocols/qq/sys_msg.c 2006-09-26 22:54:24 UTC (rev 17375) @@ -52,7 +52,6 @@ GaimAccount *account; account = gaim_connection_get_account(gc); - g_return_if_fail(gc != NULL && gc->proto_data != NULL); log = gaim_log_new(GAIM_LOG_IM, "systemim", @@ -141,7 +140,7 @@ gc_and_uid *g; gchar *name; - g_return_if_fail(gc != NULL && from != NULL && to != NULL); + g_return_if_fail(from != NULL && to != NULL); uid = strtol(from, NULL, 10); name = uid_to_gaim_name(uid); @@ -173,7 +172,7 @@ { gchar *message, *reason; - g_return_if_fail(gc != NULL && from != NULL && to != NULL); + g_return_if_fail(from != NULL && to != NULL); message = g_strdup_printf(_("User %s rejected your request"), from); reason = g_strdup_printf(_("Reason: %s"), msg_utf8); @@ -190,7 +189,7 @@ gchar *message; qq_data *qd; - g_return_if_fail(gc != NULL && from != NULL && to != NULL); + g_return_if_fail(from != NULL && to != NULL); qd = (qq_data *) gc->proto_data; qq_add_buddy_by_recv_packet(gc, strtol(from, NULL, 10), TRUE, TRUE); @@ -211,7 +210,7 @@ GaimBuddy *b; gchar *name; - g_return_if_fail(gc != NULL && from != NULL && to != NULL); + g_return_if_fail(from != NULL && to != NULL); uid = strtol(from, NULL, 10); g = g_new0(gc_and_uid, 1); @@ -258,7 +257,6 @@ guint8 *data; gchar **segments, *code, *from, *to, *msg, *msg_utf8; - g_return_if_fail(gc != NULL && gc->proto_data != NULL); g_return_if_fail(buf != NULL && buf_len != 0); qd = (qq_data *) gc->proto_data; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-09-27 00:31:42
|
Revision: 17378 http://svn.sourceforge.net/gaim/?rev=17378&view=rev Author: markhuetsch Date: 2006-09-26 17:31:39 -0700 (Tue, 26 Sep 2006) Log Message: ----------- There's no reason to generate our session_md5 more than once. This probably doesn't fix the bug from Adium crash 215722, but if it happens again, it'll be a bit easier to track down. Also, I was wrong about the login scheme. Nothing significant is different, so remove the comment. Modified Paths: -------------- trunk/libgaim/protocols/qq/file_trans.c trunk/libgaim/protocols/qq/im.c trunk/libgaim/protocols/qq/login_logout.c trunk/libgaim/protocols/qq/qq.h trunk/libgaim/protocols/qq/qq_proxy.c trunk/libgaim/protocols/qq/send_file.c Modified: trunk/libgaim/protocols/qq/file_trans.c =================================================================== --- trunk/libgaim/protocols/qq/file_trans.c 2006-09-26 23:20:39 UTC (rev 17377) +++ trunk/libgaim/protocols/qq/file_trans.c 2006-09-27 00:31:39 UTC (rev 17378) @@ -284,7 +284,7 @@ { qq_data *qd; gint bytes, bytes_expected, encrypted_len; - guint8 *raw_data, *cursor, *encrypted_data, *md5; + guint8 *raw_data, *cursor, *encrypted_data; time_t now; ft_info *info; @@ -296,9 +296,8 @@ bytes = 0; now = time(NULL); - md5 = _gen_session_md5(qd->uid, qd->session_key); - bytes += create_packet_data(raw_data, &cursor, md5, 16); + bytes += create_packet_data(raw_data, &cursor, qd->session_md5, 16); bytes += create_packet_w(raw_data, &cursor, packet_type); switch (packet_type) { case QQ_FILE_CMD_SENDER_SAY_HELLO: @@ -377,8 +376,6 @@ else gaim_debug(GAIM_DEBUG_ERROR, "QQ", "qq_send_file_ctl_packet: Expected to get %d bytes, but get %d", bytes_expected, bytes); - - g_free(md5); } /* send a file to udp channel with QQ_FILE_DATA_PACKET_TAG */ @@ -521,14 +518,12 @@ guint16 packet_type; guint16 seq; guint8 hellobyte; - guint8 *md5; ft_info *info = (ft_info *) qd->xfer->data; decrypted_data = g_newa(guint8, len); decrypted_len = len; - md5 = _gen_session_md5(qd->uid, qd->session_key); - if (qq_crypt(DECRYPT, cursor, len - (cursor - data), md5, decrypted_data, &decrypted_len)) { + if (qq_crypt(DECRYPT, cursor, len - (cursor - data), qd->session_md5, decrypted_data, &decrypted_len)) { cursor = decrypted_data + 16; /* skip md5 section */ read_packet_w(decrypted_data, &cursor, decrypted_len, &packet_type); read_packet_w(decrypted_data, &cursor, decrypted_len, &seq); @@ -577,7 +572,6 @@ gaim_debug(GAIM_DEBUG_INFO, "QQ", "unprocess file command %d\n", packet_type); } } - g_free(md5); } static void _qq_recv_file_progess(GaimConnection *gc, guint8 *buffer, guint16 len, guint32 index, guint32 offset) Modified: trunk/libgaim/protocols/qq/im.c =================================================================== --- trunk/libgaim/protocols/qq/im.c 2006-09-26 23:20:39 UTC (rev 17377) +++ trunk/libgaim/protocols/qq/im.c 2006-09-27 00:31:39 UTC (rev 17378) @@ -425,7 +425,7 @@ void qq_send_packet_im(GaimConnection *gc, guint32 to_uid, gchar *msg, gint type) { qq_data *qd; - guint8 *cursor, *raw_data, *send_im_tail, *md5; + guint8 *cursor, *raw_data, *send_im_tail; guint16 client_tag, normal_im_type; gint msg_len, raw_len, font_name_len, tail_len, bytes; time_t now; @@ -483,7 +483,6 @@ msg_filtered = gaim_markup_strip_html(msg); msg_len = strlen(msg_filtered); now = time(NULL); - md5 = _gen_session_md5(qd->uid, qd->session_key); font_name_len = (font_name) ? strlen(font_name) : DEFAULT_FONT_NAME_LEN; tail_len = font_name_len + QQ_SEND_IM_AFTER_MSG_HEADER_LEN + 1; @@ -504,7 +503,7 @@ /* 014-017: sender uid */ bytes += create_packet_dw(raw_data, &cursor, to_uid); /* 018-033: md5 of (uid+session_key) */ - bytes += create_packet_data(raw_data, &cursor, md5, 16); + bytes += create_packet_data(raw_data, &cursor, qd->session_md5, 16); /* 034-035: message type */ bytes += create_packet_w(raw_data, &cursor, normal_im_type); /* 036-037: sequence number */ Modified: trunk/libgaim/protocols/qq/login_logout.c =================================================================== --- trunk/libgaim/protocols/qq/login_logout.c 2006-09-26 23:20:39 UTC (rev 17377) +++ trunk/libgaim/protocols/qq/login_logout.c 2006-09-27 00:31:39 UTC (rev 17378) @@ -171,23 +171,23 @@ /* 017-020: login uid */ bytes += read_packet_dw(data, &cursor, len, &lrop.uid); /* 021-024: server detected user public IP */ - bytes += read_packet_data(data, &cursor, len, (guint8 *) & lrop.client_ip, 4); + bytes += read_packet_data(data, &cursor, len, (guint8 *) &lrop.client_ip, 4); /* 025-026: server detected user port */ bytes += read_packet_w(data, &cursor, len, &lrop.client_port); /* 027-030: server detected itself ip 127.0.0.1 ? */ - bytes += read_packet_data(data, &cursor, len, (guint8 *) & lrop.server_ip, 4); + bytes += read_packet_data(data, &cursor, len, (guint8 *) &lrop.server_ip, 4); /* 031-032: server listening port */ bytes += read_packet_w(data, &cursor, len, &lrop.server_port); /* 033-036: login time for current session */ - bytes += read_packet_dw(data, &cursor, len, (guint32 *) & lrop.login_time); + bytes += read_packet_dw(data, &cursor, len, (guint32 *) &lrop.login_time); /* 037-062: 26 bytes, unknown */ - bytes += read_packet_data(data, &cursor, len, (guint8 *) & lrop.unknown1, 26); + bytes += read_packet_data(data, &cursor, len, (guint8 *) &lrop.unknown1, 26); /* 063-066: unknown server1 ip address */ - bytes += read_packet_data(data, &cursor, len, (guint8 *) & lrop.unknown_server1_ip, 4); + bytes += read_packet_data(data, &cursor, len, (guint8 *) &lrop.unknown_server1_ip, 4); /* 067-068: unknown server1 port */ bytes += read_packet_w(data, &cursor, len, &lrop.unknown_server1_port); /* 069-072: unknown server2 ip address */ - bytes += read_packet_data(data, &cursor, len, (guint8 *) & lrop.unknown_server2_ip, 4); + bytes += read_packet_data(data, &cursor, len, (guint8 *) &lrop.unknown_server2_ip, 4); /* 073-074: unknown server2 port */ bytes += read_packet_w(data, &cursor, len, &lrop.unknown_server2_port); /* 075-076: 2 bytes unknown */ @@ -195,15 +195,15 @@ /* 077-078: 2 bytes unknown */ bytes += read_packet_w(data, &cursor, len, &lrop.unknown3); /* 079-110: 32 bytes unknown */ - bytes += read_packet_data(data, &cursor, len, (guint8 *) & lrop.unknown4, 32); + bytes += read_packet_data(data, &cursor, len, (guint8 *) &lrop.unknown4, 32); /* 111-122: 12 bytes unknown */ - bytes += read_packet_data(data, &cursor, len, (guint8 *) & lrop.unknown5, 12); + bytes += read_packet_data(data, &cursor, len, (guint8 *) &lrop.unknown5, 12); /* 123-126: login IP of last session */ - bytes += read_packet_data(data, &cursor, len, (guint8 *) & lrop.last_client_ip, 4); + bytes += read_packet_data(data, &cursor, len, (guint8 *) &lrop.last_client_ip, 4); /* 127-130: login time of last session */ - bytes += read_packet_dw(data, &cursor, len, (guint32 *) & lrop.last_login_time); + bytes += read_packet_dw(data, &cursor, len, (guint32 *) &lrop.last_login_time); /* 131-138: 8 bytes unknown */ - bytes += read_packet_data(data, &cursor, len, (guint8 *) & lrop.unknown6, 8); + bytes += read_packet_data(data, &cursor, len, (guint8 *) &lrop.unknown6, 8); if (bytes != QQ_LOGIN_REPLY_OK_PACKET_LEN) { /* fail parsing login info */ gaim_debug(GAIM_DEBUG_WARNING, "QQ", @@ -211,15 +211,14 @@ QQ_LOGIN_REPLY_OK_PACKET_LEN, bytes); } /* but we still go on as login OK */ - qd->session_key = g_memdup(lrop.session_key, QQ_KEY_LENGTH); + qd->session_key = lrop.session_key; + qd->session_md5 = _gen_session_md5(qd->uid, qd->session_key); qd->my_ip = gen_ip_str(lrop.client_ip); qd->my_port = lrop.client_port; qd->login_time = lrop.login_time; qd->last_login_time = lrop.last_login_time; qd->last_login_ip = gen_ip_str(lrop.last_client_ip); - g_free(lrop.session_key); - gaim_connection_set_state(gc, GAIM_CONNECTED); qd->logged_in = TRUE; /* must be defined after sev_finish_login */ @@ -279,7 +278,7 @@ } /* process login reply which says wrong password */ -static gint _qq_process_login_wrong_pwd(GaimConnection * gc, guint8 * data, gint len) +static gint _qq_process_login_wrong_pwd(GaimConnection *gc, guint8 *data, gint len) { gchar *server_reply, *server_reply_utf8; server_reply = g_new0(gchar, len); @@ -316,10 +315,6 @@ gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Fail create request login token packet\n"); } -/* TODO: The login packet and its response have changed by QQ2006 Beta2. In that version, - * the login OK response packet does not appear to be decryptable with qd->pwkey or qd->inikey. - * Fortunately, this older system still works. */ - /* send login packet to QQ server */ static void qq_send_packet_login(GaimConnection *gc, guint8 token_length, guint8 *token) { Modified: trunk/libgaim/protocols/qq/qq.h =================================================================== --- trunk/libgaim/protocols/qq/qq.h 2006-09-26 23:20:39 UTC (rev 17377) +++ trunk/libgaim/protocols/qq/qq.h 2006-09-27 00:31:39 UTC (rev 17378) @@ -61,6 +61,7 @@ guint8 *inikey; /* initial key to encrypt login packet */ guint8 *pwkey; /* password in md5 (or md5' md5) */ guint8 *session_key; /* later use this as key in this session */ + guint8 *session_md5; /* concatenate my uid with session_key and md5 it */ guint16 send_seq; /* send sequence number */ guint8 login_mode; /* online of invisible */ Modified: trunk/libgaim/protocols/qq/qq_proxy.c =================================================================== --- trunk/libgaim/protocols/qq/qq_proxy.c 2006-09-26 23:20:39 UTC (rev 17377) +++ trunk/libgaim/protocols/qq/qq_proxy.c 2006-09-27 00:31:39 UTC (rev 17378) @@ -457,6 +457,7 @@ g_free(qd->inikey); g_free(qd->pwkey); g_free(qd->session_key); + g_free(qd->session_md5); g_free(qd->my_ip); g_free(qd); Modified: trunk/libgaim/protocols/qq/send_file.c =================================================================== --- trunk/libgaim/protocols/qq/send_file.c 2006-09-26 23:20:39 UTC (rev 17377) +++ trunk/libgaim/protocols/qq/send_file.c 2006-09-27 00:31:39 UTC (rev 17378) @@ -281,13 +281,11 @@ { gint bytes; time_t now; - guint8 *md5; guint16 seq; ft_info *info; bytes = 0; now = time(NULL); - md5 = _gen_session_md5(qd->uid, qd->session_key); if (!seq_ack) seq = qd->send_seq; else { info = (ft_info *) qd->xfer->data; @@ -305,7 +303,7 @@ /* 014-017: sender uid */ bytes += create_packet_dw (raw_data, cursor, to_uid); /* 018-033: md5 of (uid+session_key) */ - bytes += create_packet_data (raw_data, cursor, md5, 16); + bytes += create_packet_data (raw_data, cursor, qd->session_md5, 16); /* 034-035: message type */ bytes += create_packet_w (raw_data, cursor, message_type); /* 036-037: sequence number */ @@ -332,7 +330,6 @@ /* 063: transfer_type, 0x65: FILE 0x6b: FACE */ bytes += create_packet_b (raw_data, cursor, QQ_FILE_TRANSFER_FILE); /* FIXME */ - g_free (md5); return bytes; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-10-04 02:52:45
|
Revision: 17402 http://svn.sourceforge.net/gaim/?rev=17402&view=rev Author: markhuetsch Date: 2006-09-29 17:14:00 -0700 (Fri, 29 Sep 2006) Log Message: ----------- leak-be-gone Modified Paths: -------------- trunk/libgaim/protocols/qq/char_conv.c trunk/libgaim/protocols/qq/file_trans.c trunk/libgaim/protocols/qq/group_im.c trunk/libgaim/protocols/qq/group_network.c trunk/libgaim/protocols/qq/im.c trunk/libgaim/protocols/qq/login_logout.c trunk/libgaim/protocols/qq/recv_core.c Modified: trunk/libgaim/protocols/qq/char_conv.c =================================================================== --- trunk/libgaim/protocols/qq/char_conv.c 2006-09-29 20:49:33 UTC (rev 17401) +++ trunk/libgaim/protocols/qq/char_conv.c 2006-09-30 00:14:00 UTC (rev 17402) @@ -112,10 +112,10 @@ if (error == NULL) return ret; /* conversion is OK */ else { /* conversion error */ + gchar *failed = hex_dump_to_str((guint8 *) str, (len == -1) ? strlen(str) : len); gaim_debug(GAIM_DEBUG_ERROR, "QQ", "%s\n", error->message); - gaim_debug(GAIM_DEBUG_WARNING, "QQ", - "Dump failed text\n%s", - hex_dump_to_str((guint8 *) str, (len == -1) ? strlen(str) : len)); + gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Dump failed text\n%s", failed); + g_free(failed); g_error_free(error); return g_strdup(QQ_NULL_MSG); } Modified: trunk/libgaim/protocols/qq/file_trans.c =================================================================== --- trunk/libgaim/protocols/qq/file_trans.c 2006-09-29 20:49:33 UTC (rev 17401) +++ trunk/libgaim/protocols/qq/file_trans.c 2006-09-30 00:14:00 UTC (rev 17402) @@ -344,26 +344,29 @@ } if (bytes == bytes_expected) { - gaim_debug(GAIM_DEBUG_INFO, "QQ", "sending packet[%s]: \n%s", qq_get_file_cmd_desc(packet_type), - hex_dump_to_str(raw_data, bytes)); + gchar *hex_dump = hex_dump_to_str(raw_data, bytes); + gaim_debug(GAIM_DEBUG_INFO, "QQ", "sending packet[%s]: \n%s", qq_get_file_cmd_desc(packet_type), hex_dump); + g_free(hex_dump); encrypted_len = bytes + 16; encrypted_data = g_newa(guint8, encrypted_len); qq_crypt(ENCRYPT, raw_data, bytes, info->file_session_key, encrypted_data, &encrypted_len); /*debug: try to decrypt it */ /* if (QQ_DEBUG) { - gaim_debug(GAIM_DEBUG_INFO, "QQ", "encrypted packet: \n%s", - hex_dump_to_str(encrypted_data, encrypted_len)); guint8 *buf; int buflen; + hex_dump = hex_dump_to_str(encrypted_data, encrypted_len); + gaim_debug(GAIM_DEBUG_INFO, "QQ", "encrypted packet: \n%s", hex_dump); + g_free(hex_dump); buf = g_newa(guint8, MAX_PACKET_SIZE); buflen = encrypted_len; if (qq_crypt(DECRYPT, encrypted_data, encrypted_len, info->file_session_key, buf, &buflen)) { gaim_debug(GAIM_DEBUG_INFO, "QQ", "decrypt success\n"); if (buflen == bytes && memcmp(raw_data, buf, buflen) == 0) gaim_debug(GAIM_DEBUG_INFO, "QQ", "checksum ok\n"); - gaim_debug(GAIM_DEBUG_INFO, "QQ", "decrypted packet: \n%s", - hex_dump_to_str(buf, buflen)); + hex_dump = hex_dump_to_str(buf, buflen); + gaim_debug(GAIM_DEBUG_INFO, "QQ", "decrypted packet: \n%s", hex_dump); + g_free(hex_dump); } else { gaim_debug(GAIM_DEBUG_INFO, "QQ", "decrypt fail\n"); } @@ -524,13 +527,15 @@ decrypted_len = len; if (qq_crypt(DECRYPT, cursor, len - (cursor - data), qd->session_md5, decrypted_data, &decrypted_len)) { + gchar *hex_dump; cursor = decrypted_data + 16; /* skip md5 section */ read_packet_w(decrypted_data, &cursor, decrypted_len, &packet_type); read_packet_w(decrypted_data, &cursor, decrypted_len, &seq); cursor += 4+1+1+19+1; gaim_debug(GAIM_DEBUG_INFO, "QQ", "==> [%d] receive %s packet\n", seq, qq_get_file_cmd_desc(packet_type)); - gaim_debug(GAIM_DEBUG_INFO, "QQ", "decrypted control packet received: \n%s", - hex_dump_to_str(decrypted_data, decrypted_len)); + hex_dump = hex_dump_to_str(decrypted_data, decrypted_len); + gaim_debug(GAIM_DEBUG_INFO, "QQ", "decrypted control packet received: \n%s", hex_dump); + g_free(hex_dump); switch (packet_type) { case QQ_FILE_CMD_NOTIFY_IP_ACK: cursor = decrypted_data; Modified: trunk/libgaim/protocols/qq/group_im.c =================================================================== --- trunk/libgaim/protocols/qq/group_im.c 2006-09-29 20:49:33 UTC (rev 17401) +++ trunk/libgaim/protocols/qq/group_im.c 2006-09-30 00:14:00 UTC (rev 17402) @@ -299,7 +299,7 @@ void qq_process_recv_group_im(guint8 *data, guint8 **cursor, gint data_len, guint32 internal_group_id, GaimConnection *gc, guint16 im_type) { - gchar *msg_with_gaim_smiley, *msg_utf8_encoded, *im_src_name; + gchar *msg_with_gaim_smiley, *msg_utf8_encoded, *im_src_name, *hex_dump; guint16 unknown; guint32 unknown4; GaimConversation *conv; @@ -312,8 +312,8 @@ g_return_if_fail(data != NULL && data_len > 0); qd = (qq_data *) gc->proto_data; - gaim_debug(GAIM_DEBUG_INFO, "QQ", - "group im hex dump\n%s\n", hex_dump_to_str(*cursor, data_len - (*cursor - data))); + hex_dump = hex_dump_to_str(*cursor, data_len - (*cursor - data)); + gaim_debug(GAIM_DEBUG_INFO, "QQ", "group im hex dump\n%s\n", hex_dump); if (*cursor >= (data + data_len - 1)) { gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Received group im_group is empty\n"); @@ -399,6 +399,7 @@ (conv)), im_src_name, 0, msg_utf8_encoded, im_group->send_time); g_free(im_src_name); } + g_free(hex_dump); g_free(msg_with_gaim_smiley); g_free(msg_utf8_encoded); g_free(im_group->msg); Modified: trunk/libgaim/protocols/qq/group_network.c =================================================================== --- trunk/libgaim/protocols/qq/group_network.c 2006-09-29 20:49:33 UTC (rev 17401) +++ trunk/libgaim/protocols/qq/group_network.c 2006-09-30 00:14:00 UTC (rev 17402) @@ -94,8 +94,12 @@ /* default process, dump only */ static void _qq_process_group_cmd_reply_default(guint8 *data, guint8 **cursor, gint len, GaimConnection *gc) { + gchar *hex_dump; g_return_if_fail(data != NULL && len > 0); - gaim_debug(GAIM_DEBUG_INFO, "QQ", "Dump unprocessed group cmd reply:\n%s", hex_dump_to_str(data, len)); + + hex_dump = hex_dump_to_str(data, len); + gaim_debug(GAIM_DEBUG_INFO, "QQ", "Dump unprocessed group cmd reply:\n%s", hex_dump); + g_free(hex_dump); } /* The lower layer command of send group cmd */ Modified: trunk/libgaim/protocols/qq/im.c =================================================================== --- trunk/libgaim/protocols/qq/im.c 2006-09-29 20:49:33 UTC (rev 17401) +++ trunk/libgaim/protocols/qq/im.c 2006-09-30 00:14:00 UTC (rev 17402) @@ -327,6 +327,7 @@ gint bytes; qq_recv_normal_im_common *common; qq_recv_normal_im_unprocessed *im_unprocessed; + gchar *hex_dump; g_return_if_fail (data != NULL && len != 0); @@ -384,10 +385,9 @@ gaim_debug (GAIM_DEBUG_WARNING, "QQ", "Normal IM, unprocessed type [0x%04x]\n", common->normal_im_type); - gaim_debug (GAIM_DEBUG_WARNING, "QQ", - "Dump unknown part.\n%s", - hex_dump_to_str (im_unprocessed->unknown, - im_unprocessed->length)); + hex_dump = hex_dump_to_str(im_unprocessed->unknown, im_unprocessed->length); + gaim_debug (GAIM_DEBUG_WARNING, "QQ", "Dump unknown part.\n%s", hex_dump); + g_free(hex_dump); g_free (common->session_md5); return; } Modified: trunk/libgaim/protocols/qq/login_logout.c =================================================================== --- trunk/libgaim/protocols/qq/login_logout.c 2006-09-29 20:49:33 UTC (rev 17401) +++ trunk/libgaim/protocols/qq/login_logout.c 2006-09-30 00:14:00 UTC (rev 17402) @@ -377,6 +377,7 @@ void qq_process_request_login_token_reply(guint8 *buf, gint buf_len, GaimConnection *gc) { qq_data *qd; + gchar *hex_dump; g_return_if_fail(buf != NULL && buf_len != 0); @@ -389,17 +390,20 @@ gaim_debug(GAIM_DEBUG_INFO, "QQ", "Attempting to proceed with the actual packet length.\n"); } + hex_dump = hex_dump_to_str(buf+2, buf_len-2); gaim_debug(GAIM_DEBUG_INFO, "QQ", - "<<< got a token with %d bytes -> [default] decrypt and dump\n%s",buf_len-2, hex_dump_to_str(buf+2, buf_len-2)); + "<<< got a token with %d bytes -> [default] decrypt and dump\n%s", buf_len-2, hex_dump); qq_send_packet_login(gc, buf_len-2, buf+2); } else { gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Unknown request login token reply code : %d\n", buf[0]); + hex_dump = hex_dump_to_str(buf, buf_len); gaim_debug(GAIM_DEBUG_WARNING, "QQ", ">>> %d bytes -> [default] decrypt and dump\n%s", - buf_len, hex_dump_to_str(buf, buf_len)); + buf_len, hex_dump); try_dump_as_gbk(buf, buf_len); gaim_connection_error(gc, _("Request login token error!")); } + g_free(hex_dump); } /* send logout packets to QQ server */ @@ -421,6 +425,7 @@ gint len, ret, bytes; guint8 *data; qq_data *qd; + gchar *hex_dump; g_return_if_fail(buf != NULL && buf_len != 0); @@ -453,9 +458,11 @@ break; default: gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Unknown reply code: %d\n", data[0]); + hex_dump = hex_dump_to_str(data, len); gaim_debug(GAIM_DEBUG_WARNING, "QQ", ">>> %d bytes -> [default] decrypt and dump\n%s", - buf_len, hex_dump_to_str(data, len)); + buf_len, hex_dump); + g_free(hex_dump); try_dump_as_gbk(data, len); ret = QQ_LOGIN_REPLY_MISC_ERROR; Modified: trunk/libgaim/protocols/qq/recv_core.c =================================================================== --- trunk/libgaim/protocols/qq/recv_core.c 2006-09-29 20:49:33 UTC (rev 17401) +++ trunk/libgaim/protocols/qq/recv_core.c 2006-09-30 00:14:00 UTC (rev 17402) @@ -90,9 +90,11 @@ _qq_show_packet("Processing unknown packet", buf, len); if (qq_crypt(DECRYPT, buf, buf_len, qd->session_key, data, &len)) { + gchar *hex_dump = hex_dump_to_str(data, len); gaim_debug(GAIM_DEBUG_WARNING, "QQ", ">>> [%d] %s, %d bytes -> [default] decrypt and dump\n%s", - seq, qq_get_cmd_desc(cmd), buf_len, hex_dump_to_str(data, len)); + seq, qq_get_cmd_desc(cmd), buf_len, hex_dump); + g_free(hex_dump); try_dump_as_gbk(data, len); } else { gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Fail decrypt packet with default process\n"); @@ -115,8 +117,10 @@ bytes_expected = qd->use_tcp ? QQ_TCP_HEADER_LENGTH : QQ_UDP_HEADER_LENGTH; if (buf_len < bytes_expected) { + gchar *hex_dump = hex_dump_to_str(buf, buf_len); gaim_debug(GAIM_DEBUG_ERROR, - "QQ", "Received packet is too short, dump and drop\n%s", hex_dump_to_str(buf, buf_len)); + "QQ", "Received packet is too short, dump and drop\n%s", hex_dump); + g_free(hex_dump); return; } /* initialize */ @@ -149,8 +153,10 @@ } if ((buf[buf_len - 1] != QQ_PACKET_TAIL) || (header.header_tag != QQ_PACKET_TAG)) { + gchar *hex_dump = hex_dump_to_str(buf, buf_len); gaim_debug(GAIM_DEBUG_ERROR, - "QQ", "Unknown QQ proctocol, dump and drop\n%s", hex_dump_to_str(buf, buf_len)); + "QQ", "Unknown QQ proctocol, dump and drop\n%s", hex_dump); + g_free(hex_dump); return; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-10-23 20:22:10
|
Revision: 17569 http://svn.sourceforge.net/gaim/?rev=17569&view=rev Author: markhuetsch Date: 2006-10-23 13:21:54 -0700 (Mon, 23 Oct 2006) Log Message: ----------- Let qq compile on Solaris. Patch thanks to Torrey McMahon (tmcmahon2) and Taso N. Devetzis (devetzis). Modified Paths: -------------- trunk/libgaim/protocols/qq/file_trans.c trunk/libgaim/protocols/qq/send_file.c trunk/libgaim/protocols/qq/send_file.h Modified: trunk/libgaim/protocols/qq/file_trans.c =================================================================== --- trunk/libgaim/protocols/qq/file_trans.c 2006-10-23 19:43:45 UTC (rev 17568) +++ trunk/libgaim/protocols/qq/file_trans.c 2006-10-23 20:21:54 UTC (rev 17569) @@ -218,8 +218,8 @@ static int _qq_xfer_open_file(const gchar *filename, const gchar *method, GaimXfer *xfer) { ft_info *info = xfer->data; - info->dest_fp = fopen(gaim_xfer_get_local_filename(xfer), method); - if (info->dest_fp == NULL) { + info->u.dest_fp = fopen(gaim_xfer_get_local_filename(xfer), method); + if (info->u.dest_fp == NULL) { return -1; } return 0; @@ -229,22 +229,22 @@ { ft_info *info = xfer->data; - fseek(info->dest_fp, index * len, SEEK_SET); - return fread(buffer, 1, len, info->dest_fp); + fseek(info->u.dest_fp, index * len, SEEK_SET); + return fread(buffer, 1, len, info->u.dest_fp); } static gint _qq_xfer_write_file(guint8 *buffer, guint index, guint len, GaimXfer *xfer) { ft_info *info = xfer->data; - fseek(info->dest_fp, index * len, SEEK_SET); - return fwrite(buffer, 1, len, info->dest_fp); + fseek(info->u.dest_fp, index * len, SEEK_SET); + return fwrite(buffer, 1, len, info->u.dest_fp); } void qq_xfer_close_file(GaimXfer *xfer) { ft_info *info = xfer->data; - if (info->dest_fp) fclose(info->dest_fp); + if (info->u.dest_fp) fclose(info->u.dest_fp); } #endif Modified: trunk/libgaim/protocols/qq/send_file.c =================================================================== --- trunk/libgaim/protocols/qq/send_file.c 2006-10-23 19:43:45 UTC (rev 17568) +++ trunk/libgaim/protocols/qq/send_file.c 2006-10-23 20:21:54 UTC (rev 17569) @@ -204,8 +204,8 @@ info = (ft_info *) xfer->data; qq_xfer_close_file(xfer); - if (info->dest_fp != NULL) { - fclose(info->dest_fp); + if (info->u.dest_fp != NULL) { + fclose(info->u.dest_fp); gaim_debug(GAIM_DEBUG_INFO, "QQ", "file closed\n"); } if (info->major_fd != 0) { Modified: trunk/libgaim/protocols/qq/send_file.h =================================================================== --- trunk/libgaim/protocols/qq/send_file.h 2006-10-23 19:43:45 UTC (rev 17568) +++ trunk/libgaim/protocols/qq/send_file.h 2006-10-23 20:21:54 UTC (rev 17569) @@ -40,7 +40,7 @@ union { FILE *dest_fp; guint8 *buffer; - }; + } u; gboolean use_major; } ft_info; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-11-05 00:12:18
|
Revision: 17668 http://svn.sourceforge.net/gaim/?rev=17668&view=rev Author: markhuetsch Date: 2006-11-04 16:11:52 -0800 (Sat, 04 Nov 2006) Log Message: ----------- Eliminate this union, as suggested by elb and nosnilmot. Modified Paths: -------------- trunk/libgaim/protocols/qq/file_trans.c trunk/libgaim/protocols/qq/send_file.c trunk/libgaim/protocols/qq/send_file.h Modified: trunk/libgaim/protocols/qq/file_trans.c =================================================================== --- trunk/libgaim/protocols/qq/file_trans.c 2006-11-04 22:00:22 UTC (rev 17667) +++ trunk/libgaim/protocols/qq/file_trans.c 2006-11-05 00:11:52 UTC (rev 17668) @@ -218,8 +218,8 @@ static int _qq_xfer_open_file(const gchar *filename, const gchar *method, GaimXfer *xfer) { ft_info *info = xfer->data; - info->u.dest_fp = fopen(gaim_xfer_get_local_filename(xfer), method); - if (info->u.dest_fp == NULL) { + info->dest_fp = fopen(gaim_xfer_get_local_filename(xfer), method); + if (info->dest_fp == NULL) { return -1; } return 0; @@ -229,22 +229,22 @@ { ft_info *info = xfer->data; - fseek(info->u.dest_fp, index * len, SEEK_SET); - return fread(buffer, 1, len, info->u.dest_fp); + fseek(info->dest_fp, index * len, SEEK_SET); + return fread(buffer, 1, len, info->dest_fp); } static gint _qq_xfer_write_file(guint8 *buffer, guint index, guint len, GaimXfer *xfer) { ft_info *info = xfer->data; - fseek(info->u.dest_fp, index * len, SEEK_SET); - return fwrite(buffer, 1, len, info->u.dest_fp); + fseek(info->dest_fp, index * len, SEEK_SET); + return fwrite(buffer, 1, len, info->dest_fp); } void qq_xfer_close_file(GaimXfer *xfer) { ft_info *info = xfer->data; - if (info->u.dest_fp) fclose(info->u.dest_fp); + if (info->dest_fp) fclose(info->dest_fp); } #endif Modified: trunk/libgaim/protocols/qq/send_file.c =================================================================== --- trunk/libgaim/protocols/qq/send_file.c 2006-11-04 22:00:22 UTC (rev 17667) +++ trunk/libgaim/protocols/qq/send_file.c 2006-11-05 00:11:52 UTC (rev 17668) @@ -204,8 +204,8 @@ info = (ft_info *) xfer->data; qq_xfer_close_file(xfer); - if (info->u.dest_fp != NULL) { - fclose(info->u.dest_fp); + if (info->dest_fp != NULL) { + fclose(info->dest_fp); gaim_debug(GAIM_DEBUG_INFO, "QQ", "file closed\n"); } if (info->major_fd != 0) { @@ -217,8 +217,8 @@ gaim_debug(GAIM_DEBUG_INFO, "QQ", "minor port closed\n"); } /* - if (info->u.buffer != NULL) { - munmap(info->u.buffer, gaim_xfer_get_size(xfer)); + if (info->buffer != NULL) { + munmap(info->buffer, gaim_xfer_get_size(xfer)); gaim_debug(GAIM_DEBUG_INFO, "QQ", "file mapping buffer is freed.\n"); } */ Modified: trunk/libgaim/protocols/qq/send_file.h =================================================================== --- trunk/libgaim/protocols/qq/send_file.h 2006-11-04 22:00:22 UTC (rev 17667) +++ trunk/libgaim/protocols/qq/send_file.h 2006-11-05 00:11:52 UTC (rev 17668) @@ -37,10 +37,8 @@ int minor_fd; int sender_fd; int recv_fd; - union { - FILE *dest_fp; - guint8 *buffer; - } u; + FILE *dest_fp; + /* guint8 *buffer; */ gboolean use_major; } ft_info; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dat...@us...> - 2006-11-30 17:45:50
|
Revision: 17859 http://svn.sourceforge.net/gaim/?rev=17859&view=rev Author: datallah Date: 2006-11-30 09:45:28 -0800 (Thu, 30 Nov 2006) Log Message: ----------- Fix win32 build for buddy icon changes. Also a couple leak fixes. There really isn't that much actually changed, but also I did some whitespace cleanup at the same time. Modified Paths: -------------- trunk/libgaim/protocols/qq/buddy_info.c trunk/libgaim/protocols/qq/qq.c trunk/libgaim/protocols/qq/qq.h trunk/libgaim/protocols/qq/utils.c Modified: trunk/libgaim/protocols/qq/buddy_info.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_info.c 2006-11-30 16:50:14 UTC (rev 17858) +++ trunk/libgaim/protocols/qq/buddy_info.c 2006-11-30 17:45:28 UTC (rev 17859) @@ -29,7 +29,7 @@ #include "utils.h" #include "packet_parse.h" -#include "buddy_info.h" +#include "buddy_info.h" #include "char_conv.h" #include "crypt.h" #include "header_info.h" @@ -89,16 +89,16 @@ /* There is no user id stored in the reply packet for information query * we have to manually store the query, so that we know the query source */ typedef struct _qq_info_query { - guint32 uid; - gboolean show_window; - gboolean modify_info; + guint32 uid; + gboolean show_window; + gboolean modify_info; } qq_info_query; /* We get an info packet on ourselves before we modify our information. * Even though not all of the information is modifiable, it still * all needs to be there when we send out the modify info packet */ typedef struct _modify_info_data { - GaimConnection *gc; + GaimConnection *gc; contact_info *info; } modify_info_data; @@ -110,7 +110,7 @@ len = strlen(value); if (len > 3 || len == 0) return -1; for (i = 0; i < len; i++) { - if (!g_ascii_isdigit(value[i])) + if (!g_ascii_isdigit(value[i])) return -1; } i = strtol(value, NULL, 10); @@ -153,11 +153,11 @@ } } -static void append_field_value(GString *info_text, const gchar *field, +static void append_field_value(GString *info_text, const gchar *field, const gchar *title, const gchar **choice, gint choice_size) { gchar *value = field_value(field, choice, choice_size); - + if (value != NULL) { g_string_append_printf(info_text, "<br /><b>%s:</b> %s", title, value); g_free(value); @@ -263,7 +263,7 @@ /* traverse backwards so we get the most recent info_query */ for (ql = g_list_last(qd->info_query); ql != NULL; ql = g_list_previous(ql)) { query = ql->data; - if (query->uid == qd->uid) + if (query->uid == qd->uid) query->modify_info = TRUE; } } @@ -314,9 +314,9 @@ value = g_strdup_printf("%d", gaim_request_field_choice_get_value(field)); } else { value = (gchar *) gaim_request_field_string_get_value(field); - if (value == NULL) + if (value == NULL) value = g_strdup("-"); - else + else value = utf8_to_qq(value, QQ_CHARSET_DEFAULT); } *list = g_list_remove_link(*list, *list); @@ -382,25 +382,25 @@ return group; } -static void add_string_field_to_group(GaimRequestFieldGroup *group, +static void add_string_field_to_group(GaimRequestFieldGroup *group, const gchar *id, const gchar *title, const gchar *value) { GaimRequestField *field; gchar *utf8_value; - + utf8_value = qq_to_utf8(value, QQ_CHARSET_DEFAULT); field = gaim_request_field_string_new(id, title, utf8_value, FALSE); gaim_request_field_group_add_field(group, field); g_free(utf8_value); } -static void add_choice_field_to_group(GaimRequestFieldGroup *group, - const gchar *id, const gchar *title, const gchar *value, +static void add_choice_field_to_group(GaimRequestFieldGroup *group, + const gchar *id, const gchar *title, const gchar *value, const gchar **choice, gint choice_size) { GaimRequestField *field; gint i, index; - + index = choice_index(value, choice, choice_size); field = gaim_request_field_choice_new(id, title, index); for (i = 0; i < choice_size; i++) @@ -475,7 +475,7 @@ mid->info->is_open_contact = g_strdup(info->is_open_contact); mid->info->qq_show = g_strdup(info->qq_show); mid->info->unknown6 = g_strdup(info->unknown6); - + gaim_request_fields(gc, _("Modify my information"), _("Modify my information"), NULL, fields, _("Update my information"), G_CALLBACK(modify_info_ok_cb), @@ -515,14 +515,14 @@ qq_data *qd = (qq_data *) gc->proto_data; gint offset; - if(gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_INVISIBLE)) { + if(gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_INVISIBLE)) { offset = 2; - } else if(gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_AWAY) - || gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_EXTENDED_AWAY)) { + } else if(gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_AWAY) + || gaim_presence_is_status_primitive_active(presence, GAIM_STATUS_EXTENDED_AWAY)) { offset = 1; - } else { + } else { offset = 0; - } + } qd->my_icon = 3 * (face_num - 1) + offset; qd->modifying_face = TRUE; @@ -531,58 +531,61 @@ void qq_set_buddy_icon_for_user(GaimAccount *account, const gchar *who, const gchar *iconfile) { - FILE *file; - struct stat st; + FILE *file; + struct stat st; - g_return_if_fail(g_stat(iconfile, &st) == 0); - file = g_fopen(iconfile, "rb"); - if (file) { + g_return_if_fail(g_stat(iconfile, &st) == 0); + file = g_fopen(iconfile, "rb"); + if (file) { GaimBuddyIcon *icon; - size_t data_len; - gchar *data = g_new(gchar, st.st_size + 1); - data_len = fread(data, 1, st.st_size, file); - fclose(file); - gaim_buddy_icons_set_for_user(account, who, data, data_len); + size_t data_len; + gchar *data = g_new(gchar, st.st_size + 1); + data_len = fread(data, 1, st.st_size, file); + fclose(file); + gaim_buddy_icons_set_for_user(account, who, data, data_len); icon = gaim_buddy_icons_find(account, who); gaim_buddy_icon_set_path(icon, iconfile); - } + } } /* TODO: figure out how/when we can use a custom face * for now, only allow the stock icons */ void qq_set_my_buddy_icon(GaimConnection *gc, const gchar *iconfile) { - gchar *icon; - gint icon_num; - GaimAccount *account = gaim_connection_get_account(gc); - const gchar *icon_path = gaim_account_get_buddy_icon_path(account); - gint prefix_len = strlen(QQ_ICON_PREFIX); - gint suffix_len = strlen(QQ_ICON_SUFFIX); - gint dir_len = strlen(QQBUDDYICONDIR); - gint icon_len = strlen(icon_path) - dir_len - 1 - prefix_len - suffix_len; - gchar *errmsg = g_strconcat(_("You are attempting to set a custom face. Gaim currently only allows the standard faces. Please choose an image from "), QQBUDDYICONDIR, ".", NULL); + gchar *icon; + gint icon_num; + GaimAccount *account = gaim_connection_get_account(gc); + const gchar *icon_path = gaim_account_get_buddy_icon_path(account); + gint prefix_len = strlen(QQ_ICON_PREFIX); + gint suffix_len = strlen(QQ_ICON_SUFFIX); + gint dir_len = strlen(QQBUDDYICONDIR); + gint icon_len = strlen(icon_path) - dir_len - 1 - prefix_len - suffix_len; + gchar *errmsg = g_strconcat(_("You are attempting to set a custom face. Gaim currently only allows the standard faces. Please choose an image from "), QQBUDDYICONDIR, ".", NULL); - /* make sure we're using an appropriate icon */ - if (!(g_ascii_strncasecmp(icon_path, QQBUDDYICONDIR, dir_len) == 0 - && icon_path[dir_len] == G_DIR_SEPARATOR - && g_ascii_strncasecmp(icon_path + dir_len + 1, QQ_ICON_PREFIX, prefix_len) == 0 - && g_ascii_strncasecmp(icon_path + dir_len + 1 + prefix_len + icon_len, QQ_ICON_SUFFIX, suffix_len) == 0 - && icon_len <= 3)) { - gaim_notify_error(gc, _("Invalid QQ Facea"), errmsg, NULL); - return; - } - /* strip everything but number */ - icon = g_strndup(icon_path + dir_len + 1 + prefix_len, icon_len); - icon_num = strtol(icon, NULL, 10); - g_free(icon); - /* ensure face number in proper range */ - if (icon_num > QQ_FACES) { - gaim_notify_error(gc, _("Invalid QQ Face"), errmsg, NULL); - return; - } - /* tell server my icon changed */ - _qq_send_packet_modify_face(gc, icon_num); - /* display in blist */ + /* make sure we're using an appropriate icon */ + if (!(g_ascii_strncasecmp(icon_path, QQBUDDYICONDIR, dir_len) == 0 + && icon_path[dir_len] == G_DIR_SEPARATOR + && g_ascii_strncasecmp(icon_path + dir_len + 1, QQ_ICON_PREFIX, prefix_len) == 0 + && g_ascii_strncasecmp(icon_path + dir_len + 1 + prefix_len + icon_len, QQ_ICON_SUFFIX, suffix_len) == 0 + && icon_len <= 3)) { + gaim_notify_error(gc, _("Invalid QQ Facea"), errmsg, NULL); + g_free(errmsg); + return; + } + /* strip everything but number */ + icon = g_strndup(icon_path + dir_len + 1 + prefix_len, icon_len); + icon_num = strtol(icon, NULL, 10); + g_free(icon); + /* ensure face number in proper range */ + if (icon_num > QQ_FACES) { + gaim_notify_error(gc, _("Invalid QQ Face"), errmsg, NULL); + g_free(errmsg); + return; + } + g_free(errmsg); + /* tell server my icon changed */ + _qq_send_packet_modify_face(gc, icon_num); + /* display in blist */ qq_set_buddy_icon_for_user(account, account->username, icon_path); } @@ -695,3 +698,14 @@ } gaim_debug(GAIM_DEBUG_INFO, "QQ", "%d info queries are freed!\n", i); } + +#ifdef _WIN32 +const char *qq_win32_buddy_icon_dir(void) +{ + static char *dir = NULL; + if (dir == NULL) + dir = g_build_filename(wgaim_install_dir(), "pixmaps", + "gaim", "buddy_icons", "qq", NULL); + return dir; +} +#endif Modified: trunk/libgaim/protocols/qq/qq.c =================================================================== --- trunk/libgaim/protocols/qq/qq.c 2006-11-30 16:50:14 UTC (rev 17858) +++ trunk/libgaim/protocols/qq/qq.c 2006-11-30 17:45:28 UTC (rev 17859) @@ -95,7 +95,7 @@ const gchar *qq_server, *qq_port; qq_data *qd; GaimConnection *gc; - GaimPresence *presence; + GaimPresence *presence; gboolean use_tcp; g_return_if_fail(account != NULL); @@ -112,7 +112,7 @@ qq_server = gaim_account_get_string(account, "server", NULL); qq_port = gaim_account_get_string(account, "port", NULL); use_tcp = gaim_account_get_bool(account, "use_tcp", FALSE); - presence = gaim_account_get_presence(account); + presence = gaim_account_get_presence(account); qd->use_tcp = use_tcp; @@ -127,14 +127,14 @@ if (qq_server == NULL || strlen(qq_server) == 0) qq_server = use_tcp ? - tcp_server_list[random() % tcp_server_amount] : + tcp_server_list[random() % tcp_server_amount] : udp_server_list[random() % udp_server_amount]; if (qq_port == NULL || strtol(qq_port, NULL, 10) == 0) qq_port = use_tcp ? QQ_TCP_QUERY_PORT : QQ_UDP_PORT; gaim_connection_update_progress(gc, _("Connecting"), 0, QQ_CONNECT_STEPS); - + if (qq_connect(account, qq_server, strtol(qq_port, NULL, 10), use_tcp, FALSE) < 0) gaim_connection_error(gc, _("Unable to connect.")); } @@ -184,7 +184,7 @@ break; default: g_string_printf(status, "Unknown-%d", q_bud->status); - } + } return g_string_free(status, FALSE); } @@ -205,30 +205,30 @@ { ip_str = gen_ip_str(q_bud->ip); if (strlen(ip_str) != 0) { - g_string_append_printf(tooltip, "\n<b>%s Address:</b> %s:%d", + g_string_append_printf(tooltip, "\n<b>%s Address:</b> %s:%d", (q_bud->comm_flag & QQ_COMM_FLAG_TCP_MODE) ? "TCP" : "UDP", ip_str, q_bud->port); } g_free(ip_str); g_string_append_printf(tooltip, "\n<b>Age:</b> %d", q_bud->age); - switch (q_bud->gender) { - case QQ_BUDDY_GENDER_GG: - g_string_append(tooltip, "\n<b>Gender:</b> Male"); - break; - case QQ_BUDDY_GENDER_MM: - g_string_append(tooltip, "\n<b>Gender:</b> Female"); - break; - case QQ_BUDDY_GENDER_UNKNOWN: - g_string_append(tooltip, "\n<b>Gender:</b> Unknown"); - break; - default: - g_string_append_printf(tooltip, "\n<b>Gender:</b> ERROR(%d)", q_bud->gender); - } + switch (q_bud->gender) { + case QQ_BUDDY_GENDER_GG: + g_string_append(tooltip, "\n<b>Gender:</b> Male"); + break; + case QQ_BUDDY_GENDER_MM: + g_string_append(tooltip, "\n<b>Gender:</b> Female"); + break; + case QQ_BUDDY_GENDER_UNKNOWN: + g_string_append(tooltip, "\n<b>Gender:</b> Unknown"); + break; + default: + g_string_append_printf(tooltip, "\n<b>Gender:</b> ERROR(%d)", q_bud->gender); + } /* For debugging */ /* g_string_append_printf(tooltip, "\n<b>Flag:</b> %01x", q_bud->flag1); g_string_append_printf(tooltip, "\n<b>CommFlag:</b> %01x", q_bud->comm_flag); - g_string_append_printf(tooltip, "\n<b>Client:</b> %04x", q_bud->client_version); + g_string_append_printf(tooltip, "\n<b>Client:</b> %04x", q_bud->client_version); */ } } @@ -239,11 +239,11 @@ /* each char** are refering to a filename in pixmaps/gaim/status/default/ */ qq_buddy *q_bud = b->proto_data; - const char *emblems[4] = { NULL, NULL, NULL, NULL }; - int i = 1; + const char *emblems[4] = { NULL, NULL, NULL, NULL }; + int i = 1; - if (q_bud == NULL) { - emblems[0] = "offline"; + if (q_bud == NULL) { + emblems[0] = "offline"; } else { if (q_bud->status == QQ_BUDDY_ONLINE_AWAY) emblems[i++] = "away"; @@ -251,25 +251,25 @@ if (q_bud->comm_flag & QQ_COMM_FLAG_QQ_MEMBER) emblems[i++] = "qq_member"; */ - if (q_bud->comm_flag & QQ_COMM_FLAG_BIND_MOBILE) - emblems[i++] = "wireless"; + if (q_bud->comm_flag & QQ_COMM_FLAG_BIND_MOBILE) + emblems[i++] = "wireless"; /* if (q_bud->comm_flag & QQ_COMM_FLAG_VIDEO) emblems[i%4] = "video"; */ - } + } - *se = emblems[0]; - *sw = emblems[1]; - *nw = emblems[2]; - *ne = emblems[3]; + *se = emblems[0]; + *sw = emblems[1]; + *nw = emblems[2]; + *ne = emblems[3]; return; } /* QQ away status (used to initiate QQ away packet) */ -static GList *_qq_away_states(GaimAccount *ga) +static GList *_qq_away_states(GaimAccount *ga) { GaimStatusType *status; GList *types = NULL; @@ -278,17 +278,17 @@ "available", _("QQ: Available"), FALSE, TRUE, FALSE); types = g_list_append(types, status); - status = gaim_status_type_new_full(GAIM_STATUS_AWAY, + status = gaim_status_type_new_full(GAIM_STATUS_AWAY, "away", _("QQ: Away"), FALSE, TRUE, FALSE); - types = g_list_append(types, status); + types = g_list_append(types, status); - status = gaim_status_type_new_full(GAIM_STATUS_INVISIBLE, + status = gaim_status_type_new_full(GAIM_STATUS_INVISIBLE, "invisible", _("QQ: Invisible"), FALSE, TRUE, FALSE); - types = g_list_append(types, status); + types = g_list_append(types, status); status = gaim_status_type_new_full(GAIM_STATUS_OFFLINE, - "offline", _("QQ: Offline"), FALSE, TRUE, FALSE); - types = g_list_append(types, status); + "offline", _("QQ: Offline"), FALSE, TRUE, FALSE); + types = g_list_append(types, status); return types; } @@ -568,12 +568,12 @@ if(GAIM_BLIST_NODE_IS_CHAT(node)) return _qq_chat_menu(node); - + m = NULL; return m; } -/* TODO : not working, temp commented out by gfhuang +/* TODO : not working, temp commented out by gfhuang act = gaim_menu_action_new(_("Block this buddy"), GAIM_CALLBACK(_qq_menu_block_buddy), NULL, NULL); //add NULL by gfhuang m = g_list_append(m, act); @@ -604,7 +604,7 @@ group->my_status == QQ_GROUP_MEMBER_STATUS_IS_ADMIN) /* no need to get info time and time again, online members enough */ qq_send_cmd_group_get_online_members(gc, group); - + list = list->next; } @@ -678,7 +678,7 @@ NULL, /* alias_buddy */ NULL, /* group_buddy */ NULL, /* rename_group */ - NULL, /* buddy_free */ + NULL, /* buddy_free */ NULL, /* convo_closed */ NULL, /* normalize */ qq_set_my_buddy_icon, /* set_buddy_icon */ @@ -691,7 +691,7 @@ NULL, /* roomlist_expand_category */ NULL, /* can_receive_file */ qq_send_file, /* send_file */ - NULL, /* new xfer */ + NULL, /* new xfer */ NULL, /* offline_message */ NULL, /* GaimWhiteboardPrplOps */ NULL, /* send_raw */ Modified: trunk/libgaim/protocols/qq/qq.h =================================================================== --- trunk/libgaim/protocols/qq/qq.h 2006-11-30 16:50:14 UTC (rev 17858) +++ trunk/libgaim/protocols/qq/qq.h 2006-11-30 17:45:28 UTC (rev 17859) @@ -35,6 +35,11 @@ #define QQ_KEY_LENGTH 16 #define QQ_DEBUG 1 /* whether we are doing DEBUG */ +#ifdef _WIN32 +const char *qq_win32_buddy_icon_dir(void); +#define QQBUDDYICONDIR qq_win32_buddy_icon_dir() +#endif + typedef struct _qq_data qq_data; typedef struct _qq_buddy qq_buddy; Modified: trunk/libgaim/protocols/qq/utils.c =================================================================== --- trunk/libgaim/protocols/qq/utils.c 2006-11-30 16:50:14 UTC (rev 17858) +++ trunk/libgaim/protocols/qq/utils.c 2006-11-30 17:45:28 UTC (rev 17859) @@ -51,7 +51,7 @@ return array[index]; } -gchar *get_index_str_by_name(gchar **array, const gchar *name, gint amount) +gchar *get_index_str_by_name(gchar **array, const gchar *name, gint amount) { gint index; @@ -106,7 +106,7 @@ gaim_debug(GAIM_DEBUG_WARNING, "QQ", "field[%d] is %s\n", j, segments[j]); g_free(segments[j]); } - + segments[expected_fields] = NULL; } @@ -116,21 +116,21 @@ /* generate a md5 key using uid and session_key */ guint8 *_gen_session_md5(gint uid, guint8 *session_key) { - guint8 *src, md5_str[QQ_KEY_LENGTH]; - GaimCipher *cipher; - GaimCipherContext *context; + guint8 *src, md5_str[QQ_KEY_LENGTH]; + GaimCipher *cipher; + GaimCipherContext *context; - src = g_newa(guint8, 20); + src = g_newa(guint8, 20); memcpy(src, &uid, 4); memcpy(src, session_key, QQ_KEY_LENGTH); - cipher = gaim_ciphers_find_cipher("md5"); - context = gaim_cipher_context_new(cipher, NULL); - gaim_cipher_context_append(context, src, 20); - gaim_cipher_context_digest(context, sizeof(md5_str), md5_str, NULL); - gaim_cipher_context_destroy(context); + cipher = gaim_ciphers_find_cipher("md5"); + context = gaim_cipher_context_new(cipher, NULL); + gaim_cipher_context_append(context, src, 20); + gaim_cipher_context_digest(context, sizeof(md5_str), md5_str, NULL); + gaim_cipher_context_destroy(context); - return g_memdup(md5_str, QQ_KEY_LENGTH); + return g_memdup(md5_str, QQ_KEY_LENGTH); } /* given a four-byte ip data, convert it into a human readable ip string @@ -141,7 +141,7 @@ if (ip == NULL || ip[0] == 0) { ret = g_new(gchar, 1); *ret = '\0'; - return ret; + return ret; } else { return g_strdup_printf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); } @@ -168,7 +168,7 @@ ret = strtol(name, NULL, 10); if (errno == ERANGE) return 0; - else + else return ret; } @@ -182,7 +182,7 @@ /* convert name displayed in a chat channel to original QQ UID */ gchar *chat_name_to_gaim_name(const gchar *const name) { - const gchar *tmp; + const gchar *tmp; gchar *ret; g_return_val_if_fail(name != NULL, NULL); @@ -203,7 +203,7 @@ incoming = g_newa(guint8, len + 1); g_memmove(incoming, data, len); incoming[len] = 0x00; - /* GBK code: + /* GBK code: * Single-byte ASCII: 0x21-0x7E * GBK first byte range: 0x81-0xFE * GBK second byte range: 0x40-0x7E and 0x80-0xFE */ @@ -228,19 +228,19 @@ g_return_val_if_fail(buffer != NULL, NULL); - stripped = g_string_new(""); - for (i=0; i<strlen(buffer); i++) { + stripped = g_string_new(""); + for (i=0; i<strlen(buffer); i++) { cur = buffer[i]; if (cur != ' ' && cur != '\n') - g_string_append_c(stripped, buffer[i]); - } + g_string_append_c(stripped, buffer[i]); + } ret = stripped->str; g_string_free(stripped, FALSE); - return ret; + return ret; } -/* Attempts to dump an ASCII hex string to a string of bytes. +/* Attempts to dump an ASCII hex string to a string of bytes. * The return should be freed later. */ guint8 *hex_str_to_bytes(const gchar *const buffer, gint *out_len) { @@ -249,7 +249,7 @@ gint index; g_return_val_if_fail(buffer != NULL, NULL); - + hex_buffer = strstrip(buffer); if (strlen(hex_buffer) % 2 != 0) { @@ -292,7 +292,7 @@ return g_memdup(bytes, *out_len); } -/* Dumps a chunk of raw data into an ASCII hex string. +/* Dumps a chunk of raw data into an ASCII hex string. * The return should be freed later. */ gchar *hex_dump_to_str(const guint8 *const buffer, gint bytes) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-12-09 06:34:49
|
Revision: 17924 http://svn.sourceforge.net/gaim/?rev=17924&view=rev Author: markhuetsch Date: 2006-12-08 22:34:48 -0800 (Fri, 08 Dec 2006) Log Message: ----------- Added support for QQ levels Allow 3rd party clients to specify the location of the buddy icon dir Minor code cleanup Modified Paths: -------------- trunk/libgaim/protocols/qq/Makefile.am trunk/libgaim/protocols/qq/buddy_info.c trunk/libgaim/protocols/qq/buddy_info.h trunk/libgaim/protocols/qq/buddy_list.c trunk/libgaim/protocols/qq/buddy_status.c trunk/libgaim/protocols/qq/header_info.c trunk/libgaim/protocols/qq/header_info.h trunk/libgaim/protocols/qq/keep_alive.c trunk/libgaim/protocols/qq/qq.c trunk/libgaim/protocols/qq/qq.h trunk/libgaim/protocols/qq/recv_core.c trunk/libgaim/protocols/qq/send_core.h trunk/libgaim/protocols/qq/utils.c trunk/libgaim/protocols/qq/utils.h Modified: trunk/libgaim/protocols/qq/Makefile.am =================================================================== --- trunk/libgaim/protocols/qq/Makefile.am 2006-12-08 03:03:52 UTC (rev 17923) +++ trunk/libgaim/protocols/qq/Makefile.am 2006-12-09 06:34:48 UTC (rev 17924) @@ -94,7 +94,7 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/libgaim \ -DVERSION=\"$(VERSION)\" \ - -DQQBUDDYICONDIR=\"$(datadir)/pixmaps/gaim/buddy_icons/qq\" \ + -DQQ_BUDDY_ICON_DIR=\"$(datadir)/pixmaps/gaim/buddy_icons/qq\" \ $(DEBUG_CFLAGS) \ $(GLIB_CFLAGS) \ $(GAIM_CFLAGS) Modified: trunk/libgaim/protocols/qq/buddy_info.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_info.c 2006-12-08 03:03:52 UTC (rev 17923) +++ trunk/libgaim/protocols/qq/buddy_info.c 2006-12-09 06:34:48 UTC (rev 17924) @@ -548,27 +548,27 @@ } } -/* TODO: figure out how/when we can use a custom face - * for now, only allow the stock icons */ +/* TODO: custom faces */ void qq_set_my_buddy_icon(GaimConnection *gc, const gchar *iconfile) { gchar *icon; gint icon_num; GaimAccount *account = gaim_connection_get_account(gc); const gchar *icon_path = gaim_account_get_buddy_icon_path(account); + const gchar *buddy_icon_dir = qq_buddy_icon_dir(); gint prefix_len = strlen(QQ_ICON_PREFIX); gint suffix_len = strlen(QQ_ICON_SUFFIX); - gint dir_len = strlen(QQBUDDYICONDIR); + gint dir_len = strlen(buddy_icon_dir); gint icon_len = strlen(icon_path) - dir_len - 1 - prefix_len - suffix_len; - gchar *errmsg = g_strconcat(_("You are attempting to set a custom face. Gaim currently only allows the standard faces. Please choose an image from "), QQBUDDYICONDIR, ".", NULL); + gchar *errmsg = g_strconcat(_("You are attempting to set a custom face. Gaim currently only allows the standard faces. Please choose an image from "), buddy_icon_dir, ".", NULL); /* make sure we're using an appropriate icon */ - if (!(g_ascii_strncasecmp(icon_path, QQBUDDYICONDIR, dir_len) == 0 + if (!(g_ascii_strncasecmp(icon_path, buddy_icon_dir, dir_len) == 0 && icon_path[dir_len] == G_DIR_SEPARATOR && g_ascii_strncasecmp(icon_path + dir_len + 1, QQ_ICON_PREFIX, prefix_len) == 0 && g_ascii_strncasecmp(icon_path + dir_len + 1 + prefix_len + icon_len, QQ_ICON_SUFFIX, suffix_len) == 0 && icon_len <= 3)) { - gaim_notify_error(gc, _("Invalid QQ Facea"), errmsg, NULL); + gaim_notify_error(gc, _("Invalid QQ Face"), errmsg, NULL); g_free(errmsg); return; } @@ -589,6 +589,24 @@ qq_set_buddy_icon_for_user(account, account->username, icon_path); } + +static void _qq_update_buddy_icon(GaimAccount *account, const gchar *name, gint face) +{ + gchar *icon_path; + GaimBuddyIcon *icon = gaim_buddy_icons_find(account, name); + gchar *icon_num_str = face_to_icon_str(face); + const gchar *old_path = gaim_buddy_icon_get_path(icon); + const gchar *buddy_icon_dir = qq_buddy_icon_dir(); + + icon_path = g_strconcat(buddy_icon_dir, G_DIR_SEPARATOR_S, QQ_ICON_PREFIX, + icon_num_str, QQ_ICON_SUFFIX, NULL); + if (icon == NULL || old_path == NULL + || g_ascii_strcasecmp(icon_path, old_path) != 0) + qq_set_buddy_icon_for_user(account, name, icon_path); + g_free(icon_num_str); + g_free(icon_path); +} + /* after getting info or modify myself, refresh the buddy list accordingly */ void qq_refresh_buddy_and_myself(contact_info *info, GaimConnection *gc) { @@ -617,6 +635,7 @@ if (alias_utf8 != NULL) q_bud->nickname = g_strdup(alias_utf8); qq_update_buddy_contact(gc, q_bud); + _qq_update_buddy_icon(gc->account, gaim_name, q_bud->face); } g_free(gaim_name); g_free(alias_utf8); @@ -699,13 +718,98 @@ gaim_debug(GAIM_DEBUG_INFO, "QQ", "%d info queries are freed!\n", i); } -#ifdef _WIN32 -const char *qq_win32_buddy_icon_dir(void) +void qq_send_packet_get_level(GaimConnection *gc, guint32 uid) { - static char *dir = NULL; - if (dir == NULL) - dir = g_build_filename(wgaim_install_dir(), "pixmaps", - "gaim", "buddy_icons", "qq", NULL); - return dir; + guint8 buf[5]; + guint32 tmp = g_htonl(uid); + buf[0] = 0; + memcpy(buf+1, &tmp, 4); + qq_send_cmd(gc, QQ_CMD_GET_LEVEL, TRUE, 0, TRUE, buf, 5); } -#endif + +void qq_send_packet_get_buddies_levels(GaimConnection *gc) +{ + guint8 *buf, *tmp, size; + qq_buddy *q_bud; + GList *node; + qq_data *qd = (qq_data *) gc->proto_data; + + /* server only sends back levels for online buddies, no point + * in asking for anyone else */ + size = 4*g_list_length(qd->buddies) + 1; + buf = g_new0(guint8, size); + tmp = buf + 1; + + for (node = qd->buddies; node != NULL; node = node->next) { + guint32 tmp4; + q_bud = (qq_buddy *) node->data; + if (q_bud != NULL) { + tmp4 = g_htonl(q_bud->uid); + memcpy(tmp, &tmp4, 4); + tmp += 4; + } + } + qq_send_cmd(gc, QQ_CMD_GET_LEVEL, TRUE, 0, TRUE, buf, size); + qd->last_get_levels = time(NULL); + g_free(buf); +} + +void qq_process_get_level_reply(guint8 *buf, gint buf_len, GaimConnection *gc) +{ + guint32 uid, onlineTime; + guint16 level, timeRemainder; + gchar *gaim_name; + GaimBuddy *b; + qq_buddy *q_bud; + gint decr_len, i; + guint8 *decr_buf, *tmp; + GaimAccount *account = gaim_connection_get_account(gc); + qq_data *qd = (qq_data *) gc->proto_data; + + decr_len = buf_len; + decr_buf = g_new0(guint8, buf_len); + if (!qq_crypt(DECRYPT, buf, buf_len, qd->session_key, decr_buf, &decr_len)) { + gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Couldn't decrypt get level packet\n"); + } + + decr_len--; + if (decr_len % 12 != 0) { + gaim_debug(GAIM_DEBUG_ERROR, "QQ", + "Get levels list of abnormal length. Truncating last %d bytes.\n", decr_len % 12); + decr_len -= (decr_len % 12); + } + + tmp = decr_buf + 1; + /* this byte seems random */ + /* + gaim_debug(GAIM_DEBUG_INFO, "QQ", "Byte one of get_level packet: %d\n", buf[0]); + */ + for (i = 0; i < decr_len; i += 12) { + uid = g_ntohl(*(guint32 *) tmp); + tmp += 4; + onlineTime = g_ntohl(*(guint32 *) tmp); + tmp += 4; + level = g_ntohs(*(guint16 *) tmp); + tmp += 2; + timeRemainder = g_ntohs(*(guint16 *) tmp); + tmp += 2; + /* + gaim_debug(GAIM_DEBUG_INFO, "QQ", "Level packet entry:\nuid: %d\nonlineTime: %d\nlevel: %d\ntimeRemainder: %d\n", + uid, onlineTime, level, timeRemainder); + */ + gaim_name = uid_to_gaim_name(uid); + b = gaim_find_buddy(account, gaim_name); + q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data; + + if (q_bud != NULL) { + q_bud->onlineTime = onlineTime; + q_bud->level = level; + q_bud->timeRemainder = timeRemainder; + } else { + gaim_debug(GAIM_DEBUG_ERROR, "QQ", + "Got an online buddy %d, but not in my buddy list\n", uid); + } + g_free(gaim_name); + } + g_free(decr_buf); +} Modified: trunk/libgaim/protocols/qq/buddy_info.h =================================================================== --- trunk/libgaim/protocols/qq/buddy_info.h 2006-12-08 03:03:52 UTC (rev 17923) +++ trunk/libgaim/protocols/qq/buddy_info.h 2006-12-09 06:34:48 UTC (rev 17924) @@ -92,5 +92,8 @@ void qq_process_modify_info_reply(guint8 *buf, gint buf_len, GaimConnection *gc); void qq_process_get_info_reply(guint8 *buf, gint buf_len, GaimConnection *gc); void qq_info_query_free(qq_data *qd); +void qq_send_packet_get_level(GaimConnection *gc, guint32 uid); +void qq_send_packet_get_buddies_levels(GaimConnection *gc); +void qq_process_get_level_reply(guint8 *buf, gint buf_len, GaimConnection *gc); #endif Modified: trunk/libgaim/protocols/qq/buddy_list.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_list.c 2006-12-08 03:03:52 UTC (rev 17923) +++ trunk/libgaim/protocols/qq/buddy_list.c 2006-12-09 06:34:48 UTC (rev 17924) @@ -28,6 +28,7 @@ #include "notify.h" #include "utils.h" #include "packet_parse.h" +#include "buddy_info.h" #include "buddy_list.h" #include "buddy_status.h" #include "buddy_opt.h" @@ -235,6 +236,7 @@ qq_send_packet_get_buddies_online(gc, position); } else { + qq_send_packet_get_buddies_levels(gc); qq_refresh_all_buddy_status(gc); } Modified: trunk/libgaim/protocols/qq/buddy_status.c =================================================================== --- trunk/libgaim/protocols/qq/buddy_status.c 2006-12-08 03:03:52 UTC (rev 17923) +++ trunk/libgaim/protocols/qq/buddy_status.c 2006-12-09 06:34:48 UTC (rev 17924) @@ -26,6 +26,7 @@ #include "debug.h" #include "prefs.h" +#include "buddy_info.h" #include "buddy_status.h" #include "crypt.h" #include "header_info.h" @@ -261,6 +262,8 @@ q_bud->status = s->status; if(0 != s->client_version) q_bud->client_version = s->client_version; + if (q_bud->status == QQ_BUDDY_ONLINE_NORMAL) + qq_send_packet_get_level(gc, q_bud->uid); qq_update_buddy_contact(gc, q_bud); } else { gaim_debug(GAIM_DEBUG_ERROR, "QQ", Modified: trunk/libgaim/protocols/qq/header_info.c =================================================================== --- trunk/libgaim/protocols/qq/header_info.c 2006-12-08 03:03:52 UTC (rev 17923) +++ trunk/libgaim/protocols/qq/header_info.c 2006-12-09 06:34:48 UTC (rev 17924) @@ -32,6 +32,7 @@ #define QQ_CLIENT_0B2F 0x0b2f /* GB QQ2003iii build 0117 */ #define QQ_CLIENT_0B35 0x0b35 /* GB QQ2003iii build 0304 (offical release) */ #define QQ_CLIENT_0B37 0x0b37 /* GB QQ2003iii build 0304 (April 05 updates) */ + #define QQ_SERVER_0100 0x0100 /* server */ /* given command alias, return the command name accordingly */ @@ -74,6 +75,8 @@ return "QQ_CMD_GROUP_CMD"; case QQ_CMD_GET_ALL_LIST_WITH_GROUP: return "QQ_CMD_GET_ALL_LIST_WITH_GROUP"; + case QQ_CMD_GET_LEVEL: + return "QQ_CMD_GET_LEVEL"; case QQ_CMD_REQUEST_LOGIN_TOKEN: return "QQ_CMD_REQUEST_LOGIN_TOKEN"; case QQ_CMD_RECV_MSG_SYS: Modified: trunk/libgaim/protocols/qq/header_info.h =================================================================== --- trunk/libgaim/protocols/qq/header_info.h 2006-12-08 03:03:52 UTC (rev 17923) +++ trunk/libgaim/protocols/qq/header_info.h 2006-12-09 06:34:48 UTC (rev 17924) @@ -33,7 +33,7 @@ #define QQ_PACKET_TAG 0x02 /* all QQ text packets starts with it */ #define QQ_PACKET_TAIL 0x03 /* all QQ text packets end with it */ -/* #define QQ_CLIENT 0x0b37 */ /* QQ2003iii build 0304, Aprili 05 update */ +#define QQ_CLIENT 0x0E1B /* list of known QQ commands */ enum { @@ -57,8 +57,9 @@ QQ_CMD_GET_FRIENDS_ONLINE = 0x0027, /* get my online friends list */ QQ_CMD_CELL_PHONE_2 = 0x0029, /* cell phone 2 */ QQ_CMD_GROUP_CMD = 0x0030, /* group command */ - QQ_CMD_GET_ALL_LIST_WITH_GROUP = 0x58, - QQ_CMD_REQUEST_LOGIN_TOKEN = 0x62, + QQ_CMD_GET_ALL_LIST_WITH_GROUP = 0x0058, + QQ_CMD_GET_LEVEL = 0x005C, /* get level for one or more buddies */ + QQ_CMD_REQUEST_LOGIN_TOKEN = 0x0062, /* get login token */ QQ_CMD_RECV_MSG_SYS = 0x0080, /* receive a system message */ QQ_CMD_RECV_MSG_FRIEND_CHANGE_STATUS = 0x0081, /* friends change status */ }; Modified: trunk/libgaim/protocols/qq/keep_alive.c =================================================================== --- trunk/libgaim/protocols/qq/keep_alive.c 2006-12-08 03:03:52 UTC (rev 17923) +++ trunk/libgaim/protocols/qq/keep_alive.c 2006-12-09 06:34:48 UTC (rev 17924) @@ -42,6 +42,7 @@ #include "utils.h" #define QQ_UPDATE_ONLINE_INTERVAL 300 /* in sec */ +#define QQ_UPDATE_LEVELS_INTERVAL 600 /* in sec */ /* send keep-alive packet to QQ server (it is a heart-beat) */ void qq_send_packet_keep_alive(GaimConnection *gc) @@ -62,7 +63,8 @@ } /* parse the return of keep-alive packet, it includes some system information */ -void qq_process_keep_alive_reply(guint8 *buf, gint buf_len, GaimConnection *gc) { +void qq_process_keep_alive_reply(guint8 *buf, gint buf_len, GaimConnection *gc) +{ qq_data *qd; gint len; gchar **segments; @@ -90,9 +92,11 @@ gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Error decrypt keep alive reply\n"); /* we refresh buddies's online status periodically */ - /* qd->lasat_get_online is updated when setting get_buddies_online packet */ + /* qd->last_get_online is updated when setting get_buddies_online packet */ if ((time(NULL) - qd->last_get_online) >= QQ_UPDATE_ONLINE_INTERVAL) qq_send_packet_get_buddies_online(gc, QQ_FRIENDS_ONLINE_POSITION_START); + if ((time(NULL) - qd->last_get_levels) >= QQ_UPDATE_LEVELS_INTERVAL) + qq_send_packet_get_buddies_levels(gc); } /* refresh all buddies online/offline, @@ -119,20 +123,7 @@ } } -static void _qq_update_buddy_icon(GaimAccount *account, const gchar *name, gint face) -{ - GaimBuddyIcon *icon = gaim_buddy_icons_find(account, name); - gchar *icon_num_str = face_to_icon_str(face); - gchar *icon_path = g_strconcat(QQBUDDYICONDIR, G_DIR_SEPARATOR_S, - QQ_ICON_PREFIX, icon_num_str, QQ_ICON_SUFFIX, NULL); - const gchar *old_path = gaim_buddy_icon_get_path(icon); - if (icon == NULL || old_path == NULL - || g_ascii_strcasecmp(icon_path, old_path) != 0) - qq_set_buddy_icon_for_user(account, name, icon_path); - g_free(icon_num_str); - g_free(icon_path); -} - +/*TODO: maybe this should be qq_update_buddy_status() ?*/ void qq_update_buddy_contact(GaimConnection *gc, qq_buddy *q_bud) { gchar *name; @@ -176,7 +167,6 @@ } gaim_debug(GAIM_DEBUG_INFO, "QQ", "set buddy %d to %s\n", q_bud->uid, status_id); gaim_prpl_got_user_status(gc->account, name, status_id, NULL); - _qq_update_buddy_icon(gc->account, name, q_bud->face); } else { gaim_debug(GAIM_DEBUG_ERROR, "QQ", "unknown buddy: %d\n", q_bud->uid); } Modified: trunk/libgaim/protocols/qq/qq.c =================================================================== --- trunk/libgaim/protocols/qq/qq.c 2006-12-08 03:03:52 UTC (rev 17923) +++ trunk/libgaim/protocols/qq/qq.c 2006-12-09 06:34:48 UTC (rev 17924) @@ -224,6 +224,8 @@ default: g_string_append_printf(tooltip, "\n<b>Gender:</b> ERROR(%d)", q_bud->gender); } + if (q_bud->level) + g_string_append_printf(tooltip, "\n<b>Level:</b> %d", q_bud->level); /* For debugging */ /* g_string_append_printf(tooltip, "\n<b>Flag:</b> %01x", q_bud->flag1); @@ -368,6 +370,7 @@ return; } + qq_send_packet_get_level(gc, uid); qq_send_packet_get_info(gc, uid, TRUE); } @@ -609,7 +612,6 @@ } qq_send_packet_keep_alive(gc); - } /* convert chat nickname to qq-uid to get this buddy info */ Modified: trunk/libgaim/protocols/qq/qq.h =================================================================== --- trunk/libgaim/protocols/qq/qq.h 2006-12-08 03:03:52 UTC (rev 17923) +++ trunk/libgaim/protocols/qq/qq.h 2006-12-09 06:34:48 UTC (rev 17924) @@ -37,7 +37,7 @@ #ifdef _WIN32 const char *qq_win32_buddy_icon_dir(void); -#define QQBUDDYICONDIR qq_win32_buddy_icon_dir() +#define QQ_BUDDY_ICON_DIR qq_win32_buddy_icon_dir() #endif typedef struct _qq_data qq_data; @@ -55,6 +55,9 @@ guint8 flag1; guint8 comm_flag; /* details in qq_buddy_list.c */ guint16 client_version; + guint8 onlineTime; + guint16 level; + guint16 timeRemainder; time_t signon; time_t idle; time_t last_refresh; @@ -94,6 +97,7 @@ guint16 my_icon; /* my icon index */ guint32 all_online; /* the number of online QQ users */ time_t last_get_online; /* last time send get_friends_online packet */ + time_t last_get_levels; /* last time send get_buddies_levels packet */ guint8 window[1 << 13]; /* check up for duplicated packet */ gint sendqueue_timeout; Modified: trunk/libgaim/protocols/qq/recv_core.c =================================================================== --- trunk/libgaim/protocols/qq/recv_core.c 2006-12-08 03:03:52 UTC (rev 17923) +++ trunk/libgaim/protocols/qq/recv_core.c 2006-12-09 06:34:48 UTC (rev 17924) @@ -263,6 +263,9 @@ case QQ_CMD_GET_ALL_LIST_WITH_GROUP: qq_process_get_all_list_with_group_reply(cursor, len, gc); break; + case QQ_CMD_GET_LEVEL: + qq_process_get_level_reply(cursor, len, gc); + break; case QQ_CMD_REQUEST_LOGIN_TOKEN: qq_process_request_login_token_reply(cursor, len, gc); break; Modified: trunk/libgaim/protocols/qq/send_core.h =================================================================== --- trunk/libgaim/protocols/qq/send_core.h 2006-12-08 03:03:52 UTC (rev 17923) +++ trunk/libgaim/protocols/qq/send_core.h 2006-12-09 06:34:48 UTC (rev 17924) @@ -28,10 +28,6 @@ #include <glib.h> #include "connection.h" - -#define QQ_CLIENT 0x0E1B -/* #define QQ_CLIENT 0x0F3F */ - gint qq_send_cmd(GaimConnection *gc, guint16 cmd, gboolean is_auto_seq, guint16 seq, gboolean need_ack, guint8 *data, gint len); gint _qq_send_packet(GaimConnection * gc, guint8 *buf, gint len, guint16 cmd); Modified: trunk/libgaim/protocols/qq/utils.c =================================================================== --- trunk/libgaim/protocols/qq/utils.c 2006-12-08 03:03:52 UTC (rev 17923) +++ trunk/libgaim/protocols/qq/utils.c 2006-12-09 06:34:48 UTC (rev 17924) @@ -349,3 +349,25 @@ return icon_num; } */ + +/* return the location of the buddy icon dir + * any application using libgaim but not installing the QQ buddy icons + * under datadir needs to set the pref below, or buddy icons won't work */ +const char *qq_buddy_icon_dir(void) +{ + if (gaim_prefs_exists("/prpl/qq/buddy_icon_dir")) + return gaim_prefs_get_string("/prpl/qq/buddy_icon_dir"); + else + return QQ_BUDDY_ICON_DIR; +} + +#ifdef _WIN32 +const char *qq_win32_buddy_icon_dir(void) +{ + static char *dir = NULL; + if (dir == NULL) + dir = g_build_filename(wgaim_install_dir(), "pixmaps", + "gaim", "buddy_icons", "qq", NULL); + return dir; +} +#endif Modified: trunk/libgaim/protocols/qq/utils.h =================================================================== --- trunk/libgaim/protocols/qq/utils.h 2006-12-08 03:03:52 UTC (rev 17923) +++ trunk/libgaim/protocols/qq/utils.h 2006-12-09 06:34:48 UTC (rev 17924) @@ -49,4 +49,7 @@ guint8 *hex_str_to_bytes(const gchar *buf, gint *out_len); gchar *hex_dump_to_str(const guint8 *buf, gint buf_len); +const gchar *qq_buddy_icon_dir(void); +const gchar *qq_win32_buddy_icon_dir(void); + #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-12-09 07:39:41
|
Revision: 17926 http://svn.sourceforge.net/gaim/?rev=17926&view=rev Author: markhuetsch Date: 2006-12-08 23:39:29 -0800 (Fri, 08 Dec 2006) Log Message: ----------- Mark these strings for translation. Modified Paths: -------------- trunk/libgaim/protocols/qq/qq.c trunk/libgaim/protocols/qq/utils.c Modified: trunk/libgaim/protocols/qq/qq.c =================================================================== --- trunk/libgaim/protocols/qq/qq.c 2006-12-09 07:20:46 UTC (rev 17925) +++ trunk/libgaim/protocols/qq/qq.c 2006-12-09 07:39:29 UTC (rev 17926) @@ -167,23 +167,23 @@ switch(q_bud->status) { case QQ_BUDDY_OFFLINE: - g_string_append(status, "Offline"); + g_string_append(status, _("Offline")); break; case QQ_BUDDY_ONLINE_NORMAL: return NULL; break; /* TODO What does this status mean? Labelling it as offline... */ case QQ_BUDDY_ONLINE_OFFLINE: - g_string_append(status, "Offline"); + g_string_append(status, _("Offline")); break; case QQ_BUDDY_ONLINE_AWAY: - g_string_append(status, "Away"); + g_string_append(status, _("Away")); break; case QQ_BUDDY_ONLINE_INVISIBLE: - g_string_append(status, "Invisible"); + g_string_append(status, _("Invisible")); break; default: - g_string_printf(status, "Unknown-%d", q_bud->status); + g_string_printf(status, _("Unknown-%d"), q_bud->status); } return g_string_free(status, FALSE); @@ -205,27 +205,27 @@ { ip_str = gen_ip_str(q_bud->ip); if (strlen(ip_str) != 0) { - g_string_append_printf(tooltip, "\n<b>%s Address:</b> %s:%d", + g_string_append_printf(tooltip, _("\n<b>%s Address:</b> %s:%d"), (q_bud->comm_flag & QQ_COMM_FLAG_TCP_MODE) ? "TCP" : "UDP", ip_str, q_bud->port); } g_free(ip_str); - g_string_append_printf(tooltip, "\n<b>Age:</b> %d", q_bud->age); + g_string_append_printf(tooltip, _("\n<b>Age:</b> %d"), q_bud->age); switch (q_bud->gender) { case QQ_BUDDY_GENDER_GG: - g_string_append(tooltip, "\n<b>Gender:</b> Male"); + g_string_append(tooltip, _("\n<b>Gender:</b> Male")); break; case QQ_BUDDY_GENDER_MM: - g_string_append(tooltip, "\n<b>Gender:</b> Female"); + g_string_append(tooltip, _("\n<b>Gender:</b> Female")); break; case QQ_BUDDY_GENDER_UNKNOWN: - g_string_append(tooltip, "\n<b>Gender:</b> Unknown"); + g_string_append(tooltip, _("\n<b>Gender:</b> Unknown")); break; default: - g_string_append_printf(tooltip, "\n<b>Gender:</b> ERROR(%d)", q_bud->gender); + g_string_append_printf(tooltip, _("\n<b>Gender:</b> ERROR(%d)"), q_bud->gender); } if (q_bud->level) - g_string_append_printf(tooltip, "\n<b>Level:</b> %d", q_bud->level); + g_string_append_printf(tooltip, _("\n<b>Level:</b> %d"), q_bud->level); /* For debugging */ /* g_string_append_printf(tooltip, "\n<b>Flag:</b> %01x", q_bud->flag1); Modified: trunk/libgaim/protocols/qq/utils.c =================================================================== --- trunk/libgaim/protocols/qq/utils.c 2006-12-09 07:20:46 UTC (rev 17925) +++ trunk/libgaim/protocols/qq/utils.c 2006-12-09 07:39:29 UTC (rev 17926) @@ -340,16 +340,6 @@ return icon_num_str; } -/* -gint face_to_icon_num(const gchar *face) -{ - gchar *icon_str = face_to_icon_str(face); - gint icon_num = strtol(icon_str, NULL, 10); - g_free(icon_str); - return icon_num; -} -*/ - /* return the location of the buddy icon dir * any application using libgaim but not installing the QQ buddy icons * under datadir needs to set the pref below, or buddy icons won't work */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2006-12-22 05:32:01
|
Revision: 18042 http://svn.sourceforge.net/gaim/?rev=18042&view=rev Author: markhuetsch Date: 2006-12-21 21:31:54 -0800 (Thu, 21 Dec 2006) Log Message: ----------- Only prompt to resend a non-acked packet when the result of that packet being dropped would probably be significant. In that case, give a user-friendly notification. Modified Paths: -------------- trunk/libgaim/protocols/qq/header_info.h trunk/libgaim/protocols/qq/qq.c trunk/libgaim/protocols/qq/sendqueue.c Modified: trunk/libgaim/protocols/qq/header_info.h =================================================================== --- trunk/libgaim/protocols/qq/header_info.h 2006-12-22 00:47:43 UTC (rev 18041) +++ trunk/libgaim/protocols/qq/header_info.h 2006-12-22 05:31:54 UTC (rev 18042) @@ -40,7 +40,7 @@ QQ_CMD_LOGOUT = 0x0001, /* log out */ QQ_CMD_KEEP_ALIVE = 0x0002, /* get onlines from tencent */ QQ_CMD_UPDATE_INFO = 0x0004, /* update information */ - QQ_CMD_SEARCH_USER = 0x0005, /* serach for user */ + QQ_CMD_SEARCH_USER = 0x0005, /* search for user */ QQ_CMD_GET_USER_INFO = 0x0006, /* get user information */ QQ_CMD_ADD_FRIEND_WO_AUTH = 0x0009, /* add friend without auth */ QQ_CMD_DEL_FRIEND = 0x000a, /* delete a friend */ Modified: trunk/libgaim/protocols/qq/qq.c =================================================================== --- trunk/libgaim/protocols/qq/qq.c 2006-12-22 00:47:43 UTC (rev 18041) +++ trunk/libgaim/protocols/qq/qq.c 2006-12-22 05:31:54 UTC (rev 18042) @@ -766,7 +766,6 @@ gaim_prefs_add_none("/plugins/prpl/qq"); gaim_prefs_add_bool("/plugins/prpl/qq/show_status_by_icon", TRUE); gaim_prefs_add_bool("/plugins/prpl/qq/show_fake_video", FALSE); - gaim_prefs_add_bool("/plugins/prpl/qq/prompt_for_missing_packet", TRUE); gaim_prefs_add_bool("/plugins/prpl/qq/prompt_group_msg_on_recv", TRUE); } Modified: trunk/libgaim/protocols/qq/sendqueue.c =================================================================== --- trunk/libgaim/protocols/qq/sendqueue.c 2006-12-22 00:47:43 UTC (rev 18041) +++ trunk/libgaim/protocols/qq/sendqueue.c 2006-12-22 05:31:54 UTC (rev 18042) @@ -78,7 +78,7 @@ gaim_debug(GAIM_DEBUG_INFO, "QQ", "%d packets in sendqueue are freed!\n", i); } -/* packet lost, agree to send again, (and will NOT prompt again) +/* packet lost, agree to send again. * it is removed only when ack-ed by server */ static void _qq_send_again(gc_and_packet *gp) { @@ -125,16 +125,29 @@ g_free(gp); } +static void _notify_packets_lost(GaimConnection *gc, const gchar *msg, qq_sendpacket *p) +{ + gc_and_packet *gp; + + gp = g_new0(gc_and_packet, 1); + gp->gc = gc; + gp->packet = p; + gaim_request_action + (gc, NULL, _("Communication timed out"), msg, + 0, gp, 2, _("Try again"), G_CALLBACK(_qq_send_again), + _("Cancel"), G_CALLBACK(_qq_send_cancel)); + /* keep in sendqueue doing nothing until we hear back from the user */ + p->resend_times++; +} + gboolean qq_sendqueue_timeout_callback(gpointer data) { GaimConnection *gc; qq_data *qd; GList *list; qq_sendpacket *p; - gc_and_packet *gp; time_t now; gint wait_time; - gboolean need_action; gc = (GaimConnection *) data; qd = (qq_data *) gc->proto_data; @@ -166,44 +179,52 @@ case QQ_CMD_KEEP_ALIVE: if (qd->logged_in) { gaim_debug(GAIM_DEBUG_ERROR, "QQ", "Connection lost!\n"); - gaim_connection_error(gc, _("Connection lost!")); + gaim_connection_error(gc, _("Connection lost")); qd->logged_in = FALSE; } p->resend_times = -1; break; case QQ_CMD_LOGIN: + case QQ_CMD_REQUEST_LOGIN_TOKEN: if (!qd->logged_in) /* cancel logging progress */ - gaim_connection_error(gc, _("Login failed, no reply!")); + gaim_connection_error(gc, _("Login failed, no reply")); p->resend_times = -1; break; case QQ_CMD_UPDATE_INFO: - gaim_notify_error(gc, NULL, - _("Connection timeout!"), _("User info is not updated")); - p->resend_times = -1; + _notify_packets_lost(gc, + _("Your attempt to update your info has timed out. Send the information again?"), p); break; + case QQ_CMD_GET_USER_INFO: + _notify_packets_lost(gc, + _("Your attempt to view a user's info has timed out. Try again?"), p); + break; + case QQ_CMD_ADD_FRIEND_WO_AUTH: + _notify_packets_lost(gc, + _("Your attempt to add a buddy has timed out. Try again?"), p); + break; + case QQ_CMD_DEL_FRIEND: + _notify_packets_lost(gc, + _("Your attempt to remove a buddy has timed out. Try again?"), p); + break; + case QQ_CMD_BUDDY_AUTH: + _notify_packets_lost(gc, + _("Your attempt to add a buddy has timed out. Try again?"), p); + break; + case QQ_CMD_CHANGE_ONLINE_STATUS: + _notify_packets_lost(gc, + _("Your attempt to change your online status has timed out. Send the information again?"), p); + break; + case QQ_CMD_SEND_IM: + _notify_packets_lost(gc, + _("Your attempt to send an IM has timed out. Send it again?"), p); + break; + case QQ_CMD_REQUEST_KEY: + _notify_packets_lost(gc, + _("Your request for a file transfer key has timed out. Request it again?"), p); + break; default:{ - need_action = - gaim_prefs_get_bool("/plugins/prpl/qq/prompt_for_missing_packet"); - if (!need_action) - p->resend_times = -1; /* it will be removed next time */ - else { /* prompt for action */ - gp = g_new0(gc_and_packet, 1); - gp->gc = gc; - gp->packet = p; - gaim_request_action - (gc, NULL, - _ - ("Send packet"), - _ - ("Packets lost, send again?"), - 0, gp, 2, - _("Send"), - G_CALLBACK - (_qq_send_again), - _("Cancel"), G_CALLBACK(_qq_send_cancel)); - /* will send once more, but only once */ - p->resend_times++; - } + p->resend_times = -1; /* it will be removed next time */ + gaim_debug(GAIM_DEBUG_ERROR, "QQ", "%s packet lost!\n", qq_get_cmd_desc(p->cmd)); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mar...@us...> - 2007-01-26 06:14:50
|
Revision: 18176 http://svn.sourceforge.net/gaim/?rev=18176&view=rev Author: markhuetsch Date: 2007-01-25 22:14:50 -0800 (Thu, 25 Jan 2007) Log Message: ----------- Apparently GBK is old and we should be using GB18030. Hopefully this fixes bugs 1625210, 1619225, and 1562372. Modified Paths: -------------- trunk/libgaim/protocols/qq/char_conv.c trunk/libgaim/protocols/qq/char_conv.h Modified: trunk/libgaim/protocols/qq/char_conv.c =================================================================== --- trunk/libgaim/protocols/qq/char_conv.c 2007-01-25 17:39:22 UTC (rev 18175) +++ trunk/libgaim/protocols/qq/char_conv.c 2007-01-26 06:14:50 UTC (rev 18176) @@ -33,7 +33,7 @@ #define QQ_SMILEY_AMOUNT 96 #define UTF8 "UTF-8" -#define QQ_CHARSET_ZH_CN "GBK" +#define QQ_CHARSET_ZH_CN "GB18030" #define QQ_CHARSET_ENG "ISO-8859-1" #define QQ_NULL_MSG "(NULL)" /* return this if conversion fails */ Modified: trunk/libgaim/protocols/qq/char_conv.h =================================================================== --- trunk/libgaim/protocols/qq/char_conv.h 2007-01-25 17:39:22 UTC (rev 18175) +++ trunk/libgaim/protocols/qq/char_conv.h 2007-01-26 06:14:50 UTC (rev 18176) @@ -27,7 +27,7 @@ #include <glib.h> -#define QQ_CHARSET_DEFAULT "GBK" +#define QQ_CHARSET_DEFAULT "GB18030" gint convert_as_pascal_string(guint8 *data, gchar **ret, const gchar *from_charset); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |