Mercurial > pidgin.yaz
comparison libpurple/protocols/qq/buddy_opt.c @ 24080:818ab62006f5
2008.10.07 - ccpaging <ccpaging(at)gmail.com>
* Update qq_buddy
author | SHiNE CsyFeK <csyfek@gmail.com> |
---|---|
date | Wed, 22 Oct 2008 14:59:55 +0000 |
parents | 1bdf7b602684 |
children | 9be95f0b9472 |
comparison
equal
deleted
inserted
replaced
24079:1bdf7b602684 | 24080:818ab62006f5 |
---|---|
313 | 313 |
314 if (buddy->proto_data != NULL) { | 314 if (buddy->proto_data != NULL) { |
315 qq_buddy_data_free(buddy->proto_data); | 315 qq_buddy_data_free(buddy->proto_data); |
316 buddy->proto_data = NULL; | 316 buddy->proto_data = NULL; |
317 } else { | 317 } else { |
318 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_data record for %s\n", buddy->name); |
319 } | 319 } |
320 | 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 */ |
473 purple_connection_get_account(gc), nombre, NULL, | 473 purple_connection_get_account(gc), nombre, NULL, |
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_buddy_find_or_new(gc, uid); |
479 | |
480 msg = g_strdup_printf(_("Successed adding into %d's buddy list"), uid); | |
481 qq_got_attention(gc, msg); | |
482 g_free(msg); | |
483 } | |
484 g_strfreev(segments); | |
485 } | |
486 | |
487 PurpleGroup *qq_group_find_or_new(const gchar *group_name) | |
488 { | |
489 PurpleGroup *g; | |
490 | |
491 g_return_val_if_fail(group_name != NULL, NULL); | |
492 | |
493 g = purple_find_group(group_name); | |
494 if (g == NULL) { | |
495 g = purple_group_new(group_name); | |
496 purple_blist_add_group(g, NULL); | |
497 purple_debug_warning("QQ", "Add new group: %s\n", group_name); | |
498 } | |
499 | |
500 return g; | |
501 } | |
502 | |
503 /* we add new buddy, if the received packet is from someone not in my list | |
504 * return the PurpleBuddy that is just created */ | |
505 PurpleBuddy *qq_create_buddy(PurpleConnection *gc, guint32 uid, | |
506 gboolean is_known, gboolean is_create_data) | |
507 { | |
508 PurpleBuddy *purple_buddy; | |
509 PurpleGroup *group; | |
510 qq_data *qd; | |
511 qq_buddy *buddy; | |
512 gchar *buddy_name, *group_name; | |
513 | |
514 g_return_val_if_fail(gc->account != NULL && uid != 0, NULL); | |
515 qd = (qq_data *) gc->proto_data; | |
516 | |
517 if (is_known) { | |
518 group_name = g_strdup_printf(PURPLE_GROUP_QQ_FORMAT, | |
519 purple_account_get_username(gc->account)); | |
520 } else { | |
521 group_name = g_strdup(PURPLE_GROUP_QQ_UNKNOWN); | |
522 } | |
523 | |
524 group = qq_group_find_or_new(group_name); | |
525 | |
526 buddy_name = uid_to_purple_name(uid); | |
527 purple_buddy = purple_find_buddy(gc->account, buddy_name); | |
528 /* remove old, we can not simply return here | |
529 * because there might be old local copy of this buddy */ | |
530 if (purple_buddy != NULL) | |
531 purple_blist_remove_buddy(purple_buddy); | |
532 | |
533 purple_buddy = purple_buddy_new(gc->account, buddy_name, NULL); | |
534 if ( !is_known) { | |
535 if (purple_privacy_check(gc->account, buddy_name)) { | |
536 purple_privacy_deny(gc->account, buddy_name, TRUE, FALSE); | |
537 } else { | |
538 purple_privacy_deny_add(gc->account, buddy_name, TRUE); | |
539 } | |
540 } | |
541 | |
542 if (!is_create_data) | |
543 purple_buddy->proto_data = NULL; | |
544 else { | |
545 buddy = g_new0(qq_buddy, 1); | |
546 buddy->uid = uid; | |
547 purple_buddy->proto_data = buddy; | |
548 qq_request_buddy_info(gc, uid, 0, 0); | 479 qq_request_buddy_info(gc, uid, 0, 0); |
549 qq_request_get_buddies_online(gc, 0, 0); | 480 qq_request_get_buddies_online(gc, 0, 0); |
550 if (qd->client_version >= 2007) { | 481 if (qd->client_version >= 2007) { |
551 qq_request_get_level_2007(gc, uid); | 482 qq_request_get_level_2007(gc, uid); |
552 } else { | 483 } else { |
553 qq_request_get_level(gc, uid); | 484 qq_request_get_level(gc, uid); |
554 } | 485 } |
555 } | 486 |
556 | 487 msg = g_strdup_printf(_("Successed adding into %d's buddy list"), uid); |
557 purple_blist_add_buddy(purple_buddy, NULL, group, NULL); | 488 qq_got_attention(gc, msg); |
558 purple_debug_info("QQ", "Add new buddy: [%s]\n", buddy_name); | 489 g_free(msg); |
559 | 490 } |
560 g_free(buddy_name); | 491 g_strfreev(segments); |
561 g_free(group_name); | 492 } |
562 | 493 |
563 return purple_buddy; | 494 PurpleGroup *qq_group_find_or_new(const gchar *group_name) |
564 } | 495 { |
565 | 496 PurpleGroup *g; |
566 static qq_buddy *qq_buddy_data_new(guint32 uid) | 497 |
567 { | 498 g_return_val_if_fail(group_name != NULL, NULL); |
568 qq_buddy *buddy = g_new0(qq_buddy, 1); | 499 |
569 memset(buddy, 0, sizeof(qq_buddy)); | 500 g = purple_find_group(group_name); |
570 buddy->uid = uid; | 501 if (g == NULL) { |
571 buddy->status = QQ_BUDDY_ONLINE_NORMAL; | 502 g = purple_group_new(group_name); |
572 return buddy; | 503 purple_blist_add_group(g, NULL); |
573 } | 504 purple_debug_warning("QQ", "Add new group: %s\n", group_name); |
574 | 505 } |
575 qq_buddy *qq_buddy_find(PurpleConnection *gc, guint32 uid) | 506 |
576 { | 507 return g; |
577 gchar *purple_name; | 508 } |
578 PurpleBuddy *purple_buddy; | 509 |
510 static qq_buddy_data *qq_buddy_data_new(guint32 uid) | |
511 { | |
512 qq_buddy_data *bd = g_new0(qq_buddy_data, 1); | |
513 memset(bd, 0, sizeof(qq_buddy_data)); | |
514 bd->uid = uid; | |
515 bd->status = QQ_BUDDY_ONLINE_NORMAL; | |
516 return bd; | |
517 } | |
518 | |
519 qq_buddy_data *qq_buddy_data_find(PurpleConnection *gc, guint32 uid) | |
520 { | |
521 gchar *who; | |
522 PurpleBuddy *buddy; | |
579 | 523 |
580 g_return_val_if_fail(gc != NULL, NULL); | 524 g_return_val_if_fail(gc != NULL, NULL); |
581 purple_name = uid_to_purple_name(uid); | 525 |
582 if (purple_name == NULL) return NULL; | 526 who = uid_to_purple_name(uid); |
583 | 527 if (who == NULL) return NULL; |
584 purple_buddy = purple_find_buddy(purple_connection_get_account(gc), purple_name); | 528 buddy = purple_find_buddy(purple_connection_get_account(gc), who); |
585 g_free(purple_name); | 529 g_free(who); |
586 if (purple_buddy == NULL) { | 530 |
531 if (buddy == NULL) { | |
587 purple_debug_error("QQ", "Can not find purple buddy of %d\n", uid); | 532 purple_debug_error("QQ", "Can not find purple buddy of %d\n", uid); |
588 return NULL; | 533 return NULL; |
589 } | 534 } |
590 if (purple_buddy->proto_data == NULL) { | 535 if (buddy->proto_data == NULL) { |
591 purple_debug_error("QQ", "Can not find buddy data of %d\n", uid); | 536 purple_debug_error("QQ", "Can not find buddy data of %d\n", uid); |
592 return NULL; | 537 return NULL; |
593 } | 538 } |
594 return (qq_buddy *)purple_buddy->proto_data; | 539 return (qq_buddy_data *)buddy->proto_data; |
595 } | 540 } |
596 | 541 |
597 void qq_buddy_data_free(qq_buddy *bd) | 542 void qq_buddy_data_free(qq_buddy_data *bd) |
598 { | 543 { |
599 g_return_if_fail(bd != NULL); | 544 g_return_if_fail(bd != NULL); |
600 | 545 |
601 if (bd->nickname) g_free(bd->nickname); | 546 if (bd->nickname) g_free(bd->nickname); |
602 g_free(bd); | 547 g_free(bd); |
603 } | 548 } |
604 | 549 |
605 static PurpleBuddy *qq_buddy_new(PurpleConnection *gc, gchar *who) | 550 /* create purple buddy without data and display with no-auth icon */ |
551 PurpleBuddy *qq_buddy_new(PurpleConnection *gc, guint32 uid) | |
606 { | 552 { |
607 PurpleBuddy *buddy; | 553 PurpleBuddy *buddy; |
608 PurpleGroup *group; | 554 PurpleGroup *group; |
555 gchar *who; | |
609 gchar *group_name; | 556 gchar *group_name; |
610 | 557 |
611 g_return_val_if_fail(gc->account != NULL && who != NULL, NULL); | 558 g_return_val_if_fail(gc->account != NULL && uid != 0, NULL); |
612 | 559 |
613 group_name = g_strdup_printf(PURPLE_GROUP_QQ_FORMAT, | 560 group_name = g_strdup_printf(PURPLE_GROUP_QQ_FORMAT, |
614 purple_account_get_username(gc->account)); | 561 purple_account_get_username(gc->account)); |
615 group = qq_group_find_or_new(group_name); | 562 group = qq_group_find_or_new(group_name); |
616 if (group == NULL) { | 563 if (group == NULL) { |
617 purple_debug_error("QQ", "Failed creating group %s\n", group_name); | 564 purple_debug_error("QQ", "Failed creating group %s\n", group_name); |
618 return NULL; | 565 return NULL; |
619 } | 566 } |
620 | 567 |
568 who = uid_to_purple_name(uid); | |
621 buddy = purple_buddy_new(gc->account, who, NULL); /* alias is NULL */ | 569 buddy = purple_buddy_new(gc->account, who, NULL); /* alias is NULL */ |
570 g_free(who); | |
622 buddy->proto_data = NULL; | 571 buddy->proto_data = NULL; |
623 | 572 |
624 purple_blist_add_buddy(buddy, NULL, group, NULL); | 573 purple_blist_add_buddy(buddy, NULL, group, NULL); |
625 purple_debug_info("QQ", "Add new purple buddy: [%s]\n", who); | 574 purple_debug_info("QQ", "Add new purple buddy: [%s]\n", who); |
626 | 575 |
627 g_free(group_name); | 576 g_free(group_name); |
628 | 577 |
629 return buddy; | 578 return buddy; |
630 } | 579 } |
631 | 580 |
632 PurpleBuddy *qq_buddy_find_or_new(PurpleConnection *gc, guint32 uid) | 581 PurpleBuddy *qq_buddy_find(PurpleConnection *gc, guint32 uid) |
633 { | 582 { |
634 PurpleBuddy *buddy; | 583 PurpleBuddy *buddy; |
635 gchar *who; | 584 gchar *who; |
636 | 585 |
637 g_return_val_if_fail(gc->account != NULL && uid != 0, NULL); | 586 g_return_val_if_fail(gc->account != NULL && uid != 0, NULL); |
638 | 587 |
639 who = uid_to_purple_name(uid); | 588 who = uid_to_purple_name(uid); |
640 | |
641 buddy = purple_find_buddy(gc->account, who); | 589 buddy = purple_find_buddy(gc->account, who); |
590 g_free(who); | |
591 return buddy; | |
592 } | |
593 | |
594 PurpleBuddy *qq_buddy_find_or_new(PurpleConnection *gc, guint32 uid) | |
595 { | |
596 PurpleBuddy *buddy; | |
597 | |
598 g_return_val_if_fail(gc->account != NULL && uid != 0, NULL); | |
599 | |
600 buddy = qq_buddy_find(gc, uid); | |
642 if (buddy == NULL) { | 601 if (buddy == NULL) { |
643 buddy = qq_buddy_new(gc, who); | 602 buddy = qq_buddy_new(gc, uid); |
644 if (buddy == NULL) { | 603 if (buddy == NULL) { |
645 g_free(who); | |
646 return NULL; | 604 return NULL; |
647 } | 605 } |
648 } | 606 } |
649 | 607 |
650 if (buddy->proto_data != NULL) { | 608 if (buddy->proto_data != NULL) { |
651 g_free(who); | |
652 return buddy; | 609 return buddy; |
653 } | 610 } |
654 | 611 |
655 buddy->proto_data = qq_buddy_data_new(uid); | 612 buddy->proto_data = qq_buddy_data_new(uid); |
656 | |
657 g_free(who); | |
658 return buddy; | 613 return buddy; |
659 } | 614 } |
660 | 615 |
661 /* remove a buddy and send packet to QQ server accordingly */ | 616 /* remove a buddy and send packet to QQ server accordingly */ |
662 void qq_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) | 617 void qq_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) |
678 | 633 |
679 if (buddy->proto_data) { | 634 if (buddy->proto_data) { |
680 qq_buddy_data_free(buddy->proto_data); | 635 qq_buddy_data_free(buddy->proto_data); |
681 buddy->proto_data = NULL; | 636 buddy->proto_data = NULL; |
682 } else { | 637 } else { |
683 purple_debug_warning("QQ", "We have no qq_buddy record for %s\n", buddy->name); | 638 purple_debug_warning("QQ", "We have no qq_buddy_data record for %s\n", buddy->name); |
684 } | 639 } |
685 | 640 |
686 /* Do not call purple_blist_remove_buddy, | 641 /* Do not call purple_blist_remove_buddy, |
687 * otherwise purple segmentation fault */ | 642 * otherwise purple segmentation fault */ |
688 } | 643 } |
689 | 644 |
690 /* someone wants to add you to his buddy list */ | 645 /* someone wants to add you to his buddy list */ |
782 /* the buddy approves your request of adding him/her as your friend */ | 737 /* the buddy approves your request of adding him/her as your friend */ |
783 static void server_buddy_added_me(PurpleConnection *gc, gchar *from, gchar *to, gchar *msg_utf8) | 738 static void server_buddy_added_me(PurpleConnection *gc, gchar *from, gchar *to, gchar *msg_utf8) |
784 { | 739 { |
785 PurpleAccount *account = purple_connection_get_account(gc); | 740 PurpleAccount *account = purple_connection_get_account(gc); |
786 qq_data *qd; | 741 qq_data *qd; |
742 guint32 uid; | |
787 | 743 |
788 g_return_if_fail(from != NULL && to != NULL); | 744 g_return_if_fail(from != NULL && to != NULL); |
789 | 745 |
790 qd = (qq_data *) gc->proto_data; | 746 qd = (qq_data *) gc->proto_data; |
791 qq_create_buddy(gc, strtol(from, NULL, 10), TRUE, TRUE); | 747 uid = strtol(from, NULL, 10); |
748 | |
749 g_return_if_fail(uid > 0); | |
750 | |
751 qq_buddy_find_or_new(gc, uid); | |
752 qq_request_buddy_info(gc, uid, 0, 0); | |
753 qq_request_get_buddies_online(gc, 0, 0); | |
754 if (qd->client_version >= 2007) { | |
755 qq_request_get_level_2007(gc, uid); | |
756 } else { | |
757 qq_request_get_level(gc, uid); | |
758 } | |
792 | 759 |
793 purple_account_notify_added(account, from, to, NULL, msg_utf8); | 760 purple_account_notify_added(account, from, to, NULL, msg_utf8); |
794 } | 761 } |
795 | 762 |
796 /* you are rejected by the person */ | 763 /* you are rejected by the person */ |