view libpurple/purple-client.c @ 31588:06ed9020b784

jabber: Treat empty <group/> elements as "Buddies", not "" This ultimately led to duplicates in the list, because we had one entry in the GSList as "", and one as NULL, both of which are invalid group names, which resulted in the core blithely replacing them with "Buddies" and generating duplicates. I've tested with and without, and can reproduce the issues without the change. Log: <item subscription='both' name='person' jid='person@example.com'><group></group><group></group></item> (19:32:23) jabber: jabber_roster_parse(): Removing person@example.com from group 'Buddies' on the local list (19:32:23) GLib: g_string_append: assertion `val != NULL' failed (19:32:23) jabber: jabber_roster_parse(): Adding person@example.com to groups: , (19:32:23) g_log: purple_find_group: assertion `(name != NULL) && (*name != '\0')' failed (19:32:23) g_log: purple_group_new: assertion `name != NULL' failed (19:32:23) g_log: purple_blist_add_group: assertion `group != NULL' failed (19:32:23) g_log: purple_find_group: assertion `(name != NULL) && (*name != '\0')' failed (19:32:23) g_log: purple_group_new: assertion `*name != '\0'' failed (19:32:23) g_log: purple_blist_add_group: assertion `group != NULL' failed Since I had to look it up, purple_blist_add_buddy replaces (group == NULL) with "Buddies".
author Paul Aurich <paul@darkrain42.org>
date Wed, 11 May 2011 01:58:03 +0000
parents 48d09d62912e
children
line wrap: on
line source

#ifndef DBUS_API_SUBJECT_TO_CHANGE
#define DBUS_API_SUBJECT_TO_CHANGE
#endif

#include <dbus/dbus-glib.h>
#include <stdio.h>
#include <stdlib.h>

#include "dbus-purple.h"
#include "purple-client.h"

static DBusGConnection *bus;
static DBusGProxy *purple_proxy;

static GList *garray_int_to_glist(GArray *array)
{
	GList *list = NULL;
	int i;

	for (i = 0; i < array->len; i++)
		list = g_list_append(list, GINT_TO_POINTER(g_array_index(array,gint,i)));

	g_array_free(array, TRUE);
	return list;
}

static GSList *garray_int_to_gslist(GArray *array)
{
	GSList *list = NULL;
	int i;

	for (i = 0; i < array->len; i++)
		list = g_slist_append(list, GINT_TO_POINTER(g_array_index(array,gint,i)));

	g_array_free(array, TRUE);
	return list;
}

#include "purple-client-bindings.c"

static void lose(const char *fmt, ...) G_GNUC_NORETURN G_GNUC_PRINTF (1, 2);
static void lose_gerror(const char *prefix, GError *error) G_GNUC_NORETURN;

static void
lose(const char *str, ...)
{
	va_list args;

	va_start(args, str);

	vfprintf(stderr, str, args);
	fputc('\n', stderr);

	va_end(args);

	exit(1);
}

static void
lose_gerror(const char *prefix, GError *error)
{
	lose("%s: %s", prefix, error->message);
}

void purple_init(void)
{
	GError *error = NULL;

	g_type_init ();

	bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
	if (!bus)
		lose_gerror ("Couldn't connect to session bus", error);

	purple_proxy = dbus_g_proxy_new_for_name (bus,
					DBUS_SERVICE_PURPLE,
					DBUS_PATH_PURPLE,
					DBUS_INTERFACE_PURPLE);

	if (!purple_proxy)
		lose_gerror ("Couldn't connect to the Purple Service", error);
}