changeset 31850:3e4b6ffbb551

propagate from branch 'im.pidgin.pidgin' (head 64f4eb5c598356fe1b8b9bc376faa66641096eda) to branch 'im.pidgin.pidgin.next.major' (head 950eb2e674f6da789c0132765c4f2d68ccd0d617)
author Mark Doliner <mark@kingant.net>
date Sun, 12 Jun 2011 17:56:24 +0000
parents 3a3af6ad3166 (current diff) 4c046f6564cd (diff)
children a3b1dcf433b5
files ChangeLog ChangeLog.API Makefile.am configure.ac gaim-uninstalled.pc.in gaim.pc.in libpurple/gaim-compat.h libpurple/protocols/oscar/oscar.c libpurple/purple-2-uninstalled.pc.in libpurple/purple-2.pc.in libpurple/purple-uninstalled.pc.in libpurple/purple.pc.in pidgin/gtkgaim-compat.h pidgin/gtkprefs.c pidgin/pidgin-2-uninstalled.pc.in pidgin/pidgin-2.pc.in pidgin/pidgin-uninstalled.pc.in pidgin/pidgin.pc.in
diffstat 52 files changed, 497 insertions(+), 3855 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sun Jun 12 17:52:59 2011 +0000
+++ b/ChangeLog	Sun Jun 12 17:56:24 2011 +0000
@@ -1,5 +1,11 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
+version 3.0.0 (??/??/????):
+	AIM and ICQ:
+	* Make buddy list management code more efficient. (Oliver) (#4816)
+	* Don't try to format ICQ usernames entered as email addresses.
+	  Gets rid of an "Unable to format username" error at login. (#13883)
+
 version 2.8.1 (MM/DD/YYYY):
 	libpurple:
 	* media: Actually use the specified TCP port from the TURN configuration to
--- a/ChangeLog.API	Sun Jun 12 17:52:59 2011 +0000
+++ b/ChangeLog.API	Sun Jun 12 17:56:24 2011 +0000
@@ -1,5 +1,16 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
+version 3.0.0 (??/??/????):
+	libpurple:
+		Added:
+		* purple_notify_searchresult_column_set_visible
+		* purple_notify_searchresult_column_is_visible
+		* purple_request_field_set_tooltip
+		* purple_request_field_get_tooltip
+
+		Removed:
+		* purple_core_migrate
+
 version 2.8.0 (06/07/2011):
 	libpurple:
 		Added:
--- a/Makefile.am	Sun Jun 12 17:52:59 2011 +0000
+++ b/Makefile.am	Sun Jun 12 17:56:24 2011 +0000
@@ -11,8 +11,6 @@
 		config.h.mingw \
 		doxy2devhelp.xsl \
 		fix-casts.sh \
-		gaim.pc.in \
-		gaim-uninstalled.pc.in \
 		intltool-extract.in \
 		intltool-merge.in \
 		intltool-update.in \
--- a/configure.ac	Sun Jun 12 17:52:59 2011 +0000
+++ b/configure.ac	Sun Jun 12 17:56:24 2011 +0000
@@ -43,10 +43,10 @@
 #
 # Make sure to update finch/libgnt/configure.ac with libgnt version changes.
 #
-m4_define([purple_lt_current], [8])
-m4_define([purple_major_version], [2])
-m4_define([purple_minor_version], [8])
-m4_define([purple_micro_version], [1])
+m4_define([purple_lt_current], [20])
+m4_define([purple_major_version], [3])
+m4_define([purple_minor_version], [0])
+m4_define([purple_micro_version], [0])
 m4_define([purple_version_suffix], [devel])
 m4_define([purple_version],
           [purple_major_version.purple_minor_version.purple_micro_version])
@@ -2531,10 +2531,8 @@
 		   m4macros/Makefile
 		   pidgin.apspec
 		   pidgin/Makefile
-		   pidgin/pidgin.pc
-		   pidgin/pidgin-uninstalled.pc
-		   pidgin/pidgin-2.pc
-		   pidgin/pidgin-2-uninstalled.pc
+		   pidgin/pidgin-3.pc
+		   pidgin/pidgin-3-uninstalled.pc
 		   pidgin/pixmaps/Makefile
 		   pidgin/pixmaps/emotes/default/24/Makefile
 		   pidgin/pixmaps/emotes/none/Makefile
@@ -2551,10 +2549,8 @@
 		   libpurple/ciphers/Makefile
 		   libpurple/example/Makefile
 		   libpurple/gconf/Makefile
-		   libpurple/purple.pc
-		   libpurple/purple-uninstalled.pc
-		   libpurple/purple-2.pc
-		   libpurple/purple-2-uninstalled.pc
+		   libpurple/purple-3.pc
+		   libpurple/purple-3-uninstalled.pc
 		   libpurple/plugins/Makefile
 		   libpurple/plugins/mono/Makefile
 		   libpurple/plugins/mono/api/Makefile
--- a/finch/finch.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/finch/finch.c	Sun Jun 12 17:56:24 2011 +0000
@@ -334,29 +334,6 @@
 	/* We don't want debug-messages to show up and corrupt the display */
 	purple_debug_set_enabled(debug_enabled);
 
-	/* If we're using a custom configuration directory, we
-	 * do NOT want to migrate, or weird things will happen. */
-	if (opt_config_dir_arg == NULL)
-	{
-		if (!purple_core_migrate())
-		{
-			char *old = g_strconcat(purple_home_dir(),
-			                        G_DIR_SEPARATOR_S ".gaim", NULL);
-			char *text = g_strdup_printf(_(
-				"%s encountered errors migrating your settings "
-				"from %s to %s. Please investigate and complete the "
-				"migration by hand. Please report this error at http://developer.pidgin.im"), _("Finch"),
-				old, purple_user_dir());
-
-			g_free(old);
-
-			purple_print_utf8_to_console(stderr, text);
-			g_free(text);
-
-			return 0;
-		}
-	}
-
 	purple_core_set_ui_ops(gnt_core_get_ui_ops());
 	purple_eventloop_set_ui_ops(gnt_eventloop_get_ui_ops());
 	purple_idle_set_ui_ops(finch_idle_get_ui_ops());
--- a/finch/gntnotify.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/finch/gntnotify.c	Sun Jun 12 17:56:24 2011 +0000
@@ -430,6 +430,9 @@
 	{
 		PurpleNotifySearchColumn *column = iter->data;
 		gnt_tree_set_column_title(GNT_TREE(tree), i, column->title);
+
+		if (!purple_notify_searchresult_column_is_visible(column))
+			gnt_tree_set_column_visible(GNT_TREE(tree), i, FALSE);
 		i++;
 	}
 
--- a/finch/gntprefs.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/finch/gntprefs.c	Sun Jun 12 17:56:24 2011 +0000
@@ -62,14 +62,6 @@
 
 void finch_prefs_update_old()
 {
-	const char *str = NULL;
-
-	purple_prefs_rename("/gaim/gnt", "/finch");
-	purple_prefs_rename("/purple/gnt", "/finch");
-
-	if ((str = purple_prefs_get_string("/purple/away/idle_reporting")) &&
-			strcmp(str, "gaim") == 0)
-		purple_prefs_set_string("/purple/away/idle_reporting", "purple");
 }
 
 typedef struct
--- a/gaim-uninstalled.pc.in	Sun Jun 12 17:52:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
- 
-Name: Pidgin (Gaim compatibility)
-Description: Pidgin is a GTK2-based instant messenger application.
-Version: @VERSION@
-Requires: glib-2.0
-Cflags: -I${pc_top_builddir}/${pcfiledir}/libpurple -I${pc_top_builddir}/${pcfiledir}/pidgin
-Libs: ${pc_top_builddir}/${pcfiledir}/libpurple/libpurple.la
--- a/gaim.pc.in	Sun Jun 12 17:52:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-
-Name: Pidgin (Gaim compatibility)
-Description: Pidgin is a GTK2-based instant messenger application.
-Version: @VERSION@
-Requires: glib-2.0
-Cflags: -I${includedir}/libpurple
-Libs: -L${libdir} -lpurple
--- a/libpurple/Makefile.am	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/Makefile.am	Sun Jun 12 17:56:24 2011 +0000
@@ -9,8 +9,8 @@
 		purple-send-async \
 		purple-url-handler \
 		purple.h.in \
-		purple.pc.in \
-		purple-uninstalled.pc.in \
+		purple-3.pc.in \
+		purple-3-uninstalled.pc.in \
 		version.h.in \
 		Makefile.mingw \
 		win32/global.mak \
@@ -30,7 +30,7 @@
 endif
 
 pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = purple.pc
+pkgconfig_DATA = purple-3.pc
 
 SUBDIRS = $(GCONF_DIR) plugins protocols ciphers . tests example
 
@@ -117,7 +117,6 @@
 	desktopitem.h \
 	eventloop.h \
 	ft.h \
-	gaim-compat.h \
 	idle.h \
 	imgstore.h \
 	log.h \
--- a/libpurple/account.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/account.c	Sun Jun 12 17:56:24 2011 +0000
@@ -874,7 +874,7 @@
 		return NULL;
 	}
 
-	ret = purple_account_new(name, _purple_oscar_convert(name, protocol_id)); /* XXX: */
+	ret = purple_account_new(name, protocol_id);
 	g_free(name);
 	g_free(protocol_id);
 
@@ -924,15 +924,6 @@
 		{
 			purple_buddy_icons_set_account_icon(ret, (guchar *)contents, len);
 		}
-		else
-		{
-			/* Try to see if the icon got left behind in the old cache. */
-			g_free(filename);
-			filename = g_build_filename(g_get_home_dir(), ".gaim", "icons", data, NULL);
-			if (g_file_get_contents(filename, &contents, &len, NULL)) {
-				purple_buddy_icons_set_account_icon(ret, (guchar*)contents, len);
-			}
-		}
 
 		g_free(filename);
 		g_free(data);
--- a/libpurple/blist.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/blist.c	Sun Jun 12 17:56:24 2011 +0000
@@ -461,19 +461,16 @@
 	PurpleAccount *account;
 	PurpleBuddy *buddy;
 	char *name = NULL, *alias = NULL;
-	const char *acct_name, *proto, *protocol;
+	const char *acct_name, *proto;
 	xmlnode *x;
 
 	acct_name = xmlnode_get_attrib(bnode, "account");
-	protocol = xmlnode_get_attrib(bnode, "protocol");
-	protocol = _purple_oscar_convert(acct_name, protocol); /* XXX: Remove */
 	proto = xmlnode_get_attrib(bnode, "proto");
-	proto = _purple_oscar_convert(acct_name, proto); /* XXX: Remove */
-
-	if (!acct_name || (!proto && !protocol))
+
+	if (!acct_name || !proto)
 		return;
 
-	account = purple_accounts_find(acct_name, proto ? proto : protocol);
+	account = purple_accounts_find(acct_name, proto);
 
 	if (!account)
 		return;
@@ -532,19 +529,18 @@
 {
 	PurpleChat *chat;
 	PurpleAccount *account;
-	const char *acct_name, *proto, *protocol;
+	const char *acct_name, *proto;
 	xmlnode *x;
 	char *alias = NULL;
 	GHashTable *components;
 
 	acct_name = xmlnode_get_attrib(cnode, "account");
-	protocol = xmlnode_get_attrib(cnode, "protocol");
 	proto = xmlnode_get_attrib(cnode, "proto");
 
-	if (!acct_name || (!proto && !protocol))
+	if (!acct_name || !proto)
 		return;
 
-	account = purple_accounts_find(acct_name, proto ? proto : protocol);
+	account = purple_accounts_find(acct_name, proto);
 
 	if (!account)
 		return;
@@ -630,17 +626,16 @@
 			xmlnode *x;
 			PurpleAccount *account;
 			int imode;
-			const char *acct_name, *proto, *mode, *protocol;
+			const char *acct_name, *proto, *mode;
 
 			acct_name = xmlnode_get_attrib(anode, "name");
-			protocol = xmlnode_get_attrib(anode, "protocol");
 			proto = xmlnode_get_attrib(anode, "proto");
 			mode = xmlnode_get_attrib(anode, "mode");
 
-			if (!acct_name || (!proto && !protocol) || !mode)
+			if (!acct_name || !proto || !mode)
 				continue;
 
-			account = purple_accounts_find(acct_name, proto ? proto : protocol);
+			account = purple_accounts_find(acct_name, proto);
 
 			if (!account)
 				continue;
--- a/libpurple/buddyicon.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/buddyicon.c	Sun Jun 12 17:56:24 2011 +0000
@@ -105,9 +105,6 @@
 /** "Should icons be cached to disk?" */
 static gboolean    icon_caching  = TRUE;
 
-/* For ~/.gaim to ~/.purple migration. */
-static char *old_icons_dir = NULL;
-
 static void delete_buddy_icon_settings(PurpleBlistNode *node, const char *setting_name);
 
 /*
@@ -759,7 +756,7 @@
 	else
 		g_hash_table_remove(pointer_icon_cache, account);
 
-	if (purple_account_is_connected(account))
+	if (!purple_account_is_disconnected(account))
 	{
 		PurpleConnection *gc;
 		PurplePluginProtocolInfo *prpl_info;
@@ -977,12 +974,6 @@
 	return purple_buddy_icons_node_set_custom_icon((PurpleBlistNode*)contact, icon_data, icon_len);
 }
 
-void
-_purple_buddy_icon_set_old_icons_dir(const char *dirname)
-{
-	old_icons_dir = g_strdup(dirname);
-}
-
 static void
 delete_buddy_icon_settings(PurpleBlistNode *node, const char *setting_name)
 {
@@ -995,133 +986,6 @@
 	}
 }
 
-static void
-migrate_buddy_icon(PurpleBlistNode *node, const char *setting_name,
-                   const char *dirname, const char *filename)
-{
-	char *path;
-
-	if (filename[0] != '/')
-	{
-		path = g_build_filename(dirname, filename, NULL);
-		if (g_file_test(path, G_FILE_TEST_EXISTS))
-		{
-			g_free(path);
-			return;
-		}
-		g_free(path);
-
-		path = g_build_filename(old_icons_dir, filename, NULL);
-	}
-	else
-		path = g_strdup(filename);
-
-	if (g_file_test(path, G_FILE_TEST_EXISTS))
-	{
-		guchar *icon_data;
-		size_t icon_len;
-		FILE *file;
-		char *new_filename;
-
-		if (!read_icon_file(path, &icon_data, &icon_len))
-		{
-			g_free(path);
-			delete_buddy_icon_settings(node, setting_name);
-			return;
-		}
-
-		if (icon_data == NULL || icon_len <= 0)
-		{
-			/* This really applies to the icon_len check.
-			 * icon_data should never be NULL if
-			 * read_icon_file() returns TRUE. */
-			purple_debug_error("buddyicon", "Empty buddy icon file: %s\n", path);
-			delete_buddy_icon_settings(node, setting_name);
-			g_free(path);
-			return;
-		}
-
-		g_free(path);
-
-		new_filename = purple_util_get_image_filename(icon_data, icon_len);
-		if (new_filename == NULL)
-		{
-			purple_debug_error("buddyicon",
-				"New icon filename is NULL. This should never happen! "
-				"The old filename was: %s\n", path);
-			delete_buddy_icon_settings(node, setting_name);
-			g_return_if_reached();
-		}
-
-		path = g_build_filename(dirname, new_filename, NULL);
-		if ((file = g_fopen(path, "wb")) != NULL)
-		{
-			if (!fwrite(icon_data, icon_len, 1, file))
-			{
-				purple_debug_error("buddyicon", "Error writing %s: %s\n",
-				                   path, g_strerror(errno));
-			}
-			else
-				purple_debug_info("buddyicon", "Wrote migrated cache file: %s\n", path);
-
-			fclose(file);
-		}
-		else
-		{
-			purple_debug_error("buddyicon", "Unable to create file %s: %s\n",
-			                   path, g_strerror(errno));
-			g_free(new_filename);
-			g_free(path);
-
-			delete_buddy_icon_settings(node, setting_name);
-			return;
-		}
-		g_free(path);
-
-		purple_blist_node_set_string(node,
-		                             setting_name,
-		                             new_filename);
-		ref_filename(new_filename);
-
-		g_free(new_filename);
-
-		if (purple_strequal(setting_name, "buddy_icon"))
-		{
-			const char *hash;
-
-			hash = purple_blist_node_get_string(node, "avatar_hash");
-			if (hash != NULL)
-			{
-				purple_blist_node_set_string(node, "icon_checksum", hash);
-				purple_blist_node_remove_setting(node, "avatar_hash");
-			}
-			else
-			{
-				PurpleAccount *account = purple_buddy_get_account((PurpleBuddy *)node);
-				const char *prpl_id = purple_account_get_protocol_id(account);
-
-				if (g_str_equal(prpl_id, "prpl-yahoo") || g_str_equal(prpl_id, "prpl-yahoojp"))
-				{
-					int checksum = purple_blist_node_get_int(node, "icon_checksum");
-					if (checksum != 0)
-					{
-						char *checksum_str = g_strdup_printf("%i", checksum);
-						purple_blist_node_remove_setting(node, "icon_checksum");
-						purple_blist_node_set_string(node, "icon_checksum", checksum_str);
-						g_free(checksum_str);
-					}
-				}
-			}
-		}
-	}
-	else
-	{
-		purple_debug_error("buddyicon", "Old icon file doesn't exist: %s\n", path);
-		delete_buddy_icon_settings(node, setting_name);
-		g_free(path);
-	}
-}
-
 void
 _purple_buddy_icons_account_loaded_cb()
 {
@@ -1153,22 +1017,6 @@
 	PurpleBlistNode *node = purple_blist_get_root();
 	const char *dirname = purple_buddy_icons_get_cache_dir();
 
-	/* Doing this once here saves having to check it inside a loop. */
-	if (old_icons_dir != NULL)
-	{
-		if (!g_file_test(dirname, G_FILE_TEST_IS_DIR))
-		{
-			purple_debug_info("buddyicon", "Creating icon cache directory.\n");
-
-			if (g_mkdir(dirname, S_IRUSR | S_IWUSR | S_IXUSR) < 0)
-			{
-				purple_debug_error("buddyicon",
-				                   "Unable to create directory %s: %s\n",
-				                   dirname, g_strerror(errno));
-			}
-		}
-	}
-
 	while (node != NULL)
 	{
 		if (PURPLE_BLIST_NODE_IS_BUDDY(node))
@@ -1178,26 +1026,17 @@
 			filename = purple_blist_node_get_string(node, "buddy_icon");
 			if (filename != NULL)
 			{
-				if (old_icons_dir != NULL)
+				char *path = g_build_filename(dirname, filename, NULL);
+				if (!g_file_test(path, G_FILE_TEST_EXISTS))
 				{
-					migrate_buddy_icon(node,
-					                   "buddy_icon",
-					                   dirname, filename);
+					purple_blist_node_remove_setting(node,
+					                                 "buddy_icon");
+					purple_blist_node_remove_setting(node,
+					                                 "icon_checksum");
 				}
 				else
-				{
-					char *path = g_build_filename(dirname, filename, NULL);
-					if (!g_file_test(path, G_FILE_TEST_EXISTS))
-					{
-						purple_blist_node_remove_setting(node,
-						                                 "buddy_icon");
-						purple_blist_node_remove_setting(node,
-						                                 "icon_checksum");
-					}
-					else
-						ref_filename(filename);
-					g_free(path);
-				}
+					ref_filename(filename);
+				g_free(path);
 			}
 		}
 		else if (PURPLE_BLIST_NODE_IS_CONTACT(node) ||
@@ -1209,24 +1048,15 @@
 			filename = purple_blist_node_get_string(node, "custom_buddy_icon");
 			if (filename != NULL)
 			{
-				if (old_icons_dir != NULL)
+				char *path = g_build_filename(dirname, filename, NULL);
+				if (!g_file_test(path, G_FILE_TEST_EXISTS))
 				{
-					migrate_buddy_icon(node,
-					                   "custom_buddy_icon",
-					                   dirname, filename);
+					purple_blist_node_remove_setting(node,
+					                                 "custom_buddy_icon");
 				}
 				else
-				{
-					char *path = g_build_filename(dirname, filename, NULL);
-					if (!g_file_test(path, G_FILE_TEST_EXISTS))
-					{
-						purple_blist_node_remove_setting(node,
-						                                 "custom_buddy_icon");
-					}
-					else
-						ref_filename(filename);
-					g_free(path);
-				}
+					ref_filename(filename);
+				g_free(path);
 			}
 		}
 		node = purple_blist_node_next(node, TRUE);
@@ -1298,11 +1128,9 @@
 	g_hash_table_destroy(icon_data_cache);
 	g_hash_table_destroy(icon_file_cache);
 	g_hash_table_destroy(pointer_icon_cache);
-	g_free(old_icons_dir);
 	g_free(cache_dir);
 
 	cache_dir = NULL;
-	old_icons_dir = NULL;
 }
 
 void purple_buddy_icon_get_scale_size(PurpleBuddyIconSpec *spec, int *width, int *height)
--- a/libpurple/core.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/core.c	Sun Jun 12 17:56:24 2011 +0000
@@ -371,386 +371,6 @@
 	return is_single_instance;
 }
 
