changeset 25902:be3ba7e07de5

merge of '123d615deaa8daeeea7d7c341a87eab4e83a7958' and 'e3b2ac4f2d9e6a6bc13c0394f980b28a75765258'
author Kevin Stange <kevin@simguy.net>
date Tue, 06 Jan 2009 07:53:19 +0000
parents 4670851af098 (current diff) 68265bcc8814 (diff)
children f8d3447235b1
files ChangeLog.API libpurple/proxy.c
diffstat 46 files changed, 532 insertions(+), 556 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Jan 06 03:46:52 2009 +0000
+++ b/ChangeLog	Tue Jan 06 07:53:19 2009 +0000
@@ -1,5 +1,10 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
+version 2.6.0 (??/??/????):
+	General:
+	* Theme support in libpurple thanks to Justin Rodriguez's summer of code
+	  project.  With some minor additions and clean ups from Paul Aurich.
+
 version 2.5.4 (??/??/????):
 	libpurple:
 	* Fix a connection timeout with empty Gadu-Gady buddy lists. (Martin
--- a/ChangeLog.API	Tue Jan 06 03:46:52 2009 +0000
+++ b/ChangeLog.API	Tue Jan 06 07:53:19 2009 +0000
@@ -23,6 +23,7 @@
 		* purple_request_field_set_ui_data
 		* purple_network_force_online
 		* purple_global_proxy_set_info
+		* purple_strequal
 
 		Deprecated:
 		* purple_buddy_get_local_alias
--- a/libpurple/account.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/account.c	Tue Jan 06 07:53:19 2009 +0000
@@ -178,9 +178,7 @@
 	{
 		const char *string_value = purple_value_get_string(attr_value);
 		const char *default_string_value = purple_value_get_string(default_value);
-		if (((string_value == NULL) && (default_string_value == NULL)) ||
-			((string_value != NULL) && (default_string_value != NULL) &&
-			 !strcmp(string_value, default_string_value)))
+		if (purple_strequal(string_value, default_string_value))
 			return NULL;
 		value = g_strdup(purple_value_get_string(attr_value));
 	}
@@ -506,11 +504,11 @@
 			/* Ignore this setting */
 			continue;
 
-		if (!strcmp(str_type, "string"))
+		if (purple_strequal(str_type, "string"))
 			type = PURPLE_PREF_STRING;
-		else if (!strcmp(str_type, "int"))
+		else if (purple_strequal(str_type, "int"))
 			type = PURPLE_PREF_INT;
-		else if (!strcmp(str_type, "bool"))
+		else if (purple_strequal(str_type, "bool"))
 			type = PURPLE_PREF_BOOLEAN;
 		else
 			/* Ignore this setting */
@@ -655,17 +653,17 @@
 	child = xmlnode_get_child(node, "type");
 	if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL))
 	{
-		if (!strcmp(data, "global"))
+		if (purple_strequal(data, "global"))
 			purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_USE_GLOBAL);
-		else if (!strcmp(data, "none"))
+		else if (purple_strequal(data, "none"))
 			purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_NONE);
-		else if (!strcmp(data, "http"))
+		else if (purple_strequal(data, "http"))
 			purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_HTTP);
-		else if (!strcmp(data, "socks4"))
+		else if (purple_strequal(data, "socks4"))
 			purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_SOCKS4);
-		else if (!strcmp(data, "socks5"))
+		else if (purple_strequal(data, "socks5"))
 			purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_SOCKS5);
