Tue, 24 Jun 2008 11:58:57 +0000
patch-02-fix-multiarch
*** patch-02-fix-multiarch ***
* Rewrite read_packet and create_packet functions, use qq_put and qq_get functions instead
* New logic in accord with protocol models to handle packets, some related functions rewritten
Apply patch from #5639.
Fix #303.
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
1 | /** |
|
15087
78879d4adf13
[gaim-migrate @ 17807]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14691
diff
changeset
|
2 | * @file buddy_list.c |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
3 | * |
| 15884 | 4 | * purple |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
5 | * |
| 15884 | 6 | * Purple is the legal property of its developers, whose names are too numerous |
|
15087
78879d4adf13
[gaim-migrate @ 17807]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14691
diff
changeset
|
7 | * to list here. Please refer to the COPYRIGHT file distributed with this |
|
78879d4adf13
[gaim-migrate @ 17807]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14691
diff
changeset
|
8 | * source distribution. |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
9 | * |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
10 | * This program is free software; you can redistribute it and/or modify |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
11 | * it under the terms of the GNU General Public License as published by |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
12 | * the Free Software Foundation; either version 2 of the License, or |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
13 | * (at your option) any later version. |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
14 | * |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
15 | * This program is distributed in the hope that it will be useful, |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
18 | * GNU General Public License for more details. |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
19 | * |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
20 | * You should have received a copy of the GNU General Public License |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
21 | * along with this program; if not, write to the Free Software |
|
19859
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
18273
diff
changeset
|
22 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
23 | */ |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
24 | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
25 | #include <string.h> |
|
18273
e61c53184c52
#include reorganizations to allow compiling with glib < 2.8 using the
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
16271
diff
changeset
|
26 | |
|
e61c53184c52
#include reorganizations to allow compiling with glib < 2.8 using the
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
16271
diff
changeset
|
27 | #include "qq.h" |
|
e61c53184c52
#include reorganizations to allow compiling with glib < 2.8 using the
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
16271
diff
changeset
|
28 | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
29 | #include "debug.h" |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
30 | #include "notify.h" |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
31 | #include "utils.h" |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
32 | #include "packet_parse.h" |
|
15200
a28a70a4e7ce
[gaim-migrate @ 17924]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
15133
diff
changeset
|
33 | #include "buddy_info.h" |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
34 | #include "buddy_list.h" |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
35 | #include "buddy_status.h" |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
36 | #include "buddy_opt.h" |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
37 | #include "char_conv.h" |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
38 | #include "crypt.h" |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
39 | #include "header_info.h" |
|
18273
e61c53184c52
#include reorganizations to allow compiling with glib < 2.8 using the
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
16271
diff
changeset
|
40 | #include "keep_alive.h" |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
41 | #include "send_core.h" |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
42 | #include "group.h" |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
43 | #include "group_find.h" |
|
14466
4fcd9fdc8060
[gaim-migrate @ 17112]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14327
diff
changeset
|
44 | #include "group_internal.h" |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
45 | #include "group_info.h" |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
46 | |
|
14051
6bc807df2a0a
[gaim-migrate @ 16562]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
13932
diff
changeset
|
47 | #include "qq_proxy.h" |
|
6bc807df2a0a
[gaim-migrate @ 16562]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
13932
diff
changeset
|
48 | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
49 | #define QQ_GET_ONLINE_BUDDY_02 0x02 |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
50 | #define QQ_GET_ONLINE_BUDDY_03 0x03 /* unknown function */ |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
51 | |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
52 | #define QQ_ONLINE_BUDDY_ENTRY_LEN 38 |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
53 | |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
54 | typedef struct _qq_friends_online_entry { |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
55 | qq_buddy_status *s; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
56 | guint16 unknown1; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
57 | guint8 flag1; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
58 | guint8 comm_flag; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
59 | guint16 unknown2; |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
60 | guint8 ending; /* 0x00 */ |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
61 | } qq_friends_online_entry; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
62 | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
63 | /* get a list of online_buddies */ |
| 15884 | 64 | void qq_send_packet_get_buddies_online(PurpleConnection *gc, guint8 position) |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
65 | { |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
66 | qq_data *qd; |
| 23190 | 67 | guint8 *raw_data; |
| 68 | gint bytes = 0; | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
69 | |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
70 | qd = (qq_data *) gc->proto_data; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
71 | raw_data = g_newa(guint8, 5); |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
72 | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
73 | /* 000-000 get online friends cmd |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
74 | * only 0x02 and 0x03 returns info from server, other valuse all return 0xff |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
75 | * I can also only send the first byte (0x02, or 0x03) |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
76 | * and the result is the same */ |
| 23190 | 77 | bytes += qq_put8(raw_data + bytes, QQ_GET_ONLINE_BUDDY_02); |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
78 | /* 001-001 seems it supports 255 online buddies at most */ |
| 23190 | 79 | bytes += qq_put8(raw_data + bytes, position); |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
80 | /* 002-002 */ |
| 23190 | 81 | bytes += qq_put8(raw_data + bytes, 0x00); |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
82 | /* 003-004 */ |
| 23190 | 83 | bytes += qq_put16(raw_data + bytes, 0x0000); |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
84 | |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
85 | qq_send_cmd(gc, QQ_CMD_GET_FRIENDS_ONLINE, TRUE, 0, TRUE, raw_data, 5); |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
86 | qd->last_get_online = time(NULL); |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
87 | } |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
88 | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
89 | /* position starts with 0x0000, |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
90 | * server may return a position tag if list is too long for one packet */ |
| 15884 | 91 | void qq_send_packet_get_buddies_list(PurpleConnection *gc, guint16 position) |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
92 | { |
| 23190 | 93 | guint8 raw_data[16] = {0}; |
| 94 | gint bytes = 0; | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
95 | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
96 | /* 000-001 starting position, can manually specify */ |
| 23190 | 97 | bytes += qq_put16(raw_data + bytes, position); |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
98 | /* before Mar 18, 2004, any value can work, and we sent 00 |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
99 | * I do not know what data QQ server is expecting, as QQ2003iii 0304 itself |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
100 | * even can sending packets 00 and get no response. |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
101 | * Now I tested that 00,00,00,00,00,01 work perfectly |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
102 | * March 22, found the 00,00,00 starts to work as well */ |
| 23190 | 103 | bytes += qq_put8(raw_data + bytes, 0x00); |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
104 | |
| 23190 | 105 | qq_send_cmd(gc, QQ_CMD_GET_FRIENDS_LIST, TRUE, 0, TRUE, raw_data, bytes); |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
106 | } |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
107 | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
108 | /* get all list, buddies & Quns with groupsid support */ |
| 15884 | 109 | void qq_send_packet_get_all_list_with_group(PurpleConnection *gc, guint32 position) |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
110 | { |
| 23190 | 111 | guint8 raw_data[16] = {0}; |
| 112 | gint bytes = 0; | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
113 | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
114 | /* 0x01 download, 0x02, upload */ |
| 23190 | 115 | bytes += qq_put8(raw_data + bytes, 0x01); |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
116 | /* unknown 0x02 */ |
| 23190 | 117 | bytes += qq_put8(raw_data + bytes, 0x02); |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
118 | /* unknown 00 00 00 00 */ |
| 23190 | 119 | bytes += qq_put32(raw_data + bytes, 0x00000000); |
| 120 | bytes += qq_put32(raw_data + bytes, position); | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
121 | |
| 23190 | 122 | qq_send_cmd(gc, QQ_CMD_GET_ALL_LIST_WITH_GROUP, TRUE, 0, TRUE, raw_data, bytes); |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
123 | } |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
124 | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
125 | static void _qq_buddies_online_reply_dump_unclear(qq_friends_online_entry *fe) |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
126 | { |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
127 | GString *dump; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
128 | |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
129 | g_return_if_fail(fe != NULL); |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
130 | |
|
14051
6bc807df2a0a
[gaim-migrate @ 16562]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
13932
diff
changeset
|
131 | qq_buddy_status_dump_unclear(fe->s); |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
132 | |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
133 | dump = g_string_new(""); |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
134 | g_string_append_printf(dump, "unclear fields for [%d]:\n", fe->s->uid); |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
135 | g_string_append_printf(dump, "031-032: %04x (unknown)\n", fe->unknown1); |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
136 | g_string_append_printf(dump, "033: %02x (flag1)\n", fe->flag1); |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
137 | g_string_append_printf(dump, "034: %02x (comm_flag)\n", fe->comm_flag); |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
138 | g_string_append_printf(dump, "035-036: %04x (unknown)\n", fe->unknown2); |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
139 | |
| 15884 | 140 | purple_debug(PURPLE_DEBUG_INFO, "QQ", "Online buddy entry, %s", dump->str); |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
141 | g_string_free(dump, TRUE); |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
142 | } |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
143 | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
144 | /* process the reply packet for get_buddies_online packet */ |
| 15884 | 145 | void qq_process_get_buddies_online_reply(guint8 *buf, gint buf_len, PurpleConnection *gc) |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
146 | { |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
147 | qq_data *qd; |
| 23190 | 148 | gint len, bytes, bytes_buddy; |
| 149 | guint8 *data, position; | |
| 15884 | 150 | PurpleBuddy *b; |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
151 | qq_buddy *q_bud; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
152 | qq_friends_online_entry *fe; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
153 | |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
154 | g_return_if_fail(buf != NULL && buf_len != 0); |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
155 | |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
156 | qd = (qq_data *) gc->proto_data; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
157 | len = buf_len; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
158 | data = g_newa(guint8, len); |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
159 | |
| 15884 | 160 | purple_debug(PURPLE_DEBUG_INFO, "QQ", "processing get_buddies_online_reply\n"); |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
161 | |
| 23190 | 162 | if (!qq_decrypt(buf, buf_len, qd->session_key, data, &len)) { |
| 163 | purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt buddies online"); | |
| 164 | return; | |
| 165 | } | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
166 | |
| 23190 | 167 | _qq_show_packet("Get buddies online reply packet", data, len); |
| 168 | ||
| 169 | bytes = 0; | |
| 170 | bytes += qq_get8(&position, data + bytes); | |
| 171 | ||
| 172 | fe = g_newa(qq_friends_online_entry, 1); | |
| 173 | fe->s = g_newa(qq_buddy_status, 1); | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
174 | |
| 23190 | 175 | while (bytes < len) { |
| 176 | /* set flag */ | |
| 177 | bytes_buddy = bytes; | |
| 178 | /* based on one online buddy entry */ | |
| 179 | /* ATTTENTION! NEWED in the sub function, but FREED here */ | |
| 180 | /* 000-030 qq_buddy_status */ | |
| 181 | bytes += qq_buddy_status_read(fe->s, data + bytes); | |
| 182 | /* 031-032: unknown4 */ | |
| 183 | bytes += qq_get16(&fe->unknown1, data + bytes); | |
| 184 | /* 033-033: flag1 */ | |
| 185 | bytes += qq_get8(&fe->flag1, data + bytes); | |
| 186 | /* 034-034: comm_flag */ | |
| 187 | bytes += qq_get8(&fe->comm_flag, data + bytes); | |
| 188 | /* 035-036: */ | |
| 189 | bytes += qq_get16(&fe->unknown2, data + bytes); | |
| 190 | /* 037-037: */ | |
| 191 | bytes += qq_get8(&fe->ending, data + bytes); /* 0x00 */ | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
192 | |
| 23190 | 193 | if (fe->s->uid == 0 || (bytes - bytes_buddy) != QQ_ONLINE_BUDDY_ENTRY_LEN) { |
| 194 | purple_debug(PURPLE_DEBUG_ERROR, "QQ", | |
| 195 | "uid=0 or entry complete len(%d) != %d", | |
| 196 | (bytes - bytes_buddy), QQ_ONLINE_BUDDY_ENTRY_LEN); | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
197 | g_free(fe->s->ip); |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
198 | g_free(fe->s->unknown_key); |
| 23190 | 199 | continue; |
| 200 | } /* check if it is a valid entry */ | |
| 201 | ||
| 202 | if (QQ_DEBUG) { | |
| 203 | _qq_buddies_online_reply_dump_unclear(fe); | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
204 | } |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
205 | |
| 23190 | 206 | /* update buddy information */ |
| 207 | b = purple_find_buddy(purple_connection_get_account(gc), uid_to_purple_name(fe->s->uid)); | |
| 208 | q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data; | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
209 | |
| 23190 | 210 | if (q_bud != NULL) { /* we find one and update qq_buddy */ |
| 211 | if(0 != fe->s->client_version) | |
| 212 | q_bud->client_version = fe->s->client_version; | |
| 213 | g_memmove(q_bud->ip, fe->s->ip, 4); | |
| 214 | q_bud->port = fe->s->port; | |
| 215 | q_bud->status = fe->s->status; | |
| 216 | q_bud->flag1 = fe->flag1; | |
| 217 | q_bud->comm_flag = fe->comm_flag; | |
| 218 | qq_update_buddy_contact(gc, q_bud); | |
|
15541
d5974476ce3a
Port [18179] from markhuetsch: I believe there's a bug in the get_buddies_levels() code that I don't have time to find. Temporarily disable it.
Evan Schoenberg <evands@pidgin.im>
parents:
15435
diff
changeset
|
219 | } else { |
| 23190 | 220 | purple_debug(PURPLE_DEBUG_ERROR, "QQ", |
| 221 | "Got an online buddy %d, but not in my buddy list\n", fe->s->uid); | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
222 | } |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
223 | |
| 23190 | 224 | g_free(fe->s->ip); |
| 225 | g_free(fe->s->unknown_key); | |
| 226 | } | |
| 227 | ||
| 228 | if(bytes > len) { | |
| 229 | purple_debug(PURPLE_DEBUG_ERROR, "QQ", | |
| 230 | "qq_process_get_buddies_online_reply: Dangerous error! maybe protocol changed, notify developers!\n"); | |
| 231 | } | |
| 232 | ||
| 233 | if (position != QQ_FRIENDS_ONLINE_POSITION_END) { | |
| 234 | purple_debug(PURPLE_DEBUG_INFO, "QQ", "Has more online buddies, position from %d\n", position); | |
| 235 | ||
| 236 | qq_send_packet_get_buddies_online(gc, position); | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
237 | } else { |
| 23190 | 238 | qq_send_packet_get_buddies_levels(gc); |
| 239 | qq_refresh_all_buddy_status(gc); | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
240 | } |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
241 | } |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
242 | |
| 23190 | 243 | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
244 | /* process reply for get_buddies_list */ |
| 15884 | 245 | void qq_process_get_buddies_list_reply(guint8 *buf, gint buf_len, PurpleConnection *gc) |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
246 | { |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
247 | qq_data *qd; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
248 | qq_buddy *q_bud; |
| 23190 | 249 | gint len, bytes_expected, i; |
| 250 | gint bytes, buddy_bytes; | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
251 | guint16 position, unknown; |
| 23190 | 252 | guint8 *data, pascal_len; |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
253 | gchar *name; |
| 15884 | 254 | PurpleBuddy *b; |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
255 | |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
256 | g_return_if_fail(buf != NULL && buf_len != 0); |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
257 | |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
258 | qd = (qq_data *) gc->proto_data; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
259 | len = buf_len; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
260 | data = g_newa(guint8, len); |
| 23190 | 261 | |
| 262 | if (!qq_decrypt(buf, buf_len, qd->session_key, data, &len)) { | |
| 263 | purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt buddies list"); | |
| 264 | return; | |
| 265 | } | |
| 266 | bytes = 0; | |
| 267 | bytes += qq_get16(&position, data + bytes); | |
| 268 | /* the following data is buddy list in this packet */ | |
| 269 | i = 0; | |
| 270 | while (bytes < len) { | |
| 271 | q_bud = g_new0(qq_buddy, 1); | |
| 272 | /* set flag */ | |
| 273 | buddy_bytes = bytes; | |
| 274 | /* 000-003: uid */ | |
| 275 | bytes += qq_get32(&q_bud->uid, data + bytes); | |
| 276 | /* 004-005: icon index (1-255) */ | |
| 277 | bytes += qq_get16(&q_bud->face, data + bytes); | |
| 278 | /* 006-006: age */ | |
| 279 | bytes += qq_get8(&q_bud->age, data + bytes); | |
| 280 | /* 007-007: gender */ | |
| 281 | bytes += qq_get8(&q_bud->gender, data + bytes); | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
282 | |
| 23190 | 283 | pascal_len = convert_as_pascal_string(data + bytes, &q_bud->nickname, QQ_CHARSET_DEFAULT); |
| 284 | bytes += pascal_len; | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
285 | |
| 23190 | 286 | bytes += qq_get16(&unknown, data + bytes); |
| 287 | /* flag1: (0-7) | |
| 288 | * bit1 => qq show | |
| 289 | * comm_flag: (0-7) | |
| 290 | * bit1 => member | |
| 291 | * bit4 => TCP mode | |
| 292 | * bit5 => open mobile QQ | |
| 293 | * bit6 => bind to mobile | |
| 294 | * bit7 => whether having a video | |
| 295 | */ | |
| 296 | bytes += qq_get8(&q_bud->flag1, data + bytes); | |
| 297 | bytes += qq_get8(&q_bud->comm_flag, data + bytes); | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
298 | |
| 23190 | 299 | bytes_expected = 12 + pascal_len; |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
300 | |
| 23190 | 301 | if (q_bud->uid == 0 || (bytes - buddy_bytes) != bytes_expected) { |
| 302 | purple_debug(PURPLE_DEBUG_INFO, "QQ", | |
| 303 | "Buddy entry, expect %d bytes, read %d bytes\n", bytes_expected, bytes - buddy_bytes); | |
| 304 | g_free(q_bud->nickname); | |
| 305 | g_free(q_bud); | |
| 306 | continue; | |
| 307 | } else { | |
| 308 | i++; | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
309 | } |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
310 | |
| 23190 | 311 | if (QQ_DEBUG) { |
| 312 | purple_debug(PURPLE_DEBUG_INFO, "QQ", | |
| 313 | "buddy [%09d]: flag1=0x%02x, comm_flag=0x%02x\n", | |
| 314 | q_bud->uid, q_bud->flag1, q_bud->comm_flag); | |
| 315 | } | |
| 316 | ||
| 317 | name = uid_to_purple_name(q_bud->uid); | |
| 318 | b = purple_find_buddy(gc->account, name); | |
| 319 | g_free(name); | |
| 320 | ||
| 321 | if (b == NULL) { | |
| 322 | b = qq_add_buddy_by_recv_packet(gc, q_bud->uid, TRUE, FALSE); | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
323 | } |
| 23190 | 324 | |
| 325 | b->proto_data = q_bud; | |
| 326 | qd->buddies = g_list_append(qd->buddies, q_bud); | |
| 327 | qq_update_buddy_contact(gc, q_bud); | |
| 328 | } | |
| 329 | ||
| 330 | if(bytes > len) { | |
| 331 | purple_debug(PURPLE_DEBUG_ERROR, "QQ", | |
| 332 | "qq_process_get_buddies_list_reply: Dangerous error! maybe protocol changed, notify developers!"); | |
| 333 | } | |
| 334 | if (position == QQ_FRIENDS_LIST_POSITION_END) { | |
| 335 | purple_debug(PURPLE_DEBUG_INFO, "QQ", "Get friends list done, %d buddies\n", i); | |
| 336 | qq_send_packet_get_buddies_online(gc, QQ_FRIENDS_ONLINE_POSITION_START); | |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
337 | } else { |
| 23190 | 338 | qq_send_packet_get_buddies_list(gc, position); |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
339 | } |
|
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
340 | } |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
341 | |
| 15884 | 342 | void qq_process_get_all_list_with_group_reply(guint8 *buf, gint buf_len, PurpleConnection *gc) |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
343 | { |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
344 | qq_data *qd; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
345 | gint len, i, j; |
| 23190 | 346 | gint bytes = 0; |
| 347 | guint8 *data; | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
348 | guint8 sub_cmd, reply_code; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
349 | guint32 unknown, position; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
350 | guint32 uid; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
351 | guint8 type, groupid; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
352 | qq_group *group; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
353 | |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
354 | g_return_if_fail(buf != NULL && buf_len != 0); |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
355 | |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
356 | qd = (qq_data *) gc->proto_data; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
357 | len = buf_len; |
|
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
358 | data = g_newa(guint8, len); |
| 23190 | 359 | |
| 360 | if (!qq_decrypt(buf, buf_len, qd->session_key, data, &len)) { | |
| 361 | purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Error decrypt all list with group"); | |
| 362 | return; | |
| 363 | } | |
| 364 | ||
| 365 | bytes += qq_get8(&sub_cmd, data + bytes); | |
| 366 | g_return_if_fail(sub_cmd == 0x01); | |
| 367 | ||
| 368 | bytes += qq_get8(&reply_code, data + bytes); | |
| 369 | if(0 != reply_code) { | |
| 370 | purple_debug(PURPLE_DEBUG_WARNING, "QQ", | |
| 371 | "Get all list with group reply, reply_code(%d) is not zero", reply_code); | |
| 372 | } | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
373 | |
| 23190 | 374 | bytes += qq_get32(&unknown, data + bytes); |
| 375 | bytes += qq_get32(&position, data + bytes); | |
| 376 | /* the following data is all list in this packet */ | |
| 377 | i = 0; | |
| 378 | j = 0; | |
| 379 | while (bytes < len) { | |
| 380 | /* 00-03: uid */ | |
| 381 | bytes += qq_get32(&uid, data + bytes); | |
| 382 | /* 04: type 0x1:buddy 0x4:Qun */ | |
| 383 | bytes += qq_get8(&type, data + bytes); | |
| 384 | /* 05: groupid*4 */ /* seems to always be 0 */ | |
| 385 | bytes += qq_get8(&groupid, data + bytes); | |
| 386 | /* | |
| 387 | purple_debug(PURPLE_DEBUG_INFO, "QQ", "groupid: %i\n", groupid); | |
| 388 | groupid >>= 2; | |
| 389 | */ | |
| 390 | if (uid == 0 || (type != 0x1 && type != 0x4)) { | |
| 391 | purple_debug(PURPLE_DEBUG_INFO, "QQ", | |
| 392 | "Buddy entry, uid=%d, type=%d", uid, type); | |
| 393 | continue; | |
| 394 | } | |
| 395 | if(0x1 == type) { /* a buddy */ | |
| 396 | /* don't do anything but count - buddies are handled by | |
| 397 | * qq_send_packet_get_buddies_list */ | |
| 398 | ++i; | |
| 399 | } else { /* a group */ | |
| 400 | group = qq_group_find_by_id(gc, uid, QQ_INTERNAL_ID); | |
| 401 | if(group == NULL) { | |
| 402 | qq_set_pending_id(&qd->adding_groups_from_server, uid, TRUE); | |
| 403 | group = g_newa(qq_group, 1); | |
| 404 | group->internal_group_id = uid; | |
| 405 | qq_send_cmd_group_get_group_info(gc, group); | |
| 406 | } else { | |
| 407 | group->my_status = QQ_GROUP_MEMBER_STATUS_IS_MEMBER; | |
| 408 | qq_group_refresh(gc, group); | |
| 409 | qq_send_cmd_group_get_group_info(gc, group); | |
| 410 | } | |
| 411 | ++j; | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
412 | } |
|
14083
2b68bb18a66c
[gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
14051
diff
changeset
|
413 | } |
| 23190 | 414 | |
| 415 | if(bytes > len) { | |
| 416 | purple_debug(PURPLE_DEBUG_ERROR, "QQ", | |
| 417 | "qq_process_get_all_list_with_group_reply: Dangerous error! maybe protocol changed, notify developers!"); | |
| 418 | } | |
| 419 | ||
| 420 | purple_debug(PURPLE_DEBUG_INFO, "QQ", "Get all list done, %d buddies and %d Quns\n", i, j); | |
|
13932
4d131bd2b40f
[gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff
changeset
|
421 | } |