propagate from branch 'im.pidgin.pidgin' (head 1e232732a9f31f155cd1b160e3af9723b583c040) next.minor

Sat, 09 Jan 2010 04:03:53 +0000

author
Daniel Atallah <datallah@pidgin.im>
date
Sat, 09 Jan 2010 04:03:53 +0000
branch
next.minor
changeset 29685
1507ce18860b
parent 29684
5b623e204b48 (current diff)
parent 29194
1e232732a9f3 (diff)
child 29686
f9dee36112d0

propagate from branch 'im.pidgin.pidgin' (head 1e232732a9f31f155cd1b160e3af9723b583c040)
to branch 'im.pidgin.pidgin.next.minor' (head 5b623e204b4865a415a90f4fe2ee4e05ae9f9e15)

ChangeLog file | annotate | diff | comparison | revisions
ChangeLog.API file | annotate | diff | comparison | revisions
ChangeLog.win32 file | annotate | diff | comparison | revisions
configure.ac file | annotate | diff | comparison | revisions
libpurple/account.c file | annotate | diff | comparison | revisions
libpurple/conversation.h file | annotate | diff | comparison | revisions
libpurple/ft.c file | annotate | diff | comparison | revisions
libpurple/media.c file | annotate | diff | comparison | revisions
libpurple/media.h file | annotate | diff | comparison | revisions
libpurple/media/media.c file | annotate | diff | comparison | revisions
pidgin/gtkcelllayout.c file | annotate | diff | comparison | revisions
pidgin/gtkcelllayout.h file | annotate | diff | comparison | revisions
pidgin/gtkcellrendererprogress.c file | annotate | diff | comparison | revisions
pidgin/gtkcellrendererprogress.h file | annotate | diff | comparison | revisions
pidgin/gtkcellview.c file | annotate | diff | comparison | revisions
pidgin/gtkcellview.h file | annotate | diff | comparison | revisions
pidgin/gtkcellviewmenuitem.c file | annotate | diff | comparison | revisions
pidgin/gtkcellviewmenuitem.h file | annotate | diff | comparison | revisions
pidgin/gtkconv.c file | annotate | diff | comparison | revisions
pidgin/gtkexpander.c file | annotate | diff | comparison | revisions
pidgin/gtkexpander.h file | annotate | diff | comparison | revisions
pidgin/gtklog.c file | annotate | diff | comparison | revisions
pidgin/pidgincombobox.c file | annotate | diff | comparison | revisions
pidgin/pidgincombobox.h file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/16/tray-away.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/16/tray-busy.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/16/tray-connecting.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/16/tray-extended-away.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/16/tray-invisible.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/16/tray-message.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/16/tray-new-im.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/16/tray-offline.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/16/tray-online.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/22/tray-away.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/22/tray-busy.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/22/tray-connecting.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/22/tray-extended-away.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/22/tray-invisible.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/22/tray-message.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/22/tray-new-im.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/22/tray-offline.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/22/tray-online.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/32/tray-away.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/32/tray-busy.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/32/tray-connecting.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/32/tray-extended-away.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/32/tray-invisible.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/32/tray-message.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/32/tray-new-im.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/32/tray-offline.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/32/tray-online.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/48/tray-away.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/48/tray-busy.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/48/tray-connecting.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/48/tray-extended-away.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/48/tray-invisible.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/48/tray-message.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/48/tray-new-im.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/48/tray-offline.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/48/tray-online.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-away.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-busy.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-connecting.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-extended-away.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-invisible.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-message.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-new-im.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-offline.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/16x16/status/pidgin-tray-online.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-away.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-busy.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-connecting.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-extended-away.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-invisible.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-message.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-new-im.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-offline.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/22x22/status/pidgin-tray-online.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-away.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-busy.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-connecting.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-extended-away.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-invisible.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-message.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-new-im.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-offline.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/32x32/status/pidgin-tray-online.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-away.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-busy.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-connecting.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-extended-away.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-invisible.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-message.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-new-im.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-offline.png file | annotate | diff | comparison | revisions
pidgin/pixmaps/tray/hicolor/48x48/status/pidgin-tray-online.png file | annotate | diff | comparison | revisions
po/ChangeLog file | annotate | diff | comparison | revisions
--- a/COPYRIGHT	Sat Jan 09 02:41:09 2010 +0000
+++ b/COPYRIGHT	Sat Jan 09 04:03:53 2010 +0000
@@ -154,6 +154,7 @@
 David Fiander
 Rob Flynn <gaim@robflynn.com>
 Rob Foehl (rwf)
+Chris Foote
 Alan Ford
 Nathan Fredrickson
 Chris J. Friesen
--- a/ChangeLog	Sat Jan 09 02:41:09 2010 +0000
+++ b/ChangeLog	Sat Jan 09 04:03:53 2010 +0000
@@ -18,7 +18,28 @@
 	* Make the search dialog unobtrusive in the conversation window (by making
 	  it look and behave like the search dialog in Firefox)
 
-version 2.6.5 (??/??/20??):
+version 2.6.6 (??/??/20??):
+	Gadu-Gadu:
+	* Fix display of avatars after a server-side change. (Krzysztof
+	  Klinikowski)
+
+	MSN:
+	* File transfer requests will no longer cause a crash if you delete the
+	  file before the other side accepts.
+	* Recieved files will no longer hold an extra lock after completion,
+	  meaning they can be moved or deleted without complaints from your OS.
+	* Buddies who sign in from a second location will no longer cause an
+	  unnecessary chat window to open.
+	* Support setting an animated GIF as a buddy icon.
+
+	XMPP:
+	* Added support for the SCRAM-SHA-1 SASL mechanism.  This is only
+	  available when built without Cyrus SASL support.
+	* When getting info on a domain-only (server) JID, show uptime
+	  (when given by the result of the "last query") and don't show status as
+	  offline.
+
+version 2.6.5 (01/08/2010):
 	libpurple:
 	* TLS certificates are actually stored to the local cache once again
 	  (accepting a name mismatch on a certificate should now be remembered)
@@ -31,19 +52,10 @@
 	  Chinese characters (broken in 2.6.4)
 
 	MSN:
-	* File transfer requests will no longer cause a crash if you delete the
-	  file before the other side accepts.
-	* Recieved files will no longer hold an extra lock after completion,
-	  meaning they can be moved or deleted without complaints from your OS.
-	* Buddies who sign in from a second location will no longer cause an
-	  unnecessary chat window to open.
+	* Fix an issue allowing a remote user to download arbitrary files from
+	  a libpurple client.  (CVE-2010-0013)
 
 	XMPP:
-	* Added support for the SCRAM-SHA-1 SASL mechanism.  This is only
-	  available when built without Cyrus SASL support.
-	* When getting info on a domain-only (server) JID, show uptime
-	  (when given by the result of the "last query") and don't show status as
-	  offline.
 	* Do not crash when attempting to register for a new account on Windows.
 	* Fix file transfer with clients that do not support Entity Capabilities
 	  (e.g. Spark)
--- a/ChangeLog.API	Sat Jan 09 02:41:09 2010 +0000
+++ b/ChangeLog.API	Sat Jan 09 04:03:53 2010 +0000
@@ -27,13 +27,23 @@
 		* pidgin_dialogs_translators (should not be used by anything but Pidgin)
 		* gtk_imhtmltoolbar_switch_active_conversation
 
-version 2.6.5 (??/??/20??):
+version 2.6.6 (??/??/2010):
 	libpurple:
 		Changed:
 		* purple_xfer_cancel_local is now called instead of
 		  purple_xfer_request_denied if an error is found when selecting
 		  a file to send. Request denied is still used when a receive
 		  request is not allowed.
+	Perl:
+		Changed:
+		* Corrected the package names for the PurpleProxyType and
+		  PurpleLogReadFlags enums to have the correct number of colons
+		  (from Purple::ProxyType::::<type> to Purple::ProxyType::<type>
+		  and Purple::Log:ReadFlags::::<type> to
+		  Purple::Log::ReadFlags::<type>)  (Chris Foote)
+
+version 2.6.5 (01/08/2010):
+	No changes
 
 version 2.6.4 (11/29/2009):
 	No changes
--- a/ChangeLog.win32	Sat Jan 09 02:41:09 2010 +0000
+++ b/ChangeLog.win32	Sat Jan 09 04:03:53 2010 +0000
@@ -5,9 +5,12 @@
 	* Crash Report files (pidgin.RPT) are now generated in the ~/.purple
 	  directory instead of the installation directory.
 
-version 2.6.5 (??/??/20??):
+version 2.6.6 (??/??/20??):
 	* Installer translations for: Norwegian nynorsk
 
+version 2.6.5 (01/08/2010):
+	* No changes
+
 version 2.6.4 (11/29/2009):
 	* Register URL handlers for everything that Windows knows about.  Still
 	  use the HTTP "open" handler for security reasons.
--- a/NEWS	Sat Jan 09 02:41:09 2010 +0000
+++ b/NEWS	Sat Jan 09 04:03:53 2010 +0000
@@ -2,7 +2,12 @@
 
 Our development blog is available at: http://planet.pidgin.im
 
-2.6.5 (??/??/20??):
+2.6.6 (??/??/2010):
+
+2.6.5 (01/08/2010):
+	Paul: This release fixes a pretty serious bug in the MSN code, so we're
+	releasing this build a little earlier than planned with only major
+	bugs fixed.  See the ChangeLog for details.  Enjoy!
 
 2.6.4 (11/29/2009):
 	John:  It's release time again.  Lots of bug fixes this time around, as
--- a/finch/gntidle.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/finch/gntidle.c	Sat Jan 09 04:03:53 2010 +0000
@@ -21,6 +21,8 @@
  *
  */
 
+#include <internal.h>
+
 #include "finch.h"
 #include "gntidle.h"
 #include "gntwm.h"
--- a/finch/gntrequest.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/finch/gntrequest.c	Sat Jan 09 04:03:53 2010 +0000
@@ -23,6 +23,8 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
+#include <internal.h>
+
 #include <gnt.h>
 #include <gntbox.h>
 #include <gntbutton.h>
@@ -35,7 +37,6 @@
 #include <gnttree.h>
 
 #include "finch.h"
-#include <internal.h>
 #include "gntrequest.h"
 #include "debug.h"
 #include "util.h"
--- a/finch/gntstatus.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/finch/gntstatus.c	Sat Jan 09 04:03:53 2010 +0000
@@ -23,6 +23,8 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
+#include <internal.h>
+
 #include <gnt.h>
 #include <gntbox.h>
 #include <gntbutton.h>
@@ -34,7 +36,6 @@
 #include <gntutils.h>
 
 #include "finch.h"
-#include <internal.h>
 
 #include <notify.h>
 #include <request.h>
--- a/finch/libgnt/gntinternal.h	Sat Jan 09 02:41:09 2010 +0000
+++ b/finch/libgnt/gntinternal.h	Sat Jan 09 04:03:53 2010 +0000
@@ -32,6 +32,14 @@
 # define gnt_warning g_warning
 #endif
 
+#ifndef G_GNUC_NULL_TERMINATED
+#	if defined(__GNUC__) && __GNUC__ >= 4
+#		define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__))
+#	else
+#		define G_GNUC_NULL_TERMINATED
+#	endif
+#endif
+
 extern int gnt_need_conversation_to_locale;
 extern const char *C_(const char *x);
 
--- a/finch/libgnt/gntline.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/finch/libgnt/gntline.c	Sat Jan 09 04:03:53 2010 +0000
@@ -20,6 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
+#include "gntinternal.h"
 #include "gntline.h"
 
 enum
--- a/finch/libgnt/gntmenuitem.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/finch/libgnt/gntmenuitem.c	Sat Jan 09 04:03:53 2010 +0000
@@ -20,6 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
+#include "gntinternal.h"
 #include "gntmenu.h"
 #include "gntmenuitem.h"
 
--- a/finch/libgnt/gntmenuitemcheck.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/finch/libgnt/gntmenuitemcheck.c	Sat Jan 09 04:03:53 2010 +0000
@@ -20,6 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
+#include "gntinternal.h"
 #include "gntmenuitemcheck.h"
 
 static GntMenuItemClass *parent_class = NULL;
--- a/finch/libgnt/gntprogressbar.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/finch/libgnt/gntprogressbar.c	Sat Jan 09 04:03:53 2010 +0000
@@ -20,6 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  **/
 
+#include "gntinternal.h"
 #include "gntprogressbar.h"
 #include "gntutils.h"
 