-		else if (!strcmp(data, "envvar"))
+		else if (purple_strequal(data, "envvar"))
 			purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_USE_ENVVAR);
 		else
 		{
@@ -2022,7 +2020,7 @@
 	{
 		PurpleStatusType *status_type = (PurpleStatusType *)l->data;
 
-		if (!strcmp(purple_status_type_get_id(status_type), id))
+		if (purple_strequal(purple_status_type_get_id(status_type), id))
 			return status_type;
 	}
 
@@ -2631,11 +2629,11 @@
 
 	for (l = purple_accounts_get_all(); l != NULL; l = l->next) {
 		account = (PurpleAccount *)l->data;
-		if (protocol_id && strcmp(account->protocol_id, protocol_id))
+		if (protocol_id && !purple_strequal(account->protocol_id, protocol_id))
 		  continue;
 
 		who = g_strdup(purple_normalize(account, name));
-		if (!strcmp(purple_normalize(account, purple_account_get_username(account)), who)) {
+		if (purple_strequal(purple_normalize(account, purple_account_get_username(account)), who)) {
 			g_free(who);
 			return account;
 		}
--- a/libpurple/blist.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/blist.c	Tue Jan 06 07:53:19 2009 +0000
@@ -82,7 +82,7 @@
 
 static guint _purple_blist_hbuddy_equal(struct _purple_hbuddy *hb1, struct _purple_hbuddy *hb2)
 {
-	return ((!strcmp(hb1->name, hb2->name)) && hb1->account == hb2->account && hb1->group == hb2->group);
+	return (purple_strequal(hb1->name, hb2->name) && hb1->account == hb2->account && hb1->group == hb2->group);
 }
 
 static void _purple_blist_hbuddy_free_key(struct _purple_hbuddy *hb)
@@ -382,11 +382,11 @@
 	if (!value)
 		return;
 
-	if (!type || !strcmp(type, "string"))
+	if (!type || purple_strequal(type, "string"))
 		purple_blist_node_set_string(node, name, value);
-	else if (!strcmp(type, "bool"))
+	else if (purple_strequal(type, "bool"))
 		purple_blist_node_set_bool(node, name, atoi(value));
-	else if (!strcmp(type, "int"))
+	else if (purple_strequal(type, "int"))
 		purple_blist_node_set_int(node, name, atoi(value));
 
 	g_free(value);
@@ -453,9 +453,9 @@
 	for (x = cnode->child; x; x = x->next) {
 		if (x->type != XMLNODE_TYPE_TAG)
 			continue;
-		if (!strcmp(x->name, "buddy"))
+		if (purple_strequal(x->name, "buddy"))
 			parse_buddy(group, contact, x);
-		else if (!strcmp(x->name, "setting"))
+		else if (purple_strequal(x->name, "setting"))
 			parse_setting((PurpleBlistNode*)contact, x);
 	}
 
@@ -528,12 +528,12 @@
 	for (cnode = groupnode->child; cnode; cnode = cnode->next) {
 		if (cnode->type != XMLNODE_TYPE_TAG)
 			continue;
-		if (!strcmp(cnode->name, "setting"))
+		if (purple_strequal(cnode->name, "setting"))
 			parse_setting((PurpleBlistNode*)group, cnode);
-		else if (!strcmp(cnode->name, "contact") ||
-				!strcmp(cnode->name, "person"))
+		else if (purple_strequal(cnode->name, "contact") ||
+				purple_strequal(cnode->name, "person"))
 			parse_contact(group, cnode);
-		else if (!strcmp(cnode->name, "chat"))
+		else if (purple_strequal(cnode->name, "chat"))
 			parse_chat(group, cnode);
 	}
 }
@@ -590,11 +590,11 @@
 				if (x->type != XMLNODE_TYPE_TAG)
 					continue;
 
-				if (!strcmp(x->name, "permit")) {
+				if (purple_strequal(x->name, "permit")) {
 					name = xmlnode_get_data(x);
 					purple_privacy_permit_add(account, name, TRUE);
 					g_free(name);
-				} else if (!strcmp(x->name, "block")) {
+				} else if (purple_strequal(x->name, "block")) {
 					name = xmlnode_get_data(x);
 					purple_privacy_deny_add(account, name, TRUE);
 					g_free(name);
@@ -1061,7 +1061,7 @@
 	g_return_if_fail(source != NULL);
 	g_return_if_fail(new_name != NULL);
 
-	if (*new_name == '\0' || !strcmp(new_name, source->name))
+	if (*new_name == '\0' || purple_strequal(new_name, source->name))
 		return;
 
 	dest = purple_find_group(new_name);
@@ -1128,7 +1128,7 @@
 
 	/* Notify all PRPLs */
 	/* TODO: Is this condition needed?  Seems like it would always be TRUE */
-	if(old_name && source && strcmp(source->name, old_name)) {
+	if(old_name && purple_strequal(source->name, old_name)) {
 		for (accts = purple_group_get_accounts(source); accts; accts = g_slist_remove(accts, accts->data)) {
 			PurpleAccount *account = accts->data;
 			PurpleConnection *gc = NULL;
--- a/libpurple/buddyicon.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/buddyicon.c	Tue Jan 06 07:53:19 2009 +0000
@@ -988,7 +988,7 @@
 {
 	purple_blist_node_remove_setting(node, setting_name);
 
-	if (!strcmp(setting_name, "buddy_icon"))
+	if (purple_strequal(setting_name, "buddy_icon"))
 	{
 		purple_blist_node_remove_setting(node, "avatar_hash");
 		purple_blist_node_remove_setting(node, "icon_checksum");
@@ -1085,7 +1085,7 @@
 
 		g_free(new_filename);
 
-		if (!strcmp(setting_name, "buddy_icon"))
+		if (purple_strequal(setting_name, "buddy_icon"))
 		{
 			const char *hash;
 
@@ -1100,7 +1100,7 @@
 				PurpleAccount *account = purple_buddy_get_account((PurpleBuddy *)node);
 				const char *prpl_id = purple_account_get_protocol_id(account);
 
-				if (!strcmp(prpl_id, "prpl-yahoo"))
+				if (purple_strequal(prpl_id, "prpl-yahoo"))
 				{
 					int checksum = purple_blist_node_get_int(node, "icon_checksum");
 					if (checksum != 0)
--- a/libpurple/certificate.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/certificate.c	Tue Jan 06 07:53:19 2009 +0000
@@ -791,7 +791,7 @@
 
 	for (cur = lst; cur; cur = cur->next) {
 		x509_ca_element *el = cur->data;
-		if (el->dn && !strcmp(dn, el->dn)) {
+		if (purple_strequal(dn, el->dn)) {
 			return el;
 		}
 	}
--- a/libpurple/cipher.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/cipher.c	Tue Jan 06 07:53:19 2009 +0000
@@ -659,7 +659,7 @@
 
 	hctx = purple_cipher_context_get_data(context);
 
-	if (!strcmp(name, "hash")) {
+	if (purple_strequal(name, "hash")) {
 		g_free(hctx->name);
 		if (hctx->hash)
 			purple_cipher_context_destroy(hctx->hash);
@@ -676,7 +676,7 @@
 
 	hctx = purple_cipher_context_get_data(context);
 
-	if (!strcmp(name, "hash")) {
+	if (purple_strequal(name, "hash")) {
 		return hctx->name;
 	}
 
@@ -1692,11 +1692,11 @@
 
 	ctx = purple_cipher_context_get_data(context);
 
-	if(!strcmp(name, "sizeHi")) {
+	if(purple_strequal(name, "sizeHi")) {
 		ctx->sizeHi = GPOINTER_TO_INT(value);
-	} else if(!strcmp(name, "sizeLo")) {
+	} else if(purple_strequal(name, "sizeLo")) {
 		ctx->sizeLo = GPOINTER_TO_INT(value);
-	} else if(!strcmp(name, "lenW")) {
+	} else if(purple_strequal(name, "lenW")) {
 		ctx->lenW = GPOINTER_TO_INT(value);
 	}
 }
@@ -1707,11 +1707,11 @@
 
 	ctx = purple_cipher_context_get_data(context);
 
-	if(!strcmp(name, "sizeHi")) {
+	if(purple_strequal(name, "sizeHi")) {
 		return GINT_TO_POINTER(ctx->sizeHi);
-	} else if(!strcmp(name, "sizeLo")) {
+	} else if(purple_strequal(name, "sizeLo")) {
 		return GINT_TO_POINTER(ctx->sizeLo);
-	} else if(!strcmp(name, "lenW")) {
+	} else if(purple_strequal(name, "lenW")) {
 		return GINT_TO_POINTER(ctx->lenW);
 	}
 
@@ -1942,7 +1942,7 @@
 
 	ctx = purple_cipher_context_get_data(context);
 
-	if(!strcmp(name, "key_len")) {
+	if(purple_strequal(name, "key_len")) {
 		ctx->key_len = GPOINTER_TO_INT(value);
 	}
 }
@@ -1967,7 +1967,7 @@
 
 	ctx = purple_cipher_context_get_data(context);
 
-	if(!strcmp(name, "key_len")) {
+	if(purple_strequal(name, "key_len")) {
 		return GINT_TO_POINTER(ctx->key_len);
 	}
 
--- a/libpurple/cmds.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/cmds.c	Tue Jan 06 07:53:19 2009 +0000
@@ -236,7 +236,7 @@
 	for (l = cmds; l; l = l->next) {
 		c = l->data;
 
-		if (strcmp(c->cmd, cmd) != 0)
+		if (!purple_strequal(c->cmd, cmd))
 			continue;
 
 		found = TRUE;
@@ -250,8 +250,8 @@
 
 		right_type = TRUE;
 
-		if ((c->flags & PURPLE_CMD_FLAG_PRPL_ONLY) && c->prpl_id &&
-		    (strcmp(c->prpl_id, prpl_id) != 0))
+		if ((c->flags & PURPLE_CMD_FLAG_PRPL_ONLY) &&
+		    !purple_strequal(c->prpl_id, prpl_id))
 			continue;
 
 		right_prpl = TRUE;
@@ -320,8 +320,8 @@
 			if (!(c->flags & PURPLE_CMD_FLAG_CHAT))
 				continue;
 
-		if (conv && (c->flags & PURPLE_CMD_FLAG_PRPL_ONLY) && c->prpl_id &&
-		    (strcmp(c->prpl_id, purple_account_get_protocol_id(purple_conversation_get_account(conv))) != 0))
+		if (conv && (c->flags & PURPLE_CMD_FLAG_PRPL_ONLY) &&
+		    !purple_strequal(c->prpl_id, purple_account_get_protocol_id(purple_conversation_get_account(conv))))
 			continue;
 
 		ret = g_list_append(ret, c->cmd);
@@ -342,7 +342,7 @@
 	for (l = cmds; l; l = l->next) {
 		c = l->data;
 
-		if (cmd && (strcmp(cmd, c->cmd) != 0))
+		if (cmd && !purple_strequal(cmd, c->cmd))
 			continue;
 
 		if (conv && (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM))
@@ -352,8 +352,8 @@
 			if (!(c->flags & PURPLE_CMD_FLAG_CHAT))
 				continue;
 
-		if (conv && (c->flags & PURPLE_CMD_FLAG_PRPL_ONLY) && c->prpl_id &&
-		    (strcmp(c->prpl_id, purple_account_get_protocol_id(purple_conversation_get_account(conv))) != 0))
+		if (conv && (c->flags & PURPLE_CMD_FLAG_PRPL_ONLY) &&
+		    !purple_strequal(c->prpl_id, purple_account_get_protocol_id(purple_conversation_get_account(conv))))
 			continue;
 
 		ret = g_list_append(ret, c->help);
--- a/libpurple/conversation.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/conversation.c	Tue Jan 06 07:53:19 2009 +0000
@@ -912,7 +912,7 @@
 
 				if (purple_account_get_alias(account) != NULL)
 					alias = account->alias;
-				else if (b != NULL && strcmp(purple_buddy_get_name(b), purple_buddy_get_contact_alias(b)))
+				else if (b != NULL && !purple_strequal(purple_buddy_get_name(b), purple_buddy_get_contact_alias(b)))
 					alias = purple_buddy_get_contact_alias(b);
 				else if (purple_connection_get_display_name(gc) != NULL)
 					alias = purple_connection_get_display_name(gc);
@@ -1480,7 +1480,7 @@
 
 		str = g_strdup(purple_normalize(account, who));
 
-		if (!strcmp(str, purple_normalize(account, chat->nick))) {
+		if (purple_strequal(str, purple_normalize(account, chat->nick))) {
 			flags |= PURPLE_MESSAGE_SEND;
 		} else {
 			flags |= PURPLE_MESSAGE_RECV;
@@ -1601,7 +1601,7 @@
 		const char *extra_msg = (extra_msgs ? extra_msgs->data : NULL);
 
 		if(!(prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME)) {
-			if (!strcmp(chat->nick, purple_normalize(conv->account, user))) {
+			if (purple_strequal(chat->nick, purple_normalize(conv->account, user))) {
 				const char *alias2 = purple_account_get_alias(conv->account);
 				if (alias2 != NULL)
 					alias = alias2;
@@ -1692,7 +1692,7 @@
 	prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc));
 	g_return_if_fail(prpl_info != NULL);
 
-	if (!strcmp(chat->nick, purple_normalize(conv->account, old_user))) {
+	if (purple_strequal(chat->nick, purple_normalize(conv->account, old_user))) {
 		const char *alias;
 
 		/* Note this for later. */
--- a/libpurple/core.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/core.c	Tue Jan 06 07:53:19 2009 +0000
@@ -139,7 +139,7 @@
 	 * subsystem right away too.
 	 */
 	purple_plugins_init();
-	
+
 	/* Initialize all static protocols. */
 	static_proto_init();
 
@@ -175,7 +175,6 @@
 	purple_idle_init();
 	purple_smileys_init();
 	purple_theme_manager_init();
-	purple_theme_manager_refresh();
 	/*
 	 * Call this early on to try to auto-detect our IP address and
 	 * hopefully save some time later.
@@ -185,6 +184,9 @@
 	if (ops != NULL && ops->ui_init != NULL)
 		ops->ui_init();
 
+	/* The UI may have registered some theme types, so refresh them */
+	purple_theme_manager_refresh();
+
 	return TRUE;
 }
 
@@ -217,7 +219,6 @@
 	purple_accounts_uninit();
 	purple_savedstatuses_uninit();
 	purple_status_uninit();
-	purple_prefs_uninit();
 	purple_sound_uninit();
 	purple_theme_manager_uninit();
 	purple_xfers_uninit();
@@ -249,6 +250,7 @@
 #ifdef _WIN32
 	wpurple_cleanup();
 #endif
+	purple_prefs_uninit();
 
 	_core = NULL;
 }
@@ -341,15 +343,7 @@
 			const char *user_dir = purple_user_dir();
 			char *dbus_owner_user_dir = purple_dbus_owner_user_dir();
 
-			if (NULL == user_dir && NULL != dbus_owner_user_dir)
-				is_single_instance = TRUE;
-			else if (NULL != user_dir && NULL == dbus_owner_user_dir)
-				is_single_instance = TRUE;
-			else if (NULL == user_dir && NULL == dbus_owner_user_dir)
-				is_single_instance = FALSE;
-			else
-				is_single_instance = strcmp(dbus_owner_user_dir, user_dir);
-
+			is_single_instance = !purple_strequal(dbus_owner_user_dir, user_dir);
 			g_free(dbus_owner_user_dir);
 		}
 	}
@@ -480,7 +474,7 @@
 		if (g_file_test(name, G_FILE_TEST_IS_SYMLINK))
 		{
 			/* We're only going to duplicate a logs symlink. */
-			if (!strcmp(entry, "logs"))
+			if (purple_strequal(entry, "logs"))
 			{
 				char *link;
 #if GLIB_CHECK_VERSION(2,4,0)
@@ -523,7 +517,8 @@
 
 				logs_dir = g_build_filename(user_dir, "logs", NULL);
 
-				if (!strcmp(link, "../.purple/logs") || !strcmp(link, logs_dir))
+				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,
@@ -568,7 +563,7 @@
 		/* Deal with directories... */
 		if (g_file_test(name, G_FILE_TEST_IS_DIR))
 		{
-			if (!strcmp(entry, "icons"))
+			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
@@ -637,7 +632,7 @@
 
 				g_dir_close(icons_dir);
 			}
-			else if (!strcmp(entry, "plugins"))
+			else if (purple_strequal(entry, "plugins"))
 			{
 				/* Do nothing, because we broke plugin compatibility.
 				 * This means that the plugins directory gets left behind. */
--- a/libpurple/desktopitem.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/desktopitem.c	Tue Jan 06 07:53:19 2009 +0000
@@ -108,30 +108,30 @@
 
 	switch (type [0]) {
 	case 'A':
-		if (!strcmp (type, "Application"))
+		if (purple_strequal (type, "Application"))
 			return PURPLE_DESKTOP_ITEM_TYPE_APPLICATION;
 		break;
 	case 'L':
-		if (!strcmp (type, "Link"))
+		if (purple_strequal (type, "Link"))
 			return PURPLE_DESKTOP_ITEM_TYPE_LINK;
 		break;
 	case 'F':
-		if (!strcmp (type, "FSDevice"))
+		if (purple_strequal (type, "FSDevice"))
 			return PURPLE_DESKTOP_ITEM_TYPE_FSDEVICE;
 		break;
 	case 'M':
-		if (!strcmp (type, "MimeType"))
+		if (purple_strequal (type, "MimeType"))
 			return PURPLE_DESKTOP_ITEM_TYPE_MIME_TYPE;
 		break;
 	case 'D':
-		if (!strcmp (type, "Directory"))
+		if (purple_strequal (type, "Directory"))
 			return PURPLE_DESKTOP_ITEM_TYPE_DIRECTORY;
 		break;
 	case 'S':
-		if (!strcmp (type, "Service"))
+		if (purple_strequal (type, "Service"))
 			return PURPLE_DESKTOP_ITEM_TYPE_SERVICE;
 
-		else if (!strcmp (type, "ServiceType"))
+		else if (purple_strequal (type, "ServiceType"))
 			return PURPLE_DESKTOP_ITEM_TYPE_SERVICE_TYPE;
 		break;
 	default:
@@ -149,12 +149,12 @@
 
 	if (section == NULL)
 		return NULL;
-	if (strcmp (section, "Desktop Entry") == 0)
+	if (purple_strequal (section, "Desktop Entry"))
 		return NULL;
 
 	for (li = item->sections; li != NULL; li = li->next) {
 		sec = li->data;
-		if (strcmp (sec->name, section) == 0)
+		if (purple_strequal (sec->name, section))
 			return sec;
 	}
 
@@ -264,7 +264,7 @@
 
 	set (item, attr, value);
 
-	if (strcmp (attr, PURPLE_DESKTOP_ITEM_TYPE) == 0)
+	if (purple_strequal (attr, PURPLE_DESKTOP_ITEM_TYPE))
 		item->type = type_from_string (value);
 }
 
@@ -354,16 +354,16 @@
 			p++;
 			if (*p == ' ')
 				p++;
-			if (strcmp (p, "UTF-8") == 0) {
+			if (purple_strequal (p, "UTF-8")) {
 				return ENCODING_UTF8;
-			} else if (strcmp (p, "Legacy-Mixed") == 0) {
+			} else if (purple_strequal (p, "Legacy-Mixed")) {
 				return ENCODING_LEGACY_MIXED;
 			} else {
 				/* According to the spec we're not supposed
 				 * to read a file like this */
 				return ENCODING_UNKNOWN;
 			}
-		} else if (strcmp ("[KDE Desktop Entry]", buf) == 0) {
+		} else if (purple_strequal ("[KDE Desktop Entry]", buf)) {
 			old_kde = TRUE;
 			/* don't break yet, we still want to support
 			 * Encoding even here */
@@ -557,7 +557,7 @@
 		char *utf8_string;
 		if (char_encoding == NULL)
 			return NULL;
-		if (strcmp (char_encoding, "ASCII") == 0) {
+		if (purple_strequal (char_encoding, "ASCII")) {
 			return decode_string_and_dup (value);
 		}
 		utf8_string = g_convert (value, -1, "UTF-8", char_encoding,
@@ -673,7 +673,7 @@
 	char *val;
 	/* we always store everything in UTF-8 */
 	if (cur_section == NULL &&
-	    strcmp (key, PURPLE_DESKTOP_ITEM_ENCODING) == 0) {
+	    purple_strequal (key, PURPLE_DESKTOP_ITEM_ENCODING)) {
 		k = g_strdup (key);
 		val = g_strdup ("UTF-8");
 	} else {
@@ -697,7 +697,7 @@
 		 * on sort order, so convert to semicolons */
 		if (old_kde &&
 		    cur_section == NULL &&
-		    strcmp (key, PURPLE_DESKTOP_ITEM_SORT_ORDER) == 0 &&
+		    purple_strequal (key, PURPLE_DESKTOP_ITEM_SORT_ORDER) &&
 		    strchr (val, ';') == NULL) {
 			int i;
 			for (i = 0; val[i] != '\0'; i++) {
@@ -720,7 +720,7 @@
 
 		/* Take care of the language part */
 		if (locale != NULL &&
-		    strcmp (locale, "C") == 0) {
+		    purple_strequal (locale, "C")) {
 			char *p;
 			/* Whack C locale */
 			p = strchr (k, '[');
@@ -791,8 +791,7 @@
 						PURPLE_DESKTOP_ITEM_TYPE);
 	if (type == NULL && uri != NULL) {
 		char *base = g_path_get_basename (uri);
-		if (base != NULL &&
-		    strcmp (base, ".directory") == 0) {
+		if (purple_strequal(base, ".directory")) {
 			/* This gotta be a directory */
 			g_hash_table_replace (item->main_hash,
 					      g_strdup (PURPLE_DESKTOP_ITEM_TYPE), 
@@ -813,7 +812,7 @@
 lookup_locale (const PurpleDesktopItem *item, const char *key, const char *locale)
 {
 	if (locale == NULL ||
-	    strcmp (locale, "C") == 0) {
+	    purple_strequal (locale, "C")) {
 		return lookup (item, key);
 	} else {
 		const char *ret;
@@ -857,7 +856,7 @@
 	type = lookup (item, PURPLE_DESKTOP_ITEM_TYPE);
 
 	/* understand old gnome style url exec thingies */
-	if (type != NULL && strcmp (type, "URL") == 0) {
+	if (purple_strequal(type, "URL")) {
 		const char *exec = lookup (item, PURPLE_DESKTOP_ITEM_EXEC);
 		set (item, PURPLE_DESKTOP_ITEM_TYPE, "Link");
 		if (exec != NULL) {
@@ -968,13 +967,11 @@
 					cur_section->keys = g_list_reverse
 						(cur_section->keys);
 				}
-				if (strcmp (CharBuffer,
-					    "KDE Desktop Entry") == 0) {
+				if (purple_strequal (CharBuffer, "KDE Desktop Entry")) {
 					/* Main section */
 					cur_section = NULL;
 					old_kde = TRUE;
-				} else if (strcmp (CharBuffer,
-						   "Desktop Entry") == 0) {
+				} else if (purple_strequal(CharBuffer, "Desktop Entry")) {
 					/* Main section */
 					cur_section = NULL;
 				} else {
--- a/libpurple/ft.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/ft.c	Tue Jan 06 07:53:19 2009 +0000
@@ -700,7 +700,7 @@
 			msg = g_strdup_printf(_("Transfer of file %s complete"),
 								purple_xfer_get_filename(xfer));
 		else
-			msg = g_strdup_printf(_("File transfer complete"));
+			msg = g_strdup(_("File transfer complete"));
 		purple_xfer_conversation_write(xfer, msg, FALSE);
 		g_free(msg);
 	}
@@ -1140,7 +1140,7 @@
 	}
 	else
 	{
-		msg = g_strdup_printf(_("File transfer cancelled"));
+		msg = g_strdup(_("File transfer cancelled"));
 	}
 	purple_xfer_conversation_write(xfer, msg, FALSE);
 	g_free(msg);
--- a/libpurple/idle.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/idle.c	Tue Jan 06 07:53:19 2009 +0000
@@ -126,14 +126,14 @@
 	idle_reporting = purple_prefs_get_string("/purple/away/idle_reporting");
 	auto_away = purple_prefs_get_bool("/purple/away/away_when_idle");
 
-	if (!strcmp(idle_reporting, "system") &&
+	if (purple_strequal(idle_reporting, "system") &&
 		(idle_ui_ops != NULL) && (idle_ui_ops->get_time_idle != NULL))
 	{
 		/* Use system idle time (mouse or keyboard movement, etc.) */
 		time_idle = idle_ui_ops->get_time_idle();
 		idle_recheck_interval = 1;
 	}
-	else if (!strcmp(idle_reporting, "purple"))
+	else if (purple_strequal(idle_reporting, "purple"))
 	{
 		/* Use 'Purple idle' */
 		time_idle = time(NULL) - last_active_time;
--- a/libpurple/log.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/log.c	Tue Jan 06 07:53:19 2009 +0000
@@ -200,7 +200,7 @@
 static guint _purple_logsize_user_equal(struct _purple_logsize_user *lu1,
 		struct _purple_logsize_user *lu2)
 {
-	return (lu1->account == lu2->account && (!strcmp(lu1->name, lu2->name)));
+	return (lu1->account == lu2->account && purple_strequal(lu1->name, lu2->name));
 }
 
 static void _purple_logsize_user_free_key(struct _purple_logsize_user *lu)
@@ -324,7 +324,7 @@
 	GSList *l = loggers;
 	while (l) {
 		logger = l->data;
-		if (!strcmp(logger->id, value)) {
+		if (purple_strequal(logger->id, value)) {
 			purple_log_logger_set(logger);
 			return;
 		}
@@ -406,7 +406,7 @@
 	if (g_slist_find(loggers, logger))
 		return;
 	loggers = g_slist_append(loggers, logger);
-	if (strcmp(purple_prefs_get_string("/purple/logging/format"), logger->id) == 0) {
+	if (purple_strequal(purple_prefs_get_string("/purple/logging/format"), logger->id)) {
 		purple_prefs_trigger_callback("/purple/logging/format");
 	}
 }
@@ -1019,7 +1019,7 @@
 				continue;
 			prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
 
-			if (!strcmp(protocol_unescaped, prpl_info->list_icon((PurpleAccount *)account_iter->data, NULL)))
+			if (purple_strequal(protocol_unescaped, prpl_info->list_icon((PurpleAccount *)account_iter->data, NULL)))
 				accounts = g_list_prepend(accounts, account_iter->data);
 		}
 		g_free(protocol_unescaped);
@@ -1039,7 +1039,7 @@
 			/* Find the account for username in the list of accounts for protocol. */
 			username_unescaped = purple_unescape_filename(username);
 			for (account_iter = g_list_first(accounts) ; account_iter != NULL ; account_iter = account_iter->next) {
-				if (!strcmp(((PurpleAccount *)account_iter->data)->username, username_unescaped)) {
+				if (purple_strequal(((PurpleAccount *)account_iter->data)->username, username_unescaped)) {
 					account = account_iter->data;
 					break;
 				}
@@ -1068,14 +1068,14 @@
 				/* Chat for .chat or .system at the end of the name to determine the type. */
 				if (len >= 7) {
 					gchar *tmp = &name[len - 7];
-					if (!strcmp(tmp, ".system")) {
+					if (purple_strequal(tmp, ".system")) {
 						set->type = PURPLE_LOG_SYSTEM;
 						*tmp = '\0';
 					}
 				}
 				if (len > 5) {
 					gchar *tmp = &name[len - 5];
-					if (!strcmp(tmp, ".chat")) {
+					if (purple_strequal(tmp, ".chat")) {
 						set->type = PURPLE_LOG_CHAT;
 						*tmp = '\0';
 					}
@@ -1773,29 +1773,29 @@
 			sscanf(convostart, "%*s %s %d %d:%d:%d %d",
 			       month, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &tm.tm_year);
 			/* Ugly hack, in case current locale is not English */
-			if (strcmp(month, "Jan") == 0) {
+			if (purple_strequal(month, "Jan")) {
 				tm.tm_mon= 0;
-			} else if (strcmp(month, "Feb") == 0) {
+			} else if (purple_strequal(month, "Feb")) {
 				tm.tm_mon = 1;
-			} else if (strcmp(month, "Mar") == 0) {
+			} else if (purple_strequal(month, "Mar")) {
 				tm.tm_mon = 2;
-			} else if (strcmp(month, "Apr") == 0) {
+			} else if (purple_strequal(month, "Apr")) {
 				tm.tm_mon = 3;
-			} else if (strcmp(month, "May") == 0) {
+			} else if (purple_strequal(month, "May")) {
 				tm.tm_mon = 4;
-			} else if (strcmp(month, "Jun") == 0) {
+			} else if (purple_strequal(month, "Jun")) {
 				tm.tm_mon = 5;
-			} else if (strcmp(month, "Jul") == 0) {
+			} else if (purple_strequal(month, "Jul")) {
 				tm.tm_mon = 6;
-			} else if (strcmp(month, "Aug") == 0) {
+			} else if (purple_strequal(month, "Aug")) {
 				tm.tm_mon = 7;
-			} else if (strcmp(month, "Sep") == 0) {
+			} else if (purple_strequal(month, "Sep")) {
 				tm.tm_mon = 8;
-			} else if (strcmp(month, "Oct") == 0) {
+			} else if (purple_strequal(month, "Oct")) {
 				tm.tm_mon = 9;
-			} else if (strcmp(month, "Nov") == 0) {
+			} else if (purple_strequal(month, "Nov")) {
 				tm.tm_mon = 10;
-			} else if (strcmp(month, "Dec") == 0) {
+			} else if (purple_strequal(month, "Dec")) {
 				tm.tm_mon = 11;
 			}
 			tm.tm_year -= 1900;
@@ -1930,7 +1930,7 @@
 
 		/* Make sure we're dealing with a log file. */
 		ext = &name[len - 4];
-		if (strcmp(ext, ".log")) {
+		if (!purple_strequal(ext, ".log")) {
 			g_free(name);
 			continue;
 		}
@@ -1943,7 +1943,7 @@
 		set->type = PURPLE_LOG_IM;
 		if (len > 9) {
 			char *tmp = &name[len - 9];
-			if (!strcmp(tmp, ".chat")) {
+			if (purple_strequal(tmp, ".chat")) {
 				set->type = PURPLE_LOG_CHAT;
 				*tmp = '\0';
 			}
@@ -1972,7 +1972,7 @@
 				{
 					PurpleBuddy *buddy = (PurpleBuddy *)bnode;
 
-					if (!strcmp(purple_buddy_get_name(buddy), name)) {
+					if (purple_strequal(purple_buddy_get_name(buddy), name)) {
 						set->account = purple_buddy_get_account(buddy);
 						set->buddy = TRUE;
 						found = TRUE;
--- a/libpurple/plugin.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/plugin.c	Tue Jan 06 07:53:19 2009 +0000
@@ -218,7 +218,7 @@
 	g_free(basename);
 	if (plugin != NULL)
 	{
-		if (!strcmp(filename, plugin->path))
+		if (purple_strequal(filename, plugin->path))
 			return plugin;
 		else if (!purple_plugin_is_unloadable(plugin))
 		{
@@ -357,7 +357,7 @@
 		return NULL;
 	}
 	else if (plugin->info->ui_requirement &&
-			strcmp(plugin->info->ui_requirement, purple_core_get_ui()))
+			!purple_strequal(plugin->info->ui_requirement, purple_core_get_ui()))
 	{
 		plugin->error = g_strdup_printf(_("You are using %s, but this plugin requires %s."),
 					purple_core_get_ui(), plugin->info->ui_requirement);
@@ -374,7 +374,7 @@
 	 */
 	if (plugin->info->id == NULL || *plugin->info->id == '\0')
 	{
-		plugin->error = g_strdup_printf(_("This plugin has not defined an ID."));
+		plugin->error = g_strdup(_("This plugin has not defined an ID."));
 		purple_debug_error("plugins", "%s is not loadable: info->id is not defined.\n", plugin->path);
 		plugin->unloadable = TRUE;
 		return plugin;
@@ -1538,7 +1538,7 @@
 	for (l = plugins; l != NULL; l = l->next) {
 		plugin = l->data;
 
-		if (!strcmp(plugin->info->name, name))
+		if (purple_strequal(plugin->info->name, name))
 			return plugin;
 	}
 
@@ -1554,7 +1554,7 @@
 	for (l = plugins; l != NULL; l = l->next) {
 		plugin = l->data;
 
-		if (plugin->path != NULL && !strcmp(plugin->path, filename))
+		if (purple_strequal(plugin->path, filename))
 			return plugin;
 	}
 
@@ -1577,7 +1577,7 @@
 
 		if (plugin->path != NULL) {
 			tmp = purple_plugin_get_basename(plugin->path);
-			if (!strcmp(tmp, basename))
+			if (purple_strequal(tmp, basename))
 			{
 				g_free(tmp);
 				return plugin;
@@ -1603,7 +1603,7 @@
 	{
 		plugin = l->data;
 
-		if (plugin->info->id != NULL && !strcmp(plugin->info->id, id))
+		if (purple_strequal(plugin->info->id, id))
 			return plugin;
 	}
 
--- a/libpurple/pounce.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/pounce.c	Tue Jan 06 07:53:19 2009 +0000
@@ -326,7 +326,7 @@
 		data->buffer = NULL;
 	}
 
-	if (!strcmp(element_name, "pounce")) {
+	if (purple_strequal(element_name, "pounce")) {
 		const char *ui = g_hash_table_lookup(atts, "ui");
 
 		if (ui == NULL) {
@@ -338,7 +338,7 @@
 
 		data->events = 0;
 	}
-	else if (!strcmp(element_name, "account")) {
+	else if (purple_strequal(element_name, "account")) {
 		const char *protocol_id = g_hash_table_lookup(atts, "protocol");
 
 		if (protocol_id == NULL) {
@@ -348,7 +348,7 @@
 		else
 			data->protocol_id = g_strdup(protocol_id);
 	}
-	else if (!strcmp(element_name, "option")) {
+	else if (purple_strequal(element_name, "option")) {
 		const char *type = g_hash_table_lookup(atts, "type");
 
 		if (type == NULL) {
@@ -358,7 +358,7 @@
 		else
 			data->option_type = g_strdup(type);
 	}
-	else if (!strcmp(element_name, "event")) {
+	else if (purple_strequal(element_name, "event")) {
 		const char *type = g_hash_table_lookup(atts, "type");
 
 		if (type == NULL) {
@@ -368,7 +368,7 @@
 		else
 			data->event_type = g_strdup(type);
 	}
-	else if (!strcmp(element_name, "action")) {
+	else if (purple_strequal(element_name, "action")) {
 		const char *type = g_hash_table_lookup(atts, "type");
 
 		if (type == NULL) {
@@ -378,7 +378,7 @@
 		else
 			data->action_name = g_strdup(type);
 	}
-	else if (!strcmp(element_name, "param")) {
+	else if (purple_strequal(element_name, "param")) {
 		const char *param_name = g_hash_table_lookup(atts, "name");
 
 		if (param_name == NULL) {
@@ -404,7 +404,7 @@
 		data->buffer = NULL;
 	}
 
-	if (!strcmp(element_name, "account")) {
+	if (purple_strequal(element_name, "account")) {
 		char *tmp;
 		g_free(data->account_name);
 		data->account_name = g_strdup(buffer);
@@ -412,43 +412,43 @@
 		data->protocol_id = g_strdup(_purple_oscar_convert(buffer, tmp));
 		g_free(tmp);
 	}
-	else if (!strcmp(element_name, "pouncee")) {
+	else if (purple_strequal(element_name, "pouncee")) {
 		g_free(data->pouncee);
 		data->pouncee = g_strdup(buffer);
 	}
-	else if (!strcmp(element_name, "option")) {
-		if (!strcmp(data->option_type, "on-away"))
+	else if (purple_strequal(element_name, "option")) {
+		if (purple_strequal(data->option_type, "on-away"))
 			data->options |= PURPLE_POUNCE_OPTION_AWAY;
 
 		g_free(data->option_type);
 		data->option_type = NULL;
 	}
-	else if (!strcmp(element_name, "event")) {
-		if (!strcmp(data->event_type, "sign-on"))
+	else if (purple_strequal(element_name, "event")) {
+		if (purple_strequal(data->event_type, "sign-on"))
 			data->events |= PURPLE_POUNCE_SIGNON;
-		else if (!strcmp(data->event_type, "sign-off"))
+		else if (purple_strequal(data->event_type, "sign-off"))
 			data->events |= PURPLE_POUNCE_SIGNOFF;
-		else if (!strcmp(data->event_type, "away"))
+		else if (purple_strequal(data->event_type, "away"))
 			data->events |= PURPLE_POUNCE_AWAY;
-		else if (!strcmp(data->event_type, "return-from-away"))
+		else if (purple_strequal(data->event_type, "return-from-away"))
 			data->events |= PURPLE_POUNCE_AWAY_RETURN;
-		else if (!strcmp(data->event_type, "idle"))
+		else if (purple_strequal(data->event_type, "idle"))
 			data->events |= PURPLE_POUNCE_IDLE;
-		else if (!strcmp(data->event_type, "return-from-idle"))
+		else if (purple_strequal(data->event_type, "return-from-idle"))
 			data->events |= PURPLE_POUNCE_IDLE_RETURN;
-		else if (!strcmp(data->event_type, "start-typing"))
+		else if (purple_strequal(data->event_type, "start-typing"))
 			data->events |= PURPLE_POUNCE_TYPING;
-		else if (!strcmp(data->event_type, "typed"))
+		else if (purple_strequal(data->event_type, "typed"))
 			data->events |= PURPLE_POUNCE_TYPED;
-		else if (!strcmp(data->event_type, "stop-typing"))
+		else if (purple_strequal(data->event_type, "stop-typing"))
 			data->events |= PURPLE_POUNCE_TYPING_STOPPED;
-		else if (!strcmp(data->event_type, "message-received"))
+		else if (purple_strequal(data->event_type, "message-received"))
 			data->events |= PURPLE_POUNCE_MESSAGE_RECEIVED;
 
 		g_free(data->event_type);
 		data->event_type = NULL;
 	}
-	else if (!strcmp(element_name, "action")) {
+	else if (purple_strequal(element_name, "action")) {
 		if (data->pounce != NULL) {
 			purple_pounce_action_register(data->pounce, data->action_name);
 			purple_pounce_action_set_enabled(data->pounce, data->action_name, TRUE);
@@ -457,7 +457,7 @@
 		g_free(data->action_name);
 		data->action_name = NULL;
 	}
-	else if (!strcmp(element_name, "param")) {
+	else if (purple_strequal(element_name, "param")) {
 		if (data->pounce != NULL) {
 			purple_pounce_action_set_attribute(data->pounce, data->action_name,
 											 data->param_name, buffer);
@@ -466,7 +466,7 @@
 		g_free(data->param_name);
 		data->param_name = NULL;
 	}
-	else if (!strcmp(element_name, "events")) {
+	else if (purple_strequal(element_name, "events")) {
 		PurpleAccount *account;
 
 		account = purple_accounts_find(data->account_name, data->protocol_id);
@@ -499,11 +499,11 @@
 		g_free(data->pouncee);
 		data->pouncee = NULL;
 	}
-	else if (!strcmp(element_name, "save")) {
+	else if (purple_strequal(element_name, "save")) {
 		if (data->pounce != NULL)
 			purple_pounce_set_save(data->pounce, TRUE);
 	}
-	else if (!strcmp(element_name, "pounce")) {
+	else if (purple_strequal(element_name, "pounce")) {
 		data->pounce  = NULL;
 		data->events  = 0;
 		data->options = 0;
@@ -1023,7 +1023,7 @@
 
 	for (iter = pounces; iter; iter = iter->next) {
 		PurplePounce *pounce = iter->data;
-		if (pounce->ui_type && strcmp(pounce->ui_type, ui) == 0)
+		if (purple_strequal(pounce->ui_type, ui))
 			list = g_list_prepend(list, pounce);
 	}
 	list = g_list_reverse(list);
--- a/libpurple/prefs.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/prefs.c	Tue Jan 06 07:53:19 2009 +0000
@@ -250,33 +250,34 @@
 	GString *pref_name_full;
 	GList *tmp;
 
-	if(strcmp(element_name, "pref") && strcmp(element_name, "item"))
+	if(!purple_strequal(element_name, "pref") &&
+	   !purple_strequal(element_name, "item"))
 		return;
 
 	for(i = 0; attribute_names[i]; i++) {
-		if(!strcmp(attribute_names[i], "name")) {
+		if(purple_strequal(attribute_names[i], "name")) {
 			pref_name = attribute_values[i];
-		} else if(!strcmp(attribute_names[i], "type")) {
-			if(!strcmp(attribute_values[i], "bool"))
+		} else if(purple_strequal(attribute_names[i], "type")) {
+			if(purple_strequal(attribute_values[i], "bool"))
 				pref_type = PURPLE_PREF_BOOLEAN;
-			else if(!strcmp(attribute_values[i], "int"))
+			else if(purple_strequal(attribute_values[i], "int"))
 				pref_type = PURPLE_PREF_INT;
-			else if(!strcmp(attribute_values[i], "string"))
+			else if(purple_strequal(attribute_values[i], "string"))
 				pref_type = PURPLE_PREF_STRING;
-			else if(!strcmp(attribute_values[i], "stringlist"))
+			else if(purple_strequal(attribute_values[i], "stringlist"))
 				pref_type = PURPLE_PREF_STRING_LIST;
-			else if(!strcmp(attribute_values[i], "path"))
+			else if(purple_strequal(attribute_values[i], "path"))
 				pref_type = PURPLE_PREF_PATH;
-			else if(!strcmp(attribute_values[i], "pathlist"))
+			else if(purple_strequal(attribute_values[i], "pathlist"))
 				pref_type = PURPLE_PREF_PATH_LIST;
 			else
 				return;
-		} else if(!strcmp(attribute_names[i], "value")) {
+		} else if(purple_strequal(attribute_names[i], "value")) {
 			pref_value = attribute_values[i];
 		}
 	}
 
-	if(!strcmp(element_name, "item")) {
+	if(purple_strequal(element_name, "item")) {
 		struct purple_pref *pref;
 
 		pref_name_full = g_string_new("");
@@ -301,7 +302,7 @@
 	} else {
 		char *decoded;
 
-		if(!pref_name || !strcmp(pref_name, "/"))
+		if(!pref_name || purple_strequal(pref_name, "/"))
 			return;
 
 		pref_name_full = g_string_new(pref_name);
@@ -352,7 +353,7 @@
 						  const gchar *element_name,
 						  gpointer user_data, GError **error)
 {
-	if(prefs_stack && !strcmp(element_name, "pref")) {
+	if(prefs_stack && purple_strequal(element_name, "pref")) {
 		g_free(prefs_stack->data);
 		prefs_stack = g_list_delete_link(prefs_stack, prefs_stack);
 	}
@@ -521,7 +522,7 @@
 	char *parent_name = get_path_dirname(name);
 	struct purple_pref *ret = &prefs;
 
-	if(strcmp(parent_name, "/")) {
+	if(!purple_strequal(parent_name, "/")) {
 		ret = find_pref(parent_name);
 	}
 
@@ -571,7 +572,7 @@
 	my_name = get_path_basename(name);
 
 	for(sibling = parent->first_child; sibling; sibling = sibling->sibling) {
-		if(!strcmp(sibling->name, my_name)) {
+		if(purple_strequal(sibling->name, my_name)) {
 			g_free(my_name);
 			return NULL;
 		}
@@ -714,7 +715,8 @@
 
 	name = pref_full_name(pref);
 
-	purple_debug_info("prefs", "removing pref %s\n", name);
+	if (prefs_loaded)
+		purple_debug_info("prefs", "removing pref %s\n", name);
 
 	g_hash_table_remove(prefs_hash, name);
 	g_free(name);
@@ -848,10 +850,7 @@
 			return;
 		}
 
-		if((value && !pref->value.string) ||
-				(!value && pref->value.string) ||
-				(value && pref->value.string &&
-				 strcmp(pref->value.string, value))) {
+		if (!purple_strequal(pref->value.string, value)) {
 			g_free(pref->value.string);
 			pref->value.string = g_strdup(value);
 			do_callbacks(name, pref);
@@ -908,10 +907,7 @@
 			return;
 		}
 
-		if((value && !pref->value.string) ||
-				(!value && pref->value.string) ||
-				(value && pref->value.string &&
-				 strcmp(pref->value.string, value))) {
+		if (!purple_strequal(pref->value.string, value)) {
 			g_free(pref->value.string);
 			pref->value.string = g_strdup(value);
 			do_callbacks(name, pref);
@@ -1105,7 +1101,7 @@
 		next = child->sibling;
 		for(newchild = newpref->first_child; newchild != NULL; newchild = newchild->sibling)
 		{
-			if(!strcmp(child->name, newchild->name))
+			if(purple_strequal(child->name, newchild->name))
 			{
 				purple_prefs_rename_node(child, newchild);
 				break;
@@ -1454,7 +1450,7 @@
 		sync_prefs();
 	}
 
-	purple_prefs_disconnect_by_handle(purple_prefs_get_handle());
+	prefs_loaded = FALSE;
 	purple_prefs_destroy();
 	g_hash_table_destroy(prefs_hash);
 	prefs_hash = NULL;
--- a/libpurple/privacy.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/privacy.c	Tue Jan 06 07:53:19 2009 +0000
@@ -261,7 +261,7 @@
 				for (list = account->permit; list != NULL;) {
 					char *person = list->data;
 					list = list->next;
-					if (strcmp(norm, person) != 0)
+					if (!purple_strequal(norm, person))
 						purple_privacy_permit_remove(account, person, local);
 				}
 			}
@@ -305,7 +305,7 @@
 				for (list = account->deny; list != NULL; ) {
 					char *person = list->data;
 					list = list->next;
-					if (strcmp(norm, person) != 0)
+					if (!purple_strequal(norm, person))
 						purple_privacy_deny_remove(account, person, local);
 				}
 			}
--- a/libpurple/protocols/myspace/myspace.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/protocols/myspace/myspace.c	Tue Jan 06 07:53:19 2009 +0000
@@ -540,7 +540,7 @@
 
 	guchar hash_pw[HASH_SIZE];
 	guchar key[HASH_SIZE];
-	gchar *password_utf16le, *password_utf8_lc;
+	gchar *password_truncated, *password_utf16le, *password_utf8_lc;
 	GString *data;
 	guchar *data_out;
 	size_t data_out_len;
@@ -555,10 +555,19 @@
 	g_return_val_if_fail(password != NULL, NULL);
 	g_return_val_if_fail(response_len != NULL, NULL);
 
+	/*
+	 * Truncate password to 10 characters.  Their "change password"
+	 * web page doesn't let you enter more than 10 characters, but you
+	 * can enter more than 10 when logging in on myspace.com and they
+	 * truncate it.
+	 */
+	password_truncated = g_strndup(password, 10);
+
 	/* Convert password to lowercase (required for passwords containing
 	 * uppercase characters). MySpace passwords are lowercase,
 	 * see ticket #2066. */
-	password_utf8_lc = g_utf8_strdown(password, -1);
+	password_utf8_lc = g_utf8_strdown(password_truncated, -1);
+	g_free(password_truncated);
 
 	/* Convert ASCII password to UTF16 little endian */
 	purple_debug_info("msim", "converting password to UTF-16LE\n");
@@ -567,8 +576,6 @@
 			&conv_bytes_read, &conv_bytes_written, &conv_error);
 	g_free(password_utf8_lc);
 
-	g_return_val_if_fail(conv_bytes_read == strlen(password), NULL);
-
 	if (conv_error != NULL) {
 		purple_debug_error("msim",
 				"g_convert password UTF8->UTF16LE failed: %s",
--- a/libpurple/protocols/novell/novell.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/protocols/novell/novell.c	Tue Jan 06 07:53:19 2009 +0000
@@ -2523,8 +2523,8 @@
 	/* The conference was not found, must be closed */
 	chat = purple_find_chat(gc, id);
 	if (chat) {
-		str = g_strdup_printf(_("This conference has been closed."
-								" No more messages can be sent."));
+		str = g_strdup(_("This conference has been closed."
+						 " No more messages can be sent."));
 		purple_conversation_write(chat, NULL, str, PURPLE_MESSAGE_SYSTEM, time(NULL));
 		g_free(str);
 	}
--- a/libpurple/protocols/oscar/oscar.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/protocols/oscar/oscar.c	Tue Jan 06 07:53:19 2009 +0000
@@ -739,21 +739,21 @@
 static char *oscar_icqstatus(int state) {
 	/* Make a cute little string that shows the status of the dude or dudet */
 	if (state & AIM_ICQ_STATE_CHAT)
-		return g_strdup_printf(_("Free For Chat"));
+		return g_strdup(_("Free For Chat"));
 	else if (state & AIM_ICQ_STATE_DND)
-		return g_strdup_printf(_("Do Not Disturb"));
+		return g_strdup(_("Do Not Disturb"));
 	else if (state & AIM_ICQ_STATE_OUT)
-		return g_strdup_printf(_("Not Available"));
+		return g_strdup(_("Not Available"));
 	else if (state & AIM_ICQ_STATE_BUSY)
-		return g_strdup_printf(_("Occupied"));
+		return g_strdup(_("Occupied"));
 	else if (state & AIM_ICQ_STATE_AWAY)
-		return g_strdup_printf(_("Away"));
+		return g_strdup(_("Away"));
 	else if (state & AIM_ICQ_STATE_WEBAWARE)
-		return g_strdup_printf(_("Web Aware"));
+		return g_strdup(_("Web Aware"));
 	else if (state & AIM_ICQ_STATE_INVISIBLE)
-		return g_strdup_printf(_("Invisible"));
+		return g_strdup(_("Invisible"));
 	else
-		return g_strdup_printf(_("Online"));
+		return g_strdup(_("Online"));
 }
 
 static void
@@ -1658,10 +1658,10 @@
 	}
 	if (in != '\n') {
 		char buf[256];
-		GHashTable *ui_info = purple_core_get_ui_info();		
-		g_snprintf(buf, sizeof(buf), _("You may be disconnected shortly.  You may want to use TOC until "
-			"this is fixed.  Check %s for updates."),
-				   ((ui_info && g_hash_table_lookup(ui_info, "website")) ? (char *)g_hash_table_lookup(ui_info, "website") : PURPLE_WEBSITE));
+		GHashTable *ui_info = purple_core_get_ui_info();
+		g_snprintf(buf, sizeof(buf), _("You may be disconnected shortly.  "
+				"If so, check %s for updates."),
+				((ui_info && g_hash_table_lookup(ui_info, "website")) ? (char *)g_hash_table_lookup(ui_info, "website") : PURPLE_WEBSITE));
 		purple_notify_warning(pos->gc, NULL,
 							_("Unable to get a valid AIM login hash."),
 							buf);
--- a/libpurple/protocols/oscar/peer.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/protocols/oscar/peer.c	Tue Jan 06 07:53:19 2009 +0000
@@ -859,7 +859,7 @@
 		{
 			gchar *tmp;
 			PurpleConversation *conv;
-			tmp = g_strdup_printf(_("Attempting to connect via proxy server."));
+			tmp = g_strdup(_("Attempting to connect via proxy server."));
 			conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, conn->sn);
 			purple_conversation_write(conv, NULL, tmp,
 					PURPLE_MESSAGE_SYSTEM, time(NULL));
--- a/libpurple/protocols/qq/ChangeLog	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/protocols/qq/ChangeLog	Tue Jan 06 07:53:19 2009 +0000
@@ -1,3 +1,9 @@
+2008.12.28 - flos <lonicerae(at)gmail.com>
+	* Fixes #7908
+
+2008.12.28 - flos <lonicerae(at)gmail.com>
+	* References #7908
+
 2008.12.25 - flos <lonicerae(at)gmail.com>
 	* References #7821
 	* Updated authors
--- a/libpurple/protocols/qq/qq_network.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/protocols/qq/qq_network.c	Tue Jan 06 07:53:19 2009 +0000
@@ -174,14 +174,16 @@
  *  Please conside tcp_pending and udp_pending */
 gboolean qq_connect_later(gpointer data)
 {
-	PurpleConnection *gc = (PurpleConnection *) data;
-	qq_data *qd;
-	char *server;
+	PurpleConnection *gc;
+	char *tmp_server;
 	int port;
 	gchar **segments;
+	qq_data *qd;
 
+	gc = (PurpleConnection *) data;
 	g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, FALSE);
 	qd = (qq_data *) gc->proto_data;
+	tmp_server = NULL;
 
 	if (qd->check_watcher > 0) {
 		purple_timeout_remove(qd->check_watcher);
@@ -191,9 +193,11 @@
 
 	if (qd->redirect_ip.s_addr != 0) {
 		/* redirect to new server */
-		server = g_strdup_printf("%s:%d", inet_ntoa(qd->redirect_ip), qd->redirect_port);
-		qd->servers = g_list_append(qd->servers, server);
-		qd->curr_server = server;
+		tmp_server = g_strdup_printf("%s:%d", inet_ntoa(qd->redirect_ip), qd->redirect_port);
+		qd->servers = g_list_append(qd->servers, tmp_server);
+
+		qd->curr_server = tmp_server;
+		tmp_server = NULL;
 
 		qd->redirect_ip.s_addr = 0;
 		qd->redirect_port = 0;
@@ -211,21 +215,30 @@
 	}
 
 	segments = g_strsplit_set(qd->curr_server, ":", 0);
-	server = g_strdup(segments[0]);
-	port = atoi(segments[1]);
-	if (port <= 0) {
-		purple_debug_info("QQ", "Port not define in %s\n", qd->curr_server);
+	tmp_server = g_strdup(segments[0]);
+	if (NULL != segments[1]) {
+		port = atoi(segments[1]);
+		if (port <= 0) {
+			purple_debug_info("QQ", "Port not define in %s, use default.\n", qd->curr_server);
+			port = QQ_DEFAULT_PORT;
+		}
+	} else {
+		purple_debug_info("QQ", "Error splitting server string: %s, setting port to default.\n", qd->curr_server);
 		port = QQ_DEFAULT_PORT;
 	}
+
 	g_strfreev(segments);
 
 	qd->connect_retry--;
-	if ( !connect_to_server(gc, server, port) ) {
+	if ( !connect_to_server(gc, tmp_server, port) ) {
 			purple_connection_error_reason(gc,
 				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
 				_("Unable to connect."));
 	}
 
+	g_free(tmp_server);
+	tmp_server = NULL;
+
 	qd->check_watcher = purple_timeout_add_seconds(QQ_CONNECT_CHECK, connect_check, gc);
 	return FALSE;	/* timeout callback stops */
 }
--- a/libpurple/protocols/simple/simple.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/protocols/simple/simple.c	Tue Jan 06 07:53:19 2009 +0000
@@ -1951,8 +1951,7 @@
 	if (userserver[1] == NULL || userserver[1][0] == '\0') {
 		purple_connection_error_reason(gc,
 			PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
-			_("Unable to connect to server. Please enter the "
-			  "address of the server you wish to connect to."));
+			_("SIP connect server not specified"));
 		return;
 	}
 
--- a/libpurple/proxy.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/proxy.c	Tue Jan 06 07:53:19 2009 +0000
@@ -238,13 +238,13 @@
 	g_free(err);
 	err = NULL;
 
-	if (!strcmp(tmp, "none\n")) {
+	if (purple_strequal(tmp, "none\n")) {
 		info.type = PURPLE_PROXY_NONE;
 		g_free(tmp);
 		return &info;
 	}
 
-	if (strcmp(tmp, "manual\n")) {
+	if (purple_strequal(tmp, "manual\n")) {
 		/* Unknown setting.  Fallback to using our global proxy settings. */
 		g_free(tmp);
 		return purple_global_proxy_get_info();
@@ -273,7 +273,7 @@
 	g_free(err);
 	err = NULL;
 
-	if (!strcmp(tmp, "true\n"))
+	if (purple_strequal(tmp, "true\n"))
 		use_same_proxy = TRUE;
 	g_free(tmp);
 	tmp = NULL;
@@ -2252,31 +2252,31 @@
 {
 	PurpleProxyInfo *info = purple_global_proxy_get_info();
 
-	if (!strcmp(name, "/purple/proxy/type")) {
+	if (purple_strequal(name, "/purple/proxy/type")) {
 		int proxytype;
 		const char *type = value;
 
-		if (!strcmp(type, "none"))
+		if (purple_strequal(type, "none"))
 			proxytype = PURPLE_PROXY_NONE;
-		else if (!strcmp(type, "http"))
+		else if (purple_strequal(type, "http"))
 			proxytype = PURPLE_PROXY_HTTP;
-		else if (!strcmp(type, "socks4"))
+		else if (purple_strequal(type, "socks4"))
 			proxytype = PURPLE_PROXY_SOCKS4;
-		else if (!strcmp(type, "socks5"))
+		else if (purple_strequal(type, "socks5"))
 			proxytype = PURPLE_PROXY_SOCKS5;
-		else if (!strcmp(type, "envvar"))
+		else if (purple_strequal(type, "envvar"))
 			proxytype = PURPLE_PROXY_USE_ENVVAR;
 		else
 			proxytype = -1;
 
 		purple_proxy_info_set_type(info, proxytype);
-	} else if (!strcmp(name, "/purple/proxy/host"))
+	} else if (purple_strequal(name, "/purple/proxy/host"))
 		purple_proxy_info_set_host(info, value);
-	else if (!strcmp(name, "/purple/proxy/port"))
+	else if (purple_strequal(name, "/purple/proxy/port"))
 		purple_proxy_info_set_port(info, GPOINTER_TO_INT(value));
-	else if (!strcmp(name, "/purple/proxy/username"))
+	else if (purple_strequal(name, "/purple/proxy/username"))
 		purple_proxy_info_set_username(info, value);
-	else if (!strcmp(name, "/purple/proxy/password"))
+	else if (purple_strequal(name, "/purple/proxy/password"))
 		purple_proxy_info_set_password(info, value);
 }
 
--- a/libpurple/prpl.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/prpl.c	Tue Jan 06 07:53:19 2009 +0000
@@ -511,7 +511,7 @@
 	for (l = purple_plugins_get_protocols(); l != NULL; l = l->next) {
 		plugin = (PurplePlugin *)l->data;
 
-		if (!strcmp(plugin->info->id, id))
+		if (purple_strequal(plugin->info->id, id))
 			return plugin;
 	}
 
--- a/libpurple/savedstatuses.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/savedstatuses.c	Tue Jan 06 07:53:19 2009 +0000
@@ -461,7 +461,7 @@
 	ret = g_new0(PurpleSavedStatus, 1);
 
 	attrib = xmlnode_get_attrib(status, "transient");
-	if ((attrib == NULL) || (strcmp(attrib, "true")))
+	if (!purple_strequal(attrib, "true"))
 	{
 		/* Read the title */
 		attrib = xmlnode_get_attrib(status, "name");
@@ -940,7 +940,7 @@
 	for (iter = saved_statuses; iter != NULL; iter = iter->next)
 	{
 		status = (PurpleSavedStatus *)iter->data;
-		if ((status->title != NULL) && !strcmp(status->title, title))
+		if (purple_strequal(status->title, title))
 			return status;
 	}
 
@@ -975,8 +975,7 @@
 		status = (PurpleSavedStatus *)iter->data;
 		if ((status->type == type) && purple_savedstatus_is_transient(status) &&
 			!purple_savedstatus_has_substatuses(status) &&
-			(((status->message == NULL) && (message == NULL)) ||
-			((status->message != NULL) && (message != NULL) && !strcmp(status->message, message))))
+			purple_strequal(status->message, message))
 		{
 			return status;
 		}
--- a/libpurple/server.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/server.c	Tue Jan 06 07:53:19 2009 +0000
@@ -152,7 +152,7 @@
 	auto_reply_pref = purple_prefs_get_string("/purple/away/auto_reply");
 	if((gc->flags & PURPLE_CONNECTION_AUTO_RESP) &&
 			!purple_presence_is_available(presence) &&
-			strcmp(auto_reply_pref, "never")) {
+			!purple_strequal(auto_reply_pref, "never")) {
 
 		struct last_auto_response *lar;
 		lar = get_last_auto_response(gc, name);
@@ -253,17 +253,14 @@
 		buddies = g_slist_delete_link(buddies, buddies);
 
 		server_alias = purple_buddy_get_server_alias(b);
-		if((server_alias == NULL && alias == NULL) ||
-		    (server_alias && alias && !strcmp(server_alias, alias)))
-		{
+
+		if (purple_strequal(server_alias, alias))
 			continue;
-		}
 
 		purple_blist_server_alias_buddy(b, alias);
 
 		conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, purple_buddy_get_name(b), account);
-		if(conv != NULL && alias != NULL &&
-		   who != NULL && strcmp(alias, who))
+		if (conv != NULL && alias != NULL && purple_strequal(alias, who))
 		{
 			char *escaped = g_markup_escape_text(who, -1);
 			char *escaped2 = g_markup_escape_text(alias, -1);
@@ -298,7 +295,7 @@
 		buddies = g_slist_delete_link(buddies, buddies);
 
 		balias = purple_buddy_get_local_buddy_alias(b);
-		if((!balias && !alias) || (balias && alias && !strcmp(balias, alias)))
+		if (purple_strequal(balias, alias))
 			continue;
 
 		purple_blist_alias_buddy(b, alias);
@@ -673,8 +670,8 @@
 		if ((primitive == PURPLE_STATUS_AVAILABLE) ||
 			(primitive == PURPLE_STATUS_INVISIBLE) ||
 			mobile ||
-		    !strcmp(auto_reply_pref, "never") ||
-		    (!purple_presence_is_idle(presence) && !strcmp(auto_reply_pref, "awayidle")))
+		    purple_strequal(auto_reply_pref, "never") ||
+		    (!purple_presence_is_idle(presence) && purple_strequal(auto_reply_pref, "awayidle")))
 		{
 			g_free(name);
 			return;
--- a/libpurple/status.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/status.c	Tue Jan 06 07:53:19 2009 +0000
@@ -203,7 +203,7 @@
 
     for (i = 0; i < PURPLE_STATUS_NUM_PRIMITIVES; i++)
     {
-        if (!strcmp(id, status_primitive_map[i].id))
+		if (purple_strequal(id, status_primitive_map[i].id))
             return status_primitive_map[i].type;
     }
 
@@ -451,7 +451,7 @@
 	{
 		PurpleStatusAttr *attr = (PurpleStatusAttr *)l->data;
 
-		if (!strcmp(purple_status_attr_get_id(attr), id))
+		if (purple_strequal(purple_status_attr_get_id(attr), id))
 			return attr;
 	}
 
@@ -477,7 +477,7 @@
 	{
 		status_type = status_types->data;
 
-		if (!strcmp(id, status_type->id))
+		if (purple_strequal(id, status_type->id))
 			return status_type;
 
 		status_types = status_types->next;
@@ -782,12 +782,8 @@
 		{
 			const gchar *string_data = l->data;
 			l = l->next;
-			if (((string_data == NULL) && (value->data.string_data == NULL)) ||
-				((string_data != NULL) && (value->data.string_data != NULL) &&
-				!strcmp(string_data, value->data.string_data)))
-			{
+			if (purple_strequal(string_data, value->data.string_data))
 				continue;
-			}
 			purple_status_set_attr_string(status, id, string_data);
 			changed = TRUE;
 		}
@@ -1451,7 +1447,7 @@
 		{
 			PurpleStatus *temp_status = l->data;
 
-			if (!strcmp(status_id, purple_status_get_id(temp_status)))
+			if (purple_strequal(status_id, purple_status_get_id(temp_status)))
 				status = temp_status;
 		}
 
--- a/libpurple/stun.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/stun.c	Tue Jan 06 07:53:19 2009 +0000
@@ -388,9 +388,7 @@
 		/** Deal with the server name having changed since we did the
 		    lookup */
 		if (servername && strlen(servername) > 1
-				&& ((nattype.servername
-					&& strcmp(servername, nattype.servername))
-				|| !nattype.servername)) {
+				&& !purple_strequal(servername, nattype.servername)) {
 			use_cached_result = FALSE;
 		}
 
--- a/libpurple/util.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/util.c	Tue Jan 06 07:53:19 2009 +0000
@@ -1409,7 +1409,7 @@
 						struct purple_parse_tag *pt = tags->data;
 						if(xhtml)
 							g_string_append_printf(xhtml, "</%s>", pt->dest_tag);
-						if(plain && !strcmp(pt->src_tag, "a")) {
+						if(plain && purple_strequal(pt->src_tag, "a")) {
 							/* if this is a link, we have to add the url to the plaintext, too */
 							if (cdata && url &&
 									(!g_string_equal(cdata, url) && (g_ascii_strncasecmp(url->str, "mailto:", 7) != 0 ||
@@ -2949,7 +2949,7 @@
 	g_free(tmp);
 
 	session = g_getenv("KDE_FULL_SESSION");
-	if (session != NULL && !strcmp(session, "true"))
+	if (purple_strequal(session, "true"))
 		return TRUE;
 
 	/* If you run Purple from Konsole under !KDE, this will provide a
@@ -2990,6 +2990,17 @@
 /**************************************************************************
  * String Functions
  **************************************************************************/
+gboolean
+purple_strequal(const gchar *left, const gchar *right)
+{
+#if GLIB_CHECK_VERSION(2,16,0)
+	return (g_strcmp0(left, right) == 0);
+#else
+	return ((left == NULL && right == NULL) ||
+	        (left != NULL && right != NULL && strcmp(left, right) == 0));
+#endif
+}
+
 const char *
 purple_normalize(const PurpleAccount *account, const char *str)
 {
@@ -3104,7 +3115,7 @@
 	g_return_val_if_fail(x != NULL, FALSE);
 
 	off = strlen(s) - strlen(x);
-	return (off >= 0 && !strcmp(s + off, x));
+	return (off >= 0 && purple_strequal(s + off, x));
 #endif
 }
 
@@ -4701,7 +4712,7 @@
 
 const char *_purple_oscar_convert(const char *act, const char *protocol)
 {
-	if (protocol && act && strcmp(protocol, "prpl-oscar") == 0) {
+	if (act && purple_strequal(protocol, "prpl-oscar")) {
 		int i;
 		for (i = 0; act[i] != '\0'; i++)
 			if (!isdigit(act[i]))
--- a/libpurple/util.h	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/util.h	Tue Jan 06 07:53:19 2009 +0000
@@ -775,6 +775,20 @@
 /*@{*/
 
 /**
+ * Tests two strings for equality.
+ *
+ * Unlike strcmp(), this function will not crash if one or both of the
+ * strings are @c NULL.
+ *
+ * @param left	A string
+ * @param right A string to compare with left
+ *
+ * @return @c TRUE if the strings are the same, else @c FALSE.
+ * @since 2.6.0
+ */
+gboolean purple_strequal(const gchar *left, const gchar *right);
+
+/**
  * Normalizes a string, so that it is suitable for comparison.
  *
  * The returned string will point to a static buffer, so if the
--- a/libpurple/whiteboard.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/whiteboard.c	Tue Jan 06 07:53:19 2009 +0000
@@ -115,7 +115,7 @@
 	{
 		wb = l->data;
 
-		if(wb->account == account && !strcmp(wb->who, who))
+		if(wb->account == account && purple_strequal(wb->who, who))
 			return wb;
 
 		l = l->next;
--- a/libpurple/xmlnode.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/libpurple/xmlnode.c	Tue Jan 06 07:53:19 2009 +0000
@@ -129,7 +129,7 @@
 	for(attr_node = node->child; attr_node; attr_node = attr_node->next)
 	{
 		if(attr_node->type == XMLNODE_TYPE_ATTRIB &&
-				!strcmp(attr_node->name, attr))
+				purple_strequal(attr_node->name, attr))
 		{
 			if(sibling == NULL) {
 				node->child = attr_node->next;
@@ -146,20 +146,6 @@
 	}
 }
 
-/* Compare two nullable xmlns strings.
- * They are considered equal if they're both NULL or the strings are equal
- */
-static gboolean _xmlnode_compare_xmlns(const char *xmlns1, const char *xmlns2) {
-	gboolean equal = FALSE;
-
-	if (xmlns1 == NULL && xmlns2 == NULL)
-		equal = TRUE;
-	else if (xmlns1 != NULL && xmlns2 != NULL && !strcmp(xmlns1, xmlns2))
-		equal = TRUE;
-
-	return equal;
-}
-
 void
 xmlnode_remove_attrib_with_namespace(xmlnode *node, const char *attr, const char *xmlns)
 {
@@ -171,8 +157,8 @@
 	for(attr_node = node->child; attr_node; attr_node = attr_node->next)
 	{
 		if(attr_node->type == XMLNODE_TYPE_ATTRIB &&
-		   !strcmp(attr_node->name, attr) &&
-		   _xmlnode_compare_xmlns(xmlns, attr_node->xmlns))
+		   purple_strequal(attr,  attr_node->name) &&
+		   purple_strequal(xmlns, attr_node->xmlns))
 		{
 			if(sibling == NULL) {
 				node->child = attr_node->next;
@@ -252,7 +238,7 @@
 	g_return_val_if_fail(attr != NULL, NULL);
 
 	for(x = node->child; x; x = x->next) {
-		if(x->type == XMLNODE_TYPE_ATTRIB && !strcmp(attr, x->name)) {
+		if(x->type == XMLNODE_TYPE_ATTRIB && purple_strequal(attr, x->name)) {
 			return x->data;
 		}
 	}
@@ -270,8 +256,8 @@
 
 	for(x = node->child; x; x = x->next) {
 		if(x->type == XMLNODE_TYPE_ATTRIB &&
-		   !strcmp(attr, x->name) &&
-		   _xmlnode_compare_xmlns(xmlns, x->xmlns)) {
+		   purple_strequal(attr,  x->name) &&
+		   purple_strequal(xmlns, x->xmlns)) {
 			return x->data;
 		}
 	}
@@ -382,8 +368,8 @@
 		if(ns)
 			xmlns = xmlnode_get_namespace(x);
 
-		if(x->type == XMLNODE_TYPE_TAG && name && !strcmp(parent_name, x->name)
-				&& (!ns || (xmlns && !strcmp(ns, xmlns)))) {
+		if(x->type == XMLNODE_TYPE_TAG && purple_strequal(parent_name, x->name)
+				&& purple_strequal(ns, xmlns)) {
 			ret = x;
 			break;
 		}
@@ -471,7 +457,7 @@
 		g_hash_table_foreach(node->namespace_map,
 			(GHFunc)xmlnode_to_str_foreach_append_ns, text);
 	} else if (node->xmlns) {
-		if(!node->parent || !node->parent->xmlns || strcmp(node->xmlns, node->parent->xmlns))
+		if(!node->parent || !purple_strequal(node->xmlns, node->parent->xmlns))
 		{
 			char *xmlns = g_markup_escape_text(node->xmlns, -1);
 			g_string_append_printf(text, " xmlns='%s'", xmlns);
@@ -866,8 +852,8 @@
 		if(ns)
 			xmlns = xmlnode_get_namespace(sibling);
 
-		if(sibling->type == XMLNODE_TYPE_TAG && !strcmp(node->name, sibling->name) &&
-				(!ns || (xmlns && !strcmp(ns, xmlns))))
+		if(sibling->type == XMLNODE_TYPE_TAG && purple_strequal(node->name, sibling->name) &&
+				purple_strequal(ns, xmlns))
 			return sibling;
 	}
 
--- a/pidgin/gtkblist-theme-loader.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/pidgin/gtkblist-theme-loader.c	Tue Jan 06 07:53:19 2009 +0000
@@ -42,10 +42,10 @@
 	xmlnode *root_node = NULL, *sub_node, *sub_sub_node;
 	gchar *filename_full, *data;
 	const gchar *temp;
-	gboolean sucess = TRUE;
+	gboolean success = TRUE;
 	GdkColor *bgcolor, *expanded_bgcolor, *collapsed_bgcolor, *contact_color;
 	GdkColor color;
-	FontColorPair *expanded, *collapsed, *contact, *online, *away, *offline, *idle, *message, *status;
+	FontColorPair *expanded, *collapsed, *contact, *online, *away, *offline, *idle, *message, *message_nick_said, *status;
 	PidginBlistLayout *layout;
 	PidginBlistTheme *theme;
 
@@ -79,10 +79,11 @@
 	offline = g_new0(FontColorPair, 1);
 	idle = g_new0(FontColorPair, 1);
 	message = g_new0(FontColorPair, 1); 
+	message_nick_said = g_new0(FontColorPair, 1);
 	status = g_new0(FontColorPair, 1);
 
 	/* <blist> */
-	if ((sucess = (sub_node = xmlnode_get_child(root_node, "blist")) != NULL)) {
+	if ((success = (sub_node = xmlnode_get_child(root_node, "blist")) != NULL)) {
 		if ((temp = xmlnode_get_attrib(sub_node, "color")) != NULL && gdk_color_parse(temp, bgcolor))
 			gdk_colormap_alloc_color(gdk_colormap_get_system(), bgcolor, FALSE, TRUE);
 		else {
@@ -92,8 +93,8 @@
 	}
 
 	/* <groups> */
-	if ((sucess = sucess && (sub_node = xmlnode_get_child(root_node, "groups")) != NULL
-		     && (sub_sub_node = xmlnode_get_child(sub_node, "expanded")) != NULL)) {
+	if ((success = (success && (sub_node = xmlnode_get_child(root_node, "groups")) != NULL
+		     && (sub_sub_node = xmlnode_get_child(sub_node, "expanded")) != NULL))) {
 
 		expanded->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
 
@@ -110,7 +111,7 @@
 		}
 	}
 
-	if ((sucess = sucess && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "collapsed")) != NULL)) {
+	if ((success = (success && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "collapsed")) != NULL))) {
 
 		collapsed->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
 
@@ -127,8 +128,8 @@
 	}
 
 	/* <buddys> */
-	if ((sucess = sucess && (sub_node = xmlnode_get_child(root_node, "buddys")) != NULL &&
-		     (sub_sub_node = xmlnode_get_child(sub_node, "placement")) != NULL)) { 
+	if ((success = (success && (sub_node = xmlnode_get_child(root_node, "buddys")) != NULL &&
+		     (sub_sub_node = xmlnode_get_child(sub_node, "placement")) != NULL))) { 
 
 		layout->status_icon = (temp = xmlnode_get_attrib(sub_sub_node, "status_icon")) != NULL ? atoi(temp) : 0;
 		layout->text = (temp = xmlnode_get_attrib(sub_sub_node, "name")) != NULL ? atoi(temp) : 1;
@@ -138,7 +139,7 @@
 		layout->show_status = (temp = xmlnode_get_attrib(sub_sub_node, "status_icon")) != NULL ? atoi(temp) != 0 : 1;
 	}
 
-	if ((sucess = sucess && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "background")) != NULL)) {
+	if ((success = (success && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "background")) != NULL))) {
 		if(gdk_color_parse(xmlnode_get_attrib(sub_sub_node, "color"), contact_color))
 			gdk_colormap_alloc_color(gdk_colormap_get_system(), contact_color, FALSE, TRUE);
 		else {
@@ -147,49 +148,56 @@
 		}
 	}
 	
-	if ((sucess = sucess && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "contact_text")) != NULL)) {
+	if ((success = (success && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "contact_text")) != NULL))) {
 		contact->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
 		if(gdk_color_parse(temp = xmlnode_get_attrib(sub_sub_node, "color"), &color))
 			contact->color = g_strdup(temp);
 		else contact->color = g_strdup(DEFAULT_TEXT_COLOR);
 	}
 
-	if ((sucess = sucess && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "online_text")) != NULL)) {
+	if ((success = (success && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "online_text")) != NULL))) {
 		online->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
 		if(gdk_color_parse(temp = xmlnode_get_attrib(sub_sub_node, "color"), &color))
 			online->color = g_strdup(temp);
 		else online->color = g_strdup(DEFAULT_TEXT_COLOR);
 	}
 
-	if ((sucess = sucess && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "away_text")) != NULL)) {
+	if ((success = (success && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "away_text")) != NULL))) {
 		away->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
 		if(gdk_color_parse(temp = xmlnode_get_attrib(sub_sub_node, "color"), &color))
 			away->color = g_strdup(temp);
 		else away->color = g_strdup(DEFAULT_TEXT_COLOR);
 	}
 
-	if ((sucess = sucess && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "offline_text")) != NULL)) {
+	if ((success = (success && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "offline_text")) != NULL))) {
 		offline->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
 		if(gdk_color_parse(temp = xmlnode_get_attrib(sub_sub_node, "color"), &color))
 			online->color = g_strdup(temp);
 		else online->color = g_strdup(DEFAULT_TEXT_COLOR);
 	}
 
-	if ((sucess = sucess && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "idle_text")) != NULL)) {
+	if ((success = (success && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "idle_text")) != NULL))) {
 		idle->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
 		if(gdk_color_parse(temp = xmlnode_get_attrib(sub_sub_node, "color"), &color))
 			idle->color = g_strdup(temp);
 		else online->color = g_strdup(DEFAULT_TEXT_COLOR);
 	}
 	
-	if ((sucess = sucess && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "message_text")) != NULL)) {
+	if ((success = (success && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "message_text")) != NULL))) {
 		message->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
 		if(gdk_color_parse(temp = xmlnode_get_attrib(sub_sub_node, "color"), &color))
 			message->color = g_strdup(temp);
 		else message->color = g_strdup(DEFAULT_TEXT_COLOR);
 	}
+
+	if ((success = (success && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "message_nick_said_text")) != NULL))) {
+		message_nick_said->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
+		if(gdk_color_parse(temp = xmlnode_get_attrib(sub_sub_node, "color"), &color))
+			message_nick_said->color = g_strdup(temp);
+		else message_nick_said->color = g_strdup(DEFAULT_TEXT_COLOR);
+	}
 	
-	if ((sucess = sucess && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "status_text")) != NULL)) {
+	if ((success = (success && sub_node != NULL && (sub_sub_node = xmlnode_get_child(sub_node, "status_text")) != NULL))) {
 		status->font = g_strdup(xmlnode_get_attrib(sub_sub_node, "font"));
 		if(gdk_color_parse(temp = xmlnode_get_attrib(sub_sub_node, "color"), &color))
 			status->color = g_strdup(temp);
@@ -197,7 +205,7 @@
 	}
 
 	/* name is required for theme manager */
-	sucess = sucess && xmlnode_get_attrib(root_node, "name") != NULL;
+	success = (success && xmlnode_get_attrib(root_node, "name") != NULL);
 
 	/* the new theme */
 	theme = g_object_new(PIDGIN_TYPE_BLIST_THEME,
@@ -220,13 +228,14 @@
 			    "offline", offline,
 			    "idle", idle,
 			    "message", message,
+			    "message_nick_said", message_nick_said,
 			    "status", status, NULL);
 
 	xmlnode_free(root_node);	
 	g_free(data);
 
 	/* malformed xml file - also frees all partial data*/
-	if (!sucess) {
+	if (!success) {
 		g_object_unref(theme);
 		theme = NULL;
 	}
--- a/pidgin/gtkblist-theme.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/pidgin/gtkblist-theme.c	Tue Jan 06 07:53:19 2009 +0000
@@ -52,6 +52,7 @@
 	FontColorPair *offline;
 	FontColorPair *idle;
 	FontColorPair *message;
+	FontColorPair *message_nick_said;
 
 	FontColorPair *status;
 
@@ -82,6 +83,7 @@
 	PROP_OFFLINE,
 	PROP_IDLE,
 	PROP_MESSAGE,
+	PROP_MESSAGE_NICK_SAID,
 	PROP_STATUS,
 };
 
@@ -161,6 +163,9 @@
 		case PROP_MESSAGE:
 			g_value_set_pointer(value, pidgin_blist_theme_get_unread_message_text_info(theme));
 			break;
+		case PROP_MESSAGE_NICK_SAID:
+			g_value_set_pointer(value, pidgin_blist_theme_get_unread_message_nick_said_text_info(theme));
+			break;
 		case PROP_STATUS:
 			g_value_set_pointer(value, pidgin_blist_theme_get_status_text_info(theme));
 			break;
@@ -219,6 +224,9 @@
 		case PROP_MESSAGE:
 			pidgin_blist_theme_set_unread_message_text_info(theme, g_value_get_pointer(value));
 			break;
+		case PROP_MESSAGE_NICK_SAID:
+			pidgin_blist_theme_set_unread_message_nick_said_text_info(theme, g_value_get_pointer(value));
+			break;
 		case PROP_STATUS:
 			pidgin_blist_theme_set_status_text_info(theme, g_value_get_pointer(value));
 			break;
@@ -247,6 +255,7 @@
 	free_font_and_color(priv->away);
 	free_font_and_color(priv->offline);
 	free_font_and_color(priv->message);
+	free_font_and_color(priv->message_nick_said);
 	free_font_and_color(priv->status);
 
 	g_free(priv);
@@ -331,10 +340,15 @@
 	g_object_class_install_property(obj_class, PROP_IDLE, pspec);
 
 	pspec = g_param_spec_pointer("message", "Message Text",
-                                     "The text information for when a buddy is has an unread message",
+                                     "The text information for when a buddy has an unread message",
                                      G_PARAM_READWRITE);
 	g_object_class_install_property(obj_class, PROP_MESSAGE, pspec);
 
+	pspec = g_param_spec_pointer("message_nick_said", "Message (Nick Said) Text",
+                                     "The text information for when a chat has an unread message that mentions your nick",
+                                     G_PARAM_READWRITE);
+	g_object_class_install_property(obj_class, PROP_MESSAGE_NICK_SAID, pspec);
+
 	pspec = g_param_spec_pointer("status", "Status Text",
                                      "The text information for a buddy's status",
                                      G_PARAM_READWRITE);
@@ -540,6 +554,18 @@
 }
 
 FontColorPair *
+pidgin_blist_theme_get_unread_message_nick_said_text_info(PidginBlistTheme *theme)
+{
+	PidginBlistThemePrivate *priv;
+
+	g_return_val_if_fail(PIDGIN_IS_BLIST_THEME(theme), NULL);
+
+	priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme));
+
+	return priv->message_nick_said;
+}
+
+FontColorPair *
 pidgin_blist_theme_get_status_text_info(PidginBlistTheme *theme)
 {
 	PidginBlistThemePrivate *priv;
@@ -730,6 +756,19 @@
 }
 
 void
+pidgin_blist_theme_set_unread_message_nick_said_text_info(PidginBlistTheme *theme, FontColorPair *pair)
+{
+	PidginBlistThemePrivate *priv;
+
+	g_return_if_fail(PIDGIN_IS_BLIST_THEME(theme));
+
+	priv = PIDGIN_BLIST_THEME_GET_PRIVATE(G_OBJECT(theme));
+
+	free_font_and_color(priv->message_nick_said);
+	priv->message_nick_said = pair;
+}
+
+void
 pidgin_blist_theme_set_status_text_info(PidginBlistTheme *theme, FontColorPair *pair)
 {
 	PidginBlistThemePrivate *priv;
--- a/pidgin/gtkblist-theme.h	Tue Jan 06 03:46:52 2009 +0000
+++ b/pidgin/gtkblist-theme.h	Tue Jan 06 07:53:19 2009 +0000
@@ -200,6 +200,14 @@
  FontColorPair *pidgin_blist_theme_get_unread_message_text_info(PidginBlistTheme *theme);
 
 /**
+ * Returns the text font and color to be used for chats with unread messages
+ * that mention your nick.
+ *
+ * @returns 	a font and color pair
+ */
+ FontColorPair *pidgin_blist_theme_get_unread_message_nick_said_text_info(PidginBlistTheme *theme);
+
+/**
  * Returns the text font and color to be used for a buddy's status message 
  *
  * @returns 	a font and color pair
@@ -300,13 +308,21 @@
 void pidgin_blist_theme_set_idle_text_info(PidginBlistTheme *theme, FontColorPair *pair);
 
 /**
- * Sets the text color and font to be used for buddies with an unread message
+ * Sets the text color and font to be used for buddies with unread messages
  *
  * @param pair		the new text font at color pair
  */
 void pidgin_blist_theme_set_unread_message_text_info(PidginBlistTheme *theme, FontColorPair *pair);
 
 /**
+ * Sets the text color and font to be used for a chat with unread messages
+ * that mention your nick
+ *
+ * @param pair		the new text font at color pair
+ */
+void pidgin_blist_theme_set_unread_message_nick_said_text_info(PidginBlistTheme *theme, FontColorPair *pair);
+
+/**
  * Sets the text color and font to be used for buddy status messages
  *
  * @param pair		the new text font at color pair
--- a/pidgin/gtkblist.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/pidgin/gtkblist.c	Tue Jan 06 07:53:19 2009 +0000
@@ -171,7 +171,8 @@
 static void set_urgent(void);
 
 typedef enum {
-	PIDGIN_BLIST_NODE_HAS_PENDING_MESSAGE    =  1 << 0,  /* Whether there's pending message in a conversation */
+	PIDGIN_BLIST_NODE_HAS_PENDING_MESSAGE            =  1 << 0,  /* Whether there's pending message in a conversation */
+	PIDGIN_BLIST_CHAT_HAS_PENDING_MESSAGE_WITH_NICK	 =  1 << 1,  /* Whether there's a pending message in a chat that mentions our nick */
 } PidginBlistNodeFlags;
 
 typedef struct _pidgin_blist_node {
@@ -784,10 +785,10 @@
 
 	if (name && account) {
 		pidgin_log_show(type, name, account);
-		g_free(name);
-
 		pidgin_clear_cursor(gtkblist->window);
 	}
+
+	g_free(name);
 }
 
 static void gtk_blist_menu_showoffline_cb(GtkWidget *w, PurpleBlistNode *node)
@@ -3866,7 +3867,7 @@
 	PurpleConversation *conv = find_conversation_with_buddy(b);
 	gboolean hidden_conv = FALSE;
 	gboolean biglist = purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/blist/show_buddy_icons");
-	FontColorPair *pair;
+	FontColorPair *pair = NULL;
 	PidginBlistTheme *theme;
 
 	if (conv != NULL) {
@@ -3984,39 +3985,42 @@
 	/* choose the colors of the text */
 	theme = pidgin_blist_get_theme();
 
-	if (theme == NULL) {
-		status_color = name_color = "dim grey";
-		status_font = name_font = "";
-
-	} else  if (purple_presence_is_idle(presence)) {
-		pair = pidgin_blist_theme_get_idle_text_info(theme);
+	if (purple_presence_is_idle(presence)) {
+		if (theme)
+			pair = pidgin_blist_theme_get_idle_text_info(theme);
 		status_color = name_color = (pair != NULL && pair->color != NULL) ? pair->color : "dim grey";
 		status_font = name_font = (pair != NULL && pair->font != NULL) ? pair->font : "";
 
 	} else if (!purple_presence_is_online(presence)) {
-		pair = pidgin_blist_theme_get_offline_text_info(theme);
+		if (theme)
+			pair = pidgin_blist_theme_get_offline_text_info(theme);
 		name_color = (pair != NULL && pair->color != NULL) ? pair->color : "black";
 		name_font = (pair != NULL && pair->font != NULL) ? pair->font : "";
 
-		pair = pidgin_blist_theme_get_status_text_info(theme);
-		status_color = (pair != NULL && pair->color != NULL) ? g_strdup(pair->color) : "dim grey";
+		if (theme)
+			pair = pidgin_blist_theme_get_status_text_info(theme);
+		status_color = (pair != NULL && pair->color != NULL) ? pair->color : "dim grey";
 		status_font = (pair != NULL && pair->font != NULL) ? pair->font : "";
 
 	} else if (purple_presence_is_available(presence)) {
-		pair = pidgin_blist_theme_get_online_text_info(theme);
-		name_color = (pair != NULL && pair->color != NULL) ? g_strdup(pair->color) : "black";
+		if (theme)
+			pair = pidgin_blist_theme_get_online_text_info(theme);
+		name_color = (pair != NULL && pair->color != NULL) ? pair->color : "black";
 		name_font = (pair != NULL && pair->font != NULL) ? pair->font : "";
 
-		pair = pidgin_blist_theme_get_status_text_info(theme);
+		if (theme)
+			pair = pidgin_blist_theme_get_status_text_info(theme);
 		status_color = (pair != NULL && pair->color != NULL) ? pair->color : "dim grey";
 		status_font = (pair != NULL && pair->font != NULL) ? pair->font : "";
 
 	} else {
-		pair = pidgin_blist_theme_get_away_text_info(theme);
+		if (theme)
+			pair = pidgin_blist_theme_get_away_text_info(theme);
 		name_color = (pair != NULL && pair->color != NULL) ? pair->color : "black";
 		name_font = (pair != NULL && pair->font != NULL) ? pair->font : "";
 
-		pair = pidgin_blist_theme_get_status_text_info(theme);
+		if (theme)
+			pair = pidgin_blist_theme_get_status_text_info(theme);
 		status_color = (pair != NULL && pair->color != NULL) ? pair->color : "dim grey";
 		status_font = (pair != NULL && pair->font != NULL) ? pair->font : "";
 	}
@@ -4361,6 +4365,10 @@
 			!(flag & (PURPLE_MESSAGE_SEND | PURPLE_MESSAGE_RECV)))
 		return;
 	ui->conv.flags |= PIDGIN_BLIST_NODE_HAS_PENDING_MESSAGE;
+	if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT
+			&& (flag & PURPLE_MESSAGE_NICK))
+		ui->conv.flags |= PIDGIN_BLIST_CHAT_HAS_PENDING_MESSAGE_WITH_NICK;
+
 	ui->conv.last_message = time(NULL);    /* XXX: for lack of better data */
 	pidgin_blist_update(purple_get_blist(), node);
 }
@@ -4371,7 +4379,8 @@
 	PidginBlistNode *ui = node->ui_data;
 	if (ui->conv.conv != gtkconv->active_conv)
 		return;
-	ui->conv.flags &= ~PIDGIN_BLIST_NODE_HAS_PENDING_MESSAGE;
+	ui->conv.flags &= ~(PIDGIN_BLIST_NODE_HAS_PENDING_MESSAGE |
+	                    PIDGIN_BLIST_CHAT_HAS_PENDING_MESSAGE_WITH_NICK);
 	pidgin_blist_update(purple_get_blist(), node);
 }
 
@@ -6297,27 +6306,31 @@
 
 		if(gtknode->contact_expanded) {
 			GdkPixbuf *status;
-			gchar *mark;
+			gchar *mark, *tmp;
+			const gchar *fg_color, *font;
 			GdkColor *color = NULL;
 			PidginBlistTheme *theme = pidgin_blist_get_theme();
+			FontColorPair *pair;
 			gboolean selected = (gtkblist->selected_node == cnode);
-			
+
 			mark = g_markup_escape_text(purple_contact_get_alias(contact), -1);
 
-			if (theme != NULL) {
-				FontColorPair *pair = pidgin_blist_theme_get_contact_text_info(theme);
+			theme = pidgin_blist_get_theme();
+			if (theme == NULL)
+				pair = NULL;
+			else {
+				pair = pidgin_blist_theme_get_contact_text_info(theme);
 				color = pidgin_blist_theme_get_contact_color(theme);
-
-				if (pair != NULL) {
-					gchar *temp = g_strdup_printf("<span foreground='%s' font_desc='%s'>%s</span>",
-								     (selected || pair->color == NULL) ? "black" : pair->color,
-								     (pair->font == NULL) ? "" : pair->font, mark);
-				
-					g_free(mark);
-					mark = temp;
-				}
 			}
 
+			font = (pair == NULL || pair->font == NULL) ? "" : pair->font;
+			fg_color = (selected || pair == NULL || pair->color == NULL) ? "black" : pair->color;
+
+			tmp = g_strdup_printf("<span font_desc='%s' color='%s'>%s</span>",
+						font, fg_color, mark);
+			g_free(mark);
+			mark = tmp;
+
 			status = pidgin_blist_get_status_icon(cnode,
 					 biglist? PIDGIN_STATUS_ICON_LARGE : PIDGIN_STATUS_ICON_SMALL);
 			
@@ -6395,7 +6408,8 @@
 	if(purple_account_is_connected(chat->account)) {
 		GtkTreeIter iter;
 		GdkPixbuf *status, *avatar, *emblem, *prpl_icon;
-		gchar *mark, *color, *font, *tmp;
+		const gchar *color, *font;
+		gchar *mark, *tmp;
 		gboolean showicons = purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/blist/show_buddy_icons");
 		gboolean biglist = purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/blist/show_buddy_icons");
 		PidginBlistNode *ui;
@@ -6405,14 +6419,17 @@
 		FontColorPair *pair;
 		PidginBlistTheme *theme;
 		gboolean selected = (gtkblist->selected_node == node);
+		gboolean nick_said = FALSE;
 
 		if (!insert_node(list, node, &iter))
 			return;
 
 		ui = node->ui_data;
 		conv = ui->conv.conv;
-		hidden = (conv && (ui->conv.flags & PIDGIN_BLIST_NODE_HAS_PENDING_MESSAGE) &&
-				pidgin_conv_is_hidden(PIDGIN_CONVERSATION(conv)));
+		if (conv && pidgin_conv_is_hidden(PIDGIN_CONVERSATION(conv))) {
+			hidden = (ui->conv.flags & PIDGIN_BLIST_NODE_HAS_PENDING_MESSAGE);
+			nick_said = (ui->conv.flags & PIDGIN_BLIST_CHAT_HAS_PENDING_MESSAGE_WITH_NICK);
+		}
 
 		status = pidgin_blist_get_status_icon(node,
 				 biglist ? PIDGIN_STATUS_ICON_LARGE : PIDGIN_STATUS_ICON_SMALL);
@@ -6430,12 +6447,19 @@
 
 		if (theme == NULL) 
 			pair = NULL;
+		else if (nick_said)
+			pair = pidgin_blist_theme_get_unread_message_nick_said_text_info(theme);
 		else if (hidden) 
 			pair = pidgin_blist_theme_get_unread_message_text_info(theme);
 		else pair = pidgin_blist_theme_get_online_text_info(theme); 
-			
-		font = (pair == NULL || pair->font == NULL) ? "" : g_strdup(pair->font);
-		color = (selected || pair == NULL || pair->color == NULL) ? "black" : g_strdup(pair->color);
+
+
+		font = (pair == NULL || pair->font == NULL) ? "" : pair->font;
+		if (selected || pair == NULL || pair->color == NULL)
+			/* nick_said color is the same as gtkconv:tab-label-attention */
+			color = (nick_said ? "#006aff" : "black");
+		else
+			color = pair->color;
 
 		tmp = g_strdup_printf("<span font_desc='%s' color='%s' weight='%s'>%s</span>", 
 				      font, color, hidden ? "bold" : "normal", mark);
--- a/pidgin/gtkprefs.c	Tue Jan 06 03:46:52 2009 +0000
+++ b/pidgin/gtkprefs.c	Tue Jan 06 07:53:19 2009 +0000
@@ -2468,8 +2468,11 @@
 		gtk_window_present(GTK_WINDOW(prefs));
 		return;
 	}
-	
-	/* add everthing in the thmeme manager before the window is loaded */
+
+	/* Refresh the list of themes before showing the preferences window */
+	purple_theme_manager_refresh();
+
+	/* add everything in the theme manager before the window is loaded */
 	if (prefs_themes_unsorted) {
 		purple_theme_manager_for_each_theme(prefs_themes_sort);
 		prefs_themes_unsorted = FALSE;
--- a/po/bn.po	Tue Jan 06 03:46:52 2009 +0000
+++ b/po/bn.po	Tue Jan 06 07:53:19 2009 +0000
@@ -1,14 +1,16 @@
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the GAIM package.
-# INDRANIL DAS GUPTA (ইন্দ্রনীল দাশগুপ্ত) <indradg@l2c2.org>, 2005.
-# Samia Nimatullah <mailsamia2001@yahoo.com>, 2005.
-# Tisa Nafisa <tisa_nafisa@yahoo.com>, 2007.
-# Jamil Ahmed <jamil@bengalinux.org>, 2007.
-# Israt Jahan <israt@ankur.org.bd>, 2008.
+# Pidgin Bengali translations (bn_BD, bn_IN)
 #
-msgid ""
-msgstr ""
-"Project-Id-Version: GAIM 2.5.3\n"
+# Copyright (C) 2005 INDRANIL DAS GUPTA (ইন্দ্রনীল দাশগুপ্ত) <indradg@l2c2.org>
+# Copyright (C) 2005 Samia Nimatullah <mailsamia2001@yahoo.com>
+# Copyright (C) 2007 Tisa Nafisa <tisa_nafisa@yahoo.com>
+# Copyright (C) 2007 Jamil Ahmed <jamil@bengalinux.org>
+# Copyright (C) 2008 Israt Jahan <israt@ankur.org.bd>
+#
+# This file is distributed under the same license as the Pidgin package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Pidgin 2.5.3\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2008-12-18 01:17-0800\n"
 "PO-Revision-Date: 2008-11-13 17:07+0600\n"
--- a/po/ca.po	Tue Jan 06 03:46:52 2009 +0000
+++ b/po/ca.po	Tue Jan 06 07:53:19 2009 +0000
@@ -33,8 +33,8 @@
 msgstr ""
 "Project-Id-Version: Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-12-19 17:53+0100\n"
-"PO-Revision-Date: 2008-12-20 17:15+0100\n"
+"POT-Creation-Date: 2009-01-05 01:42+0100\n"
+"PO-Revision-Date: 2009-01-05 20:36+0100\n"
 "Last-Translator: Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>\n"
 "Language-Team: Catalan <tradgnome@softcatala.net>\n"
 "MIME-Version: 1.0\n"
@@ -4196,6 +4196,9 @@
 msgid "Re-initializing Stream"
 msgstr "S'està reinicialitzant el flux"
 
+msgid "Server doesn't support blocking"
+msgstr "El servidor no permet blocar"
+
 msgid "Not Authorized"
 msgstr "No autoritzat"
 
@@ -4954,7 +4957,6 @@
 msgid "Passport account not yet verified"
 msgstr "El compte de passaport encara no està verificat"
 
-#, c-format
 msgid "Passport account suspended"
 msgstr "El compte de passaport s'ha suspès"
 
@@ -6576,12 +6578,10 @@
 msgstr "_D'acord"
 
 #, c-format
-msgid ""
-"You may be disconnected shortly.  You may want to use TOC until this is "
-"fixed.  Check %s for updates."
-msgstr ""
-"Se us pot desconnectar d'aquí a poc temps. Si voleu, podeu emprar TOC fins "
-"que això es resolgui. Comproveu si hi ha actualitzacions a %s."
+msgid "You may be disconnected shortly.  If so, check %s for updates."
+msgstr ""
+"Pot ser que es desconnecti d'aquí a poc. Si això passés, comproveu si hi ha "
+"actualitzacions a %s."
 
 # FIXME: hash (josep)
 msgid "Unable to get a valid AIM login hash."
@@ -7535,13 +7535,11 @@
 msgid " TCP"
 msgstr " TCP"
 
-#, fuzzy
 msgid " FromMobile"
-msgstr "Mòbil"
-
-#, fuzzy
+msgstr " FromMobile"
+
 msgid " BindMobile"
-msgstr "Mòbil"
+msgstr " BindMobile"
 
 msgid " Video"
 msgstr " Vídeo"
@@ -9335,6 +9333,9 @@
 msgid "SIP usernames may not contain whitespaces or @ symbols"
 msgstr "Els noms d'usuari SIP no poden contenir espais en blanc ni @"
 
+msgid "SIP connect server not specified"
+msgstr "No s'ha especificat el servidor SIP al qual connectar-se"
+
 #. *< type
 #. *< ui_requirement
 #. *< flags
@@ -14102,6 +14103,13 @@
 msgid "This plugin is useful for debbuging XMPP servers or clients."
 msgstr "Aquest connector és útil per a depurar servidors i clients XMPP."
 
+#~ msgid ""
+#~ "You may be disconnected shortly.  You may want to use TOC until this is "
+#~ "fixed.  Check %s for updates."
+#~ msgstr ""
+#~ "Se us pot desconnectar d'aquí a poc temps. Si voleu, podeu emprar TOC "
+#~ "fins que això es resolgui. Comproveu si hi ha actualitzacions a %s."
+
 #~ msgid "Connection to server lost (no data received within %d second)"
 #~ msgid_plural ""
 #~ "Connection to server lost (no data received within %d seconds)"
@@ -14748,9 +14756,6 @@
 #~ "Podeu obtenir la versió %s de:<br><a href=\"http://pidgin.im/\">http://"
 #~ "pidgin.im</a>."
 
-#~ msgid "WinGaim Options"
-#~ msgstr "Opcions del WinGaim"
-
 #~ msgid ""
 #~ "%d buddy from group %s was not removed because it belongs to an account "
 #~ "which is disabled or offline.  This buddy and the group were not "
@@ -16010,62 +16015,18 @@
 #~ msgid "Error communicating with Gadu-Gadu server"
 #~ msgstr "S'ha produït un error en comunicar amb el servidor Gadu-Gadu"
 
-#~ msgid ""
-#~ "Gaim was unable to complete your request due to a problem communicating "
-#~ "with the Gadu-Gadu HTTP server.  Please try again later."
-#~ msgstr ""
-#~ "El Gaim no ha pogut completar la vostra petició perquè hi ha hagut un "
-#~ "problema en la comunicació amb el servidor HTTP Gadu-Gadu. Torneu-ho a "
-#~ "intentar més tard."
-
 #~ msgid "Unable to import Gadu-Gadu buddy list"
 #~ msgstr "No s'ha pogut importar la llista d'amics de Gadu-Gadu"
 
-#~ msgid ""
-#~ "Gaim was unable to connect to the Gadu-Gadu buddy list server.  Please "
-#~ "try again later."
-#~ msgstr ""
-#~ "El Gaim no ha pogut connectar-se al servidor de llistes d'amics del Gadu-"
-#~ "Gadu. Torneu-ho a intentar més tard."
-
-#~ msgid ""
-#~ "Gaim was unable to connect to the buddy list server.  Please try again "
-#~ "later."
-#~ msgstr ""
-#~ "El Gaim no s'ha pogut connectar al servidor de llistes d'amics. Torneu-ho "
-#~ "a intentar més tard."
-
 #~ msgid "Unable to delete Gadu-Gadu buddy list"
 #~ msgstr "No s'ha pogut suprimir la llista d'amics de Gadu-Gadu"
 
 #~ msgid "Unable to access directory"
 #~ msgstr "No s'ha pogut accedir al directori"
 
-#~ msgid ""
-#~ "Gaim was unable to search the Directory because it was unable to connect "
-#~ "to the directory server.  Please try again later."
-#~ msgstr ""
-#~ "El Gaim no ha pogut cercar al directori perquè no s'hi ha pogut "
-#~ "connectar. Torneu-ho a intentar més tard."
-
-#~ msgid ""
-#~ "Gaim was unable to change your password due to an error connecting to the "
-#~ "Gadu-Gadu server.  Please try again later."
-#~ msgstr ""
-#~ "El Gaim no ha pogut canviar la contrasenya a causa d'un error mentre es "
-#~ "comunicava amb el servidor Gadu-Gadu. Torneu-ho a intentar més tard."
-
 #~ msgid "Unable to access user profile."
 #~ msgstr "No s'ha pogut accedir al perfil de l'usuari."
 
-#~ msgid ""
-#~ "Gaim was unable to access this user's profile due to an error connecting "
-#~ "to the directory server.  Please try again later."
-#~ msgstr ""
-#~ "El Gaim no ha pogut accedir al perfil de l'usuari atès que s'ha produït "
-#~ "un error en connectar-se al servidor de directori. Torneu-ho a intentar "
-#~ "més tard."
-
 #~ msgid "The user %s (%s%s%s%s%s) wants you to authorize them."
 #~ msgstr "L'usuari %s (%s%s%s%s%s) vol que l'autoritzeu."
 
@@ -16207,13 +16168,6 @@
 #~ msgid "/Buddies/Log Out"
 #~ msgstr "/Amics/Desconnecta"
 
-#~ msgid ""
-#~ "Gaim cannot send files over Yahoo! that are bigger than One Megabyte "
-#~ "(1,048,576 bytes)."
-#~ msgstr ""
-#~ "El Gaim no pot enviar fitxer a través de Yahoo! que siguin més grans d'un "
-#~ "Megabyte (1.048.576 bytes)."
-
 #~ msgid "Miscellaneous error"
 #~ msgstr "Error miscel·lani"
 
@@ -16241,12 +16195,6 @@
 #~ msgid "MSN error for account %s"
 #~ msgstr "S'ha produït un error MSN per al compte %s"
 
-#~ msgid "Moving Gaim Settings.."
-#~ msgstr "S'està movent les opcions del Gaim..."
-
-#~ msgid "Moving Gaim user settings to: "
-#~ msgstr "S'està movent les opcions d'usuaris del Gaim a: "
-
 #~ msgid "Notification"
 #~ msgstr "Notificació"
 
--- a/po/ca@valencia.po	Tue Jan 06 03:46:52 2009 +0000
+++ b/po/ca@valencia.po	Tue Jan 06 07:53:19 2009 +0000
@@ -34,7 +34,7 @@
 "Project-Id-Version: Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2008-12-19 17:53+0100\n"
-"PO-Revision-Date: 2008-12-20 17:15+0100\n"
+"PO-Revision-Date: 2009-01-05 20:36+0100\n"
 "Last-Translator: Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>\n"
 "Language-Team: Catalan <tradgnome@softcatala.net>\n"
 "MIME-Version: 1.0\n"
@@ -14739,9 +14739,6 @@
 #~ "Podeu obtenir la versió %s de:<br><a href=\"http://pidgin.im/\">http://"
 #~ "pidgin.im</a>."
 
-#~ msgid "WinGaim Options"
-#~ msgstr "Opcions del WinGaim"
-
 #~ msgid ""
 #~ "%d buddy from group %s was not removed because it belongs to an account "
 #~ "which is disabled or offline.  This buddy and the group were not "
@@ -16001,62 +15998,18 @@
 #~ msgid "Error communicating with Gadu-Gadu server"
 #~ msgstr "S'ha produït un error en comunicar amb el servidor Gadu-Gadu"
 
-#~ msgid ""
-#~ "Gaim was unable to complete your request due to a problem communicating "
-#~ "with the Gadu-Gadu HTTP server.  Please try again later."
-#~ msgstr ""
-#~ "El Gaim no ha pogut completar la vostra petició perquè hi ha hagut un "
-#~ "problema en la comunicació amb el servidor HTTP Gadu-Gadu. Torneu-ho a "
-#~ "intentar més tard."
-
 #~ msgid "Unable to import Gadu-Gadu buddy list"
 #~ msgstr "No s'ha pogut importar la llista d'amics de Gadu-Gadu"
 
-#~ msgid ""
-#~ "Gaim was unable to connect to the Gadu-Gadu buddy list server.  Please "
-#~ "try again later."
-#~ msgstr ""
-#~ "El Gaim no ha pogut connectar-se al servidor de llistes d'amics del Gadu-"
-#~ "Gadu. Torneu-ho a intentar més tard."
-
-#~ msgid ""
-#~ "Gaim was unable to connect to the buddy list server.  Please try again "
-#~ "later."
-#~ msgstr ""
-#~ "El Gaim no s'ha pogut connectar al servidor de llistes d'amics. Torneu-ho "
-#~ "a intentar més tard."
-
 #~ msgid "Unable to delete Gadu-Gadu buddy list"
 #~ msgstr "No s'ha pogut suprimir la llista d'amics de Gadu-Gadu"
 
 #~ msgid "Unable to access directory"
 #~ msgstr "No s'ha pogut accedir al directori"
 
-#~ msgid ""
-#~ "Gaim was unable to search the Directory because it was unable to connect "
-#~ "to the directory server.  Please try again later."
-#~ msgstr ""
-#~ "El Gaim no ha pogut cercar al directori perquè no s'hi ha pogut "
-#~ "connectar. Torneu-ho a intentar més tard."
-
-#~ msgid ""
-#~ "Gaim was unable to change your password due to an error connecting to the "
-#~ "Gadu-Gadu server.  Please try again later."
-#~ msgstr ""
-#~ "El Gaim no ha pogut canviar la contrasenya a causa d'un error mentre es "
-#~ "comunicava amb el servidor Gadu-Gadu. Torneu-ho a intentar més tard."
-
 #~ msgid "Unable to access user profile."
 #~ msgstr "No s'ha pogut accedir al perfil de l'usuari."
 
-#~ msgid ""
-#~ "Gaim was unable to access this user's profile due to an error connecting "
-#~ "to the directory server.  Please try again later."
-#~ msgstr ""
-#~ "El Gaim no ha pogut accedir al perfil de l'usuari atès que s'ha produït "
-#~ "un error en connectar-se al servidor de directori. Torneu-ho a intentar "
-#~ "més tard."
-
 #~ msgid "The user %s (%s%s%s%s%s) wants you to authorize them."
 #~ msgstr "L'usuari %s (%s%s%s%s%s) vol que l'autoritzeu."
 
@@ -16198,13 +16151,6 @@
 #~ msgid "/Buddies/Log Out"
 #~ msgstr "/Amics/Desconnecta"
 
-#~ msgid ""
-#~ "Gaim cannot send files over Yahoo! that are bigger than One Megabyte "
-#~ "(1,048,576 bytes)."
-#~ msgstr ""
-#~ "El Gaim no pot enviar fitxer a través de Yahoo! que siguin més grans d'un "
-#~ "Megabyte (1.048.576 bytes)."
-
 #~ msgid "Miscellaneous error"
 #~ msgstr "Error miscel·lani"
 
@@ -16232,12 +16178,6 @@
 #~ msgid "MSN error for account %s"
 #~ msgstr "S'ha produït un error MSN per al compte %s"
 
-#~ msgid "Moving Gaim Settings.."
-#~ msgstr "S'està movent les opcions del Gaim..."
-
-#~ msgid "Moving Gaim user settings to: "
-#~ msgstr "S'està movent les opcions d'usuaris del Gaim a: "
-
 #~ msgid "Notification"
 #~ msgstr "Notificació"
 
--- a/po/de.po	Tue Jan 06 03:46:52 2009 +0000
+++ b/po/de.po	Tue Jan 06 07:53:19 2009 +0000
@@ -11,15 +11,15 @@
 msgstr ""
 "Project-Id-Version: de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-12-18 23:08+0100\n"
-"PO-Revision-Date: 2008-12-18 20:11+0100\n"
-"Last-Translator: Bjoern Voigt <bjoern@cs.tu-berlin.de>\n"
-"Language-Team: Deutsch <de@li.org>\n"
+"POT-Creation-Date: 2009-01-05 17:34+0100\n"
+"PO-Revision-Date: 2009-01-05 17:34+0100\n"
+"Last-Translator: Jochen Kemnade <jochenkemnade@web.de>\n"
+"Language-Team: German <de@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: KBabel 1.11.4\n"
+"X-Generator: Lokalize 0.2\n"
 
 #. Translators may want to transliterate the name.
 #. It is not to be translated.
@@ -4168,6 +4168,9 @@
 msgid "Re-initializing Stream"
 msgstr "Initialisiere Stream nochmal"
 
+msgid "Server doesn't support blocking"
+msgstr "Server unterstützt kein Blockieren"
+
 msgid "Not Authorized"
 msgstr "Nicht autorisiert"
 
@@ -6487,12 +6490,10 @@
 msgstr "_OK"
 
 #, c-format
-msgid ""
-"You may be disconnected shortly.  You may want to use TOC until this is "
-"fixed.  Check %s for updates."
-msgstr ""
-"Die Verbindung kann schnell unterbrochen werden. Vielleicht wollen Sie TOC "
-"benutzen bis dieser Fehler behoben wurde. Suchen Sie auf %s nach Updates."
+msgid "You may be disconnected shortly.  If so, check %s for updates."
+msgstr ""
+"Sie werden eventuell gleich abgemeldet. In diesem Fall, überprüfen Sie %s "
+"auf Updates."
 
 msgid "Unable to get a valid AIM login hash."
 msgstr "Konnte keinen gültigen AIM Login-Hash bekommen."
@@ -9263,6 +9264,9 @@
 msgid "SIP usernames may not contain whitespaces or @ symbols"
 msgstr "SIP-Benutzernamen dürfen keine Leerzeichen oder @-Symbole enthalten"
 
+msgid "SIP connect server not specified"
+msgstr "SIP-Verbindungsserver nicht angegeben"
+
 #. *< type
 #. *< ui_requirement
 #. *< flags
--- a/po/fr.po	Tue Jan 06 03:46:52 2009 +0000
+++ b/po/fr.po	Tue Jan 06 07:53:19 2009 +0000
@@ -4,7 +4,7 @@
 # Copyright (C) 2002, Stéphane Pontier <stephane.pontier@free.fr>
 # Copyright (C) 2002, Stéphane Wirtel <stephane.wirtel@belgacom.net>
 # Copyright (C) 2002, Loïc Jeannin <loic.jeannin@free.fr>
-# Copyright (C) 2002-2008, Éric Boumaour <zongo_fr@users.sourceforge.net>
+# Copyright (C) 2002-2009, Éric Boumaour <zongo_fr@users.sourceforge.net>
 #
 # This file is distributed under the same license as the Pidgin package.
 #
@@ -21,8 +21,8 @@
 msgstr ""
 "Project-Id-Version: Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-12-16 10:10+0100\n"
-"PO-Revision-Date: 2008-12-16 10:09+0100\n"
+"POT-Creation-Date: 2009-01-05 10:49+0100\n"
+"PO-Revision-Date: 2009-01-05 10:48+0100\n"
 "Last-Translator: Éric Boumaour <zongo_fr@users.sourceforge.net>\n"
 "Language-Team: fr <fr@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -4191,6 +4191,9 @@
 msgid "Re-initializing Stream"
 msgstr "Réinitialisation du flux"
 
+msgid "Server doesn't support blocking"
+msgstr "Le serveur ne supporte pas le blocage"
+
 msgid "Not Authorized"
 msgstr "Non autorisé"
 
@@ -4947,7 +4950,6 @@
 msgid "Passport account not yet verified"
 msgstr "Le compte Passeport n'est pas encore validé"
 
-#, c-format
 msgid "Passport account suspended"
 msgstr "Le compte Passeport est suspendu"
 
@@ -6548,12 +6550,10 @@
 msgstr "_OK"
 
 #, c-format
-msgid ""
-"You may be disconnected shortly.  You may want to use TOC until this is "
-"fixed.  Check %s for updates."
-msgstr ""
-"Vous risquez d'être déconnecté sous peu. Veuillez essayer d'utiliser TOC "
-"entre-temps si cela arrive. Visitez %s pour plus d'informations."
+msgid "You may be disconnected shortly.  If so, check %s for updates."
+msgstr ""
+"Vous risquez d'être déconnecté sous peu. Si c'est le cas, consultez %s pour "
+"plus d'informations."
 
 msgid "Unable to get a valid AIM login hash."
 msgstr "Impossible de récupérer un code de connexion AIM valide."
@@ -9310,6 +9310,9 @@
 msgstr ""
 "Les noms d'utilisateur SIP ne peuvent pas avoir d'espace ou de symbole @."
 
+msgid "SIP connect server not specified"
+msgstr "Serveur de connexion SIP non spécifié"
+
 #. *< type
 #. *< ui_requirement
 #. *< flags
@@ -14053,42 +14056,9 @@
 msgid "This plugin is useful for debbuging XMPP servers or clients."
 msgstr "Ce plugin est utile pour débugger les clients ou serveurs XMPP."
 
-#~ msgid "Connection to server lost (no data received within %d second)"
-#~ msgid_plural ""
-#~ "Connection to server lost (no data received within %d seconds)"
-#~ msgstr[0] ""
-#~ "Connexion avec le serveur perdue (aucune donnée depuis %d seconde)."
-#~ msgstr[1] ""
-#~ "Connexion avec le serveur perdue (aucune donnée depuis %d secondes)."
-
-#~ msgid "%d needs Q&A"
-#~ msgstr "%d a besoin d'une réponse"
-
-#~ msgid "Add buddy Q&A"
-#~ msgstr "Ajouter une réponse de contact"
-
-#~ msgid "Can not decrypt get server reply"
-#~ msgstr "Impossible de récupérer la réponse du serveur"
-
-#~ msgid "Keep alive error"
-#~ msgstr "Erreur de Keep alive"
-
-#~ msgid ""
-#~ "Lost connection with server:\n"
-#~ "%d, %s"
-#~ msgstr ""
-#~ "Connexion perdue avec le serveur :\n"
-#~ "%d, %s"
-
-#~ msgid "Connecting server ..."
-#~ msgstr "Connexion au serveur..."
-
 #~ msgid "Failed to send IM."
 #~ msgstr "Impossible d'envoyer le message."
 
-#~ msgid "Not a member of room \"%s\"\n"
-#~ msgstr "Vous n'êtes pas membre du groupe « %s ».\n"
-
 #~ msgid "User information for %s unavailable"
 #~ msgstr "Les informations sur %s ne sont pas disponibles"
 
--- a/po/hu.po	Tue Jan 06 03:46:52 2009 +0000
+++ b/po/hu.po	Tue Jan 06 07:53:19 2009 +0000
@@ -1,16 +1,16 @@
 # Hungarian translation of pidgin.
-# Copyright (C) 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2003, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
 # This file is distributed under the same license as the Pidgin package.
 # The Hungarian translation of Gaim was sponsored by Novell Hungary, many thanks for it!
 #
 # Zoltan Sutto <suttozoltan@chello.hu>, 2003.
-# Gabor Kelemen <kelemeng@gnome.hu>, 2005, 2006, 2007, 2008.
+# Gabor Kelemen <kelemeng@gnome.hu>, 2005, 2006, 2007, 2008, 2009.
 msgid ""
 msgstr ""
 "Project-Id-Version: pidgin 2.5\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-12-18 12:34+0100\n"
-"PO-Revision-Date: 2008-12-18 12:29+0100\n"
+"POT-Creation-Date: 2009-01-04 22:44+0100\n"
+"PO-Revision-Date: 2009-01-04 22:42+0100\n"
 "Last-Translator: Gabor Kelemen <kelemeng@gnome.hu>\n"
 "Language-Team: Hungarian <gnome@fsf.hu>\n"
 "MIME-Version: 1.0\n"
@@ -4156,6 +4156,9 @@
 msgid "Re-initializing Stream"
 msgstr "A folyam újrainicializálása"
 
+msgid "Server doesn't support blocking"
+msgstr "A kiszolgáló nem támogatja a blokkolást"
+
 msgid "Not Authorized"
 msgstr "Nem engedélyezett"
 
@@ -4909,7 +4912,6 @@
 msgid "Passport account not yet verified"
 msgstr "Passport fiók (MSN igazolvány) még nincs ellenőrizve"
 
-#, c-format
 msgid "Passport account suspended"
 msgstr "A Passport fiók felfüggesztve"
 
@@ -6505,12 +6507,10 @@
 msgstr "_OK"
 
 #, c-format
-msgid ""
-"You may be disconnected shortly.  You may want to use TOC until this is "
-"fixed.  Check %s for updates."
-msgstr ""
-"Hamarosan megszakad a kapcsolat. A helyreállításig használja a TOC-ot. "
-"Frissítésekért keresse fel a következő címet: %s."
+msgid "You may be disconnected shortly.  If so, check %s for updates."
+msgstr ""
+"Hamarosan megszakadhat a kapcsolat. Ebbben az esetben keressen frissítéseket "
+"a következő címen: %s."
 
 msgid "Unable to get a valid AIM login hash."
 msgstr "Nem kérhető le érvényes AIM belépő hash."
@@ -9287,6 +9287,9 @@
 "A SIP felhasználónevek nem tartalmazhatnak üreshely-karaktert vagy @ "
 "szimbólumot"
 
+msgid "SIP connect server not specified"
+msgstr "A SIP kapcsolatkiszolgáló nincs megadva"
+
 #. *< type
 #. *< ui_requirement
 #. *< flags