Mercurial > pidgin.yaz
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 { |