--- a/finch/libgnt/gntslider.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/finch/libgnt/gntslider.c	Sat Jan 09 04:03:53 2010 +0000
@@ -20,6 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
+#include "gntinternal.h"
 #include "gntcolors.h"
 #include "gntkeys.h"
 #include "gntslider.h"
--- a/finch/libgnt/gntwidget.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/finch/libgnt/gntwidget.c	Sat Jan 09 04:03:53 2010 +0000
@@ -22,6 +22,7 @@
 
 /* Stuff brutally ripped from Gflib */
 
+#include "gntinternal.h"
 #include "gntwidget.h"
 #include "gntstyle.h"
 #include "gntmarshal.h"
--- a/finch/libgnt/gntwindow.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/finch/libgnt/gntwindow.c	Sat Jan 09 04:03:53 2010 +0000
@@ -20,6 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
+#include "gntinternal.h"
 #include "gntstyle.h"
 #include "gntwindow.h"
 
--- a/finch/libgnt/wms/irssi.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/finch/libgnt/wms/irssi.c	Sat Jan 09 04:03:53 2010 +0000
@@ -33,6 +33,8 @@
 #include <string.h>
 #include <sys/types.h>
 
+#include "gntinternal.h"
+
 #include "gnt.h"
 #include "gntbox.h"
 #include "gntmenu.h"
--- a/libpurple/account.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/libpurple/account.c	Sat Jan 09 04:03:53 2010 +0000
@@ -1341,7 +1341,8 @@
 
 	handles = g_list_remove(handles, info);
 
-	info->auth_cb(info->userdata);
+	if (info->auth_cb != NULL)
+		info->auth_cb(info->userdata);
 
 	purple_signal_emit(purple_accounts_get_handle(),
 			"account-authorization-granted", info->account, info->user);
@@ -1356,7 +1357,8 @@
 
 	handles = g_list_remove(handles, info);
 
-	info->deny_cb(info->userdata);
+	if (info->deny_cb != NULL)
+		info->deny_cb(info->userdata);
 
 	purple_signal_emit(purple_accounts_get_handle(),
 			"account-authorization-denied", info->account, info->user);
@@ -1383,10 +1385,12 @@
 				"account-authorization-requested", account, remote_user));
 
 	if (plugin_return > 0) {
-		auth_cb(user_data);
+		if (auth_cb != NULL)
+			auth_cb(user_data);
 		return NULL;
 	} else if (plugin_return < 0) {
-		deny_cb(user_data);
+		if (deny_cb != NULL)
+			deny_cb(user_data);
 		return NULL;
 	}
 
@@ -2347,7 +2351,7 @@
 
 	gc = purple_account_get_connection(account);
 	if (gc != NULL)
-	        prpl = purple_connection_get_prpl(gc);
+		prpl = purple_connection_get_prpl(gc);
 
 	if (prpl != NULL)
 		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
@@ -2364,7 +2368,7 @@
 	PurplePlugin *prpl = NULL;
 
 	if (gc != NULL)
-	        prpl = purple_connection_get_prpl(gc);
+		prpl = purple_connection_get_prpl(gc);
 
 	if (prpl != NULL)
 		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
@@ -2403,7 +2407,7 @@
 	PurplePlugin *prpl = NULL;
 
 	if (gc != NULL)
-	        prpl = purple_connection_get_prpl(gc);
+		prpl = purple_connection_get_prpl(gc);
 
 	if (prpl != NULL)
 		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
@@ -2420,7 +2424,7 @@
 	PurplePlugin *prpl = NULL;
 
 	if (gc != NULL)
-	        prpl = purple_connection_get_prpl(gc);
+		prpl = purple_connection_get_prpl(gc);
 
 	if (prpl != NULL)
 		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
@@ -2448,7 +2452,7 @@
 	PurplePlugin *prpl = NULL;
 
 	if (gc != NULL)
-	        prpl = purple_connection_get_prpl(gc);
+		prpl = purple_connection_get_prpl(gc);
 
 	if (prpl != NULL)
 		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
@@ -2468,7 +2472,7 @@
 	purple_account_set_password(account, new_pw);
 
 	if (gc != NULL)
-	        prpl = purple_connection_get_prpl(gc);
+		prpl = purple_connection_get_prpl(gc);
 
 	if (prpl != NULL)
 		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
--- a/libpurple/conversation.h	Sat Jan 09 02:41:09 2010 +0000
+++ b/libpurple/conversation.h	Sat Jan 09 04:03:53 2010 +0000
@@ -368,7 +368,8 @@
  * @param type    The type of conversation.
  * @param account The account opening the conversation window on the purple
  *                user's end.
- * @param name    The name of the conversation.
+ * @param name    The name of the conversation.  For PURPLE_CONV_TYPE_IM,
+ *                this is the name of the buddy.
  *
  * @return The new conversation.
  */
--- a/libpurple/dbus-server.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/libpurple/dbus-server.c	Sat Jan 09 04:03:53 2010 +0000
@@ -601,7 +601,6 @@
 {
 	static DBusObjectPathVTable vtable = {NULL, &purple_dbus_dispatch, NULL, NULL, NULL, NULL};
 	DBusError error;
-	int result;
 
 	dbus_error_init(&error);
 	purple_dbus_connection = dbus_bus_get(DBUS_BUS_STARTER, &error);
@@ -625,16 +624,15 @@
 		return;
 	}
 
-	dbus_request_name_reply =
-	result = dbus_bus_request_name(purple_dbus_connection,
+	dbus_request_name_reply = dbus_bus_request_name(purple_dbus_connection,
 			DBUS_SERVICE_PURPLE, 0, &error);
 
 	if (dbus_error_is_set(&error))
 	{
 		dbus_connection_unref(purple_dbus_connection);
-		dbus_error_free(&error);
 		purple_dbus_connection = NULL;
 		init_error = g_strdup_printf(N_("Failed to get serv name: %s"), error.name);
+		dbus_error_free(&error);
 		return;
 	}
 
--- a/libpurple/ft.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/libpurple/ft.c	Sat Jan 09 04:03:53 2010 +0000
@@ -73,6 +73,30 @@
 	g_free(priv);
 }
 
