comparison libpurple/protocols/qq/buddy_opt.c @ 24079:1bdf7b602684

2008.10.07 - ccpaging <ccpaging(at)gmail.com> * Update qun conversation * Drop group_conv.c and group_conv.h
author SHiNE CsyFeK <csyfek@gmail.com>
date Wed, 22 Oct 2008 14:58:32 +0000
parents ce94189f15ad
children 818ab62006f5
comparison
equal deleted inserted replaced
24078:0a92aa673a33 24079:1bdf7b602684
289 { 289 {
290 PurpleConnection *gc; 290 PurpleConnection *gc;
291 qq_data *qd; 291 qq_data *qd;
292 gchar *purple_name; 292 gchar *purple_name;
293 PurpleBuddy *buddy; 293 PurpleBuddy *buddy;
294 qq_buddy *q_buddy;
295 294
296 g_return_if_fail(add_req != NULL); 295 g_return_if_fail(add_req != NULL);
297 if (add_req->gc == NULL || add_req->uid == 0) { 296 if (add_req->gc == NULL || add_req->uid == 0) {
298 g_free(add_req); 297 g_free(add_req);
299 return; 298 return;
310 if (buddy == NULL) { 309 if (buddy == NULL) {
311 g_free(add_req); 310 g_free(add_req);
312 return; 311 return;
313 } 312 }
314 313
315 q_buddy = (qq_buddy *) buddy->proto_data; 314 if (buddy->proto_data != NULL) {
316 if (q_buddy != NULL) 315 qq_buddy_data_free(buddy->proto_data);
317 qd->buddies = g_list_remove(qd->buddies, q_buddy); 316 buddy->proto_data = NULL;
318 else 317 } else {
319 purple_debug_warning("QQ", "We have no qq_buddy record for %s\n", buddy->name); 318 purple_debug_warning("QQ", "We have no qq_buddy record for %s\n", buddy->name);
320 319 }
320
321 purple_blist_remove_buddy(buddy); 321 purple_blist_remove_buddy(buddy);
322 g_free(add_req); 322 g_free(add_req);
323 } 323 }
324 324
325 /* remove a buddy from my list and remove myself from his list */ 325 /* remove a buddy from my list and remove myself from his list */
474 add_req); 474 add_req);
475 g_free(msg); 475 g_free(msg);
476 g_free(nombre); 476 g_free(nombre);
477 } else { /* add OK */ 477 } else { /* add OK */
478 qq_create_buddy(gc, uid, TRUE, TRUE); 478 qq_create_buddy(gc, uid, TRUE, TRUE);
479
479 msg = g_strdup_printf(_("Successed adding into %d's buddy list"), uid); 480 msg = g_strdup_printf(_("Successed adding into %d's buddy list"), uid);
480 qq_got_attention(gc, msg); 481 qq_got_attention(gc, msg);
481 g_free(msg); 482 g_free(msg);
482 } 483 }
483 g_strfreev(segments); 484 g_strfreev(segments);
484 } 485 }
485 486
486 PurpleGroup *qq_create_group(const gchar *group_name) 487 PurpleGroup *qq_group_find_or_new(const gchar *group_name)
487 { 488 {
488 PurpleGroup *g; 489 PurpleGroup *g;
489 490
490 g_return_val_if_fail(group_name != NULL, NULL); 491 g_return_val_if_fail(group_name != NULL, NULL);
491 492
518 purple_account_get_username(gc->account)); 519 purple_account_get_username(gc->account));
519 } else { 520 } else {
520 group_name = g_strdup(PURPLE_GROUP_QQ_UNKNOWN); 521 group_name = g_strdup(PURPLE_GROUP_QQ_UNKNOWN);
521 } 522 }
522 523
523 group = qq_create_group(group_name); 524 group = qq_group_find_or_new(group_name);
524 525
525 buddy_name = uid_to_purple_name(uid); 526 buddy_name = uid_to_purple_name(uid);
526 purple_buddy = purple_find_buddy(gc->account, buddy_name); 527 purple_buddy = purple_find_buddy(gc->account, buddy_name);
527 /* remove old, we can not simply return here 528 /* remove old, we can not simply return here
528 * because there might be old local copy of this buddy */ 529 * because there might be old local copy of this buddy */
542 purple_buddy->proto_data = NULL; 543 purple_buddy->proto_data = NULL;
543 else { 544 else {
544 buddy = g_new0(qq_buddy, 1); 545 buddy = g_new0(qq_buddy, 1);
545 buddy->uid = uid; 546 buddy->uid = uid;
546 purple_buddy->proto_data = buddy; 547 purple_buddy->proto_data = buddy;
547 qd->buddies = g_list_append(qd->buddies, buddy);
548 qq_request_buddy_info(gc, uid, 0, 0); 548 qq_request_buddy_info(gc, uid, 0, 0);
549 qq_request_get_buddies_online(gc, 0, 0); 549 qq_request_get_buddies_online(gc, 0, 0);
550 if (qd->client_version >= 2007) { 550 if (qd->client_version >= 2007) {
551 qq_request_get_level_2007(gc, uid); 551 qq_request_get_level_2007(gc, uid);
552 } else { 552 } else {
553 qq_request_get_level(gc, uid); 553 qq_request_get_level(gc, uid);
554 } 554 }
555 } 555 }
556 556
557 purple_blist_add_buddy(purple_buddy, NULL, group, NULL); 557 purple_blist_add_buddy(purple_buddy, NULL, group, NULL);
558 purple_debug_warning("QQ", "Add new buddy: [%s]\n", buddy_name); 558 purple_debug_info("QQ", "Add new buddy: [%s]\n", buddy_name);
559 559
560 g_free(buddy_name); 560 g_free(buddy_name);
561 g_free(group_name); 561 g_free(group_name);
562 562
563 return purple_buddy; 563 return purple_buddy;
564 } 564 }
565 565
566 qq_buddy *qq_get_buddy(PurpleConnection *gc, guint32 uid) 566 static qq_buddy *qq_buddy_data_new(guint32 uid)
567 {
568 qq_buddy *buddy = g_new0(qq_buddy, 1);
569 memset(buddy, 0, sizeof(qq_buddy));
570 buddy->uid = uid;
571 buddy->status = QQ_BUDDY_ONLINE_NORMAL;
572 return buddy;
573 }
574
575 qq_buddy *qq_buddy_find(PurpleConnection *gc, guint32 uid)
567 { 576 {
568 gchar *purple_name; 577 gchar *purple_name;
569 PurpleBuddy *purple_buddy; 578 PurpleBuddy *purple_buddy;
570 579
571 g_return_val_if_fail(gc != NULL, NULL); 580 g_return_val_if_fail(gc != NULL, NULL);
572 purple_name = uid_to_purple_name(uid); 581 purple_name = uid_to_purple_name(uid);
573 if (purple_name == NULL) return NULL; 582 if (purple_name == NULL) return NULL;
574 583
575 purple_buddy = purple_find_buddy(purple_connection_get_account(gc), purple_name); 584 purple_buddy = purple_find_buddy(purple_connection_get_account(gc), purple_name);
576 g_free(purple_name); 585 g_free(purple_name);
577 if (purple_buddy == NULL) return NULL; 586 if (purple_buddy == NULL) {
578 587 purple_debug_error("QQ", "Can not find purple buddy of %d\n", uid);
588 return NULL;
589 }
579 if (purple_buddy->proto_data == NULL) { 590 if (purple_buddy->proto_data == NULL) {
580 purple_debug_error("QQ", "Can not find buddy data of %d\n", uid); 591 purple_debug_error("QQ", "Can not find buddy data of %d\n", uid);
581 return NULL; 592 return NULL;
582 } 593 }
583 return (qq_buddy *) purple_buddy->proto_data; 594 return (qq_buddy *)purple_buddy->proto_data;
595 }
596
597 void qq_buddy_data_free(qq_buddy *bd)
598 {
599 g_return_if_fail(bd != NULL);
600
601 if (bd->nickname) g_free(bd->nickname);
602 g_free(bd);
603 }
604
605 static PurpleBuddy *qq_buddy_new(PurpleConnection *gc, gchar *who)
606 {
607 PurpleBuddy *buddy;
608 PurpleGroup *group;
609 gchar *group_name;
610
611 g_return_val_if_fail(gc->account != NULL && who != NULL, NULL);
612
613 group_name = g_strdup_printf(PURPLE_GROUP_QQ_FORMAT,
614 purple_account_get_username(gc->account));
615 group = qq_group_find_or_new(group_name);
616 if (group == NULL) {
617 purple_debug_error("QQ", "Failed creating group %s\n", group_name);
618 return NULL;
619 }
620
621 buddy = purple_buddy_new(gc->account, who, NULL); /* alias is NULL */
622 buddy->proto_data = NULL;
623
624 purple_blist_add_buddy(buddy, NULL, group, NULL);
625 purple_debug_info("QQ", "Add new purple buddy: [%s]\n", who);
626
627 g_free(group_name);
628
629 return buddy;
630 }
631
632 PurpleBuddy *qq_buddy_find_or_new(PurpleConnection *gc, guint32 uid)
633 {
634 PurpleBuddy *buddy;
635 gchar *who;
636
637 g_return_val_if_fail(gc->account != NULL && uid != 0, NULL);
638
639 who = uid_to_purple_name(uid);
640
641 buddy = purple_find_buddy(gc->account, who);
642 if (buddy == NULL) {
643 buddy = qq_buddy_new(gc, who);
644 if (buddy == NULL) {
645 g_free(who);
646 return NULL;
647 }
648 }
649
650 if (buddy->proto_data != NULL) {
651 g_free(who);
652 return buddy;
653 }
654
655 buddy->proto_data = qq_buddy_data_new(uid);
656
657 g_free(who);
658 return buddy;
584 } 659 }
585 660
586 /* remove a buddy and send packet to QQ server accordingly */ 661 /* remove a buddy and send packet to QQ server accordingly */
587 void qq_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) 662 void qq_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group)
588 { 663 {
589 qq_data *qd; 664 qq_data *qd;
590 qq_buddy *q_bud;
591 guint32 uid; 665 guint32 uid;
592 666
593 g_return_if_fail(gc != NULL && gc->proto_data != NULL); 667 g_return_if_fail(gc != NULL && gc->proto_data != NULL);
594 g_return_if_fail(buddy != NULL); 668 g_return_if_fail(buddy != NULL);
595 qd = (qq_data *) gc->proto_data; 669 qd = (qq_data *) gc->proto_data;
600 674
601 if (uid > 0) { 675 if (uid > 0) {
602 request_buddy_remove(gc, uid); 676 request_buddy_remove(gc, uid);
603 } 677 }
604 678
605 q_bud = (qq_buddy *) buddy->proto_data; 679 if (buddy->proto_data) {
606 if (q_bud != NULL) 680 qq_buddy_data_free(buddy->proto_data);
607 qd->buddies = g_list_remove(qd->buddies, q_bud); 681 buddy->proto_data = NULL;
608 else 682 } else {
609 purple_debug_warning("QQ", "We have no qq_buddy record for %s\n", buddy->name); 683 purple_debug_warning("QQ", "We have no qq_buddy record for %s\n", buddy->name);
610 684 }
685
611 /* Do not call purple_blist_remove_buddy, 686 /* Do not call purple_blist_remove_buddy,
612 * otherwise purple segmentation fault */ 687 * otherwise purple segmentation fault */
613 }
614
615 /* free all qq_buddy */
616 void qq_buddies_list_free(PurpleAccount *account, qq_data *qd)
617 {
618 gint count;
619 qq_buddy *p;
620 gchar *name;
621 PurpleBuddy *b;
622
623 count = 0;
624 while (qd->buddies) {
625 p = (qq_buddy *) (qd->buddies->data);
626 qd->buddies = g_list_remove(qd->buddies, p);
627 name = uid_to_purple_name(p->uid);
628 b = purple_find_buddy(account, name);
629 if(b != NULL)
630 b->proto_data = NULL;
631 else
632 purple_debug_info("QQ", "qq_buddy %s not found in purple proto_data\n", name);
633 g_free(name);
634
635 g_free(p);
636 count++;
637 }
638 if (count > 0) {
639 purple_debug_info("QQ", "%d qq_buddy structures are freed!\n", count);
640 }
641 } 688 }
642 689
643 /* someone wants to add you to his buddy list */ 690 /* someone wants to add you to his buddy list */
644 static void server_buddy_add_request(PurpleConnection *gc, gchar *from, gchar *to, gchar *msg_utf8) 691 static void server_buddy_add_request(PurpleConnection *gc, gchar *from, gchar *to, gchar *msg_utf8)
645 { 692 {