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 */