Mercurial > pidgin
comparison libpurple/protocols/qq/qq_process.c @ 24145:ec3f7d3e0445
2008.10.04 - lonicerae <lonicerae(at)gmail.com>
* fixed a bug in qq_base.c
author | SHiNE CsyFeK <csyfek@gmail.com> |
---|---|
date | Wed, 22 Oct 2008 14:49:38 +0000 |
parents | a95c7e71064c |
children | ce94189f15ad |
comparison
equal
deleted
inserted
replaced
24144:a95c7e71064c | 24145:ec3f7d3e0445 |
---|---|
56 QQ_ROOM_CMD_REPLY_SEARCH_ERROR = 0x02, | 56 QQ_ROOM_CMD_REPLY_SEARCH_ERROR = 0x02, |
57 QQ_ROOM_CMD_REPLY_NOT_MEMBER = 0x0a | 57 QQ_ROOM_CMD_REPLY_NOT_MEMBER = 0x0a |
58 }; | 58 }; |
59 | 59 |
60 /* default process, decrypt and dump */ | 60 /* default process, decrypt and dump */ |
61 static void process_unknow_cmd(PurpleConnection *gc,const gchar *title, guint8 *data, gint data_len, guint16 cmd, guint16 seq) | 61 static void process_cmd_unknow(PurpleConnection *gc,const gchar *title, guint8 *data, gint data_len, guint16 cmd, guint16 seq) |
62 { | 62 { |
63 qq_data *qd; | 63 qq_data *qd; |
64 gchar *msg_utf8 = NULL; | 64 gchar *msg_utf8 = NULL; |
65 | 65 |
66 g_return_if_fail(data != NULL && data_len != 0); | 66 g_return_if_fail(data != NULL && data_len != 0); |
79 purple_notify_info(gc, _("QQ Error"), title, msg_utf8); | 79 purple_notify_info(gc, _("QQ Error"), title, msg_utf8); |
80 g_free(msg_utf8); | 80 g_free(msg_utf8); |
81 } | 81 } |
82 } | 82 } |
83 | 83 |
84 /* parse the reply to send_im */ | |
85 static void do_im_ack(guint8 *data, gint data_len, PurpleConnection *gc) | |
86 { | |
87 qq_data *qd; | |
88 | |
89 g_return_if_fail(data != NULL && data_len != 0); | |
90 | |
91 qd = gc->proto_data; | |
92 | |
93 if (data[0] != 0) { | |
94 purple_debug_warning("QQ", "Failed sent IM\n"); | |
95 purple_notify_error(gc, _("Error"), _("Failed to send IM."), NULL); | |
96 return; | |
97 } | |
98 | |
99 purple_debug_info("QQ", "OK sent IM\n"); | |
100 } | |
101 | |
102 static void do_server_news(guint8 *data, gint data_len, PurpleConnection *gc) | |
103 { | |
104 qq_data *qd = (qq_data *) gc->proto_data; | |
105 gint bytes; | |
106 guint8 *temp; | |
107 guint8 temp_len; | |
108 gchar *title, *brief, *url; | |
109 gchar *title_utf8; | |
110 gchar *content, *content_utf8; | |
111 | |
112 g_return_if_fail(data != NULL && data_len != 0); | |
113 | |
114 /* qq_show_packet("Rcv news", data, data_len); */ | |
115 | |
116 temp = g_newa(guint8, data_len); | |
117 bytes = 4; /* ignore unknown 4 bytes */ | |
118 | |
119 bytes += qq_get8(&temp_len, data + bytes); | |
120 g_return_if_fail(bytes + temp_len <= data_len); | |
121 bytes += qq_getdata(temp, temp_len, data+bytes); | |
122 title = g_strndup((gchar *)temp, temp_len); | |
123 | |
124 bytes += qq_get8(&temp_len, data + bytes); | |
125 g_return_if_fail(bytes + temp_len <= data_len); | |
126 bytes += qq_getdata(temp, temp_len, data+bytes); | |
127 brief = g_strndup((gchar *)temp, temp_len); | |
128 | |
129 bytes += qq_get8(&temp_len, data + bytes); | |
130 g_return_if_fail(bytes + temp_len <= data_len); | |
131 bytes += qq_getdata(temp, temp_len, data+bytes); | |
132 url = g_strndup((gchar *)temp, temp_len); | |
133 | |
134 title_utf8 = qq_to_utf8(title, QQ_CHARSET_DEFAULT); | |
135 content = g_strdup_printf(_("Server News:\n%s\n%s\n%s"), title, brief, url); | |
136 content_utf8 = qq_to_utf8(content, QQ_CHARSET_DEFAULT); | |
137 | |
138 if (qd->is_show_news) { | |
139 qq_got_attention(gc, content_utf8); | |
140 } else { | |
141 purple_debug_info("QQ", "QQ Server news:\n%s\n%s", title_utf8, content_utf8); | |
142 } | |
143 g_free(title); | |
144 g_free(title_utf8); | |
145 g_free(brief); | |
146 g_free(url); | |
147 g_free(content); | |
148 g_free(content_utf8); | |
149 } | |
150 | |
151 static void do_msg_sys_30(PurpleConnection *gc, guint8 *data, gint data_len) | |
152 { | |
153 gint len; | |
154 guint8 reply; | |
155 gchar **segments, *msg_utf8; | |
156 | |
157 g_return_if_fail(data != NULL && data_len != 0); | |
158 | |
159 len = data_len; | |
160 | |
161 if (NULL == (segments = split_data(data, len, "\x2f", 2))) | |
162 return; | |
163 | |
164 reply = strtol(segments[0], NULL, 10); | |
165 if (reply == 1) | |
166 purple_debug_warning("QQ", "We are kicked out by QQ server\n"); | |
167 | |
168 msg_utf8 = qq_to_utf8(segments[1], QQ_CHARSET_DEFAULT); | |
169 qq_got_attention(gc, msg_utf8); | |
170 } | |
171 | |
172 static void do_msg_sys_4c(PurpleConnection *gc, guint8 *data, gint data_len) | |
173 { | |
174 gint bytes; | |
175 gint msg_len; | |
176 GString *content; | |
177 gchar *msg = NULL; | |
178 | |
179 g_return_if_fail(data != NULL && data_len > 0); | |
180 | |
181 bytes = 6; /* skip 0x(06 00 01 1e 01 1c)*/ | |
182 | |
183 content = g_string_new(""); | |
184 while (bytes < data_len) { | |
185 msg_len = qq_get_vstr(&msg, QQ_CHARSET_DEFAULT, data + bytes); | |
186 g_string_append(content, msg); | |
187 g_string_append(content, "\n"); | |
188 g_free(msg); | |
189 | |
190 if (msg_len <= 1) { | |
191 break; | |
192 } | |
193 bytes += msg_len; | |
194 } | |
195 if (bytes != data_len) { | |
196 purple_debug_warning("QQ", "Failed to read QQ_MSG_SYS_4C\n"); | |
197 qq_show_packet("do_msg_sys_4c", data, data_len); | |
198 } | |
199 qq_got_attention(gc, content->str); | |
200 g_string_free(content, FALSE); | |
201 } | |
202 | |
203 static const gchar *get_im_type_desc(gint type) | |
204 { | |
205 switch (type) { | |
206 case QQ_MSG_TO_BUDDY: | |
207 return "QQ_MSG_TO_BUDDY"; | |
208 case QQ_MSG_TO_UNKNOWN: | |
209 return "QQ_MSG_TO_UNKNOWN"; | |
210 case QQ_MSG_UNKNOWN_QUN_IM: | |
211 return "QQ_MSG_UNKNOWN_QUN_IM"; | |
212 case QQ_MSG_ADD_TO_QUN: | |
213 return "QQ_MSG_ADD_TO_QUN"; | |
214 case QQ_MSG_DEL_FROM_QUN: | |
215 return "QQ_MSG_DEL_FROM_QUN"; | |
216 case QQ_MSG_APPLY_ADD_TO_QUN: | |
217 return "QQ_MSG_APPLY_ADD_TO_QUN"; | |
218 case QQ_MSG_CREATE_QUN: | |
219 return "QQ_MSG_CREATE_QUN"; | |
220 case QQ_MSG_SYS_30: | |
221 return "QQ_MSG_SYS_30"; | |
222 case QQ_MSG_SYS_4C: | |
223 return "QQ_MSG_SYS_4C"; | |
224 case QQ_MSG_APPROVE_APPLY_ADD_TO_QUN: | |
225 return "QQ_MSG_APPROVE_APPLY_ADD_TO_QUN"; | |
226 case QQ_MSG_REJCT_APPLY_ADD_TO_QUN: | |
227 return "QQ_MSG_REJCT_APPLY_ADD_TO_QUN"; | |
228 case QQ_MSG_TEMP_QUN_IM: | |
229 return "QQ_MSG_TEMP_QUN_IM"; | |
230 case QQ_MSG_QUN_IM: | |
231 return "QQ_MSG_QUN_IM"; | |
232 case QQ_MSG_NEWS: | |
233 return "QQ_MSG_NEWS"; | |
234 case QQ_MSG_EXTEND: | |
235 return "QQ_MSG_EXTEND"; | |
236 case QQ_MSG_EXTEND_85: | |
237 return "QQ_MSG_EXTEND_85"; | |
238 default: | |
239 return "QQ_MSG_UNKNOWN"; | |
240 } | |
241 } | |
242 | |
243 /* I receive a message, mainly it is text msg, | |
244 * but we need to proess other types (group etc) */ | |
245 static void process_private_msg(guint8 *data, gint data_len, guint16 seq, PurpleConnection *gc) | |
246 { | |
247 qq_data *qd; | |
248 gint bytes; | |
249 | |
250 struct { | |
251 guint32 uid_from; | |
252 guint32 uid_to; | |
253 guint32 seq; | |
254 struct in_addr ip_from; | |
255 guint16 port_from; | |
256 guint16 msg_type; | |
257 } header; | |
258 | |
259 g_return_if_fail(data != NULL && data_len != 0); | |
260 | |
261 qd = (qq_data *) gc->proto_data; | |
262 | |
263 if (data_len < 16) { /* we need to ack with the first 16 bytes */ | |
264 purple_debug_error("QQ", "MSG is too short\n"); | |
265 return; | |
266 } else { | |
267 /* when we receive a message, | |
268 * we send an ACK which is the first 16 bytes of incoming packet */ | |
269 qq_send_server_reply(gc, QQ_CMD_RECV_IM, seq, data, 16); | |
270 } | |
271 | |
272 /* check len first */ | |
273 if (data_len < 20) { /* length of im_header */ | |
274 purple_debug_error("QQ", "Invald MSG header, len %d < 20\n", data_len); | |
275 return; | |
276 } | |
277 | |
278 bytes = 0; | |
279 bytes += qq_get32(&(header.uid_from), data + bytes); | |
280 bytes += qq_get32(&(header.uid_to), data + bytes); | |
281 bytes += qq_get32(&(header.seq), data + bytes); | |
282 /* if the message is delivered via server, it is server IP/port */ | |
283 bytes += qq_getIP(&(header.ip_from), data + bytes); | |
284 bytes += qq_get16(&(header.port_from), data + bytes); | |
285 bytes += qq_get16(&(header.msg_type), data + bytes); | |
286 /* im_header prepared */ | |
287 | |
288 if (header.uid_to != qd->uid) { /* should not happen */ | |
289 purple_debug_error("QQ", "MSG to [%d], NOT me\n", header.uid_to); | |
290 return; | |
291 } | |
292 | |
293 /* check bytes */ | |
294 if (bytes >= data_len - 1) { | |
295 purple_debug_warning("QQ", "Empty MSG\n"); | |
296 return; | |
297 } | |
298 | |
299 switch (header.msg_type) { | |
300 case QQ_MSG_NEWS: | |
301 do_server_news(data + bytes, data_len - bytes, gc); | |
302 break; | |
303 case QQ_MSG_EXTEND: | |
304 case QQ_MSG_EXTEND_85: | |
305 purple_debug_info("QQ", "MSG from buddy [%d]\n", header.uid_from); | |
306 qq_process_extend_im(gc, data + bytes, data_len - bytes); | |
307 break; | |
308 case QQ_MSG_TO_UNKNOWN: | |
309 case QQ_MSG_TO_BUDDY: | |
310 purple_debug_info("QQ", "MSG from buddy [%d]\n", header.uid_from); | |
311 qq_process_im(gc, data + bytes, data_len - bytes); | |
312 break; | |
313 case QQ_MSG_UNKNOWN_QUN_IM: | |
314 case QQ_MSG_TEMP_QUN_IM: | |
315 case QQ_MSG_QUN_IM: | |
316 purple_debug_info("QQ", "MSG from room [%d]\n", header.uid_from); | |
317 qq_process_room_msg_normal(data + bytes, data_len - bytes, header.uid_from, gc, header.msg_type); | |
318 break; | |
319 case QQ_MSG_ADD_TO_QUN: | |
320 purple_debug_info("QQ", "Notice from [%d], Added\n", header.uid_from); | |
321 /* uid_from is group id | |
322 * we need this to create a dummy group and add to blist */ | |
323 qq_process_room_msg_been_added(data + bytes, data_len - bytes, header.uid_from, gc); | |
324 break; | |
325 case QQ_MSG_DEL_FROM_QUN: | |
326 purple_debug_info("QQ", "Notice from room [%d], Removed\n", header.uid_from); | |
327 /* uid_from is group id */ | |
328 qq_process_room_msg_been_removed(data + bytes, data_len - bytes, header.uid_from, gc); | |
329 break; | |
330 case QQ_MSG_APPLY_ADD_TO_QUN: | |
331 purple_debug_info("QQ", "Notice from room [%d], Joined\n", header.uid_from); | |
332 /* uid_from is group id */ | |
333 qq_process_room_msg_apply_join(data + bytes, data_len - bytes, header.uid_from, gc); | |
334 break; | |
335 case QQ_MSG_APPROVE_APPLY_ADD_TO_QUN: | |
336 purple_debug_info("QQ", "Notice from room [%d], Confirm add in\n", | |
337 header.uid_from); | |
338 /* uid_from is group id */ | |
339 qq_process_room_msg_been_approved(data + bytes, data_len - bytes, header.uid_from, gc); | |
340 break; | |
341 case QQ_MSG_REJCT_APPLY_ADD_TO_QUN: | |
342 purple_debug_info("QQ", "Notice from room [%d], Refuse add in\n", | |
343 header.uid_from); | |
344 /* uid_from is group id */ | |
345 qq_process_room_msg_been_rejected(data + bytes, data_len - bytes, header.uid_from, gc); | |
346 break; | |
347 case QQ_MSG_SYS_30: | |
348 do_msg_sys_30(gc, data + bytes, data_len - bytes); | |
349 break; | |
350 case QQ_MSG_SYS_4C: | |
351 do_msg_sys_4c(gc, data + bytes, data_len - bytes); | |
352 break; | |
353 default: | |
354 purple_debug_warning("QQ", "MSG from [%d], unknown type %s [0x%04X]\n", | |
355 header.uid_from, get_im_type_desc(header.msg_type), header.msg_type); | |
356 qq_show_packet("Unknown MSG type", data, data_len); | |
357 break; | |
358 } | |
359 } | |
360 | |
361 /* Send ACK if the sys message needs an ACK */ | 84 /* Send ACK if the sys message needs an ACK */ |
362 static void request_server_ack(PurpleConnection *gc, guint8 code, guint32 from, guint16 seq) | 85 static void ack_server_msg(PurpleConnection *gc, guint8 code, guint32 from, guint16 seq) |
363 { | 86 { |
364 qq_data *qd; | 87 qq_data *qd; |
365 guint8 bar, *ack; | 88 guint8 bar, *ack; |
366 gchar *str; | 89 gchar *str; |
367 gint ack_len, bytes; | 90 gint ack_len, bytes; |
387 else | 110 else |
388 purple_debug_error("QQ", | 111 purple_debug_error("QQ", |
389 "Fail creating sys msg ACK, expect %d bytes, build %d bytes\n", ack_len, bytes); | 112 "Fail creating sys msg ACK, expect %d bytes, build %d bytes\n", ack_len, bytes); |
390 } | 113 } |
391 | 114 |
392 static void do_server_notice(PurpleConnection *gc, gchar *from, gchar *to, gchar *msg_utf8) | 115 static void process_server_notice(PurpleConnection *gc, gchar *from, gchar *to, gchar *msg_utf8) |
393 { | 116 { |
394 qq_data *qd = (qq_data *) gc->proto_data; | 117 qq_data *qd = (qq_data *) gc->proto_data; |
395 gchar *title, *content; | 118 gchar *title, *content; |
396 | 119 |
397 g_return_if_fail(from != NULL && to != NULL); | 120 g_return_if_fail(from != NULL && to != NULL); |
423 code = segments[0]; | 146 code = segments[0]; |
424 from = segments[1]; | 147 from = segments[1]; |
425 to = segments[2]; | 148 to = segments[2]; |
426 msg = segments[3]; | 149 msg = segments[3]; |
427 | 150 |
428 request_server_ack(gc, code[0], strtol(from, NULL, 10), seq); | 151 ack_server_msg(gc, code[0], strtol(from, NULL, 10), seq); |
429 | 152 |
430 if (strtol(to, NULL, 10) != qd->uid) { /* not to me */ | 153 if (strtol(to, NULL, 10) != qd->uid) { /* not to me */ |
431 purple_debug_error("QQ", "Recv sys msg to [%s], not me!, discard\n", to); | 154 purple_debug_error("QQ", "Recv sys msg to [%s], not me!, discard\n", to); |
432 g_strfreev(segments); | 155 g_strfreev(segments); |
433 return; | 156 return; |
448 case QQ_SERVER_BUDDY_ADDED_ME: | 171 case QQ_SERVER_BUDDY_ADDED_ME: |
449 case QQ_SERVER_BUDDY_REJECTED_ME: | 172 case QQ_SERVER_BUDDY_REJECTED_ME: |
450 qq_process_buddy_from_server(gc, funct, from, to, msg_utf8); | 173 qq_process_buddy_from_server(gc, funct, from, to, msg_utf8); |
451 break; | 174 break; |
452 case QQ_SERVER_NOTICE: | 175 case QQ_SERVER_NOTICE: |
453 do_server_notice(gc, from, to, msg_utf8); | 176 process_server_notice(gc, from, to, msg_utf8); |
454 break; | 177 break; |
455 case QQ_SERVER_NEW_CLIENT: | 178 case QQ_SERVER_NEW_CLIENT: |
456 purple_debug_warning("QQ", "QQ Server has newer client version\n"); | 179 purple_debug_warning("QQ", "QQ Server has newer client version\n"); |
457 break; | 180 break; |
458 default: | 181 default: |
491 } | 214 } |
492 | 215 |
493 /* now process the packet */ | 216 /* now process the packet */ |
494 switch (cmd) { | 217 switch (cmd) { |
495 case QQ_CMD_RECV_IM: | 218 case QQ_CMD_RECV_IM: |
496 process_private_msg(data, data_len, seq, gc); | 219 qq_process_recv_im(data, data_len, seq, gc); |
497 break; | 220 break; |
498 case QQ_CMD_RECV_MSG_SYS: | 221 case QQ_CMD_RECV_MSG_SYS: |
499 process_server_msg(data, data_len, seq, gc); | 222 process_server_msg(data, data_len, seq, gc); |
500 break; | 223 break; |
501 case QQ_CMD_BUDDY_CHANGE_STATUS: | 224 case QQ_CMD_BUDDY_CHANGE_STATUS: |
502 qq_process_buddy_change_status(data, data_len, gc); | 225 qq_process_buddy_change_status(data, data_len, gc); |
503 break; | 226 break; |
504 default: | 227 default: |
505 process_unknow_cmd(gc, _("Unknow SERVER CMD"), data, data_len, cmd, seq); | 228 process_cmd_unknow(gc, _("Unknow SERVER CMD"), data, data_len, cmd, seq); |
506 break; | 229 break; |
507 } | 230 } |
508 } | 231 } |
509 | 232 |
510 static void process_room_cmd_notify(PurpleConnection *gc, | 233 static void process_room_cmd_notify(PurpleConnection *gc, |
896 } | 619 } |
897 break; | 620 break; |
898 case QQ_CMD_LOGIN: | 621 case QQ_CMD_LOGIN: |
899 default: | 622 default: |
900 if (qd->client_version >= 2007) { | 623 if (qd->client_version >= 2007) { |
624 purple_debug_warning("QQ", "Decrypt login packet by pwd_twice_md5\n"); | |
901 data_len = qq_decrypt(data, rcved, rcved_len, qd->ld.pwd_twice_md5); | 625 data_len = qq_decrypt(data, rcved, rcved_len, qd->ld.pwd_twice_md5); |
626 | |
902 if (data_len >= 0) { | 627 if (data_len >= 0) { |
903 purple_debug_warning("QQ", "Decrypt login packet by pwd_twice_md5\n"); | 628 purple_debug_warning("QQ", "Dpwd_twice_md5 *OK*\n"); |
904 } else { | 629 } |
630 else { | |
631 purple_debug_warning("QQ", "Dpwd_twice_md5 *FAILED*, try login_key, last data_len=%d\n", data_len); | |
905 data_len = qq_decrypt(data, rcved, rcved_len, qd->ld.login_key); | 632 data_len = qq_decrypt(data, rcved, rcved_len, qd->ld.login_key); |
633 | |
906 if (data_len >= 0) { | 634 if (data_len >= 0) { |
907 purple_debug_warning("QQ", "Decrypt login packet by login_key\n"); | 635 purple_debug_warning("QQ", "Dlogin_key *OK*\n"); |
636 } | |
637 else { | |
638 purple_debug_warning("QQ", "Dlogin_key *FAILED*\n"); | |
908 } | 639 } |
909 } | 640 } |
910 } else { | 641 } |
642 else { | |
911 /* May use password_twice_md5 in the past version like QQ2005 */ | 643 /* May use password_twice_md5 in the past version like QQ2005 */ |
912 data_len = qq_decrypt(data, rcved, rcved_len, qd->ld.random_key); | 644 data_len = qq_decrypt(data, rcved, rcved_len, qd->ld.random_key); |
913 if (data_len >= 0) { | 645 if (data_len >= 0) { |
914 purple_debug_warning("QQ", "Decrypt login packet by random_key\n"); | 646 purple_debug_warning("QQ", "Decrypt login packet by random_key\n"); |
915 } else { | 647 } else { |
931 PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR, | 663 PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR, |
932 _("Can not decrypt login reply")); | 664 _("Can not decrypt login reply")); |
933 return QQ_LOGIN_REPLY_ERR; | 665 return QQ_LOGIN_REPLY_ERR; |
934 } | 666 } |
935 | 667 |
668 purple_debug_warning("QQ", "we are processing: 0x%02x\n", cmd); | |
936 switch (cmd) { | 669 switch (cmd) { |
937 case QQ_CMD_GET_SERVER: | 670 case QQ_CMD_GET_SERVER: |
938 ret_8 = qq_process_get_server(gc, data, data_len); | 671 ret_8 = qq_process_get_server(gc, data, data_len); |
939 if ( ret_8 == QQ_LOGIN_REPLY_OK) { | 672 if ( ret_8 == QQ_LOGIN_REPLY_OK) { |
940 qq_request_token(gc); | 673 qq_request_token(gc); |
956 } | 689 } |
957 break; | 690 break; |
958 case QQ_CMD_CHECK_PWD: | 691 case QQ_CMD_CHECK_PWD: |
959 ret_8 = qq_process_check_pwd(gc, data, data_len); | 692 ret_8 = qq_process_check_pwd(gc, data, data_len); |
960 if (ret_8 != QQ_LOGIN_REPLY_OK) { | 693 if (ret_8 != QQ_LOGIN_REPLY_OK) { |
961 return ret_8; | 694 return ret_8; |
962 } | 695 } |
963 if (qd->client_version == 2008) { | 696 if (qd->client_version == 2008) { |
964 qq_request_login_2008(gc); | 697 qq_request_login_2008(gc); |
965 } else { | 698 } else { |
966 qq_request_login_2007(gc); | 699 qq_request_login_2007(gc); |
973 ret_8 = qq_process_login_2007(gc, data, data_len); | 706 ret_8 = qq_process_login_2007(gc, data, data_len); |
974 } else { | 707 } else { |
975 ret_8 = qq_process_login(gc, data, data_len); | 708 ret_8 = qq_process_login(gc, data, data_len); |
976 } | 709 } |
977 if (ret_8 != QQ_LOGIN_REPLY_OK) { | 710 if (ret_8 != QQ_LOGIN_REPLY_OK) { |
978 return ret_8; | 711 return ret_8; |
979 } | 712 } |
980 | 713 |
981 purple_connection_update_progress(gc, _("Logined"), QQ_CONNECT_STEPS - 1, QQ_CONNECT_STEPS); | 714 purple_connection_update_progress(gc, _("Logined"), QQ_CONNECT_STEPS - 1, QQ_CONNECT_STEPS); |
982 purple_debug_info("QQ", "Login repliess OK; everything is fine\n"); | 715 purple_debug_info("QQ", "Login repliess OK; everything is fine\n"); |
983 purple_connection_set_state(gc, PURPLE_CONNECTED); | 716 purple_connection_set_state(gc, PURPLE_CONNECTED); |
990 qq_trans_process_remained(gc); | 723 qq_trans_process_remained(gc); |
991 | 724 |
992 qq_update_all(gc, 0); | 725 qq_update_all(gc, 0); |
993 break; | 726 break; |
994 default: | 727 default: |
995 process_unknow_cmd(gc, _("Unknow LOGIN CMD"), data, data_len, cmd, seq); | 728 purple_debug_warning("QQ", "UNKNOWN LOGIN CMD: %d\n", cmd); |
729 process_cmd_unknow(gc, _("Unknow LOGIN CMD"), data, data_len, cmd, seq); | |
996 return QQ_LOGIN_REPLY_ERR; | 730 return QQ_LOGIN_REPLY_ERR; |
997 } | 731 } |
998 return QQ_LOGIN_REPLY_OK; | 732 return QQ_LOGIN_REPLY_OK; |
999 } | 733 } |
1000 | 734 |
1054 break; | 788 break; |
1055 case QQ_CMD_CHANGE_STATUS: | 789 case QQ_CMD_CHANGE_STATUS: |
1056 qq_process_change_status_reply(data, data_len, gc); | 790 qq_process_change_status_reply(data, data_len, gc); |
1057 break; | 791 break; |
1058 case QQ_CMD_SEND_IM: | 792 case QQ_CMD_SEND_IM: |
1059 do_im_ack(data, data_len, gc); | 793 qq_process_send_im_reply(data, data_len, gc); |
1060 break; | 794 break; |
1061 case QQ_CMD_KEEP_ALIVE: | 795 case QQ_CMD_KEEP_ALIVE: |
1062 if (qd->client_version >= 2008) { | 796 if (qd->client_version >= 2008) { |
1063 qq_process_keep_alive_2008(data, data_len, gc); | 797 qq_process_keep_alive_2008(data, data_len, gc); |
1064 } else if (qd->client_version >= 2007) { | 798 } else if (qd->client_version >= 2007) { |
1097 return; | 831 return; |
1098 } | 832 } |
1099 purple_debug_info("QQ", "All buddies and groups received\n"); | 833 purple_debug_info("QQ", "All buddies and groups received\n"); |
1100 break; | 834 break; |
1101 default: | 835 default: |
1102 process_unknow_cmd(gc, _("Unknow CLIENT CMD"), data, data_len, cmd, seq); | 836 process_cmd_unknow(gc, _("Unknow CLIENT CMD"), data, data_len, cmd, seq); |
1103 is_unknow = TRUE; | 837 is_unknow = TRUE; |
1104 break; | 838 break; |
1105 } | 839 } |
1106 if (is_unknow) | 840 if (is_unknow) |
1107 return; | 841 return; |