+static const gchar *
+purple_xfer_status_type_to_string(PurpleXferStatusType type)
+{
+	static const struct {
+		PurpleXferStatusType type;
+		const char *name;
+	} type_names[] = {
+		{ PURPLE_XFER_STATUS_UNKNOWN, "unknown" },
+		{ PURPLE_XFER_STATUS_NOT_STARTED, "not started" },
+		{ PURPLE_XFER_STATUS_ACCEPTED, "accepted" },
+		{ PURPLE_XFER_STATUS_STARTED, "started" },
+		{ PURPLE_XFER_STATUS_DONE, "done" },
+		{ PURPLE_XFER_STATUS_CANCEL_LOCAL, "cancelled locally" },
+		{ PURPLE_XFER_STATUS_CANCEL_REMOTE, "cancelled remotely" }
+	};
+	int i;
+
+	for (i = 0; i < G_N_ELEMENTS(type_names); ++i)
+		if (type_names[i].type == type)
+			return type_names[i].name;
+
+	return "invalid state";
+}
+
 GList *
 purple_xfers_get_all()
 {
@@ -188,6 +212,11 @@
 {
 	g_return_if_fail(xfer != NULL);
 
+	if (purple_debug_is_verbose())
+		purple_debug_info("xfer", "Changing status of xfer %p from %s to %s\n",
+				xfer, purple_xfer_status_type_to_string(xfer->status),
+				purple_xfer_status_type_to_string(status));
+
 	if (xfer->status == status)
 		return;
 
@@ -547,6 +576,8 @@
 	type = purple_xfer_get_type(xfer);
 	account = purple_xfer_get_account(xfer);
 
+	purple_debug_misc("xfer", "request accepted for %p\n", xfer); 
+
 	if (!filename && type == PURPLE_XFER_RECEIVE) {
 		xfer->status = PURPLE_XFER_STATUS_ACCEPTED;
 		xfer->ops.init(xfer);
@@ -624,6 +655,8 @@
 {
 	g_return_if_fail(xfer != NULL);
 
+	purple_debug_misc("xfer", "xfer %p denied\n", xfer);
+
 	if (xfer->ops.request_denied != NULL)
 		xfer->ops.request_denied(xfer);
 
@@ -1176,6 +1209,8 @@
 
 			purple_input_remove(xfer->watcher);
 			xfer->watcher = 0;
+
+			purple_debug_misc("xfer", "prpl is ready on ft %p, waiting for UI\n", xfer);
 			return;
 		}
 	}
@@ -1238,8 +1273,12 @@
 	priv = g_hash_table_lookup(xfers_data, xfer);
 	priv->ready |= PURPLE_XFER_READY_UI;
 
-	if (0 == (priv->ready & PURPLE_XFER_READY_PRPL))
+	if (0 == (priv->ready & PURPLE_XFER_READY_PRPL)) {
+		purple_debug_misc("xfer", "UI is ready on ft %p, waiting for prpl\n", xfer);
 		return;
+	}
+
+	purple_debug_misc("xfer", "UI (and prpl) ready on ft %p, so proceeding\n", xfer);
 
 	type = purple_xfer_get_type(xfer);
 	if (type == PURPLE_XFER_SEND)
@@ -1266,8 +1305,12 @@
 	priv->ready |= PURPLE_XFER_READY_PRPL;
 
 	/* I don't think fwrite/fread are ever *not* ready */
-	if (xfer->dest_fp == NULL && 0 == (priv->ready & PURPLE_XFER_READY_UI))
+	if (xfer->dest_fp == NULL && 0 == (priv->ready & PURPLE_XFER_READY_UI)) {
+		purple_debug_misc("xfer", "prpl is ready on ft %p, waiting for UI\n", xfer);
 		return;
+	}
+
+	purple_debug_misc("xfer", "Prpl (and UI) ready on ft %p, so proceeding\n", xfer);
 
 	priv->ready = PURPLE_XFER_READY_NONE;
 
--- a/libpurple/plugins/perl/common/Log.xs	Sat Jan 09 02:41:09 2010 +0000
+++ b/libpurple/plugins/perl/common/Log.xs	Sat Jan 09 04:03:53 2010 +0000
@@ -6,7 +6,7 @@
 BOOT:
 {
 	HV *type_stash = gv_stashpv("Purple::Log::Type", 1);
-	HV *flags_stash = gv_stashpv("Purple::Log:ReadFlags::", 1);
+	HV *flags_stash = gv_stashpv("Purple::Log::ReadFlags", 1);
 
 	static const constiv *civ, type_const_iv[] = {
 #define const_iv(name) {#name, (IV)PURPLE_LOG_##name}
--- a/libpurple/plugins/perl/common/Proxy.xs	Sat Jan 09 02:41:09 2010 +0000
+++ b/libpurple/plugins/perl/common/Proxy.xs	Sat Jan 09 04:03:53 2010 +0000
@@ -5,7 +5,7 @@
 
 BOOT:
 {
-	HV *stash = gv_stashpv("Purple::ProxyType::", 1);
+	HV *stash = gv_stashpv("Purple::ProxyType", 1);
 
 	static const constiv *civ, const_iv[] = {
 #define const_iv(name) {#name, (IV)PURPLE_PROXY_##name}
--- a/libpurple/plugins/signals-test.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/libpurple/plugins/signals-test.c	Sat Jan 09 04:03:53 2010 +0000
@@ -547,6 +547,26 @@
 	purple_debug_misc("signals test", "quitting ()\n");
 }
 
+static void
+printhash(gpointer key, gpointer value, gpointer data)
+{
+	char *a = (char *)key;
+	char *b = (char *)value;
+	GString *str = (GString *)data;
+	g_string_append_printf(str, "   [%s] = [%s]\n", a, b ? b : "(null)");
+}
+
+static gboolean
+uri_handler(const char *proto, const char *cmd, GHashTable *params)
+{
+	GString *str = g_string_new("\n{\n");
+	g_hash_table_foreach(params, printhash, str);
+	g_string_append_c(str, '}');
+	purple_debug_misc("signals test", "uri handler (%s, %s, %s)\n", proto, cmd, str->str);
+	g_string_free(str, TRUE);
+	return FALSE;
+}
+
 /**************************************************************************
  * File transfer signal callbacks
  **************************************************************************/
@@ -820,6 +840,8 @@
 	/* Core signals */
 	purple_signal_connect(core_handle, "quitting",
 						plugin, PURPLE_CALLBACK(quitting_cb), NULL);
+	purple_signal_connect(core_handle, "uri-handler",
+						plugin,	PURPLE_CALLBACK(uri_handler), NULL);
 
 	/* File transfer signals */
 	purple_signal_connect(ft_handle, "file-recv-accept",
--- a/libpurple/protocols/bonjour/bonjour.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/libpurple/protocols/bonjour/bonjour.c	Sat Jan 09 04:03:53 2010 +0000
@@ -392,11 +392,8 @@
 		purple_notify_user_info_add_pair(user_info, _("XMPP Account"), bb->jid);
 }
 
-static void
-bonjour_group_buddy(PurpleConnection *connection, const char *who, const char *old_group, const char *new_group)
-{
+static void bonjour_do_group_change(PurpleBuddy *buddy, const char *new_group) {
 	PurpleBlistNodeFlags oldflags;
-	PurpleBuddy *buddy = purple_find_buddy(connection->account, who);
 
 	if (buddy == NULL)
 		return;
@@ -404,13 +401,38 @@
 	oldflags = purple_blist_node_get_flags((PurpleBlistNode *)buddy);
 
 	/* If we're moving them out of the bonjour group, make them persistent */
-	if (strcmp(new_group, BONJOUR_GROUP_NAME) == 0)
+	if (purple_strequal(new_group, BONJOUR_GROUP_NAME))
 		purple_blist_node_set_flags((PurpleBlistNode *)buddy, oldflags | PURPLE_BLIST_NODE_FLAG_NO_SAVE);
 	else
 		purple_blist_node_set_flags((PurpleBlistNode *)buddy, oldflags ^ PURPLE_BLIST_NODE_FLAG_NO_SAVE);
 
 }
 
+static void
+bonjour_group_buddy(PurpleConnection *connection, const char *who, const char *old_group, const char *new_group)
+{
+	PurpleBuddy *buddy = purple_find_buddy(connection->account, who);
+
+	bonjour_do_group_change(buddy, new_group);
+
+}
+
+static void
+bonjour_rename_group(PurpleConnection *connection, const char *old_name, PurpleGroup *group, GList *moved_buddies)
+{
+	GList *cur;
+	const char *new_group;
+	PurpleBuddy *buddy;
+
+	new_group = purple_group_get_name(group);
+
+	for (cur = moved_buddies; cur; cur = cur->next) {
+		buddy = cur->data;
+		bonjour_do_group_change(buddy, new_group);
+	}
+
+}
+
 static gboolean
 bonjour_can_receive_file(PurpleConnection *connection, const char *who)
 {
@@ -478,7 +500,7 @@
 	NULL,                                                    /* get_cb_away */
 	NULL,                                                    /* alias_buddy */
 	bonjour_group_buddy,                                     /* group_buddy */
-	NULL,                                                    /* rename_group */
+	bonjour_rename_group,                                    /* rename_group */
 	NULL,                                                    /* buddy_free */
 	bonjour_convo_closed,                                    /* convo_closed */
 	NULL,                                                    /* normalize */
--- a/libpurple/protocols/gg/gg.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/libpurple/protocols/gg/gg.c	Sat Jan 09 04:03:53 2010 +0000
@@ -947,7 +947,7 @@
 		if (xmlnode_avatar == NULL)
 			goto out;
 
-		xmlnode_bigavatar = xmlnode_get_child(xmlnode_avatar, "bigAvatar");
+		xmlnode_bigavatar = xmlnode_get_child(xmlnode_avatar, "originBigAvatar");
 		if (xmlnode_bigavatar == NULL)
 			goto out;
 
--- a/libpurple/protocols/jabber/buddy.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/libpurple/protocols/jabber/buddy.c	Sat Jan 09 04:03:53 2010 +0000
@@ -823,7 +823,8 @@
 			const gchar *title = NULL;
 			if (is_domain) {
 				title = _("Uptime");
-				message = g_strdup_printf(_("%s"), last);
+				message = last;
+				last = NULL;
 			} else {
 				title = _("Logged Off");
 				message = g_strdup_printf(_("%s ago"), last);
--- a/libpurple/protocols/jabber/roster.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/libpurple/protocols/jabber/roster.c	Sat Jan 09 04:03:53 2010 +0000
@@ -193,7 +193,9 @@
                          JabberIqType type, const char *id, xmlnode *query)
 {
 	xmlnode *item, *group;
+#if 0
 	const char *ver;
+#endif
 
 	if (!jabber_is_own_account(js, from)) {
 		purple_debug_warning("jabber", "Received bogon roster push from %s\n",
@@ -266,11 +268,13 @@
 		}
 	}
 
+#if 0
 	ver = xmlnode_get_attrib(query, "ver");
 	if (ver) {
 		 PurpleAccount *account = purple_connection_get_account(js->gc);
 		 purple_account_set_string(account, "roster_ver", ver);
 	}
+#endif
 
 	js->currently_parsing_roster_push = FALSE;
 }
--- a/libpurple/protocols/msn/msn.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/libpurple/protocols/msn/msn.c	Sat Jan 09 04:03:53 2010 +0000
@@ -1543,6 +1543,8 @@
 {
 	const char *bname;
 	MsnAddReqData *data;
+	MsnSession *session;
+	MsnUser *user;
 
 	bname = purple_buddy_get_name(buddy);
 
@@ -1564,12 +1566,18 @@
 	data->buddy = buddy;
 	data->group = group;
 
-	purple_request_input(gc, NULL, _("Authorization Request Message:"),
-	                     NULL, _("Please authorize me!"), TRUE, FALSE, NULL,
-	                     _("_OK"), G_CALLBACK(finish_auth_request),
-	                     _("_Cancel"), G_CALLBACK(cancel_auth_request),
-	                     purple_connection_get_account(gc), bname, NULL,
-	                     data);
+	session = purple_connection_get_protocol_data(gc);
+	user = msn_userlist_find_user(session->userlist, bname);
+	if (user && user->authorized) {
+		finish_auth_request(data, NULL);
+	} else {
+		purple_request_input(gc, NULL, _("Authorization Request Message:"),
+		                     NULL, _("Please authorize me!"), TRUE, FALSE, NULL,
+		                     _("_OK"), G_CALLBACK(finish_auth_request),
+		                     _("_Cancel"), G_CALLBACK(cancel_auth_request),
+		                     purple_connection_get_account(gc), bname, NULL,
+		                     data);
+	}
 }
 
 static void
@@ -2659,7 +2667,7 @@
 	OPT_PROTO_MAIL_CHECK,
 	NULL,					/* user_splits */
 	NULL,					/* protocol_options */
-	{"png", 0, 0, 96, 96, 0, PURPLE_ICON_SCALE_SEND},	/* icon_spec */
+	{"png,gif", 0, 0, 96, 96, 0, PURPLE_ICON_SCALE_SEND},	/* icon_spec */
 	msn_list_icon,			/* list_icon */
 	msn_list_emblems,		/* list_emblems */
 	msn_status_text,		/* status_text */
--- a/libpurple/protocols/msn/slp.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/libpurple/protocols/msn/slp.c	Sat Jan 09 04:03:53 2010 +0000
@@ -276,6 +276,38 @@
 	msn_slplink_queue_slpmsg(slplink, slpmsg);
 }
 
+/* XXX: this could be improved if we tracked custom smileys
+ * per-protocol, per-account, per-session or (ideally) per-conversation
+ */
+static PurpleStoredImage *
+find_valid_emoticon(PurpleAccount *account, const char *path)
+{
+	GList *smileys;
+
+	if (!purple_account_get_bool(account, "custom_smileys", TRUE))
+		return NULL;
+
+	smileys = purple_smileys_get_all();
+
+	for (; smileys; smileys = g_list_delete_link(smileys, smileys)) {
+		PurpleSmiley *smiley;
+		PurpleStoredImage *img;
+
+		smiley = smileys->data;
+		img = purple_smiley_get_stored_image(smiley);
+
+		if (purple_strequal(path, purple_imgstore_get_filename(img))) {
+			g_list_free(smileys);
+			return img;
+		}
+
+		purple_imgstore_unref(img);
+	}
+
+	purple_debug_error("msn", "Received illegal request for file %s\n", path);
+	return NULL;
+}
+
 #define MAX_FILE_NAME_LEN 0x226
 
 static void
@@ -293,7 +325,7 @@
 		MsnSlpMessage *slpmsg;
 		MsnObject *obj;
 		char *msnobj_data;
-		PurpleStoredImage *img;
+		PurpleStoredImage *img = NULL;
 		int type;
 
 		/* Send Ok */
@@ -311,51 +343,38 @@
 		obj = msn_object_new_from_string(msnobj_data);
 		type = msn_object_get_type(obj);
 		g_free(msnobj_data);
-
-		if ((type != MSN_OBJECT_USERTILE) && (type != MSN_OBJECT_EMOTICON))
-		{
-			purple_debug_error("msn", "Wrong object?\n");
-			msn_object_destroy(obj);
-			g_return_if_reached();
-		}
-
 		if (type == MSN_OBJECT_EMOTICON) {
-			char *path;
-			path = g_build_filename(purple_smileys_get_storing_dir(),
-					obj->location, NULL);
-			img = purple_imgstore_new_from_file(path);
-			g_free(path);
-		} else {
+			img = find_valid_emoticon(slplink->session->account, obj->location);
+		} else if (type == MSN_OBJECT_USERTILE) {
 			img = msn_object_get_image(obj);
 			if (img)
 				purple_imgstore_ref(img);
 		}
 		msn_object_destroy(obj);
 
-		if (img == NULL)
-		{
-			purple_debug_error("msn", "Wrong object.\n");
-			g_return_if_reached();
-		}
+		if (img != NULL) {
+			/* DATA PREP */
+			slpmsg = msn_slpmsg_new(slplink);
+			slpmsg->slpcall = slpcall;
+			slpmsg->session_id = slpcall->session_id;
+			msn_slpmsg_set_body(slpmsg, NULL, 4);
+			slpmsg->info = "SLP DATA PREP";
+			msn_slplink_queue_slpmsg(slplink, slpmsg);
 
-		/* DATA PREP */
-		slpmsg = msn_slpmsg_new(slplink);
-		slpmsg->slpcall = slpcall;
-		slpmsg->session_id = slpcall->session_id;
-		msn_slpmsg_set_body(slpmsg, NULL, 4);
-		slpmsg->info = "SLP DATA PREP";
-		msn_slplink_queue_slpmsg(slplink, slpmsg);
+			/* DATA */
+			slpmsg = msn_slpmsg_new(slplink);
+			slpmsg->slpcall = slpcall;
+			slpmsg->flags = 0x20;
+			slpmsg->info = "SLP DATA";
+			msn_slpmsg_set_image(slpmsg, img);
+			msn_slplink_queue_slpmsg(slplink, slpmsg);
+			purple_imgstore_unref(img);
 
-		/* DATA */
-		slpmsg = msn_slpmsg_new(slplink);
-		slpmsg->slpcall = slpcall;
-		slpmsg->flags = 0x20;
-		slpmsg->info = "SLP DATA";
-		msn_slpmsg_set_image(slpmsg, img);
-		msn_slplink_queue_slpmsg(slplink, slpmsg);
-		purple_imgstore_unref(img);
+			accepted = TRUE;
 
-		accepted = TRUE;
+		} else {
+			purple_debug_error("msn", "Wrong object.\n");
+		}
 	}
 
 	else if (!strcmp(euf_guid, MSN_FT_GUID))
--- a/libpurple/protocols/msn/slplink.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/libpurple/protocols/msn/slplink.c	Sat Jan 09 04:03:53 2010 +0000
@@ -669,9 +669,8 @@
 #define MAX_FILE_NAME_LEN 0x226
 
 static gchar *
-gen_context(const char *file_name, const char *file_path)
+gen_context(PurpleXfer *xfer, const char *file_name, const char *file_path)
 {
-	struct stat st;
 	gsize size = 0;
 	MsnContextHeader header;
 	gchar *u8 = NULL;
@@ -683,8 +682,7 @@
 	glong uni_len = 0;
 	gsize len;
 
-	if (g_stat(file_path, &st) == 0)
-		size = st.st_size;
+	size = purple_xfer_get_size(xfer);
 
 	if(!file_name) {
 		gchar *basename = g_path_get_basename(file_path);
@@ -761,7 +759,7 @@
 
 	xfer->data = slpcall;
 
-	context = gen_context(fn, fp);
+	context = gen_context(xfer, fn, fp);
 
 	msn_slpcall_invite(slpcall, MSN_FT_GUID, 2, context);
 
--- a/libpurple/protocols/msn/userlist.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/libpurple/protocols/msn/userlist.c	Sat Jan 09 04:03:53 2010 +0000
@@ -210,6 +210,7 @@
 
 	if (list_op & MSN_LIST_PL_OP)
 	{
+		user->authorized = TRUE;
 		got_new_entry(gc, passport, store, message);
 	}
 }
--- a/libpurple/protocols/mxit/splashscreen.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/libpurple/protocols/mxit/splashscreen.c	Sat Jan 09 04:03:53 2010 +0000
@@ -24,7 +24,6 @@
  */
 
 #include "internal.h"
-#include <glib/gstdio.h>
 
 #include "purple.h"
 #include "imgstore.h"
--- a/pidgin/gtkconv.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/pidgin/gtkconv.c	Sat Jan 09 04:03:53 2010 +0000
@@ -5501,10 +5501,12 @@
 	}
 
 	/* Somebody wants to keep this conversation around, so don't time it out */
-	timer = GPOINTER_TO_INT(purple_conversation_get_data(conv, "close-timer"));
-	if (timer) {
-		purple_timeout_remove(timer);
-		purple_conversation_set_data(conv, "close-timer", GINT_TO_POINTER(0));
+	if (conv) {
+		timer = GPOINTER_TO_INT(purple_conversation_get_data(conv, "close-timer"));
+		if (timer) {
+			purple_timeout_remove(timer);
+			purple_conversation_set_data(conv, "close-timer", GINT_TO_POINTER(0));
+		}
 	}
 }
 
@@ -7598,16 +7600,24 @@
 	}
 }
 
+struct _status_timeout_user {
+	gchar *name;
+	PurpleAccount *account;
+};
+
 static gboolean
-update_buddy_status_timeout(PurpleBuddy *buddy)
+update_buddy_status_timeout(struct _status_timeout_user *user)
 {
 	/* To remove the signing-on/off door icon */
 	PurpleConversation *conv;
 
-	conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, buddy->name, buddy->account);
+	conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, user->name, user->account);
 	if (conv)
 		pidgin_conv_update_fields(conv, PIDGIN_CONV_TAB_ICON);
 
+	g_free(user->name);
+	g_free(user);
+
 	return FALSE;
 }
 
@@ -7616,6 +7626,7 @@
 {
 	PidginConversation *gtkconv;
 	PurpleConversation *conv;
+	struct _status_timeout_user *user;
 
 	gtkconv = get_gtkconv_with_contact(purple_buddy_get_contact(buddy));
 	if (gtkconv)
@@ -7628,8 +7639,12 @@
 			pidgin_conv_update_fields(conv, PIDGIN_CONV_MENU);
 	}
 
+	user = g_malloc(sizeof(struct _status_timeout_user));
+	user->name = g_strdup(buddy->name);
+	user->account = buddy->account;
+
 	/* In case a conversation is started after the buddy has signed-on/off */
-	purple_timeout_add_seconds(11, (GSourceFunc)update_buddy_status_timeout, buddy);
+	purple_timeout_add_seconds(11, (GSourceFunc)update_buddy_status_timeout, user);
 }
 
 static void
