コード例 #1
0
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);
}
コード例 #2
0
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);
}
コード例 #3
0
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
	);
}
コード例 #4
0
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;
}
コード例 #5
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;
}
コード例 #6
0
ファイル: ui.c プロジェクト: sardemff7/purple-events
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);

}
コード例 #7
0
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);
}
コード例 #8
0
ファイル: ticker.c プロジェクト: gotomypc/pidgin_whiteboard
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);
			}
		}
	}
}
コード例 #9
0
ファイル: napster.c プロジェクト: rgenoud/purple-plugin-pack
/* 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);
                }
            }
        }
    }
}
コード例 #10
0
ファイル: buddy.c プロジェクト: dylex/pidgin
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);
				}
			}
		}
	}
}
コード例 #11
0
ファイル: migrate.c プロジェクト: Javran/purple-plugin-pack
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;
}
コード例 #12
0
ファイル: netsoul.c プロジェクト: Bocaa/netsoul-purple
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);
}
コード例 #13
0
/* 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 */
            }
        }
    }
}
コード例 #14
0
ファイル: ui.c プロジェクト: sardemff7/purple-events
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);
}
コード例 #15
0
ファイル: autoaccept.c プロジェクト: Draghtnod/pidgin
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);
}
コード例 #16
0
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;
}
コード例 #17
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;
}
コード例 #18
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);
}
コード例 #19
0
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;
}
コード例 #20
0
ファイル: autoaccept.c プロジェクト: Draghtnod/pidgin
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);
}
コード例 #21
0
ファイル: ui.c プロジェクト: sardemff7/purple-events
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;
}
コード例 #22
0
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--;
  }
  
}
コード例 #23
0
ファイル: msgs.c プロジェクト: bf4/pidgin-mac
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);
}
コード例 #24
0
ファイル: BuddyList.cpp プロジェクト: transacid/CenterIM5
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);
  }
}
コード例 #25
0
ファイル: BuddyListNode.cpp プロジェクト: kyak/centerim5
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);
}
コード例 #26
0
ファイル: buddyicon.c プロジェクト: CkNoSFeRaTU/pidgin
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);
}
コード例 #27
0
ファイル: netsoul.c プロジェクト: Bocaa/netsoul-purple
/*
  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);
}
コード例 #28
0
ファイル: autoaccept.c プロジェクト: Draghtnod/pidgin
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);
}
コード例 #29
0
ファイル: session.c プロジェクト: bf4/pidgin-mac
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);
	}
}
コード例 #30
0
ファイル: autoaccept.c プロジェクト: Draghtnod/pidgin
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;
	}
}