comparison libpurple/protocols/qq/buddy_list.c @ 24071:619ac2303c46

2009.10.02 - ccpaging <ccpaging(at)gmail.com> * Added 'Captcha Display' function * Most functions from patch written by Emil Alexiev merged into trunk, except 'buddy operations' * 'online buddy status' and 'qun buddies' still have problems
author SHiNE CsyFeK <csyfek@gmail.com>
date Wed, 22 Oct 2008 14:43:46 +0000
parents 87e61a85f5dd
children df699d739b8f
comparison
equal deleted inserted replaced
24070:832178d951ca 24071:619ac2303c46
82 82
83 /* position starts with 0x0000, 83 /* position starts with 0x0000,
84 * server may return a position tag if list is too long for one packet */ 84 * server may return a position tag if list is too long for one packet */
85 void qq_request_get_buddies_list(PurpleConnection *gc, guint16 position, gint update_class) 85 void qq_request_get_buddies_list(PurpleConnection *gc, guint16 position, gint update_class)
86 { 86 {
87 qq_data *qd;
87 guint8 raw_data[16] = {0}; 88 guint8 raw_data[16] = {0};
88 gint bytes = 0; 89 gint bytes = 0;
90
91 qd = (qq_data *) gc->proto_data;
89 92
90 /* 000-001 starting position, can manually specify */ 93 /* 000-001 starting position, can manually specify */
91 bytes += qq_put16(raw_data + bytes, position); 94 bytes += qq_put16(raw_data + bytes, position);
92 /* before Mar 18, 2004, any value can work, and we sent 00 95 /* before Mar 18, 2004, any value can work, and we sent 00
93 * I do not know what data QQ server is expecting, as QQ2003iii 0304 itself 96 * I do not know what data QQ server is expecting, as QQ2003iii 0304 itself
94 * even can sending packets 00 and get no response. 97 * even can sending packets 00 and get no response.
95 * Now I tested that 00,00,00,00,00,01 work perfectly 98 * Now I tested that 00,00,00,00,00,01 work perfectly
96 * March 22, found the 00,00,00 starts to work as well */ 99 * March 22, found the 00,00,00 starts to work as well */
97 bytes += qq_put8(raw_data + bytes, 0x00); 100 bytes += qq_put8(raw_data + bytes, 0x00);
98 101 if (qd->client_version >= 2007) {
102 bytes += qq_put16(raw_data + bytes, 0x0000);
103 }
104
99 qq_send_cmd_mess(gc, QQ_CMD_GET_BUDDIES_LIST, raw_data, bytes, update_class, 0); 105 qq_send_cmd_mess(gc, QQ_CMD_GET_BUDDIES_LIST, raw_data, bytes, update_class, 0);
100 } 106 }
101 107
102 /* get all list, buddies & Quns with groupsid support */ 108 /* get all list, buddies & Quns with groupsid support */
103 void qq_request_get_buddies_and_rooms(PurpleConnection *gc, guint32 position, gint update_class) 109 void qq_request_get_buddies_and_rooms(PurpleConnection *gc, guint32 position, gint update_class)
175 bytes += qq_get8(&position, data + bytes); 181 bytes += qq_get8(&position, data + bytes);
176 182
177 count = 0; 183 count = 0;
178 while (bytes < data_len) { 184 while (bytes < data_len) {
179 if (data_len - bytes < QQ_ONLINE_BUDDY_ENTRY_LEN) { 185 if (data_len - bytes < QQ_ONLINE_BUDDY_ENTRY_LEN) {
180 purple_debug_error("QQ", "[buddies online] only %d, need %d", 186 purple_debug_error("QQ", "[buddies online] only %d, need %d\n",
181 (data_len - bytes), QQ_ONLINE_BUDDY_ENTRY_LEN); 187 (data_len - bytes), QQ_ONLINE_BUDDY_ENTRY_LEN);
182 break; 188 break;
183 } 189 }
184 memset(&bo, 0 ,sizeof(bo)); 190 memset(&bo, 0 ,sizeof(bo));
185 191
290 296
291 pascal_len = convert_as_pascal_string(data + bytes, &q_bud->nickname, QQ_CHARSET_DEFAULT); 297 pascal_len = convert_as_pascal_string(data + bytes, &q_bud->nickname, QQ_CHARSET_DEFAULT);
292 bytes += pascal_len; 298 bytes += pascal_len;
293 qq_filter_str(q_bud->nickname); 299 qq_filter_str(q_bud->nickname);
294 300
301 /* Fixme: merge following as 32bit flag */
295 bytes += qq_get16(&unknown, data + bytes); 302 bytes += qq_get16(&unknown, data + bytes);
296 bytes += qq_get8(&q_bud->ext_flag, data + bytes); 303 bytes += qq_get8(&q_bud->ext_flag, data + bytes);
297 bytes += qq_get8(&q_bud->comm_flag, data + bytes); 304 bytes += qq_get8(&q_bud->comm_flag, data + bytes);
298 305
299 bytes_expected = 12 + pascal_len; 306 if (qd->client_version >= 2007) {
307 bytes += 4; /* skip 4 bytes */
308 bytes_expected = 16 + pascal_len;
309 } else {
310 bytes_expected = 12 + pascal_len;
311 }
312
300 313
301 if (q_bud->uid == 0 || (bytes - buddy_bytes) != bytes_expected) { 314 if (q_bud->uid == 0 || (bytes - buddy_bytes) != bytes_expected) {
302 purple_debug_info("QQ", 315 purple_debug_info("QQ",
303 "Buddy entry, expect %d bytes, read %d bytes\n", bytes_expected, bytes - buddy_bytes); 316 "Buddy entry, expect %d bytes, read %d bytes\n", bytes_expected, bytes - buddy_bytes);
304 g_free(q_bud->nickname); 317 g_free(q_bud->nickname);
388 group = qq_room_search_id(gc, uid); 401 group = qq_room_search_id(gc, uid);
389 if(group == NULL) { 402 if(group == NULL) {
390 purple_debug_info("QQ", 403 purple_debug_info("QQ",
391 "Not find room id %d in qq_process_get_buddies_and_rooms\n", uid); 404 "Not find room id %d in qq_process_get_buddies_and_rooms\n", uid);
392 qq_set_pending_id(&qd->adding_groups_from_server, uid, TRUE); 405 qq_set_pending_id(&qd->adding_groups_from_server, uid, TRUE);
406 //group = g_newa(qq_group, 1);
407 //group->id = uid;
408 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_INFO, uid, NULL, 0,
409 0, 0);
393 } else { 410 } else {
394 group->my_role = QQ_ROOM_ROLE_YES; 411 group->my_role = QQ_ROOM_ROLE_YES;
395 qq_group_refresh(gc, group); 412 qq_group_refresh(gc, group);
396 } 413 }
397 ++j; 414 ++j;
419 { 436 {
420 switch(status) { 437 switch(status) {
421 case QQ_BUDDY_ONLINE_NORMAL: 438 case QQ_BUDDY_ONLINE_NORMAL:
422 case QQ_BUDDY_ONLINE_AWAY: 439 case QQ_BUDDY_ONLINE_AWAY:
423 case QQ_BUDDY_ONLINE_INVISIBLE: 440 case QQ_BUDDY_ONLINE_INVISIBLE:
441 case QQ_BUDDY_ONLINE_BUSY:
424 return TRUE; 442 return TRUE;
425 case QQ_BUDDY_CHANGE_TO_OFFLINE: 443 case QQ_BUDDY_CHANGE_TO_OFFLINE:
426 return FALSE; 444 return FALSE;
427 } 445 }
428 return FALSE; 446 return FALSE;
467 if (!qd->is_login) 485 if (!qd->is_login)
468 return; 486 return;
469 487
470 if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_INVISIBLE)) { 488 if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_INVISIBLE)) {
471 away_cmd = QQ_BUDDY_ONLINE_INVISIBLE; 489 away_cmd = QQ_BUDDY_ONLINE_INVISIBLE;
490 } else if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_UNAVAILABLE))
491 {
492 if (qd->client_version >= 2007) {
493 away_cmd = QQ_BUDDY_ONLINE_BUSY;
494 } else {
495 away_cmd = QQ_BUDDY_ONLINE_INVISIBLE;
496 }
472 } else if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_AWAY) 497 } else if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_AWAY)
473 || purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_EXTENDED_AWAY) 498 || purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_EXTENDED_AWAY)
474 || purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_UNAVAILABLE)) { 499 || purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_UNAVAILABLE)) {
475 away_cmd = QQ_BUDDY_ONLINE_AWAY; 500 away_cmd = QQ_BUDDY_ONLINE_AWAY;
476 } else { 501 } else {
477 away_cmd = QQ_BUDDY_ONLINE_NORMAL; 502 away_cmd = QQ_BUDDY_ONLINE_NORMAL;
478 } 503 }
479 504
480 misc_status = 0x00000000; 505 misc_status = 0x00000000;
481 fake_video = purple_prefs_get_bool("/plugins/prpl/qq/show_fake_video"); 506 fake_video = purple_prefs_get_bool("/plugins/prpl/qq/show_fake_video");
482 if (fake_video) 507 if (fake_video)
483 misc_status |= QQ_MISC_STATUS_HAVING_VIIDEO; 508 misc_status |= QQ_MISC_STATUS_HAVING_VIIDEO;
484 509
485 if (qd->client_version > 2005) { 510 if (qd->client_version >= 2007) {
486 bytes = 0; 511 bytes = 0;
487 bytes += qq_put8(raw_data + bytes, away_cmd); 512 bytes += qq_put8(raw_data + bytes, away_cmd);
488 /* status version */ 513 /* status version */
489 bytes += qq_put16(raw_data + bytes, 0); 514 bytes += qq_put16(raw_data + bytes, 0);
490 bytes += qq_put16(raw_data + bytes, 0); 515 bytes += qq_put16(raw_data + bytes, 0);
623 status_id = "away"; 648 status_id = "away";
624 break; 649 break;
625 case QQ_BUDDY_ONLINE_INVISIBLE: 650 case QQ_BUDDY_ONLINE_INVISIBLE:
626 status_id = "invisible"; 651 status_id = "invisible";
627 break; 652 break;
653 case QQ_BUDDY_ONLINE_BUSY:
654 status_id = "busy";
655 break;
628 default: 656 default:
629 status_id = "invisible"; 657 status_id = "invisible";
630 purple_debug_error("QQ", "unknown status: %x\n", q_bud->status); 658 purple_debug_error("QQ", "unknown status: %x\n", q_bud->status);
631 break; 659 break;
632 } 660 }