--- a/pidgin/gtklog.c	Sat Jan 09 02:41:09 2010 +0000
+++ b/pidgin/gtklog.c	Sat Jan 09 04:03:53 2010 +0000
@@ -420,6 +420,7 @@
 {
 	PidginLogViewer *viewer = data;
 	gtk_imhtml_search_find(GTK_IMHTML(viewer->imhtml), viewer->search);
+	g_object_steal_data(G_OBJECT(viewer->entry), "search-find-cb");
 	return FALSE;
 }
 
@@ -472,8 +473,11 @@
 	g_free(read);
 
 	if (viewer->search != NULL) {
+		guint source;
 		gtk_imhtml_search_clear(GTK_IMHTML(viewer->imhtml));
-		g_idle_add(search_find_cb, viewer);
+		source = g_idle_add(search_find_cb, viewer);
+		g_object_set_data_full(G_OBJECT(viewer->entry), "search-find-cb",
+		                       GINT_TO_POINTER(source), (GDestroyNotify)g_source_remove);
 	}
 
 	pidgin_clear_cursor(viewer->window);
--- a/po/ChangeLog	Sat Jan 09 02:41:09 2010 +0000
+++ b/po/ChangeLog	Sat Jan 09 04:03:53 2010 +0000
@@ -2,10 +2,13 @@
 
 version 2.7.0
 
