Mercurial > pidgin
comparison libpurple/protocols/qq/group_info.c @ 23048:9a5d140400f1
patch-02-fix-multiarch
author | SHiNE CsyFeK <csyfek@gmail.com> |
---|---|
date | Tue, 24 Jun 2008 11:58:57 +0000 |
parents | 44b4e8bd759b |
children | ebad75b719f5 |
comparison
equal
deleted
inserted
replaced
23046:13a9b56f83b0 | 23048:9a5d140400f1 |
---|---|
41 | 41 |
42 static gboolean _is_group_member_need_update_info(qq_buddy *member) | 42 static gboolean _is_group_member_need_update_info(qq_buddy *member) |
43 { | 43 { |
44 g_return_val_if_fail(member != NULL, FALSE); | 44 g_return_val_if_fail(member != NULL, FALSE); |
45 return (member->nickname == NULL) || | 45 return (member->nickname == NULL) || |
46 (time(NULL) - member->last_refresh) > QQ_GROUP_CHAT_REFRESH_NICKNAME_INTERNAL; | 46 (time(NULL) - member->last_refresh) > QQ_GROUP_CHAT_REFRESH_NICKNAME_INTERNAL; |
47 } | 47 } |
48 | 48 |
49 /* this is done when we receive the reply to get_online_members sub_cmd | 49 /* this is done when we receive the reply to get_online_members sub_cmd |
50 * all member are set offline, and then only those in reply packets are online */ | 50 * all member are set offline, and then only those in reply packets are online */ |
51 static void _qq_group_set_members_all_offline(qq_group *group) | 51 static void _qq_group_set_members_all_offline(qq_group *group) |
63 } | 63 } |
64 | 64 |
65 /* send packet to get detailed information of one group */ | 65 /* send packet to get detailed information of one group */ |
66 void qq_send_cmd_group_get_group_info(PurpleConnection *gc, qq_group *group) | 66 void qq_send_cmd_group_get_group_info(PurpleConnection *gc, qq_group *group) |
67 { | 67 { |
68 guint8 *raw_data, *cursor; | 68 guint8 raw_data[16] = {0}; |
69 gint bytes, data_len; | 69 gint bytes = 0; |
70 | 70 |
71 g_return_if_fail(group != NULL); | 71 g_return_if_fail(group != NULL); |
72 | 72 |
73 data_len = 5; | 73 bytes += qq_put8(raw_data + bytes, QQ_GROUP_CMD_GET_GROUP_INFO); |
74 raw_data = g_newa(guint8, data_len); | 74 bytes += qq_put32(raw_data + bytes, group->internal_group_id); |
75 cursor = raw_data; | 75 |
76 | 76 qq_send_group_cmd(gc, group, raw_data, bytes); |
77 bytes = 0; | |
78 bytes += create_packet_b(raw_data, &cursor, QQ_GROUP_CMD_GET_GROUP_INFO); | |
79 bytes += create_packet_dw(raw_data, &cursor, group->internal_group_id); | |
80 | |
81 if (bytes != data_len) | |
82 purple_debug(PURPLE_DEBUG_ERROR, "QQ", | |
83 "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_GET_GROUP_INFO)); | |
84 else | |
85 qq_send_group_cmd(gc, group, raw_data, data_len); | |
86 } | 77 } |
87 | 78 |
88 /* send packet to get online group member, called by keep_alive */ | 79 /* send packet to get online group member, called by keep_alive */ |
89 void qq_send_cmd_group_get_online_members(PurpleConnection *gc, qq_group *group) | 80 void qq_send_cmd_group_get_online_members(PurpleConnection *gc, qq_group *group) |
90 { | 81 { |
91 guint8 *raw_data, *cursor; | 82 guint8 raw_data[16] = {0}; |
92 gint bytes, data_len; | 83 gint bytes = 0; |
93 | 84 |
94 g_return_if_fail(group != NULL); | 85 g_return_if_fail(group != NULL); |
95 | 86 |
96 /* only get online members when conversation window is on */ | 87 /* only get online members when conversation window is on */ |
97 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))) { |
98 purple_debug(PURPLE_DEBUG_WARNING, "QQ", | 89 purple_debug(PURPLE_DEBUG_WARNING, "QQ", |
99 "Conv windows for \"%s\" is not on, do not get online members\n", group->group_name_utf8); | 90 "Conv windows for \"%s\" is not on, do not get online members\n", group->group_name_utf8); |
100 return; | 91 return; |
101 } | 92 } |
102 | 93 |
103 data_len = 5; | 94 bytes += qq_put8(raw_data + bytes, QQ_GROUP_CMD_GET_ONLINE_MEMBER); |
104 raw_data = g_newa(guint8, data_len); | 95 bytes += qq_put32(raw_data + bytes, group->internal_group_id); |
105 cursor = raw_data; | 96 |
106 | 97 qq_send_group_cmd(gc, group, raw_data, bytes); |
107 bytes = 0; | |
108 bytes += create_packet_b(raw_data, &cursor, QQ_GROUP_CMD_GET_ONLINE_MEMBER); | |
109 bytes += create_packet_dw(raw_data, &cursor, group->internal_group_id); | |
110 | |
111 if (bytes != data_len) | |
112 purple_debug(PURPLE_DEBUG_ERROR, "QQ", | |
113 "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_GET_ONLINE_MEMBER)); | |
114 else | |
115 qq_send_group_cmd(gc, group, raw_data, data_len); | |
116 } | 98 } |
117 | 99 |
118 /* send packet to get info for each group member */ | 100 /* send packet to get info for each group member */ |
119 void qq_send_cmd_group_get_members_info(PurpleConnection *gc, qq_group *group) | 101 void qq_send_cmd_group_get_members_info(PurpleConnection *gc, qq_group *group) |
120 { | 102 { |
121 guint8 *raw_data, *cursor; | 103 guint8 *raw_data; |
122 gint bytes, data_len, i; | 104 gint bytes, num, data_len; |
123 GList *list; | 105 GList *list; |
124 qq_buddy *member; | 106 qq_buddy *member; |
125 | 107 |
126 g_return_if_fail(group != NULL); | 108 g_return_if_fail(group != NULL); |
127 for (i = 0, list = group->members; list != NULL; list = list->next) { | 109 for (num = 0, list = group->members; list != NULL; list = list->next) { |
128 member = (qq_buddy *) list->data; | 110 member = (qq_buddy *) list->data; |
129 if (_is_group_member_need_update_info(member)) | 111 if (_is_group_member_need_update_info(member)) |
130 i++; | 112 num++; |
131 } | 113 } |
132 | 114 |
133 if (i <= 0) { | 115 if (num <= 0) { |
134 purple_debug(PURPLE_DEBUG_INFO, "QQ", "No group member needs to to update info now.\n"); | 116 purple_debug(PURPLE_DEBUG_INFO, "QQ", "No group member needs to to update info now.\n"); |
135 return; | 117 return; |
136 } | 118 } |
137 | 119 |
138 data_len = 5 + 4 * i; | 120 data_len = 5 + 4 * num; |
139 raw_data = g_newa(guint8, data_len); | 121 raw_data = g_newa(guint8, data_len); |
140 cursor = raw_data; | |
141 | 122 |
142 bytes = 0; | 123 bytes = 0; |
143 bytes += create_packet_b(raw_data, &cursor, QQ_GROUP_CMD_GET_MEMBER_INFO); | 124 bytes += qq_put8(raw_data + bytes, QQ_GROUP_CMD_GET_MEMBER_INFO); |
144 bytes += create_packet_dw(raw_data, &cursor, group->internal_group_id); | 125 bytes += qq_put32(raw_data + bytes, group->internal_group_id); |
145 | 126 |
146 list = group->members; | 127 list = group->members; |
147 while (list != NULL) { | 128 while (list != NULL) { |
148 member = (qq_buddy *) list->data; | 129 member = (qq_buddy *) list->data; |
149 if (_is_group_member_need_update_info(member)) | 130 if (_is_group_member_need_update_info(member)) |
150 bytes += create_packet_dw(raw_data, &cursor, member->uid); | 131 bytes += qq_put32(raw_data + bytes, member->uid); |
151 list = list->next; | 132 list = list->next; |
152 } | 133 } |
153 | 134 |
154 if (bytes != data_len) | 135 if (bytes != data_len) { |
155 purple_debug(PURPLE_DEBUG_ERROR, "QQ", | 136 purple_debug(PURPLE_DEBUG_ERROR, "QQ", |
156 "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_GET_MEMBER_INFO)); | 137 "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_GET_MEMBER_INFO)); |
157 else | 138 return; |
158 qq_send_group_cmd(gc, group, raw_data, data_len); | 139 } |
159 } | 140 |
160 | 141 qq_send_group_cmd(gc, group, raw_data, bytes); |
161 void qq_process_group_cmd_get_group_info(guint8 *data, guint8 **cursor, gint len, PurpleConnection *gc) | 142 } |
143 | |
144 void qq_process_group_cmd_get_group_info(guint8 *data, gint len, PurpleConnection *gc) | |
162 { | 145 { |
163 qq_group *group; | 146 qq_group *group; |
164 qq_buddy *member; | 147 qq_buddy *member; |
165 qq_data *qd; | 148 qq_data *qd; |
166 PurpleConversation *purple_conv; | 149 PurpleConversation *purple_conv; |
167 guint8 organization, role; | 150 guint8 organization, role; |
168 guint16 unknown, max_members; | 151 guint16 unknown, max_members; |
169 guint32 member_uid, internal_group_id, external_group_id; | 152 guint32 member_uid, internal_group_id, external_group_id; |
170 GSList *pending_id; | 153 GSList *pending_id; |
171 gint pascal_len, i; | |
172 guint32 unknown4; | 154 guint32 unknown4; |
173 guint8 unknown1; | 155 guint8 unknown1; |
156 gint bytes, num; | |
174 | 157 |
175 g_return_if_fail(data != NULL && len > 0); | 158 g_return_if_fail(data != NULL && len > 0); |
176 qd = (qq_data *) gc->proto_data; | 159 qd = (qq_data *) gc->proto_data; |
177 | 160 |
178 read_packet_dw(data, cursor, len, &(internal_group_id)); | 161 bytes = 0; |
162 bytes += qq_get32(&(internal_group_id), data + bytes); | |
179 g_return_if_fail(internal_group_id > 0); | 163 g_return_if_fail(internal_group_id > 0); |
180 read_packet_dw(data, cursor, len, &(external_group_id)); | 164 |
165 bytes += qq_get32(&(external_group_id), data + bytes); | |
181 g_return_if_fail(internal_group_id > 0); | 166 g_return_if_fail(internal_group_id > 0); |
182 | 167 |
183 pending_id = qq_get_pending_id(qd->adding_groups_from_server, internal_group_id); | 168 pending_id = qq_get_pending_id(qd->adding_groups_from_server, internal_group_id); |
184 if (pending_id != NULL) { | 169 if (pending_id != NULL) { |
185 qq_set_pending_id(&qd->adding_groups_from_server, internal_group_id, FALSE); | 170 qq_set_pending_id(&qd->adding_groups_from_server, internal_group_id, FALSE); |
187 } | 172 } |
188 | 173 |
189 group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); | 174 group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); |
190 g_return_if_fail(group != NULL); | 175 g_return_if_fail(group != NULL); |
191 | 176 |
192 read_packet_b(data, cursor, len, &(group->group_type)); | 177 bytes += qq_get8(&(group->group_type), data + bytes); |
193 read_packet_dw(data, cursor, len, &unknown4); /* unknown 4 bytes */ | 178 bytes += qq_get32(&unknown4, data + bytes); /* unknown 4 bytes */ |
194 read_packet_dw(data, cursor, len, &(group->creator_uid)); | 179 bytes += qq_get32(&(group->creator_uid), data + bytes); |
195 read_packet_b(data, cursor, len, &(group->auth_type)); | 180 bytes += qq_get8(&(group->auth_type), data + bytes); |
196 read_packet_dw(data, cursor, len, &unknown4); /* oldCategory */ | 181 bytes += qq_get32(&unknown4, data + bytes); /* oldCategory */ |
197 read_packet_w(data, cursor, len, &unknown); | 182 bytes += qq_get16(&unknown, data + bytes); |
198 read_packet_dw(data, cursor, len, &(group->group_category)); | 183 bytes += qq_get32(&(group->group_category), data + bytes); |
199 read_packet_w(data, cursor, len, &max_members); | 184 bytes += qq_get16(&max_members, data + bytes); |
200 read_packet_b(data, cursor, len, &unknown1); | 185 bytes += qq_get8(&unknown1, data + bytes); |
201 read_packet_dw(data, cursor, len, &(unknown4)); /* versionID */ | 186 bytes += qq_get32(&(unknown4), data + bytes); /* versionID */ |
202 | 187 |
203 pascal_len = convert_as_pascal_string(*cursor, &(group->group_name_utf8), QQ_CHARSET_DEFAULT); | 188 /* strlen + <str content> */ |
204 *cursor += pascal_len; | 189 bytes += convert_as_pascal_string(data + bytes, &(group->group_name_utf8), QQ_CHARSET_DEFAULT); |
205 read_packet_w(data, cursor, len, &(unknown)); /* 0x0000 */ | 190 bytes += qq_get16(&unknown, data + bytes); /* 0x0000 */ |
206 pascal_len = convert_as_pascal_string(*cursor, &(group->notice_utf8), QQ_CHARSET_DEFAULT); | 191 bytes += convert_as_pascal_string(data + bytes, &(group->notice_utf8), QQ_CHARSET_DEFAULT); |
207 *cursor += pascal_len; | 192 bytes += convert_as_pascal_string(data + bytes, &(group->group_desc_utf8), QQ_CHARSET_DEFAULT); |
208 pascal_len = convert_as_pascal_string(*cursor, &(group->group_desc_utf8), QQ_CHARSET_DEFAULT); | 193 |
209 *cursor += pascal_len; | 194 num = 0; |
210 | |
211 i = 0; | |
212 /* now comes the member list separated by 0x00 */ | 195 /* now comes the member list separated by 0x00 */ |
213 while (*cursor < data + len) { | 196 while (bytes < len) { |
214 read_packet_dw(data, cursor, len, &member_uid); | 197 bytes += qq_get32(&member_uid, data + bytes); |
215 i++; | 198 num++; |
216 read_packet_b(data, cursor, len, &organization); | 199 bytes += qq_get8(&organization, data + bytes); |
217 read_packet_b(data, cursor, len, &role); | 200 bytes += qq_get8(&role, data + bytes); |
218 | 201 |
219 if(organization != 0 || role != 0) { | 202 if(organization != 0 || role != 0) { |
220 purple_debug(PURPLE_DEBUG_INFO, "QQ", "group member %d: organization=%d, role=%d\n", member_uid, organization, role); | 203 purple_debug(PURPLE_DEBUG_INFO, "QQ", "group member %d: organization=%d, role=%d\n", member_uid, organization, role); |
221 } | 204 } |
222 member = qq_group_find_or_add_member(gc, group, member_uid); | 205 member = qq_group_find_or_add_member(gc, group, member_uid); |
223 if (member != NULL) | 206 if (member != NULL) |
224 member->role = role; | 207 member->role = role; |
225 } | 208 } |
226 if(*cursor > (data + len)) { | 209 if(bytes > len) { |
227 purple_debug(PURPLE_DEBUG_ERROR, "QQ", "group_cmd_get_group_info: Dangerous error! maybe protocol changed, notify me!"); | 210 purple_debug(PURPLE_DEBUG_ERROR, "QQ", "group_cmd_get_group_info: Dangerous error! maybe protocol changed, notify me!"); |
228 } | 211 } |
229 | 212 |
230 purple_debug(PURPLE_DEBUG_INFO, "QQ", "group \"%s\" has %d members\n", group->group_name_utf8, i); | 213 purple_debug(PURPLE_DEBUG_INFO, "QQ", "group \"%s\" has %d members\n", group->group_name_utf8, num); |
231 | 214 |
232 if (group->creator_uid == qd->uid) | 215 if (group->creator_uid == qd->uid) |
233 group->my_status = QQ_GROUP_MEMBER_STATUS_IS_ADMIN; | 216 group->my_status = QQ_GROUP_MEMBER_STATUS_IS_ADMIN; |
234 | 217 |
235 qq_group_refresh(gc, group); | 218 qq_group_refresh(gc, group); |
236 | 219 |
237 purple_conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, | 220 purple_conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, |
238 group->group_name_utf8, purple_connection_get_account(gc)); | 221 group->group_name_utf8, purple_connection_get_account(gc)); |
239 if(NULL == purple_conv) { | 222 if(NULL == purple_conv) { |
240 purple_debug(PURPLE_DEBUG_WARNING, "QQ", | 223 purple_debug(PURPLE_DEBUG_WARNING, "QQ", |
241 "Conv windows for \"%s\" is not on, do not set topic\n", group->group_name_utf8); | 224 "Conv windows for \"%s\" is not on, do not set topic\n", group->group_name_utf8); |
242 } | 225 } |
243 else { | 226 else { |
244 purple_conv_chat_set_topic(PURPLE_CONV_CHAT(purple_conv), NULL, group->notice_utf8); | 227 purple_conv_chat_set_topic(PURPLE_CONV_CHAT(purple_conv), NULL, group->notice_utf8); |
245 } | 228 } |
246 } | 229 } |
247 | 230 |
248 void qq_process_group_cmd_get_online_members(guint8 *data, guint8 **cursor, gint len, PurpleConnection *gc) | 231 void qq_process_group_cmd_get_online_members(guint8 *data, gint len, PurpleConnection *gc) |
249 { | 232 { |
250 guint32 internal_group_id, member_uid; | 233 guint32 internal_group_id, member_uid; |
251 guint8 unknown; | 234 guint8 unknown; |
252 gint bytes, i; | 235 gint bytes, num; |
253 qq_group *group; | 236 qq_group *group; |
254 qq_buddy *member; | 237 qq_buddy *member; |
255 | 238 |
256 g_return_if_fail(data != NULL && len > 0); | 239 g_return_if_fail(data != NULL && len > 0); |
257 | 240 |
258 if (data + len - *cursor < 4) { | 241 if (len <= 3) { |
259 purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Invalid group online member reply, discard it!\n"); | 242 purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Invalid group online member reply, discard it!\n"); |
260 return; | 243 return; |
261 } | 244 } |
262 | 245 |
263 bytes = 0; | 246 bytes = 0; |
264 i = 0; | 247 bytes += qq_get32(&internal_group_id, data + bytes); |
265 bytes += read_packet_dw(data, cursor, len, &internal_group_id); | 248 bytes += qq_get8(&unknown, data + bytes); /* 0x3c ?? */ |
266 bytes += read_packet_b(data, cursor, len, &unknown); /* 0x3c ?? */ | |
267 g_return_if_fail(internal_group_id > 0); | 249 g_return_if_fail(internal_group_id > 0); |
268 | 250 |
269 group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); | 251 group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); |
270 if (group == NULL) { | 252 if (group == NULL) { |
271 purple_debug(PURPLE_DEBUG_ERROR, "QQ", | 253 purple_debug(PURPLE_DEBUG_ERROR, "QQ", |
273 return; | 255 return; |
274 } | 256 } |
275 | 257 |
276 /* set all offline first, then update those online */ | 258 /* set all offline first, then update those online */ |
277 _qq_group_set_members_all_offline(group); | 259 _qq_group_set_members_all_offline(group); |
278 while (*cursor < data + len) { | 260 num = 0; |
279 bytes += read_packet_dw(data, cursor, len, &member_uid); | 261 while (bytes < len) { |
280 i++; | 262 bytes += qq_get32(&member_uid, data + bytes); |
263 num++; | |
281 member = qq_group_find_or_add_member(gc, group, member_uid); | 264 member = qq_group_find_or_add_member(gc, group, member_uid); |
282 if (member != NULL) | 265 if (member != NULL) |
283 member->status = QQ_BUDDY_ONLINE_NORMAL; | 266 member->status = QQ_BUDDY_ONLINE_NORMAL; |
284 } | 267 } |
285 if(*cursor > (data + len)) { | 268 if(bytes > len) { |
286 purple_debug(PURPLE_DEBUG_ERROR, "QQ", | 269 purple_debug(PURPLE_DEBUG_ERROR, "QQ", |
287 "group_cmd_get_online_members: Dangerous error! maybe protocol changed, notify developers!"); | 270 "group_cmd_get_online_members: Dangerous error! maybe protocol changed, notify developers!"); |
288 } | 271 } |
289 | 272 |
290 purple_debug(PURPLE_DEBUG_INFO, "QQ", "Group \"%s\" has %d online members\n", group->group_name_utf8, i); | 273 purple_debug(PURPLE_DEBUG_INFO, "QQ", "Group \"%s\" has %d online members\n", group->group_name_utf8, num); |
291 } | 274 } |
292 | 275 |
293 /* process the reply to get_members_info packet */ | 276 /* process the reply to get_members_info packet */ |
294 void qq_process_group_cmd_get_members_info(guint8 *data, guint8 **cursor, gint len, PurpleConnection *gc) | 277 void qq_process_group_cmd_get_members_info(guint8 *data, gint len, PurpleConnection *gc) |
295 { | 278 { |
279 gint bytes; | |
280 gint num; | |
296 guint32 internal_group_id, member_uid; | 281 guint32 internal_group_id, member_uid; |
297 guint16 unknown; | 282 guint16 unknown; |
298 gint pascal_len, i; | |
299 qq_group *group; | 283 qq_group *group; |
300 qq_buddy *member; | 284 qq_buddy *member; |
301 | 285 |
302 g_return_if_fail(data != NULL && len > 0); | 286 g_return_if_fail(data != NULL && len > 0); |
303 | 287 |
304 read_packet_dw(data, cursor, len, &internal_group_id); | 288 bytes = 0; |
289 bytes += qq_get32(&internal_group_id, data + bytes); | |
305 g_return_if_fail(internal_group_id > 0); | 290 g_return_if_fail(internal_group_id > 0); |
306 | 291 |
307 group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); | 292 group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); |
308 g_return_if_fail(group != NULL); | 293 g_return_if_fail(group != NULL); |
309 | 294 |
310 i = 0; | 295 num = 0; |
311 /* now starts the member info, as get buddy list reply */ | 296 /* now starts the member info, as get buddy list reply */ |
312 while (*cursor < data + len) { | 297 while (bytes < len) { |
313 read_packet_dw(data, cursor, len, &member_uid); | 298 bytes += qq_get32(&member_uid, data + bytes); |
314 g_return_if_fail(member_uid > 0); | 299 g_return_if_fail(member_uid > 0); |
315 member = qq_group_find_member_by_uid(group, member_uid); | 300 member = qq_group_find_member_by_uid(group, member_uid); |
316 g_return_if_fail(member != NULL); | 301 g_return_if_fail(member != NULL); |
317 | 302 |
318 i++; | 303 num++; |
319 read_packet_w(data, cursor, len, &(member->face)); | 304 bytes += qq_get16(&(member->face), data + bytes); |
320 read_packet_b(data, cursor, len, &(member->age)); | 305 bytes += qq_get8(&(member->age), data + bytes); |
321 read_packet_b(data, cursor, len, &(member->gender)); | 306 bytes += qq_get8(&(member->gender), data + bytes); |
322 pascal_len = convert_as_pascal_string(*cursor, &(member->nickname), QQ_CHARSET_DEFAULT); | 307 bytes += convert_as_pascal_string(data + bytes, &(member->nickname), QQ_CHARSET_DEFAULT); |
323 *cursor += pascal_len; | 308 bytes += qq_get16(&unknown, data + bytes); |
324 read_packet_w(data, cursor, len, &unknown); | 309 bytes += qq_get8(&(member->flag1), data + bytes); |
325 read_packet_b(data, cursor, len, &(member->flag1)); | 310 bytes += qq_get8(&(member->comm_flag), data + bytes); |
326 read_packet_b(data, cursor, len, &(member->comm_flag)); | |
327 | 311 |
328 member->last_refresh = time(NULL); | 312 member->last_refresh = time(NULL); |
329 } | 313 } |
330 if(*cursor > (data + len)) { | 314 if(bytes > len) { |
331 purple_debug(PURPLE_DEBUG_ERROR, "QQ", | 315 purple_debug(PURPLE_DEBUG_ERROR, "QQ", |
332 "group_cmd_get_members_info: Dangerous error! maybe protocol changed, notify developers!"); | 316 "group_cmd_get_members_info: Dangerous error! maybe protocol changed, notify developers!"); |
333 } | 317 } |
334 purple_debug(PURPLE_DEBUG_INFO, "QQ", "Group \"%s\" obtained %d member info\n", group->group_name_utf8, i); | 318 purple_debug(PURPLE_DEBUG_INFO, "QQ", "Group \"%s\" obtained %d member info\n", group->group_name_utf8, num); |
335 } | 319 } |