| 40 #include "group.h" // qq_group, by gfhuang |
40 #include "group.h" // qq_group, by gfhuang |
| 41 #include "group_find.h" // qq_group_find |
41 #include "group_find.h" // qq_group_find |
| 42 #include "group_hash.h" //qq_group_create_by_id |
42 #include "group_hash.h" //qq_group_create_by_id |
| 43 #include "group_info.h" //qq_send_cmd_group_get_group_info |
43 #include "group_info.h" //qq_send_cmd_group_get_group_info |
| 44 |
44 |
| |
45 #include "qq_proxy.h" |
| |
46 |
| 45 #define QQ_GET_ONLINE_BUDDY_02 0x02 |
47 #define QQ_GET_ONLINE_BUDDY_02 0x02 |
| 46 #define QQ_GET_ONLINE_BUDDY_03 0x03 // unknown function |
48 #define QQ_GET_ONLINE_BUDDY_03 0x03 // unknown function |
| 47 |
49 |
| 48 #define QQ_ONLINE_BUDDY_ENTRY_LEN 38 |
50 #define QQ_ONLINE_BUDDY_ENTRY_LEN 38 |
| 49 |
51 |
| 53 guint8 flag1; |
55 guint8 flag1; |
| 54 guint8 comm_flag; |
56 guint8 comm_flag; |
| 55 guint16 unknown2; |
57 guint16 unknown2; |
| 56 guint8 ending; //0x00 |
58 guint8 ending; //0x00 |
| 57 } qq_friends_online_entry; |
59 } qq_friends_online_entry; |
| 58 |
|
| 59 //TODO: defined in qq_buddy_status.c, but only used here. Check decomposition. |
|
| 60 extern void // defined in qq_buddy_status.c |
|
| 61 _qq_buddy_status_dump_unclear(qq_buddy_status * s); |
|
| 62 |
|
| 63 extern gint // defined in qq_buddy_status.c |
|
| 64 _qq_buddy_status_read(guint8 * data, guint8 ** cursor, gint len, qq_buddy_status * s); |
|
| 65 |
60 |
| 66 /*****************************************************************************/ |
61 /*****************************************************************************/ |
| 67 // get a list of online_buddies |
62 // get a list of online_buddies |
| 68 void qq_send_packet_get_buddies_online(GaimConnection * gc, guint8 position) |
63 void qq_send_packet_get_buddies_online(GaimConnection * gc, guint8 position) |
| 69 { |
64 { |
| 146 { |
141 { |
| 147 GString *dump; |
142 GString *dump; |
| 148 |
143 |
| 149 g_return_if_fail(fe != NULL); |
144 g_return_if_fail(fe != NULL); |
| 150 |
145 |
| 151 _qq_buddy_status_dump_unclear(fe->s); |
146 qq_buddy_status_dump_unclear(fe->s); |
| 152 |
147 |
| 153 dump = g_string_new(""); |
148 dump = g_string_new(""); |
| 154 g_string_append_printf(dump, "unclear fields for [%d]:\n", fe->s->uid); |
149 g_string_append_printf(dump, "unclear fields for [%d]:\n", fe->s->uid); |
| 155 g_string_append_printf(dump, "031-032: %04x (unknown)\n", fe->unknown1); |
150 g_string_append_printf(dump, "031-032: %04x (unknown)\n", fe->unknown1); |
| 156 g_string_append_printf(dump, "033: %02x (flag1)\n", fe->flag1); |
151 g_string_append_printf(dump, "033: %02x (flag1)\n", fe->flag1); |
| 178 qd = (qq_data *) gc->proto_data; |
173 qd = (qq_data *) gc->proto_data; |
| 179 len = buf_len; |
174 len = buf_len; |
| 180 data = g_newa(guint8, len); |
175 data = g_newa(guint8, len); |
| 181 cursor = data; |
176 cursor = data; |
| 182 |
177 |
| |
178 gaim_debug(GAIM_DEBUG_INFO, "QQ", "processing get_buddies_online_reply\n"); |
| |
179 |
| 183 if (qq_crypt(DECRYPT, buf, buf_len, qd->session_key, data, &len)) { |
180 if (qq_crypt(DECRYPT, buf, buf_len, qd->session_key, data, &len)) { |
| 184 |
181 |
| |
182 _qq_show_packet("Get buddies online reply packet", data, len); |
| |
183 |
| 185 read_packet_b(data, &cursor, len, &position); |
184 read_packet_b(data, &cursor, len, &position); |
| |
185 |
| 186 fe = g_newa(qq_friends_online_entry, 1); |
186 fe = g_newa(qq_friends_online_entry, 1); |
| 187 fe->s = g_newa(qq_buddy_status, 1); |
187 fe->s = g_newa(qq_buddy_status, 1); |
| 188 |
188 |
| 189 while (cursor < (data + len)) { |
189 while (cursor < (data + len)) { |
| 190 // based on one online buddy entry |
190 // based on one online buddy entry |
| 191 bytes = 0; |
191 bytes = 0; |
| 192 // 000-030 qq_buddy_status |
192 // 000-030 qq_buddy_status |
| 193 bytes += _qq_buddy_status_read(data, &cursor, len, fe->s); |
193 bytes += qq_buddy_status_read(data, &cursor, len, fe->s); |
| 194 // 031-032: unknown4 |
194 // 031-032: unknown4 |
| 195 bytes += read_packet_w(data, &cursor, len, &fe->unknown1); |
195 bytes += read_packet_w(data, &cursor, len, &fe->unknown1); |
| 196 // 033-033: flag1 |
196 // 033-033: flag1 |
| 197 bytes += read_packet_b(data, &cursor, len, &fe->flag1); |
197 bytes += read_packet_b(data, &cursor, len, &fe->flag1); |
| 198 // 034-034: comm_flag |
198 // 034-034: comm_flag |
| 207 g_free(fe->s->ip); |
207 g_free(fe->s->ip); |
| 208 g_free(fe->s->unknown_key); |
208 g_free(fe->s->unknown_key); |
| 209 continue; |
209 continue; |
| 210 } // check if it is a valid entry |
210 } // check if it is a valid entry |
| 211 |
211 |
| 212 // if (QQ_DEBUG) |
212 if (QQ_DEBUG) |
| 213 // _qq_buddies_online_reply_dump_unclear(fe); |
213 _qq_buddies_online_reply_dump_unclear(fe); |
| 214 |
214 |
| 215 // update buddy information |
215 // update buddy information |
| 216 b = gaim_find_buddy(gaim_connection_get_account(gc), uid_to_gaim_name(fe->s->uid)); |
216 b = gaim_find_buddy(gaim_connection_get_account(gc), uid_to_gaim_name(fe->s->uid)); |
| 217 q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data; |
217 q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data; |
| 218 |
218 |
| 219 if (q_bud != NULL) { // we find one and update qq_buddy |
219 if (q_bud != NULL) { // we find one and update qq_buddy |
| 220 if(0 != fe->s->client_version) |
220 if(0 != fe->s->client_version) |
| 221 q_bud->client_version = fe->s->client_version; //by gfhuang |
221 q_bud->client_version = fe->s->client_version; //by gfhuang |
| 222 if(0 != *((guint32 *)fe->s->ip)) { // by gfhuang |
222 // if(0 != *((guint32 *)fe->s->ip)) { // by gfhuang |
| 223 g_memmove(q_bud->ip, fe->s->ip, 4); |
223 g_memmove(q_bud->ip, fe->s->ip, 4); |
| 224 q_bud->port = fe->s->port; |
224 q_bud->port = fe->s->port; |
| 225 } |
225 // } |
| 226 q_bud->status = fe->s->status; |
226 q_bud->status = fe->s->status; |
| 227 q_bud->flag1 = fe->flag1; |
227 q_bud->flag1 = fe->flag1; |
| 228 q_bud->comm_flag = fe->comm_flag; |
228 q_bud->comm_flag = fe->comm_flag; |
| 229 qq_update_buddy_contact(gc, q_bud); |
229 qq_update_buddy_contact(gc, q_bud); |
| 230 } // if q_bud |
230 } // if q_bud |