-version 2.6.5
+version 2.6.6
 	* Norwegian Nynorsk win32 translation added (Yngve Spjeld Landro)
 	* Russian translation updated (Антон Самохвалов)
 
+version 2.6.5
+	* No changes
+
 version 2.6.4
 	* Afrikaans translation updated (Friedel Wolff)
 	* Chinese (Hong Kong) translation updated (Ambrose C. Li, Paladin R. Liu)
--- a/po/de.po	Sat Jan 09 02:41:09 2010 +0000
+++ b/po/de.po	Sat Jan 09 04:03:53 2010 +0000
@@ -2,7 +2,7 @@
 # Pidgin German translation
 # Copyright (C) 2001, Daniel Seifert <Pidgin-translation@dseifert.de>
 # Copyright (C) 2002, Karsten Weiss <knweiss@gmx.de>
-# Copyright (C) 2002-2009, Björn Voigt <bjoern@cs.tu-berlin.de>,
+# Copyright (C) 2002-2010, Björn Voigt <bjoern@cs.tu-berlin.de>,
 #                     Jochen Kemnade <jochenkemnade@web.de>
 #
 # This file is distributed under the same license as the Pidgin package.
@@ -11,8 +11,8 @@
 msgstr ""
 "Project-Id-Version: de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-10 22:38+0100\n"
