static gint compare_last_name(PurpleBlistNode *node1, PurpleBlistNode *node2) { const char *name1=NULL, *name2=NULL; const char *tmp=NULL; if(PURPLE_BLIST_NODE_IS_CONTACT(node1)) { name1 = purple_contact_get_alias((PurpleContact *)node1); } if(!name1) { name1 = PURPLE_BLIST_NODE_NAME(node1); } if(PURPLE_BLIST_NODE_IS_CONTACT(node2)) { name2 = purple_contact_get_alias((PurpleContact *)node2); } if(!name2) { name2 = PURPLE_BLIST_NODE_NAME(node2); } /* Searches for last space in name and, if found, sorts based on characters remaining */ tmp = strrchr(name1, ' '); if(tmp != NULL) { name1 = tmp; } tmp = strrchr(name2, ' '); if(tmp != NULL) { name2 = tmp; } return purple_utf8_strcasecmp(name1, name2); }
static gint compare_status(PurpleBlistNode *node1, PurpleBlistNode *node2) { PurplePresence *p1=NULL, *p2=NULL; if(!node1) { return 0; } if(PURPLE_BLIST_NODE_IS_CHAT(node1) && PURPLE_BLIST_NODE_IS_CHAT(node2)) { return 0; } else if(PURPLE_BLIST_NODE_IS_CHAT(node1)) { return 1; } else if(PURPLE_BLIST_NODE_IS_CHAT(node2)) { return -1; } if(PURPLE_BLIST_NODE_IS_CONTACT(node1)) { p1 = purple_buddy_get_presence( purple_contact_get_priority_buddy((PurpleContact *)node1) ); } if(node2 && PURPLE_BLIST_NODE_IS_CONTACT(node2)) { p2 = purple_buddy_get_presence( purple_contact_get_priority_buddy((PurpleContact *)node2) ); } return purple_presence_compare(p1, p2); }
static gint compare_protocol(PurpleBlistNode *node1, PurpleBlistNode *node2) { PurpleAccount *acc1=NULL, *acc2=NULL; if(!node1) { return 0; } if(PURPLE_BLIST_NODE_IS_CHAT(node1)) { acc1 = ((PurpleChat *)node1)->account; } else if(PURPLE_BLIST_NODE_IS_BUDDY(node1)) { acc1 = ((PurpleBuddy *)node1)->account; } else if(PURPLE_BLIST_NODE_IS_CONTACT(node1)) { acc1 = (purple_contact_get_priority_buddy((PurpleContact *)node1))->account; } if(node2) { if(PURPLE_BLIST_NODE_IS_CHAT(node2)) { acc2 = ((PurpleChat *)node2)->account; } else if(PURPLE_BLIST_NODE_IS_BUDDY(node2)) { acc2 = ((PurpleBuddy *)node2)->account; } else if(PURPLE_BLIST_NODE_IS_CONTACT(node2)) { acc2 = (purple_contact_get_priority_buddy((PurpleContact *)node2))->account; } } return purple_utf8_strcasecmp( purple_account_get_protocol_id(acc1), acc2 ? purple_account_get_protocol_id(acc2) : NULL ); }
static gint compare_account(PurpleBlistNode *node1, PurpleBlistNode *node2) { GList *cur; PurpleAccount *acc1=NULL, *acc2=NULL, *account; if(!node1 || !node2) return 0; if(PURPLE_BLIST_NODE_IS_CHAT(node1)) { acc1 = ((PurpleChat *)node1)->account; } else if(PURPLE_BLIST_NODE_IS_BUDDY(node1)) { acc1 = ((PurpleBuddy *)node1)->account; } else if(PURPLE_BLIST_NODE_IS_CONTACT(node1)) { acc1 = (purple_contact_get_priority_buddy((PurpleContact *)node1))->account; } if(PURPLE_BLIST_NODE_IS_CHAT(node2)) { acc2 = ((PurpleChat *)node2)->account; } else if(PURPLE_BLIST_NODE_IS_BUDDY(node2)) { acc2 = ((PurpleBuddy *)node2)->account; } else if(PURPLE_BLIST_NODE_IS_CONTACT(node2)) { acc2 = (purple_contact_get_priority_buddy((PurpleContact *)node2))->account; } for(cur = purple_accounts_get_all(); cur; cur = cur->next) { account = cur->data; if(account == acc1 && account == acc2) { return 0; } else if(account == acc1) { return -1; } else if(account == acc2) { return 1; } } return 0; }
static gint compare_logsize(PurpleBlistNode *node1, PurpleBlistNode *node2) { PurpleBlistNode *child; int logsize1=0, logsize2=0; if(PURPLE_BLIST_NODE_IS_CONTACT(node1)) { for (child = node1->child; child; child = child->next) { if(PURPLE_BLIST_NODE_IS_BUDDY(child)) { logsize1 += purple_log_get_total_size( PURPLE_LOG_IM, ((PurpleBuddy*)(child))->name, ((PurpleBuddy*)(child))->account ); } } } if(PURPLE_BLIST_NODE_IS_BUDDY(node1)) { logsize1 = purple_log_get_total_size( PURPLE_LOG_IM, PURPLE_BLIST_NODE_NAME(node1), ((PurpleBuddy *)node1)->account ); } if(PURPLE_BLIST_NODE_IS_CHAT(node1)) { logsize1 = purple_log_get_total_size( PURPLE_LOG_CHAT, PURPLE_BLIST_NODE_NAME(node1), ((PurpleChat *)node1)->account ); } if(PURPLE_BLIST_NODE_IS_CONTACT(node2)) { for (child = node2->child; child; child = child->next) { if(PURPLE_BLIST_NODE_IS_BUDDY(child)) { logsize2 += purple_log_get_total_size( PURPLE_LOG_IM, ((PurpleBuddy*)(child))->name, ((PurpleBuddy*)(child))->account ); } } } if(PURPLE_BLIST_NODE_IS_BUDDY(node2)) { logsize2 = purple_log_get_total_size( PURPLE_LOG_IM, PURPLE_BLIST_NODE_NAME(node2), ((PurpleBuddy *)node2)->account ); } if(PURPLE_BLIST_NODE_IS_CHAT(node2)) { logsize2 = purple_log_get_total_size( PURPLE_LOG_CHAT, PURPLE_BLIST_NODE_NAME(node2), ((PurpleChat *)node2)->account ); } if(logsize1 > logsize2) return -1; if(logsize2 > logsize1) return 1; return 0; }
static void _purple_events_ui_events_selection_dialog(PurpleBlistNode *node, PurpleEventsContext *context) { node = _purple_events_ui_get_good_node(node); if ( node == NULL ) return; PurpleRequestFields *request; PurpleRequestFieldGroup *group; PurpleRequestField *field; group = purple_request_field_group_new(NULL); gint current; guint i; gboolean v; for ( i = 0 ; _purple_events_ui_events[i] != NULL ; ++i ) { current = purple_blist_node_get_int(node, _purple_events_ui_events[i]); if ( current != 0 ) v = ( current > 0 ); else { gchar *pref_name; pref_name = g_strconcat("/plugins/core/events/", _purple_events_ui_events[i], NULL); v = purple_prefs_get_bool(pref_name); g_free(pref_name); } field = purple_request_field_bool_new(_purple_events_ui_events[i], _(_purple_events_ui_events_labels[i]), v); purple_request_field_group_add_field(group, field); } request = purple_request_fields_new(); purple_request_fields_add_group(request, group); purple_request_fields(context->plugin, _("Events selection"), PURPLE_BLIST_NODE_IS_CONTACT(node) ? _("Select events for contact") : _("Select events for group"), NULL, request, PURPLE_BLIST_NODE_IS_CONTACT(node) ? _("_Set events for contact") : _("_Set events for group"), G_CALLBACK(_purple_events_ui_events_selection), _("_Cancel"), NULL, NULL, PURPLE_BLIST_NODE_IS_CONTACT(node) ? purple_buddy_get_name(purple_contact_get_priority_buddy(PURPLE_CONTACT(node))) : NULL, NULL, node); }
static void extended_buddy_menu_cb(PurpleBlistNode *node, GList **menu) { PurpleMenuAction *action = NULL; GList *submenu = NULL; if( !PURPLE_BLIST_NODE_IS_CONTACT(node) && !PURPLE_BLIST_NODE_IS_BUDDY(node) && !PURPLE_BLIST_NODE_IS_CHAT(node) ) { return; } if(purple_blist_node_get_flags(node) & PURPLE_BLIST_NODE_FLAG_NO_SAVE) { return; } if( purple_prefs_get_int(PLUGIN_PREFS_PREFIX "/sort1") != SORT_METHOD_PRIORITY && purple_prefs_get_int(PLUGIN_PREFS_PREFIX "/sort2") != SORT_METHOD_PRIORITY && purple_prefs_get_int(PLUGIN_PREFS_PREFIX "/sort3") != SORT_METHOD_PRIORITY ) { return; } submenu = menu_append(submenu, node, PRIORITY_VERY_HIGH, _("Very High")); submenu = menu_append(submenu, node, PRIORITY_HIGH, _("High")); submenu = menu_append(submenu, node, PRIORITY_NORMAL, _("Normal")); submenu = menu_append(submenu, node, PRIORITY_LOW, _("Low")); submenu = menu_append(submenu, node, PRIORITY_VERY_LOW, _("Very Low")); action = purple_menu_action_new(_("Set Priority"), NULL, NULL, submenu); *menu = g_list_append(*menu, action); }
static void buddy_ticker_show(void) { PurpleBlistNode *gnode, *cnode, *bnode; PurpleBuddy *b; for(gnode = purple_blist_get_root(); gnode; gnode = purple_blist_node_get_sibling_next(gnode)) { if(!PURPLE_BLIST_NODE_IS_GROUP(gnode)) continue; for(cnode = purple_blist_node_get_first_child(gnode); cnode; cnode = purple_blist_node_get_sibling_next(cnode)) { if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) continue; for(bnode = purple_blist_node_get_first_child(cnode); bnode; bnode = purple_blist_node_get_sibling_next(bnode)) { if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) continue; b = (PurpleBuddy *)bnode; if(PURPLE_BUDDY_IS_ONLINE(b)) buddy_ticker_add_buddy(b); } } } }
/* 208 - MSG_CLIENT_ADD_HOTLIST_SEQ */ static void nap_send_buddylist(PurpleConnection *gc) { PurpleBuddyList *blist; PurpleBlistNode *gnode, *cnode, *bnode; PurpleBuddy *buddy; if ((blist = purple_get_blist()) != NULL) { for (gnode = blist->root; gnode != NULL; gnode = gnode->next) { if (!PURPLE_BLIST_NODE_IS_GROUP(gnode)) continue; for (cnode = gnode->child; cnode != NULL; cnode = cnode->next) { if (!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) continue; for (bnode = cnode->child; bnode != NULL; bnode = bnode->next) { if (!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) continue; buddy = (PurpleBuddy *)bnode; nap_write_packet(gc, 208, "%s", buddy->name); } } } } }
void silcpurple_send_buddylist(PurpleConnection *gc) { PurpleBuddyList *blist; PurpleBlistNode *gnode, *cnode, *bnode; PurpleBuddy *buddy; PurpleAccount *account; account = purple_connection_get_account(gc); if ((blist = purple_get_blist()) != NULL) { for (gnode = blist->root; gnode != NULL; gnode = gnode->next) { if (!PURPLE_BLIST_NODE_IS_GROUP(gnode)) continue; for (cnode = gnode->child; cnode != NULL; cnode = cnode->next) { if (!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) continue; for (bnode = cnode->child; bnode != NULL; bnode = bnode->next) { if (!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) continue; buddy = (PurpleBuddy *)bnode; if (purple_buddy_get_account(buddy) == account) silcpurple_add_buddy_i(gc, buddy, TRUE); } } } } }
static void lh_migrate_build_lists(void) { PurpleBuddyList *blist = NULL; PurpleBlistNode *root = NULL, *g = NULL, *c = NULL, *b = NULL; blist = purple_get_blist(); root = blist->root; /* walk the blist tree and build a list of the buddies and a list of * the groups corresponding to each buddy */ /* group level */ for(g = root; g && PURPLE_BLIST_NODE_IS_GROUP(g); g = g->next) /* contact level */ for(c = g->child; c && PURPLE_BLIST_NODE_IS_CONTACT(c); c = c->next) /* buddy level */ for(b = c->child; b && PURPLE_BLIST_NODE_IS_BUDDY(b); b = b->next) { PurpleGroup *tmp_group = purple_group_new(((PurpleGroup *)g)->name); PurpleBuddy *tmp_buddy = (PurpleBuddy *)b; /* if this buddy is on the source account then add it * to the GLists */ if(purple_buddy_get_account(tmp_buddy) == source_account) { PurpleBuddy *tmp_buddy_2 = purple_buddy_new(target_account, purple_buddy_get_name(tmp_buddy), purple_buddy_get_alias(tmp_buddy)); groups = g_list_prepend(groups, tmp_group); buddies = g_list_prepend(buddies, tmp_buddy_2); } } return; }
static void netsoul_close (PurpleConnection *gc) { PurpleBlistNode *gnode, *cnode, *bnode; NetsoulData *ns = gc->proto_data; purple_debug_info("netsoul", "netsoul_close\n"); for(gnode = purple_get_blist()->root; gnode; gnode = gnode->next) { if(!PURPLE_BLIST_NODE_IS_GROUP(gnode)) continue; for(cnode = gnode->child; cnode; cnode = cnode->next) { if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) continue; for(bnode = cnode->child; bnode; bnode = bnode->next) { if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) continue; if(((PurpleBuddy*)bnode)->account == gc->account) { PurpleBuddy *buddy = (PurpleBuddy*)bnode; if (buddy) purple_buddy_icon_unref(purple_buddy_get_icon(buddy)); } } } } g_free(ns->challenge); g_free(ns->host); close(ns->fd); g_free(ns); purple_input_remove(gc->inpa); }
/* stolen from autoaccept.c and gtkblist.c files. */ void buddy_context_menu_add_item (PurpleBlistNode * node, GList ** menu, PurplePlugin * plugin) { PurplePluginProtocolInfo *prpl_info; if (PURPLE_BLIST_NODE_IS_BUDDY (node)) { prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO (((PurpleBuddy *) node)->account-> gc->prpl); if (prpl_info && prpl_info->send_file) { if (!prpl_info->can_receive_file || prpl_info->can_receive_file (((PurpleBuddy *) node)-> account->gc, ((PurpleBuddy *) node)->name)) { PurpleMenuAction *action; if (!PURPLE_BLIST_NODE_IS_BUDDY (node) && !PURPLE_BLIST_NODE_IS_CONTACT (node) && !(purple_blist_node_get_flags (node) & PURPLE_BLIST_NODE_FLAG_NO_SAVE)) return; action = purple_menu_action_new (SCREENSHOT_SEND_MENUITEM_LABEL, PURPLE_CALLBACK (on_blist_context_menu_send_capture), plugin, NULL); (*menu) = g_list_prepend (*menu, action); /* add */ } } } }
void purple_events_ui_menu_add(PurpleBlistNode *node, GList **menu, PurpleEventsContext *context) { PurpleBlistNode *group = NULL; node = _purple_events_ui_get_good_node(node); if ( ( node == NULL ) || ( ( purple_blist_node_get_flags(node) & PURPLE_BLIST_NODE_FLAG_NO_SAVE ) > 0 ) ) return; if ( PURPLE_BLIST_NODE_IS_CONTACT(node) ) group = PURPLE_BLIST_NODE(purple_buddy_get_group(purple_contact_get_priority_buddy(PURPLE_CONTACT(node)))); gint current = purple_blist_node_get_int(node, "events"); GList *actions = NULL; PurpleMenuAction *action = NULL; const gchar *label = ""; if ( current != 0 ) { if ( PURPLE_BLIST_NODE_IS_GROUP(node) || ( purple_blist_node_get_int(group, "events") == 0 ) ) label = _("Use global settings"); else label = _("Use group settings"); action = purple_menu_action_new(label, (PurpleCallback)_purple_events_ui_reset_setting, NULL, NULL); actions = g_list_prepend(actions, action); } if ( current >= 0 ) { action = purple_menu_action_new(_("Disable all events"), (PurpleCallback)_purple_events_ui_disable_all_events, NULL, NULL); actions = g_list_prepend(actions, action); } action = purple_menu_action_new(_("Select events"), (PurpleCallback)_purple_events_ui_events_selection_dialog, context, NULL); actions = g_list_prepend(actions, action); switch ( current ) { case -1: label = _("Current events: all disabled"); break; case 0: if ( PURPLE_BLIST_NODE_IS_GROUP(node) || ( purple_blist_node_get_int(group, "events") == 0 ) ) label = _("Current events: global settings"); else label = _("Current events: group settings"); break; case 1: label = _("Current events: selection"); break; } actions = g_list_prepend(actions, NULL); action = purple_menu_action_new(label, NULL, NULL, NULL); actions = g_list_prepend(actions, action); *menu = g_list_append(*menu, NULL); action = purple_menu_action_new(_("Events"), NULL, NULL, actions); *menu = g_list_append(*menu, action); }
static void save_cb(PurpleBlistNode *node, int choice) { if (PURPLE_BLIST_NODE_IS_BUDDY(node)) node = purple_blist_node_get_parent(node); g_return_if_fail(PURPLE_BLIST_NODE_IS_CONTACT(node)); purple_blist_node_set_int(node, "autoaccept", choice); }
static gint compare_onoffline(PurpleBlistNode *node1, PurpleBlistNode *node2) { PurpleBuddy *buddy1=NULL, *buddy2=NULL; if(!node1) { return 0; } if(!node2) { return 0; } if(PURPLE_BLIST_NODE_IS_CHAT(node1) && PURPLE_BLIST_NODE_IS_CHAT(node2)) { return 0; } else if(PURPLE_BLIST_NODE_IS_CHAT(node1)) { return 1; } else if(PURPLE_BLIST_NODE_IS_CHAT(node2)) { return -1; } if(PURPLE_BLIST_NODE_IS_CONTACT(node1)) { buddy1 = purple_contact_get_priority_buddy((PurpleContact *)node1); } else if(PURPLE_BLIST_NODE_IS_BUDDY(node1)) { buddy1 = (PurpleBuddy *)node1; } if(PURPLE_BLIST_NODE_IS_CONTACT(node2)) { buddy2 = purple_contact_get_priority_buddy((PurpleContact *)node2); } else if(PURPLE_BLIST_NODE_IS_BUDDY(node2)) { buddy2 = (PurpleBuddy *)node2; } if(PURPLE_BUDDY_IS_ONLINE(buddy1)) { if(PURPLE_BUDDY_IS_ONLINE(buddy2)) { return 0; } else { return -1; } } else { if(PURPLE_BUDDY_IS_ONLINE(buddy2)) { return 1; } else { return 0; } } return 0; }
static gint compare_onofflinetime(PurpleBlistNode *node1, PurpleBlistNode *node2) { PurpleBuddy *buddy1=NULL, *buddy2=NULL; int t1=0, t2=0; if(!node1) { return 0; } if(PURPLE_BLIST_NODE_IS_CHAT(node1) && PURPLE_BLIST_NODE_IS_CHAT(node2)) { return 0; } else if(PURPLE_BLIST_NODE_IS_CHAT(node1)) { return 1; } else if(PURPLE_BLIST_NODE_IS_CHAT(node2)) { return -1; } if(PURPLE_BLIST_NODE_IS_CONTACT(node1)) { buddy1 = purple_contact_get_priority_buddy((PurpleContact *)node1); } else if(PURPLE_BLIST_NODE_IS_BUDDY(node1)) { buddy1 = (PurpleBuddy *)node1; } if(PURPLE_BUDDY_IS_ONLINE(buddy1)) { t1 = purple_presence_get_login_time(purple_buddy_get_presence(buddy1)); } else { t1 = purple_blist_node_get_int((PurpleBlistNode *)buddy1, "last_seen"); } if(PURPLE_BLIST_NODE_IS_CONTACT(node2)) { buddy2 = purple_contact_get_priority_buddy((PurpleContact *)node2); } else if(PURPLE_BLIST_NODE_IS_BUDDY(node2)) { buddy2 = (PurpleBuddy *)node2; } if(PURPLE_BUDDY_IS_ONLINE(buddy2)) { t2 = purple_presence_get_login_time(purple_buddy_get_presence(buddy2)); } else { t2 = purple_blist_node_get_int((PurpleBlistNode *)buddy2, "last_seen"); } if(t1 > t2) { return -1; } if(t2 > t1) { return 1; } return 0; }
static gint compare_name(PurpleBlistNode *node1, PurpleBlistNode *node2) { const char *name1=NULL, *name2=NULL; if(PURPLE_BLIST_NODE_IS_CONTACT(node1)) { name1 = purple_contact_get_alias((PurpleContact *)node1); } if(!name1) { name1 = PURPLE_BLIST_NODE_NAME(node1); } if(PURPLE_BLIST_NODE_IS_CONTACT(node2)) { name2 = purple_contact_get_alias((PurpleContact *)node2); } if(!name2) { name2 = PURPLE_BLIST_NODE_NAME(node2); } return purple_utf8_strcasecmp(name1, name2); }
static gint compare_priority(PurpleBlistNode *node1, PurpleBlistNode *node2) { int p1, p2; if(!node1) { return 0; } if(PURPLE_BLIST_NODE_IS_CONTACT(node1)) { p1 = purple_blist_node_get_int( (PurpleBlistNode *)purple_contact_get_priority_buddy((PurpleContact *)node1), "extended_sort_method_priority" ); } else { p1 = purple_blist_node_get_int(node1, "extended_sort_method_priority"); } if(PURPLE_BLIST_NODE_IS_CONTACT(node2)) { p2 = purple_blist_node_get_int( (PurpleBlistNode *)purple_contact_get_priority_buddy((PurpleContact *)node2), "extended_sort_method_priority" ); } else { p2 = purple_blist_node_get_int(node2, "extended_sort_method_priority"); } if(p1 == PRIORITY_UNDEFINED) { p1=PRIORITY_NORMAL; } if(p2 == PRIORITY_UNDEFINED) { p2=PRIORITY_NORMAL; } if(p1 > p2) { return -1; } if(p2 > p1) { return 1; } return 0; }
static void context_menu(PurpleBlistNode *node, GList **menu, gpointer plugin) { PurpleMenuAction *action; if (!PURPLE_BLIST_NODE_IS_BUDDY(node) && !PURPLE_BLIST_NODE_IS_CONTACT(node) && !(purple_blist_node_get_flags(node) & PURPLE_BLIST_NODE_FLAG_NO_SAVE)) return; action = purple_menu_action_new(_("Autoaccept File Transfers..."), PURPLE_CALLBACK(set_auto_accept_settings), plugin, NULL); (*menu) = g_list_prepend(*menu, action); }
static PurpleBlistNode * _purple_events_ui_get_good_node(PurpleBlistNode *node) { if ( PURPLE_BLIST_NODE_IS_CONTACT(node) ) return node; if ( PURPLE_BLIST_NODE_IS_BUDDY(node) ) return PURPLE_BLIST_NODE(purple_buddy_get_contact(PURPLE_BUDDY(node))); if ( PURPLE_BLIST_NODE_IS_GROUP(node) ) return node; return NULL; }
void rc_pop_contacts(PurpleGroup * grp) { if (!grp) return; PurpleBlistNode * gnode = PURPLE_BLIST_NODE(grp); PurpleBlistNode * n = NULL; PurpleBuddy * b = NULL; int total; gboolean offline; //XXX group->totalsize is unreliable!!! for (n=gnode->child, total=0; n!=NULL; total++, n=n->next); trace("Total Group Count %d", total); while (total > g_size) { n = gnode->child; if (PURPLE_BLIST_NODE_IS_CONTACT(n)) { trace("Child Contact : %s", (PURPLE_CONTACT(n)->priority->name)); b = PURPLE_CONTACT(n)->priority; } else if (PURPLE_BLIST_NODE_IS_BUDDY(n)) { trace("Child Buddy : %s", (PURPLE_BUDDY(n)->name)); b = PURPLE_BUDDY(n); } n = PURPLE_BLIST_NODE(b); const char *name = purple_blist_node_get_string(n, NODE_GROUP_KEY); if (!name) { // if cannot find orig group name, put back to Buddies trace("ERROR!!! cannot find original group name"); name = "Buddies"; } PurpleGroup * g = purple_find_group(name); if (!g) { trace("Group %s Not Found. Create one.", name); g = purple_group_new(name); } trace("<<<<<<< Remove %s", b->name); offline = purple_blist_node_get_bool(n, NODE_ORIG_OFFLINE_KEY); purple_blist_node_set_bool(n, NODE_OFFLINE_KEY, offline); purple_blist_add_buddy(b, NULL, g, NULL); total--; } }
static void irc_connected(struct irc_conn *irc, const char *nick) { PurpleConnection *gc; PurpleStatus *status; PurpleBlistNode *gnode, *cnode, *bnode; if ((gc = purple_account_get_connection(irc->account)) == NULL || PURPLE_CONNECTION_IS_CONNECTED(gc)) return; purple_connection_set_display_name(gc, nick); purple_connection_set_state(gc, PURPLE_CONNECTED); /* If we're away then set our away message */ status = purple_account_get_active_status(irc->account); if (!purple_status_get_type(status) != PURPLE_STATUS_AVAILABLE) { PurplePluginProtocolInfo *prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); prpl_info->set_status(irc->account, status); } /* this used to be in the core, but it's not now */ for (gnode = purple_get_blist()->root; gnode; gnode = gnode->next) { if(!PURPLE_BLIST_NODE_IS_GROUP(gnode)) continue; for(cnode = gnode->child; cnode; cnode = cnode->next) { if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) continue; for(bnode = cnode->child; bnode; bnode = bnode->next) { PurpleBuddy *b; if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) continue; b = (PurpleBuddy *)bnode; if(b->account == gc->account) { struct irc_buddy *ib = g_new0(struct irc_buddy, 1); ib->name = g_strdup(b->name); g_hash_table_insert(irc->buddies, ib->name, ib); } } } } irc_blist_timeout(irc); if (!irc->timer) irc->timer = purple_timeout_add_seconds(45, (GSourceFunc)irc_blist_timeout, (gpointer)irc); }
void BuddyList::new_node(PurpleBlistNode *node) { g_return_if_fail(!node->ui_data); BuddyListNode *bnode = BuddyListNode::CreateNode(node); if (bnode) { BuddyListNode *parent = bnode->GetParentNode(); CppConsUI::TreeView::NodeReference nref = treeview->AppendNode( parent ? parent->GetRefNode() : treeview->GetRootNode(), *bnode); treeview->SetCollapsed(nref, true); bnode->SetRefNode(nref); bnode->Update(); if (PURPLE_BLIST_NODE_IS_CONTACT(node)) treeview->SetNodeStyle(nref, CppConsUI::TreeView::STYLE_VOID); } }
void BuddyListGroup::GroupContextMenu::removeResponseHandler( CppConsUI::MessageDialog& /*activator*/, CppConsUI::AbstractDialog::ResponseType response) { if (response != CppConsUI::AbstractDialog::RESPONSE_OK) return; // based on gtkdialogs.c:pidgin_dialogs_remove_group_cb() PurpleGroup *group = parent_group->getPurpleGroup(); PurpleBlistNode *cnode = purple_blist_node_get_first_child( PURPLE_BLIST_NODE(group)); while (cnode) { if (PURPLE_BLIST_NODE_IS_CONTACT(cnode)) { PurpleBlistNode *bnode = purple_blist_node_get_first_child(cnode); cnode = purple_blist_node_get_sibling_next(cnode); while (bnode) if (PURPLE_BLIST_NODE_IS_BUDDY(bnode)) { PurpleBuddy *buddy = PURPLE_BUDDY(bnode); PurpleAccount *account = purple_buddy_get_account(buddy); bnode = purple_blist_node_get_sibling_next(bnode); if (purple_account_is_connected(account)) { purple_account_remove_buddy(account, buddy, group); purple_blist_remove_buddy(buddy); } } else bnode = purple_blist_node_get_sibling_next(bnode); } else if (PURPLE_BLIST_NODE_IS_CHAT(cnode)) { PurpleChat *chat = PURPLE_CHAT(cnode); cnode = purple_blist_node_get_sibling_next(cnode); purple_blist_remove_chat(chat); } else cnode = purple_blist_node_get_sibling_next(cnode); } /* Close the context menu before the group is deleted because its deletion * can lead to destruction of this object. */ close(); purple_blist_remove_group(group); }
PurpleStoredImage * purple_buddy_icons_node_set_custom_icon_from_file(PurpleBlistNode *node, const gchar *filename) { size_t len = 0; guchar *data = NULL; g_return_val_if_fail(node != NULL, NULL); if (!PURPLE_BLIST_NODE_IS_CONTACT(node) && !PURPLE_BLIST_NODE_IS_CHAT(node) && !PURPLE_BLIST_NODE_IS_GROUP(node)) { return NULL; } if (filename != NULL) { if (!read_icon_file(filename, &data, &len)) { return NULL; } } return purple_buddy_icons_node_set_custom_icon(node, data, len); }
/* ns_get_buddies Add buddies to watchlist */ void netsoul_get_buddies (PurpleConnection* gc) { PurpleBlistNode *gnode, *cnode, *bnode; purple_debug_info("netsoul", "ns_get_buddies\n"); for(gnode = purple_get_blist()->root; gnode; gnode = gnode->next) { if(!PURPLE_BLIST_NODE_IS_GROUP(gnode)) continue; for(cnode = gnode->child; cnode; cnode = cnode->next) { if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) continue; for(bnode = cnode->child; bnode; bnode = bnode->next) { if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) continue; if(((PurpleBuddy*)bnode)->account == gc->account) { PurpleBuddy *buddy = (PurpleBuddy*)bnode; gchar *photo = NULL; purple_debug_info("netsoul", "netsoul_add_buddy %s\n", buddy->name); NetsoulBuddy *nb = g_new0(NetsoulBuddy, 1); buddy->proto_data = nb; nb->login = g_strdup(buddy->name); // Get photo photo = g_strdup_printf("%s%s", NETSOUL_PHOTO_URL, buddy->name); purple_util_fetch_url(photo, TRUE, NULL, FALSE, netsoul_got_photo, buddy); // if contact is not already is watch list, add it ns_watch_buddy(gc, buddy); } } } } // watch_log_user NetsoulData *ns = gc->proto_data; ns_watch_log_user(gc); ns_list_users(gc, ns->watchlist); }
static void set_auto_accept_settings(PurpleBlistNode *node, gpointer plugin) { char *message; if (PURPLE_BLIST_NODE_IS_BUDDY(node)) node = purple_blist_node_get_parent(node); g_return_if_fail(PURPLE_BLIST_NODE_IS_CONTACT(node)); message = g_strdup_printf(_("When a file-transfer request arrives from %s"), purple_contact_get_alias((PurpleContact *)node)); purple_request_choice(plugin, _("Set Autoaccept Setting"), message, NULL, purple_blist_node_get_int(node, "autoaccept"), _("_Save"), G_CALLBACK(save_cb), _("_Cancel"), NULL, NULL, NULL, NULL, node, _("Ask"), FT_ASK, _("Auto Accept"), FT_ACCEPT, _("Auto Reject"), FT_REJECT, NULL, purple_contact_get_alias((PurpleContact *)node), NULL, NULL); g_free(message); }
static void msn_session_sync_users(MsnSession *session) { PurpleBlistNode *gnode, *cnode, *bnode; PurpleConnection *gc = purple_account_get_connection(session->account); GList *to_remove = NULL; g_return_if_fail(gc != NULL); /* The core used to use msn_add_buddy to add all buddies before * being logged in. This no longer happens, so we manually iterate * over the whole buddy list to identify sync issues. */ for (gnode = purple_blist_get_root(); gnode; gnode = gnode->next) { PurpleGroup *group = (PurpleGroup *)gnode; const char *group_name = group->name; if(!PURPLE_BLIST_NODE_IS_GROUP(gnode)) continue; for(cnode = gnode->child; cnode; cnode = cnode->next) { if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) continue; for(bnode = cnode->child; bnode; bnode = bnode->next) { PurpleBuddy *b; if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) continue; b = (PurpleBuddy *)bnode; if(purple_buddy_get_account(b) == purple_connection_get_account(gc)) { MsnUser *remote_user; gboolean found = FALSE; remote_user = msn_userlist_find_user(session->userlist, purple_buddy_get_name(b)); if ((remote_user != NULL) && (remote_user->list_op & MSN_LIST_FL_OP)) { int group_id; GList *l; group_id = msn_userlist_find_group_id(remote_user->userlist, group_name); for (l = remote_user->group_ids; l != NULL; l = l->next) { if (group_id == GPOINTER_TO_INT(l->data)) { found = TRUE; break; } } } /* We don't care if they're in a different group, as long as they're on the * list somewhere. If we check for the group, we cause pain, agony and * suffering for people who decide to re-arrange their buddy list elsewhere. */ if (!found) { if ((remote_user == NULL) || !(remote_user->list_op & MSN_LIST_FL_OP)) { /* The user is not on the server list */ msn_show_sync_issue(session, purple_buddy_get_name(b), group_name); } else { /* The user is not in that group on the server list */ to_remove = g_list_prepend(to_remove, b); } } } } } } if (to_remove != NULL) { g_list_foreach(to_remove, (GFunc)purple_blist_remove_buddy, NULL); g_list_free(to_remove); } }
static void file_recv_request_cb(PurpleXfer *xfer, gpointer handle) { PurpleAccount *account; PurpleBlistNode *node; const char *pref; char *filename; char *dirname; int accept_setting; account = xfer->account; node = PURPLE_BLIST_NODE(purple_find_buddy(account, xfer->who)); /* If person is on buddy list, use the buddy setting; otherwise, use the stranger setting. */ if (node) { node = purple_blist_node_get_parent(node); g_return_if_fail(PURPLE_BLIST_NODE_IS_CONTACT(node)); accept_setting = purple_blist_node_get_int(node, "autoaccept"); } else { accept_setting = purple_prefs_get_int(PREF_STRANGER); } switch (accept_setting) { case FT_ASK: break; case FT_ACCEPT: pref = purple_prefs_get_string(PREF_PATH); if (ensure_path_exists(pref)) { int count = 1; const char *escape; gchar **name_and_ext; const gchar *name; gchar *ext; if (purple_prefs_get_bool(PREF_NEWDIR)) dirname = g_build_filename(pref, purple_normalize(account, xfer->who), NULL); else dirname = g_build_filename(pref, NULL); if (!ensure_path_exists(dirname)) { g_free(dirname); break; } /* Escape filename (if escaping is turned on) */ if (purple_prefs_get_bool(PREF_ESCAPE)) { escape = purple_escape_filename(xfer->filename); } else { escape = xfer->filename; } filename = g_build_filename(dirname, escape, NULL); /* Split at the first dot, to avoid uniquifying "foo.tar.gz" to "foo.tar-2.gz" */ name_and_ext = g_strsplit(escape, ".", 2); name = name_and_ext[0]; g_return_if_fail(name != NULL); if (name_and_ext[1] != NULL) { /* g_strsplit does not include the separator in each chunk. */ ext = g_strdup_printf(".%s", name_and_ext[1]); } else { ext = g_strdup(""); } /* Make sure the file doesn't exist. Do we want some better checking than this? */ /* FIXME: There is a race here: if the newly uniquified file name gets created between * this g_file_test and the transfer starting, the file created in the meantime * will be clobbered. But it's not at all straightforward to fix. */ while (g_file_test(filename, G_FILE_TEST_EXISTS)) { char *file = g_strdup_printf("%s-%d%s", name, count++, ext); g_free(filename); filename = g_build_filename(dirname, file, NULL); g_free(file); } purple_xfer_request_accepted(xfer, filename); g_strfreev(name_and_ext); g_free(ext); g_free(dirname); g_free(filename); } purple_signal_connect(purple_xfers_get_handle(), "file-recv-complete", handle, PURPLE_CALLBACK(auto_accept_complete_cb), xfer); break; case FT_REJECT: xfer->status = PURPLE_XFER_STATUS_CANCEL_LOCAL; break; } }