libpurple/protocols/qq/buddy_list.c

Sun, 08 Feb 2009 10:09:34 +0000

author
SHiNE CsyFeK <csyfek@gmail.com>
date
Sun, 08 Feb 2009 10:09:34 +0000
branch
openq
changeset 25309
d364c26b8c3a
parent 25050
c4bea116ae9b
child 25119
d78a152554c4
child 25655
8c6d7250f64a
permissions
-rw-r--r--

2009.02.08 - flos <lonicerae(at)gmail.com>
* Fixed showing message of chat room when message comes in

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
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15541
diff changeset
4 * purple
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
5 *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15541
diff changeset
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_opt.h"
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
36 #include "char_conv.h"
24340
36ceebf026a0 patch 20080922 from ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24337
diff changeset
37 #include "qq_define.h"
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
38 #include "qq_base.h"
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
39 #include "group.h"
14466
4fcd9fdc8060 [gaim-migrate @ 17112]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14327
diff changeset
40 #include "group_internal.h"
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
41 #include "group_info.h"
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
42
23192
2f00b04db5cb patch-04-tcp-pending
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23190
diff changeset
43 #include "qq_network.h"
14051
6bc807df2a0a [gaim-migrate @ 16562]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 13932
diff changeset
44
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
45 #define QQ_GET_ONLINE_BUDDY_02 0x02
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
46 #define QQ_GET_ONLINE_BUDDY_03 0x03 /* unknown function */
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
47
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
48 typedef struct _qq_buddy_online {
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
49 qq_buddy_status bs;
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
50 guint16 unknown1;
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
51 guint8 ext_flag;
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
52 guint8 comm_flag;
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
53 guint16 unknown2;
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
54 guint8 ending; /* 0x00 */
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
55 } qq_buddy_online;
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
56
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
57 /* get a list of online_buddies */
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
58 void qq_request_get_buddies_online(PurpleConnection *gc, guint8 position, gint update_class)
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
59 {
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
60 qq_data *qd;
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
61 guint8 *raw_data;
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
62 gint bytes = 0;
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
63
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
64 qd = (qq_data *) gc->proto_data;
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
65 raw_data = g_newa(guint8, 5);
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
66
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
67 /* 000-000 get online friends cmd
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
68 * 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
69 * 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
70 * and the result is the same */
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
71 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
72 /* 001-001 seems it supports 255 online buddies at most */
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
73 bytes += qq_put8(raw_data + bytes, position);
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
74 /* 002-002 */
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
75 bytes += qq_put8(raw_data + bytes, 0x00);
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
76 /* 003-004 */
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
77 bytes += qq_put16(raw_data + bytes, 0x0000);
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
78
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
79 qq_send_cmd_mess(gc, QQ_CMD_GET_BUDDIES_ONLINE, raw_data, 5, update_class, 0);
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
80 }
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
81
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
82 /* position starts with 0x0000,
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
83 * server may return a position tag if list is too long for one packet */
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
84 void qq_request_get_buddies(PurpleConnection *gc, guint16 position, gint update_class)
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
85 {
24346
98c009d1f4e0 2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24343
diff changeset
86 qq_data *qd;
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
87 guint8 raw_data[16] = {0};
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
88 gint bytes = 0;
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
89
24346
98c009d1f4e0 2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24343
diff changeset
90 qd = (qq_data *) gc->proto_data;
98c009d1f4e0 2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24343
diff changeset
91
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
92 /* 000-001 starting position, can manually specify */
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
93 bytes += qq_put16(raw_data + bytes, position);
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
94 /* 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
95 * 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
96 * even can sending packets 00 and get no response.
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
97 * 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
98 * March 22, found the 00,00,00 starts to work as well */
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
99 bytes += qq_put8(raw_data + bytes, 0x00);
24346
98c009d1f4e0 2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24343
diff changeset
100 if (qd->client_version >= 2007) {
98c009d1f4e0 2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24343
diff changeset
101 bytes += qq_put16(raw_data + bytes, 0x0000);
98c009d1f4e0 2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24343
diff changeset
102 }
24352
871c27553af6 Flos Lonicerae <lonicerae(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24351
diff changeset
103
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
104 qq_send_cmd_mess(gc, QQ_CMD_GET_BUDDIES_LIST, raw_data, bytes, update_class, 0);
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
105 }
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
106
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
107 /* get all list, buddies & Quns with groupsid support */
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
108 void qq_request_get_buddies_and_rooms(PurpleConnection *gc, guint32 position, gint update_class)
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
109 {
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
110 guint8 raw_data[16] = {0};
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
111 gint bytes = 0;
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
112
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
113 /* 0x01 download, 0x02, upload */
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
114 bytes += qq_put8(raw_data + bytes, 0x01);
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
115 /* unknown 0x02 */
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
116 bytes += qq_put8(raw_data + bytes, 0x02);
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
117 /* unknown 00 00 00 00 */
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
118 bytes += qq_put32(raw_data + bytes, 0x00000000);
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
119 bytes += qq_put32(raw_data + bytes, position);
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
120
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
121 qq_send_cmd_mess(gc, QQ_CMD_GET_BUDDIES_AND_ROOMS, raw_data, bytes, update_class, 0);
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
122 }
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
123
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
124 /* parse the data into qq_buddy_status */
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
125 static gint get_buddy_status(qq_buddy_status *bs, guint8 *data)
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
126 {
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
127 gint bytes = 0;
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
128
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
129 g_return_val_if_fail(data != NULL && bs != NULL, -1);
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
130
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
131 /* 000-003: uid */
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
132 bytes += qq_get32(&bs->uid, data + bytes);
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
133 /* 004-004: 0x01 */
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
134 bytes += qq_get8(&bs->unknown1, data + bytes);
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
135 /* this is no longer the IP, it seems QQ (as of 2006) no longer sends
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
136 * the buddy's IP in this packet. all 0s */
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
137 /* 005-008: ip */
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
138 bytes += qq_getIP(&bs->ip, data + bytes);
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
139 /* port info is no longer here either */
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
140 /* 009-010: port */
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
141 bytes += qq_get16(&bs->port, data + bytes);
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
142 /* 011-011: 0x00 */
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
143 bytes += qq_get8(&bs->unknown2, data + bytes);
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
144 /* 012-012: status */
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
145 bytes += qq_get8(&bs->status, data + bytes);
24341
02abffea97fe 2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24340
diff changeset
146 /* 013-014: client tag */
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
147 bytes += qq_get16(&bs->unknown3, data + bytes);
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
148 /* 015-030: unknown key */
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
149 bytes += qq_getdata(&(bs->unknown_key[0]), QQ_KEY_LENGTH, data + bytes);
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
150
25050
c4bea116ae9b Clean debug info
Hu Yong <ccpaging@gmail.com>
parents: 25027
diff changeset
151 purple_debug_info("QQ", "Status:%d, uid: %u, ip: %s:%d, U: %d - %d - %04X\n",
c4bea116ae9b Clean debug info
Hu Yong <ccpaging@gmail.com>
parents: 25027
diff changeset
152 bs->status, bs->uid, inet_ntoa(bs->ip), bs->port,
c4bea116ae9b Clean debug info
Hu Yong <ccpaging@gmail.com>
parents: 25027
diff changeset
153 bs->unknown1, bs->unknown2, bs->unknown3);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
154
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
155 return bytes;
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
156 }
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
157
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
158 /* process the reply packet for get_buddies_online packet */
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
159 guint8 qq_process_get_buddies_online(guint8 *data, gint data_len, PurpleConnection *gc)
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
160 {
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
161 qq_data *qd;
24348
1249d8b99aa9 2008.10.03 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24346
diff changeset
162 gint bytes, bytes_start;
23194
e8c312705ee8 Sun Jun 29 22:00:12 CST 2008 csyfek@gmail.com
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23193
diff changeset
163 gint count;
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
164 guint8 position;
25027
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
165 gchar *who;
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
166 PurpleBuddy *buddy;
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
167 qq_buddy_data *bd;
24348
1249d8b99aa9 2008.10.03 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24346
diff changeset
168 int entry_len = 38;
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
169
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
170 qq_buddy_status bs;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
171 struct {
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
172 guint16 unknown1;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
173 guint8 ext_flag;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
174 guint8 comm_flag;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
175 guint16 unknown2;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
176 guint8 ending; /* 0x00 */
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
177 } packet;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
178
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
179 g_return_val_if_fail(data != NULL && data_len != 0, -1);
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
180
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
181 qd = (qq_data *) gc->proto_data;
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
182
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
183 /* qq_show_packet("Get buddies online reply packet", data, len); */
24348
1249d8b99aa9 2008.10.03 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24346
diff changeset
184 if (qd->client_version >= 2007) entry_len += 4;
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
185
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
186 bytes = 0;
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
187 bytes += qq_get8(&position, data + bytes);
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
188
23194
e8c312705ee8 Sun Jun 29 22:00:12 CST 2008 csyfek@gmail.com
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23193
diff changeset
189 count = 0;
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
190 while (bytes < data_len) {
24348
1249d8b99aa9 2008.10.03 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24346
diff changeset
191 if (data_len - bytes < entry_len) {
24346
98c009d1f4e0 2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24343
diff changeset
192 purple_debug_error("QQ", "[buddies online] only %d, need %d\n",
24348
1249d8b99aa9 2008.10.03 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24346
diff changeset
193 (data_len - bytes), entry_len);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
194 break;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
195 }
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
196 memset(&bs, 0 ,sizeof(bs));
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
197 memset(&packet, 0 ,sizeof(packet));
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
198
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
199 /* set flag */
24348
1249d8b99aa9 2008.10.03 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24346
diff changeset
200 bytes_start = bytes;
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
201 /* based on one online buddy entry */
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
202 /* 000-030 qq_buddy_status */
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
203 bytes += get_buddy_status(&bs, data + bytes);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
204 /* 031-032: */
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
205 bytes += qq_get16(&packet.unknown1, data + bytes);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
206 /* 033-033: ext_flag */
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
207 bytes += qq_get8(&packet.ext_flag, data + bytes);
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
208 /* 034-034: comm_flag */
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
209 bytes += qq_get8(&packet.comm_flag, data + bytes);
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
210 /* 035-036: */
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
211 bytes += qq_get16(&packet.unknown2, data + bytes);
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
212 /* 037-037: */
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
213 bytes += qq_get8(&packet.ending, data + bytes); /* 0x00 */
24348
1249d8b99aa9 2008.10.03 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24346
diff changeset
214 /* skip 4 bytes in qq2007 */
1249d8b99aa9 2008.10.03 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24346
diff changeset
215 if (qd->client_version >= 2007) bytes += 4;
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
216
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
217 if (bs.uid == 0 || (bytes - bytes_start) != entry_len) {
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
218 purple_debug_error("QQ", "uid=0 or entry complete len(%d) != %d",
24348
1249d8b99aa9 2008.10.03 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24346
diff changeset
219 (bytes - bytes_start), entry_len);
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
220 continue;
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
221 } /* check if it is a valid entry */
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
222
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
223 if (bs.uid == qd->uid) {
25027
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
224 purple_debug_warning("QQ", "I am in online list %u\n", bs.uid);
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
225 }
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
226
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
227 /* update buddy information */
25027
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
228 who = uid_to_purple_name(bs.uid);
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
229 buddy = purple_find_buddy(gc->account, who);
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
230 g_free(who);
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
231 if (buddy == NULL) {
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
232 /* create no-auth buddy */
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
233 buddy = qq_buddy_new(gc, bs.uid);
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
234 }
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
235 bd = (buddy == NULL) ? NULL : (qq_buddy_data *)buddy->proto_data;
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
236 if (bd == NULL) {
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
237 purple_debug_error("QQ",
25027
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
238 "Got an online buddy %u, but not in my buddy list\n", bs.uid);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
239 continue;
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
240 }
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
241 /*
24341
02abffea97fe 2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24340
diff changeset
242 if(0 != fe->s->client_tag)
02abffea97fe 2008.09.26 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24340
diff changeset
243 q_bud->client_tag = fe->s->client_tag;
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
244 */
24363
383f01928954 2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24362
diff changeset
245 if (bd->status != bs.status || bd->comm_flag != packet.comm_flag) {
383f01928954 2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24362
diff changeset
246 bd->status = bs.status;
383f01928954 2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24362
diff changeset
247 bd->comm_flag = packet.comm_flag;
383f01928954 2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24362
diff changeset
248 qq_update_buddy_status(gc, bd->uid, bd->status, bd->comm_flag);
383f01928954 2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24362
diff changeset
249 }
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
250 bd->ip.s_addr = bs.ip.s_addr;
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
251 bd->port = bs.port;
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
252 bd->ext_flag = packet.ext_flag;
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
253 bd->last_update = time(NULL);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
254 count++;
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
255 }
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
256
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
257 if(bytes > data_len) {
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
258 purple_debug_error("QQ",
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
259 "qq_process_get_buddies_online: Dangerous error! maybe protocol changed, notify developers!\n");
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
260 }
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
261
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
262 purple_debug_info("QQ", "Received %d online buddies, nextposition=%u\n",
24362
9984c7d8b290 2008.10.08 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24360
diff changeset
263 count, (guint) position);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
264 return position;
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
265 }
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
266
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
267
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
268 /* process reply for get_buddies_list */
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
269 guint16 qq_process_get_buddies(guint8 *data, gint data_len, PurpleConnection *gc)
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
270 {
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
271 qq_data *qd;
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
272 qq_buddy_data bd;
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
273 gint bytes_expected, count;
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
274 gint bytes, buddy_bytes;
24352
871c27553af6 Flos Lonicerae <lonicerae(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24351
diff changeset
275 gint nickname_len;
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
276 guint16 position, unknown;
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
277 PurpleBuddy *buddy;
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
278
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
279 g_return_val_if_fail(data != NULL && data_len != 0, -1);
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
280
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
281 qd = (qq_data *) gc->proto_data;
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
282
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
283 if (data_len <= 2) {
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
284 purple_debug_error("QQ", "empty buddies list");
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
285 return -1;
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
286 }
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
287 /* qq_show_packet("QQ get buddies list", data, data_len); */
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
288 bytes = 0;
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
289 bytes += qq_get16(&position, data + bytes);
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
290 /* the following data is buddy list in this packet */
23194
e8c312705ee8 Sun Jun 29 22:00:12 CST 2008 csyfek@gmail.com
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23193
diff changeset
291 count = 0;
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
292 while (bytes < data_len) {
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
293 memset(&bd, 0, sizeof(bd));
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
294 /* set flag */
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
295 buddy_bytes = bytes;
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
296 /* 000-003: uid */
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
297 bytes += qq_get32(&bd.uid, data + bytes);
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
298 /* 004-005: icon index (1-255) */
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
299 bytes += qq_get16(&bd.face, data + bytes);
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
300 /* 006-006: age */
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
301 bytes += qq_get8(&bd.age, data + bytes);
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
302 /* 007-007: gender */
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
303 bytes += qq_get8(&bd.gender, data + bytes);
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
304
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
305 nickname_len = qq_get_vstr(&bd.nickname, QQ_CHARSET_DEFAULT, data + bytes);
24352
871c27553af6 Flos Lonicerae <lonicerae(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24351
diff changeset
306 bytes += nickname_len;
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
307 qq_filter_str(bd.nickname);
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
308
24346
98c009d1f4e0 2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24343
diff changeset
309 /* Fixme: merge following as 32bit flag */
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
310 bytes += qq_get16(&unknown, data + bytes);
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
311 bytes += qq_get8(&bd.ext_flag, data + bytes);
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
312 bytes += qq_get8(&bd.comm_flag, data + bytes);
24352
871c27553af6 Flos Lonicerae <lonicerae(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24351
diff changeset
313
24346
98c009d1f4e0 2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24343
diff changeset
314 if (qd->client_version >= 2007) {
98c009d1f4e0 2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24343
diff changeset
315 bytes += 4; /* skip 4 bytes */
24352
871c27553af6 Flos Lonicerae <lonicerae(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24351
diff changeset
316 bytes_expected = 16 + nickname_len;
24346
98c009d1f4e0 2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24343
diff changeset
317 } else {
24352
871c27553af6 Flos Lonicerae <lonicerae(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24351
diff changeset
318 bytes_expected = 12 + nickname_len;
24346
98c009d1f4e0 2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24343
diff changeset
319 }
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
320
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
321 if (bd.uid == 0 || (bytes - buddy_bytes) != bytes_expected) {
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
322 purple_debug_info("QQ",
25027
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
323 "Buddy entry, expect %d bytes, read %d bytes\n",
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
324 bytes_expected, bytes - buddy_bytes);
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
325 g_free(bd.nickname);
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
326 continue;
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
327 } else {
23194
e8c312705ee8 Sun Jun 29 22:00:12 CST 2008 csyfek@gmail.com
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23193
diff changeset
328 count++;
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
329 }
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
330
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
331 #if 1
24337
09fc304dae73 2008.09.19 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24314
diff changeset
332 purple_debug_info("QQ", "buddy [%09d]: ext_flag=0x%02x, comm_flag=0x%02x, nick=%s\n",
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
333 bd.uid, bd.ext_flag, bd.comm_flag, bd.nickname);
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
334 #endif
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
335
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
336 buddy = qq_buddy_find_or_new(gc, bd.uid);
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
337 if (buddy == NULL || buddy->proto_data == NULL) {
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
338 g_free(bd.nickname);
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
339 continue;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
340 }
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
341 purple_blist_server_alias_buddy(buddy, bd.nickname);
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
342 bd.last_update = time(NULL);
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
343 qq_update_buddy_status(gc, bd.uid, bd.status, bd.comm_flag);
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
344
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
345 g_memmove(buddy->proto_data, &bd, sizeof(qq_buddy_data));
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
346 /* nickname has been copy to buddy_data do not free
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
347 g_free(bd.nickname);
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
348 */
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
349 }
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
350
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
351 if(bytes > data_len) {
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
352 purple_debug_error("QQ",
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
353 "qq_process_get_buddies: Dangerous error! maybe protocol changed, notify developers!");
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
354 }
23194
e8c312705ee8 Sun Jun 29 22:00:12 CST 2008 csyfek@gmail.com
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23193
diff changeset
355
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
356 purple_debug_info("QQ", "Received %d buddies, nextposition=%u\n",
23194
e8c312705ee8 Sun Jun 29 22:00:12 CST 2008 csyfek@gmail.com
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23193
diff changeset
357 count, (guint) position);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
358 return position;
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
359 }
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
360
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
361 guint32 qq_process_get_buddies_and_rooms(guint8 *data, gint data_len, PurpleConnection *gc)
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
362 {
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
363 qq_data *qd;
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
364 gint i, j;
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
365 gint bytes;
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
366 guint8 sub_cmd, reply_code;
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
367 guint32 unknown, position;
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
368 guint32 uid;
24362
9984c7d8b290 2008.10.08 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24360
diff changeset
369 guint8 type;
24363
383f01928954 2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24362
diff changeset
370 qq_room_data *rmd;
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
371
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
372 g_return_val_if_fail(data != NULL && data_len != 0, -1);
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
373
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
374 qd = (qq_data *) gc->proto_data;
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
375
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
376 bytes = 0;
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
377 bytes += qq_get8(&sub_cmd, data + bytes);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
378 g_return_val_if_fail(sub_cmd == 0x01, -1);
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
379
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
380 bytes += qq_get8(&reply_code, data + bytes);
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
381 if(0 != reply_code) {
24352
871c27553af6 Flos Lonicerae <lonicerae(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24351
diff changeset
382 purple_debug_warning("QQ", "qq_process_get_buddies_and_rooms, %d\n", reply_code);
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
383 }
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
384
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
385 bytes += qq_get32(&unknown, data + bytes);
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
386 bytes += qq_get32(&position, data + bytes);
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
387 /* the following data is all list in this packet */
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
388 i = 0;
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
389 j = 0;
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
390 while (bytes < data_len) {
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
391 /* 00-03: uid */
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
392 bytes += qq_get32(&uid, data + bytes);
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
393 /* 04: type 0x1:buddy 0x4:Qun */
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
394 bytes += qq_get8(&type, data + bytes);
24362
9984c7d8b290 2008.10.08 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24360
diff changeset
395 /* 05: skip unknow 0x00 */
9984c7d8b290 2008.10.08 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24360
diff changeset
396 bytes += 1;
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
397 if (uid == 0 || (type != 0x1 && type != 0x4)) {
25027
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
398 purple_debug_info("QQ", "Buddy entry, uid=%u, type=%d", uid, type);
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
399 continue;
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
400 }
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
401 if(0x1 == type) { /* a buddy */
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
402 /* don't do anything but count - buddies are handled by
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
403 * qq_request_get_buddies */
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
404 ++i;
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
405 } else { /* a group */
24363
383f01928954 2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24362
diff changeset
406 rmd = qq_room_data_find(gc, uid);
383f01928954 2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24362
diff changeset
407 if(rmd == NULL) {
25027
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
408 purple_debug_info("QQ", "Unknow room id %u", uid);
24363
383f01928954 2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24362
diff changeset
409 qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_INFO, uid);
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
410 } else {
24363
383f01928954 2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24362
diff changeset
411 rmd->my_role = QQ_ROOM_ROLE_YES;
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
412 }
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
413 ++j;
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
414 }
14083
2b68bb18a66c [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents: 14051
diff changeset
415 }
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
416
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
417 if(bytes > data_len) {
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
418 purple_debug_error("QQ",
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
419 "qq_process_get_buddies_and_rooms: Dangerous error! maybe protocol changed, notify developers!");
23190
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
420 }
ce258cadbd9e patch-02-fix-multiarch
SHiNE CsyFeK <csyfek@gmail.com>
parents: 22685
diff changeset
421
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
422 purple_debug_info("QQ", "Received %d buddies and %d groups, nextposition=%u\n", i, j, (guint) position);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
423 return position;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
424 }
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
425
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
426 #define QQ_MISC_STATUS_HAVING_VIIDEO 0x00000001
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
427 #define QQ_CHANGE_ONLINE_STATUS_REPLY_OK 0x30 /* ASCII value of "0" */
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
428
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
429 /* TODO: figure out what's going on with the IP region. Sometimes I get valid IP addresses,
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
430 * but the port number's weird, other times I get 0s. I get these simultaneously on the same buddy,
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
431 * using different accounts to get info. */
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
432 static guint8 get_status_from_purple(PurpleConnection *gc)
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
433 {
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
434 qq_data *qd;
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
435 PurpleAccount *account;
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
436 PurplePresence *presence;
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
437 guint8 ret;
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
438
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
439 qd = (qq_data *) gc->proto_data;
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
440 account = purple_connection_get_account(gc);
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
441 presence = purple_account_get_presence(account);
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
442
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
443 if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_INVISIBLE)) {
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
444 ret = QQ_BUDDY_ONLINE_INVISIBLE;
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
445 } else if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_UNAVAILABLE))
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
446 {
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
447 if (qd->client_version >= 2007) {
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
448 ret = QQ_BUDDY_ONLINE_BUSY;
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
449 } else {
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
450 ret = QQ_BUDDY_ONLINE_INVISIBLE;
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
451 }
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
452 } else if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_AWAY)
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
453 || purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_EXTENDED_AWAY)
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
454 || purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_UNAVAILABLE)) {
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
455 ret = QQ_BUDDY_ONLINE_AWAY;
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
456 } else {
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
457 ret = QQ_BUDDY_ONLINE_NORMAL;
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
458 }
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
459 return ret;
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
460 }
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
461
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
462 /* send a packet to change my online status */
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
463 void qq_request_change_status(PurpleConnection *gc, gint update_class)
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
464 {
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
465 qq_data *qd;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
466 guint8 raw_data[16] = {0};
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
467 gint bytes = 0;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
468 guint8 away_cmd;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
469 guint32 misc_status;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
470 gboolean fake_video;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
471 PurpleAccount *account;
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
472 PurplePresence *presence;
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
473
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
474 account = purple_connection_get_account(gc);
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
475 presence = purple_account_get_presence(account);
23212
a39a33c79a3f 2008.07.12 - ccpaging <ecc_hy(at)hotmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23194
diff changeset
476
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
477 qd = (qq_data *) gc->proto_data;
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
478 if (!qd->is_login)
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
479 return;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
480
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
481 away_cmd = get_status_from_purple(gc);
24352
871c27553af6 Flos Lonicerae <lonicerae(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24351
diff changeset
482
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
483 misc_status = 0x00000000;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
484 fake_video = purple_prefs_get_bool("/plugins/prpl/qq/show_fake_video");
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
485 if (fake_video)
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
486 misc_status |= QQ_MISC_STATUS_HAVING_VIIDEO;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
487
24346
98c009d1f4e0 2009.10.02 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24343
diff changeset
488 if (qd->client_version >= 2007) {
24343
9c695a1f475b 2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24341
diff changeset
489 bytes = 0;
9c695a1f475b 2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24341
diff changeset
490 bytes += qq_put8(raw_data + bytes, away_cmd);
9c695a1f475b 2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24341
diff changeset
491 /* status version */
9c695a1f475b 2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24341
diff changeset
492 bytes += qq_put16(raw_data + bytes, 0);
9c695a1f475b 2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24341
diff changeset
493 bytes += qq_put16(raw_data + bytes, 0);
9c695a1f475b 2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24341
diff changeset
494 bytes += qq_put32(raw_data + bytes, misc_status);
9c695a1f475b 2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24341
diff changeset
495 /* Fixme: custom status message, now is empty */
9c695a1f475b 2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24341
diff changeset
496 bytes += qq_put16(raw_data + bytes, 0);
9c695a1f475b 2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24341
diff changeset
497 } else {
9c695a1f475b 2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24341
diff changeset
498 bytes = 0;
9c695a1f475b 2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24341
diff changeset
499 bytes += qq_put8(raw_data + bytes, away_cmd);
9c695a1f475b 2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24341
diff changeset
500 bytes += qq_put32(raw_data + bytes, misc_status);
9c695a1f475b 2008.09.28 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24341
diff changeset
501 }
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
502 qq_send_cmd_mess(gc, QQ_CMD_CHANGE_STATUS, raw_data, bytes, update_class, 0);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
503 }
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
504
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
505 /* parse the reply packet for change_status */
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
506 void qq_process_change_status(guint8 *data, gint data_len, PurpleConnection *gc)
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
507 {
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
508 qq_data *qd;
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
509 gint bytes;
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
510 guint8 reply;
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
511 qq_buddy_data *bd;
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
512
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
513 g_return_if_fail(data != NULL && data_len != 0);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
514
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
515 qd = (qq_data *) gc->proto_data;
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
516
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
517 bytes = 0;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
518 bytes = qq_get8(&reply, data + bytes);
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
519 if (reply != QQ_CHANGE_ONLINE_STATUS_REPLY_OK) {
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
520 purple_debug_warning("QQ", "Change status fail 0x%02X\n", reply);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
521 return;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
522 }
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
523
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
524 /* purple_debug_info("QQ", "Change status OK\n"); */
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
525 bd = qq_buddy_data_find(gc, qd->uid);
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
526 if (bd != NULL) {
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
527 bd->status = get_status_from_purple(gc);
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
528 bd->last_update = time(NULL);
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
529 qq_update_buddy_status(gc, bd->uid, bd->status, bd->comm_flag);
23194
e8c312705ee8 Sun Jun 29 22:00:12 CST 2008 csyfek@gmail.com
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23193
diff changeset
530 }
13932
4d131bd2b40f [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch@users.sourceforge.net>
parents:
diff changeset
531 }
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
532
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
533 /* it is a server message indicating that one of my buddies has changed its status */
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
534 void qq_process_buddy_change_status(guint8 *data, gint data_len, PurpleConnection *gc)
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
535 {
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
536 qq_data *qd;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
537 gint bytes;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
538 guint32 my_uid;
25027
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
539 gchar *who;
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
540 PurpleBuddy *buddy;
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
541 qq_buddy_data *bd;
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
542 qq_buddy_status bs;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
543
24018
91f0294f2377 2008.08.10 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23950
diff changeset
544 g_return_if_fail(data != NULL && data_len != 0);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
545
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
546 qd = (qq_data *) gc->proto_data;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
547
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
548 if (data_len < 35) {
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
549 purple_debug_error("QQ", "[buddy status change] only %d, need 35 bytes\n", data_len);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
550 return;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
551 }
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
552
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
553 memset(&bs, 0, sizeof(bs));
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
554 bytes = 0;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
555 /* 000-030: qq_buddy_status */
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
556 bytes += get_buddy_status(&bs, data + bytes);
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
557 /* 031-034: Unknow, maybe my uid */
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
558 /* This has a value of 0 when we've changed our status to
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
559 * QQ_BUDDY_ONLINE_INVISIBLE */
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
560 bytes += qq_get32(&my_uid, data + bytes);
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
561
25027
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
562 /* update buddy information */
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
563 who = uid_to_purple_name(bs.uid);
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
564 buddy = purple_find_buddy(gc->account, who);
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
565 g_free(who);
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
566 if (buddy == NULL) {
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
567 /* create no-auth buddy */
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
568 buddy = qq_buddy_new(gc, bs.uid);
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
569 }
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
570 bd = (buddy == NULL) ? NULL : (qq_buddy_data *) buddy->proto_data;
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
571 if (bd == NULL) {
25050
c4bea116ae9b Clean debug info
Hu Yong <ccpaging@gmail.com>
parents: 25027
diff changeset
572 purple_debug_warning("QQ", "Got status of no-auth buddy %u\n", bs.uid);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
573 return;
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
574 }
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
575
24314
587e97c2b707 merge of 'd01a6b8ccfad536e692fa159a02583625596c4f5'
Daniel Atallah <datallah@pidgin.im>
parents: 24313
diff changeset
576 if(bs.ip.s_addr != 0) {
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
577 bd->ip.s_addr = bs.ip.s_addr;
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
578 bd->port = bs.port;
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
579 }
24363
383f01928954 2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24362
diff changeset
580 if (bd->status != bs.status) {
383f01928954 2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24362
diff changeset
581 bd->status = bs.status;
383f01928954 2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24362
diff changeset
582 qq_update_buddy_status(gc, bd->uid, bd->status, bd->comm_flag);
383f01928954 2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24362
diff changeset
583 }
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
584 bd->last_update = time(NULL);
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
585
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
586 if (bd->status == QQ_BUDDY_ONLINE_NORMAL && bd->level <= 0) {
24348
1249d8b99aa9 2008.10.03 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24346
diff changeset
587 if (qd->client_version >= 2007) {
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
588 qq_request_get_level_2007(gc, bd->uid);
24348
1249d8b99aa9 2008.10.03 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24346
diff changeset
589 } else {
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
590 qq_request_get_level(gc, bd->uid);
24348
1249d8b99aa9 2008.10.03 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24346
diff changeset
591 }
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
592 }
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
593 }
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
594
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
595 /*TODO: maybe this should be qq_update_buddy_status() ?*/
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
596 void qq_update_buddy_status(PurpleConnection *gc, guint32 uid, guint8 status, guint8 flag)
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
597 {
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
598 gchar *who;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
599 gchar *status_id;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
600
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
601 g_return_if_fail(uid != 0);
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
602
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
603 /* purple supports signon and idle time
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
604 * but it is not much use for QQ, I do not use them */
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
605 /* serv_got_update(gc, name, online, 0, q_bud->signon, q_bud->idle, bud->uc); */
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
606 status_id = "available";
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
607 switch(status) {
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
608 case QQ_BUDDY_OFFLINE:
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
609 status_id = "offline";
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
610 break;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
611 case QQ_BUDDY_ONLINE_NORMAL:
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
612 status_id = "available";
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
613 break;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
614 case QQ_BUDDY_CHANGE_TO_OFFLINE:
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
615 status_id = "offline";
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
616 break;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
617 case QQ_BUDDY_ONLINE_AWAY:
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
618 status_id = "away";
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
619 break;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
620 case QQ_BUDDY_ONLINE_INVISIBLE:
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
621 status_id = "invisible";
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
622 break;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
623 case QQ_BUDDY_ONLINE_BUSY:
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
624 status_id = "busy";
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
625 break;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
626 default:
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
627 status_id = "invisible";
24366
ccfd4cba02a4 2008.10.10 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24363
diff changeset
628 purple_debug_error("QQ", "unknown status: 0x%X\n", status);
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
629 break;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
630 }
25027
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
631
25050
c4bea116ae9b Clean debug info
Hu Yong <ccpaging@gmail.com>
parents: 25027
diff changeset
632 purple_debug_info("QQ", "buddy %u status = %s\n", uid, status_id);
25027
4166c4514e28 Change QQ number to unsigned long
Hu Yong <ccpaging@gmail.com>
parents: 24366
diff changeset
633 who = uid_to_purple_name(uid);
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
634 purple_prpl_got_user_status(gc->account, who, status_id, NULL);
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
635
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
636 if (flag & QQ_COMM_FLAG_MOBILE && status != QQ_BUDDY_OFFLINE)
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
637 purple_prpl_got_user_status(gc->account, who, "mobile", NULL);
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
638 else
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
639 purple_prpl_got_user_status_deactive(gc->account, who, "mobile");
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
640
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
641 g_free(who);
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
642 }
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
643
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
644 /* refresh all buddies online/offline,
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
645 * after receiving reply for get_buddies_online packet */
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
646 void qq_update_buddyies_status(PurpleConnection *gc)
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
647 {
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
648 qq_data *qd;
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
649 PurpleBuddy *buddy;
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
650 qq_buddy_data *bd;
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
651 GSList *buddies, *it;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
652 time_t tm_limit = time(NULL);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
653
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
654 qd = (qq_data *) (gc->proto_data);
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
655
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
656 tm_limit -= QQ_UPDATE_ONLINE_INTERVAL;
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
657
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
658 buddies = purple_find_buddies(purple_connection_get_account(gc), NULL);
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
659 for (it = buddies; it; it = it->next) {
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
660 buddy = it->data;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
661 if (buddy == NULL) continue;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
662 if (buddy->proto_data == NULL) continue;
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
663
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
664 bd = (qq_buddy_data *)buddy->proto_data;
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
665 if (bd->uid == 0) continue;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
666 if (bd->uid == qd->uid) continue; /* my status is always online in my buddy list */
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
667 if (tm_limit < bd->last_update) continue;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
668 if (bd->status == QQ_BUDDY_ONLINE_INVISIBLE) continue;
24363
383f01928954 2008.10.09 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24362
diff changeset
669 if (bd->status == QQ_BUDDY_CHANGE_TO_OFFLINE) continue;
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
670
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
671 bd->status = QQ_BUDDY_CHANGE_TO_OFFLINE;
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
672 bd->last_update = time(NULL);
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
673 qq_update_buddy_status(gc, bd->uid, bd->status, bd->comm_flag);
23950
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
674 }
a974649cdb89 2008.08.02 - csyfek <csyfek(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 23212
diff changeset
675 }
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
676
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
677 void qq_buddy_data_free_all(PurpleConnection *gc)
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
678 {
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
679 qq_data *qd;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
680 PurpleBuddy *buddy;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
681 GSList *buddies, *it;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
682 gint count = 0;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
683
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
684 qd = (qq_data *) (gc->proto_data);
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
685
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
686 buddies = purple_find_buddies(purple_connection_get_account(gc), NULL);
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
687 for (it = buddies; it; it = it->next) {
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
688 buddy = it->data;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
689 if (buddy == NULL) continue;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
690 if (buddy->proto_data == NULL) continue;
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
691
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
692 qq_buddy_data_free(buddy->proto_data);
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
693 buddy->proto_data = NULL;
24355
c9deccad8f3f 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24354
diff changeset
694
24354
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
695 count++;
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
696 }
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
697
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
698 if (count > 0) {
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
699 purple_debug_info("QQ", "%d buddies' data are freed\n", count);
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
700 }
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
701 }
dcb8e72dad63 2008.10.07 - ccpaging <ccpaging(at)gmail.com>
SHiNE CsyFeK <csyfek@gmail.com>
parents: 24352
diff changeset
702

mercurial