libpurple/protocols/gg/purplew.c

Mon, 16 Sep 2013 17:23:25 +0530

author
Ankit Vani <a@nevitus.org>
date
Mon, 16 Sep 2013 17:23:25 +0530
branch
soc.2013.gobjectification
changeset 34946
76aa2e0f8701
parent 34940
c0aef3b64c56
parent 34435
5f8f4ad241d1
child 35355
3be5d45ba972
permissions
-rw-r--r--

Merged default branch

/* purple
 *
 * Purple is the legal property of its developers, whose names are too numerous
 * to list here.  Please refer to the COPYRIGHT file distributed with this
 * source distribution.
 *
 * Rewritten from scratch during Google Summer of Code 2012
 * by Tomek Wasilczyk (http://www.wasilczyk.pl).
 *
 * Previously implemented by:
 *  - Arkadiusz Miskiewicz <misiek@pld.org.pl> - first implementation (2001);
 *  - Bartosz Oler <bartosz@bzimage.us> - reimplemented during GSoC 2005;
 *  - Krzysztof Klinikowski <grommasher@gmail.com> - some parts (2009-2011).
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
 */

#include "purplew.h"

#include <request.h>
#include <debug.h>

#include "tcpsocket.h"

guint ggp_purplew_http_input_add(struct gg_http *http_req,
	PurpleInputFunction func, gpointer user_data)
{
	//TODO: verbose mode
	//purple_debug_misc("gg", "ggp_purplew_http_input_add: "
	//	"[req=%x, fd=%d, cond=%d]\n",
	//	(unsigned int)http_req, http_req->fd, cond);
	return purple_input_add(http_req->fd,
		ggp_tcpsocket_inputcond_gg_to_purple(http_req->check),
		func, user_data);
}

static void ggp_purplew_request_processing_cancel(
	ggp_purplew_request_processing_handle *handle, gint id)
{
	handle->cancel_cb(handle->gc, handle->user_data);
	g_free(handle);
}

ggp_purplew_request_processing_handle * ggp_purplew_request_processing(
	PurpleConnection *gc, const gchar *msg, void *user_data,
	ggp_purplew_request_processing_cancel_cb cancel_cb)
{
	ggp_purplew_request_processing_handle *handle =
		g_new(ggp_purplew_request_processing_handle, 1);

	handle->gc = gc;
	handle->cancel_cb = cancel_cb;
	handle->user_data = user_data;
	handle->request_handle = purple_request_action(gc, _("Please wait..."),
		(msg ? msg : _("Please wait...")), NULL,
		PURPLE_DEFAULT_ACTION_NONE,
		purple_request_cpar_from_connection(gc), handle, 1,
		_("Cancel"), G_CALLBACK(ggp_purplew_request_processing_cancel));
	
	return handle;
}

void ggp_purplew_request_processing_done(
	ggp_purplew_request_processing_handle *handle)
{
	purple_request_close(PURPLE_REQUEST_ACTION, handle->request_handle);
	g_free(handle);
}

PurpleGroup * ggp_purplew_buddy_get_group_only(PurpleBuddy *buddy)
{
	PurpleGroup *group = purple_buddy_get_group(buddy);
	if (!group)
		return NULL;
	if (0 == strcmp(GGP_PURPLEW_GROUP_DEFAULT, purple_group_get_name(group)))
		return NULL;
	return group;
}

GList * ggp_purplew_group_get_buddies(PurpleGroup *group, PurpleAccount *account)
{
	GList *buddies = NULL;
	PurpleBlistNode *gnode, *cnode, *bnode;
	
	g_return_val_if_fail(group != NULL, NULL);
	
	gnode = PURPLE_BLIST_NODE(group);
	for (cnode = gnode->child; cnode; cnode = cnode->next)
	{
		if (!PURPLE_IS_CONTACT(cnode))
			continue;
		for (bnode = cnode->child; bnode; bnode = bnode->next)
		{
			PurpleBuddy *buddy;
			if (!PURPLE_IS_BUDDY(bnode))
				continue;
			
			buddy = PURPLE_BUDDY(bnode);
			if (account == NULL || purple_buddy_get_account(buddy) == account)
				buddies = g_list_append(buddies, buddy);
		}
	}
	
	return buddies;
}

GList * ggp_purplew_account_get_groups(PurpleAccount *account, gboolean exclusive)
{
	PurpleBlistNode *bnode;
	GList *groups = NULL;
	for (bnode = purple_blist_get_root(); bnode; bnode = bnode->next)
	{
		PurpleGroup *group;
		GSList *accounts;
		gboolean have_specified = FALSE, have_others = FALSE;
		
		if (!PURPLE_IS_GROUP(bnode))
			continue;
		
		group = PURPLE_GROUP(bnode);
		for (accounts = purple_group_get_accounts(group); accounts; accounts = g_slist_delete_link(accounts, accounts))
		{
			if (accounts->data == account)
				have_specified = TRUE;
			else
				have_others = TRUE;
		}
		
		if (have_specified && (!exclusive || !have_others))
			groups = g_list_append(groups, group);
	}
	return groups;
}

mercurial