-static gboolean
-move_and_symlink_dir(const char *path, const char *basename, const char *old_base, const char *new_base, const char *relative)
-{
-	char *new_name = g_build_filename(new_base, basename, NULL);
-#ifndef _WIN32
-	char *old_name;
-#endif
-	if (g_rename(path, new_name))
-	{
-		purple_debug_error("core", "Error renaming %s to %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
-		                   path, new_name, g_strerror(errno));
-		g_free(new_name);
-		return FALSE;
-	}
-	g_free(new_name);
-
-#ifndef _WIN32
-	/* NOTE: This new_name is relative. */
-	new_name = g_build_filename(relative, basename, NULL);
-	old_name = g_build_filename(old_base, basename, NULL);
-	if (symlink(new_name, old_name))
-	{
-		purple_debug_warning("core", "Error symlinking %s to %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
-		                     old_name, new_name, g_strerror(errno));
-	}
-	g_free(old_name);
-	g_free(new_name);
-#endif
-
-	return TRUE;
-}
-
-gboolean
-purple_core_migrate(void)
-{
-	const char *user_dir = purple_user_dir();
-	char *old_user_dir = g_strconcat(purple_home_dir(),
-	                                 G_DIR_SEPARATOR_S ".gaim", NULL);
-	char *status_file;
-	FILE *fp;
-	GDir *dir;
-	GError *err;
-	const char *entry;
-#ifndef _WIN32
-	char *logs_dir;
-#endif
-	char *old_icons_dir;
-
-	if (!g_file_test(old_user_dir, G_FILE_TEST_EXISTS))
-	{
-		/* ~/.gaim doesn't exist, so there's nothing to migrate. */
-		g_free(old_user_dir);
-		return TRUE;
-	}
-
-	status_file = g_strconcat(user_dir, G_DIR_SEPARATOR_S "migrating", NULL);
-
-	if (g_file_test(user_dir, G_FILE_TEST_EXISTS))
-	{
-		/* If we're here, we have both ~/.gaim and .purple. */
-
-		if (!g_file_test(status_file, G_FILE_TEST_EXISTS))
-		{
-			/* There's no "migrating" status file,
-			 * so ~/.purple is all up to date. */
-			g_free(status_file);
-			g_free(old_user_dir);
-			return TRUE;
-		}
-	}
-
-	/* If we're here, it's time to migrate from ~/.gaim to ~/.purple. */
-
-        /* Ensure the user directory exists */
-	if (!g_file_test(user_dir, G_FILE_TEST_IS_DIR))
-	{
-		if (g_mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1)
-		{
-			purple_debug_error("core", "Error creating directory %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
-			                   user_dir, g_strerror(errno));
-			g_free(status_file);
-			g_free(old_user_dir);
-			return FALSE;
-		}
-	}
-
-	/* This writes ~/.purple/migrating, which allows us to detect
-	 * incomplete migrations and properly retry. */
-	if (!(fp = g_fopen(status_file, "w")))
-	{
-		purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
-		                   status_file, g_strerror(errno));
-		g_free(status_file);
-		g_free(old_user_dir);
-		return FALSE;
-	}
-	fclose(fp);
-
-	/* Open ~/.gaim so we can loop over its contents. */
-	err = NULL;
-	if (!(dir = g_dir_open(old_user_dir, 0, &err)))
-	{
-		purple_debug_error("core", "Error opening directory %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
-		                   status_file,
-		                   (err ? err->message : "Unknown error"));
-		if (err)
-			g_error_free(err);
-		g_free(status_file);
-		g_free(old_user_dir);
-		return FALSE;
-	}
-
-	/* Loop over the contents of ~/.gaim */
-	while ((entry = g_dir_read_name(dir)))
-	{
-		char *name = g_build_filename(old_user_dir, entry, NULL);
-
-#ifndef _WIN32
-		/* Deal with symlinks... */
-		if (g_file_test(name, G_FILE_TEST_IS_SYMLINK))
-		{
-			/* We're only going to duplicate a logs symlink. */
-			if (purple_strequal(entry, "logs"))
-			{
-				char *link;
-				err = NULL;
-
-				if ((link = g_file_read_link(name, &err)) == NULL)
-				{
-					char *name_utf8 = g_filename_to_utf8(name, -1, NULL, NULL, NULL);
-					purple_debug_error("core", "Error reading symlink %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
-					                   name_utf8 ? name_utf8 : name, err->message);
-					g_free(name_utf8);
-					g_error_free(err);
-					g_free(name);
-					g_dir_close(dir);
-					g_free(status_file);
-					g_free(old_user_dir);
-					return FALSE;
-				}
-
-				logs_dir = g_build_filename(user_dir, "logs", NULL);
-
-				if (purple_strequal(link, "../.purple/logs") ||
-				    purple_strequal(link, logs_dir))
-				{
-					/* If the symlink points to the new directory, we're
-					 * likely just trying again after a failed migration,
-					 * so there's no need to fail here. */
-					g_free(link);
-					g_free(logs_dir);
-					continue;
-				}
-
-				/* In case we are trying again after a failed migration, we need
-				 * to unlink any existing symlink.  If it's a directory, this
-				 * will fail, and so will the symlink below, which is good
-				 * because the user should sort things out. */
-				g_unlink(logs_dir);
-
-				/* Relative links will most likely still be
-				 * valid from ~/.purple, though it's not
-				 * guaranteed.  Oh well. */
-				if (symlink(link, logs_dir))
-				{
-					purple_debug_error("core", "Error symlinking %s to %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
-					                   logs_dir, link, g_strerror(errno));
-					g_free(link);
-					g_free(name);
-					g_free(logs_dir);
-					g_dir_close(dir);
-					g_free(status_file);
-					g_free(old_user_dir);
-					return FALSE;
-				}
-
-				g_free(link);
-				g_free(logs_dir);
-				continue;
-			}
-
-			/* Ignore all other symlinks. */
-			continue;
-		}
-#endif
-
-		/* Deal with directories... */
-		if (g_file_test(name, G_FILE_TEST_IS_DIR))
-		{
-			if (purple_strequal(entry, "icons"))
-			{
-				/* This is a special case for the Album plugin, which
-				 * stores data in the icons folder.  We're not copying
-				 * the icons directory over because previous bugs
-				 * meant that it filled up with junk for many users.
-				 * This is a great time to purge it. */
-
-				GDir *icons_dir;
-				char *new_icons_dir;
-				const char *icons_entry;
-
-				err = NULL;
-				if (!(icons_dir = g_dir_open(name, 0, &err)))
-				{
-					purple_debug_error("core", "Error opening directory %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
-					                   name,
-					                   (err ? err->message : "Unknown error"));
-					if (err)
-						g_error_free(err);
-					g_free(name);
-					g_dir_close(dir);
-					g_free(status_file);
-					g_free(old_user_dir);
-					return FALSE;
-				}
-
-				new_icons_dir = g_build_filename(user_dir, "icons", NULL);
-			        /* Ensure the new icon directory exists */
-				if (!g_file_test(new_icons_dir, G_FILE_TEST_IS_DIR))
-				{
-					if (g_mkdir(new_icons_dir, S_IRUSR | S_IWUSR | S_IXUSR) == -1)
-					{
-						purple_debug_error("core", "Error creating directory %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
-						                   new_icons_dir, g_strerror(errno));
-						g_free(new_icons_dir);
-						g_dir_close(icons_dir);
-						g_free(name);
-						g_dir_close(dir);
-						g_free(status_file);
-						g_free(old_user_dir);
-						return FALSE;
-					}
-				}
-
-				while ((icons_entry = g_dir_read_name(icons_dir)))
-				{
-					char *icons_name = g_build_filename(name, icons_entry, NULL);
-
-					if (g_file_test(icons_name, G_FILE_TEST_IS_DIR))
-					{
-						if (!move_and_symlink_dir(icons_name, icons_entry,
-						                          name, new_icons_dir, "../../.purple/icons"))
-						{
-							g_free(icons_name);
-							g_free(new_icons_dir);
-							g_dir_close(icons_dir);
-							g_free(name);
-							g_dir_close(dir);
-							g_free(status_file);
-							g_free(old_user_dir);
-							return FALSE;
-						}
-					}
-					g_free(icons_name);
-				}
-
-				g_dir_close(icons_dir);
-			}
-			else if (purple_strequal(entry, "plugins"))
-			{
-				/* Do nothing, because we broke plugin compatibility.
-				 * This means that the plugins directory gets left behind. */
-			}
-			else
-			{
-				/* All other directories are moved and symlinked. */
-				if (!move_and_symlink_dir(name, entry, old_user_dir, user_dir, "../.purple"))
-				{
-					g_free(name);
-					g_dir_close(dir);
-					g_free(status_file);
-					g_free(old_user_dir);
-					return FALSE;
-				}
-			}
-		}
-		else if (g_file_test(name, G_FILE_TEST_IS_REGULAR))
-		{
-			/* Regular files are copied. */
-
-			char *new_name;
-			FILE *new_file;
-
-			if (!(fp = g_fopen(name, "rb")))
-			{
-				purple_debug_error("core", "Error opening file %s for reading: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
-				                   name, g_strerror(errno));
-				g_free(name);
-				g_dir_close(dir);
-				g_free(status_file);
-				g_free(old_user_dir);
-				return FALSE;
-			}
-
-			new_name = g_build_filename(user_dir, entry, NULL);
-			if (!(new_file = g_fopen(new_name, "wb")))
-			{
-				purple_debug_error("core", "Error opening file %s for writing: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
-				                   new_name, g_strerror(errno));
-				fclose(fp);
-				g_free(new_name);
-				g_free(name);
-				g_dir_close(dir);
-				g_free(status_file);
-				g_free(old_user_dir);
-				return FALSE;
-			}
-
-			while (!feof(fp))
-			{
-				unsigned char buf[256];
-				size_t size;
-
-				size = fread(buf, 1, sizeof(buf), fp);
-				if (size != sizeof(buf) && !feof(fp))
-				{
-					purple_debug_error("core", "Error reading %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
-					                   name, g_strerror(errno));
-					fclose(new_file);
-					fclose(fp);
-					g_free(new_name);
-					g_free(name);
-					g_dir_close(dir);
-					g_free(status_file);
-					g_free(old_user_dir);
-					return FALSE;
-				}
-
-				if (!fwrite(buf, size, 1, new_file) && ferror(new_file) != 0)
-				{
-					purple_debug_error("core", "Error writing %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
-					                   new_name, g_strerror(errno));
-					fclose(new_file);
-					fclose(fp);
-					g_free(new_name);
-					g_free(name);
-					g_dir_close(dir);
-					g_free(status_file);
-					g_free(old_user_dir);
-					return FALSE;
-				}
-			}
-
-			if (fclose(new_file))
-			{
-				purple_debug_error("core", "Error writing: %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
-				                   new_name, g_strerror(errno));
-			}
-			if (fclose(fp))
-			{
-				purple_debug_warning("core", "Error closing %s: %s\n",
-				                     name, g_strerror(errno));
-			}
-			g_free(new_name);
-		}
-		else
-			purple_debug_warning("core", "Not a regular file or directory: %s\n", name);
-
-		g_free(name);
-	}
-
-	/* The migration was successful, so delete the status file. */
-	if (g_unlink(status_file))
-	{
-		purple_debug_error("core", "Error unlinking file %s: %s. Please report this at " PURPLE_DEVEL_WEBSITE "\n",
-		                   status_file, g_strerror(errno));
-		g_free(status_file);
-		return FALSE;
-	}
-
-	old_icons_dir = g_build_filename(old_user_dir, "icons", NULL);
-	_purple_buddy_icon_set_old_icons_dir(old_icons_dir);
-	g_free(old_icons_dir);
-
-	g_free(old_user_dir);
-
-	g_free(status_file);
-	return TRUE;
-}
-
 GHashTable* purple_core_get_ui_info() {
 	PurpleCoreUiOps *ops = purple_core_get_ui_ops();
 
--- a/libpurple/core.h	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/core.h	Sun Jun 12 17:56:24 2011 +0000
@@ -156,17 +156,6 @@
 PurpleCoreUiOps *purple_core_get_ui_ops(void);
 
 /**
- * Migrates from <tt>.gaim</tt> to <tt>.purple</tt>.
- *
- * UIs <strong>must not</strong> call this if they have been told to use a
- * custom user directory.
- *
- * @return A boolean indicating success or migration failure. On failure,
- *         the application must display an error to the user and then exit.
- */
-gboolean purple_core_migrate(void);
-
-/**
  * Ensures that only one instance is running.  If libpurple is built with D-Bus
  * support, this checks if another process owns the libpurple bus name and if
  * so whether that process is using the same configuration directory as this
--- a/libpurple/dnssrv.h	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/dnssrv.h	Sun Jun 12 17:56:24 2011 +0000
@@ -32,10 +32,6 @@
 typedef struct _PurpleSrvResponse PurpleSrvResponse;
 typedef struct _PurpleTxtResponse PurpleTxtResponse;
 
-/* For compatibility, should be removed for 3.0.0
- */
-typedef struct _PurpleSrvTxtQueryData PurpleSrvQueryData;
-
 #include <glib.h>
 
 enum PurpleDnsType {
--- a/libpurple/gaim-compat.h	Sun Jun 12 17:52:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2317 +0,0 @@
-/**
- * @file gaim-compat.h Gaim Compat macros
- * @ingroup core
- */
-
-/* pidgin
- *
- * Pidgin 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.
- *
- * 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
- */
-#ifndef _GAIM_COMPAT_H_
-#define _GAIM_COMPAT_H_
-
-#include <glib.h>
-
-/* from account.h */
-#define GaimAccountUiOps PurpleAccountUiOps
-#define GaimAccount PurpleAccount
-
-#define GaimFilterAccountFunc PurpleFilterAccountFunc
-#define GaimAccountRequestAuthorizationCb PurpleAccountRequestAuthorizationCb
-
-#define gaim_account_new           purple_account_new
-#define gaim_account_destroy       purple_account_destroy
-#define gaim_account_connect       purple_account_connect
-#define gaim_account_register      purple_account_register
-#define gaim_account_disconnect    purple_account_disconnect
-#define gaim_account_notify_added  purple_account_notify_added
-#define gaim_account_request_add   purple_account_request_add
-#define gaim_account_request_close   purple_account_request_close
-
-#define gaim_account_request_authorization     purple_account_request_authorization
-#define gaim_account_request_change_password   purple_account_request_change_password
-#define gaim_account_request_change_user_info  purple_account_request_change_user_info
-
-#define gaim_account_set_username            purple_account_set_username
-#define gaim_account_set_password            purple_account_set_password
-#define gaim_account_set_alias               purple_account_set_alias
-#define gaim_account_set_user_info           purple_account_set_user_info
-#define gaim_account_set_buddy_icon_path     purple_account_set_buddy_icon_path
-#define gaim_account_set_protocol_id         purple_account_set_protocol_id
-#define gaim_account_set_connection          purple_account_set_connection
-#define gaim_account_set_remember_password   purple_account_set_remember_password
-#define gaim_account_set_check_mail          purple_account_set_check_mail
-#define gaim_account_set_enabled             purple_account_set_enabled
-#define gaim_account_set_proxy_info          purple_account_set_proxy_info
-#define gaim_account_set_status_types        purple_account_set_status_types
-#define gaim_account_set_status              purple_account_set_status
-#define gaim_account_set_status_list         purple_account_set_status_list
-
-#define gaim_account_clear_settings   purple_account_clear_settings
-
-#define gaim_account_set_int    purple_account_set_int
-#define gaim_account_set_string purple_account_set_string
-#define gaim_account_set_bool   purple_account_set_bool
-
-#define gaim_account_set_ui_int     purple_account_set_ui_int
-#define gaim_account_set_ui_string  purple_account_set_ui_string
-#define gaim_account_set_ui_bool    purple_account_set_ui_bool
-
-#define gaim_account_is_connected     purple_account_is_connected
-#define gaim_account_is_connecting    purple_account_is_connecting
-#define gaim_account_is_disconnected  purple_account_is_disconnected
-
-#define gaim_account_get_username           purple_account_get_username
-#define gaim_account_get_password           purple_account_get_password
-#define gaim_account_get_alias              purple_account_get_alias
-#define gaim_account_get_user_info          purple_account_get_user_info
-#define gaim_account_get_buddy_icon_path    purple_account_get_buddy_icon_path
-#define gaim_account_get_protocol_id        purple_account_get_protocol_id
-#define gaim_account_get_protocol_name      purple_account_get_protocol_name
-#define gaim_account_get_connection         purple_account_get_connection
-#define gaim_account_get_remember_password  purple_account_get_remember_password
-#define gaim_account_get_check_mail         purple_account_get_check_mail
-#define gaim_account_get_enabled            purple_account_get_enabled
-#define gaim_account_get_proxy_info         purple_account_get_proxy_info
-#define gaim_account_get_active_status      purple_account_get_active_status
-#define gaim_account_get_status             purple_account_get_status
-#define gaim_account_get_status_type        purple_account_get_status_type
-#define gaim_account_get_status_type_with_primitive \
-	purple_account_get_status_type_with_primitive
-
-#define gaim_account_get_presence       purple_account_get_presence
-#define gaim_account_is_status_active   purple_account_is_status_active
-#define gaim_account_get_status_types   purple_account_get_status_types
-
-#define gaim_account_get_int            purple_account_get_int
-#define gaim_account_get_string         purple_account_get_string
-#define gaim_account_get_bool           purple_account_get_bool
-
-#define gaim_account_get_ui_int     purple_account_get_ui_int
-#define gaim_account_get_ui_string  purple_account_get_ui_string
-#define gaim_account_get_ui_bool    purple_account_get_ui_bool
-
-
-#define gaim_account_get_log      purple_account_get_log
-#define gaim_account_destroy_log  purple_account_destroy_log
-
-#define gaim_account_add_buddy       purple_account_add_buddy
-#define gaim_account_add_buddies     purple_account_add_buddies
-#define gaim_account_remove_buddy    purple_account_remove_buddy
-#define gaim_account_remove_buddies  purple_account_remove_buddies
-
-#define gaim_account_remove_group  purple_account_remove_group
-
-#define gaim_account_change_password  purple_account_change_password
-
-#define gaim_account_supports_offline_message  purple_account_supports_offline_message
-
-#define gaim_accounts_add      purple_accounts_add
-#define gaim_accounts_remove   purple_accounts_remove
-#define gaim_accounts_delete   purple_accounts_delete
-#define gaim_accounts_reorder  purple_accounts_reorder
-
-#define gaim_accounts_get_all         purple_accounts_get_all
-#define gaim_accounts_get_all_active  purple_accounts_get_all_active
-
-#define gaim_accounts_find   purple_accounts_find
-
-#define gaim_accounts_restore_current_statuses  purple_accounts_restore_current_statuses
-
-#define gaim_accounts_set_ui_ops  purple_accounts_set_ui_ops
-#define gaim_accounts_get_ui_ops  purple_accounts_get_ui_ops
-
-#define gaim_accounts_get_handle  purple_accounts_get_handle
-
-#define gaim_accounts_init    purple_accounts_init
-#define gaim_accounts_uninit  purple_accounts_uninit
-
-/* from accountopt.h */
-
-#define GaimAccountOption     PurpleAccountOption
-#define GaimAccountUserSplit  PurpleAccountUserSplit
-
-#define gaim_account_option_new         purple_account_option_new
-#define gaim_account_option_bool_new    purple_account_option_bool_new
-#define gaim_account_option_int_new     purple_account_option_int_new
-#define gaim_account_option_string_new  purple_account_option_string_new
-#define gaim_account_option_list_new    purple_account_option_list_new
-
-#define gaim_account_option_destroy  purple_account_option_destroy
-
-#define gaim_account_option_set_default_bool    purple_account_option_set_default_bool
-#define gaim_account_option_set_default_int     purple_account_option_set_default_int
-#define gaim_account_option_set_default_string  purple_account_option_set_default_string
-
-#define gaim_account_option_set_masked  purple_account_option_set_masked
-
-#define gaim_account_option_set_list  purple_account_option_set_list
-
-#define gaim_account_option_add_list_item  purple_account_option_add_list_item
-
-#define gaim_account_option_get_type     purple_account_option_get_type
-#define gaim_account_option_get_text     purple_account_option_get_text
-#define gaim_account_option_get_setting  purple_account_option_get_setting
-
-#define gaim_account_option_get_default_bool        purple_account_option_get_default_bool
-#define gaim_account_option_get_default_int         purple_account_option_get_default_int
-#define gaim_account_option_get_default_string      purple_account_option_get_default_string
-#define gaim_account_option_get_default_list_value  purple_account_option_get_default_list_value
-
-#define gaim_account_option_get_masked  purple_account_option_get_masked
-#define gaim_account_option_get_list    purple_account_option_get_list
-
-#define gaim_account_user_split_new      purple_account_user_split_new
-#define gaim_account_user_split_destroy  purple_account_user_split_destroy
-
-#define gaim_account_user_split_get_text           purple_account_user_split_get_text
-#define gaim_account_user_split_get_default_value  purple_account_user_split_get_default_value
-#define gaim_account_user_split_get_separator      purple_account_user_split_get_separator
-
-/* from blist.h */
-
-#define GaimBuddyList    PurpleBuddyList
-#define GaimBlistUiOps   PurpleBlistUiOps
-#define GaimBlistNode    PurpleBlistNode
-
-#define GaimChat     PurpleChat
-#define GaimGroup    PurpleGroup
-#define GaimContact  PurpleContact
-#define GaimBuddy    PurpleBuddy
-
-#define GAIM_BLIST_GROUP_NODE     PURPLE_BLIST_GROUP_NODE
-#define GAIM_BLIST_CONTACT_NODE   PURPLE_BLIST_CONTACT_NODE
-#define GAIM_BLIST_BUDDY_NODE     PURPLE_BLIST_BUDDY_NODE
-#define GAIM_BLIST_CHAT_NODE      PURPLE_BLIST_CHAT_NODE
-#define GAIM_BLIST_OTHER_NODE     PURPLE_BLIST_OTHER_NODE
-#define GaimBlistNodeType         PurpleBlistNodeType
-
-#define GAIM_BLIST_NODE_IS_CHAT       PURPLE_BLIST_NODE_IS_CHAT
-#define GAIM_BLIST_NODE_IS_BUDDY      PURPLE_BLIST_NODE_IS_BUDDY
-#define GAIM_BLIST_NODE_IS_CONTACT    PURPLE_BLIST_NODE_IS_CONTACT
-#define GAIM_BLIST_NODE_IS_GROUP      PURPLE_BLIST_NODE_IS_GROUP
-
-#define GAIM_BUDDY_IS_ONLINE PURPLE_BUDDY_IS_ONLINE
-
-#define GAIM_BLIST_NODE_FLAG_NO_SAVE  PURPLE_BLIST_NODE_FLAG_NO_SAVE
-#define GaimBlistNodeFlags            PurpleBlistNodeFlags
-
-#define GAIM_BLIST_NODE_HAS_FLAG     PURPLE_BLIST_NODE_HAS_FLAG
-#define GAIM_BLIST_NODE_SHOULD_SAVE  PURPLE_BLIST_NODE_SHOULD_SAVE
-
-#define GAIM_BLIST_NODE_NAME   PURPLE_BLIST_NODE_NAME
-
-
-#define gaim_blist_new  purple_blist_new
-#define gaim_set_blist  purple_set_blist
-#define gaim_get_blist  purple_get_blist
-
-#define gaim_blist_get_root   purple_blist_get_root
-#define gaim_blist_node_next  purple_blist_node_next
-
-#define gaim_blist_show  purple_blist_show
-
-#define gaim_blist_destroy  purple_blist_destroy
-
-#define gaim_blist_set_visible  purple_blist_set_visible
-
-#define gaim_blist_update_buddy_status  purple_blist_update_buddy_status
-#define gaim_blist_update_buddy_icon    purple_blist_update_buddy_icon
-
-
-#define gaim_blist_alias_contact       purple_blist_alias_contact
-#define gaim_blist_alias_buddy         purple_blist_alias_buddy
-#define gaim_blist_server_alias_buddy  purple_blist_server_alias_buddy
-#define gaim_blist_alias_chat          purple_blist_alias_chat
-
-#define gaim_blist_rename_buddy  purple_blist_rename_buddy
-#define gaim_blist_rename_group  purple_blist_rename_group
-
-#define gaim_chat_new        purple_chat_new
-#define gaim_blist_add_chat  purple_blist_add_chat
-
-#define gaim_buddy_new           purple_buddy_new
-#define gaim_buddy_set_icon      purple_buddy_set_icon
-#define gaim_buddy_get_account   purple_buddy_get_account
-#define gaim_buddy_get_name      purple_buddy_get_name
-#define gaim_buddy_get_icon      purple_buddy_get_icon
-#define gaim_buddy_get_contact   purple_buddy_get_contact
-#define gaim_buddy_get_presence  purple_buddy_get_presence
-
-#define gaim_blist_add_buddy  purple_blist_add_buddy
-
-#define gaim_group_new  purple_group_new
-
-#define gaim_blist_add_group  purple_blist_add_group
-
-#define gaim_contact_new  purple_contact_new
-
-#define gaim_blist_add_contact    purple_blist_add_contact
-#define gaim_blist_merge_contact  purple_blist_merge_contact
-
-#define gaim_contact_get_priority_buddy  purple_contact_get_priority_buddy
-#define gaim_contact_set_alias           purple_contact_set_alias
-#define gaim_contact_get_alias           purple_contact_get_alias
-#define gaim_contact_on_account          purple_contact_on_account
-
-#define gaim_contact_invalidate_priority_buddy  purple_contact_invalidate_priority_buddy
-
-#define gaim_blist_remove_buddy    purple_blist_remove_buddy
-#define gaim_blist_remove_contact  purple_blist_remove_contact
-#define gaim_blist_remove_chat     purple_blist_remove_chat
-#define gaim_blist_remove_group    purple_blist_remove_group
-
-#define gaim_buddy_get_alias_only     purple_buddy_get_alias_only
-#define gaim_buddy_get_server_alias   purple_buddy_get_server_alias
-#define gaim_buddy_get_contact_alias  purple_buddy_get_contact_alias
-#define gaim_buddy_get_local_alias    purple_buddy_get_local_alias
-#define gaim_buddy_get_alias          purple_buddy_get_alias
-
-#define gaim_chat_get_name  purple_chat_get_name
-
-#define gaim_find_buddy           purple_find_buddy
-#define gaim_find_buddy_in_group  purple_find_buddy_in_group
-#define gaim_find_buddies         purple_find_buddies
-
-#define gaim_find_group  purple_find_group
-
-#define gaim_blist_find_chat  purple_blist_find_chat
-
-#define gaim_chat_get_group   purple_chat_get_group
-#define gaim_buddy_get_group  purple_buddy_get_group
-
-#define gaim_group_get_accounts  purple_group_get_accounts
-#define gaim_group_on_account    purple_group_on_account
-
-#define gaim_blist_add_account     purple_blist_add_account
-#define gaim_blist_remove_account  purple_blist_remove_account
-
-#define gaim_blist_get_group_size          purple_blist_get_group_size
-#define gaim_blist_get_group_online_count  purple_blist_get_group_online_count
-
-#define gaim_blist_load           purple_blist_load
-#define gaim_blist_schedule_save  purple_blist_schedule_save
-
-#define gaim_blist_request_add_buddy  purple_blist_request_add_buddy
-#define gaim_blist_request_add_chat   purple_blist_request_add_chat
-#define gaim_blist_request_add_group  purple_blist_request_add_group
-
-#define gaim_blist_node_set_bool    purple_blist_node_set_bool
-#define gaim_blist_node_get_bool    purple_blist_node_get_bool
-#define gaim_blist_node_set_int     purple_blist_node_set_int
-#define gaim_blist_node_get_int     purple_blist_node_get_int
-#define gaim_blist_node_set_string  purple_blist_node_set_string
-#define gaim_blist_node_get_string  purple_blist_node_get_string
-
-#define gaim_blist_node_remove_setting  purple_blist_node_remove_setting
-
-#define gaim_blist_node_set_flags  purple_blist_node_set_flags
-#define gaim_blist_node_get_flags  purple_blist_node_get_flags
-
-#define gaim_blist_node_get_extended_menu  purple_blist_node_get_extended_menu
-
-#define gaim_blist_set_ui_ops  purple_blist_set_ui_ops
-#define gaim_blist_get_ui_ops  purple_blist_get_ui_ops
-
-#define gaim_blist_get_handle  purple_blist_get_handle
-
-#define gaim_blist_init    purple_blist_init
-#define gaim_blist_uninit  purple_blist_uninit
-
-
-#define GaimBuddyIcon  PurpleBuddyIcon
-
-#define gaim_buddy_icon_new(account, username, icon_data, icon_len)\
-        purple_buddy_icon_new(account, username, g_memdup(icon_data, icon_len), icon_len)
-#define gaim_buddy_icon_ref      purple_buddy_icon_ref
-#define gaim_buddy_icon_unref    purple_buddy_icon_unref
-#define gaim_buddy_icon_update   purple_buddy_icon_update
-
-#define gaim_buddy_icon_set_data(icon, data, len) \
-        purple_buddy_icon_set_data(icon, g_memdup(data, len), len, NULL);
-
-#define gaim_buddy_icon_get_account   purple_buddy_icon_get_account
-#define gaim_buddy_icon_get_username  purple_buddy_icon_get_username
-#define gaim_buddy_icon_get_data      purple_buddy_icon_get_data
-#define gaim_buddy_icon_get_type      purple_buddy_icon_get_extension
-
-#define gaim_buddy_icons_set_for_user(icon, data, len) \
-        purple_buddy_icons_set_for_user(icon, g_memdup(data, len), len, NULL)
-#define gaim_buddy_icons_set_caching    purple_buddy_icons_set_caching
-#define gaim_buddy_icons_is_caching     purple_buddy_icons_is_caching
-#define gaim_buddy_icons_set_cache_dir  purple_buddy_icons_set_cache_dir
-#define gaim_buddy_icons_get_cache_dir  purple_buddy_icons_get_cache_dir
-#define gaim_buddy_icons_get_handle     purple_buddy_icons_get_handle
-
-#define gaim_buddy_icons_init    purple_buddy_icons_init
-#define gaim_buddy_icons_uninit  purple_buddy_icons_uninit
-
-#define gaim_buddy_icon_get_scale_size  purple_buddy_icon_get_scale_size
-
-/* from cipher.h */
-
-#define GAIM_CIPHER          PURPLE_CIPHER
-#define GAIM_CIPHER_OPS      PURPLE_CIPHER_OPS
-#define GAIM_CIPHER_CONTEXT  PURPLE_CIPHER_CONTEXT
-
-#define GaimCipher         PurpleCipher
-#define GaimCipherOps      PurpleCipherOps
-#define GaimCipherContext  PurpleCipherContext
-
-#define GAIM_CIPHER_CAPS_SET_OPT  PURPLE_CIPHER_CAPS_SET_OPT
-#define GAIM_CIPHER_CAPS_GET_OPT  PURPLE_CIPHER_CAPS_GET_OPT
-#define GAIM_CIPHER_CAPS_INIT     PURPLE_CIPHER_CAPS_INIT
-#define GAIM_CIPHER_CAPS_RESET    PURPLE_CIPHER_CAPS_RESET
-#define GAIM_CIPHER_CAPS_UNINIT   PURPLE_CIPHER_CAPS_UNINIT
-#define GAIM_CIPHER_CAPS_SET_IV   PURPLE_CIPHER_CAPS_SET_IV
-#define GAIM_CIPHER_CAPS_APPEND   PURPLE_CIPHER_CAPS_APPEND
-#define GAIM_CIPHER_CAPS_DIGEST   PURPLE_CIPHER_CAPS_DIGEST
-#define GAIM_CIPHER_CAPS_ENCRYPT  PURPLE_CIPHER_CAPS_ENCRYPT
-#define GAIM_CIPHER_CAPS_DECRYPT  PURPLE_CIPHER_CAPS_DECRYPT
-#define GAIM_CIPHER_CAPS_SET_SALT  PURPLE_CIPHER_CAPS_SET_SALT
-#define GAIM_CIPHER_CAPS_GET_SALT_SIZE  PURPLE_CIPHER_CAPS_GET_SALT_SIZE
-#define GAIM_CIPHER_CAPS_SET_KEY        PURPLE_CIPHER_CAPS_SET_KEY
-#define GAIM_CIPHER_CAPS_GET_KEY_SIZE   PURPLE_CIPHER_CAPS_GET_KEY_SIZE
-#define GAIM_CIPHER_CAPS_UNKNOWN        PURPLE_CIPHER_CAPS_UNKNOWN
-
-#define gaim_cipher_get_name          purple_cipher_get_name
-#define gaim_cipher_get_capabilities  purple_cipher_get_capabilities
-#define gaim_cipher_digest_region     purple_cipher_digest_region
-
-#define gaim_ciphers_find_cipher        purple_ciphers_find_cipher
-#define gaim_ciphers_register_cipher    purple_ciphers_register_cipher
-#define gaim_ciphers_unregister_cipher  purple_ciphers_unregister_cipher
-#define gaim_ciphers_get_ciphers        purple_ciphers_get_ciphers
-
-#define gaim_ciphers_get_handle  purple_ciphers_get_handle
-#define gaim_ciphers_init        purple_ciphers_init
-#define gaim_ciphers_uninit      purple_ciphers_uninit
-
-#define gaim_cipher_context_set_option  purple_cipher_context_set_option
-#define gaim_cipher_context_get_option  purple_cipher_context_get_option
-
-#define gaim_cipher_context_new            purple_cipher_context_new
-#define gaim_cipher_context_new_by_name    purple_cipher_context_new_by_name
-#define gaim_cipher_context_reset          purple_cipher_context_reset
-#define gaim_cipher_context_destroy        purple_cipher_context_destroy
-#define gaim_cipher_context_set_iv         purple_cipher_context_set_iv
-#define gaim_cipher_context_append         purple_cipher_context_append
-#define gaim_cipher_context_digest         purple_cipher_context_digest
-#define gaim_cipher_context_digest_to_str  purple_cipher_context_digest_to_str
-#define gaim_cipher_context_encrypt        purple_cipher_context_encrypt
-#define gaim_cipher_context_decrypt        purple_cipher_context_decrypt
-#define gaim_cipher_context_set_salt       purple_cipher_context_set_salt
-#define gaim_cipher_context_get_salt_size  purple_cipher_context_get_salt_size
-#define gaim_cipher_context_set_key        purple_cipher_context_set_key
-#define gaim_cipher_context_get_key_size   purple_cipher_context_get_key_size
-#define gaim_cipher_context_set_data       purple_cipher_context_set_data
-#define gaim_cipher_context_get_data       purple_cipher_context_get_data
-
-#define gaim_cipher_http_digest_calculate_session_key \
-	purple_cipher_http_digest_calculate_session_key
-
-#define gaim_cipher_http_digest_calculate_response \
-	purple_cipher_http_digest_calculate_response
-
-/* from circbuffer.h */
-
-#define GaimCircBuffer  PurpleCircBuffer
-
-#define gaim_circ_buffer_new           purple_circ_buffer_new
-#define gaim_circ_buffer_destroy       purple_circ_buffer_destroy
-#define gaim_circ_buffer_append        purple_circ_buffer_append
-#define gaim_circ_buffer_get_max_read  purple_circ_buffer_get_max_read
-#define gaim_circ_buffer_mark_read     purple_circ_buffer_mark_read
-
-/* from cmds.h */
-
-#define GaimCmdPriority  PurpleCmdPriority
-#define GaimCmdFlag      PurpleCmdFlag
-#define GaimCmdStatus    PurpleCmdStatus
-#define GaimCmdRet       PurpleCmdRet
-
-#define GAIM_CMD_STATUS_OK            PURPLE_CMD_STATUS_OK
-#define GAIM_CMD_STATUS_FAILED        PURPLE_CMD_STATUS_FAILED
-#define GAIM_CMD_STATUS_NOT_FOUND     PURPLE_CMD_STATUS_NOT_FOUND
-#define GAIM_CMD_STATUS_WRONG_ARGS    PURPLE_CMD_STATUS_WRONG_ARGS
-#define GAIM_CMD_STATUS_WRONG_PRPL    PURPLE_CMD_STATUS_WRONG_PRPL
-#define GAIM_CMD_STATUS_WRONG_TYPE    PURPLE_CMD_STATUS_WRONG_TYPE
-
-#define GAIM_CMD_FUNC  PURPLE_CMD_FUNC
-
-#define GAIM_CMD_RET_OK			PURPLE_CMD_RET_OK
-#define GAIM_CMD_RET_FAILED		PURPLE_CMD_RET_FAILED
-#define GAIM_CMD_RET_CONTINUE	PURPLE_CMD_RET_CONTINUE
-
-#define GAIM_CMD_P_VERY_LOW		PURPLE_CMD_P_VERY_LOW
-#define GAIM_CMD_P_LOW			PURPLE_CMD_P_LOW
-#define GAIM_CMD_P_DEFAULT		PURPLE_CMD_P_DEFAULT
-#define GAIM_CMD_P_PRPL			PURPLE_CMD_P_PRPL
-#define GAIM_CMD_P_PLUGIN		PURPLE_CMD_P_PLUGIN
-#define GAIM_CMD_P_ALIAS		PURPLE_CMD_P_ALIAS
-#define GAIM_CMD_P_HIGH			PURPLE_CMD_P_HIGH
-#define GAIM_CMD_P_VERY_HIGH	PURPLE_CMD_P_VERY_HIGH
-
-#define GAIM_CMD_FLAG_IM		PURPLE_CMD_FLAG_IM
-#define GAIM_CMD_FLAG_CHAT		PURPLE_CMD_FLAG_CHAT
-#define GAIM_CMD_FLAG_PRPL_ONLY	PURPLE_CMD_FLAG_PRPL_ONLY
-#define GAIM_CMD_FLAG_ALLOW_WRONG_ARGS	PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS
-
-
-#define GaimCmdFunc  PurpleCmdFunc
-
-#define GaimCmdId  PurpleCmdId
-
-#define gaim_cmd_register    purple_cmd_register
-#define gaim_cmd_unregister  purple_cmd_unregister
-#define gaim_cmd_do_command  purple_cmd_do_command
-#define gaim_cmd_list        purple_cmd_list
-#define gaim_cmd_help        purple_cmd_help
-
-/* from connection.h */
-
-#define GaimConnection  PurpleConnection
-
-#define GAIM_CONNECTION_HTML              PURPLE_CONNECTION_HTML
-#define GAIM_CONNECTION_NO_BGCOLOR        PURPLE_CONNECTION_NO_BGCOLOR
-#define GAIM_CONNECTION_AUTO_RESP         PURPLE_CONNECTION_AUTO_RESP
-#define GAIM_CONNECTION_FORMATTING_WBFO   PURPLE_CONNECTION_FORMATTING_WBFO
-#define GAIM_CONNECTION_NO_NEWLINES       PURPLE_CONNECTION_NO_NEWLINES
-#define GAIM_CONNECTION_NO_FONTSIZE       PURPLE_CONNECTION_NO_FONTSIZE
-#define GAIM_CONNECTION_NO_URLDESC        PURPLE_CONNECTION_NO_URLDESC
-#define GAIM_CONNECTION_NO_IMAGES         PURPLE_CONNECTION_NO_IMAGES
-
-#define GaimConnectionFlags  PurpleConnectionFlags
-
-#define GAIM_DISCONNECTED  PURPLE_DISCONNECTED
-#define GAIM_CONNECTED     PURPLE_CONNECTED
-#define GAIM_CONNECTING    PURPLE_CONNECTING
-
-#define GaimConnectionState  PurpleConnectionState
-
-#define GaimConnectionUiOps  PurpleConnectionUiOps
-
-#define gaim_connection_new      purple_connection_new
-#define gaim_connection_destroy  purple_connection_destroy
-
-#define gaim_connection_set_state         purple_connection_set_state
-#define gaim_connection_set_account       purple_connection_set_account
-#define gaim_connection_set_display_name  purple_connection_set_display_name
-#define gaim_connection_get_state         purple_connection_get_state
-
-#define GAIM_CONNECTION_IS_CONNECTED  PURPLE_CONNECTION_IS_CONNECTED
-
-#define gaim_connection_get_account       purple_connection_get_account
-#define gaim_connection_get_password      purple_connection_get_password
-#define gaim_connection_get_display_name  purple_connection_get_display_name
-
-#define gaim_connection_update_progress  purple_connection_update_progress
-
-#define gaim_connection_notice  purple_connection_notice
-#define gaim_connection_error   purple_connection_error
-
-#define gaim_connections_disconnect_all  purple_connections_disconnect_all
-
-#define gaim_connections_get_all         purple_connections_get_all
-#define gaim_connections_get_connecting  purple_connections_get_connecting
-
-#define GAIM_CONNECTION_IS_VALID  PURPLE_CONNECTION_IS_VALID
-
-#define gaim_connections_set_ui_ops  purple_connections_set_ui_ops
-#define gaim_connections_get_ui_ops  purple_connections_get_ui_ops
-
-#define gaim_connections_init    purple_connections_init
-#define gaim_connections_uninit  purple_connections_uninit
-#define gaim_connections_get_handle  purple_connections_get_handle
-
-
-/* from conversation.h */
-
-#define GaimConversationUiOps  PurpleConversationUiOps
-#define GaimConversation       PurpleConversation
-#define GaimConvIm             PurpleConvIm
-#define GaimConvChat           PurpleConvChat
-#define GaimConvChatBuddy      PurpleConvChatBuddy
-
-#define GAIM_CONV_TYPE_UNKNOWN  PURPLE_CONV_TYPE_UNKNOWN
-#define GAIM_CONV_TYPE_IM       PURPLE_CONV_TYPE_IM
-#define GAIM_CONV_TYPE_CHAT     PURPLE_CONV_TYPE_CHAT
-#define GAIM_CONV_TYPE_MISC     PURPLE_CONV_TYPE_MISC
-#define GAIM_CONV_TYPE_ANY      PURPLE_CONV_TYPE_ANY
-
-#define GaimConversationType  PurpleConversationType
-
-#define GAIM_CONV_UPDATE_ADD       PURPLE_CONV_UPDATE_ADD
-#define GAIM_CONV_UPDATE_REMOVE    PURPLE_CONV_UPDATE_REMOVE
-#define GAIM_CONV_UPDATE_ACCOUNT   PURPLE_CONV_UPDATE_ACCOUNT
-#define GAIM_CONV_UPDATE_TYPING    PURPLE_CONV_UPDATE_TYPING
-#define GAIM_CONV_UPDATE_UNSEEN    PURPLE_CONV_UPDATE_UNSEEN
-#define GAIM_CONV_UPDATE_LOGGING   PURPLE_CONV_UPDATE_LOGGING
-#define GAIM_CONV_UPDATE_TOPIC     PURPLE_CONV_UPDATE_TOPIC
-#define GAIM_CONV_ACCOUNT_ONLINE   PURPLE_CONV_ACCOUNT_ONLINE
-#define GAIM_CONV_ACCOUNT_OFFLINE  PURPLE_CONV_ACCOUNT_OFFLINE
-#define GAIM_CONV_UPDATE_AWAY      PURPLE_CONV_UPDATE_AWAY
-#define GAIM_CONV_UPDATE_ICON      PURPLE_CONV_UPDATE_ICON
-#define GAIM_CONV_UPDATE_TITLE     PURPLE_CONV_UPDATE_TITLE
-#define GAIM_CONV_UPDATE_CHATLEFT  PURPLE_CONV_UPDATE_CHATLEFT
-#define GAIM_CONV_UPDATE_FEATURES  PURPLE_CONV_UPDATE_FEATURES
-
-#define GaimConvUpdateType  PurpleConvUpdateType
-
-#define GAIM_NOT_TYPING  PURPLE_NOT_TYPING
-#define GAIM_TYPING      PURPLE_TYPING
-#define GAIM_TYPED       PURPLE_TYPED
-
-#define GaimTypingState  PurpleTypingState
-
-#define GAIM_MESSAGE_SEND         PURPLE_MESSAGE_SEND
-#define GAIM_MESSAGE_RECV         PURPLE_MESSAGE_RECV
-#define GAIM_MESSAGE_SYSTEM       PURPLE_MESSAGE_SYSTEM
-#define GAIM_MESSAGE_AUTO_RESP    PURPLE_MESSAGE_AUTO_RESP
-#define GAIM_MESSAGE_ACTIVE_ONLY  PURPLE_MESSAGE_ACTIVE_ONLY
-#define GAIM_MESSAGE_NICK         PURPLE_MESSAGE_NICK
-#define GAIM_MESSAGE_NO_LOG       PURPLE_MESSAGE_NO_LOG
-#define GAIM_MESSAGE_WHISPER      PURPLE_MESSAGE_WHISPER
-#define GAIM_MESSAGE_ERROR        PURPLE_MESSAGE_ERROR
-#define GAIM_MESSAGE_DELAYED      PURPLE_MESSAGE_DELAYED
-#define GAIM_MESSAGE_RAW          PURPLE_MESSAGE_RAW
-#define GAIM_MESSAGE_IMAGES       PURPLE_MESSAGE_IMAGES
-
-#define GaimMessageFlags  PurpleMessageFlags
-
-#define GAIM_CBFLAGS_NONE     PURPLE_CBFLAGS_NONE
-#define GAIM_CBFLAGS_VOICE    PURPLE_CBFLAGS_VOICE
-#define GAIM_CBFLAGS_HALFOP   PURPLE_CBFLAGS_HALFOP
-#define GAIM_CBFLAGS_OP       PURPLE_CBFLAGS_OP
-#define GAIM_CBFLAGS_FOUNDER  PURPLE_CBFLAGS_FOUNDER
-#define GAIM_CBFLAGS_TYPING   PURPLE_CBFLAGS_TYPING
-
-#define GaimConvChatBuddyFlags  PurpleConvChatBuddyFlags
-
-#define gaim_conversations_set_ui_ops  purple_conversations_set_ui_ops
-
-#define gaim_conversation_new          purple_conversation_new
-#define gaim_conversation_destroy      purple_conversation_destroy
-#define gaim_conversation_present      purple_conversation_present
-#define gaim_conversation_get_type     purple_conversation_get_type
-#define gaim_conversation_set_ui_ops   purple_conversation_set_ui_ops
-#define gaim_conversation_get_ui_ops   purple_conversation_get_ui_ops
-#define gaim_conversation_set_account  purple_conversation_set_account
-#define gaim_conversation_get_account  purple_conversation_get_account
-#define gaim_conversation_get_gc       purple_conversation_get_gc
-#define gaim_conversation_set_title    purple_conversation_set_title
-#define gaim_conversation_get_title    purple_conversation_get_title
-#define gaim_conversation_autoset_title  purple_conversation_autoset_title
-#define gaim_conversation_set_name       purple_conversation_set_name
-#define gaim_conversation_get_name       purple_conversation_get_name
-#define gaim_conversation_set_logging    purple_conversation_set_logging
-#define gaim_conversation_is_logging     purple_conversation_is_logging
-#define gaim_conversation_close_logs     purple_conversation_close_logs
-#define gaim_conversation_get_im_data    purple_conversation_get_im_data
-
-#define GAIM_CONV_IM    PURPLE_CONV_IM
-
-#define gaim_conversation_get_chat_data  purple_conversation_get_chat_data
-
-#define GAIM_CONV_CHAT  PURPLE_CONV_CHAT
-
-#define gaim_conversation_set_data       purple_conversation_set_data
-#define gaim_conversation_get_data       purple_conversation_get_data
-
-#define gaim_get_conversations  purple_get_conversations
-#define gaim_get_ims            purple_get_ims
-#define gaim_get_chats          purple_get_chats
-
-#define gaim_find_conversation_with_account \
-	purple_find_conversation_with_account
-
-#define gaim_conversation_write         purple_conversation_write
-#define gaim_conversation_set_features  purple_conversation_set_features
-#define gaim_conversation_get_features  purple_conversation_get_features
-#define gaim_conversation_has_focus     purple_conversation_has_focus
-#define gaim_conversation_update        purple_conversation_update
-#define gaim_conversation_foreach       purple_conversation_foreach
-
-#define gaim_conv_im_get_conversation  purple_conv_im_get_conversation
-#define gaim_conv_im_set_icon          purple_conv_im_set_icon
-#define gaim_conv_im_get_icon          purple_conv_im_get_icon
-#define gaim_conv_im_set_typing_state  purple_conv_im_set_typing_state
-#define gaim_conv_im_get_typing_state  purple_conv_im_get_typing_state
-
-#define gaim_conv_im_start_typing_timeout  purple_conv_im_start_typing_timeout
-#define gaim_conv_im_stop_typing_timeout   purple_conv_im_stop_typing_timeout
-#define gaim_conv_im_get_typing_timeout    purple_conv_im_get_typing_timeout
-#define gaim_conv_im_set_type_again        purple_conv_im_set_type_again
-#define gaim_conv_im_get_type_again        purple_conv_im_get_type_again
-
-#define gaim_conv_im_start_send_typed_timeout \
-	purple_conv_im_start_send_typed_timeout
-
-#define gaim_conv_im_stop_send_typed_timeout \
-	purple_conv_im_stop_send_typed_timeout
-
-#define gaim_conv_im_get_send_typed_timeout \
-	purple_conv_im_get_send_typed_timeout
-
-#define gaim_conv_present_error     purple_conv_present_error
-#define gaim_conv_send_confirm      purple_conv_send_confirm
-
-#define gaim_conv_im_update_typing    purple_conv_im_update_typing
-#define gaim_conv_im_write            purple_conv_im_write
-#define gaim_conv_im_send             purple_conv_im_send
-#define gaim_conv_im_send_with_flags  purple_conv_im_send_with_flags
-
-#define gaim_conv_custom_smiley_add    purple_conv_custom_smiley_add
-#define gaim_conv_custom_smiley_write  purple_conv_custom_smiley_write
-#define gaim_conv_custom_smiley_close  purple_conv_custom_smiley_close
-
-#define gaim_conv_chat_get_conversation  purple_conv_chat_get_conversation
-#define gaim_conv_chat_set_users         purple_conv_chat_set_users
-#define gaim_conv_chat_get_users         purple_conv_chat_get_users
-#define gaim_conv_chat_ignore            purple_conv_chat_ignore
-#define gaim_conv_chat_unignore          purple_conv_chat_unignore
-#define gaim_conv_chat_set_ignored       purple_conv_chat_set_ignored
-#define gaim_conv_chat_get_ignored       purple_conv_chat_get_ignored
-#define gaim_conv_chat_get_ignored_user  purple_conv_chat_get_ignored_user
-#define gaim_conv_chat_is_user_ignored   purple_conv_chat_is_user_ignored
-#define gaim_conv_chat_set_topic         purple_conv_chat_set_topic
-#define gaim_conv_chat_get_topic         purple_conv_chat_get_topic
-#define gaim_conv_chat_set_id            purple_conv_chat_set_id
-#define gaim_conv_chat_get_id            purple_conv_chat_get_id
-#define gaim_conv_chat_write             purple_conv_chat_write
-#define gaim_conv_chat_send              purple_conv_chat_send
-#define gaim_conv_chat_send_with_flags   purple_conv_chat_send_with_flags
-#define gaim_conv_chat_add_user          purple_conv_chat_add_user
-#define gaim_conv_chat_add_users         purple_conv_chat_add_users
-#define gaim_conv_chat_rename_user       purple_conv_chat_rename_user
-#define gaim_conv_chat_remove_user       purple_conv_chat_remove_user
-#define gaim_conv_chat_remove_users      purple_conv_chat_remove_users
-#define gaim_conv_chat_find_user         purple_conv_chat_find_user
-#define gaim_conv_chat_user_set_flags    purple_conv_chat_user_set_flags
-#define gaim_conv_chat_user_get_flags    purple_conv_chat_user_get_flags
-#define gaim_conv_chat_clear_users       purple_conv_chat_clear_users
-#define gaim_conv_chat_set_nick          purple_conv_chat_set_nick
-#define gaim_conv_chat_get_nick          purple_conv_chat_get_nick
-#define gaim_conv_chat_left              purple_conv_chat_left
-#define gaim_conv_chat_has_left          purple_conv_chat_has_left
-
-#define gaim_find_chat                   purple_find_chat
-
-#define gaim_conv_chat_cb_new            purple_conv_chat_cb_new
-#define gaim_conv_chat_cb_find           purple_conv_chat_cb_find
-#define gaim_conv_chat_cb_get_name       purple_conv_chat_cb_get_name
-#define gaim_conv_chat_cb_destroy        purple_conv_chat_cb_destroy
-
-#define gaim_conversations_get_handle    purple_conversations_get_handle
-#define gaim_conversations_init          purple_conversations_init
-#define gaim_conversations_uninit        purple_conversations_uninit
-
-/* from core.h */
-
-#define GaimCore  PurpleCore
-
-#define GaimCoreUiOps  PurpleCoreUiOps
-
-#define gaim_core_init  purple_core_init
-#define gaim_core_quit  purple_core_quit
-
-#define gaim_core_quit_cb      purple_core_quit_cb
-#define gaim_core_get_version  purple_core_get_version
-#define gaim_core_get_ui       purple_core_get_ui
-#define gaim_get_core          purple_get_core
-#define gaim_core_set_ui_ops   purple_core_set_ui_ops
-#define gaim_core_get_ui_ops   purple_core_get_ui_ops
-
-/* from debug.h */
-
-#define GAIM_DEBUG_ALL      PURPLE_DEBUG_ALL
-#define GAIM_DEBUG_MISC     PURPLE_DEBUG_MISC
-#define GAIM_DEBUG_INFO     PURPLE_DEBUG_INFO
-#define GAIM_DEBUG_WARNING  PURPLE_DEBUG_WARNING
-#define GAIM_DEBUG_ERROR    PURPLE_DEBUG_ERROR
-#define GAIM_DEBUG_FATAL    PURPLE_DEBUG_FATAL
-
-#define GaimDebugLevel  PurpleDebugLevel
-
-#define GaimDebugUiOps  PurpleDebugUiOps
-
-
-#define gaim_debug          purple_debug
-#define gaim_debug_misc     purple_debug_misc
-#define gaim_debug_info     purple_debug_info
-#define gaim_debug_warning  purple_debug_warning
-#define gaim_debug_error    purple_debug_error
-#define gaim_debug_fatal    purple_debug_fatal
-
-#define gaim_debug_set_enabled  purple_debug_set_enabled
-#define gaim_debug_is_enabled   purple_debug_is_enabled
-
-#define gaim_debug_set_ui_ops  purple_debug_set_ui_ops
-#define gaim_debug_get_ui_ops  purple_debug_get_ui_ops
-
-#define gaim_debug_init  purple_debug_init
-
-/* from desktopitem.h */
-
-#define GAIM_DESKTOP_ITEM_TYPE_NULL          PURPLE_DESKTOP_ITEM_TYPE_NULL
-#define GAIM_DESKTOP_ITEM_TYPE_OTHER         PURPLE_DESKTOP_ITEM_TYPE_OTHER
-#define GAIM_DESKTOP_ITEM_TYPE_APPLICATION   PURPLE_DESKTOP_ITEM_TYPE_APPLICATION
-#define GAIM_DESKTOP_ITEM_TYPE_LINK          PURPLE_DESKTOP_ITEM_TYPE_LINK
-#define GAIM_DESKTOP_ITEM_TYPE_FSDEVICE      PURPLE_DESKTOP_ITEM_TYPE_FSDEVICE
-#define GAIM_DESKTOP_ITEM_TYPE_MIME_TYPE     PURPLE_DESKTOP_ITEM_TYPE_MIME_TYPE
-#define GAIM_DESKTOP_ITEM_TYPE_DIRECTORY     PURPLE_DESKTOP_ITEM_TYPE_DIRECTORY
-#define GAIM_DESKTOP_ITEM_TYPE_SERVICE       PURPLE_DESKTOP_ITEM_TYPE_SERVICE
-#define GAIM_DESKTOP_ITEM_TYPE_SERVICE_TYPE  PURPLE_DESKTOP_ITEM_TYPE_SERVICE_TYPE
-
-#define GaimDesktopItemType  PurpleDesktopItemType
-
-#define GaimDesktopItem  PurpleDesktopItem
-
-#define GAIM_TYPE_DESKTOP_ITEM         PURPLE_TYPE_DESKTOP_ITEM
-#define gaim_desktop_item_get_type     purple_desktop_item_get_type
-
-/* standard */
-/* ugh, i'm just copying these as strings, rather than pidginifying them */
-#define GAIM_DESKTOP_ITEM_ENCODING	"Encoding" /* string */
-#define GAIM_DESKTOP_ITEM_VERSION	"Version"  /* numeric */
-#define GAIM_DESKTOP_ITEM_NAME		"Name" /* localestring */
-#define GAIM_DESKTOP_ITEM_GENERIC_NAME	"GenericName" /* localestring */
-#define GAIM_DESKTOP_ITEM_TYPE		"Type" /* string */
-#define GAIM_DESKTOP_ITEM_FILE_PATTERN "FilePattern" /* regexp(s) */
-#define GAIM_DESKTOP_ITEM_TRY_EXEC	"TryExec" /* string */
-#define GAIM_DESKTOP_ITEM_NO_DISPLAY	"NoDisplay" /* boolean */
-#define GAIM_DESKTOP_ITEM_COMMENT	"Comment" /* localestring */
-#define GAIM_DESKTOP_ITEM_EXEC		"Exec" /* string */
-#define GAIM_DESKTOP_ITEM_ACTIONS	"Actions" /* strings */
-#define GAIM_DESKTOP_ITEM_ICON		"Icon" /* string */
-#define GAIM_DESKTOP_ITEM_MINI_ICON	"MiniIcon" /* string */
-#define GAIM_DESKTOP_ITEM_HIDDEN	"Hidden" /* boolean */
-#define GAIM_DESKTOP_ITEM_PATH		"Path" /* string */
-#define GAIM_DESKTOP_ITEM_TERMINAL	"Terminal" /* boolean */
-#define GAIM_DESKTOP_ITEM_TERMINAL_OPTIONS "TerminalOptions" /* string */
-#define GAIM_DESKTOP_ITEM_SWALLOW_TITLE "SwallowTitle" /* string */
-#define GAIM_DESKTOP_ITEM_SWALLOW_EXEC	"SwallowExec" /* string */
-#define GAIM_DESKTOP_ITEM_MIME_TYPE	"MimeType" /* regexp(s) */
-#define GAIM_DESKTOP_ITEM_PATTERNS	"Patterns" /* regexp(s) */
-#define GAIM_DESKTOP_ITEM_DEFAULT_APP	"DefaultApp" /* string */
-#define GAIM_DESKTOP_ITEM_DEV		"Dev" /* string */
-#define GAIM_DESKTOP_ITEM_FS_TYPE	"FSType" /* string */
-#define GAIM_DESKTOP_ITEM_MOUNT_POINT	"MountPoint" /* string */
-#define GAIM_DESKTOP_ITEM_READ_ONLY	"ReadOnly" /* boolean */
-#define GAIM_DESKTOP_ITEM_UNMOUNT_ICON "UnmountIcon" /* string */
-#define GAIM_DESKTOP_ITEM_SORT_ORDER	"SortOrder" /* strings */
-#define GAIM_DESKTOP_ITEM_URL		"URL" /* string */
-#define GAIM_DESKTOP_ITEM_DOC_PATH	"X-GNOME-DocPath" /* string */
-
-#define gaim_desktop_item_new_from_file   purple_desktop_item_new_from_file
-#define gaim_desktop_item_get_entry_type  purple_desktop_item_get_entry_type
-#define gaim_desktop_item_get_string      purple_desktop_item_get_string
-#define gaim_desktop_item_copy            purple_desktop_item_copy
-#define gaim_desktop_item_unref           purple_desktop_item_unref
-
-/* from dnsquery.h */
-
-#define GaimDnsQueryData  PurpleDnsQueryData
-#define GaimDnsQueryConnectFunction  PurpleDnsQueryConnectFunction
-
-#define gaim_dnsquery_a        		purple_dnsquery_a
-#define gaim_dnsquery_destroy  		purple_dnsquery_destroy
-#define gaim_dnsquery_init     		purple_dnsquery_init
-#define gaim_dnsquery_uninit   		purple_dnsquery_uninit
-#define gaim_dnsquery_set_ui_ops	purple_dnsquery_set_ui_ops
-#define gaim_dnsquery_get_host 		purple_dnsquery_get_host
-#define gaim_dnsquery_get_port 		purple_dnsquery_get_port
-
-/* from dnssrv.h */
-
-#define GaimSrvResponse   PurpleSrvResponse
-#define GaimSrvQueryData  PurpleSrvTxtQueryData
-#define GaimSrvCallback   PurpleSrvCallback
-
-#define gaim_srv_resolve  purple_srv_resolve
-#define gaim_srv_cancel   purple_srv_cancel
-
-/* from eventloop.h */
-
-#define GAIM_INPUT_READ   PURPLE_INPUT_READ
-#define GAIM_INPUT_WRITE  PURPLE_INPUT_WRITE
-
-#define GaimInputCondition  PurpleInputCondition
-#define GaimInputFunction   PurpleInputFunction
-#define GaimEventLoopUiOps  PurpleEventLoopUiOps
-
-#define gaim_timeout_add     purple_timeout_add
-#define gaim_timeout_remove  purple_timeout_remove
-#define gaim_input_add       purple_input_add
-#define gaim_input_remove    purple_input_remove
-
-#define gaim_eventloop_set_ui_ops  purple_eventloop_set_ui_ops
-#define gaim_eventloop_get_ui_ops  purple_eventloop_get_ui_ops
-
-/* from ft.h */
-
-#define GaimXfer  PurpleXfer
-
-#define GAIM_XFER_UNKNOWN  PURPLE_XFER_UNKNOWN
-#define GAIM_XFER_SEND     PURPLE_XFER_SEND
-#define GAIM_XFER_RECEIVE  PURPLE_XFER_RECEIVE
-
-#define GaimXferType  PurpleXferType
-
-#define GAIM_XFER_STATUS_UNKNOWN        PURPLE_XFER_STATUS_UNKNOWN
-#define GAIM_XFER_STATUS_NOT_STARTED    PURPLE_XFER_STATUS_NOT_STARTED
-#define GAIM_XFER_STATUS_ACCEPTED       PURPLE_XFER_STATUS_ACCEPTED
-#define GAIM_XFER_STATUS_STARTED        PURPLE_XFER_STATUS_STARTED
-#define GAIM_XFER_STATUS_DONE           PURPLE_XFER_STATUS_DONE
-#define GAIM_XFER_STATUS_CANCEL_LOCAL   PURPLE_XFER_STATUS_CANCEL_LOCAL
-#define GAIM_XFER_STATUS_CANCEL_REMOTE  PURPLE_XFER_STATUS_CANCEL_REMOTE
-
-#define GaimXferStatusType  PurpleXferStatusType
-
-#define GaimXferUiOps  PurpleXferUiOps
-
-#define gaim_xfer_new                  purple_xfer_new
-#define gaim_xfer_ref                  purple_xfer_ref
-#define gaim_xfer_unref                purple_xfer_unref
-#define gaim_xfer_request              purple_xfer_request
-#define gaim_xfer_request_accepted     purple_xfer_request_accepted
-#define gaim_xfer_request_denied       purple_xfer_request_denied
-#define gaim_xfer_get_type             purple_xfer_get_type
-#define gaim_xfer_get_account          purple_xfer_get_account
-#define gaim_xfer_get_status           purple_xfer_get_status
-#define gaim_xfer_is_canceled          purple_xfer_is_canceled
-#define gaim_xfer_is_completed         purple_xfer_is_completed
-#define gaim_xfer_get_filename         purple_xfer_get_filename
-#define gaim_xfer_get_local_filename   purple_xfer_get_local_filename
-#define gaim_xfer_get_bytes_sent       purple_xfer_get_bytes_sent
-#define gaim_xfer_get_bytes_remaining  purple_xfer_get_bytes_remaining
-#define gaim_xfer_get_size             purple_xfer_get_size
-#define gaim_xfer_get_progress         purple_xfer_get_progress
-#define gaim_xfer_get_local_port       purple_xfer_get_local_port
-#define gaim_xfer_get_remote_ip        purple_xfer_get_remote_ip
-#define gaim_xfer_get_remote_port      purple_xfer_get_remote_port
-#define gaim_xfer_set_completed        purple_xfer_set_completed
-#define gaim_xfer_set_message          purple_xfer_set_message
-#define gaim_xfer_set_filename         purple_xfer_set_filename
-#define gaim_xfer_set_local_filename   purple_xfer_set_local_filename
-#define gaim_xfer_set_size             purple_xfer_set_size
-#define gaim_xfer_set_bytes_sent       purple_xfer_set_bytes_sent
-#define gaim_xfer_get_ui_ops           purple_xfer_get_ui_ops
-#define gaim_xfer_set_read_fnc         purple_xfer_set_read_fnc
-#define gaim_xfer_set_write_fnc        purple_xfer_set_write_fnc
-#define gaim_xfer_set_ack_fnc          purple_xfer_set_ack_fnc
-#define gaim_xfer_set_request_denied_fnc  purple_xfer_set_request_denied_fnc
-#define gaim_xfer_set_init_fnc         purple_xfer_set_init_fnc
-#define gaim_xfer_set_start_fnc        purple_xfer_set_start_fnc
-#define gaim_xfer_set_end_fnc          purple_xfer_set_end_fnc
-#define gaim_xfer_set_cancel_send_fnc  purple_xfer_set_cancel_send_fnc
-#define gaim_xfer_set_cancel_recv_fnc  purple_xfer_set_cancel_recv_fnc
-
-#define gaim_xfer_read                purple_xfer_read
-#define gaim_xfer_write               purple_xfer_write
-#define gaim_xfer_start               purple_xfer_start
-#define gaim_xfer_end                 purple_xfer_end
-#define gaim_xfer_add                 purple_xfer_add
-#define gaim_xfer_cancel_local        purple_xfer_cancel_local
-#define gaim_xfer_cancel_remote       purple_xfer_cancel_remote
-#define gaim_xfer_error               purple_xfer_error
-#define gaim_xfer_update_progress     purple_xfer_update_progress
-#define gaim_xfer_conversation_write  purple_xfer_conversation_write
-
-#define gaim_xfers_get_handle  purple_xfers_get_handle
-#define gaim_xfers_init        purple_xfers_init
-#define gaim_xfers_uninit      purple_xfers_uninit
-#define gaim_xfers_set_ui_ops  purple_xfers_set_ui_ops
-#define gaim_xfers_get_ui_ops  purple_xfers_get_ui_ops
-
-/* from gaim-client.h */
-
-#define gaim_init  purple_init
-
-/* from idle.h */
-
-#define GaimIdleUiOps  PurpleIdleUiOps
-
-#define gaim_idle_touch       purple_idle_touch
-#define gaim_idle_set         purple_idle_set
-#define gaim_idle_set_ui_ops  purple_idle_set_ui_ops
-#define gaim_idle_get_ui_ops  purple_idle_get_ui_ops
-#define gaim_idle_init        purple_idle_init
-#define gaim_idle_uninit      purple_idle_uninit
-
-/* from imgstore.h */
-
-#define GaimStoredImage  PurpleStoredImage
-
-#define gaim_imgstore_add(data, size, filename) \
-        purple_imgstore_add_with_id(g_memdup(data, size), size, filename)
-#define gaim_imgstore_get           purple_imgstore_find_by_id
-#define gaim_imgstore_get_data      purple_imgstore_get_data
-#define gaim_imgstore_get_size      purple_imgstore_get_size
-#define gaim_imgstore_get_filename  purple_imgstore_get_filename
-#define gaim_imgstore_ref           purple_imgstore_ref_by_id
-#define gaim_imgstore_unref         purple_imgstore_unref_by_id
-
-
-/* from log.h */
-
-#define GaimLog                  PurpleLog
-#define GaimLogLogger            PurpleLogLogger
-#define GaimLogCommonLoggerData  PurpleLogCommonLoggerData
-#define GaimLogSet               PurpleLogSet
-
-#define GAIM_LOG_IM      PURPLE_LOG_IM
-#define GAIM_LOG_CHAT    PURPLE_LOG_CHAT
-#define GAIM_LOG_SYSTEM  PURPLE_LOG_SYSTEM
-
-#define GaimLogType  PurpleLogType
-
-#define GAIM_LOG_READ_NO_NEWLINE  PURPLE_LOG_READ_NO_NEWLINE
-
-#define GaimLogReadFlags  PurpleLogReadFlags
-
-#define GaimLogSetCallback  PurpleLogSetCallback
-
-#define gaim_log_new    purple_log_new
-#define gaim_log_free   purple_log_free
-#define gaim_log_write  purple_log_write
-#define gaim_log_read   purple_log_read
-
-#define gaim_log_get_logs         purple_log_get_logs
-#define gaim_log_get_log_sets     purple_log_get_log_sets
-#define gaim_log_get_system_logs  purple_log_get_system_logs
-#define gaim_log_get_size         purple_log_get_size
-#define gaim_log_get_total_size   purple_log_get_total_size
-#define gaim_log_get_log_dir      purple_log_get_log_dir
-#define gaim_log_compare          purple_log_compare
-#define gaim_log_set_compare      purple_log_set_compare
-#define gaim_log_set_free         purple_log_set_free
-
-#define gaim_log_common_writer       purple_log_common_writer
-#define gaim_log_common_lister       purple_log_common_lister
-#define gaim_log_common_total_sizer  purple_log_common_total_sizer
-#define gaim_log_common_sizer        purple_log_common_sizer
-
-#define gaim_log_logger_new     purple_log_logger_new
-#define gaim_log_logger_free    purple_log_logger_free
-#define gaim_log_logger_add     purple_log_logger_add
-#define gaim_log_logger_remove  purple_log_logger_remove
-#define gaim_log_logger_set     purple_log_logger_set
-#define gaim_log_logger_get     purple_log_logger_get
-
-#define gaim_log_logger_get_options  purple_log_logger_get_options
-
-#define gaim_log_init        purple_log_init
-#define gaim_log_get_handle  purple_log_get_handle
-#define gaim_log_uninit      purple_log_uninit
-
-/* from mime.h */
-
-#define GaimMimeDocument  PurpleMimeDocument
-#define GaimMimePart      PurpleMimePart
-
-#define gaim_mime_document_new         purple_mime_document_new
-#define gaim_mime_document_free        purple_mime_document_free
-#define gaim_mime_document_parse       purple_mime_document_parse
-#define gaim_mime_document_parsen      purple_mime_document_parsen
-#define gaim_mime_document_write       purple_mime_document_write
-#define gaim_mime_document_get_fields  purple_mime_document_get_fields
-#define gaim_mime_document_get_field   purple_mime_document_get_field
-#define gaim_mime_document_set_field   purple_mime_document_set_field
-#define gaim_mime_document_get_parts   purple_mime_document_get_parts
-
-#define gaim_mime_part_new                purple_mime_part_new
-#define gaim_mime_part_get_fields         purple_mime_part_get_fields
-#define gaim_mime_part_get_field          purple_mime_part_get_field
-#define gaim_mime_part_get_field_decoded  purple_mime_part_get_field_decoded
-#define gaim_mime_part_set_field          purple_mime_part_set_field
-#define gaim_mime_part_get_data           purple_mime_part_get_data
-#define gaim_mime_part_get_data_decoded   purple_mime_part_get_data_decoded
-#define gaim_mime_part_get_length         purple_mime_part_get_length
-#define gaim_mime_part_set_data           purple_mime_part_set_data
-
-
-/* from network.h */
-
-#define GaimNetworkListenData  PurpleNetworkListenData
-
-#define GaimNetworkListenCallback  PurpleNetworkListenCallback
-
-#define gaim_network_ip_atoi              purple_network_ip_atoi
-#define gaim_network_set_public_ip        purple_network_set_public_ip
-#define gaim_network_get_public_ip        purple_network_get_public_ip
-#define gaim_network_get_local_system_ip  purple_network_get_local_system_ip
-#define gaim_network_get_my_ip            purple_network_get_my_ip
-
-#define gaim_network_listen            purple_network_listen
-#define gaim_network_listen_range      purple_network_listen_range
-#define gaim_network_listen_cancel     purple_network_listen_cancel
-#define gaim_network_get_port_from_fd  purple_network_get_port_from_fd
-
-#define gaim_network_is_available  purple_network_is_available
-
-#define gaim_network_init    purple_network_init
-#define gaim_network_uninit  purple_network_uninit
-
-/* from notify.h */
-
-
-#define GaimNotifyUserInfoEntry  PurpleNotifyUserInfoEntry
-#define GaimNotifyUserInfo       PurpleNotifyUserInfo
-
-#define GaimNotifyCloseCallback  PurpleNotifyCloseCallback
-
-#define GAIM_NOTIFY_MESSAGE        PURPLE_NOTIFY_MESSAGE
-#define GAIM_NOTIFY_EMAIL          PURPLE_NOTIFY_EMAIL
-#define GAIM_NOTIFY_EMAILS         PURPLE_NOTIFY_EMAILS
-#define GAIM_NOTIFY_FORMATTED      PURPLE_NOTIFY_FORMATTED
-#define GAIM_NOTIFY_SEARCHRESULTS  PURPLE_NOTIFY_SEARCHRESULTS
-#define GAIM_NOTIFY_USERINFO       PURPLE_NOTIFY_USERINFO
-#define GAIM_NOTIFY_URI            PURPLE_NOTIFY_URI
-
-#define GaimNotifyType  PurpleNotifyType
-
-#define GAIM_NOTIFY_MSG_ERROR    PURPLE_NOTIFY_MSG_ERROR
-#define GAIM_NOTIFY_MSG_WARNING  PURPLE_NOTIFY_MSG_WARNING
-#define GAIM_NOTIFY_MSG_INFO     PURPLE_NOTIFY_MSG_INFO
-
-#define GaimNotifyMsgType  PurpleNotifyMsgType
-
-#define GAIM_NOTIFY_BUTTON_LABELED   PURPLE_NOTIFY_BUTTON_LABELED
-#define GAIM_NOTIFY_BUTTON_CONTINUE  PURPLE_NOTIFY_BUTTON_CONTINUE
-#define GAIM_NOTIFY_BUTTON_ADD       PURPLE_NOTIFY_BUTTON_ADD
-#define GAIM_NOTIFY_BUTTON_INFO      PURPLE_NOTIFY_BUTTON_INFO
-#define GAIM_NOTIFY_BUTTON_IM        PURPLE_NOTIFY_BUTTON_IM
-#define GAIM_NOTIFY_BUTTON_JOIN      PURPLE_NOTIFY_BUTTON_JOIN
-#define GAIM_NOTIFY_BUTTON_INVITE    PURPLE_NOTIFY_BUTTON_INVITE
-
-#define GaimNotifySearchButtonType  PurpleNotifySearchButtonType
-
-#define GaimNotifySearchResults  PurpleNotifySearchResults
-
-#define GAIM_NOTIFY_USER_INFO_ENTRY_PAIR            PURPLE_NOTIFY_USER_INFO_ENTRY_PAIR
-#define GAIM_NOTIFY_USER_INFO_ENTRY_SECTION_BREAK   PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_BREAK
-#define GAIM_NOTIFY_USER_INFO_ENTRY_SECTION_HEADER  PURPLE_NOTIFY_USER_INFO_ENTRY_SECTION_HEADER
-
-#define GaimNotifyUserInfoEntryType  PurpleNotifyUserInfoEntryType
-
-#define GaimNotifySearchColumn           PurpleNotifySearchColumn
-#define GaimNotifySearchResultsCallback  PurpleNotifySearchResultsCallback
-#define GaimNotifySearchButton           PurpleNotifySearchButton
-
-#define GaimNotifyUiOps  PurpleNotifyUiOps
-
-#define gaim_notify_searchresults                     purple_notify_searchresults
-#define gaim_notify_searchresults_free                purple_notify_searchresults_free
-#define gaim_notify_searchresults_new_rows            purple_notify_searchresults_new_rows
-#define gaim_notify_searchresults_button_add          purple_notify_searchresults_button_add
-#define gaim_notify_searchresults_button_add_labeled  purple_notify_searchresults_button_add_labeled
-#define gaim_notify_searchresults_new                 purple_notify_searchresults_new
-#define gaim_notify_searchresults_column_new          purple_notify_searchresults_column_new
-#define gaim_notify_searchresults_column_add          purple_notify_searchresults_column_add
-#define gaim_notify_searchresults_row_add             purple_notify_searchresults_row_add
-#define gaim_notify_searchresults_get_rows_count      purple_notify_searchresults_get_rows_count
-#define gaim_notify_searchresults_get_columns_count   purple_notify_searchresults_get_columns_count
-#define gaim_notify_searchresults_row_get             purple_notify_searchresults_row_get
-#define gaim_notify_searchresults_column_get_title    purple_notify_searchresults_column_get_title
-
-#define gaim_notify_message    purple_notify_message
-#define gaim_notify_email      purple_notify_email
-#define gaim_notify_emails     purple_notify_emails
-#define gaim_notify_formatted  purple_notify_formatted
-#define gaim_notify_userinfo   purple_notify_userinfo
-
-#define gaim_notify_user_info_new                    purple_notify_user_info_new
-#define gaim_notify_user_info_destroy                purple_notify_user_info_destroy
-#define gaim_notify_user_info_get_entries            purple_notify_user_info_get_entries
-#define gaim_notify_user_info_get_text_with_newline  purple_notify_user_info_get_text_with_newline
-#define gaim_notify_user_info_add_pair               purple_notify_user_info_add_pair
-#define gaim_notify_user_info_prepend_pair           purple_notify_user_info_prepend_pair
-#define gaim_notify_user_info_remove_entry           purple_notify_user_info_remove_entry
-#define gaim_notify_user_info_entry_new              purple_notify_user_info_entry_new
-#define gaim_notify_user_info_add_section_break      purple_notify_user_info_add_section_break
-#define gaim_notify_user_info_add_section_header     purple_notify_user_info_add_section_header
-#define gaim_notify_user_info_remove_last_item       purple_notify_user_info_remove_last_item
-#define gaim_notify_user_info_entry_get_label        purple_notify_user_info_entry_get_label
-#define gaim_notify_user_info_entry_set_label        purple_notify_user_info_entry_set_label
-#define gaim_notify_user_info_entry_get_value        purple_notify_user_info_entry_get_value
-#define gaim_notify_user_info_entry_set_value        purple_notify_user_info_entry_set_value
-#define gaim_notify_user_info_entry_get_type         purple_notify_user_info_entry_get_type
-#define gaim_notify_user_info_entry_set_type         purple_notify_user_info_entry_set_type
-
-#define gaim_notify_uri                purple_notify_uri
-#define gaim_notify_close              purple_notify_close
-#define gaim_notify_close_with_handle  purple_notify_close_with_handle
-
-#define gaim_notify_info     purple_notify_info
-#define gaim_notify_warning  purple_notify_warning
-#define gaim_notify_error    purple_notify_error
-
-#define gaim_notify_set_ui_ops  purple_notify_set_ui_ops
-#define gaim_notify_get_ui_ops  purple_notify_get_ui_ops
-
-#define gaim_notify_get_handle  purple_notify_get_handle
-
-#define gaim_notify_init    purple_notify_init
-#define gaim_notify_uninit  purple_notify_uninit
-
-/* from ntlm.h */
-
-#define gaim_ntlm_gen_type1    purple_ntlm_gen_type1
-#define gaim_ntlm_parse_type2  purple_ntlm_parse_type2
-#define gaim_ntlm_gen_type3    purple_ntlm_gen_type3
-
-/* from plugin.h */
-
-#ifdef GAIM_PLUGINS
-#ifndef PURPLE_PLUGINS
-#define PURPLE_PLUGINS
-#endif
-#endif
-
-#define GaimPlugin            PurplePlugin
-#define GaimPluginInfo        PurplePluginInfo
-#define GaimPluginUiInfo      PurplePluginUiInfo
-#define GaimPluginLoaderInfo  PurplePluginLoaderInfo
-#define GaimPluginAction      PurplePluginAction
-#define GaimPluginPriority    PurplePluginPriority
-
-#define GAIM_PLUGIN_UNKNOWN   PURPLE_PLUGIN_UNKNOWN
-#define GAIM_PLUGIN_STANDARD  PURPLE_PLUGIN_STANDARD
-#define GAIM_PLUGIN_LOADER    PURPLE_PLUGIN_LOADER
-#define GAIM_PLUGIN_PROTOCOL  PURPLE_PLUGIN_PROTOCOL
-
-#define GaimPluginType        PurplePluginType
-
-#define GAIM_PRIORITY_DEFAULT  PURPLE_PRIORITY_DEFAULT
-#define GAIM_PRIORITY_HIGHEST  PURPLE_PRIORITY_HIGHEST
-#define GAIM_PRIORITY_LOWEST   PURPLE_PRIORITY_LOWEST
-
-#define GAIM_PLUGIN_FLAG_INVISIBLE  PURPLE_PLUGIN_FLAG_INVISIBLE
-
-#define GAIM_PLUGIN_MAGIC  PURPLE_PLUGIN_MAGIC
-
-#define GAIM_PLUGIN_LOADER_INFO     PURPLE_PLUGIN_LOADER_INFO
-#define GAIM_PLUGIN_HAS_PREF_FRAME  PURPLE_PLUGIN_HAS_PREF_FRAME
-#define GAIM_PLUGIN_UI_INFO         PURPLE_PLUGIN_UI_INFO
-
-#define GAIM_PLUGIN_HAS_ACTIONS  PURPLE_PLUGIN_HAS_ACTIONS
-#define GAIM_PLUGIN_ACTIONS      PURPLE_PLUGIN_ACTIONS
-
-#define GAIM_INIT_PLUGIN  PURPLE_INIT_PLUGIN
-
-#define gaim_plugin_new              purple_plugin_new
-#define gaim_plugin_probe            purple_plugin_probe
-#define gaim_plugin_register         purple_plugin_register
-#define gaim_plugin_load             purple_plugin_load
-#define gaim_plugin_unload           purple_plugin_unload
-#define gaim_plugin_reload           purple_plugin_reload
-#define gaim_plugin_destroy          purple_plugin_destroy
-#define gaim_plugin_is_loaded        purple_plugin_is_loaded
-#define gaim_plugin_is_unloadable    purple_plugin_is_unloadable
-#define gaim_plugin_get_id           purple_plugin_get_id
-#define gaim_plugin_get_name         purple_plugin_get_name
-#define gaim_plugin_get_version      purple_plugin_get_version
-#define gaim_plugin_get_summary      purple_plugin_get_summary
-#define gaim_plugin_get_description  purple_plugin_get_description
-#define gaim_plugin_get_author       purple_plugin_get_author
-#define gaim_plugin_get_homepage     purple_plugin_get_homepage
-
-#define gaim_plugin_ipc_register        purple_plugin_ipc_register
-#define gaim_plugin_ipc_unregister      purple_plugin_ipc_unregister
-#define gaim_plugin_ipc_unregister_all  purple_plugin_ipc_unregister_all
-#define gaim_plugin_ipc_get_params      purple_plugin_ipc_get_params
-#define gaim_plugin_ipc_call            purple_plugin_ipc_call
-
-#define gaim_plugins_add_search_path  purple_plugins_add_search_path
-#define gaim_plugins_unload_all       purple_plugins_unload_all
-#define gaim_plugins_destroy_all      purple_plugins_destroy_all
-#define gaim_plugins_save_loaded      purple_plugins_save_loaded
-#define gaim_plugins_load_saved       purple_plugins_load_saved
-#define gaim_plugins_probe            purple_plugins_probe
-#define gaim_plugins_enabled          purple_plugins_enabled
-
-#define gaim_plugins_register_probe_notify_cb     purple_plugins_register_probe_notify_cb
-#define gaim_plugins_unregister_probe_notify_cb   purple_plugins_unregister_probe_notify_cb
-#define gaim_plugins_register_load_notify_cb      purple_plugins_register_load_notify_cb
-#define gaim_plugins_unregister_load_notify_cb    purple_plugins_unregister_load_notify_cb
-#define gaim_plugins_register_unload_notify_cb    purple_plugins_register_unload_notify_cb
-#define gaim_plugins_unregister_unload_notify_cb  purple_plugins_unregister_unload_notify_cb
-
-#define gaim_plugins_find_with_name      purple_plugins_find_with_name
-#define gaim_plugins_find_with_filename  purple_plugins_find_with_filename
-#define gaim_plugins_find_with_basename  purple_plugins_find_with_basename
-#define gaim_plugins_find_with_id        purple_plugins_find_with_id
-
-#define gaim_plugins_get_loaded     purple_plugins_get_loaded
-#define gaim_plugins_get_protocols  purple_plugins_get_protocols
-#define gaim_plugins_get_all        purple_plugins_get_all
-
-#define gaim_plugins_get_handle  purple_plugins_get_handle
-#define gaim_plugins_init        purple_plugins_init
-#define gaim_plugins_uninit      purple_plugins_uninit
-
-#define gaim_plugin_action_new   purple_plugin_action_new
-#define gaim_plugin_action_free  purple_plugin_action_free
-
-/* pluginpref.h */
-
-#define GaimPluginPrefFrame  PurplePluginPrefFrame
-#define GaimPluginPref       PurplePluginPref
-
-#define GAIM_STRING_FORMAT_TYPE_NONE       PURPLE_STRING_FORMAT_TYPE_NONE
-#define GAIM_STRING_FORMAT_TYPE_MULTILINE  PURPLE_STRING_FORMAT_TYPE_MULTILINE
-#define GAIM_STRING_FORMAT_TYPE_HTML       PURPLE_STRING_FORMAT_TYPE_HTML
-
-#define GaimStringFormatType  PurpleStringFormatType
-
-#define GAIM_PLUGIN_PREF_NONE           PURPLE_PLUGIN_PREF_NONE
-#define GAIM_PLUGIN_PREF_CHOICE         PURPLE_PLUGIN_PREF_CHOICE
-#define GAIM_PLUGIN_PREF_INFO           PURPLE_PLUGIN_PREF_INFO
-#define GAIM_PLUGIN_PREF_STRING_FORMAT  PURPLE_PLUGIN_PREF_STRING_FORMAT
-
-#define GaimPluginPrefType  PurplePluginPrefType
-
-#define gaim_plugin_pref_frame_new        purple_plugin_pref_frame_new
-#define gaim_plugin_pref_frame_destroy    purple_plugin_pref_frame_destroy
-#define gaim_plugin_pref_frame_add        purple_plugin_pref_frame_add
-#define gaim_plugin_pref_frame_get_prefs  purple_plugin_pref_frame_get_prefs
-
-#define gaim_plugin_pref_new                      purple_plugin_pref_new
-#define gaim_plugin_pref_new_with_name            purple_plugin_pref_new_with_name
-#define gaim_plugin_pref_new_with_label           purple_plugin_pref_new_with_label
-#define gaim_plugin_pref_new_with_name_and_label  purple_plugin_pref_new_with_name_and_label
-#define gaim_plugin_pref_destroy                  purple_plugin_pref_destroy
-#define gaim_plugin_pref_set_name                 purple_plugin_pref_set_name
-#define gaim_plugin_pref_get_name                 purple_plugin_pref_get_name
-#define gaim_plugin_pref_set_label                purple_plugin_pref_set_label
-#define gaim_plugin_pref_get_label                purple_plugin_pref_get_label
-#define gaim_plugin_pref_set_bounds               purple_plugin_pref_set_bounds
-#define gaim_plugin_pref_get_bounds               purple_plugin_pref_get_bounds
-#define gaim_plugin_pref_set_type                 purple_plugin_pref_set_type
-#define gaim_plugin_pref_get_type                 purple_plugin_pref_get_type
-#define gaim_plugin_pref_add_choice               purple_plugin_pref_add_choice
-#define gaim_plugin_pref_get_choices              purple_plugin_pref_get_choices
-#define gaim_plugin_pref_set_max_length           purple_plugin_pref_set_max_length
-#define gaim_plugin_pref_get_max_length           purple_plugin_pref_get_max_length
-#define gaim_plugin_pref_set_masked               purple_plugin_pref_set_masked
-#define gaim_plugin_pref_get_masked               purple_plugin_pref_get_masked
-#define gaim_plugin_pref_set_format_type          purple_plugin_pref_set_format_type
-#define gaim_plugin_pref_get_format_type          purple_plugin_pref_get_format_type
-
-/* from pounce.h */
-
-#define GaimPounce  PurplePounce
-
-#define GAIM_POUNCE_NONE              PURPLE_POUNCE_NONE
-#define GAIM_POUNCE_SIGNON            PURPLE_POUNCE_SIGNON
-#define GAIM_POUNCE_SIGNOFF           PURPLE_POUNCE_SIGNOFF
-#define GAIM_POUNCE_AWAY              PURPLE_POUNCE_AWAY
-#define GAIM_POUNCE_AWAY_RETURN       PURPLE_POUNCE_AWAY_RETURN
-#define GAIM_POUNCE_IDLE              PURPLE_POUNCE_IDLE
-#define GAIM_POUNCE_IDLE_RETURN       PURPLE_POUNCE_IDLE_RETURN
-#define GAIM_POUNCE_TYPING            PURPLE_POUNCE_TYPING
-#define GAIM_POUNCE_TYPED             PURPLE_POUNCE_TYPED
-#define GAIM_POUNCE_TYPING_STOPPED    PURPLE_POUNCE_TYPING_STOPPED
-#define GAIM_POUNCE_MESSAGE_RECEIVED  PURPLE_POUNCE_MESSAGE_RECEIVED
-#define GaimPounceEvent  PurplePounceEvent
-
-#define GAIM_POUNCE_OPTION_NONE  PURPLE_POUNCE_OPTION_NONE
-#define GAIM_POUNCE_OPTION_AWAY  PURPLE_POUNCE_OPTION_AWAY
-#define GaimPounceOption  PurplePounceOption
-
-#define GaimPounceCb  PurplePounceCb
-
-#define gaim_pounce_new                     purple_pounce_new
-#define gaim_pounce_destroy                 purple_pounce_destroy
-#define gaim_pounce_destroy_all_by_account  purple_pounce_destroy_all_by_account
-#define gaim_pounce_set_events              purple_pounce_set_events
-#define gaim_pounce_set_options             purple_pounce_set_options
-#define gaim_pounce_set_pouncer             purple_pounce_set_pouncer
-#define gaim_pounce_set_pouncee             purple_pounce_set_pouncee
-#define gaim_pounce_set_save                purple_pounce_set_save
-#define gaim_pounce_action_register         purple_pounce_action_register
-#define gaim_pounce_action_set_enabled      purple_pounce_action_set_enabled
-#define gaim_pounce_action_set_attribute    purple_pounce_action_set_attribute
-#define gaim_pounce_set_data                purple_pounce_set_data
-#define gaim_pounce_get_events              purple_pounce_get_events
-#define gaim_pounce_get_options             purple_pounce_get_options
-#define gaim_pounce_get_pouncer             purple_pounce_get_pouncer
-#define gaim_pounce_get_pouncee             purple_pounce_get_pouncee
-#define gaim_pounce_get_save                purple_pounce_get_save
-#define gaim_pounce_action_is_enabled       purple_pounce_action_is_enabled
-#define gaim_pounce_action_get_attribute    purple_pounce_action_get_attribute
-#define gaim_pounce_get_data                purple_pounce_get_data
-#define gaim_pounce_execute                 purple_pounce_execute
-
-#define gaim_find_pounce                 purple_find_pounce
-#define gaim_pounces_load                purple_pounces_load
-#define gaim_pounces_register_handler    purple_pounces_register_handler
-#define gaim_pounces_unregister_handler  purple_pounces_unregister_handler
-#define gaim_pounces_get_all             purple_pounces_get_all
-#define gaim_pounces_get_handle          purple_pounces_get_handle
-#define gaim_pounces_init                purple_pounces_init
-#define gaim_pounces_uninit              purple_pounces_uninit
-
-/* from prefs.h */
-
-
-#define GAIM_PREF_NONE         PURPLE_PREF_NONE
-#define GAIM_PREF_BOOLEAN      PURPLE_PREF_BOOLEAN
-#define GAIM_PREF_INT          PURPLE_PREF_INT
-#define GAIM_PREF_STRING       PURPLE_PREF_STRING
-#define GAIM_PREF_STRING_LIST  PURPLE_PREF_STRING_LIST
-#define GAIM_PREF_PATH         PURPLE_PREF_PATH
-#define GAIM_PREF_PATH_LIST    PURPLE_PREF_PATH_LIST
-#define GaimPrefType  PurplePrefType
-
-#define GaimPrefCallback  PurplePrefCallback
-
-#define gaim_prefs_get_handle             purple_prefs_get_handle
-#define gaim_prefs_init                   purple_prefs_init
-#define gaim_prefs_uninit                 purple_prefs_uninit
-#define gaim_prefs_add_none               purple_prefs_add_none
-#define gaim_prefs_add_bool               purple_prefs_add_bool
-#define gaim_prefs_add_int                purple_prefs_add_int
-#define gaim_prefs_add_string             purple_prefs_add_string
-#define gaim_prefs_add_string_list        purple_prefs_add_string_list
-#define gaim_prefs_add_path               purple_prefs_add_path
-#define gaim_prefs_add_path_list          purple_prefs_add_path_list
-#define gaim_prefs_remove                 purple_prefs_remove
-#define gaim_prefs_rename                 purple_prefs_rename
-#define gaim_prefs_rename_boolean_toggle  purple_prefs_rename_boolean_toggle
-#define gaim_prefs_destroy                purple_prefs_destroy
-#define gaim_prefs_set_generic            purple_prefs_set_generic
-#define gaim_prefs_set_bool               purple_prefs_set_bool
-#define gaim_prefs_set_int                purple_prefs_set_int
-#define gaim_prefs_set_string             purple_prefs_set_string
-#define gaim_prefs_set_string_list        purple_prefs_set_string_list
-#define gaim_prefs_set_path               purple_prefs_set_path
-#define gaim_prefs_set_path_list          purple_prefs_set_path_list
-#define gaim_prefs_exists                 purple_prefs_exists
-#define gaim_prefs_get_type               purple_prefs_get_type
-#define gaim_prefs_get_bool               purple_prefs_get_bool
-#define gaim_prefs_get_int                purple_prefs_get_int
-#define gaim_prefs_get_string             purple_prefs_get_string
-#define gaim_prefs_get_string_list        purple_prefs_get_string_list
-#define gaim_prefs_get_path               purple_prefs_get_path
-#define gaim_prefs_get_path_list          purple_prefs_get_path_list
-#define gaim_prefs_connect_callback       purple_prefs_connect_callback
-#define gaim_prefs_disconnect_callback    purple_prefs_disconnect_callback
-#define gaim_prefs_disconnect_by_handle   purple_prefs_disconnect_by_handle
-#define gaim_prefs_trigger_callback       purple_prefs_trigger_callback
-#define gaim_prefs_load                   purple_prefs_load
-#define gaim_prefs_update_old             purple_prefs_update_old
-
-/* from privacy.h */
-
-#define GAIM_PRIVACY_ALLOW_ALL        PURPLE_PRIVACY_ALLOW_ALL
-#define GAIM_PRIVACY_DENY_ALL         PURPLE_PRIVACY_DENY_ALL
-#define GAIM_PRIVACY_ALLOW_USERS      PURPLE_PRIVACY_ALLOW_USERS
-#define GAIM_PRIVACY_DENY_USERS       PURPLE_PRIVACY_DENY_USERS
-#define GAIM_PRIVACY_ALLOW_BUDDYLIST  PURPLE_PRIVACY_ALLOW_BUDDYLIST
-#define GaimPrivacyType  PurplePrivacyType
-
-#define GaimPrivacyUiOps  PurplePrivacyUiOps
-
-#define gaim_privacy_permit_add     purple_privacy_permit_add
-#define gaim_privacy_permit_remove  purple_privacy_permit_remove
-#define gaim_privacy_deny_add       purple_privacy_deny_add
-#define gaim_privacy_deny_remove    purple_privacy_deny_remove
-#define gaim_privacy_allow          purple_privacy_allow
-#define gaim_privacy_deny           purple_privacy_deny
-#define gaim_privacy_check          purple_privacy_check
-#define gaim_privacy_set_ui_ops     purple_privacy_set_ui_ops
-#define gaim_privacy_get_ui_ops     purple_privacy_get_ui_ops
-#define gaim_privacy_init           purple_privacy_init
-
-/* from proxy.h */
-
-#define GAIM_PROXY_USE_GLOBAL  PURPLE_PROXY_USE_GLOBAL
-#define GAIM_PROXY_NONE        PURPLE_PROXY_NONE
-#define GAIM_PROXY_HTTP        PURPLE_PROXY_HTTP
-#define GAIM_PROXY_SOCKS4      PURPLE_PROXY_SOCKS4
-#define GAIM_PROXY_SOCKS5      PURPLE_PROXY_SOCKS5
-#define GAIM_PROXY_USE_ENVVAR  PURPLE_PROXY_USE_ENVVAR
-#define GaimProxyType  PurpleProxyType
-
-#define GaimProxyInfo  PurpleProxyInfo
-
-#define GaimProxyConnectData      PurpleProxyConnectData
-#define GaimProxyConnectFunction  PurpleProxyConnectFunction
-
-#define gaim_proxy_info_new           purple_proxy_info_new
-#define gaim_proxy_info_destroy       purple_proxy_info_destroy
-#define gaim_proxy_info_set_type      purple_proxy_info_set_type
-#define gaim_proxy_info_set_host      purple_proxy_info_set_host
-#define gaim_proxy_info_set_port      purple_proxy_info_set_port
-#define gaim_proxy_info_set_username  purple_proxy_info_set_username
-#define gaim_proxy_info_set_password  purple_proxy_info_set_password
-#define gaim_proxy_info_get_type      purple_proxy_info_get_type
-#define gaim_proxy_info_get_host      purple_proxy_info_get_host
-#define gaim_proxy_info_get_port      purple_proxy_info_get_port
-#define gaim_proxy_info_get_username  purple_proxy_info_get_username
-#define gaim_proxy_info_get_password  purple_proxy_info_get_password
-
-#define gaim_global_proxy_get_info    purple_global_proxy_get_info
-#define gaim_proxy_get_handle         purple_proxy_get_handle
-#define gaim_proxy_init               purple_proxy_init
-#define gaim_proxy_uninit             purple_proxy_uninit
-#define gaim_proxy_get_setup          purple_proxy_get_setup
-
-#define gaim_proxy_connect                     purple_proxy_connect
-#define gaim_proxy_connect_socks5              purple_proxy_connect_socks5
-#define gaim_proxy_connect_cancel              purple_proxy_connect_cancel
-#define gaim_proxy_connect_cancel_with_handle  purple_proxy_connect_cancel_with_handle
-
-/* from prpl.h */
-
-#define GaimPluginProtocolInfo  PurplePluginProtocolInfo
-
-#define GAIM_ICON_SCALE_DISPLAY  PURPLE_ICON_SCALE_DISPLAY
-#define GAIM_ICON_SCALE_SEND     PURPLE_ICON_SCALE_SEND
-#define GaimIconScaleRules  PurpleIconScaleRules
-
-#define GaimBuddyIconSpec  PurpleBuddyIconSpec
-
-#define GaimProtocolOptions  PurpleProtocolOptions
-
-#define GAIM_IS_PROTOCOL_PLUGIN  PURPLE_IS_PROTOCOL_PLUGIN
-
-#define GAIM_PLUGIN_PROTOCOL_INFO  PURPLE_PLUGIN_PROTOCOL_INFO
-
-#define gaim_prpl_got_account_idle        purple_prpl_got_account_idle
-#define gaim_prpl_got_account_login_time  purple_prpl_got_account_login_time
-#define gaim_prpl_got_account_status      purple_prpl_got_account_status
-#define gaim_prpl_got_user_idle           purple_prpl_got_user_idle
-#define gaim_prpl_got_user_login_time     purple_prpl_got_user_login_time
-#define gaim_prpl_got_user_status         purple_prpl_got_user_status
-#define gaim_prpl_change_account_status   purple_prpl_change_account_status
-#define gaim_prpl_get_statuses            purple_prpl_get_statuses
-
-#define gaim_find_prpl  purple_find_prpl
-
-/* from request.h */
-
-#define GAIM_DEFAULT_ACTION_NONE  PURPLE_DEFAULT_ACTION_NONE
-
-#define GAIM_REQUEST_INPUT   PURPLE_REQUEST_INPUT
-#define GAIM_REQUEST_CHOICE  PURPLE_REQUEST_CHOICE
-#define GAIM_REQUEST_ACTION  PURPLE_REQUEST_ACTION
-#define GAIM_REQUEST_FIELDS  PURPLE_REQUEST_FIELDS
-#define GAIM_REQUEST_FILE    PURPLE_REQUEST_FILE
-#define GAIM_REQUEST_FOLDER  PURPLE_REQUEST_FOLDER
-#define GaimRequestType  PurpleRequestType
-
-#define GAIM_REQUEST_FIELD_NONE     PURPLE_REQUEST_FIELD_NONE
-#define GAIM_REQUEST_FIELD_STRING   PURPLE_REQUEST_FIELD_STRING
-#define GAIM_REQUEST_FIELD_INTEGER  PURPLE_REQUEST_FIELD_INTEGER
-#define GAIM_REQUEST_FIELD_BOOLEAN  PURPLE_REQUEST_FIELD_BOOLEAN
-#define GAIM_REQUEST_FIELD_CHOICE   PURPLE_REQUEST_FIELD_CHOICE
-#define GAIM_REQUEST_FIELD_LIST     PURPLE_REQUEST_FIELD_LIST
-#define GAIM_REQUEST_FIELD_LABEL    PURPLE_REQUEST_FIELD_LABEL
-#define GAIM_REQUEST_FIELD_IMAGE    PURPLE_REQUEST_FIELD_IMAGE
-#define GAIM_REQUEST_FIELD_ACCOUNT  PURPLE_REQUEST_FIELD_ACCOUNT
-#define GaimRequestFieldType  PurpleRequestFieldType
-
-#define GaimRequestFields  PurpleRequestFields
-
-#define GaimRequestFieldGroup  PurpleRequestFieldGroup
-
-#define GaimRequestField  PurpleRequestField
-
-#define GaimRequestUiOps  PurpleRequestUiOps
-
-#define GaimRequestInputCb   PurpleRequestInputCb
-#define GaimRequestActionCb  PurpleRequestActionCb
-#define GaimRequestChoiceCb  PurpleRequestChoiceCb
-#define GaimRequestFieldsCb  PurpleRequestFieldsCb
-#define GaimRequestFileCb    PurpleRequestFileCb
-
-#define gaim_request_fields_new                  purple_request_fields_new
-#define gaim_request_fields_destroy              purple_request_fields_destroy
-#define gaim_request_fields_add_group            purple_request_fields_add_group
-#define gaim_request_fields_get_groups           purple_request_fields_get_groups
-#define gaim_request_fields_exists               purple_request_fields_exists
-#define gaim_request_fields_get_required         purple_request_fields_get_required
-#define gaim_request_fields_is_field_required    purple_request_fields_is_field_required
-#define gaim_request_fields_all_required_filled  purple_request_fields_all_required_filled
-#define gaim_request_fields_get_field            purple_request_fields_get_field
-#define gaim_request_fields_get_string           purple_request_fields_get_string
-#define gaim_request_fields_get_integer          purple_request_fields_get_integer
-#define gaim_request_fields_get_bool             purple_request_fields_get_bool
-#define gaim_request_fields_get_choice           purple_request_fields_get_choice
-#define gaim_request_fields_get_account          purple_request_fields_get_account
-
-#define gaim_request_field_group_new         purple_request_field_group_new
-#define gaim_request_field_group_destroy     purple_request_field_group_destroy
-#define gaim_request_field_group_add_field   purple_request_field_group_add_field
-#define gaim_request_field_group_get_title   purple_request_field_group_get_title
-#define gaim_request_field_group_get_fields  purple_request_field_group_get_fields
-
-#define gaim_request_field_new            purple_request_field_new
-#define gaim_request_field_destroy        purple_request_field_destroy
-#define gaim_request_field_set_label      purple_request_field_set_label
-#define gaim_request_field_set_visible    purple_request_field_set_visible
-#define gaim_request_field_set_type_hint  purple_request_field_set_type_hint
-#define gaim_request_field_set_required   purple_request_field_set_required
-#define gaim_request_field_get_type       purple_request_field_get_type
-#define gaim_request_field_get_id         purple_request_field_get_id
-#define gaim_request_field_get_label      purple_request_field_get_label
-#define gaim_request_field_is_visible     purple_request_field_is_visible
-#define gaim_request_field_get_type_hint  purple_request_field_get_type_hint
-#define gaim_request_field_is_required    purple_request_field_is_required
-
-#define gaim_request_field_string_new           purple_request_field_string_new
-#define gaim_request_field_string_set_default_value \
-	purple_request_field_string_set_default_value
-#define gaim_request_field_string_set_value     purple_request_field_string_set_value
-#define gaim_request_field_string_set_masked    purple_request_field_string_set_masked
-#define gaim_request_field_string_set_editable  purple_request_field_string_set_editable
-#define gaim_request_field_string_get_default_value \
-	purple_request_field_string_get_default_value
-#define gaim_request_field_string_get_value     purple_request_field_string_get_value
-#define gaim_request_field_string_is_multiline  purple_request_field_string_is_multiline
-#define gaim_request_field_string_is_masked     purple_request_field_string_is_masked
-#define gaim_request_field_string_is_editable   purple_request_field_string_is_editable
-
-#define gaim_request_field_int_new        purple_request_field_int_new
-#define gaim_request_field_int_set_default_value \
-	purple_request_field_int_set_default_value
-#define gaim_request_field_int_set_value  purple_request_field_int_set_value
-#define gaim_request_field_int_get_default_value \
-	purple_request_field_int_get_default_value
-#define gaim_request_field_int_get_value  purple_request_field_int_get_value
-
-#define gaim_request_field_bool_new        purple_request_field_bool_new
-#define gaim_request_field_bool_set_default_value \
-	purple_request_field_book_set_default_value
-#define gaim_request_field_bool_set_value  purple_request_field_bool_set_value
-#define gaim_request_field_bool_get_default_value \
-	purple_request_field_bool_get_default_value
-#define gaim_request_field_bool_get_value  purple_request_field_bool_get_value
-
-#define gaim_request_field_choice_new         purple_request_field_choice_new
-#define gaim_request_field_choice_add         purple_request_field_choice_add
-#define gaim_request_field_choice_set_default_value \
-	purple_request_field_choice_set_default_value
-#define gaim_request_field_choice_set_value   purple_request_field_choice_set_value
-#define gaim_request_field_choice_get_default_value \
-	purple_request_field_choice_get_default_value
-#define gaim_request_field_choice_get_value   purple_request_field_choice_get_value
-#define gaim_request_field_choice_get_labels  purple_request_field_choice_get_labels
-
-#define gaim_request_field_list_new               purple_request_field_list_new
-#define gaim_request_field_list_set_multi_select  purple_request_field_list_set_multi_select
-#define gaim_request_field_list_get_multi_select  purple_request_field_list_get_multi_select
-#define gaim_request_field_list_get_data          purple_request_field_list_get_data
-#define gaim_request_field_list_add               purple_request_field_list_add
-#define gaim_request_field_list_add_selected      purple_request_field_list_add_selected
-#define gaim_request_field_list_clear_selected    purple_request_field_list_clear_selected
-#define gaim_request_field_list_set_selected      purple_request_field_list_set_selected
-#define gaim_request_field_list_is_selected       purple_request_field_list_is_selected
-#define gaim_request_field_list_get_selected      purple_request_field_list_get_selected
-#define gaim_request_field_list_get_items         purple_request_field_list_get_items
-
-#define gaim_request_field_label_new  purple_request_field_label_new
-
-#define gaim_request_field_image_new          purple_request_field_image_new
-#define gaim_request_field_image_set_scale    purple_request_field_image_set_scale
-#define gaim_request_field_image_get_buffer   purple_request_field_image_get_buffer
-#define gaim_request_field_image_get_size     purple_request_field_image_get_size
-#define gaim_request_field_image_get_scale_x  purple_request_field_image_get_scale_x
-#define gaim_request_field_image_get_scale_y  purple_request_field_image_get_scale_y
-
-#define gaim_request_field_account_new                purple_request_field_account_new
-#define gaim_request_field_account_set_default_value  purple_request_field_account_set_default_value
-#define gaim_request_field_account_set_value          purple_request_field_account_set_value
-#define gaim_request_field_account_set_show_all       purple_request_field_account_set_show_all
-#define gaim_request_field_account_set_filter         purple_request_field_account_set_filter
-#define gaim_request_field_account_get_default_value  purple_request_field_account_get_default_value
-#define gaim_request_field_account_get_value          purple_request_field_account_get_value
-#define gaim_request_field_account_get_show_all       purple_request_field_account_get_show_all
-#define gaim_request_field_account_get_filter         purple_request_field_account_get_filter
-
-#define gaim_request_input              purple_request_input
-#define gaim_request_choice             purple_request_choice
-#define gaim_request_choice_varg        purple_request_choice_varg
-#define gaim_request_action             purple_request_action
-#define gaim_request_action_varg        purple_request_action_varg
-#define gaim_request_fields(handle, title, primary, secondary, fields, ok_text, ok_cb, cancel_text, cancel_cb, user_data)             purple_request_fields(handle, title, primary, secondary, fields, ok_text, ok_cb, cancel_text, cancel_cb, NULL, NULL, NULL, user_data)
-#define gaim_request_close              purple_request_close
-#define gaim_request_close_with_handle  purple_request_close_with_handle
-
-#define gaim_request_yes_no         purple_request_yes_no
-#define gaim_request_ok_cancel      purple_request_ok_cancel
-#define gaim_request_accept_cancel  purple_request_accept_cancel
-
-#define gaim_request_file    purple_request_file
-#define gaim_request_folder  purple_request_folder
-
-#define gaim_request_set_ui_ops  purple_request_set_ui_ops
-#define gaim_request_get_ui_ops  purple_request_get_ui_ops
-
-/* from roomlist.h */
-
-#define GaimRoomlist       PurpleRoomlist
-#define GaimRoomlistRoom   PurpleRoomlistRoom
-#define GaimRoomlistField  PurpleRoomlistField
-#define GaimRoomlistUiOps  PurpleRoomlistUiOps
-
-#define GAIM_ROOMLIST_ROOMTYPE_CATEGORY  PURPLE_ROOMLIST_ROOMTYPE_CATEGORY
-#define GAIM_ROOMLIST_ROOMTYPE_ROOM      PURPLE_ROOMLIST_ROOMTYPE_ROOM
-#define GaimRoomlistRoomType  PurpleRoomlistRoomType
-
-#define GAIM_ROOMLIST_FIELD_BOOL    PURPLE_ROOMLIST_BOOL
-#define GAIM_ROOMLIST_FIELD_INT     PURPLE_ROOMLIST_INT
-#define GAIM_ROOMLIST_FIELD_STRING  PURPLE_ROOMLIST_STRING
-#define GaimRoomlistFieldType  PurpleRoomlistFieldType
-
-#define gaim_roomlist_show_with_account  purple_roomlist_show_with_account
-#define gaim_roomlist_new                purple_roomlist_new
-#define gaim_roomlist_ref                purple_roomlist_ref
-#define gaim_roomlist_unref              purple_roomlist_unref
-#define gaim_roomlist_set_fields         purple_roomlist_set_fields
-#define gaim_roomlist_set_in_progress    purple_roomlist_set_in_progress
-#define gaim_roomlist_get_in_progress    purple_roomlist_get_in_progress
-#define gaim_roomlist_room_add           purple_roomlist_room_add
-
-#define gaim_roomlist_get_list         purple_roomlist_get_list
-#define gaim_roomlist_cancel_get_list  purple_roomlist_cancel_get_list
-#define gaim_roomlist_expand_category  purple_roomlist_expand_category
-
-#define gaim_roomlist_room_new        purple_roomlist_room_new
-#define gaim_roomlist_room_add_field  purple_roomlist_room_add_field
-#define gaim_roomlist_room_join       purple_roomlist_room_join
-#define gaim_roomlist_field_new       purple_roomlist_field_new
-
-#define gaim_roomlist_set_ui_ops  purple_roomlist_set_ui_ops
-#define gaim_roomlist_get_ui_ops  purple_roomlist_get_ui_ops
-
-/* from savedstatuses.h */
-
-#define GaimSavedStatus     PurpleSavedStatus
-#define GaimSavedStatusSub  PurpleSavedStatusSub
-
-#define gaim_savedstatus_new              purple_savedstatus_new
-#define gaim_savedstatus_set_title        purple_savedstatus_set_title
-#define gaim_savedstatus_set_type         purple_savedstatus_set_type
-#define gaim_savedstatus_set_message      purple_savedstatus_set_message
-#define gaim_savedstatus_set_substatus    purple_savedstatus_set_substatus
-#define gaim_savedstatus_unset_substatus  purple_savedstatus_unset_substatus
-#define gaim_savedstatus_delete           purple_savedstatus_delete
-
-#define gaim_savedstatuses_get_all              purple_savedstatuses_get_all
-#define gaim_savedstatuses_get_popular          purple_savedstatuses_get_popular
-#define gaim_savedstatus_get_current            purple_savedstatus_get_current
-#define gaim_savedstatus_get_default            purple_savedstatus_get_default
-#define gaim_savedstatus_get_idleaway           purple_savedstatus_get_idleaway
-#define gaim_savedstatus_is_idleaway            purple_savedstatus_is_idleaway
-#define gaim_savedstatus_set_idleaway           purple_savedstatus_set_idleaway
-#define gaim_savedstatus_get_startup            purple_savedstatus_get_startup
-#define gaim_savedstatus_find                   purple_savedstatus_find
-#define gaim_savedstatus_find_by_creation_time  purple_savedstatus_find_by_creation_time
-#define gaim_savedstatus_find_transient_by_type_and_message \
-	purple_savedstatus_find_transient_by_type_and_message
-
-#define gaim_savedstatus_is_transient           purple_savedstatus_is_transient
-#define gaim_savedstatus_get_title              purple_savedstatus_get_title
-#define gaim_savedstatus_get_type               purple_savedstatus_get_type
-#define gaim_savedstatus_get_message            purple_savedstatus_get_message
-#define gaim_savedstatus_get_creation_time      purple_savedstatus_get_creation_time
-#define gaim_savedstatus_has_substatuses        purple_savedstatus_has_substatuses
-#define gaim_savedstatus_get_substatus          purple_savedstatus_get_substatus
-#define gaim_savedstatus_substatus_get_type     purple_savedstatus_substatus_get_type
-#define gaim_savedstatus_substatus_get_message  purple_savedstatus_substatus_get_message
-#define gaim_savedstatus_activate               purple_savedstatus_activate
-#define gaim_savedstatus_activate_for_account   purple_savedstatus_activate_for_account
-
-#define gaim_savedstatuses_get_handle  purple_savedstatuses_get_handle
-#define gaim_savedstatuses_init        purple_savedstatuses_init
-#define gaim_savedstatuses_uninit      purple_savedstatuses_uninit
-
-/* from signals.h */
-
-#define GAIM_CALLBACK  PURPLE_CALLBACK
-
-#define GaimCallback           PurpleCallback
-#define GaimSignalMarshalFunc  PurpleSignalMarshalFunc
-
-#define GAIM_SIGNAL_PRIORITY_DEFAULT  PURPLE_SIGNAL_PRIORITY_DEFAULT
-#define GAIM_SIGNAL_PRIORITY_HIGHEST  PURPLE_SIGNAL_PRIORITY_HIGHEST
-#define GAIM_SIGNAL_PRIORITY_LOWEST   PURPLE_SIGNAL_PRIORITY_LOWEST
-
-#define gaim_signal_register    purple_signal_register
-#define gaim_signal_unregister  purple_signal_unregister
-
-#define gaim_signals_unregister_by_instance  purple_signals_unregister_by_instance
-
-#define gaim_signal_get_values              purple_signal_get_values
-#define gaim_signal_connect_priority        purple_signal_connect_priority
-#define gaim_signal_connect                 purple_signal_connect
-#define gaim_signal_connect_priority_vargs  purple_signal_connect_priority_vargs
-#define gaim_signal_connect_vargs           purple_signal_connect_vargs
-#define gaim_signal_disconnect              purple_signal_disconnect
-
-#define gaim_signals_disconnect_by_handle  purple_signals_disconnect_by_handle
-
-#define gaim_signal_emit                 purple_signal_emit
-#define gaim_signal_emit_vargs           purple_signal_emit_vargs
-#define gaim_signal_emit_return_1        purple_signal_emit_vargs
-#define gaim_signal_emit_vargs_return_1  purple_signal_emit_vargs_return_1
-
-#define gaim_signals_init    purple_signals_init
-#define gaim_signals_uninit  purple_signals_uninit
-
-#define gaim_marshal_VOID \
-	purple_marshal_VOID
-#define gaim_marshal_VOID__INT \
-	purple_marshal_VOID__INT
-#define gaim_marshal_VOID__INT_INT \
-	purple_marshal_VOID_INT_INT
-#define gaim_marshal_VOID__POINTER \
-	purple_marshal_VOID__POINTER
-#define gaim_marshal_VOID__POINTER_UINT \
-	purple_marshal_VOID__POINTER_UINT
-#define gaim_marshal_VOID__POINTER_INT_INT \
-	purple_marshal_VOID__POINTER_INT_INT
-#define gaim_marshal_VOID__POINTER_POINTER \
-	purple_marshal_VOID__POINTER_POINTER
-#define gaim_marshal_VOID__POINTER_POINTER_UINT \
-	purple_marshal_VOID__POINTER_POINTER_UINT
-#define gaim_marshal_VOID__POINTER_POINTER_UINT_UINT \
-	purple_marshal_VOID__POINTER_POINTER_UINT_UINT
-#define gaim_marshal_VOID__POINTER_POINTER_POINTER \
-	purple_marshal_VOID__POINTER_POINTER_POINTER
-#define gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER \
-	purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER
-#define gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER_POINTER \
-	purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER_POINTER
-#define gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT \
-	purple_marshal_VOID__POINTER_POINTER_POINTER_UINT
-#define gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER_UINT \
-	purple_marshal_VOID__POINTER_POINTER_POINTER_POINTER_UINT
-#define gaim_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT \
-	purple_marshal_VOID__POINTER_POINTER_POINTER_UINT_UINT
-
-#define gaim_marshal_INT__INT \
-	purple_marshal_INT__INT
-#define gaim_marshal_INT__INT_INT \
-	purple_marshal_INT__INT_INT
-#define gaim_marshal_INT__POINTER_POINTER_POINTER_POINTER_POINTER \
-	purple_marshal_INT__POINTER_POINTER_POINTER_POINTER_POINTER
-
-#define gaim_marshal_BOOLEAN__POINTER \
-	purple_marshal_BOOLEAN__POINTER
-#define gaim_marshal_BOOLEAN__POINTER_POINTER \
-	purple_marshal_BOOLEAN__POINTER_POINTER
-#define gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER \
-	purple_marshal_BOOLEAN__POINTER_POINTER_POINTER
-#define gaim_marshal_BOOLEAN__POINTER_POINTER_UINT \
-	purple_marshal_BOOLEAN__POINTER_POINTER_UINT
-#define gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_UINT \
-	purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_UINT
-#define gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER \
-	purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER
-#define gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER \
-	purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER
-
-#define gaim_marshal_BOOLEAN__INT_POINTER \
-	purple_marshal_BOOLEAN__INT_POINTER
-
-#define gaim_marshal_POINTER__POINTER_INT \
-	purple_marshal_POINTER__POINTER_INT
-#define gaim_marshal_POINTER__POINTER_INT64 \
-	purple_marshal_POINTER__POINTER_INT64
-#define gaim_marshal_POINTER__POINTER_INT_BOOLEAN \
-	purple_marshal_POINTER__POINTER_INT_BOOLEAN
-#define gaim_marshal_POINTER__POINTER_INT64_BOOLEAN \
-	purple_marshal_POINTER__POINTER_INT64_BOOLEAN
-#define gaim_marshal_POINTER__POINTER_POINTER \
-	purple_marshal_POINTER__POINTER_POINTER
-
-/* from sound.h */
-
-#define GAIM_SOUND_BUDDY_ARRIVE    PURPLE_SOUND_BUDDY_ARRIVE
-#define GAIM_SOUND_BUDDY_LEAVE     PURPLE_SOUND_BUDDY_LEAVE
-#define GAIM_SOUND_RECEIVE         PURPLE_SOUND_RECEIVE
-#define GAIM_SOUND_FIRST_RECEIVE   PURPLE_SOUND_FIRST_RECEIVE
-#define GAIM_SOUND_SEND            PURPLE_SOUND_SEND
-#define GAIM_SOUND_CHAT_JOIN       PURPLE_SOUND_CHAT_JOIN
-#define GAIM_SOUND_CHAT_LEAVE      PURPLE_SOUND_CHAT_LEAVE
-#define GAIM_SOUND_CHAT_YOU_SAY    PURPLE_SOUND_CHAT_YOU_SAY
-#define GAIM_SOUND_CHAT_SAY        PURPLE_SOUND_CHAT_SAY
-#define GAIM_SOUND_POUNCE_DEFAULT  PURPLE_SOUND_POUNCE_DEFAULT
-#define GAIM_SOUND_CHAT_NICK       PURPLE_SOUND_CHAT_NICK
-#define GAIM_NUM_SOUNDS            PURPLE_NUM_SOUNDS
-#define GaimSoundEventID  PurpleSoundEventID
-
-#define GaimSoundUiOps  PurpleSoundUiOps
-
-#define gaim_sound_play_file   purple_sound_play_file
-#define gaim_sound_play_event  purple_sound_play_event
-#define gaim_sound_set_ui_ops  purple_sound_set_ui_ops
-#define gaim_sound_get_ui_ops  purple_sound_get_ui_ops
-#define gaim_sound_init        purple_sound_init
-#define gaim_sound_uninit      purple_sound_uninit
-
-#define gaim_sounds_get_handle  purple_sounds_get_handle
-
-/* from sslconn.h */
-
-#define GAIM_SSL_DEFAULT_PORT  PURPLE_SSL_DEFAULT_PORT
-
-#define GAIM_SSL_HANDSHAKE_FAILED  PURPLE_SSL_HANDSHAKE_FAILED
-#define GAIM_SSL_CONNECT_FAILED    PURPLE_SSL_CONNECT_FAILED
-#define GaimSslErrorType  PurpleSslErrorType
-
-#define GaimSslConnection  PurpleSslConnection
-
-#define GaimSslInputFunction  PurpleSslInputFunction
-#define GaimSslErrorFunction  PurpleSslErrorFunction
-
-#define GaimSslOps  PurpleSslOps
-
-#define gaim_ssl_is_supported  purple_ssl_is_supported
-#define gaim_ssl_connect       purple_ssl_connect
-#define gaim_ssl_connect_fd    purple_ssl_connect_fd
-#define gaim_ssl_input_add     purple_ssl_input_add
-#define gaim_ssl_close         purple_ssl_close
-#define gaim_ssl_read          purple_ssl_read
-#define gaim_ssl_write         purple_ssl_write
-
-#define gaim_ssl_set_ops  purple_ssl_set_ops
-#define gaim_ssl_get_ops  purple_ssl_get_ops
-#define gaim_ssl_init     purple_ssl_init
-#define gaim_ssl_uninit   purple_ssl_uninit
-
-/* from status.h */
-
-#define GaimStatusType  PurpleStatusType
-#define GaimStatusAttr  PurpleStatusAttr
-#define GaimPresence    PurplePresence
-#define GaimStatus      PurpleStatus
-
-#define GAIM_PRESENCE_CONTEXT_UNSET    PURPLE_PRESENCE_CONTEXT_UNSET
-#define GAIM_PRESENCE_CONTEXT_ACCOUNT  PURPLE_PRESENCE_CONTEXT_ACCOUNT
-#define GAIM_PRESENCE_CONTEXT_CONV     PURPLE_PRESENCE_CONTEXT_CONV
-#define GAIM_PRESENCE_CONTEXT_BUDDY    PURPLE_PRESENCE_CONTEXT_BUDDY
-#define GaimPresenceContext  PurplePresenceContext
-
-#define GAIM_STATUS_UNSET           PURPLE_STATUS_UNSET
-#define GAIM_STATUS_OFFLINE         PURPLE_STATUS_OFFLINE
-#define GAIM_STATUS_AVAILABLE       PURPLE_STATUS_AVAILABLE
-#define GAIM_STATUS_UNAVAILABLE     PURPLE_STATUS_UNAVAILABLE
-#define GAIM_STATUS_INVISIBLE       PURPLE_STATUS_INVISIBLE
-#define GAIM_STATUS_AWAY            PURPLE_STATUS_AWAY
-#define GAIM_STATUS_EXTENDED_AWAY   PURPLE_STATUS_EXTENDED_AWAY
-#define GAIM_STATUS_MOBILE          PURPLE_STATUS_MOBILE
-#define GAIM_STATUS_NUM_PRIMITIVES  PURPLE_STATUS_NUM_PRIMITIVES
-#define GaimStatusPrimitive  PurpleStatusPrimitive
-
-#define gaim_primitive_get_id_from_type    purple_primitive_get_id_from_type
-#define gaim_primitive_get_name_from_type  purple_primitive_get_name_from_type
-#define gaim_primitive_get_type_from_id    purple_primitive_get_type_from_id
-
-#define gaim_status_type_new_full          purple_status_type_new_full
-#define gaim_status_type_new               purple_status_type_new
-#define gaim_status_type_new_with_attrs    purple_status_type_new_with_attrs
-#define gaim_status_type_destroy           purple_status_type_destroy
-#define gaim_status_type_set_primary_attr  purple_status_type_set_primary_attr
-#define gaim_status_type_add_attr          purple_status_type_add_attr
-#define gaim_status_type_add_attrs         purple_status_type_add_attrs
-#define gaim_status_type_add_attrs_vargs   purple_status_type_add_attrs_vargs
-#define gaim_status_type_get_primitive     purple_status_type_get_primitive
-#define gaim_status_type_get_id            purple_status_type_get_id
-#define gaim_status_type_get_name          purple_status_type_get_name
-#define gaim_status_type_is_saveable       purple_status_type_is_saveable
-#define gaim_status_type_is_user_settable  purple_status_type_is_user_settable
-#define gaim_status_type_is_independent    purple_status_type_is_independent
-#define gaim_status_type_is_exclusive      purple_status_type_is_exclusive
-#define gaim_status_type_is_available      purple_status_type_is_available
-#define gaim_status_type_get_primary_attr  purple_status_type_get_primary_attr
-#define gaim_status_type_get_attr          purple_status_type_get_attr
-#define gaim_status_type_get_attrs         purple_status_type_get_attrs
-#define gaim_status_type_find_with_id      purple_status_type_find_with_id
-
-#define gaim_status_attr_new        purple_status_attr_new
-#define gaim_status_attr_destroy    purple_status_attr_destroy
-#define gaim_status_attr_get_id     purple_status_attr_get_id
-#define gaim_status_attr_get_name   purple_status_attr_get_name
-#define gaim_status_attr_get_value  purple_status_attr_get_value
-
-#define gaim_status_new                         purple_status_new
-#define gaim_status_destroy                     purple_status_destroy
-#define gaim_status_set_active                  purple_status_set_active
-#define gaim_status_set_active_with_attrs       purple_status_set_active_with_attrs
-#define gaim_status_set_active_with_attrs_list  purple_status_set_active_with_attrs_list
-#define gaim_status_set_attr_boolean            purple_status_set_attr_boolean
-#define gaim_status_set_attr_int                purple_status_set_attr_int
-#define gaim_status_set_attr_string             purple_status_set_attr_string
-#define gaim_status_get_type                    purple_status_get_type
-#define gaim_status_get_presence                purple_status_get_presence
-#define gaim_status_get_id                      purple_status_get_id
-#define gaim_status_get_name                    purple_status_get_name
-#define gaim_status_is_independent              purple_status_is_independent
-#define gaim_status_is_exclusive                purple_status_is_exclusive
-#define gaim_status_is_available                purple_status_is_available
-#define gaim_status_is_active                   purple_status_is_active
-#define gaim_status_is_online                   purple_status_is_online
-#define gaim_status_get_attr_value              purple_status_get_attr_value
-#define gaim_status_get_attr_boolean            purple_status_get_attr_boolean
-#define gaim_status_get_attr_int                purple_status_get_attr_int
-#define gaim_status_get_attr_string             purple_status_get_attr_string
-#define gaim_status_compare                     purple_status_compare
-
-#define gaim_presence_new                purple_presence_new
-#define gaim_presence_new_for_account    purple_presence_new_for_account
-#define gaim_presence_new_for_conv       purple_presence_new_for_conv
-#define gaim_presence_new_for_buddy      purple_presence_new_for_buddy
-#define gaim_presence_destroy            purple_presence_destroy
-#define gaim_presence_add_status         purple_presence_add_status
-#define gaim_presence_add_list           purple_presence_add_list
-#define gaim_presence_set_status_active  purple_presence_set_status_active
-#define gaim_presence_switch_status      purple_presence_switch_status
-#define gaim_presence_set_idle           purple_presence_set_idle
-#define gaim_presence_set_login_time     purple_presence_set_login_time
-#define gaim_presence_get_context        purple_presence_get_context
-#define gaim_presence_get_account        purple_presence_get_account
-#define gaim_presence_get_conversation   purple_presence_get_conversation
-#define gaim_presence_get_chat_user      purple_presence_get_chat_user
-#define gaim_presence_get_statuses       purple_presence_get_statuses
-#define gaim_presence_get_status         purple_presence_get_status
-#define gaim_presence_get_active_status  purple_presence_get_active_status
-#define gaim_presence_is_available       purple_presence_is_available
-#define gaim_presence_is_online          purple_presence_is_online
-#define gaim_presence_is_status_active   purple_presence_is_status_active
-#define gaim_presence_is_status_primitive_active \
-	purple_presence_is_status_primitive_active
-#define gaim_presence_is_idle            purple_presence_is_idle
-#define gaim_presence_get_idle_time      purple_presence_get_idle_time
-#define gaim_presence_get_login_time     purple_presence_get_login_time
-#define gaim_presence_compare            purple_presence_compare
-
-#define gaim_status_get_handle  purple_status_get_handle
-#define gaim_status_init        purple_status_init
-#define gaim_status_uninit      purple_status_uninit
-
-/* from stringref.h */
-
-#define GaimStringref  PurpleStringref
-
-#define gaim_stringref_new        purple_stringref_new
-#define gaim_stringref_new_noref  purple_stringref_new_noref
-#define gaim_stringref_printf     purple_stringref_printf
-#define gaim_stringref_ref        purple_stringref_ref
-#define gaim_stringref_unref      purple_stringref_unref
-#define gaim_stringref_value      purple_stringref_value
-#define gaim_stringref_cmp        purple_stringref_cmp
-#define gaim_stringref_len        purple_stringref_len
-
-/* from stun.h */
-
-#define GaimStunNatDiscovery  PurpleStunNatDiscovery
-
-#define GAIM_STUN_STATUS_UNDISCOVERED  PURPLE_STUN_STATUS_UNDISCOVERED
-#define GAIM_STUN_STATUS_UNKNOWN       PURPLE_STUN_STATUS_UNKNOWN
-#define GAIM_STUN_STATUS_DISCOVERING   PURPLE_STUN_STATUS_DISCOVERING
-#define GAIM_STUN_STATUS_DISCOVERED    PURPLE_STUN_STATUS_DISCOVERED
-#define GaimStunStatus  PurpleStunStatus
-
-#define GAIM_STUN_NAT_TYPE_PUBLIC_IP             PURPLE_STUN_NAT_TYPE_PUBLIC_IP
-#define GAIM_STUN_NAT_TYPE_UNKNOWN_NAT           PURPLE_STUN_NAT_TYPE_UNKNOWN_NAT
-#define GAIM_STUN_NAT_TYPE_FULL_CONE             PURPLE_STUN_NAT_TYPE_FULL_CONE
-#define GAIM_STUN_NAT_TYPE_RESTRICTED_CONE       PURPLE_STUN_NAT_TYPE_RESTRICTED_CONE
-#define GAIM_STUN_NAT_TYPE_PORT_RESTRICTED_CONE  PURPLE_STUN_NAT_TYPE_PORT_RESTRICTED_CONE
-#define GAIM_STUN_NAT_TYPE_SYMMETRIC             PURPLE_STUN_NAT_TYPE_SYMMETRIC
-#define GaimStunNatType  PurpleStunNatType
-
-/* why didn't this have a Gaim prefix before? */
-#define StunCallback  PurpleStunCallback
-
-#define gaim_stun_discover  purple_stun_discover
-#define gaim_stun_init      purple_stun_init
-
-/* from upnp.h */
-
-/* suggested rename: PurpleUPnpMappingHandle */
-#define UPnPMappingAddRemove  PurpleUPnPMappingAddRemove
-
-#define GaimUPnPCallback  PurpleUPnPCallback
-
-#define gaim_upnp_discover             purple_upnp_discover
-#define gaim_upnp_get_public_ip        purple_upnp_get_public_ip
-#define gaim_upnp_cancel_port_mapping  purple_upnp_cancel_port_mapping
-#define gaim_upnp_set_port_mapping     purple_upnp_set_port_mapping
-
-#define gaim_upnp_remove_port_mapping  purple_upnp_remove_port_mapping
-
-/* from util.h */
-
-#define GaimUtilFetchUrlData  PurpleUtilFetchUrlData
-#define GaimMenuAction        PurpleMenuAction
-
-#define GaimInfoFieldFormatCallback  PurpleIntoFieldFormatCallback
-
-#define GaimKeyValuePair  PurpleKeyValuePair
-
-#define gaim_menu_action_new   purple_menu_action_new
-#define gaim_menu_action_free  purple_menu_action_free
-
-#define gaim_base16_encode   purple_base16_encode
-#define gaim_base16_decode   purple_base16_decode
-#define gaim_base64_encode   purple_base64_encode
-#define gaim_base64_decode   purple_base64_decode
-#define gaim_quotedp_decode  purple_quotedp_decode
-
-#define gaim_mime_decode_field  purple_mime_deco_field
-
-#define gaim_utf8_strftime      purple_utf8_strftime
-#define gaim_date_format_short  purple_date_format_short
-#define gaim_date_format_long   purple_date_format_long
-#define gaim_date_format_full   purple_date_format_full
-#define gaim_time_format        purple_time_format
-#define gaim_time_build         purple_time_build
-
-#define GAIM_NO_TZ_OFF  PURPLE_NO_TZ_OFF
-
-#define gaim_str_to_time  purple_str_to_time
-
-#define gaim_markup_find_tag            purple_markup_find_tag
-#define gaim_markup_extract_info_field  purple_markup_extract_info_field
-#define gaim_markup_html_to_xhtml       purple_markup_html_to_xhtml
-#define gaim_markup_strip_html          purple_markup_strip_html
-#define gaim_markup_linkify             purple_markup_linkify
-#define gaim_markup_slice               purple_markup_slice
-#define gaim_markup_get_tag_name        purple_markup_get_tag_name
-#define gaim_unescape_html              purple_unescape_html
-
-#define gaim_home_dir  purple_home_dir
-#define gaim_user_dir  purple_user_dir
-
-#define gaim_util_set_user_dir  purple_util_set_user_dir
-
-#define gaim_build_dir  purple_build_dir
-
-#define gaim_util_write_data_to_file  purple_util_write_data_to_file
-
-#define gaim_util_read_xml_from_file  purple_util_read_xml_from_file
-
-#define gaim_mkstemp  purple_mkstemp
-
-#define gaim_program_is_valid  purple_program_is_valid
-
-#define gaim_running_gnome  purple_running_gnome
-#define gaim_running_kde    purple_running_kde
-#define gaim_running_osx    purple_running_osx
-
-#define gaim_fd_get_ip  purple_fd_get_ip
-
-#define gaim_normalize         purple_normalize
-#define gaim_normalize_nocase  purple_normalize_nocase
-
-#define gaim_strdup_withhtml  purple_strdup_withhtml
-
-#define gaim_str_has_prefix  purple_str_has_prefix
-#define gaim_str_has_suffix  purple_str_has_suffix
-#define gaim_str_add_cr      purple_str_add_cr
-#define gaim_str_strip_char  purple_str_strip_char
-
-#define gaim_util_chrreplace  purple_util_chrreplace
-
-#define gaim_strreplace  purple_strreplace
-
-#define gaim_utf8_ncr_encode  purple_utf8_ncr_encode
-#define gaim_utf8_ncr_decode  purple_utf8_ncr_decode
-
-#define gaim_strcasereplace  purple_strcasereplace
-#define gaim_strcasestr      purple_strcasestr
-
-#define gaim_str_size_to_units      purple_str_size_to_units
-#define gaim_str_seconds_to_string  purple_str_seconds_to_string
-#define gaim_str_binary_to_ascii    purple_str_binary_to_ascii
-
-
-#define gaim_got_protocol_handler_uri  purple_got_protocol_handler_uri
-
-#define gaim_url_parse  purple_url_parse
-
-#define GaimUtilFetchUrlCallback  PurpleUtilFetchUrlCallback
-#define gaim_util_fetch_url          purple_util_fetch_url
-#define gaim_util_fetch_url_request  purple_util_fetch_url_request
-#define gaim_util_fetch_url_cancel   purple_util_fetch_url_cancel
-
-#define gaim_url_decode  purple_url_decode
-#define gaim_url_encode  purple_url_encode
-
-#define gaim_email_is_valid  purple_email_is_valid
-
-#define gaim_uri_list_extract_uris       purple_uri_list_extract_uris
-#define gaim_uri_list_extract_filenames  purple_uri_list_extract_filenames
-
-#define gaim_utf8_try_convert  purple_utf8_try_convert
-#define gaim_utf8_salvage      purple_utf8_salvage
-#define gaim_utf8_strcasecmp   purple_utf8_strcasecmp
-#define gaim_utf8_has_word     purple_utf8_has_word
-
-#define gaim_print_utf8_to_console  purple_print_utf8_to_console
-
-#define gaim_message_meify  purple_message_meify
-
-#define gaim_text_strip_mnemonic  purple_text_strip_mnemonic
-
-#define gaim_unescape_filename  purple_unescape_filename
-#define gaim_escape_filename    purple_escape_filename
-
-/* from value.h */
-
-#define GAIM_TYPE_UNKNOWN  PURPLE_TYPE_UNKNOWN
-#define GAIM_TYPE_SUBTYPE  PURPLE_TYPE_SUBTYPE
-#define GAIM_TYPE_CHAR     PURPLE_TYPE_CHAR
-#define GAIM_TYPE_UCHAR    PURPLE_TYPE_UCHAR
-#define GAIM_TYPE_BOOLEAN  PURPLE_TYPE_BOOLEAN
-#define GAIM_TYPE_SHORT    PURPLE_TYPE_SHORT
-#define GAIM_TYPE_USHORT   PURPLE_TYPE_USHORT
-#define GAIM_TYPE_INT      PURPLE_TYPE_INT
-#define GAIM_TYPE_UINT     PURPLE_TYPE_UINT
-#define GAIM_TYPE_LONG     PURPLE_TYPE_LONG
-#define GAIM_TYPE_ULONG    PURPLE_TYPE_ULONG
-#define GAIM_TYPE_INT64    PURPLE_TYPE_INT64
-#define GAIM_TYPE_UINT64   PURPLE_TYPE_UINT64
-#define GAIM_TYPE_STRING   PURPLE_TYPE_STRING
-#define GAIM_TYPE_OBJECT   PURPLE_TYPE_OBJECT
-#define GAIM_TYPE_POINTER  PURPLE_TYPE_POINTER
-#define GAIM_TYPE_ENUM     PURPLE_TYPE_ENUM
-#define GAIM_TYPE_BOXED    PURPLE_TYPE_BOXED
-#define GaimType  PurpleType
-
-
-#define GAIM_SUBTYPE_UNKNOWN       PURPLE_SUBTYPE_UNKNOWN
-#define GAIM_SUBTYPE_ACCOUNT       PURPLE_SUBTYPE_ACCOUNT
-#define GAIM_SUBTYPE_BLIST         PURPLE_SUBTYPE_BLIST
-#define GAIM_SUBTYPE_BLIST_BUDDY   PURPLE_SUBTYPE_BLIST_BUDDY
-#define GAIM_SUBTYPE_BLIST_GROUP   PURPLE_SUBTYPE_BLIST_GROUP
-#define GAIM_SUBTYPE_BLIST_CHAT    PURPLE_SUBTYPE_BLIST_CHAT
-#define GAIM_SUBTYPE_BUDDY_ICON    PURPLE_SUBTYPE_BUDDY_ICON
-#define GAIM_SUBTYPE_CONNECTION    PURPLE_SUBTYPE_CONNECTION
-#define GAIM_SUBTYPE_CONVERSATION  PURPLE_SUBTYPE_CONVERSATION
-#define GAIM_SUBTYPE_PLUGIN        PURPLE_SUBTYPE_PLUGIN
-#define GAIM_SUBTYPE_BLIST_NODE    PURPLE_SUBTYPE_BLIST_NODE
-#define GAIM_SUBTYPE_CIPHER        PURPLE_SUBTYPE_CIPHER
-#define GAIM_SUBTYPE_STATUS        PURPLE_SUBTYPE_STATUS
-#define GAIM_SUBTYPE_LOG           PURPLE_SUBTYPE_LOG
-#define GAIM_SUBTYPE_XFER          PURPLE_SUBTYPE_XFER
-#define GAIM_SUBTYPE_SAVEDSTATUS   PURPLE_SUBTYPE_SAVEDSTATUS
-#define GAIM_SUBTYPE_XMLNODE       PURPLE_SUBTYPE_XMLNODE
-#define GAIM_SUBTYPE_USERINFO      PURPLE_SUBTYPE_USERINFO
-#define GaimSubType  PurpleSubType
-
-#define GaimValue  PurpleValue
-
-#define gaim_value_new                purple_value_new
-#define gaim_value_new_outgoing       purple_value_new_outgoing
-#define gaim_value_destroy            purple_value_destroy
-#define gaim_value_dup                purple_value_dup
-#define gaim_value_purple_buddy_icon_get_extensionget_type           purple_value_get_type
-#define gaim_value_get_subtype        purple_value_get_subtype
-#define gaim_value_get_specific_type  purple_value_get_specific_type
-#define gaim_value_is_outgoing        purple_value_is_outgoing
-#define gaim_value_set_char           purple_value_set_char
-#define gaim_value_set_uchar          purple_value_set_uchar
-#define gaim_value_set_boolean        purple_value_set_boolean
-#define gaim_value_set_short          purple_value_set_short
-#define gaim_value_set_ushort         purple_value_set_ushort
-#define gaim_value_set_int            purple_value_set_int
-#define gaim_value_set_uint           purple_value_set_uint
-#define gaim_value_set_long           purple_value_set_long
-#define gaim_value_set_ulong          purple_value_set_ulong
-#define gaim_value_set_int64          purple_value_set_int64
-#define gaim_value_set_uint64         purple_value_set_uint64
-#define gaim_value_set_string         purple_value_set_string
-#define gaim_value_set_object         purple_value_set_object
-#define gaim_value_set_pointer        purple_value_set_pointer
-#define gaim_value_set_enum           purple_value_set_enum
-#define gaim_value_set_boxed          purple_value_set_boxed
-#define gaim_value_get_char           purple_value_get_char
-#define gaim_value_get_uchar          purple_value_get_uchar
-#define gaim_value_get_boolean        purple_value_get_boolean
-#define gaim_value_get_short          purple_value_get_short
-#define gaim_value_get_ushort         purple_value_get_ushort
-#define gaim_value_get_int            purple_value_get_int
-#define gaim_value_get_uint           purple_value_get_uint
-#define gaim_value_get_long           purple_value_get_long
-#define gaim_value_get_ulong          purple_value_get_ulong
-#define gaim_value_get_int64          purple_value_get_int64
-#define gaim_value_get_uint64         purple_value_get_uint64
-#define gaim_value_get_string         purple_value_get_string
-#define gaim_value_get_object         purple_value_get_object
-#define gaim_value_get_pointer        purple_value_get_pointer
-#define gaim_value_get_enum           purple_value_get_enum
-#define gaim_value_get_boxed          purple_value_get_boxed
-
-/* from version.h */
-
-#define GAIM_MAJOR_VERSION  PURPLE_MAJOR_VERSION
-#define GAIM_MINOR_VERSION  PURPLE_MINOR_VERSION
-#define GAIM_MICRO_VERSION  PURPLE_MICRO_VERSION
-
-#define GAIM_VERSION_CHECK  PURPLE_VERSION_CHECK
-
-/* from whiteboard.h */
-
-#define GaimWhiteboardPrplOps  PurpleWhiteboardPrplOps
-#define GaimWhiteboard         PurpleWhiteboard
-#define GaimWhiteboardUiOps    PurpleWhiteboardUiOps
-
-#define gaim_whiteboard_set_ui_ops    purple_whiteboard_set_ui_ops
-#define gaim_whiteboard_set_prpl_ops  purple_whiteboard_set_prpl_ops
-
-#define gaim_whiteboard_create             purple_whiteboard_create
-#define gaim_whiteboard_destroy            purple_whiteboard_destroy
-#define gaim_whiteboard_start              purple_whiteboard_start
-#define gaim_whiteboard_get_session        purple_whiteboard_get_session
-#define gaim_whiteboard_draw_list_destroy  purple_whiteboard_draw_list_destroy
-#define gaim_whiteboard_get_dimensions     purple_whiteboard_get_dimensions
-#define gaim_whiteboard_set_dimensions     purple_whiteboard_set_dimensions
-#define gaim_whiteboard_draw_point         purple_whiteboard_draw_point
-#define gaim_whiteboard_send_draw_list     purple_whiteboard_send_draw_list
-#define gaim_whiteboard_draw_line          purple_whiteboard_draw_line
-#define gaim_whiteboard_clear              purple_whiteboard_clear
-#define gaim_whiteboard_send_clear         purple_whiteboard_send_clear
-#define gaim_whiteboard_send_brush         purple_whiteboard_send_brush
-#define gaim_whiteboard_get_brush          purple_whiteboard_get_brush
-#define gaim_whiteboard_set_brush          purple_whiteboard_set_brush
-
-/* for static plugins */
-#define gaim_init_ssl_plugin			purple_init_ssl_plugin
-#define gaim_init_ssl_openssl_plugin	purple_init_ssl_openssl_plugin
-#define gaim_init_ssl_gnutls_plugin		purple_init_ssl_gnutls_plugin
-#define gaim_init_gg_plugin				purple_init_gg_plugin
-#define gaim_init_jabber_plugin			purple_init_jabber_plugin
-#define gaim_init_sametime_plugin		purple_init_sametime_plugin
-#define gaim_init_msn_plugin			purple_init_msn_plugin
-#define gaim_init_novell_plugin			purple_init_novell_plugin
-#define gaim_init_qq_plugin				purple_init_qq_plugin
-#define gaim_init_simple_plugin			purple_init_simple_plugin
-#define gaim_init_yahoo_plugin			purple_init_yahoo_plugin
-#define gaim_init_zephyr_plugin			purple_init_zephyr_plugin
-#define gaim_init_aim_plugin			purple_init_aim_plugin
-#define gaim_init_icq_plugin			purple_init_icq_plugin
-
-#endif /* _GAIM_COMPAT_H_ */
--- a/libpurple/internal.h	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/internal.h	Sun Jun 12 17:56:24 2011 +0000
@@ -176,12 +176,6 @@
 void
 _purple_buddy_icons_blist_loaded_cb(void);
 
-/* This is for the purple_core_migrate() code to tell the buddy
- * icon subsystem about the old icons directory so it can
- * migrate any icons in use. */
-void
-_purple_buddy_icon_set_old_icons_dir(const char *dirname);
-
 /**
  * Creates a connection to the specified account and either connects
  * or attempts to register a new account.  If you are logging in,
--- a/libpurple/notify.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/notify.c	Sun Jun 12 17:56:24 2011 +0000
@@ -363,10 +363,26 @@
 
 	sc = g_new0(PurpleNotifySearchColumn, 1);
 	sc->title = g_strdup(title);
+	sc->visible = TRUE;
 
 	return sc;
 }
 
+void purple_notify_searchresult_column_set_visible(PurpleNotifySearchColumn *column, gboolean visible)
+{
+	g_return_if_fail(column != NULL);
+
+	column->visible = visible;
+}
+
+gboolean
+purple_notify_searchresult_column_is_visible(const PurpleNotifySearchColumn *column)
+{
+	g_return_val_if_fail(column != NULL, FALSE);
+
+	return column->visible;
+}
+
 guint
 purple_notify_searchresults_get_columns_count(PurpleNotifySearchResults *results)
 {
--- a/libpurple/notify.h	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/notify.h	Sun Jun 12 17:56:24 2011 +0000
@@ -111,7 +111,8 @@
  */
 typedef struct
 {
-	char *title; /**< Title of the column. */
+	char *title;           /**< Title of the column. */
+	gboolean visible;      /**< Should the column be visible to the user. Defaults to TRUE. */
 
 } PurpleNotifySearchColumn;
 
@@ -266,7 +267,8 @@
 PurpleNotifySearchResults *purple_notify_searchresults_new(void);
 
 /**
- * Returns a newly created search result column object.
+ * Returns a newly created search result column object.  The column defaults
+ * to being visible.
  *
  * @param title Title of the column. NOTE: Title will get g_strdup()ed.
  *
@@ -275,6 +277,23 @@
 PurpleNotifySearchColumn *purple_notify_searchresults_column_new(const char *title);
 
 /**
+ * Sets whether or not a search result column is visible.
+ *
+ * @param field   The search column object.
+ * @param visible TRUE if visible, or FALSE if not.
+ */
+void purple_notify_searchresult_column_set_visible(PurpleNotifySearchColumn *column, gboolean visible);
+
+/**
+ * Returns whether or not a search result column is visible.
+ *
+ * @param field The search column object.
+ *
+ * @return TRUE if the search result column is visible. FALSE otherwise.
+ */
+gboolean purple_notify_searchresult_column_is_visible(const PurpleNotifySearchColumn *column);
+
+/**
  * Adds a new column to the search result object.
  *
  * @param results The result object to which the column will be added.
--- a/libpurple/pounce.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/pounce.c	Sun Jun 12 17:56:24 2011 +0000
@@ -405,12 +405,8 @@
 	}
 
 	if (purple_strequal(element_name, "account")) {
-		char *tmp;
 		g_free(data->account_name);
 		data->account_name = g_strdup(buffer);
-		tmp = data->protocol_id;
-		data->protocol_id = g_strdup(_purple_oscar_convert(buffer, tmp));
-		g_free(tmp);
 	}
 	else if (purple_strequal(element_name, "pouncee")) {
 		g_free(data->pouncee);
--- a/libpurple/protocols/jabber/buddy.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/protocols/jabber/buddy.c	Sun Jun 12 17:56:24 2011 +0000
@@ -465,10 +465,22 @@
 	xmlnode *vc_node;
 	const struct tag_attr *tag_attr;
 
-	/* if we have't grabbed the remote vcard yet, we can't
+	/* if we haven't grabbed the remote vcard yet, we can't
 	 * assume that what we have here is correct */
-	if(!js->vcard_fetched)
+	if(!js->vcard_fetched) {
+		PurpleStoredImage *image;
+		g_free(js->initial_avatar_hash);
+		image = purple_buddy_icons_find_account_icon(purple_connection_get_account(gc));
+		if (image != NULL) {
+			js->initial_avatar_hash =
+					jabber_calculate_data_hash(purple_imgstore_get_data(image),
+					purple_imgstore_get_size(image), "sha1");
+			purple_imgstore_unref(image);
+		} else {
+			js->initial_avatar_hash = NULL;
+		}
 		return;
+	}
 
 	if (js->vcard_timer) {
 		purple_timeout_remove(js->vcard_timer);
--- a/libpurple/protocols/oscar/authorization.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/protocols/oscar/authorization.c	Sun Jun 12 17:56:24 2011 +0000
@@ -49,7 +49,7 @@
 		purple_debug_info("oscar", "ssi: adding buddy %s to group %s\n",
 				   bname, gname);
 		aim_ssi_sendauthrequest(od, bname, msg ? msg : _("Please authorize me so I can add you to my buddy list."));
-		if (!aim_ssi_itemlist_finditem(od->ssi.local, gname, bname, AIM_SSI_TYPE_BUDDY))
+		if (!aim_ssi_itemlist_finditem(&od->ssi.local, gname, bname, AIM_SSI_TYPE_BUDDY))
 		{
 			aim_ssi_addbuddy(od, bname, gname, NULL, purple_buddy_get_alias_only(buddy), NULL, NULL, TRUE);
 
--- a/libpurple/protocols/oscar/family_feedbag.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/protocols/oscar/family_feedbag.c	Sun Jun 12 17:56:24 2011 +0000
@@ -21,9 +21,9 @@
 /*
  * Family 0x0013 - Server-Side/Stored Information.
  *
- * Relatively new facility that allows certain types of information, such as
- * a user's buddy list, permit/deny list, and permit/deny preferences, to be
- * stored on the server, so that they can be accessed from any client.
+ * Deals with storing certain types of information, such as a user's buddy
+ * list, permit/deny list, and permit/deny preferences, on the server, so
+ * that they can be accessed from any client.
  *
  * We keep 2 copies of SSI data:
  * 1) An exact copy of what is stored on the AIM servers.
@@ -40,14 +40,41 @@
  *
  * This is entirely too complicated.
  * You don't know the half of it.
- *
  */
 
 #include "oscar.h"
+#include "oscarcommon.h"
 #include "debug.h"
 
 static int aim_ssi_addmoddel(OscarData *od);
 
+static void aim_ssi_item_free(struct aim_ssi_item *item)
+{
+	g_free(item->name);
+	aim_tlvlist_free(item->data);
+	g_free(item);
+}
+
+static void aim_ssi_item_set_name(struct aim_ssi_itemlist *list, struct aim_ssi_item *item, const char *name)
+{
+	gchar key[3000];
+
+	if (item->name) {
+		/* Remove old name from hash table */
+		snprintf(key, sizeof(key), "%hx%s", item->type, oscar_normalize(NULL, item->name));
+		g_hash_table_remove(list->idx_all_named_items, key);
+	}
+
+	g_free(item->name);
+	item->name = g_strdup(name);
+
+	if (name) {
+		/* Add new name to hash table */
+		snprintf(key, sizeof(key), "%hx%s", item->type, oscar_normalize(NULL, item->name));
+		g_hash_table_insert(list->idx_all_named_items, g_strdup(key), item);
+	}
+}
+
 /**
  * List types based on http://dev.aol.com/aim/oscar/#FEEDBAG (archive.org)
  * and http://iserverd.khstu.ru/oscar/ssi_item.html
@@ -112,7 +139,7 @@
  * @return Return a pointer to the modified item.
  */
 static void
-aim_ssi_itemlist_rebuildgroup(struct aim_ssi_item *list, const char *name)
+aim_ssi_itemlist_rebuildgroup(struct aim_ssi_itemlist *list, const char *name)
 {
 	int newlen;
 	struct aim_ssi_item *cur, *group;
@@ -124,11 +151,11 @@
 	/* Find the length for the new additional data */
 	newlen = 0;
 	if (group->gid == 0x0000) {
-		for (cur=list; cur; cur=cur->next)
+		for (cur=list->data; cur; cur=cur->next)
 			if ((cur->type == AIM_SSI_TYPE_GROUP) && (cur->gid != 0x0000))
 				newlen += 2;
 	} else {
-		for (cur=list; cur; cur=cur->next)
+		for (cur=list->data; cur; cur=cur->next)
 			if ((cur->gid == group->gid) && (cur->type == AIM_SSI_TYPE_BUDDY))
 				newlen += 2;
 	}
@@ -137,14 +164,14 @@
 	if (newlen > 0) {
 		guint8 *newdata;
 
-		newdata = (guint8 *)g_malloc((newlen)*sizeof(guint8));
+		newdata = g_new(guint8, newlen);
 		newlen = 0;
 		if (group->gid == 0x0000) {
-			for (cur=list; cur; cur=cur->next)
+			for (cur=list->data; cur; cur=cur->next)
 				if ((cur->type == AIM_SSI_TYPE_GROUP) && (cur->gid != 0x0000))
 						newlen += aimutil_put16(newdata+newlen, cur->gid);
 		} else {
-			for (cur=list; cur; cur=cur->next)
+			for (cur=list->data; cur; cur=cur->next)
 				if ((cur->gid == group->gid) && (cur->type == AIM_SSI_TYPE_BUDDY))
 						newlen += aimutil_put16(newdata+newlen, cur->bid);
 		}
@@ -166,15 +193,12 @@
  * @param data The additional data for the new item.
  * @return A pointer to the newly created item.
  */
-static struct aim_ssi_item *aim_ssi_itemlist_add(struct aim_ssi_item **list, const char *name, guint16 gid, guint16 bid, guint16 type, GSList *data)
+static struct aim_ssi_item *aim_ssi_itemlist_add(struct aim_ssi_itemlist *list, const char *name, guint16 gid, guint16 bid, guint16 type, GSList *data)
 {
 	gboolean exists;
 	struct aim_ssi_item *cur, *new;
 
-	new = g_new(struct aim_ssi_item, 1);
-
-	/* Set the name */
-	new->name = g_strdup(name);
+	new = g_new0(struct aim_ssi_item, 1);
 
 	/* Set the group ID# and buddy ID# */
 	new->gid = gid;
@@ -184,7 +208,7 @@
 			do {
 				new->gid += 0x0001;
 				exists = FALSE;
-				for (cur = *list; cur != NULL; cur = cur->next)
+				for (cur = list->data; cur != NULL; cur = cur->next)
 					if ((cur->type == AIM_SSI_TYPE_GROUP) && (cur->gid == new->gid)) {
 						exists = TRUE;
 						break;
@@ -201,7 +225,7 @@
 			do {
 				new->bid += 0x0001;
 				exists = FALSE;
-				for (cur = *list; cur != NULL; cur = cur->next)
+				for (cur = list->data; cur != NULL; cur = cur->next)
 					if (cur->bid == new->bid || cur->gid == new->bid) {
 						exists = TRUE;
 						break;
@@ -213,7 +237,7 @@
 			do {
 				new->bid += 0x0001;
 				exists = FALSE;
-				for (cur = *list; cur != NULL; cur = cur->next)
+				for (cur = list->data; cur != NULL; cur = cur->next)
 					if (cur->bid == new->bid && cur->gid == new->gid) {
 						exists = TRUE;
 						break;
@@ -225,23 +249,29 @@
 	/* Set the type */
 	new->type = type;
 
+	/* Add it to the gid+bid hashtable */
+	g_hash_table_insert(list->idx_gid_bid, GINT_TO_POINTER((new->gid << 16) + new->bid), new);
+
+	/* Set the name - do this *AFTER* setting the type because type is used for the key */
+	aim_ssi_item_set_name(list, new, name);
+
 	/* Set the TLV list */
 	new->data = aim_tlvlist_copy(data);
 
 	/* Add the item to the list in the correct numerical position.  Fancy, eh? */
-	if (*list) {
-		if ((new->gid < (*list)->gid) || ((new->gid == (*list)->gid) && (new->bid < (*list)->bid))) {
-			new->next = *list;
-			*list = new;
+	if (list->data) {
+		if ((new->gid < list->data->gid) || ((new->gid == list->data->gid) && (new->bid < list->data->bid))) {
+			new->next = list->data;
+			list->data = new;
 		} else {
 			struct aim_ssi_item *prev;
-			for ((prev=*list, cur=(*list)->next); (cur && ((new->gid > cur->gid) || ((new->gid == cur->gid) && (new->bid > cur->bid)))); prev=cur, cur=cur->next);
+			for ((prev=list->data, cur=list->data->next); (cur && ((new->gid > cur->gid) || ((new->gid == cur->gid) && (new->bid > cur->bid)))); prev=cur, cur=cur->next);
 			new->next = prev->next;
 			prev->next = new;
 		}
 	} else {
-		new->next = *list;
-		*list = new;
+		new->next = list->data;
+		list->data = new;
 	}
 
 	return new;
@@ -254,25 +284,31 @@
  * @param del A pointer to the item you want to remove from the list.
  * @return Return 0 if no errors, otherwise return the error number.
  */
-static int aim_ssi_itemlist_del(struct aim_ssi_item **list, struct aim_ssi_item *del)
+static int aim_ssi_itemlist_del(struct aim_ssi_itemlist *list, struct aim_ssi_item *del)
 {
-	if (!(*list) || !del)
+	gchar key[3000];
+
+	if (!(list->data) || !del)
 		return -EINVAL;
 
 	/* Remove the item from the list */
-	if (*list == del) {
-		*list = (*list)->next;
+	if (list->data == del) {
+		list->data = list->data->next;
 	} else {
 		struct aim_ssi_item *cur;
-		for (cur=*list; (cur->next && (cur->next!=del)); cur=cur->next);
+		for (cur=list->data; (cur->next && (cur->next!=del)); cur=cur->next);
 		if (cur->next)
 			cur->next = del->next;
 	}
 
+	/* Remove from the hashtables */
+	g_hash_table_remove(list->idx_gid_bid, GINT_TO_POINTER((del->gid << 16) + del->bid));
+
+	snprintf(key, sizeof(key), "%hx%s", del->type, oscar_normalize(NULL, del->name));
+	g_hash_table_remove(list->idx_all_named_items, key);
+
 	/* Free the removed item */
-	g_free(del->name);
-	aim_tlvlist_free(del->data);
-	g_free(del);
+	aim_ssi_item_free(del);
 
 	return 0;
 }
@@ -319,10 +355,10 @@
 	return 0;
 }
 
-static gboolean aim_ssi_itemlist_valid(struct aim_ssi_item *list, struct aim_ssi_item *item)
+static gboolean aim_ssi_itemlist_valid(struct aim_ssi_itemlist *list, struct aim_ssi_item *item)
 {
 	struct aim_ssi_item *cur;
-	for (cur=list; cur; cur=cur->next)
+	for (cur=list->data; cur; cur=cur->next)
 		if (cur == item)
 			return TRUE;
 	return FALSE;
@@ -336,13 +372,10 @@
  * @param bid The buddy ID# of the desired item.
  * @return Return a pointer to the item if found, else return NULL;
  */
-struct aim_ssi_item *aim_ssi_itemlist_find(struct aim_ssi_item *list, guint16 gid, guint16 bid)
+struct aim_ssi_item *aim_ssi_itemlist_find(struct aim_ssi_itemlist *list, guint16 gid, guint16 bid)
 {
-	struct aim_ssi_item *cur;
-	for (cur=list; cur; cur=cur->next)
-		if ((cur->gid == gid) && (cur->bid == bid))
-			return cur;
-	return NULL;
+	guint32 id_key = (gid << 16) + bid;
+	return g_hash_table_lookup(list->idx_gid_bid, GINT_TO_POINTER(id_key));
 }
 
 /**
@@ -355,37 +388,30 @@
  * @param type The type of the desired item.
  * @return Return a pointer to the item if found, else return NULL.
  */
-struct aim_ssi_item *aim_ssi_itemlist_finditem(struct aim_ssi_item *list, const char *gn, const char *bn, guint16 type)
+struct aim_ssi_item *aim_ssi_itemlist_finditem(struct aim_ssi_itemlist *list, const char *gn, const char *bn, guint16 type)
 {
 	struct aim_ssi_item *cur;
-	if (!list)
+	gchar key[3000];
+
+	if (!list->data)
 		return NULL;
 
 	if (gn && bn) { /* For finding buddies in groups */
-		for (cur=list; cur; cur=cur->next)
+		g_return_val_if_fail(type == AIM_SSI_TYPE_BUDDY, NULL);
+		for (cur=list->data; cur; cur=cur->next)
 			if ((cur->type == type) && (cur->name) && !(oscar_util_name_compare(cur->name, bn))) {
 				struct aim_ssi_item *curg;
-				for (curg=list; curg; curg=curg->next)
+				for (curg=list->data; curg; curg=curg->next)
 					if ((curg->type == AIM_SSI_TYPE_GROUP) && (curg->gid == cur->gid) && (curg->name) && !(oscar_util_name_compare(curg->name, gn)))
 						return cur;
 			}
 
-	} else if (gn) { /* For finding groups */
-		for (cur=list; cur; cur=cur->next) {
-			if ((cur->type == type) && (cur->bid == 0x0000) && (cur->name) && !(oscar_util_name_compare(cur->name, gn))) {
-				return cur;
-			}
-		}
-
-	} else if (bn) { /* For finding permits, denies, and ignores */
-		for (cur=list; cur; cur=cur->next) {
-			if ((cur->type == type) && (cur->name) && !(oscar_util_name_compare(cur->name, bn))) {
-				return cur;
-			}
-		}
+	} else if (gn || bn) { /* For finding groups, permits, denies and ignores */
+		snprintf(key, sizeof(key), "%hx%s", type, oscar_normalize(NULL, gn ? gn : bn));
+		return g_hash_table_lookup(list->idx_all_named_items, key);
 
 	/* For stuff without names--permit deny setting, visibility mask, etc. */
-	} else for (cur=list; cur; cur=cur->next) {
+	} else for (cur=list->data; cur; cur=cur->next) {
 		if ((cur->type == type) && (!cur->name))
 			return cur;
 	}
@@ -400,7 +426,7 @@
  * @param bn The group name of the desired item.
  * @return Return a pointer to the name of the item if found, else return NULL;
  */
-struct aim_ssi_item *aim_ssi_itemlist_exists(struct aim_ssi_item *list, const char *bn)
+struct aim_ssi_item *aim_ssi_itemlist_exists(struct aim_ssi_itemlist *list, const char *bn)
 {
 	if (!bn)
 		return NULL;
@@ -414,10 +440,10 @@
  * @param bn The buddy name of the desired item.
  * @return Return a pointer to the name of the item if found, else return NULL;
  */
-char *aim_ssi_itemlist_findparentname(struct aim_ssi_item *list, const char *bn)
+char *aim_ssi_itemlist_findparentname(struct aim_ssi_itemlist *list, const char *bn)
 {
 	struct aim_ssi_item *cur, *curg;
-	if (!list || !bn)
+	if (!list->data || !bn)
 		return NULL;
 	if (!(cur = aim_ssi_itemlist_exists(list, bn)))
 		return NULL;
@@ -432,7 +458,7 @@
  * @param list A pointer to the current list of items.
  * @return Return the current SSI permit deny setting, or 0 if no setting was found.
  */
-int aim_ssi_getpermdeny(struct aim_ssi_item *list)
+int aim_ssi_getpermdeny(struct aim_ssi_itemlist *list)
 {
 	struct aim_ssi_item *cur = aim_ssi_itemlist_finditem(list, NULL, NULL, AIM_SSI_TYPE_PDINFO);
 	if (cur) {
@@ -450,7 +476,7 @@
  * @param list A pointer to the current list of items.
  * @return Return the current set of preferences.
  */
-guint32 aim_ssi_getpresence(struct aim_ssi_item *list)
+guint32 aim_ssi_getpresence(struct aim_ssi_itemlist *list)
 {
 	struct aim_ssi_item *cur = aim_ssi_itemlist_finditem(list, NULL, NULL, AIM_SSI_TYPE_PRESENCEPREFS);
 	if (cur) {
@@ -471,17 +497,23 @@
  *         alias, or NULL if the buddy has no alias.  You should free
  *         this returned value!
  */
-char *aim_ssi_getalias(struct aim_ssi_item *list, const char *gn, const char *bn)
+char *aim_ssi_getalias(struct aim_ssi_itemlist *list, const char *gn, const char *bn)
 {
-	struct aim_ssi_item *cur = aim_ssi_itemlist_finditem(list, gn, bn, AIM_SSI_TYPE_BUDDY);
-	if (cur) {
-		aim_tlv_t *tlv = aim_tlv_gettlv(cur->data, 0x0131, 1);
-		if (tlv && tlv->length)
-			return g_strndup((const gchar *)tlv->value, tlv->length);
+	struct aim_ssi_item *item = aim_ssi_itemlist_finditem(list, gn, bn, AIM_SSI_TYPE_BUDDY);
+	if (item) {
+		return aim_ssi_getalias_from_item(item);
 	}
 	return NULL;
 }
 
+char *aim_ssi_getalias_from_item(struct aim_ssi_item *item)
+{
+	aim_tlv_t *tlv = aim_tlv_gettlv(item->data, 0x0131, 1);
+	if (tlv && tlv->length)
+		return g_strndup((const gchar *)tlv->value, tlv->length);
+	return NULL;
+}
+
 /**
  * Locally find the comment of the given buddy.
  *
@@ -492,7 +524,7 @@
  *         comment, or NULL if the buddy has no comment.  You should free
  *         this returned value!
  */
-char *aim_ssi_getcomment(struct aim_ssi_item *list, const char *gn, const char *bn)
+char *aim_ssi_getcomment(struct aim_ssi_itemlist *list, const char *gn, const char *bn)
 {
 	struct aim_ssi_item *cur = aim_ssi_itemlist_finditem(list, gn, bn, AIM_SSI_TYPE_BUDDY);
 	if (cur) {
@@ -512,7 +544,7 @@
  * @param bn The name of the buddy.
  * @return 1 if you are waiting for authorization; 0 if you are not
  */
-gboolean aim_ssi_waitingforauth(struct aim_ssi_item *list, const char *gn, const char *bn)
+gboolean aim_ssi_waitingforauth(struct aim_ssi_itemlist *list, const char *gn, const char *bn)
 {
 	struct aim_ssi_item *cur = aim_ssi_itemlist_finditem(list, gn, bn, AIM_SSI_TYPE_BUDDY);
 	if (cur) {
@@ -560,8 +592,8 @@
 
 	/* Deletions */
 	if (!od->ssi.pending) {
-		for (cur1=od->ssi.official; cur1 && (n < 15); cur1=cur1->next) {
-			if (!aim_ssi_itemlist_find(od->ssi.local, cur1->gid, cur1->bid)) {
+		for (cur1=od->ssi.official.data; cur1 && (n < 15); cur1=cur1->next) {
+			if (!aim_ssi_itemlist_find(&od->ssi.local, cur1->gid, cur1->bid)) {
 				n++;
 				new = g_new(struct aim_ssi_tmp, 1);
 				new->action = SNAC_SUBTYPE_FEEDBAG_DEL;
@@ -574,15 +606,15 @@
 					cur->next = new;
 				} else
 					od->ssi.pending = new;
-			       	aim_ssi_item_debug_append(debugstr, "Deleting item ", cur1);
+					aim_ssi_item_debug_append(debugstr, "Deleting item ", cur1);
 			}
 		}
 	}
 
 	/* Additions */
 	if (!od->ssi.pending) {
-		for (cur1=od->ssi.local; cur1 && (n < 15); cur1=cur1->next) {
-			if (!aim_ssi_itemlist_find(od->ssi.official, cur1->gid, cur1->bid)) {
+		for (cur1=od->ssi.local.data; cur1 && (n < 15); cur1=cur1->next) {
+			if (!aim_ssi_itemlist_find(&od->ssi.official, cur1->gid, cur1->bid)) {
 				n++;
 				new = g_new(struct aim_ssi_tmp, 1);
 				new->action = SNAC_SUBTYPE_FEEDBAG_ADD;
@@ -595,15 +627,15 @@
 					cur->next = new;
 				} else
 					od->ssi.pending = new;
-			       	aim_ssi_item_debug_append(debugstr, "Adding item ", cur1);
+					aim_ssi_item_debug_append(debugstr, "Adding item ", cur1);
 			}
 		}
 	}
 
 	/* Modifications */
 	if (!od->ssi.pending) {
-		for (cur1=od->ssi.local; cur1 && (n < 15); cur1=cur1->next) {
-			cur2 = aim_ssi_itemlist_find(od->ssi.official, cur1->gid, cur1->bid);
+		for (cur1=od->ssi.local.data; cur1 && (n < 15); cur1=cur1->next) {
+			cur2 = aim_ssi_itemlist_find(&od->ssi.official, cur1->gid, cur1->bid);
 			if (cur2 && (aim_ssi_itemlist_cmp(cur1, cur2))) {
 				n++;
 				new = g_new(struct aim_ssi_tmp, 1);
@@ -617,15 +649,15 @@
 					cur->next = new;
 				} else
 					od->ssi.pending = new;
-			       	aim_ssi_item_debug_append(debugstr, "Modifying item ", cur1);
+					aim_ssi_item_debug_append(debugstr, "Modifying item ", cur1);
 			}
 		}
 	}
 	if (debugstr->len > 0) {
 		purple_debug_info("oscar", "%s", debugstr->str);
 		if (purple_debug_is_verbose()) {
-	    		g_string_truncate(debugstr, 0);
-			for (cur1 = od->ssi.local; cur1; cur1 = cur1->next) 
+			g_string_truncate(debugstr, 0);
+			for (cur1 = od->ssi.local.data; cur1; cur1 = cur1->next)
 				aim_ssi_item_debug_append(debugstr, "\t", cur1);
 			purple_debug_misc("oscar", "Dumping item list of account %s:\n%s",
 				purple_connection_get_account(od->gc)->username, debugstr->str);
@@ -672,22 +704,18 @@
 	struct aim_ssi_item *cur, *del;
 	struct aim_ssi_tmp *curtmp, *deltmp;
 
-	cur = od->ssi.official;
+	cur = od->ssi.official.data;
 	while (cur) {
 		del = cur;
 		cur = cur->next;
-		g_free(del->name);
-		aim_tlvlist_free(del->data);
-		g_free(del);
+		aim_ssi_item_free(del);
 	}
 
-	cur = od->ssi.local;
+	cur = od->ssi.local.data;
 	while (cur) {
 		del = cur;
 		cur = cur->next;
-		g_free(del->name);
-		aim_tlvlist_free(del->data);
-		g_free(del);
+		aim_ssi_item_free(del);
 	}
 
 	curtmp = od->ssi.pending;
@@ -698,8 +726,8 @@
 	}
 
 	od->ssi.numitems = 0;
-	od->ssi.official = NULL;
-	od->ssi.local = NULL;
+	od->ssi.official.data = NULL;
+	od->ssi.local.data = NULL;
 	od->ssi.pending = NULL;
 	od->ssi.timestamp = (time_t)0;
 }
@@ -725,7 +753,7 @@
 	/* DESTROY any buddies that are directly in the master group. */
 	/* Do the same for buddies that are in a non-existant group. */
 	/* This will kind of mess up if you hit the item limit, but this function isn't too critical */
-	cur = od->ssi.local;
+	cur = od->ssi.local.data;
 	while (cur) {
 		next = cur->next;
 		if (!cur->name) {
@@ -733,8 +761,8 @@
 				aim_ssi_delbuddy(od, NULL, NULL);
 			else if (cur->type == AIM_SSI_TYPE_PERMIT || cur->type == AIM_SSI_TYPE_DENY || cur->type == AIM_SSI_TYPE_ICQDENY)
 				aim_ssi_del_from_private_list(od, NULL, cur->type);
-		} else if ((cur->type == AIM_SSI_TYPE_BUDDY) && ((cur->gid == 0x0000) || (!aim_ssi_itemlist_find(od->ssi.local, cur->gid, 0x0000)))) {
-			char *alias = aim_ssi_getalias(od->ssi.local, NULL, cur->name);
+		} else if ((cur->type == AIM_SSI_TYPE_BUDDY) && ((cur->gid == 0x0000) || (!aim_ssi_itemlist_find(&od->ssi.local, cur->gid, 0x0000)))) {
+			char *alias = aim_ssi_getalias(&od->ssi.local, NULL, cur->name);
 			aim_ssi_addbuddy(od, cur->name, "orphans", NULL, alias, NULL, NULL, FALSE);
 			aim_ssi_delbuddy(od, cur->name, NULL);
 			g_free(alias);
@@ -743,7 +771,7 @@
 	}
 
 	/* Make sure there aren't any duplicate buddies in a group, or duplicate permits or denies */
-	cur = od->ssi.local;
+	cur = od->ssi.local.data;
 	while (cur) {
 		if ((cur->type == AIM_SSI_TYPE_BUDDY) || (cur->type == AIM_SSI_TYPE_PERMIT) || (cur->type == AIM_SSI_TYPE_DENY))
 		{
@@ -784,16 +812,16 @@
 		return -EINVAL;
 
 	/* Find the parent */
-	if (!(parent = aim_ssi_itemlist_finditem(od->ssi.local, group, NULL, AIM_SSI_TYPE_GROUP))) {
+	if (!(parent = aim_ssi_itemlist_finditem(&od->ssi.local, group, NULL, AIM_SSI_TYPE_GROUP))) {
 		/* Find the parent's parent (the master group) */
-		if (aim_ssi_itemlist_find(od->ssi.local, 0x0000, 0x0000) == NULL)
+		if (aim_ssi_itemlist_find(&od->ssi.local, 0x0000, 0x0000) == NULL)
 			aim_ssi_itemlist_add(&od->ssi.local, NULL, 0x0000, 0x0000, AIM_SSI_TYPE_GROUP, NULL);
 
 		/* Add the parent */
 		parent = aim_ssi_itemlist_add(&od->ssi.local, group, 0xFFFF, 0x0000, AIM_SSI_TYPE_GROUP, NULL);
 
 		/* Modify the parent's parent (the master group) */
-		aim_ssi_itemlist_rebuildgroup(od->ssi.local, NULL);
+		aim_ssi_itemlist_rebuildgroup(&od->ssi.local, NULL);
 	}
 
 	/* Create a TLV list for the new buddy */
@@ -811,7 +839,7 @@
 	aim_tlvlist_free(data);
 
 	/* Modify the parent group */
-	aim_ssi_itemlist_rebuildgroup(od->ssi.local, group);
+	aim_ssi_itemlist_rebuildgroup(&od->ssi.local, group);
 
 	/* Sync our local list with the server list */
 	return aim_ssi_sync(od);
@@ -823,7 +851,7 @@
 	if (!od || !name || !od->ssi.received_data)
 		return -EINVAL;
 
-	if (aim_ssi_itemlist_find(od->ssi.local, 0x0000, 0x0000) == NULL)
+	if (aim_ssi_itemlist_find(&od->ssi.local, 0x0000, 0x0000) == NULL)
 		aim_ssi_itemlist_add(&od->ssi.local, NULL, 0x0000, 0x0000, AIM_SSI_TYPE_GROUP, NULL);
 
 	aim_ssi_itemlist_add(&od->ssi.local, name, 0x0000, 0xFFFF, list_type, NULL);
@@ -838,7 +866,7 @@
 	if (!od)
 		return -EINVAL;
 
-	if (!(del = aim_ssi_itemlist_finditem(od->ssi.local, NULL, name, list_type)))
+	if (!(del = aim_ssi_itemlist_finditem(&od->ssi.local, NULL, name, list_type)))
 		return -EINVAL;
 
 	aim_ssi_itemlist_del(&od->ssi.local, del);
@@ -861,14 +889,14 @@
 		return -EINVAL;
 
 	/* Find the buddy */
-	if (!(del = aim_ssi_itemlist_finditem(od->ssi.local, group, name, AIM_SSI_TYPE_BUDDY)))
+	if (!(del = aim_ssi_itemlist_finditem(&od->ssi.local, group, name, AIM_SSI_TYPE_BUDDY)))
 		return -EINVAL;
 
 	/* Remove the item from the list */
 	aim_ssi_itemlist_del(&od->ssi.local, del);
 
 	/* Modify the parent group */
-	aim_ssi_itemlist_rebuildgroup(od->ssi.local, group);
+	aim_ssi_itemlist_rebuildgroup(&od->ssi.local, group);
 
 	/* Sync our local list with the server list */
 	return aim_ssi_sync(od);
@@ -890,7 +918,7 @@
 		return -EINVAL;
 
 	/* Find the group */
-	if (!(del = aim_ssi_itemlist_finditem(od->ssi.local, group, NULL, AIM_SSI_TYPE_GROUP)))
+	if (!(del = aim_ssi_itemlist_finditem(&od->ssi.local, group, NULL, AIM_SSI_TYPE_GROUP)))
 		return -EINVAL;
 
 	/* Don't delete the group if it's not empty */
@@ -902,7 +930,7 @@
 	aim_ssi_itemlist_del(&od->ssi.local, del);
 
 	/* Modify the parent group */
-	aim_ssi_itemlist_rebuildgroup(od->ssi.local, group);
+	aim_ssi_itemlist_rebuildgroup(&od->ssi.local, group);
 
 	/* Sync our local list with the server list */
 	return aim_ssi_sync(od);
@@ -924,7 +952,7 @@
 	GSList *data;
 
 	/* Find the buddy */
-	buddy = aim_ssi_itemlist_finditem(od->ssi.local, oldgn, bn, AIM_SSI_TYPE_BUDDY);
+	buddy = aim_ssi_itemlist_finditem(&od->ssi.local, oldgn, bn, AIM_SSI_TYPE_BUDDY);
 	if (buddy == NULL)
 		return -EINVAL;
 
@@ -957,7 +985,7 @@
 	if (!od || !gn || !bn)
 		return -EINVAL;
 
-	if (!(tmp = aim_ssi_itemlist_finditem(od->ssi.local, gn, bn, AIM_SSI_TYPE_BUDDY)))
+	if (!(tmp = aim_ssi_itemlist_finditem(&od->ssi.local, gn, bn, AIM_SSI_TYPE_BUDDY)))
 		return -EINVAL;
 
 	/* Either add or remove the 0x0131 TLV from the TLV chain */
@@ -987,7 +1015,7 @@
 	if (!od || !gn || !bn)
 		return -EINVAL;
 
-	if (!(tmp = aim_ssi_itemlist_finditem(od->ssi.local, gn, bn, AIM_SSI_TYPE_BUDDY)))
+	if (!(tmp = aim_ssi_itemlist_finditem(&od->ssi.local, gn, bn, AIM_SSI_TYPE_BUDDY)))
 		return -EINVAL;
 
 	/* Either add or remove the 0x0131 TLV from the TLV chain */
@@ -1015,11 +1043,10 @@
 	if (!od || !oldgn || !newgn)
 		return -EINVAL;
 
-	if (!(group = aim_ssi_itemlist_finditem(od->ssi.local, oldgn, NULL, AIM_SSI_TYPE_GROUP)))
+	if (!(group = aim_ssi_itemlist_finditem(&od->ssi.local, oldgn, NULL, AIM_SSI_TYPE_GROUP)))
 		return -EINVAL;
 
-	g_free(group->name);
-	group->name = g_strdup(newgn);
+	aim_ssi_item_set_name(&od->ssi.local, group, newgn);
 
 	/* Sync our local list with the server list */
 	return aim_ssi_sync(od);
@@ -1046,9 +1073,9 @@
 		return -EINVAL;
 
 	/* Find the PDINFO item, or add it if it does not exist */
-	if (!(tmp = aim_ssi_itemlist_finditem(od->ssi.local, NULL, NULL, AIM_SSI_TYPE_PDINFO))) {
+	if (!(tmp = aim_ssi_itemlist_finditem(&od->ssi.local, NULL, NULL, AIM_SSI_TYPE_PDINFO))) {
 		/* Make sure the master group exists */
-		if (aim_ssi_itemlist_find(od->ssi.local, 0x0000, 0x0000) == NULL)
+		if (aim_ssi_itemlist_find(&od->ssi.local, 0x0000, 0x0000) == NULL)
 			aim_ssi_itemlist_add(&od->ssi.local, NULL, 0x0000, 0x0000, AIM_SSI_TYPE_GROUP, NULL);
 
 		tmp = aim_ssi_itemlist_add(&od->ssi.local, NULL, 0x0000, 0xFFFF, AIM_SSI_TYPE_PDINFO, NULL);
@@ -1078,9 +1105,9 @@
 		return -EINVAL;
 
 	/* Find the ICONINFO item, or add it if it does not exist */
-	if (!(tmp = aim_ssi_itemlist_finditem(od->ssi.local, NULL, "1", AIM_SSI_TYPE_ICONINFO))) {
+	if (!(tmp = aim_ssi_itemlist_finditem(&od->ssi.local, NULL, "1", AIM_SSI_TYPE_ICONINFO))) {
 		/* Make sure the master group exists */
-		if (aim_ssi_itemlist_find(od->ssi.local, 0x0000, 0x0000) == NULL)
+		if (aim_ssi_itemlist_find(&od->ssi.local, 0x0000, 0x0000) == NULL)
 			aim_ssi_itemlist_add(&od->ssi.local, NULL, 0x0000, 0x0000, AIM_SSI_TYPE_GROUP, NULL);
 
 		tmp = aim_ssi_itemlist_add(&od->ssi.local, "1", 0x0000, 0xFFFF, AIM_SSI_TYPE_ICONINFO, NULL);
@@ -1138,9 +1165,9 @@
 		return -EINVAL;
 
 	/* Find the PRESENCEPREFS item, or add it if it does not exist */
-	if (!(tmp = aim_ssi_itemlist_finditem(od->ssi.local, NULL, NULL, AIM_SSI_TYPE_PRESENCEPREFS))) {
+	if (!(tmp = aim_ssi_itemlist_finditem(&od->ssi.local, NULL, NULL, AIM_SSI_TYPE_PRESENCEPREFS))) {
 		/* Make sure the master group exists */
-		if (aim_ssi_itemlist_find(od->ssi.local, 0x0000, 0x0000) == NULL)
+		if (aim_ssi_itemlist_find(&od->ssi.local, 0x0000, 0x0000) == NULL)
 			aim_ssi_itemlist_add(&od->ssi.local, NULL, 0x0000, 0x0000, AIM_SSI_TYPE_GROUP, NULL);
 
 		tmp = aim_ssi_itemlist_add(&od->ssi.local, NULL, 0x0000, 0xFFFF, AIM_SSI_TYPE_PRESENCEPREFS, NULL);
@@ -1265,7 +1292,7 @@
 	if (!(snac->flags & 0x0001)) {
 		/* Make a copy of the list */
 		struct aim_ssi_item *cur;
-		for (cur=od->ssi.official; cur; cur=cur->next)
+		for (cur=od->ssi.official.data; cur; cur=cur->next)
 			aim_ssi_itemlist_add(&od->ssi.local, cur->name, cur->gid, cur->bid, cur->type, cur->data);
 
 		od->ssi.received_data = TRUE;
@@ -1415,18 +1442,16 @@
 			data = NULL;
 
 		/* Replace the 2 local items with the given one */
-		if ((item = aim_ssi_itemlist_find(od->ssi.local, gid, bid))) {
+		if ((item = aim_ssi_itemlist_find(&od->ssi.local, gid, bid))) {
 			item->type = type;
-			g_free(item->name);
-			item->name = g_strdup(name);
+			aim_ssi_item_set_name(&od->ssi.local, item, name);
 			aim_tlvlist_free(item->data);
 			item->data = aim_tlvlist_copy(data);
 		}
 
-		if ((item = aim_ssi_itemlist_find(od->ssi.official, gid, bid))) {
+		if ((item = aim_ssi_itemlist_find(&od->ssi.official, gid, bid))) {
 			item->type = type;
-			g_free(item->name);
-			item->name = g_strdup(name);
+			aim_ssi_item_set_name(&od->ssi.official, item, name);
 			aim_tlvlist_free(item->data);
 			item->data = aim_tlvlist_copy(data);
 		}
@@ -1460,9 +1485,9 @@
 		byte_stream_get16(bs);
 		byte_stream_advance(bs, byte_stream_get16(bs));
 
-		if ((del = aim_ssi_itemlist_find(od->ssi.local, gid, bid)))
+		if ((del = aim_ssi_itemlist_find(&od->ssi.local, gid, bid)))
 			aim_ssi_itemlist_del(&od->ssi.local, del);
-		if ((del = aim_ssi_itemlist_find(od->ssi.official, gid, bid)))
+		if ((del = aim_ssi_itemlist_find(&od->ssi.official, gid, bid)))
 			aim_ssi_itemlist_del(&od->ssi.official, del);
 
 		if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
@@ -1503,7 +1528,8 @@
 			if (cur->action == SNAC_SUBTYPE_FEEDBAG_ADD) {
 				/* Remove the item from the local list */
 				/* Make sure cur->item is still valid memory */
-				if (aim_ssi_itemlist_valid(od->ssi.local, cur->item)) {
+				/* TODO: "Still valid memory"?  That's bad form. */
+				if (aim_ssi_itemlist_valid(&od->ssi.local, cur->item)) {
 					cur->name = g_strdup(cur->item->name);
 					aim_ssi_itemlist_del(&od->ssi.local, cur->item);
 				}
@@ -1511,11 +1537,10 @@
 
 			} else if (cur->action == SNAC_SUBTYPE_FEEDBAG_MOD) {
 				/* Replace the local item with the item from the official list */
-				if (aim_ssi_itemlist_valid(od->ssi.local, cur->item)) {
+				if (aim_ssi_itemlist_valid(&od->ssi.local, cur->item)) {
 					struct aim_ssi_item *cur1;
-					if ((cur1 = aim_ssi_itemlist_find(od->ssi.official, cur->item->gid, cur->item->bid))) {
-						g_free(cur->item->name);
-						cur->item->name = g_strdup(cur1->name);
+					if ((cur1 = aim_ssi_itemlist_find(&od->ssi.official, cur->item->gid, cur->item->bid))) {
+						aim_ssi_item_set_name(&od->ssi.official, cur->item, cur1->name);
 						aim_tlvlist_free(cur->item->data);
 						cur->item->data = aim_tlvlist_copy(cur1->data);
 					}
@@ -1524,7 +1549,7 @@
 
 			} else if (cur->action == SNAC_SUBTYPE_FEEDBAG_DEL) {
 				/* Add the item back into the local list */
-				if (aim_ssi_itemlist_valid(od->ssi.official, cur->item)) {
+				if (aim_ssi_itemlist_valid(&od->ssi.official, cur->item)) {
 					aim_ssi_itemlist_add(&od->ssi.local, cur->item->name, cur->item->gid, cur->item->bid, cur->item->type, cur->item->data);
 				} else
 					cur->item = NULL;
@@ -1534,18 +1559,17 @@
 			/* Do the exact opposite */
 			if (cur->action == SNAC_SUBTYPE_FEEDBAG_ADD) {
 			/* Add the local item to the official list */
-				if (aim_ssi_itemlist_valid(od->ssi.local, cur->item)) {
+				if (aim_ssi_itemlist_valid(&od->ssi.local, cur->item)) {
 					aim_ssi_itemlist_add(&od->ssi.official, cur->item->name, cur->item->gid, cur->item->bid, cur->item->type, cur->item->data);
 				} else
 					cur->item = NULL;
 
 			} else if (cur->action == SNAC_SUBTYPE_FEEDBAG_MOD) {
 				/* Replace the official item with the item from the local list */
-				if (aim_ssi_itemlist_valid(od->ssi.local, cur->item)) {
+				if (aim_ssi_itemlist_valid(&od->ssi.local, cur->item)) {
 					struct aim_ssi_item *cur1;
-					if ((cur1 = aim_ssi_itemlist_find(od->ssi.official, cur->item->gid, cur->item->bid))) {
-						g_free(cur1->name);
-						cur1->name = g_strdup(cur->item->name);
+					if ((cur1 = aim_ssi_itemlist_find(&od->ssi.official, cur->item->gid, cur->item->bid))) {
+						aim_ssi_item_set_name(&od->ssi.official, cur1, cur->item->name);
 						aim_tlvlist_free(cur1->data);
 						cur1->data = aim_tlvlist_copy(cur->item->data);
 					}
@@ -1554,7 +1578,7 @@
 
 			} else if (cur->action == SNAC_SUBTYPE_FEEDBAG_DEL) {
 				/* Remove the item from the official list */
-				if (aim_ssi_itemlist_valid(od->ssi.official, cur->item))
+				if (aim_ssi_itemlist_valid(&od->ssi.official, cur->item))
 					aim_ssi_itemlist_del(&od->ssi.official, cur->item);
 				cur->item = NULL;
 			}
--- a/libpurple/protocols/oscar/oscar.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/protocols/oscar/oscar.c	Sun Jun 12 17:56:24 2011 +0000
@@ -578,7 +578,7 @@
 	gc = data;
 	od = purple_connection_get_protocol_data(gc);
 	report_idle = strcmp((const char *)value, "none") != 0;
-	presence = aim_ssi_getpresence(od->ssi.local);
+	presence = aim_ssi_getpresence(&od->ssi.local);
 
 	if (report_idle)
 		aim_ssi_setpresence(od, presence | AIM_SSI_PRESENCE_FLAG_SHOWIDLE);
@@ -600,7 +600,7 @@
 
 	gc = data;
 	od = purple_connection_get_protocol_data(gc);
-	presence = aim_ssi_getpresence(od->ssi.local);
+	presence = aim_ssi_getpresence(&od->ssi.local);
 
 	if (value)
 		aim_ssi_setpresence(od, presence & ~AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES);
@@ -741,7 +741,7 @@
 	}
 
 	gc->flags |= PURPLE_CONNECTION_HTML;
-	if (oscar_util_valid_name_icq((purple_account_get_username(account)))) {
+	if (g_str_equal(purple_account_get_protocol_id(account), "prpl-icq")) {
 		od->icq = TRUE;
 		gc->flags |= PURPLE_CONNECTION_SUPPORT_MOODS;
 	} else {
@@ -3712,7 +3712,7 @@
 	}
 
 	if (od->ssi.received_data) {
-		if (!aim_ssi_itemlist_finditem(od->ssi.local, gname, bname, AIM_SSI_TYPE_BUDDY)) {
+		if (!aim_ssi_itemlist_finditem(&od->ssi.local, gname, bname, AIM_SSI_TYPE_BUDDY)) {
 			purple_debug_info("oscar",
 					   "ssi: adding buddy %s to group %s\n", bname, gname);
 			aim_ssi_addbuddy(od, bname, gname, NULL, purple_buddy_get_alias_only(buddy), NULL, NULL, 0);
@@ -3724,8 +3724,8 @@
 				purple_prpl_got_user_status(account, bname,
 						OSCAR_STATUS_ID_MOBILE, NULL);
 			}
-		} else if (aim_ssi_waitingforauth(od->ssi.local,
-		                                  aim_ssi_itemlist_findparentname(od->ssi.local, bname),
+		} else if (aim_ssi_waitingforauth(&od->ssi.local,
+		                                  aim_ssi_itemlist_findparentname(&od->ssi.local, bname),
 		                                  bname)) {
 			/* Not authorized -- Re-request authorization */
 			oscar_auth_sendrequest(gc, bname, msg);
@@ -3763,7 +3763,7 @@
 	OscarData *od = purple_connection_get_protocol_data(gc);
 
 	if (od->ssi.received_data) {
-		char *gname = aim_ssi_itemlist_findparentname(od->ssi.local, name);
+		char *gname = aim_ssi_itemlist_findparentname(&od->ssi.local, name);
 		if (gname) {
 			purple_debug_info("oscar",
 					   "ssi: changing the alias for buddy %s to %s\n", name, alias ? alias : "(none)");
@@ -3780,7 +3780,7 @@
 
 	if (od->ssi.received_data) {
 		const char *gname = purple_group_get_name(group);
-		if (aim_ssi_itemlist_finditem(od->ssi.local, gname, NULL, AIM_SSI_TYPE_GROUP)) {
+		if (aim_ssi_itemlist_finditem(&od->ssi.local, gname, NULL, AIM_SSI_TYPE_GROUP)) {
 			GList *cur, *groups = NULL;
 			PurpleAccount *account = purple_connection_get_account(gc);
 
@@ -3931,7 +3931,7 @@
 		gname = purple_group_get_name(g);
 		bname = purple_buddy_get_name(b);
 
-		if (aim_ssi_itemlist_exists(od->ssi.local, bname)) {
+		if (aim_ssi_itemlist_exists(&od->ssi.local, bname)) {
 			/* If the buddy is an ICQ user then load his nickname */
 			const char *servernick = purple_blist_node_get_string((PurpleBlistNode*)b, "servernick");
 			char *alias;
@@ -3940,7 +3940,7 @@
 				serv_got_alias(gc, bname, servernick);
 
 			/* Store local alias on server */
-			alias = aim_ssi_getalias(od->ssi.local, gname, bname);
+			alias = aim_ssi_getalias(&od->ssi.local, gname, bname);
 			balias = purple_buddy_get_local_buddy_alias(b);
 			if (!alias && balias && *balias)
 				aim_ssi_aliasbuddy(od, gname, bname, balias);
@@ -3963,7 +3963,7 @@
 		while (next != NULL) {
 			cur = next;
 			next = next->next;
-			if (!aim_ssi_itemlist_finditem(od->ssi.local, NULL, cur->data, AIM_SSI_TYPE_PERMIT)) {
+			if (!aim_ssi_itemlist_finditem(&od->ssi.local, NULL, cur->data, AIM_SSI_TYPE_PERMIT)) {
 				purple_debug_info("oscar",
 						"ssi: removing permit %s from local list\n", (const char *)cur->data);
 				purple_privacy_permit_remove(account, cur->data, TRUE);
@@ -3976,7 +3976,7 @@
 	while (next != NULL) {
 		cur = next;
 		next = next->next;
-		if (!aim_ssi_itemlist_finditem(od->ssi.local, NULL, cur->data, deny_entry_type)) {
+		if (!aim_ssi_itemlist_finditem(&od->ssi.local, NULL, cur->data, deny_entry_type)) {
 			purple_debug_info("oscar",
 					"ssi: removing deny %s from local list\n", (const char *)cur->data);
 			purple_privacy_deny_remove(account, cur->data, TRUE);
@@ -3984,7 +3984,7 @@
 	}
 
 	/* Presence settings (idle time visibility) */
-	tmp = aim_ssi_getpresence(od->ssi.local);
+	tmp = aim_ssi_getpresence(&od->ssi.local);
 	if (tmp != 0xFFFFFFFF) {
 		const char *idle_reporting_pref;
 		gboolean report_idle;
@@ -4002,7 +4002,7 @@
 
 	/*** Begin code for adding from server list to local list ***/
 
-	for (curitem=od->ssi.local; curitem; curitem=curitem->next) {
+	for (curitem=od->ssi.local.data; curitem; curitem=curitem->next) {
 		if (curitem->name && !g_utf8_validate(curitem->name, -1, NULL)) {
 			/* Got node with invalid UTF-8 in the name.  Skip it. */
 			purple_debug_warning("oscar", "ssi: server list contains item of "
@@ -4016,7 +4016,7 @@
 					struct aim_ssi_item *groupitem;
 					char *gname, *gname_utf8, *alias, *alias_utf8;
 
-					groupitem = aim_ssi_itemlist_find(od->ssi.local, curitem->gid, 0x0000);
+					groupitem = aim_ssi_itemlist_find(&od->ssi.local, curitem->gid, 0x0000);
 					gname = groupitem ? groupitem->name : NULL;
 					gname_utf8 = oscar_utf8_try_convert(account, od, gname);
 
@@ -4026,7 +4026,7 @@
 						purple_blist_add_group(g, NULL);
 					}
 
-					alias = aim_ssi_getalias(od->ssi.local, gname, curitem->name);
+					alias = aim_ssi_getalias_from_item(curitem);
 					alias_utf8 = oscar_utf8_try_convert(account, od, alias);
 
 					b = purple_find_buddy_in_group(account, curitem->name, g);
@@ -4095,7 +4095,7 @@
 				 * a part of your status and not really related to blocking.
 				 */
 				if (!od->icq && curitem->data) {
-					guint8 perm_deny = aim_ssi_getpermdeny(od->ssi.local);
+					guint8 perm_deny = aim_ssi_getpermdeny(&od->ssi.local);
 					if (perm_deny != 0 && perm_deny != account->perm_deny)
 					{
 						purple_debug_info("oscar",
@@ -4224,10 +4224,10 @@
 	if ((type != 0x0000) || (name == NULL))
 		return 1;
 
-	gname = aim_ssi_itemlist_findparentname(od->ssi.local, name);
+	gname = aim_ssi_itemlist_findparentname(&od->ssi.local, name);
 	gname_utf8 = gname ? oscar_utf8_try_convert(account, od, gname) : NULL;
 
-	alias = aim_ssi_getalias(od->ssi.local, gname, name);
+	alias = aim_ssi_getalias(&od->ssi.local, gname, name);
 	alias_utf8 = oscar_utf8_try_convert(account, od, alias);
 	g_free(alias);
 
@@ -4265,7 +4265,7 @@
 
 	}
 
-	ssi_item = aim_ssi_itemlist_finditem(od->ssi.local,
+	ssi_item = aim_ssi_itemlist_finditem(&od->ssi.local,
 			gname, name, AIM_SSI_TYPE_BUDDY);
 	if (ssi_item == NULL)
 	{
@@ -4582,32 +4582,18 @@
 const char *oscar_list_icon_icq(PurpleAccount *a, PurpleBuddy *b)
 {
 	const char *name = b ? purple_buddy_get_name(b) : NULL;
-	if ((b == NULL) || (name == NULL) || oscar_util_valid_name_sms(name))
-	{
-		if (a == NULL || oscar_util_valid_name_icq(purple_account_get_username(a)))
-			return "icq";
-		else
-			return "aim";
-	}
-
-	if (oscar_util_valid_name_icq(name))
+	if (name && !oscar_util_valid_name_sms(name) && oscar_util_valid_name_icq(name))
 		return "icq";
-	return "aim";
+
+	return "icq";
 }
 
 const char *oscar_list_icon_aim(PurpleAccount *a, PurpleBuddy *b)
 {
 	const char *name = b ? purple_buddy_get_name(b) : NULL;
-	if ((b == NULL) || (name == NULL) || oscar_util_valid_name_sms(name))
-	{
-		if (a != NULL && oscar_util_valid_name_icq(purple_account_get_username(a)))
-			return "icq";
-		else
-			return "aim";
-	}
-
-	if (oscar_util_valid_name_icq(name))
+	if (name && !oscar_util_valid_name_sms(name) && oscar_util_valid_name_icq(name))
 		return "icq";
+
 	return "aim";
 }
 
@@ -4638,8 +4624,8 @@
 	if (purple_presence_is_online(presence) == FALSE) {
 		char *gname;
 		if ((name) && (od) && (od->ssi.received_data) &&
-			(gname = aim_ssi_itemlist_findparentname(od->ssi.local, name)) &&
-			(aim_ssi_waitingforauth(od->ssi.local, gname, name))) {
+			(gname = aim_ssi_itemlist_findparentname(&od->ssi.local, name)) &&
+			(aim_ssi_waitingforauth(&od->ssi.local, gname, name))) {
 			return "not-authorized";
 		}
 	}
@@ -4706,8 +4692,8 @@
 	if ((od != NULL) && !purple_presence_is_online(presence))
 	{
 		const char *name = purple_buddy_get_name(b);
-		char *gname = aim_ssi_itemlist_findparentname(od->ssi.local, name);
-		if (aim_ssi_waitingforauth(od->ssi.local, gname, name))
+		char *gname = aim_ssi_itemlist_findparentname(&od->ssi.local, name);
+		if (aim_ssi_waitingforauth(&od->ssi.local, gname, name))
 			ret = g_strdup(_("Not Authorized"));
 		else
 			ret = g_strdup(_("Offline"));
@@ -4950,7 +4936,7 @@
 
 	data = g_new(struct name_data, 1);
 
-	comment = aim_ssi_getcomment(od->ssi.local, purple_group_get_name(g), name);
+	comment = aim_ssi_getcomment(&od->ssi.local, purple_group_get_name(g), name);
 	comment_utf8 = comment ? oscar_utf8_try_convert(account, od, comment) : NULL;
 
 	data->gc = gc;
@@ -5171,8 +5157,8 @@
 		 * waiting for authorization.
 		 */
 		char *gname;
-		gname = aim_ssi_itemlist_findparentname(od->ssi.local, bname);
-		if (gname && aim_ssi_waitingforauth(od->ssi.local, gname, bname))
+		gname = aim_ssi_itemlist_findparentname(&od->ssi.local, bname);
+		if (gname && aim_ssi_waitingforauth(&od->ssi.local, gname, bname))
 		{
 			act = purple_menu_action_new(_("Re-request Authorization"),
 			                           PURPLE_CALLBACK(oscar_auth_sendrequest_menu),
@@ -5323,7 +5309,7 @@
 		buddy = cur->data;
 		bname = purple_buddy_get_name(buddy);
 		gname = purple_group_get_name(purple_buddy_get_group(buddy));
-		if (aim_ssi_waitingforauth(od->ssi.local, gname, bname)) {
+		if (aim_ssi_waitingforauth(&od->ssi.local, gname, bname)) {
 			filtered_buddies = g_slist_prepend(filtered_buddies, buddy);
 		}
 	}
--- a/libpurple/protocols/oscar/oscar.h	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/protocols/oscar/oscar.h	Sun Jun 12 17:56:24 2011 +0000
@@ -308,9 +308,14 @@
 
 #include "peer.h"
 
-/*
- * AIM Session: The main client-data interface.
- *
+struct aim_ssi_itemlist {
+	struct aim_ssi_item *data;
+	GHashTable *idx_gid_bid;
+	GHashTable *idx_all_named_items;
+};
+
+/**
+ * The main client-data interface.
  */
 struct _OscarData
 {
@@ -387,8 +392,8 @@
 	struct {
 		gboolean received_data;
 		guint16 numitems;
-		struct aim_ssi_item *official;
-		struct aim_ssi_item *local;
+		struct aim_ssi_itemlist official;
+		struct aim_ssi_itemlist local;
 		struct aim_ssi_tmp *pending;
 		time_t timestamp;
 		gboolean waiting_for_ack;
@@ -916,15 +921,16 @@
 /* 0x001a */ int aim_ssi_sendauthreply(OscarData *od, const char *bn, guint8 reply, const char *msg);
 
 /* Client functions for retrieving SSI data */
-struct aim_ssi_item *aim_ssi_itemlist_find(struct aim_ssi_item *list, guint16 gid, guint16 bid);
-struct aim_ssi_item *aim_ssi_itemlist_finditem(struct aim_ssi_item *list, const char *gn, const char *bn, guint16 type);
-struct aim_ssi_item *aim_ssi_itemlist_exists(struct aim_ssi_item *list, const char *bn);
-char *aim_ssi_itemlist_findparentname(struct aim_ssi_item *list, const char *bn);
-int aim_ssi_getpermdeny(struct aim_ssi_item *list);
-guint32 aim_ssi_getpresence(struct aim_ssi_item *list);
-char *aim_ssi_getalias(struct aim_ssi_item *list, const char *gn, const char *bn);
-char *aim_ssi_getcomment(struct aim_ssi_item *list, const char *gn, const char *bn);
-gboolean aim_ssi_waitingforauth(struct aim_ssi_item *list, const char *gn, const char *bn);
+struct aim_ssi_item *aim_ssi_itemlist_find(struct aim_ssi_itemlist *list, guint16 gid, guint16 bid);
+struct aim_ssi_item *aim_ssi_itemlist_finditem(struct aim_ssi_itemlist *list, const char *gn, const char *bn, guint16 type);
+struct aim_ssi_item *aim_ssi_itemlist_exists(struct aim_ssi_itemlist *list, const char *bn);
+char *aim_ssi_itemlist_findparentname(struct aim_ssi_itemlist *list, const char *bn);
+int aim_ssi_getpermdeny(struct aim_ssi_itemlist *list);
+guint32 aim_ssi_getpresence(struct aim_ssi_itemlist *list);
+char *aim_ssi_getalias(struct aim_ssi_itemlist *list, const char *gn, const char *bn);
+char *aim_ssi_getalias_from_item(struct aim_ssi_item *item);
+char *aim_ssi_getcomment(struct aim_ssi_itemlist *list, const char *gn, const char *bn);
+gboolean aim_ssi_waitingforauth(struct aim_ssi_itemlist *list, const char *gn, const char *bn);
 
 /* Client functions for changing SSI data */
 int aim_ssi_addbuddy(OscarData *od, const char *name, const char *group, GSList *tlvlist, const char *alias, const char *comment, const char *smsnum, gboolean needauth);
--- a/libpurple/protocols/oscar/oscar_data.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/protocols/oscar/oscar_data.c	Sun Jun 12 17:56:24 2011 +0000
@@ -47,6 +47,12 @@
 	od->buddyinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
 	od->handlerlist = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free);
 
+	od->ssi.local.idx_gid_bid = g_hash_table_new(g_direct_hash, g_direct_equal);
+	od->ssi.local.idx_all_named_items = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+
+	od->ssi.official.idx_gid_bid = g_hash_table_new(g_direct_hash, g_direct_equal);
+	od->ssi.official.idx_all_named_items = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+
 	/*
 	 * Register all the modules for this session...
 	 */
@@ -126,6 +132,12 @@
 	g_hash_table_destroy(od->buddyinfo);
 	g_hash_table_destroy(od->handlerlist);
 
+	g_hash_table_destroy(od->ssi.local.idx_gid_bid);
+	g_hash_table_destroy(od->ssi.local.idx_all_named_items);
+
+	g_hash_table_destroy(od->ssi.official.idx_gid_bid);
+	g_hash_table_destroy(od->ssi.official.idx_all_named_items);
+
 	g_free(od);
 }
 
--- a/libpurple/protocols/oscar/userinfo.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/protocols/oscar/userinfo.c	Sun Jun 12 17:56:24 2011 +0000
@@ -263,8 +263,8 @@
 				message = tmp;
 			}
 
-		} else if (aim_ssi_waitingforauth(od->ssi.local,
-			aim_ssi_itemlist_findparentname(od->ssi.local, purple_buddy_get_name(b)),
+		} else if (aim_ssi_waitingforauth(&od->ssi.local,
+			aim_ssi_itemlist_findparentname(&od->ssi.local, purple_buddy_get_name(b)),
 			purple_buddy_get_name(b)))
 		{
 			/* Note if an offline buddy is not authorized */
@@ -356,7 +356,7 @@
 	}
 
 	if ((b != NULL) && (bname != NULL) && (g != NULL) && (gname != NULL)) {
-		tmp = aim_ssi_getcomment(od->ssi.local, gname, bname);
+		tmp = aim_ssi_getcomment(&od->ssi.local, gname, bname);
 		if (tmp != NULL) {
 			char *tmp2 = g_markup_escape_text(tmp, strlen(tmp));
 			g_free(tmp);
@@ -547,4 +547,4 @@
 
 	purple_notify_userinfo(gc, userinfo->bn, user_info, NULL, NULL);
 	purple_notify_user_info_destroy(user_info);
-}
\ No newline at end of file
+}
--- a/libpurple/protocols/oscar/visibility.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/protocols/oscar/visibility.c	Sun Jun 12 17:56:24 2011 +0000
@@ -51,7 +51,7 @@
 static gboolean
 is_buddy_on_list(OscarData *od, const char *bname)
 {
-	return aim_ssi_itemlist_finditem(od->ssi.local, NULL, bname, get_buddy_list_type(od)) != NULL;
+	return aim_ssi_itemlist_finditem(&od->ssi.local, NULL, bname, get_buddy_list_type(od)) != NULL;
 }
 
 static void
@@ -102,7 +102,7 @@
 
 		buddy = cur->data;
 		bname = purple_buddy_get_name(buddy);
-		if (aim_ssi_itemlist_finditem(od->ssi.local, NULL, bname, list_type)) {
+		if (aim_ssi_itemlist_finditem(&od->ssi.local, NULL, bname, list_type)) {
 			filtered_buddies = g_slist_prepend(filtered_buddies, buddy);
 		}
 	}
--- a/libpurple/purple-2-uninstalled.pc.in	Sun Jun 12 17:52:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-
-abs_srcdir=@abs_srcdir@
-abs_builddir=@abs_builddir@
-
-abs_top_srcdir=@abs_top_srcdir@
-abs_top_builddir=@abs_top_builddir@
-
-plugindir=${libdir}/purple-@PURPLE_MAJOR_VERSION@
-
-Name: libpurple
-Description: libpurple is a GLib-based instant messenger library.
-Version: @VERSION@
-Requires: glib-2.0
-Cflags: -I${abs_top_srcdir} -I${abs_top_builddir}
-Libs: ${abs_builddir}/libpurple.la
--- a/libpurple/purple-2.pc.in	Sun Jun 12 17:52:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-
-plugindir=${libdir}/purple-@PURPLE_MAJOR_VERSION@
-
-Name: libpurple
-Description: libpurple is a GLib-based instant messenger library.
-Version: @VERSION@
-Requires: glib-2.0
-Cflags: -I${includedir}
-Libs: -L${libdir} -lpurple
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/purple-3-uninstalled.pc.in	Sun Jun 12 17:56:24 2011 +0000
@@ -0,0 +1,22 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+datarootdir=@datarootdir@
+datadir=@datadir@
+sysconfdir=@sysconfdir@
+
+abs_srcdir=@abs_srcdir@
+abs_builddir=@abs_builddir@
+
+abs_top_srcdir=@abs_top_srcdir@
+abs_top_builddir=@abs_top_builddir@
+
+plugindir=${libdir}/purple-@PURPLE_MAJOR_VERSION@
+
+Name: libpurple
+Description: libpurple is a GLib-based instant messenger library.
+Version: @VERSION@
+Requires: glib-2.0
+Cflags: -I${abs_top_srcdir} -I${abs_top_builddir}
+Libs: ${abs_builddir}/libpurple.la
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/purple-3.pc.in	Sun Jun 12 17:56:24 2011 +0000
@@ -0,0 +1,16 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+datarootdir=@datarootdir@
+datadir=@datadir@
+sysconfdir=@sysconfdir@
+
+plugindir=${libdir}/purple-@PURPLE_MAJOR_VERSION@
+
+Name: libpurple
+Description: libpurple is a GLib-based instant messenger library.
+Version: @VERSION@
+Requires: glib-2.0
+Cflags: -I${includedir}
+Libs: -L${libdir} -lpurple
--- a/libpurple/purple-uninstalled.pc.in	Sun Jun 12 17:52:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-
-abs_srcdir=@abs_srcdir@
-abs_builddir=@abs_builddir@
-
-plugindir=${libdir}/purple-@PURPLE_MAJOR_VERSION@
-
-Name: libpurple
-Description: libpurple is a GLib-based instant messenger library.
-Version: @VERSION@
-Requires: glib-2.0
-Cflags: -I${abs_srcdir} -I${abs_builddir}
-Libs: ${abs_builddir}/libpurple.la
--- a/libpurple/purple.pc.in	Sun Jun 12 17:52:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-
-plugindir=${libdir}/purple-@PURPLE_MAJOR_VERSION@
-
-Name: libpurple
-Description: libpurple is a GLib-based instant messenger library.
-Version: @VERSION@
-Requires: glib-2.0
-Cflags: -I${includedir}/libpurple
-Libs: -L${libdir} -lpurple
--- a/libpurple/request.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/request.c	Sun Jun 12 17:56:24 2011 +0000
@@ -365,6 +365,7 @@
 	g_free(field->id);
 	g_free(field->label);
 	g_free(field->type_hint);
+	g_free(field->tooltip);
 
 	if (field->type == PURPLE_REQUEST_FIELD_STRING)
 	{
@@ -428,6 +429,15 @@
 }
 
 void
+purple_request_field_set_tooltip(PurpleRequestField *field, const char *tooltip)
+{
+	g_return_if_fail(field != NULL);
+
+	g_free(field->tooltip);
+	field->tooltip = g_strdup(tooltip);
+}
+
+void
 purple_request_field_set_required(PurpleRequestField *field, gboolean required)
 {
 	g_return_if_fail(field != NULL);
@@ -502,6 +512,14 @@
 	return field->type_hint;
 }
 
+const char *
+purple_request_field_get_tooltip(const PurpleRequestField *field)
+{
+	g_return_val_if_fail(field != NULL, NULL);
+
+	return field->tooltip;
+}
+
 gboolean
 purple_request_field_is_required(const PurpleRequestField *field)
 {
--- a/libpurple/request.h	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/request.h	Sun Jun 12 17:56:24 2011 +0000
@@ -180,6 +180,7 @@
 	} u;
 
 	void *ui_data;
+	char *tooltip;
 
 };
 #endif
@@ -517,6 +518,18 @@
 									  const char *type_hint);
 
 /**
+ * Sets the tooltip for the field.
+ *
+ * This is optionally used by the UIs to provide a tooltip for
+ * the field.
+ *
+ * @param field     The field.
+ * @param tooltip   The tooltip text.
+ */
+void purple_request_field_set_tooltip(PurpleRequestField *field,
+									const char *tooltip);
+
+/**
  * Sets whether or not a field is required.
  *
  * @param field    The field.
@@ -582,6 +595,15 @@
 const char *purple_request_field_get_type_hint(const PurpleRequestField *field);
 
 /**
+ * Returns the field's tooltip.
+ *
+ * @param field The field.
+ *
+ * @return The field's tooltip.
+ */
+const char *purple_request_field_get_tooltip(const PurpleRequestField *field);
+
+/**
  * Returns whether or not a field is required.
  *
  * @param field The field.
--- a/libpurple/savedstatuses.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/savedstatuses.c	Sun Jun 12 17:56:24 2011 +0000
@@ -387,7 +387,6 @@
 		const char *protocol;
 		acct_name = xmlnode_get_data(node);
 		protocol = xmlnode_get_attrib(node, "protocol");
-		protocol = _purple_oscar_convert(acct_name, protocol); /* XXX: Remove */
 		if ((acct_name != NULL) && (protocol != NULL))
 			ret->account = purple_accounts_find(acct_name, protocol);
 		g_free(acct_name);
--- a/libpurple/util.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/util.c	Sun Jun 12 17:56:24 2011 +0000
@@ -4943,18 +4943,6 @@
 	return buf;
 }
 
-const char *_purple_oscar_convert(const char *act, const char *protocol)
-{
-	if (act && purple_strequal(protocol, "prpl-oscar")) {
-		int i;
-		for (i = 0; act[i] != '\0'; i++)
-			if (!isdigit(act[i]))
-				return "prpl-aim";
-		return "prpl-icq";
-	}
-	return protocol;
-}
-
 void purple_restore_default_signal_handlers(void)
 {
 #ifndef _WIN32
--- a/libpurple/util.h	Sun Jun 12 17:52:59 2011 +0000
+++ b/libpurple/util.h	Sun Jun 12 17:56:24 2011 +0000
@@ -1450,16 +1450,6 @@
 const char *purple_escape_filename(const char *str);
 
 /**
- * This is added temporarily to assist the split of oscar into aim and icq.
- * This should not be used by plugins.
- *
- * @deprecated This function should not be used in new code and should be
- *             removed in 3.0.0.  The aim/icq prpl split happened a long
- *             time ago, and we don't need to keep migrating old data.
- */
-const char *_purple_oscar_convert(const char *act, const char *protocol);
-
-/**
  * Restore default signal handlers for signals which might reasonably have
  * handlers. This should be called by a fork()'d child process, since child processes
  * inherit the handlers of the parent.
--- a/pidgin/Makefile.am	Sun Jun 12 17:52:59 2011 +0000
+++ b/pidgin/Makefile.am	Sun Jun 12 17:56:24 2011 +0000
@@ -3,8 +3,8 @@
 		getopt.h \
 		getopt1.c \
 		Makefile.mingw \
-		pidgin.pc.in \
-		pidgin-uninstalled.pc.in \
+		pidgin-3.pc.in \
+		pidgin-3-uninstalled.pc.in \
 		win32/MinimizeToTray.h \
 		win32/MinimizeToTray.c \
 		win32/pidgin_dll_rc.rc.in \
@@ -32,7 +32,7 @@
 if ENABLE_GTK
 
 pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = pidgin.pc
+pkgconfig_DATA = pidgin-3.pc
 
 SUBDIRS = pixmaps plugins
 
@@ -107,7 +107,6 @@
 	gtkicon-theme.h \
 	gtkicon-theme-loader.h \
 	gtkidle.h \
-	gtkgaim-compat.h \
 	gtkimhtml.h \
 	gtkimhtmltoolbar.h \
 	gtklog.h \
--- a/pidgin/gtkgaim-compat.h	Sun Jun 12 17:52:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,412 +0,0 @@
-/**
- * @file gtkgaim-compat.h Gtk Gaim Compat macros
- */
-
-/* pidgin
- *
- * Pidgin 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.
- *
- * 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
- *
- */
-#ifndef _GTKGAIM_COMPAT_H_
-#define _GTKGAIM_COMPAT_H_
-
-#include <pidginstock.h>
-
-#define GAIM_ALERT_TITLE PIDGIN_ALERT_TITLE
-#define GAIM_BROWSER_CURRENT PIDGIN_BROWSER_CURRENT
-#define GAIM_BROWSER_DEFAULT PIDGIN_BROWSER_DEFAULT
-#define GAIM_BROWSER_NEW_TAB PIDGIN_BROWSER_NEW_TAB
-#define GAIM_BROWSER_NEW_WINDOW PIDGIN_BROWSER_NEW_WINDOW
-#define GaimBrowserPlace PidginBrowserPlace
-#define GAIM_BUTTON_HORIZONTAL PIDGIN_BUTTON_HORIZONTAL
-#define GAIM_BUTTON_IMAGE PIDGIN_BUTTON_IMAGE
-#define GAIM_BUTTON_NONE PIDGIN_BUTTON_NONE
-#define GaimButtonOrientation PidginButtonOrientation
-#define GaimButtonStyle PidginButtonStyle
-#define GAIM_BUTTON_TEXT_IMAGE PIDGIN_BUTTON_TEXT_IMAGE
-#define GAIM_BUTTON_TEXT PIDGIN_BUTTON_TEXT
-#define GAIM_BUTTON_VERTICAL PIDGIN_BUTTON_VERTICAL
-#define GaimConvPlacementFunc PidginConvPlacementFunc
-#define GAIM_DIALOG PIDGIN_DIALOG
-#define gaim_dnd_file_manage pidgin_dnd_file_manage
-#define gaim_get_gtkxfer_dialog pidgin_get_xfer_dialog
-#define gaim_gtk_account_dialog_show pidgin_account_dialog_show
-#define GaimGtkAccountDialogType PidginAccountDialogType
-#define gaim_gtk_account_get_handle pidgin_account_get_handle
-#define gaim_gtk_account_init pidgin_account_init
-#define gaim_gtk_account_option_menu_get_selected pidgin_account_option_menu_get_selected
-#define gaim_gtk_account_option_menu_new pidgin_account_option_menu_new
-#define gaim_gtk_account_option_menu_set_selected pidgin_account_option_menu_set_selected
-#define gaim_gtk_accounts_get_ui_ops pidgin_accounts_get_ui_ops
-#define gaim_gtk_accounts_window_hide pidgin_accounts_window_hide
-#define gaim_gtk_accounts_window_show pidgin_accounts_window_show
-#define gaim_gtk_account_uninit pidgin_account_uninit
-#define GAIM_GTK_ADD_ACCOUNT_DIALOG PIDGIN_ADD_ACCOUNT_DIALOG
-#define gaim_gtk_append_blist_node_extended_menu pidgin_append_blist_node_extended_menu
-#define gaim_gtk_append_blist_node_privacy_menu pidgin_append_blist_node_privacy_menu
-#define gaim_gtk_append_blist_node_proto_menu pidgin_append_blist_node_proto_menu
-#define gaim_gtk_append_menu_action pidgin_append_menu_action
-#define gaim_gtk_blist_add_alert pidgin_blist_add_alert
-#define gaim_gtk_blist_get_default_gtk_blist pidgin_blist_get_default_gtk_blist
-#define gaim_gtk_blist_get_handle pidgin_blist_get_handle
-#define gaim_gtk_blist_get_sort_methods pidgin_blist_get_sort_methods
-#define gaim_gtk_blist_get_status_icon pidgin_blist_get_status_icon
-#define gaim_gtk_blist_get_ui_ops pidgin_blist_get_ui_ops
-#define gaim_gtk_blist_init pidgin_blist_init
-#define gaim_gtk_blist_joinchat_is_showable pidgin_blist_joinchat_is_showable
-#define gaim_gtk_blist_joinchat_show pidgin_blist_joinchat_show
-#define gaim_gtk_blist_make_buddy_menu pidgin_blist_make_buddy_menu
-#define gaim_gtk_blist_node_is_contact_expanded pidgin_blist_node_is_contact_expanded
-#define GAIM_GTK_BLIST PIDGIN_BLIST
-#define gaim_gtk_blist_refresh pidgin_blist_refresh
-#define gaim_gtk_blist_set_headline pidgin_blist_set_headline
-#define gaim_gtk_blist_setup_sort_methods pidgin_blist_setup_sort_methods
-#define gaim_gtk_blist_sort_function pidgin_blist_sort_function
-#define gaim_gtk_blist_sort_method pidgin_blist_sort_method
-#define GaimGtkBlistSortMethod PidginBlistSortMethod
-#define gaim_gtk_blist_sort_method_reg pidgin_blist_sort_method_reg
-#define gaim_gtk_blist_sort_method_set pidgin_blist_sort_method_set
-#define gaim_gtk_blist_sort_method_unreg pidgin_blist_sort_method_unreg
-#define gaim_gtk_blist_toggle_visibility pidgin_blist_toggle_visibility
-#define gaim_gtk_blist_uninit pidgin_blist_uninit
-#define gaim_gtk_blist_update_account_error_state pidgin_blist_update_account_error_state
-#define gaim_gtk_blist_update_accounts_menu pidgin_blist_update_accounts_menu
-#define gaim_gtk_blist_update_columns pidgin_blist_update_columns
-#define gaim_gtk_blist_update_plugin_actions pidgin_blist_update_plugin_actions
-#define gaim_gtk_blist_update_refresh_timeout pidgin_blist_update_refresh_timeout
-#define gaim_gtk_blist_update_sort_methods pidgin_blist_update_sort_methods
-#define gaim_gtk_blist_visibility_manager_add pidgin_blist_visibility_manager_add
-#define gaim_gtk_blist_visibility_manager_remove pidgin_blist_visibility_manager_remove
-#define gaim_gtk_buddy_icon_chooser_new pidgin_buddy_icon_chooser_new
-#define gaim_gtk_buddy_icon_get_scale_size pidgin_buddy_icon_get_scale_size
-#define GaimGtkBuddyList PidginBuddyList
-#define GaimGtkCellRendererExpanderClass PidginCellRendererExpanderClass
-#define gaim_gtk_cell_renderer_expander_get_type pidgin_cell_renderer_expander_get_type
-#define gaim_gtk_cell_renderer_expander_new pidgin_cell_renderer_expander_new
-#define GaimGtkCellRendererExpander PidginCellRendererExpander
-#define GaimGtkCellRendererProgressClass PidginCellRendererProgressClass
-#define gaim_gtk_cell_renderer_progress_get_type pidgin_cell_renderer_progress_get_type
-#define gaim_gtk_cell_renderer_progress_new pidgin_cell_renderer_progress_new
-#define GaimGtkCellRendererProgress PidginCellRendererProgress
-#define GaimGtkChatPane PidginChatPane
-#define gaim_gtk_check_if_dir pidgin_check_if_dir
-#define gaim_gtk_clear_cursor pidgin_clear_cursor
-#define gaim_gtk_connection_get_handle pidgin_connection_get_handle
-#define gaim_gtk_connection_init pidgin_connection_init
-#define gaim_gtk_connections_get_ui_ops pidgin_connections_get_ui_ops
-#define gaim_gtk_connection_uninit pidgin_connection_uninit
-#define GaimGtkConversation PidginConversation
-#define GAIM_GTK_CONVERSATION PIDGIN_CONVERSATION
-#define gaim_gtk_conversations_fill_menu pidgin_conversations_fill_menu
-#define gaim_gtk_conversations_find_unseen_list pidgin_conversations_find_unseen_list
-#define gaim_gtk_conversations_get_conv_ui_ops pidgin_conversations_get_conv_ui_ops
-#define gaim_gtk_conversations_get_handle pidgin_conversations_get_handle
-#define gaim_gtk_conversations_init pidgin_conversations_init
-#define gaim_gtk_conversations_uninit pidgin_conversations_uninit
-#define gaim_gtk_convert_buddy_icon pidgin_convert_buddy_icon
-#define gaim_gtkconv_get_tab_at_xy pidgin_conv_get_tab_at_xy
-#define gaim_gtkconv_get_tab_icon pidgin_conv_get_tab_icon
-#define gaim_gtkconv_get_window pidgin_conv_get_window
-#define gaim_gtkconv_is_hidden pidgin_conv_is_hidden
-#define gaim_gtkconv_new pidgin_conv_new
-#define gaim_gtkconv_placement_add_fnc pidgin_conv_placement_add_fnc
-#define gaim_gtkconv_placement_get_current_func pidgin_conv_placement_get_current_func
-#define gaim_gtkconv_placement_get_fnc pidgin_conv_placement_get_fnc
-#define gaim_gtkconv_placement_get_name pidgin_conv_placement_get_name
-#define gaim_gtkconv_placement_get_options pidgin_conv_placement_get_options
-#define gaim_gtkconv_placement_place pidgin_conv_placement_place
-#define gaim_gtkconv_placement_remove_fnc pidgin_conv_placement_remove_fnc
-#define gaim_gtkconv_placement_set_current_func pidgin_conv_placement_set_current_func
-#define gaim_gtkconv_present_conversation pidgin_conv_present_conversation
-#define gaim_gtkconv_switch_active_conversation pidgin_conv_switch_active_conversation
-#define gaim_gtkconv_update_buddy_icon pidgin_conv_update_buddy_icon
-#define gaim_gtkconv_update_buttons_by_protocol pidgin_conv_update_buttons_by_protocol
-#define gaim_gtk_conv_window_add_gtkconv pidgin_conv_window_add_gtkconv
-#define gaim_gtk_conv_window_destroy pidgin_conv_window_destroy
-#define gaim_gtk_conv_window_first_with_type pidgin_conv_window_first_with_type
-#define gaim_gtk_conv_window_get_active_conversation pidgin_conv_window_get_active_conversation
-#define gaim_gtk_conv_window_get_active_gtkconv pidgin_conv_window_get_active_gtkconv
-#define gaim_gtk_conv_window_get_at_xy pidgin_conv_window_get_at_xy
-#define gaim_gtk_conv_window_get_gtkconv_at_index pidgin_conv_window_get_gtkconv_at_index
-#define gaim_gtk_conv_window_get_gtkconv_count pidgin_conv_window_get_gtkconv_count
-#define gaim_gtk_conv_window_get_gtkconvs pidgin_conv_window_get_gtkconvs
-#define gaim_gtk_conv_window_has_focus pidgin_conv_window_has_focus
-#define gaim_gtk_conv_window_hide pidgin_conv_window_hide
-#define gaim_gtk_conv_window_is_active_conversation pidgin_conv_window_is_active_conversation
-#define gaim_gtk_conv_window_last_with_type pidgin_conv_window_last_with_type
-#define gaim_gtk_conv_window_new pidgin_conv_window_new
-#define gaim_gtk_conv_window_raise pidgin_conv_window_raise
-#define gaim_gtk_conv_window_remove_gtkconv pidgin_conv_window_remove_gtkconv
-#define gaim_gtk_conv_windows_get_list pidgin_conv_windows_get_list
-#define gaim_gtk_conv_window_show pidgin_conv_window_show
-#define gaim_gtk_conv_window_switch_gtkconv pidgin_conv_window_switch_gtkconv
-#define gaim_gtk_create_imhtml pidgin_create_imhtml
-#define gaim_gtk_debug_get_handle pidgin_debug_get_handle
-#define gaim_gtk_debug_get_ui_ops pidgin_debug_get_ui_ops
-#define gaim_gtk_debug_init pidgin_debug_init
-#define gaim_gtk_debug_uninit pidgin_debug_uninit
-#define gaim_gtk_debug_window_hide pidgin_debug_window_hide
-#define gaim_gtk_debug_window_show pidgin_debug_window_show
-#define gaim_gtkdialogs_about pidgin_dialogs_about
-#define gaim_gtkdialogs_alias_buddy pidgin_dialogs_alias_buddy
-#define gaim_gtkdialogs_alias_chat pidgin_dialogs_alias_chat
-#define gaim_gtkdialogs_alias_contact pidgin_dialogs_alias_contact
-#define gaim_gtkdialogs_destroy_all pidgin_dialogs_destroy_all
-#define gaim_gtkdialogs_im pidgin_dialogs_im
-#define gaim_gtkdialogs_im_with_user pidgin_dialogs_im_with_user
-#define gaim_gtkdialogs_info pidgin_dialogs_info
-#define gaim_gtkdialogs_log pidgin_dialogs_log
-#define gaim_gtkdialogs_merge_groups pidgin_dialogs_merge_groups
-#define gaim_gtkdialogs_remove_buddy pidgin_dialogs_remove_buddy
-#define gaim_gtkdialogs_remove_chat pidgin_dialogs_remove_chat
-#define gaim_gtkdialogs_remove_contact pidgin_dialogs_remove_contact
-#define gaim_gtkdialogs_remove_group pidgin_dialogs_remove_group
-#define gaim_gtk_docklet_clicked pidgin_docklet_clicked
-#define gaim_gtk_docklet_embedded pidgin_docklet_embedded
-#define gaim_gtk_docklet_get_handle pidgin_docklet_get_handle
-#define gaim_gtk_docklet_init pidgin_docklet_init
-#define gaim_gtk_docklet_remove pidgin_docklet_remove
-#define gaim_gtk_docklet_set_ui_ops pidgin_docklet_set_ui_ops
-#define gaim_gtk_docklet_uninit pidgin_docklet_uninit
-#define gaim_gtk_docklet_unload pidgin_docklet_unload
-#define gaim_gtk_eventloop_get_ui_ops pidgin_eventloop_get_ui_ops
-#define gaim_gtk_idle_get_ui_ops pidgin_idle_get_ui_ops
-#define GaimGtkImPane PidginImPane
-#define gaim_gtk_load_accels pidgin_load_accels
-#define gaim_gtk_log_get_handle pidgin_log_get_handle
-#define gaim_gtk_log_init pidgin_log_init
-#define gaim_gtk_log_show_contact pidgin_log_show_contact
-#define gaim_gtk_log_show pidgin_log_show
-#define gaim_gtk_log_uninit pidgin_log_uninit
-#define GaimGtkLogViewer PidginLogViewer
-#define gaim_gtk_make_frame pidgin_make_frame
-#define gaim_gtk_make_mini_dialog pidgin_make_mini_dialog
-#define gaim_gtk_make_pretty_arrows pidgin_make_pretty_arrows
-#define gaim_gtk_menu_tray_append pidgin_menu_tray_append
-#define GaimGtkMenuTrayClass PidginMenuTrayClass
-#define gaim_gtk_menu_tray_get_box pidgin_menu_tray_get_box
-#define gaim_gtk_menu_tray_get_gtype pidgin_menu_tray_get_gtype
-#define gaim_gtk_menu_tray_new pidgin_menu_tray_new
-#define GaimGtkMenuTray PidginMenuTray
-#define GAIM_GTK_MENU_TRAY PIDGIN_MENU_TRAY
-#define gaim_gtk_menu_tray_prepend pidgin_menu_tray_prepend
-#define gaim_gtk_menu_tray_set_tooltip pidgin_menu_tray_set_tooltip
-#define GAIM_GTK_MODIFY_ACCOUNT_DIALOG PIDGIN_MODIFY_ACCOUNT_DIALOG
-#define gaim_gtk_notify_get_ui_ops pidgin_notify_get_ui_ops
-#define gaim_gtk_parse_x_im_contact pidgin_parse_x_im_contact
-#define gaim_gtk_plugin_dialog_show pidgin_plugin_dialog_show
-#define gaim_gtk_plugin_get_config_frame pidgin_plugin_get_config_frame
-#define GAIM_GTK_PLUGIN PIDGIN_PLUGIN
-#define gaim_gtk_plugin_pref_create_frame pidgin_plugin_pref_create_frame
-#define gaim_gtk_plugins_save pidgin_plugins_save
-#define GAIM_GTK_PLUGIN_TYPE PIDGIN_PLUGIN_TYPE
-#define GaimGtkPluginUiInfo PidginPluginUiInfo
-#define GAIM_GTK_PLUGIN_UI_INFO PIDGIN_PLUGIN_UI_INFO
-#define gaim_gtk_pounce_editor_show pidgin_pounce_editor_show
-#define gaim_gtk_pounces_get_handle pidgin_pounces_get_handle
-#define gaim_gtk_pounces_init pidgin_pounces_init
-#define gaim_gtk_pounces_manager_hide pidgin_pounces_manager_hide
-#define gaim_gtk_pounces_manager_show pidgin_pounces_manager_show
-#define gaim_gtk_prefs_checkbox pidgin_prefs_checkbox
-#define gaim_gtk_prefs_dropdown_from_list pidgin_prefs_dropdown_from_list
-#define gaim_gtk_prefs_dropdown pidgin_prefs_dropdown
-#define gaim_gtk_prefs_init pidgin_prefs_init
-#define gaim_gtk_prefs_labeled_entry pidgin_prefs_labeled_entry
-#define gaim_gtk_prefs_labeled_spin_button pidgin_prefs_labeled_spin_button
-#define gaim_gtk_prefs_show pidgin_prefs_show
-#define gaim_gtk_prefs_update_old pidgin_prefs_update_old
-#define gaim_gtk_privacy_dialog_hide pidgin_privacy_dialog_hide
-#define gaim_gtk_privacy_dialog_show pidgin_privacy_dialog_show
-#define gaim_gtk_privacy_get_ui_ops pidgin_privacy_get_ui_ops
-#define gaim_gtk_privacy_init pidgin_privacy_init
-#define gaim_gtk_protocol_option_menu_new pidgin_protocol_option_menu_new
-#define gaim_gtk_request_add_block pidgin_request_add_block
-#define gaim_gtk_request_add_permit pidgin_request_add_permit
-#define gaim_gtk_request_get_ui_ops pidgin_request_get_ui_ops
-#define gaim_gtk_roomlist_dialog_show pidgin_roomlist_dialog_show
-#define gaim_gtk_roomlist_dialog_show_with_account pidgin_roomlist_dialog_show_with_account
-#define gaim_gtk_roomlist_init pidgin_roomlist_init
-#define gaim_gtk_roomlist_is_showable pidgin_roomlist_is_showable
-#define gaim_gtk_save_accels_cb pidgin_save_accels_cb
-#define gaim_gtk_save_accels pidgin_save_accels
-#define gaim_gtk_session_end pidgin_session_end
-#define gaim_gtk_session_init pidgin_session_init
-#define gaim_gtk_set_cursor pidgin_set_cursor
-#define gaim_gtk_set_custom_buddy_icon pidgin_set_custom_buddy_icon
-#define gaim_gtk_set_sensitive_if_input pidgin_set_sensitive_if_input
-#define gaim_gtk_setup_gtkspell pidgin_setup_gtkspell
-#define gaim_gtk_setup_screenname_autocomplete pidgin_setup_screenname_autocomplete
-#define gaim_gtk_set_urgent pidgin_set_urgent
-#define gaim_gtk_sound_get_event_label pidgin_sound_get_event_label
-#define gaim_gtk_sound_get_event_option pidgin_sound_get_event_option
-#define gaim_gtk_sound_get_handle pidgin_sound_get_handle
-#define gaim_gtk_sound_get_ui_ops pidgin_sound_get_ui_ops
-#define gaim_gtk_status_editor_show pidgin_status_editor_show
-#define gaim_gtk_status_get_handle pidgin_status_get_handle
-#define gaim_gtk_status_init pidgin_status_init
-#define gaim_gtk_status_menu pidgin_status_menu
-#define gaim_gtk_status_uninit pidgin_status_uninit
-#define gaim_gtk_status_window_hide pidgin_status_window_hide
-#define gaim_gtk_status_window_show pidgin_status_window_show
-#define gaim_gtk_stock_init pidgin_stock_init
-#define gaim_gtk_syslog_show pidgin_syslog_show
-#define gaim_gtkthemes_get_proto_smileys pidgin_themes_get_proto_smileys
-#define gaim_gtkthemes_init pidgin_themes_init
-#define gaim_gtkthemes_load_smiley_theme pidgin_themes_load_smiley_theme
-#define gaim_gtkthemes_smileys_disabled pidgin_themes_smileys_disabled
-#define gaim_gtkthemes_smiley_themeize pidgin_themes_smiley_themeize
-#define gaim_gtkthemes_smiley_theme_probe pidgin_themes_smiley_theme_probe
-#define gaim_gtk_toggle_sensitive_array pidgin_toggle_sensitive_array
-#define gaim_gtk_toggle_sensitive pidgin_toggle_sensitive
-#define gaim_gtk_toggle_showhide pidgin_toggle_showhide
-#define gaim_gtk_treeview_popup_menu_position_func pidgin_treeview_popup_menu_position_func
-#define gaim_gtk_tree_view_search_equal_func pidgin_tree_view_search_equal_func
-#define GAIM_GTK_TYPE_MENU_TRAY PIDGIN_TYPE_MENU_TRAY
-#define GAIM_GTK_UI PIDGIN_UI
-#define gaim_gtk_whiteboard_get_ui_ops pidgin_whiteboard_get_ui_ops
-#define GaimGtkWhiteboard PidginWhiteboard
-#define GaimGtkWindow PidginWindow
-#define gaim_gtkxfer_dialog_add_xfer pidgin_xfer_dialog_add_xfer
-#define gaim_gtkxfer_dialog_cancel_xfer pidgin_xfer_dialog_cancel_xfer
-#define gaim_gtkxfer_dialog_destroy pidgin_xfer_dialog_destroy
-#define gaim_gtkxfer_dialog_hide pidgin_xfer_dialog_hide
-#define gaim_gtkxfer_dialog_new pidgin_xfer_dialog_new
-#define GaimGtkXferDialog PidginXferDialog
-#define gaim_gtkxfer_dialog_remove_xfer pidgin_xfer_dialog_remove_xfer
-#define gaim_gtkxfer_dialog_show pidgin_xfer_dialog_show
-#define gaim_gtkxfer_dialog_update_xfer pidgin_xfer_dialog_update_xfer
-#define gaim_gtk_xfers_get_ui_ops pidgin_xfers_get_ui_ops
-#define gaim_gtk_xfers_init pidgin_xfers_init
-#define gaim_gtk_xfers_uninit pidgin_xfers_uninit
-#define GAIM_HIG_BORDER PIDGIN_HIG_BORDER
-#define GAIM_HIG_BOX_SPACE PIDGIN_HIG_BOX_SPACE
-#define GAIM_HIG_CAT_SPACE PIDGIN_HIG_CAT_SPACE
-#if !GTK_CHECK_VERSION(2,16,0)
-#define GAIM_INVISIBLE_CHAR PIDGIN_INVISIBLE_CHAR
-#endif /* Less than GTK+ 2.16 */
-#define GAIM_IS_GTK_CONVERSATION PIDGIN_IS_PIDGIN_CONVERSATION
-#define GAIM_IS_GTK_PLUGIN PIDGIN_IS_PIDGIN_PLUGIN
-#define gaim_new_check_item pidgin_new_check_item
-#define gaim_new_item_from_stock pidgin_new_item_from_stock
-#define gaim_new_item pidgin_new_item
-#define gaim_pixbuf_button_from_stock pidgin_pixbuf_button_from_stock
-#define gaim_pixbuf_toolbar_button_from_stock pidgin_pixbuf_toolbar_button_from_stock
-#define GaimScrollBookClass PidginScrollBookClass
-#define gaim_scroll_book_get_type pidgin_scroll_book_get_type
-#define gaim_scroll_book_new pidgin_scroll_book_new
-#define GaimScrollBook PidginScrollBook
-#define gaim_separator pidgin_separator
-#define gaim_set_accessible_label pidgin_set_accessible_label
-#define gaim_set_gtkxfer_dialog pidgin_set_xfer_dialog
-#define gaim_setup_imhtml pidgin_setup_imhtml
-#define gaim_status_box_add pidgin_status_box_add
-#define gaim_status_box_add_separator pidgin_status_box_add_separator
-#define GaimStatusBoxClass PidginStatusBoxClass
-#define gaim_status_box_get_buddy_icon pidgin_status_box_get_buddy_icon
-#define gaim_status_box_get_message pidgin_status_box_get_message
-#define gaim_status_box_get_type pidgin_status_box_get_type
-#define GaimStatusBoxItemType PidginStatusBoxItemType
-#define gaim_status_box_new pidgin_status_box_new
-#define gaim_status_box_new_with_account pidgin_status_box_new_with_account
-#define GaimStatusBox PidginStatusBox
-#define gaim_status_box_pulse_connecting pidgin_status_box_pulse_connecting
-#define gaim_status_box_set_buddy_icon pidgin_status_box_set_buddy_icon
-#define gaim_status_box_set_connecting pidgin_status_box_set_connecting
-#define gaim_status_box_set_network_available pidgin_status_box_set_network_available
-#define GAIM_STATUS_ICON_LARGE PIDGIN_STATUS_ICON_LARGE
-#define GaimStatusIconSize PidginStatusIconSize
-#define GAIM_STATUS_ICON_SMALL PIDGIN_STATUS_ICON_SMALL
-#define GAIM_STOCK_ABOUT PIDGIN_STOCK_ABOUT
-#define GAIM_STOCK_ACTION PIDGIN_STOCK_ACTION
-#define GAIM_STOCK_ALIAS PIDGIN_STOCK_ALIAS
-#define GAIM_STOCK_AWAY PIDGIN_STOCK_AWAY
-#define GAIM_STOCK_CHAT PIDGIN_STOCK_CHAT
-#define GAIM_STOCK_CLEAR PIDGIN_STOCK_CLEAR
-#define GAIM_STOCK_CLOSE_TABS PIDGIN_STOCK_CLOSE_TABS
-#define GAIM_STOCK_DEBUG PIDGIN_STOCK_DEBUG
-#define GAIM_STOCK_DIALOG_AUTH PIDGIN_STOCK_DIALOG_AUTH
-#define GAIM_STOCK_DIALOG_COOL PIDGIN_STOCK_DIALOG_COOL
-#define GAIM_STOCK_DIALOG_ERROR PIDGIN_STOCK_DIALOG_ERROR
-#define GAIM_STOCK_DIALOG_INFO PIDGIN_STOCK_DIALOG_INFO
-#define GAIM_STOCK_DIALOG_QUESTION PIDGIN_STOCK_DIALOG_QUESTION
-#define GAIM_STOCK_DIALOG_WARNING PIDGIN_STOCK_DIALOG_WARNING
-#define GAIM_STOCK_DISCONNECT PIDGIN_STOCK_DISCONNECT
-#define GAIM_STOCK_DOWNLOAD PIDGIN_STOCK_DOWNLOAD
-#define GAIM_STOCK_EDIT PIDGIN_STOCK_EDIT
-#define GAIM_STOCK_FGCOLOR PIDGIN_STOCK_FGCOLOR
-#define GAIM_STOCK_FILE_CANCELED PIDGIN_STOCK_FILE_CANCELED
-#define GAIM_STOCK_FILE_DONE PIDGIN_STOCK_FILE_DONE
-#define GAIM_STOCK_FILE_TRANSFER PIDGIN_STOCK_FILE_TRANSFER
-#define GAIM_STOCK_IGNORE PIDGIN_STOCK_IGNORE
-#define GAIM_STOCK_IM "gaim-im" /* foo... */
-#define GAIM_STOCK_INVITE PIDGIN_STOCK_INVITE
-#define GAIM_STOCK_MODIFY PIDGIN_STOCK_MODIFY
-#define GAIM_STOCK_OPEN_MAIL PIDGIN_STOCK_OPEN_MAIL
-#define GAIM_STOCK_PAUSE PIDGIN_STOCK_PAUSE
-#define GAIM_STOCK_POUNCE PIDGIN_STOCK_POUNCE
-#define GAIM_STOCK_SIGN_OFF PIDGIN_STOCK_SIGN_OFF
-#define GAIM_STOCK_SIGN_ON PIDGIN_STOCK_SIGN_ON
-#define GAIM_STOCK_STATUS_OFFLINE PIDGIN_STOCK_STATUS_OFFLINE
-#define GAIM_STOCK_TEXT_NORMAL PIDGIN_STOCK_TEXT_NORMAL
-#define GAIM_STOCK_TYPED PIDGIN_STOCK_TYPED
-#define GAIM_STOCK_UPLOAD PIDGIN_STOCK_UPLOAD
-#define GAIM_TYPE_GTK_CELL_RENDERER_EXPANDER PIDGIN_TYPE_GTK_CELL_RENDERER_EXPANDER
-#define GAIM_TYPE_GTK_CELL_RENDERER_PROGRESS PIDGIN_TYPE_GTK_CELL_RENDERER_PROGRESS
-#define GAIM_UNSEEN_EVENT PIDGIN_UNSEEN_EVENT
-#define GAIM_UNSEEN_NICK PIDGIN_UNSEEN_NICK
-#define GAIM_UNSEEN_NO_LOG PIDGIN_UNSEEN_NO_LOG
-#define GAIM_UNSEEN_NONE PIDGIN_UNSEEN_NONE
-#define GaimUnseenState PidginUnseenState
-#define GAIM_UNSEEN_TEXT PIDGIN_UNSEEN_TEXT
-#define GAIM_WINDOW_ICONIFIED PIDGIN_WINDOW_ICONIFIED
-#define GTK_GAIM_IS_SCROLL_BOOK_CLASS PIDGIN_IS_SCROLL_BOOK_CLASS
-#define GTK_GAIM_IS_SCROLL_BOOK PIDGIN_IS_SCROLL_BOOK
-#define GTK_GAIM_IS_STATUS_BOX_CLASS PIDGIN_IS_STATUS_BOX_CLASS
-#define GTK_GAIM_IS_STATUS_BOX PIDGIN_IS_STATUS_BOX
-#define GTK_GAIM_SCROLL_BOOK_CLASS PIDGIN_SCROLL_BOOK_CLASS
-#define GTK_GAIM_SCROLL_BOOK_GET_CLASS PIDGIN_SCROLL_BOOK_GET_CLASS
-#define gtk_gaim_scroll_book_get_type pidgin_scroll_book_get_type
-#define gtk_gaim_scroll_book_new pidgin_scroll_book_new
-#define GTK_GAIM_SCROLL_BOOK PIDGIN_SCROLL_BOOK
-#define gtk_gaim_status_box_add pidgin_status_box_add
-#define gtk_gaim_status_box_add_separator pidgin_status_box_add_separator
-#define GTK_GAIM_STATUS_BOX_CLASS PIDGIN_STATUS_BOX_CLASS
-#define gtk_gaim_status_box_get_buddy_icon pidgin_status_box_get_buddy_icon
-#define GTK_GAIM_STATUS_BOX_GET_CLASS PIDGIN_STATUS_BOX_GET_CLASS
-#define gtk_gaim_status_box_get_message pidgin_status_box_get_message
-#define gtk_gaim_status_box_get_type pidgin_status_box_get_type
-#define GtkGaimStatusBoxItemType PidginStatusBoxItemType
-#define gtk_gaim_status_box_new pidgin_status_box_new
-#define gtk_gaim_status_box_new_with_account pidgin_status_box_new_with_account
-#define GTK_GAIM_STATUS_BOX_NUM_TYPES PIDGIN_STATUS_BOX_NUM_TYPES
-#define GtkGaimStatusBox PidginStatusBox
-#define GTK_GAIM_STATUS_BOX PIDGIN_STATUS_BOX
-#define gtk_gaim_status_box_pulse_connecting pidgin_status_box_pulse_connecting
-#define gtk_gaim_status_box_set_buddy_icon pidgin_status_box_set_buddy_icon
-#define gtk_gaim_status_box_set_connecting pidgin_status_box_set_connecting
-#define gtk_gaim_status_box_set_network_available pidgin_status_box_set_network_available
-#define GTK_GAIM_STATUS_BOX_TYPE_CUSTOM PIDGIN_STATUS_BOX_TYPE_CUSTOM
-#define GTK_GAIM_STATUS_BOX_TYPE_POPULAR PIDGIN_STATUS_BOX_TYPE_POPULAR
-#define GTK_GAIM_STATUS_BOX_TYPE_PRIMITIVE PIDGIN_STATUS_BOX_TYPE_PRIMITIVE
-#define GTK_GAIM_STATUS_BOX_TYPE_SAVED PIDGIN_STATUS_BOX_TYPE_SAVED
-#define GTK_GAIM_STATUS_BOX_TYPE_SEPARATOR PIDGIN_STATUS_BOX_TYPE_SEPARATOR
-#define GTK_GAIM_TYPE_SCROLL_BOOK PIDGIN_TYPE_SCROLL_BOOK
-#define GTK_GAIM_TYPE_STATUS_BOX PIDGIN_TYPE_STATUS_BOX
-
-#endif /* _GTKGAIM_COMPAT_H */
--- a/pidgin/gtkmain.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/pidgin/gtkmain.c	Sun Jun 12 17:56:24 2011 +0000
@@ -496,7 +496,6 @@
 	int opt;
 	gboolean gui_check;
 	gboolean debug_enabled;
-	gboolean migration_failed = FALSE;
 	GList *active_accounts;
 	struct stat st;
 
@@ -728,16 +727,6 @@
 
 	purple_debug_set_enabled(debug_enabled);
 
-	/* If we're using a custom configuration directory, we
-	 * do NOT want to migrate, or weird things will happen. */
-	if (opt_config_dir_arg == NULL)
-	{
-		if (!purple_core_migrate())
-		{
-			migration_failed = TRUE;
-		}
-	}
-
 	search_path = g_build_filename(purple_user_dir(), "gtkrc-2.0", NULL);
 	gtk_rc_add_default_file(search_path);
 	g_free(search_path);
@@ -763,37 +752,6 @@
 	winpidgin_init(hint);
 #endif
 
-	if (migration_failed)
-	{
-		char *old = g_strconcat(purple_home_dir(),
-		                        G_DIR_SEPARATOR_S ".gaim", NULL);
-		const char *text = _(
-			"%s encountered errors migrating your settings "
-			"from %s to %s. Please investigate and complete the "
-			"migration by hand. Please report this error at http://developer.pidgin.im");
-		GtkWidget *dialog;
-
-		dialog = gtk_message_dialog_new(NULL,
-		                                0,
-		                                GTK_MESSAGE_ERROR,
-		                                GTK_BUTTONS_CLOSE,
-		                                text, PIDGIN_NAME,
-		                                old, purple_user_dir());
-		g_free(old);
-
-		g_signal_connect_swapped(dialog, "response",
-		                         G_CALLBACK(gtk_main_quit), NULL);
-
-		gtk_widget_show_all(dialog);
-
-		gtk_main();
-
-#ifdef HAVE_SIGNAL_H
-		g_free(segfault_message);
-#endif
-		return 0;
-	}
-
 	purple_core_set_ui_ops(pidgin_core_get_ui_ops());
 	purple_eventloop_set_ui_ops(pidgin_eventloop_get_ui_ops());
 
--- a/pidgin/gtknotify.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/pidgin/gtknotify.c	Sun Jun 12 17:56:24 2011 +0000
@@ -1035,6 +1035,10 @@
 
 		gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview), -1,
 				column->title, renderer, "text", i, NULL);
+
+		if (!purple_notify_searchresult_column_is_visible(column))
+			gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), i), FALSE);
+
 		i++;
 	}
 
--- a/pidgin/gtkprefs.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/pidgin/gtkprefs.c	Sun Jun 12 17:56:24 2011 +0000
@@ -2861,8 +2861,6 @@
 {
 	const char *str = NULL;
 
-	purple_prefs_rename("/gaim/gtk", PIDGIN_PREFS_ROOT);
-
 	/* Rename some old prefs */
 	purple_prefs_rename(PIDGIN_PREFS_ROOT "/logging/log_ims", "/purple/logging/log_ims");
 	purple_prefs_rename(PIDGIN_PREFS_ROOT "/logging/log_chats", "/purple/logging/log_chats");
@@ -2886,12 +2884,6 @@
 		purple_prefs_remove(PIDGIN_PREFS_ROOT "/browsers/command");
 	}
 
-	/* this string pref moved into the core, try to be friendly */
-	purple_prefs_rename(PIDGIN_PREFS_ROOT "/idle/reporting_method", "/purple/away/idle_reporting");
-	if ((str = purple_prefs_get_string("/purple/away/idle_reporting")) &&
-			strcmp(str, "gaim") == 0)
-		purple_prefs_set_string("/purple/away/idle_reporting", "purple");
-
 	/* Remove some no-longer-used prefs */
 	purple_prefs_remove(PIDGIN_PREFS_ROOT "/blist/auto_expand_contacts");
 	purple_prefs_remove(PIDGIN_PREFS_ROOT "/blist/button_style");
--- a/pidgin/gtkrequest.c	Sun Jun 12 17:52:59 2011 +0000
+++ b/pidgin/gtkrequest.c	Sun Jun 12 17:56:24 2011 +0000
@@ -862,6 +862,10 @@
 			gtk_text_buffer_set_text(buffer, value, -1);
 		}
 
+#if GTK_CHECK_VERSION(2,12,0)
+		gtk_widget_set_tooltip_text(textview, purple_request_field_get_tooltip(field));
+#endif
+
 		gtk_text_view_set_editable(GTK_TEXT_VIEW(textview),
 			purple_request_field_string_is_editable(field));
 
@@ -886,6 +890,10 @@
 		if (value != NULL)
 			gtk_entry_set_text(GTK_ENTRY(widget), value);
 
+#if GTK_CHECK_VERSION(2,12,0)
+		gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field));
+#endif
+
 		if (purple_request_field_string_is_masked(field))
 		{
 			gtk_entry_set_visibility(GTK_ENTRY(widget), FALSE);
@@ -926,6 +934,10 @@
 		gtk_entry_set_text(GTK_ENTRY(widget), buf);
 	}
 
+#if GTK_CHECK_VERSION(2,12,0)
+	gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field));
+#endif
+
 	g_signal_connect(G_OBJECT(widget), "focus-out-event",
 					 G_CALLBACK(field_int_focus_out_cb), field);
 
@@ -940,6 +952,10 @@
 	widget = gtk_check_button_new_with_label(
 		purple_request_field_get_label(field));
 
+#if GTK_CHECK_VERSION(2,12,0)
+	gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field));
+#endif
+
 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
 		purple_request_field_bool_get_default_value(field));
 
@@ -970,6 +986,10 @@
 		gtk_combo_box_set_active(GTK_COMBO_BOX(widget),
 						purple_request_field_choice_get_default_value(field));
 
+#if GTK_CHECK_VERSION(2,12,0)
+		gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field));
+#endif
+
 		g_signal_connect(G_OBJECT(widget), "changed",
 						 G_CALLBACK(field_choice_menu_cb), field);
 	}
@@ -987,6 +1007,10 @@
 
 		widget = box;
 
+#if GTK_CHECK_VERSION(2,12,0)
+		gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field));
+#endif
+
 		for (l = labels, i = 0; l != NULL; l = l->next, i++)
 		{
 			const char *text = l->data;
@@ -1034,6 +1058,10 @@
 	g_object_unref(G_OBJECT(loader));
 	g_object_unref(G_OBJECT(scale));
 
+#if GTK_CHECK_VERSION(2,12,0)
+	gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field));
+#endif
+
 	return widget;
 }
 
@@ -1049,6 +1077,10 @@
 		purple_request_field_account_get_filter(field),
 		field);
 
+#if GTK_CHECK_VERSION(2,12,0)
+	gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field));
+#endif
+
 	return widget;
 }
 
--- a/pidgin/pidgin-2-uninstalled.pc.in	Sun Jun 12 17:52:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-
-abs_srcdir=@abs_srcdir@
-abs_builddir=@abs_builddir@
-
-abs_top_srcdir=@abs_top_srcdir@
-abs_top_builddir=@abs_top_builddir@
-
-plugindir=${libdir}/pidgin
-
-Name: Pidgin
-Description: Pidgin is a GTK2-based instant messenger application.
-Version: @VERSION@
-Requires: gtk+-2.0 purple
-Cflags: -I${abs_top_srcdir}
--- a/pidgin/pidgin-2.pc.in	Sun Jun 12 17:52:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-
-plugindir=${libdir}/pidgin
-
-Name: Pidgin
-Description: Pidgin is a GTK2-based instant messenger application.
-Version: @VERSION@
-Requires: gtk+-2.0 purple
-Cflags: -I${includedir}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pidgin-3-uninstalled.pc.in	Sun Jun 12 17:56:24 2011 +0000
@@ -0,0 +1,21 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+datarootdir=@datarootdir@
+datadir=@datadir@
+sysconfdir=@sysconfdir@
+
+abs_srcdir=@abs_srcdir@
+abs_builddir=@abs_builddir@
+
+abs_top_srcdir=@abs_top_srcdir@
+abs_top_builddir=@abs_top_builddir@
+
+plugindir=${libdir}/pidgin
+
+Name: Pidgin
+Description: Pidgin is a GTK2-based instant messenger application.
+Version: @VERSION@
+Requires: gtk+-2.0 purple-3
+Cflags: -I${abs_top_srcdir}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/pidgin-3.pc.in	Sun Jun 12 17:56:24 2011 +0000
@@ -0,0 +1,15 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+datarootdir=@datarootdir@
+datadir=@datadir@
+sysconfdir=@sysconfdir@
+
+plugindir=${libdir}/pidgin
+
+Name: Pidgin
+Description: Pidgin is a GTK2-based instant messenger application.
+Version: @VERSION@
+Requires: gtk+-2.0 purple-3
+Cflags: -I${includedir}
--- a/pidgin/pidgin-uninstalled.pc.in	Sun Jun 12 17:52:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-
-abs_srcdir=@abs_srcdir@
-abs_builddir=@abs_builddir@
-
-plugindir=${libdir}/pidgin
-
-Name: Pidgin
-Description: Pidgin is a GTK2-based instant messenger application.
-Version: @VERSION@
-Requires: gtk+-2.0 purple
-Cflags: -I${abs_srcdir}
--- a/pidgin/pidgin.pc.in	Sun Jun 12 17:52:59 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-
-plugindir=${libdir}/pidgin
-
-Name: Pidgin
-Description: Pidgin is a GTK2-based instant messenger application.
-Version: @VERSION@
-Requires: gtk+-2.0 purple
-Cflags: -I${includedir}/pidgin
-