-"PO-Revision-Date: 2009-12-11 20:55+0100\n"
+"POT-Creation-Date: 2010-01-08 16:32+0100\n"
+"PO-Revision-Date: 2010-01-08 16:30+0100\n"
 "Last-Translator: Björn Voigt <bjoern@cs.tu-berlin.de>\n"
 "Language-Team: Deutsch <de@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -1960,6 +1960,9 @@
 msgstr ""
 "%s ist keine reguläre Datei. Pidgin wird die Datei nicht überschreiben.\n"
 
+msgid "File is not readable."
+msgstr "Datei ist nicht lesbar."
+
 #, c-format
 msgid "%s wants to send you %s (%s)"
 msgstr "%s möchte Ihnen %s (%s) senden"
@@ -3855,6 +3858,8 @@
 
 msgid "Server thinks authentication is complete, but client does not"
 msgstr ""
+"Der Server ist der Meinung, dass die Authentifizierung vollständig ist, der "
+"Client aber nicht"
 
 msgid "SASL authentication failed"
 msgstr "SASL-Authentifizierung fehlgeschlagen"
@@ -3863,21 +3868,17 @@
 msgid "SASL error: %s"
 msgstr "SASL-Fehler: %s"
 
-#, fuzzy
 msgid "Unable to canonicalize username"
