Mercurial > pidgin
comparison src/protocols/yahoo/yahoo.c @ 9285:7a8aa87164ae
[gaim-migrate @ 10088]
Ok I'm done. This started out as shx's patch to make add/remove
buddy/buddies take GaimBuddy and GaimGroup's in various places.
I think his diff was like 2000 lines and mine is like 5000. I
tried to clean up blist.c a bit and make it more uniform. There
are some more g_return_if_fail() checks. Removed some code that
was deprecated--it's probably been long enough. Removed some
#include <multi.h>'s. Make blist.xml saving happen on a timer,
like prefs.xml and accounts.xml.
Sorry if this doesn't merge cleanly with whatever you're doing.
People should really test this a lot.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Tue, 15 Jun 2004 02:37:27 +0000 |
parents | fe0291162312 |
children | 750d9b56a465 |
comparison
equal
deleted
inserted
replaced
9284:fe0291162312 | 9285:7a8aa87164ae |
---|---|
44 | 44 |
45 extern char *yahoo_crypt(const char *, const char *); | 45 extern char *yahoo_crypt(const char *, const char *); |
46 | 46 |
47 /* #define YAHOO_DEBUG */ | 47 /* #define YAHOO_DEBUG */ |
48 | 48 |
49 static void yahoo_add_buddy(GaimConnection *gc, const char *who, GaimGroup *); | 49 static void yahoo_add_buddy(GaimConnection *gc, GaimBuddy *, GaimGroup *); |
50 static void yahoo_send_buddy_icon_request(GaimConnection *gc, const char *who); | 50 static void yahoo_send_buddy_icon_request(GaimConnection *gc, const char *who); |
51 | 51 |
52 struct yahoo_packet *yahoo_packet_new(enum yahoo_service service, enum yahoo_status status, int id) | 52 struct yahoo_packet *yahoo_packet_new(enum yahoo_service service, enum yahoo_status status, int id) |
53 { | 53 { |
54 struct yahoo_packet *pkt = g_new0(struct yahoo_packet, 1); | 54 struct yahoo_packet *pkt = g_new0(struct yahoo_packet, 1); |
415 | 415 |
416 l = l->next; | 416 l = l->next; |
417 } | 417 } |
418 } | 418 } |
419 | 419 |
420 static void yahoo_do_group_check(GaimAccount *account, GHashTable *ht, const char *name, const char *group, | 420 static void yahoo_do_group_check(GaimAccount *account, GHashTable *ht, const char *name, const char *group) |
421 gboolean *export) | |
422 { | 421 { |
423 GaimBuddy *b; | 422 GaimBuddy *b; |
424 GaimGroup *g; | 423 GaimGroup *g; |
425 GSList *list, *i; | 424 GSList *list, *i; |
426 gboolean onlist = 0; | 425 gboolean onlist = 0; |
453 g = gaim_group_new(group); | 452 g = gaim_group_new(group); |
454 gaim_blist_add_group(g, NULL); | 453 gaim_blist_add_group(g, NULL); |
455 } | 454 } |
456 b = gaim_buddy_new(account, name, NULL); | 455 b = gaim_buddy_new(account, name, NULL); |
457 gaim_blist_add_buddy(b, NULL, g, NULL); | 456 gaim_blist_add_buddy(b, NULL, g, NULL); |
458 *export = TRUE; | |
459 } | 457 } |
460 | 458 |
461 if (list) { | 459 if (list) { |
462 if (!oname) | 460 if (!oname) |
463 oname = g_strdup(gaim_normalize(account, name)); | 461 oname = g_strdup(gaim_normalize(account, name)); |
470 { | 468 { |
471 char *name = key; | 469 char *name = key; |
472 GSList *list = value, *i; | 470 GSList *list = value, *i; |
473 GaimBuddy *b; | 471 GaimBuddy *b; |
474 GaimGroup *g; | 472 GaimGroup *g; |
475 gboolean *export = user_data; | |
476 | |
477 if (list) | |
478 *export = TRUE; | |
479 | 473 |
480 for (i = list; i; i = i->next) { | 474 for (i = list; i; i = i->next) { |
481 b = i->data; | 475 b = i->data; |
482 g = gaim_find_buddys_group(b); | 476 g = gaim_find_buddys_group(b); |
483 gaim_debug(GAIM_DEBUG_MISC, "yahoo", "Deleting Buddy %s from group %s.\n", name, g->name); | 477 gaim_debug(GAIM_DEBUG_MISC, "yahoo", "Deleting Buddy %s from group %s.\n", name, g->name); |
591 b = gaim_buddy_new(account, norm_bud, NULL); | 585 b = gaim_buddy_new(account, norm_bud, NULL); |
592 gaim_blist_add_buddy(b, NULL, g, NULL); | 586 gaim_blist_add_buddy(b, NULL, g, NULL); |
593 export = TRUE; | 587 export = TRUE; |
594 } | 588 } |
595 | 589 |
596 yahoo_do_group_check(account, ht, norm_bud, grp, &export); | 590 yahoo_do_group_check(account, ht, norm_bud, grp); |
597 g_free(norm_bud); | 591 g_free(norm_bud); |
598 } | 592 } |
599 g_strfreev(buddies); | 593 g_strfreev(buddies); |
600 g_strfreev(split); | 594 g_strfreev(split); |
601 g_free(grp); | 595 g_free(grp); |
602 } | 596 } |
603 g_strfreev(lines); | 597 g_strfreev(lines); |
604 | 598 |
605 g_string_free(yd->tmp_serv_blist, TRUE); | 599 g_string_free(yd->tmp_serv_blist, TRUE); |
606 yd->tmp_serv_blist = NULL; | 600 yd->tmp_serv_blist = NULL; |
607 g_hash_table_foreach(ht, yahoo_do_group_cleanup, &export); | 601 g_hash_table_foreach(ht, yahoo_do_group_cleanup, NULL); |
608 g_hash_table_destroy(ht); | 602 g_hash_table_destroy(ht); |
609 } | 603 } |
610 | 604 |
611 | 605 |
612 if (yd->tmp_serv_ilist) { | 606 if (yd->tmp_serv_ilist) { |
624 | 618 |
625 if (got_serv_list) { | 619 if (got_serv_list) { |
626 gc->account->perm_deny = 4; | 620 gc->account->perm_deny = 4; |
627 serv_set_permit_deny(gc); | 621 serv_set_permit_deny(gc); |
628 } | 622 } |
629 if (export) | |
630 gaim_blist_save(); | |
631 } | 623 } |
632 | 624 |
633 static void yahoo_process_notify(GaimConnection *gc, struct yahoo_packet *pkt) | 625 static void yahoo_process_notify(GaimConnection *gc, struct yahoo_packet *pkt) |
634 { | 626 { |
635 char *msg = NULL; | 627 char *msg = NULL; |
1618 yahoo_process_auth_new(gc, seed); /* Can't hurt to try it anyway. */ | 1610 yahoo_process_auth_new(gc, seed); /* Can't hurt to try it anyway. */ |
1619 } | 1611 } |
1620 } | 1612 } |
1621 } | 1613 } |
1622 | 1614 |
1623 static void ignore_buddy(GaimBuddy *b) { | 1615 static void ignore_buddy(GaimBuddy *buddy) { |
1624 GaimGroup *g; | 1616 GaimGroup *group; |
1625 GaimConversation *c; | 1617 GaimConversation *conv; |
1626 GaimAccount *account; | 1618 GaimAccount *account; |
1627 gchar *name; | 1619 gchar *name; |
1628 | 1620 |
1629 if (!b) | 1621 if (!buddy) |
1630 return; | 1622 return; |
1631 | 1623 |
1632 g = gaim_find_buddys_group(b); | 1624 group = gaim_find_buddys_group(buddy); |
1633 name = g_strdup(b->name); | 1625 name = g_strdup(buddy->name); |
1634 account = b->account; | 1626 account = buddy->account; |
1635 | 1627 |
1636 gaim_debug(GAIM_DEBUG_INFO, "blist", | 1628 gaim_debug(GAIM_DEBUG_INFO, "blist", |
1637 "Removing '%s' from buddy list.\n", b->name); | 1629 "Removing '%s' from buddy list.\n", buddy->name); |
1638 serv_remove_buddy(account->gc, name, g->name); | 1630 serv_remove_buddy(account->gc, buddy, group); |
1639 gaim_blist_remove_buddy(b); | 1631 gaim_blist_remove_buddy(buddy); |
1640 | 1632 |
1641 serv_add_deny(account->gc, name); | 1633 serv_add_deny(account->gc, name); |
1642 gaim_blist_save(); | 1634 |
1643 | 1635 conv = gaim_find_conversation_with_account(name, account); |
1644 c = gaim_find_conversation_with_account(name, account); | 1636 |
1645 | 1637 if (conv != NULL) |
1646 if (c != NULL) | 1638 gaim_conversation_update(conv, GAIM_CONV_UPDATE_REMOVE); |
1647 gaim_conversation_update(c, GAIM_CONV_UPDATE_REMOVE); | |
1648 | 1639 |
1649 g_free(name); | 1640 g_free(name); |
1650 } | 1641 } |
1651 | 1642 |
1652 static void keep_buddy(GaimBuddy *b) { | 1643 static void keep_buddy(GaimBuddy *b) { |
2596 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); | 2587 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); |
2597 | 2588 |
2598 buddy = (GaimBuddy *) node; | 2589 buddy = (GaimBuddy *) node; |
2599 gc = gaim_account_get_connection(buddy->account); | 2590 gc = gaim_account_get_connection(buddy->account); |
2600 | 2591 |
2601 yahoo_add_buddy(gc, buddy->name, NULL); | 2592 yahoo_add_buddy(gc, buddy, NULL); |
2602 } | 2593 } |
2603 | 2594 |
2604 | 2595 |
2605 static void yahoo_chat_goto_menu(GaimBlistNode *node, gpointer data) | 2596 static void yahoo_chat_goto_menu(GaimBlistNode *node, gpointer data) |
2606 { | 2597 { |
2956 yahoo_packet_hash(pkt, 109, gaim_connection_get_display_name(gc)); | 2947 yahoo_packet_hash(pkt, 109, gaim_connection_get_display_name(gc)); |
2957 yahoo_send_packet(yd, pkt); | 2948 yahoo_send_packet(yd, pkt); |
2958 yahoo_packet_free(pkt); | 2949 yahoo_packet_free(pkt); |
2959 } | 2950 } |
2960 | 2951 |
2961 static void yahoo_add_buddy(GaimConnection *gc, const char *who, GaimGroup *foo) | 2952 /* XXX - What's the deal with GaimGroup *foo? */ |
2953 static void yahoo_add_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *foo) | |
2962 { | 2954 { |
2963 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; | 2955 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; |
2964 struct yahoo_packet *pkt; | 2956 struct yahoo_packet *pkt; |
2965 GaimGroup *g; | 2957 GaimGroup *g; |
2966 char *group = NULL; | 2958 char *group = NULL; |
2970 return; | 2962 return; |
2971 | 2963 |
2972 if (foo) | 2964 if (foo) |
2973 group = foo->name; | 2965 group = foo->name; |
2974 if (!group) { | 2966 if (!group) { |
2975 g = gaim_find_buddys_group(gaim_find_buddy(gc->account, who)); | 2967 g = gaim_find_buddys_group(gaim_find_buddy(gc->account, buddy->name)); |
2976 if (g) | 2968 if (g) |
2977 group = g->name; | 2969 group = g->name; |
2978 else | 2970 else |
2979 group = "Buddies"; | 2971 group = "Buddies"; |
2980 } | 2972 } |
2981 | 2973 |
2982 group2 = yahoo_string_encode(gc, group, NULL); | 2974 group2 = yahoo_string_encode(gc, group, NULL); |
2983 pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, 0); | 2975 pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, 0); |
2984 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); | 2976 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); |
2985 yahoo_packet_hash(pkt, 7, who); | 2977 yahoo_packet_hash(pkt, 7, buddy->name); |
2986 yahoo_packet_hash(pkt, 65, group2); | 2978 yahoo_packet_hash(pkt, 65, group2); |
2987 yahoo_packet_hash(pkt, 14, ""); | 2979 yahoo_packet_hash(pkt, 14, ""); |
2988 yahoo_send_packet(yd, pkt); | 2980 yahoo_send_packet(yd, pkt); |
2989 yahoo_packet_free(pkt); | 2981 yahoo_packet_free(pkt); |
2990 g_free(group2); | 2982 g_free(group2); |
2991 } | 2983 } |
2992 | 2984 |
2993 static void yahoo_remove_buddy(GaimConnection *gc, const char *who, const char *group) | 2985 static void yahoo_remove_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) |
2994 { | 2986 { |
2995 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; | 2987 struct yahoo_data *yd = (struct yahoo_data *)gc->proto_data; |
2996 YahooFriend *f; | 2988 YahooFriend *f; |
2997 struct yahoo_packet *pkt; | 2989 struct yahoo_packet *pkt; |
2998 GSList *buddies, *l; | 2990 GSList *buddies, *l; |
2999 GaimGroup *g; | 2991 GaimGroup *g; |
3000 gboolean remove = TRUE; | 2992 gboolean remove = TRUE; |
3001 char *cg; | 2993 char *cg; |
3002 | 2994 |
3003 if (!(f = yahoo_friend_find(gc, who))) | 2995 if (!(f = yahoo_friend_find(gc, buddy->name))) |
3004 return; | 2996 return; |
3005 | 2997 |
3006 buddies = gaim_find_buddies(gaim_connection_get_account(gc), who); | 2998 buddies = gaim_find_buddies(gaim_connection_get_account(gc), buddy->name); |
3007 for (l = buddies; l; l = l->next) { | 2999 for (l = buddies; l; l = l->next) { |
3008 g = gaim_find_buddys_group(l->data); | 3000 g = gaim_find_buddys_group(l->data); |
3009 if (gaim_utf8_strcasecmp(group, g->name)) { | 3001 if (gaim_utf8_strcasecmp(group->name, g->name)) { |
3010 remove = FALSE; | 3002 remove = FALSE; |
3011 break; | 3003 break; |
3012 } | 3004 } |
3013 } | 3005 } |
3014 | 3006 |
3015 g_slist_free(buddies); | 3007 g_slist_free(buddies); |
3016 | 3008 |
3017 if (remove) | 3009 if (remove) |
3018 g_hash_table_remove(yd->friends, who); | 3010 g_hash_table_remove(yd->friends, buddy->name); |
3019 | 3011 |
3020 cg = yahoo_string_encode(gc, group, NULL); | 3012 cg = yahoo_string_encode(gc, group->name, NULL); |
3021 pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YAHOO_STATUS_AVAILABLE, 0); | 3013 pkt = yahoo_packet_new(YAHOO_SERVICE_REMBUDDY, YAHOO_STATUS_AVAILABLE, 0); |
3022 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); | 3014 yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); |
3023 yahoo_packet_hash(pkt, 7, who); | 3015 yahoo_packet_hash(pkt, 7, buddy->name); |
3024 yahoo_packet_hash(pkt, 65, cg); | 3016 yahoo_packet_hash(pkt, 65, cg); |
3025 yahoo_send_packet(yd, pkt); | 3017 yahoo_send_packet(yd, pkt); |
3026 yahoo_packet_free(pkt); | 3018 yahoo_packet_free(pkt); |
3027 g_free(cg); | 3019 g_free(cg); |
3028 } | 3020 } |
3139 yahoo_packet_free(pkt); | 3131 yahoo_packet_free(pkt); |
3140 g_free(gpn); | 3132 g_free(gpn); |
3141 g_free(gpo); | 3133 g_free(gpo); |
3142 } | 3134 } |
3143 | 3135 |
3144 static void yahoo_rename_group(GaimConnection *gc, const char *old_group, | 3136 static void yahoo_rename_group(GaimConnection *gc, const char *old_name, |
3145 const char *new_group, GList *whocares) | 3137 GaimGroup *group, GList *moved_buddies) |
3146 { | 3138 { |
3147 struct yahoo_data *yd = gc->proto_data; | 3139 struct yahoo_data *yd = gc->proto_data; |
3148 struct yahoo_packet *pkt; | 3140 struct yahoo_packet *pkt; |
3149 char *gpn, *gpo; | 3141 char *gpn, *gpo; |
3150 | 3142 |
3151 gpn = yahoo_string_encode(gc, new_group, NULL); | 3143 gpn = yahoo_string_encode(gc, group->name, NULL); |
3152 gpo = yahoo_string_encode(gc, old_group, NULL); | 3144 gpo = yahoo_string_encode(gc, old_name, NULL); |
3153 if (!strcmp(gpn, gpo)) { | 3145 if (!strcmp(gpn, gpo)) { |
3154 g_free(gpn); | 3146 g_free(gpn); |
3155 g_free(gpo); | 3147 g_free(gpo); |
3156 return; | 3148 return; |
3157 } | 3149 } |