Fri, 18 Jul 2008 00:46:22 +0000
disapproval of revision 'a39a33c79a3f235c5e1acf5602d7896f829623ba'
--- a/libpurple/protocols/qq/AUTHORS Thu Jul 17 14:43:56 2008 +0000 +++ b/libpurple/protocols/qq/AUTHORS Fri Jul 18 00:46:22 2008 +0000 @@ -16,7 +16,7 @@ Lovely Patch Writers ===== -gnap : message displaying, documentation +Gnap.An : message displaying, documentation manphiz : qun processing moo : qun processing Coly Li : qun processing @@ -32,4 +32,4 @@ rlaager@pidgin.im OpenQ Team LumaQQ Team -OpenQ Google Group +OpenQ@GoogleGroup
--- a/libpurple/protocols/qq/ChangeLog Thu Jul 17 14:43:56 2008 +0000 +++ b/libpurple/protocols/qq/ChangeLog Fri Jul 18 00:46:22 2008 +0000 @@ -1,11 +1,3 @@ -2008.07.12 - ccpaging <ecc_hy(at)hotmail.com> - * Fixed: Always lost connection. Now send keep alive packet in every 30 seconds - * Minor fix for debug information - * Filter \r\n and replace with SPCAE in group notive - * Fixed a memory leak - * Tickets: - * Fixes #4024. - 2008.06.29 - csyfek <csyfek(at)gmail.com> * Minor bug fix * Add some doxygen syntax for preparing development documentation
--- a/libpurple/protocols/qq/buddy_info.c Thu Jul 17 14:43:56 2008 +0000 +++ b/libpurple/protocols/qq/buddy_info.c Fri Jul 18 00:46:22 2008 +0000 @@ -208,8 +208,8 @@ return FALSE; } -static PurpleNotifyUserInfo * - info_to_notify_user_info(const contact_info *info) + static PurpleNotifyUserInfo * +info_to_notify_user_info(const contact_info *info) { PurpleNotifyUserInfo *user_info = purple_notify_user_info_new(); const gchar *intro; @@ -826,8 +826,7 @@ PurpleBuddy *b; qq_data *qd; qq_buddy *q_bud; - gchar *alias_utf8; - gchar *purple_name; + gchar *alias_utf8, *purple_name; PurpleAccount *account = purple_connection_get_account(gc); qd = (qq_data *) gc->proto_data; @@ -1010,7 +1009,7 @@ bytes += qq_get16(&level, decr_buf + bytes); bytes += qq_get16(&timeRemainder, decr_buf + bytes); purple_debug(PURPLE_DEBUG_INFO, "QQ", - "Level uid: %d, onlineTime: %d, level: %d, timeRemainder: %d\n", + "Level packet entry:\nuid: %d\nonlineTime: %d\nlevel: %d\ntimeRemainder: %d\n", uid, onlineTime, level, timeRemainder); purple_name = uid_to_purple_name(uid); b = purple_find_buddy(account, purple_name);
--- a/libpurple/protocols/qq/buddy_list.c Thu Jul 17 14:43:56 2008 +0000 +++ b/libpurple/protocols/qq/buddy_list.c Fri Jul 18 00:46:22 2008 +0000 @@ -234,11 +234,12 @@ "qq_process_get_buddies_online_reply: Dangerous error! maybe protocol changed, notify developers!\n"); } - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Received %d online buddies, nextposition=%u\n", - count, (guint) position); - if (position != QQ_FRIENDS_ONLINE_POSITION_END - && position != QQ_FRIENDS_ONLINE_POSITION_START) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Requesting for more online buddies\n"); + if (position != QQ_FRIENDS_ONLINE_POSITION_END) { + purple_debug(PURPLE_DEBUG_INFO, "QQ", "Received %d online buddies, nextposition=%u\n", + count, (guint) position); + if (position != QQ_FRIENDS_ONLINE_POSITION_START) { + purple_debug(PURPLE_DEBUG_INFO, "QQ", "Requesting for more online buddies\n"); + } qq_send_packet_get_buddies_online(gc, position); } else { purple_debug(PURPLE_DEBUG_INFO, "QQ", "All online buddies received\n"); @@ -317,8 +318,8 @@ if (QQ_DEBUG) { purple_debug(PURPLE_DEBUG_INFO, "QQ", - "buddy [%09d]: flag1=0x%02x, comm_flag=0x%02x, nick=%s\n", - q_bud->uid, q_bud->flag1, q_bud->comm_flag, q_bud->nickname); + "buddy [%09d]: flag1=0x%02x, comm_flag=0x%02x\n", + q_bud->uid, q_bud->flag1, q_bud->comm_flag); } name = uid_to_purple_name(q_bud->uid); @@ -431,9 +432,7 @@ purple_debug(PURPLE_DEBUG_INFO, "QQ", "Get all list done, %d buddies and %d Quns\n", i, j); purple_debug(PURPLE_DEBUG_INFO, "QQ", "Received %d buddies and %d groups, nextposition=%u\n", i, j, (guint) position); - - if (position != QQ_FRIENDS_ALL_LIST_POSITION_START - && position != QQ_FRIENDS_ALL_LIST_POSITION_END) { + if (position != QQ_FRIENDS_ALL_LIST_POSITION_START && position != QQ_FRIENDS_ALL_LIST_POSITION_START) { purple_debug(PURPLE_DEBUG_INFO, "QQ", "Requesting for more buddies and groups\n"); qq_send_packet_get_all_list_with_group(gc, position); } else {
--- a/libpurple/protocols/qq/buddy_status.c Thu Jul 17 14:43:56 2008 +0000 +++ b/libpurple/protocols/qq/buddy_status.c Fri Jul 18 00:46:22 2008 +0000 @@ -205,9 +205,7 @@ b = purple_find_buddy(gc->account, name); g_free(name); q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data; - if (q_bud != NULL) { - qq_update_buddy_contact(gc, q_bud); - } + qq_update_buddy_contact(gc, q_bud); } }
--- a/libpurple/protocols/qq/char_conv.c Thu Jul 17 14:43:56 2008 +0000 +++ b/libpurple/protocols/qq/char_conv.c Fri Jul 18 00:46:22 2008 +0000 @@ -123,7 +123,10 @@ return g_strdup(QQ_NULL_MSG); } -/* +/** + * @brief 把输入作为一个pascal字符串并返回一个用UFT-8转换的c-字符串.\n + * 返回已读入的字节数,或者当遇到错误时返回-1.该完成转换的UTF-8字符串被保存到ret中 + * * take the input as a pascal string and return a converted c-string in UTF-8 * returns the number of bytes read, return -1 if fatal error * the converted UTF-8 will be saved in ret @@ -278,17 +281,3 @@ g_string_free(converted, FALSE); return ret; } - -void qq_filter_str(gchar *str) { - gchar *temp; - if (str == NULL) { - return; - } - - for (temp = str; *temp != 0; temp++) { - if (*temp == '\r' || *temp == '\n') *temp = 0x20; - } - g_strstrip(str); -} - -
--- a/libpurple/protocols/qq/char_conv.h Thu Jul 17 14:43:56 2008 +0000 +++ b/libpurple/protocols/qq/char_conv.h Fri Jul 18 00:46:22 2008 +0000 @@ -40,5 +40,5 @@ gchar *qq_encode_to_purple(guint8 *font_attr_data, gint len, const gchar *msg); gchar *qq_im_filter_html(const gchar *text); -void qq_filter_str(gchar *str); + #endif
--- a/libpurple/protocols/qq/group_conv.c Thu Jul 17 14:43:56 2008 +0000 +++ b/libpurple/protocols/qq/group_conv.c Fri Jul 18 00:46:22 2008 +0000 @@ -99,9 +99,7 @@ list = list->next; } - if (names != NULL && flags != NULL) { - purple_conv_chat_add_users(PURPLE_CONV_CHAT(conv), names, NULL, flags, FALSE); - } + purple_conv_chat_add_users(PURPLE_CONV_CHAT(conv), names, NULL, flags, FALSE); } /* clean up names */ while (names != NULL) {
--- a/libpurple/protocols/qq/group_free.c Thu Jul 17 14:43:56 2008 +0000 +++ b/libpurple/protocols/qq/group_free.c Fri Jul 18 00:46:22 2008 +0000 @@ -55,10 +55,8 @@ { g_return_if_fail(group != NULL); qq_group_free_member(group); - g_free(group->my_status_desc); g_free(group->group_name_utf8); g_free(group->group_desc_utf8); - g_free(group->notice_utf8); g_free(group); }
--- a/libpurple/protocols/qq/group_info.c Thu Jul 17 14:43:56 2008 +0000 +++ b/libpurple/protocols/qq/group_info.c Fri Jul 18 00:46:22 2008 +0000 @@ -87,7 +87,7 @@ /* only get online members when conversation window is on */ if (NULL == purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT,group->group_name_utf8, purple_connection_get_account(gc))) { purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Conversation for \"%s\" is not open, ignore to get online members\n", group->group_name_utf8); + "Conv windows for \"%s\" is not on, do not get online members\n", group->group_name_utf8); return; } @@ -141,6 +141,9 @@ qq_send_group_cmd(gc, group, raw_data, bytes); } +/** + * @brief 处理群信息.当前群信息的处理还不完善,由于版本的不同导致协议的解读有差异. + */ void qq_process_group_cmd_get_group_info(guint8 *data, gint len, PurpleConnection *gc) { qq_group *group; @@ -154,7 +157,6 @@ guint32 unknown4; guint8 unknown1; gint bytes, num; - gchar *notice; g_return_if_fail(data != NULL && len > 0); qd = (qq_data *) gc->proto_data; @@ -184,20 +186,22 @@ bytes += qq_get32(&(group->group_category), data + bytes); bytes += qq_get16(&max_members, data + bytes); bytes += qq_get8(&unknown1, data + bytes); - /* the following, while Eva: + /* XXX + * the following, while Eva: * 4(unk), 4(verID), 1(nameLen), nameLen(qunNameContent), 1(0x00), * 2(qunNoticeLen), qunNoticeLen(qunNoticeContent, 1(qunDescLen), * qunDestLen(qunDestcontent)) */ bytes += qq_get8(&unknown1, data + bytes); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "type=%u creatorid=%u category=%u maxmembers=%u\n", - group->group_type, group->creator_uid, group->group_category, max_members); + purple_debug(PURPLE_DEBUG_INFO, "QQ", "type=%u creatorid=%u category=%u\n", + group->group_type, group->creator_uid, group->group_category); + purple_debug(PURPLE_DEBUG_INFO, "QQ", "maxmembers=%u", max_members); /* strlen + <str content> */ bytes += convert_as_pascal_string(data + bytes, &(group->group_name_utf8), QQ_CHARSET_DEFAULT); purple_debug(PURPLE_DEBUG_INFO, "QQ", "group \"%s\"\n", group->group_name_utf8); bytes += qq_get16(&unknown, data + bytes); /* 0x0000 */ - bytes += convert_as_pascal_string(data + bytes, ¬ice, QQ_CHARSET_DEFAULT); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "notice \"%s\"\n", notice); + bytes += convert_as_pascal_string(data + bytes, &(group->notice_utf8), QQ_CHARSET_DEFAULT); + purple_debug(PURPLE_DEBUG_INFO, "QQ", "notice \"%s\"\n", group->notice_utf8); bytes += convert_as_pascal_string(data + bytes, &(group->group_desc_utf8), QQ_CHARSET_DEFAULT); purple_debug(PURPLE_DEBUG_INFO, "QQ", "group_desc \"%s\"\n", group->group_desc_utf8); @@ -231,16 +235,11 @@ group->group_name_utf8, purple_connection_get_account(gc)); if(NULL == purple_conv) { purple_debug(PURPLE_DEBUG_WARNING, "QQ", - "Conversation for \"%s\" is not open, do not set topic\n", group->group_name_utf8); - return; + "Conv windows for \"%s\" is not on, do not set topic\n", group->group_name_utf8); } - - /* filter \r\n in notice */ - qq_filter_str(notice); - group->notice_utf8 = strdup(notice); - g_free(notice); - - purple_conv_chat_set_topic(PURPLE_CONV_CHAT(purple_conv), NULL, group->notice_utf8); + else { + purple_conv_chat_set_topic(PURPLE_CONV_CHAT(purple_conv), NULL, group->notice_utf8); + } } void qq_process_group_cmd_get_online_members(guint8 *data, gint len, PurpleConnection *gc) @@ -297,7 +296,6 @@ guint16 unknown; qq_group *group; qq_buddy *member; - gchar *nick; g_return_if_fail(data != NULL && len > 0); @@ -320,24 +318,11 @@ bytes += qq_get16(&(member->face), data + bytes); bytes += qq_get8(&(member->age), data + bytes); bytes += qq_get8(&(member->gender), data + bytes); - bytes += convert_as_pascal_string(data + bytes, &nick, QQ_CHARSET_DEFAULT); + bytes += convert_as_pascal_string(data + bytes, &(member->nickname), QQ_CHARSET_DEFAULT); bytes += qq_get16(&unknown, data + bytes); bytes += qq_get8(&(member->flag1), data + bytes); bytes += qq_get8(&(member->comm_flag), data + bytes); - /* filter \r\n in nick */ - qq_filter_str(nick); - member->nickname = g_strdup(nick); - g_free(nick); - - /* - if (QQ_DEBUG) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "member [%09d]: flag1=0x%02x, comm_flag=0x%02x, nick=%s\n", - member_uid, member->flag1, member->comm_flag, member->nickname); - } - */ - member->last_refresh = time(NULL); } if(bytes > len) {
--- a/libpurple/protocols/qq/group_internal.c Thu Jul 17 14:43:56 2008 +0000 +++ b/libpurple/protocols/qq/group_internal.c Fri Jul 18 00:46:22 2008 +0000 @@ -230,7 +230,9 @@ *list = g_slist_remove(*list, GINT_TO_POINTER(id)); } -/* Return the location of id in list, or NULL if not found */ +/** + * @brief Return the location of id in list, or NULL if not found (返回id在链表中的位置,没有找到则返回NULL) + */ GSList *qq_get_pending_id(GSList *list, guint32 id) { return g_slist_find(list, GINT_TO_POINTER(id));
--- a/libpurple/protocols/qq/qq_network.c Thu Jul 17 14:43:56 2008 +0000 +++ b/libpurple/protocols/qq/qq_network.c Fri Jul 18 00:46:22 2008 +0000 @@ -189,13 +189,13 @@ return FALSE; /* set mask */ } -static gboolean packet_check_ack(qq_data *qd, guint16 cmd, guint16 seq) +static gboolean packet_check_ack(qq_data *qd, guint16 seq) { gpointer trans; g_return_val_if_fail(qd != NULL, FALSE); - trans = qq_send_trans_find(qd, cmd, seq); + trans = qq_send_trans_find(qd, seq); if (trans == NULL) { return FALSE; } @@ -360,7 +360,7 @@ /* ack packet, we need to update send tranactions */ /* we do not check duplication for server ack */ - is_reply = packet_check_ack(qd, cmd, seq); + is_reply = packet_check_ack(qd, seq); if ( !is_reply ) { if ( !qd->logged_in ) { /* packets before login */ @@ -460,10 +460,7 @@ return; } - /* keep alive will be sent in 30 seconds since last_receive - * QQ need a keep alive packet in every 60 seconds - gc->last_received = time(NULL); - */ + gc->last_received = time(NULL); purple_debug(PURPLE_DEBUG_INFO, "TCP_PENDING", "Read %d bytes from socket, rxlen is %d\n", buf_len, qd->tcp_rxlen); qd->tcp_rxqueue = g_realloc(qd->tcp_rxqueue, buf_len + qd->tcp_rxlen); @@ -568,10 +565,7 @@ return; } - /* keep alive will be sent in 30 seconds since last_receive - * QQ need a keep alive packet in every 60 seconds - gc->last_received = time(NULL); - */ + gc->last_received = time(NULL); if (buf_len < QQ_UDP_HEADER_LENGTH) { if (buf[0] != QQ_PACKET_TAG || buf[buf_len - 1] != QQ_PACKET_TAIL) { @@ -1246,6 +1240,7 @@ } if (QQ_DEBUG) { + qq_show_packet("QQ_SEND_CMD", buf, buf_len); purple_debug(PURPLE_DEBUG_INFO, "QQ", "<== [%05d], %s, total %d bytes is sent %d\n", seq, qq_get_cmd_desc(cmd), buf_len, bytes_sent);
--- a/libpurple/protocols/qq/qq_trans.c Thu Jul 17 14:43:56 2008 +0000 +++ b/libpurple/protocols/qq/qq_trans.c Fri Jul 18 00:46:22 2008 +0000 @@ -83,7 +83,7 @@ g_free(trans); } -gpointer qq_send_trans_find(qq_data *qd, guint16 cmd, guint16 seq) +gpointer qq_send_trans_find(qq_data *qd, guint16 seq) { GList *curr; GList *next; @@ -93,7 +93,7 @@ while(curr) { next = curr->next; trans = (transaction *) (curr->data); - if(trans->cmd == cmd && trans->seq == seq) { + if(trans->seq == seq) { return trans; } curr = next;
--- a/libpurple/protocols/qq/qq_trans.h Thu Jul 17 14:43:56 2008 +0000 +++ b/libpurple/protocols/qq/qq_trans.h Fri Jul 18 00:46:22 2008 +0000 @@ -30,7 +30,7 @@ void qq_send_trans_append(qq_data *qd, guint8 *buf, gint bus_len, guint16 cmd, guint16 seq); void qq_send_trans_remove(qq_data *qd, gpointer data); -gpointer qq_send_trans_find(qq_data *qd, guint16 cmd, guint16 seq); +gpointer qq_send_trans_find(qq_data *qd, guint16 seq); void qq_send_trans_remove_all(qq_data *qd); gint qq_send_trans_scan(qq_data *qd, gint *start, guint8 *buf, gint maxlen, guint16 *cmd, gint *retries);