-msgstr "Kann nicht konfigurieren"
-
-#, fuzzy
+msgstr "Benutzername konnte nicht in Normalform gebracht werden"
+
 msgid "Unable to canonicalize password"
-msgstr "Es konnte kein lauschender Port geöffnet werden."
-
-#, fuzzy
+msgstr "Passwort konnte nicht in Normalform gebracht werden"
+
 msgid "Malicious challenge from server"
-msgstr "Ungültige Challenge vom Server"
-
-#, fuzzy
+msgstr "Bösartige Challenge vom Server"
+
 msgid "Unexpected response from server"
-msgstr "Ungültige HTTP-Antwort vom Server empfangen"
+msgstr "Unerwartete Antwort vom Server"
 
 msgid "The BOSH connection manager terminated your session."
 msgstr "Der BOSH-Verbindungsmanager hat Ihre Sitzung beendet."
@@ -3979,13 +3980,8 @@
 msgid "Resource"
 msgstr "Ressource"
 
-#, fuzzy
 msgid "Uptime"
-msgstr "Aktualisieren"
-
-#, c-format
-msgid "%s"
-msgstr ""
+msgstr "Betriebszeit"
 
 msgid "Logged Off"
 msgstr "Abgemeldet"
@@ -4186,13 +4182,6 @@
 msgid "Ping timed out"
 msgstr "Ping-Zeitüberschreitung"
 
-msgid ""
-"Unable to find alternative XMPP connection methods after failing to connect "
-"directly."
-msgstr ""
-"Nach dem Fehlschlagen einer direkten XMPP-Verbindung können keine "
-"alternativen Verbindungsmethoden gefunden werden."
-
 msgid "Invalid XMPP ID"
 msgstr "Ungültige XMPP-ID"
 
@@ -5168,6 +5157,10 @@
 msgid "Your new MSN friendly name is too long."
 msgstr "Ihr neuer MSN-Benutzername zu lang."
 
+#, c-format
+msgid "Set friendly name for %s."
+msgstr "Setze Spitznamen für %s."
+
 msgid "Set your friendly name."
 msgstr "Setze Ihren Spitznamen."
 
@@ -12103,9 +12096,6 @@
 msgid "Lao"
 msgstr "Laotisch"
 
-msgid "Lithuanian"
-msgstr "Litauisch"
-
 msgid "Macedonian"
 msgstr "Makedonisch"
 
@@ -12208,6 +12198,9 @@
 msgid "Amharic"
 msgstr "Amharisch"
 
+msgid "Lithuanian"
+msgstr "Litauisch"
+
 #, c-format
 msgid "About %s"
 msgstr "Über %s"
@@ -12250,7 +12243,19 @@
 "<br/>We can't help with 3rd party protocols or plugins!<br/>This list's "
 "primary language is <b>English</b>.  You are welcome to post in another "
 "language, but the responses may be less helpful.<br/><br/>"
-msgstr "<font size=\"4\">Hilfe von anderen Pidgin-Benutzern:</font> <a href=\"mailto:support@pidgin.im\">support@pidgin.im</a><br/>Dies ist eine <b>öffentliche</b> Mailing-Liste! (<a href=\"http://pidgin.im/pipermail/support/\">Archiv</a>)<br/>Wir können nicht bei Problemen mit Drittanbieter-Protokollen oder Plugins helfen!<br/>Die Hauptsprache dieser Liste ist <b>Englisch</b>.  Sie können gern in einer anderen Sprache schreiben, aber die Antworten könnten weniger hilfreich sein.<br/>Deutschsprachige Benutzer können auch das Portal <a href=\"http://www.pidgin-im.de/\">Pidgin-IM.de</a> nutzen.  Dort finden Sie aktuelle Informationen zu Pidgin, können mit anderen Benutzern im <a href=\"http://forum.pidgin-im.de/\">Forum</a> diskutieren und Hilfe zu Problemen finden.  Beachten Sie, dass dieses Portal unabhängig vom offiziellen Pidgin-Projekt ist.<br/><br/>"
+msgstr ""
+"<font size=\"4\">Hilfe von anderen Pidgin-Benutzern:</font> <a href=\"mailto:"
+"support@pidgin.im\">support@pidgin.im</a><br/>Dies ist eine <b>öffentliche</"
+"b> Mailing-Liste! (<a href=\"http://pidgin.im/pipermail/support/\">Archiv</"
+"a>)<br/>Wir können nicht bei Problemen mit Drittanbieter-Protokollen oder "
+"Plugins helfen!<br/>Die Hauptsprache dieser Liste ist <b>Englisch</b>.  Sie "
+"können gern in einer anderen Sprache schreiben, aber die Antworten könnten "
+"weniger hilfreich sein.<br/>Deutschsprachige Benutzer können auch das Portal "
+"<a href=\"http://www.pidgin-im.de/\">Pidgin-IM.de</a> nutzen.  Dort finden "
+"Sie aktuelle Informationen zu Pidgin, können mit anderen Benutzern im <a "
+"href=\"http://forum.pidgin-im.de/\">Forum</a> diskutieren und Hilfe zu "
+"Problemen finden.  Beachten Sie, dass dieses Portal unabhängig vom "
+"offiziellen Pidgin-Projekt ist.<br/><br/>"
 
 #, c-format
 msgid ""

mercurial