Mercurial > pidgin.yaz
comparison libpurple/protocols/qq/group_info.c @ 23606:bdb38a8bf721
20080717-05-1-fix-keep-alive 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.
author | SHiNE CsyFeK <csyfek@gmail.com> |
---|---|
date | Thu, 17 Jul 2008 15:12:42 +0000 |
parents | ebad75b719f5 |
children | 1c50f12b1c52 |
comparison
equal
deleted
inserted
replaced
23605:aade89b06762 | 23606:bdb38a8bf721 |
---|---|
85 g_return_if_fail(group != NULL); | 85 g_return_if_fail(group != NULL); |
86 | 86 |
87 /* only get online members when conversation window is on */ | 87 /* only get online members when conversation window is on */ |
88 if (NULL == purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT,group->group_name_utf8, purple_connection_get_account(gc))) { | 88 if (NULL == purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT,group->group_name_utf8, purple_connection_get_account(gc))) { |
89 purple_debug(PURPLE_DEBUG_WARNING, "QQ", | 89 purple_debug(PURPLE_DEBUG_WARNING, "QQ", |
90 "Conv windows for \"%s\" is not on, do not get online members\n", group->group_name_utf8); | 90 "Conversation for \"%s\" is not open, ignore to get online members\n", group->group_name_utf8); |
91 return; | 91 return; |
92 } | 92 } |
93 | 93 |
94 bytes += qq_put8(raw_data + bytes, QQ_GROUP_CMD_GET_ONLINE_MEMBER); | 94 bytes += qq_put8(raw_data + bytes, QQ_GROUP_CMD_GET_ONLINE_MEMBER); |
95 bytes += qq_put32(raw_data + bytes, group->internal_group_id); | 95 bytes += qq_put32(raw_data + bytes, group->internal_group_id); |
139 } | 139 } |
140 | 140 |
141 qq_send_group_cmd(gc, group, raw_data, bytes); | 141 qq_send_group_cmd(gc, group, raw_data, bytes); |
142 } | 142 } |
143 | 143 |
144 /** | |
145 * @brief 处理群信息.当前群信息的处理还不完善,由于版本的不同导致协议的解读有差异. | |
146 */ | |
147 void qq_process_group_cmd_get_group_info(guint8 *data, gint len, PurpleConnection *gc) | 144 void qq_process_group_cmd_get_group_info(guint8 *data, gint len, PurpleConnection *gc) |
148 { | 145 { |
149 qq_group *group; | 146 qq_group *group; |
150 qq_buddy *member; | 147 qq_buddy *member; |
151 qq_data *qd; | 148 qq_data *qd; |
155 guint32 member_uid, internal_group_id, external_group_id; | 152 guint32 member_uid, internal_group_id, external_group_id; |
156 GSList *pending_id; | 153 GSList *pending_id; |
157 guint32 unknown4; | 154 guint32 unknown4; |
158 guint8 unknown1; | 155 guint8 unknown1; |
159 gint bytes, num; | 156 gint bytes, num; |
157 gchar *notice; | |
160 | 158 |
161 g_return_if_fail(data != NULL && len > 0); | 159 g_return_if_fail(data != NULL && len > 0); |
162 qd = (qq_data *) gc->proto_data; | 160 qd = (qq_data *) gc->proto_data; |
163 | 161 |
164 bytes = 0; | 162 bytes = 0; |
184 bytes += qq_get32(&unknown4, data + bytes); /* oldCategory */ | 182 bytes += qq_get32(&unknown4, data + bytes); /* oldCategory */ |
185 bytes += qq_get16(&unknown, data + bytes); | 183 bytes += qq_get16(&unknown, data + bytes); |
186 bytes += qq_get32(&(group->group_category), data + bytes); | 184 bytes += qq_get32(&(group->group_category), data + bytes); |
187 bytes += qq_get16(&max_members, data + bytes); | 185 bytes += qq_get16(&max_members, data + bytes); |
188 bytes += qq_get8(&unknown1, data + bytes); | 186 bytes += qq_get8(&unknown1, data + bytes); |
189 /* XXX | 187 /* the following, while Eva: |
190 * the following, while Eva: | |
191 * 4(unk), 4(verID), 1(nameLen), nameLen(qunNameContent), 1(0x00), | 188 * 4(unk), 4(verID), 1(nameLen), nameLen(qunNameContent), 1(0x00), |
192 * 2(qunNoticeLen), qunNoticeLen(qunNoticeContent, 1(qunDescLen), | 189 * 2(qunNoticeLen), qunNoticeLen(qunNoticeContent, 1(qunDescLen), |
193 * qunDestLen(qunDestcontent)) */ | 190 * qunDestLen(qunDestcontent)) */ |
194 bytes += qq_get8(&unknown1, data + bytes); | 191 bytes += qq_get8(&unknown1, data + bytes); |
195 purple_debug(PURPLE_DEBUG_INFO, "QQ", "type=%u creatorid=%u category=%u\n", | 192 purple_debug(PURPLE_DEBUG_INFO, "QQ", "type=%u creatorid=%u category=%u maxmembers=%u\n", |
196 group->group_type, group->creator_uid, group->group_category); | 193 group->group_type, group->creator_uid, group->group_category, max_members); |
197 purple_debug(PURPLE_DEBUG_INFO, "QQ", "maxmembers=%u", max_members); | |
198 | 194 |
199 /* strlen + <str content> */ | 195 /* strlen + <str content> */ |
200 bytes += convert_as_pascal_string(data + bytes, &(group->group_name_utf8), QQ_CHARSET_DEFAULT); | 196 bytes += convert_as_pascal_string(data + bytes, &(group->group_name_utf8), QQ_CHARSET_DEFAULT); |
201 purple_debug(PURPLE_DEBUG_INFO, "QQ", "group \"%s\"\n", group->group_name_utf8); | 197 purple_debug(PURPLE_DEBUG_INFO, "QQ", "group \"%s\"\n", group->group_name_utf8); |
202 bytes += qq_get16(&unknown, data + bytes); /* 0x0000 */ | 198 bytes += qq_get16(&unknown, data + bytes); /* 0x0000 */ |
203 bytes += convert_as_pascal_string(data + bytes, &(group->notice_utf8), QQ_CHARSET_DEFAULT); | 199 bytes += convert_as_pascal_string(data + bytes, ¬ice, QQ_CHARSET_DEFAULT); |
204 purple_debug(PURPLE_DEBUG_INFO, "QQ", "notice \"%s\"\n", group->notice_utf8); | 200 purple_debug(PURPLE_DEBUG_INFO, "QQ", "notice \"%s\"\n", notice); |
205 bytes += convert_as_pascal_string(data + bytes, &(group->group_desc_utf8), QQ_CHARSET_DEFAULT); | 201 bytes += convert_as_pascal_string(data + bytes, &(group->group_desc_utf8), QQ_CHARSET_DEFAULT); |
206 purple_debug(PURPLE_DEBUG_INFO, "QQ", "group_desc \"%s\"\n", group->group_desc_utf8); | 202 purple_debug(PURPLE_DEBUG_INFO, "QQ", "group_desc \"%s\"\n", group->group_desc_utf8); |
207 | 203 |
208 num = 0; | 204 num = 0; |
209 /* now comes the member list separated by 0x00 */ | 205 /* now comes the member list separated by 0x00 */ |
233 | 229 |
234 purple_conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, | 230 purple_conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, |
235 group->group_name_utf8, purple_connection_get_account(gc)); | 231 group->group_name_utf8, purple_connection_get_account(gc)); |
236 if(NULL == purple_conv) { | 232 if(NULL == purple_conv) { |
237 purple_debug(PURPLE_DEBUG_WARNING, "QQ", | 233 purple_debug(PURPLE_DEBUG_WARNING, "QQ", |
238 "Conv windows for \"%s\" is not on, do not set topic\n", group->group_name_utf8); | 234 "Conversation for \"%s\" is not open, do not set topic\n", group->group_name_utf8); |
239 } | 235 return; |
240 else { | 236 } |
241 purple_conv_chat_set_topic(PURPLE_CONV_CHAT(purple_conv), NULL, group->notice_utf8); | 237 |
242 } | 238 /* filter \r\n in notice */ |
239 qq_filter_str(notice); | |
240 group->notice_utf8 = strdup(notice); | |
241 g_free(notice); | |
242 | |
243 purple_conv_chat_set_topic(PURPLE_CONV_CHAT(purple_conv), NULL, group->notice_utf8); | |
243 } | 244 } |
244 | 245 |
245 void qq_process_group_cmd_get_online_members(guint8 *data, gint len, PurpleConnection *gc) | 246 void qq_process_group_cmd_get_online_members(guint8 *data, gint len, PurpleConnection *gc) |
246 { | 247 { |
247 guint32 internal_group_id, member_uid; | 248 guint32 internal_group_id, member_uid; |
294 gint num; | 295 gint num; |
295 guint32 internal_group_id, member_uid; | 296 guint32 internal_group_id, member_uid; |
296 guint16 unknown; | 297 guint16 unknown; |
297 qq_group *group; | 298 qq_group *group; |
298 qq_buddy *member; | 299 qq_buddy *member; |
300 gchar *nick; | |
299 | 301 |
300 g_return_if_fail(data != NULL && len > 0); | 302 g_return_if_fail(data != NULL && len > 0); |
301 | 303 |
302 bytes = 0; | 304 bytes = 0; |
303 bytes += qq_get32(&internal_group_id, data + bytes); | 305 bytes += qq_get32(&internal_group_id, data + bytes); |
316 | 318 |
317 num++; | 319 num++; |
318 bytes += qq_get16(&(member->face), data + bytes); | 320 bytes += qq_get16(&(member->face), data + bytes); |
319 bytes += qq_get8(&(member->age), data + bytes); | 321 bytes += qq_get8(&(member->age), data + bytes); |
320 bytes += qq_get8(&(member->gender), data + bytes); | 322 bytes += qq_get8(&(member->gender), data + bytes); |
321 bytes += convert_as_pascal_string(data + bytes, &(member->nickname), QQ_CHARSET_DEFAULT); | 323 bytes += convert_as_pascal_string(data + bytes, &nick, QQ_CHARSET_DEFAULT); |
322 bytes += qq_get16(&unknown, data + bytes); | 324 bytes += qq_get16(&unknown, data + bytes); |
323 bytes += qq_get8(&(member->flag1), data + bytes); | 325 bytes += qq_get8(&(member->flag1), data + bytes); |
324 bytes += qq_get8(&(member->comm_flag), data + bytes); | 326 bytes += qq_get8(&(member->comm_flag), data + bytes); |
325 | 327 |
328 /* filter \r\n in nick */ | |
329 qq_filter_str(nick); | |
330 member->nickname = g_strdup(nick); | |
331 g_free(nick); | |
332 | |
333 /* | |
334 if (QQ_DEBUG) { | |
335 purple_debug(PURPLE_DEBUG_INFO, "QQ", | |
336 "member [%09d]: flag1=0x%02x, comm_flag=0x%02x, nick=%s\n", | |
337 member_uid, member->flag1, member->comm_flag, member->nickname); | |
338 } | |
339 */ | |
340 | |
326 member->last_refresh = time(NULL); | 341 member->last_refresh = time(NULL); |
327 } | 342 } |
328 if(bytes > len) { | 343 if(bytes > len) { |
329 purple_debug(PURPLE_DEBUG_ERROR, "QQ", | 344 purple_debug(PURPLE_DEBUG_ERROR, "QQ", |
330 "group_cmd_get_members_info: Dangerous error! maybe protocol changed, notify developers!"); | 345 "group_cmd_get_members_info: Dangerous error! maybe protocol changed, notify developers!"); |