changeset 28774:7fb15df96ef4

merge of '05176515f0fedf038217d2e11e4e3a1c92cad166' and '34ae591131a579911cfae8a20bcf7231fd20aff2'
author Paul Aurich <paul@darkrain42.org>
date Tue, 08 Dec 2009 07:43:03 +0000
parents 592d382e1bf4 (diff) 088fac135139 (current diff)
children be02d04d2fee
files
diffstat 57 files changed, 407 insertions(+), 330 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Dec 08 07:41:37 2009 +0000
+++ b/ChangeLog	Tue Dec 08 07:43:03 2009 +0000
@@ -4,13 +4,18 @@
 	General:
 	* Build-time fixes for Solaris.  (Paul Townsend)
 
+	AIM and ICQ:
+	* Messages from some mobile clients are no longer displayed as
+	  Chinese characters (broken in 2.6.4)
+
 	XMPP:
-	* Added support for the SCRAM-SHA-1 SASL mechanism.  This support is only
+	* 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.
+	* Added support for Roster Versioning (XEP-0237).
 
 version 2.6.4 (11/29/2009):
 	libpurple:
--- a/ChangeLog.win32	Tue Dec 08 07:41:37 2009 +0000
+++ b/ChangeLog.win32	Tue Dec 08 07:43:03 2009 +0000
@@ -1,4 +1,5 @@
 version 2.6.5 (??/??/20??):
+	* Installer translations for: Norwegian nynorsk
 
 version 2.6.4 (11/29/2009):
 	* Register URL handlers for everything that Windows knows about.  Still
--- a/finch/finch.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/finch/finch.c	Tue Dec 08 07:43:03 2009 +0000
@@ -19,8 +19,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 "finch.h"
-#include <internal.h>
 
 #include "account.h"
 #include "conversation.h"
--- a/finch/gntaccount.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/finch/gntaccount.c	Tue Dec 08 07:43:03 2009 +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>
@@ -36,7 +38,6 @@
 #include <gntwindow.h>
 
 #include "finch.h"
-#include <internal.h>
 
 #include <account.h>
 #include <accountopt.h>
--- a/finch/gntblist.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/finch/gntblist.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,8 +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 "finch.h"
-#include <internal.h>
 
 #include <account.h>
 #include <blist.h>
--- a/finch/gntcertmgr.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/finch/gntcertmgr.c	Tue Dec 08 07:43:03 2009 +0000
@@ -25,8 +25,8 @@
  *
  */
 
+#include <internal.h>
 #include "finch.h"
-#include <internal.h>
 
 #include "certificate.h"
 #include "debug.h"
--- a/finch/gntconn.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/finch/gntconn.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,8 +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 "finch.h"
-#include <internal.h>
 
 #include "account.h"
 #include "core.h"
--- a/finch/gntconv.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/finch/gntconv.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,10 +23,9 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
-#include <string.h>
 
+#include <internal.h>
 #include "finch.h"
-#include <internal.h>
 
 #include <cmds.h>
 #include <core.h>
--- a/finch/gntdebug.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/finch/gntdebug.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,6 +23,9 @@
  * 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 +38,6 @@
 
 #include "gntdebug.h"
 #include "finch.h"
-#include <internal.h>
 #include "notify.h"
 #include "util.h"
 
--- a/finch/gntft.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/finch/gntft.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,8 +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 "finch.h"
-#include <internal.h>
 
 #include <gnt.h>
 #include <gntbox.h>
--- a/finch/gntlog.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/finch/gntlog.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,8 +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 "finch.h"
-#include <internal.h>
 
 #include <gnt.h>
 #include <gntbox.h>
--- a/finch/gntmedia.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/finch/gntmedia.c	Tue Dec 08 07:43:03 2009 +0000
@@ -24,8 +24,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
+#include <internal.h>
 #include "finch.h"
-#include <internal.h>
 #include "gntconv.h"
 #include "gntmedia.h"
 
--- a/finch/gntnotify.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/finch/gntnotify.c	Tue Dec 08 07:43:03 2009 +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>
@@ -32,7 +34,6 @@
 #include <gntwindow.h>
 
 #include "finch.h"
-#include <internal.h>
 
 #include <util.h>
 
--- a/finch/gntplugin.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/finch/gntplugin.c	Tue Dec 08 07:43:03 2009 +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>
@@ -32,7 +34,6 @@
 #include <gntutils.h>
 
 #include "finch.h"
-#include <internal.h>
 
 #include "debug.h"
 #include "notify.h"
--- a/finch/gntpounce.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/finch/gntpounce.c	Tue Dec 08 07:43:03 2009 +0000
@@ -24,6 +24,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  *
  */
+#include <internal.h>
+
 #include <gnt.h>
 #include <gntbox.h>
 #include <gntbutton.h>
@@ -36,7 +38,6 @@
 #include <gntutils.h>
 
 #include "finch.h"
-#include <internal.h>
 
 #include "account.h"
 #include "conversation.h"
--- a/finch/libgnt/gntutils.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/finch/libgnt/gntutils.c	Tue Dec 08 07:43:03 2009 +0000
@@ -20,6 +20,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
+#include "config.h"
+
 #include "gntinternal.h"
 #undef GNT_LOG_DOMAIN
 #define GNT_LOG_DOMAIN "Utils"
@@ -35,8 +37,6 @@
 #include "gntutils.h"
 #include "gntwindow.h"
 
-#include "config.h"
-
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
@@ -46,8 +46,6 @@
 #include <libxml/tree.h>
 #endif
 
-#include "config.h"
-
 void gnt_util_get_text_bound(const char *text, int *width, int *height)
 {
 	const char *s = text, *last;
--- a/finch/libgnt/wms/s.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/finch/libgnt/wms/s.c	Tue Dec 08 07:43:03 2009 +0000
@@ -1,8 +1,8 @@
+#include "internal.h"
+
 #include <string.h>
 #include <sys/types.h>
 
-#include "internal.h"
-
 #include "gnt.h"
 #include "gntbox.h"
 #include "gntmenu.h"
--- a/libpurple/protocols/gg/lib/common.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/gg/lib/common.c	Tue Dec 08 07:43:03 2009 +0000
@@ -19,6 +19,8 @@
  *  USA.
  */
 
+#include "libgadu.h"
+
 #ifndef _WIN32
 #include <sys/types.h>
 #include <sys/ioctl.h>
@@ -41,8 +43,6 @@
 #include <string.h>
 #include <unistd.h>
 
-#include "libgadu.h"
-
 FILE *gg_debug_file = NULL;
 
 #ifndef GG_DEBUG_DISABLE
--- a/libpurple/protocols/gg/lib/dcc.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/gg/lib/dcc.c	Tue Dec 08 07:43:03 2009 +0000
@@ -19,6 +19,8 @@
  *  USA.
  */
 
+#include "libgadu.h"
+
 #include <sys/types.h>
 #include <sys/stat.h>
 #ifndef _WIN32
@@ -41,8 +43,6 @@
 #include <unistd.h>
 
 #include "compat.h"
-#include "libgadu.h"
-
 #ifndef GG_DEBUG_DISABLE
 /*
  * gg_dcc_debug_data() // funkcja wewntrzna
--- a/libpurple/protocols/gg/lib/events.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/gg/lib/events.c	Tue Dec 08 07:43:03 2009 +0000
@@ -20,6 +20,8 @@
  *  USA.
  */
 
+#include "libgadu.h"
+
 #include <sys/types.h>
 #ifndef _WIN32
 #include <sys/wait.h>
@@ -46,7 +48,6 @@
 #endif
 
 #include "compat.h"
-#include "libgadu.h"
 
 /*
  * gg_event_free()
--- a/libpurple/protocols/gg/lib/http.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/gg/lib/http.c	Tue Dec 08 07:43:03 2009 +0000
@@ -18,6 +18,8 @@
  *  USA.
  */
 
+#include "libgadu.h"
+
 #include <sys/types.h>
 #ifndef _WIN32
 #include <sys/wait.h>
@@ -43,7 +45,6 @@
 #include <unistd.h>
 
 #include "compat.h"
-#include "libgadu.h"
 
 /*
  * gg_http_connect() // funkcja pomocnicza
--- a/libpurple/protocols/gg/lib/libgadu.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/gg/lib/libgadu.c	Tue Dec 08 07:43:03 2009 +0000
@@ -21,6 +21,8 @@
  *  USA.
  */
 
+#include "libgadu.h"
+
 #include <sys/types.h>
 #ifndef _WIN32
 #include <sys/wait.h>
@@ -57,7 +59,6 @@
 #endif
 
 #include "compat.h"
-#include "libgadu.h"
 
 int gg_debug_level = 0;
 void (*gg_debug_handler)(int level, const char *format, va_list ap) = NULL;
--- a/libpurple/protocols/gg/lib/pubdir.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/gg/lib/pubdir.c	Tue Dec 08 07:43:03 2009 +0000
@@ -19,6 +19,8 @@
  *  USA.
  */
 
+#include "libgadu.h"
+
 #include <ctype.h>
 #include <errno.h>
 #include <stdarg.h>
@@ -27,8 +29,6 @@
 #include <string.h>
 #include <unistd.h>
 
-#include "libgadu.h"
-
 /*
  * gg_register3()
  *
--- a/libpurple/protocols/gg/lib/pubdir50.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/gg/lib/pubdir50.c	Tue Dec 08 07:43:03 2009 +0000
@@ -18,13 +18,13 @@
  *  USA.
  */
 
+#include "libgadu.h"
+
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
 #include <time.h>
 
-#include "libgadu.h"
-
 /*
  * gg_pubdir50_new()
  *
--- a/libpurple/protocols/jabber/buddy.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/jabber/buddy.c	Tue Dec 08 07:43:03 2009 +0000
@@ -816,10 +816,7 @@
 	if (!jbi->jb->resources) {
 		/* the buddy is offline */
 		gboolean is_domain = jabber_jid_is_domain(jbi->jid);
-		gchar *status =
-			g_strdup_printf("%s%s%s",	_("Offline"),
-			                jbi->last_message ? ": " : "",
-			                jbi->last_message ? jbi->last_message : "");
+
 		if (jbi->last_seconds > 0) {
 			char *last = purple_str_seconds_to_string(jbi->last_seconds);
 			gchar *message = NULL;
@@ -836,9 +833,14 @@
 			g_free(message);
 		}
 
-		if (!is_domain)
+		if (!is_domain) {
+			gchar *status =
+				g_strdup_printf("%s%s%s",	_("Offline"),
+				                jbi->last_message ? ": " : "",
+				                jbi->last_message ? jbi->last_message : "");
 			purple_notify_user_info_prepend_pair(user_info, _("Status"), status);
-		g_free(status);
+			g_free(status);
+		}
 	}
 
 	g_free(resource_name);
--- a/libpurple/protocols/jabber/disco.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/jabber/disco.c	Tue Dec 08 07:43:03 2009 +0000
@@ -370,10 +370,8 @@
 	if (js->pep)
 		jabber_avatar_fetch_mine(js);
 
-	if (!(js->server_caps & JABBER_CAP_GOOGLE_ROSTER)) {
-		/* If the server supports JABBER_CAP_GOOGLE_ROSTER; we will have already requested it */
-		jabber_roster_request(js);
-	}
+	/* Yes, please! */
+	jabber_roster_request(js);
 
 	if (js->server_caps & JABBER_CAP_ADHOC) {
 		/* The server supports ad-hoc commands, so let's request the list */
@@ -555,9 +553,8 @@
 		if (!strcmp(NS_GOOGLE_MAIL_NOTIFY, var)) {
 			js->server_caps |= JABBER_CAP_GMAIL_NOTIFY;
 			jabber_gmail_init(js);
-		} else if (!strcmp("google:roster", var)) {
+		} else if (!strcmp(NS_GOOGLE_ROSTER, var)) {
 			js->server_caps |= JABBER_CAP_GOOGLE_ROSTER;
-			jabber_google_roster_init(js);
 		} else if (!strcmp("http://jabber.org/protocol/commands", var)) {
 			js->server_caps |= JABBER_CAP_ADHOC;
 		} else if (!strcmp(NS_SIMPLE_BLOCKING, var)) {
--- a/libpurple/protocols/jabber/google.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/jabber/google.c	Tue Dec 08 07:43:03 2009 +0000
@@ -30,6 +30,7 @@
 #include "google.h"
 #include "jabber.h"
 #include "presence.h"
+#include "roster.h"
 #include "iq.h"
 #include "chat.h"
 
@@ -949,20 +950,6 @@
 	jabber_iq_send(iq);
 }
 
-void jabber_google_roster_init(JabberStream *js)
-{
-	JabberIq *iq;
-	xmlnode *query;
-
-	iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:roster");
-	query = xmlnode_get_child(iq->node, "query");
-
-	xmlnode_set_attrib(query, "xmlns:gr", "google:roster");
-	xmlnode_set_attrib(query, "gr:ext", "2");
-
-	jabber_iq_send(iq);
-}
-
 void jabber_google_roster_outgoing(JabberStream *js, xmlnode *query, xmlnode *item)
 {
 	PurpleAccount *account = purple_connection_get_account(js->gc);
@@ -972,7 +959,7 @@
 
 	while (list) {
 		if (!strcmp(jid_norm, (char*)list->data)) {
-			xmlnode_set_attrib(query, "xmlns:gr", "google:roster");
+			xmlnode_set_attrib(query, "xmlns:gr", NS_GOOGLE_ROSTER);
 			xmlnode_set_attrib(query, "gr:ext", "2");
 			xmlnode_set_attrib(item, "gr:t", "B");
 			return;
@@ -989,7 +976,7 @@
 
 	char *jid_norm;
 
-	const char *grt = xmlnode_get_attrib_with_namespace(item, "t", "google:roster");
+	const char *grt = xmlnode_get_attrib_with_namespace(item, "t", NS_GOOGLE_ROSTER);
 	const char *subscription = xmlnode_get_attrib(item, "subscription");
 	const char *ask = xmlnode_get_attrib(item, "ask");
 
@@ -1032,9 +1019,9 @@
 	return TRUE;
 }
 
-void jabber_google_roster_add_deny(PurpleConnection *gc, const char *who)
+void jabber_google_roster_add_deny(JabberStream *js, const char *who)
 {
-	JabberStream *js;
+	PurpleAccount *account;
 	GSList *buddies;
 	JabberIq *iq;
 	xmlnode *query;
@@ -1044,14 +1031,10 @@
 	JabberBuddy *jb;
 	const char *balias;
 
-	js = (JabberStream*)(gc->proto_data);
-
-	if (!js || !(js->server_caps & JABBER_CAP_GOOGLE_ROSTER))
-		return;
-
 	jb = jabber_buddy_find(js, who, TRUE);
 
-	buddies = purple_find_buddies(js->gc->account, who);
+	account = purple_connection_get_account(js->gc);
+	buddies = purple_find_buddies(account, who);
 	if(!buddies)
 		return;
 
@@ -1078,7 +1061,7 @@
 	xmlnode_set_attrib(item, "jid", who);
 	xmlnode_set_attrib(item, "name", balias ? balias : "");
 	xmlnode_set_attrib(item, "gr:t", "B");
-	xmlnode_set_attrib(query, "xmlns:gr", "google:roster");
+	xmlnode_set_attrib(query, "xmlns:gr", NS_GOOGLE_ROSTER);
 	xmlnode_set_attrib(query, "gr:ext", "2");
 
 	jabber_iq_send(iq);
@@ -1098,12 +1081,11 @@
 		}
 	}
 
-	purple_prpl_got_user_status(purple_connection_get_account(gc), who, "offline", NULL);
+	purple_prpl_got_user_status(account, who, "offline", NULL);
 }
 
-void jabber_google_roster_rem_deny(PurpleConnection *gc, const char *who)
+void jabber_google_roster_rem_deny(JabberStream *js, const char *who)
 {
-	JabberStream *js;
 	GSList *buddies;
 	JabberIq *iq;
 	xmlnode *query;
@@ -1112,14 +1094,6 @@
 	PurpleBuddy *b;
 	const char *balias;
 
-	g_return_if_fail(gc != NULL);
-	g_return_if_fail(who != NULL);
-
-	js = (JabberStream*)(gc->proto_data);
-
-	if (!js || !(js->server_caps & JABBER_CAP_GOOGLE_ROSTER))
-		return;
-
 	buddies = purple_find_buddies(purple_connection_get_account(js->gc), who);
 	if(!buddies)
 		return;
@@ -1146,7 +1120,7 @@
 	balias = purple_buddy_get_local_buddy_alias(b);
 	xmlnode_set_attrib(item, "jid", who);
 	xmlnode_set_attrib(item, "name", balias ? balias : "");
-	xmlnode_set_attrib(query, "xmlns:gr", "google:roster");
+	xmlnode_set_attrib(query, "xmlns:gr", NS_GOOGLE_ROSTER);
 	xmlnode_set_attrib(query, "gr:ext", "2");
 
 	jabber_iq_send(iq);
--- a/libpurple/protocols/jabber/google.h	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/jabber/google.h	Tue Dec 08 07:43:03 2009 +0000
@@ -32,7 +32,6 @@
 void jabber_gmail_poke(JabberStream *js, const char *from, JabberIqType type,
                        const char *id, xmlnode *new_mail);
 
-void jabber_google_roster_init(JabberStream *js);
 void jabber_google_roster_outgoing(JabberStream *js, xmlnode *query, xmlnode *item);
 
 /* Returns FALSE if this should short-circuit processing of this roster item, or TRUE
@@ -43,8 +42,8 @@
 void jabber_google_presence_incoming(JabberStream *js, const char *who, JabberBuddyResource *jbr);
 char *jabber_google_presence_outgoing(PurpleStatus *tune);
 
-void jabber_google_roster_add_deny(PurpleConnection *gc, const char *who);
-void jabber_google_roster_rem_deny(PurpleConnection *gc, const char *who);
+void jabber_google_roster_add_deny(JabberStream *js, const char *who);
+void jabber_google_roster_rem_deny(JabberStream *js, const char *who);
 
 char *jabber_google_format_to_html(const char *text);
 
--- a/libpurple/protocols/jabber/jabber.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/jabber/jabber.c	Tue Dec 08 07:43:03 2009 +0000
@@ -229,6 +229,8 @@
 		jabber_iq_set_callback(iq, jabber_bind_result_cb, NULL);
 
 		jabber_iq_send(iq);
+	} else if (xmlnode_get_child_with_namespace(packet, "ver", NS_ROSTER_VERSIONING)) {
+		js->server_caps |= JABBER_CAP_ROSTER_VERSIONING;
 	} else /* if(xmlnode_get_child_with_namespace(packet, "auth")) */ {
 		/* If we get an empty stream:features packet, or we explicitly get
 		 * an auth feature with namespace http://jabber.org/features/iq-auth
@@ -1742,13 +1744,15 @@
 	JabberIq *iq;
 	xmlnode *block, *item;
 
-	js = gc->proto_data;
+	g_return_if_fail(who != NULL && *who != '\0');
+
+	js = purple_connection_get_protocol_data(gc);
 	if (js == NULL)
 		return;
 
 	if (js->server_caps & JABBER_CAP_GOOGLE_ROSTER)
 	{
-		jabber_google_roster_add_deny(gc, who);
+		jabber_google_roster_add_deny(js, who);
 		return;
 	}
 
@@ -1776,13 +1780,15 @@
 	JabberIq *iq;
 	xmlnode *unblock, *item;
 
-	js = gc->proto_data;
+	g_return_if_fail(who != NULL && *who != '\0');
+
+	js = purple_connection_get_protocol_data(gc);
 	if (js == NULL)
 		return;
 
 	if (js->server_caps & JABBER_CAP_GOOGLE_ROSTER)
 	{
-		jabber_google_roster_rem_deny(gc, who);
+		jabber_google_roster_rem_deny(js, who);
 		return;
 	}
 
--- a/libpurple/protocols/jabber/jabber.h	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/jabber/jabber.h	Tue Dec 08 07:43:03 2009 +0000
@@ -47,6 +47,7 @@
 	JABBER_CAP_BLOCKING       = 1 << 13,
 
 	JABBER_CAP_ITEMS          = 1 << 14,
+	JABBER_CAP_ROSTER_VERSIONING = 1 << 15,
 
 	JABBER_CAP_RETRIEVED      = 1 << 31
 } JabberCapabilities;
--- a/libpurple/protocols/jabber/jutil.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/jabber/jutil.c	Tue Dec 08 07:43:03 2009 +0000
@@ -565,11 +565,14 @@
 gboolean
 jabber_jid_is_domain(const char *jid)
 {
-	char *domain = jabber_get_domain(jid);
-	gboolean is_domain = purple_strequal(jid, domain);
+	const char *c;
 
-	g_free(domain);
-	return is_domain;
+	for (c = jid; *c; ++c) {
+		if (*c == '@' || *c == '/')
+			return FALSE;
+	}
+
+	return TRUE;
 }
 
 
--- a/libpurple/protocols/jabber/namespaces.h	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/jabber/namespaces.h	Tue Dec 08 07:43:03 2009 +0000
@@ -85,6 +85,9 @@
 /* XEP-0231 BoB (Bits of Binary) */
 #define NS_BOB "urn:xmpp:bob"
 
+/* XEP-0237 Roster Versioning */
+#define NS_ROSTER_VERSIONING "urn:xmpp:features:rosterver"
+
 /* Google extensions */
 #define NS_GOOGLE_CAMERA "http://www.google.com/xmpp/protocol/camera/v1"
 #define NS_GOOGLE_VIDEO "http://www.google.com/xmpp/protocol/video/v1"
@@ -92,6 +95,7 @@
 #define NS_GOOGLE_JINGLE_INFO "google:jingleinfo"
 
 #define NS_GOOGLE_MAIL_NOTIFY "google:mail:notify"
+#define NS_GOOGLE_ROSTER "google:roster"
 
 #define NS_GOOGLE_PROTOCOL_SESSION "http://www.google.com/xmpp/protocol/session"
 #define NS_GOOGLE_SESSION "http://www.google.com/session"
--- a/libpurple/protocols/jabber/presence.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/jabber/presence.c	Tue Dec 08 07:43:03 2009 +0000
@@ -150,7 +150,7 @@
 
 	/* we don't want to send presence before we've gotten our roster */
 	if (js->state != JABBER_STREAM_CONNECTED) {
-		purple_debug_info("jabber", "attempt to send presence before roster retrieved\n");
+		purple_debug_misc("jabber", "attempt to send presence before roster retrieved\n");
 		return;
 	}
 
--- a/libpurple/protocols/jabber/roster.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/jabber/roster.c	Tue Dec 08 07:43:03 2009 +0000
@@ -47,12 +47,53 @@
 	return g_string_free(out, FALSE);
 }
 
+static void roster_request_cb(JabberStream *js, const char *from,
+                              JabberIqType type, const char *id,
+                              xmlnode *packet, gpointer data)
+{
+	xmlnode *query;
+
+	if (type == JABBER_IQ_ERROR) {
+		/*
+		 * This shouldn't happen in any real circumstances and
+		 * likely constitutes a server-side misconfiguration (i.e.
+		 * explicitly not loading mod_roster...)
+		 */
+		purple_debug_error("jabber", "Error retrieving roster!?\n");
+		jabber_stream_set_state(js, JABBER_STREAM_CONNECTED);
+		return;
+	}
+
+	query = xmlnode_get_child(packet, "query");
+	if (query == NULL) {
+		jabber_stream_set_state(js, JABBER_STREAM_CONNECTED);
+		return;
+	}
+
+	jabber_roster_parse(js, from, type, id, query);
+	jabber_stream_set_state(js, JABBER_STREAM_CONNECTED);
+}
+
 void jabber_roster_request(JabberStream *js)
 {
+	PurpleAccount *account;
+	const char *ver;
 	JabberIq *iq;
+	xmlnode *query;
+
+	account = purple_connection_get_account(js->gc);
+	ver = purple_account_get_string(account, "roster_ver", "");
 
 	iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:roster");
+	query = xmlnode_get_child(iq->node, "query");
+	xmlnode_set_attrib(query, "ver", ver);
 
+	if (js->server_caps & JABBER_CAP_GOOGLE_ROSTER) {
+		xmlnode_set_attrib(query, "xmlns:gr", NS_GOOGLE_ROSTER);
+		xmlnode_set_attrib(query, "gr:ext", "2");
+	}
+
+	jabber_iq_set_callback(iq, roster_request_cb, NULL);
 	jabber_iq_send(iq);
 }
 
@@ -155,6 +196,7 @@
                          JabberIqType type, const char *id, xmlnode *query)
 {
 	xmlnode *item, *group;
+	const char *ver;
 
 	if (!jabber_is_own_account(js, from)) {
 		purple_debug_warning("jabber", "Received bogon roster push from %s\n",
@@ -227,13 +269,13 @@
 		}
 	}
 
-	js->currently_parsing_roster_push = FALSE;
+	ver = xmlnode_get_attrib(query, "ver");
+	if (ver) {
+		 PurpleAccount *account = purple_connection_get_account(js->gc);
+		 purple_account_set_string(account, "roster_ver", ver);
+	}
 
-	/* if we're just now parsing the roster for the first time,
-	 * then now would be the time to declare ourselves connected.
-	 */
-	if (js->state != JABBER_STREAM_CONNECTED)
-		jabber_stream_set_state(js, JABBER_STREAM_CONNECTED);
+	js->currently_parsing_roster_push = FALSE;
 }
 
 /* jabber_roster_update frees the GSList* passed in */
@@ -297,7 +339,7 @@
 
 	if (js->server_caps & JABBER_CAP_GOOGLE_ROSTER) {
 		jabber_google_roster_outgoing(js, query, item);
-		xmlnode_set_attrib(query, "xmlns:gr", "google:roster");
+		xmlnode_set_attrib(query, "xmlns:gr", NS_GOOGLE_ROSTER);
 		xmlnode_set_attrib(query, "gr:ext", "2");
 	}
 	jabber_iq_send(iq);
--- a/libpurple/protocols/mxit/actions.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/mxit/actions.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,11 +23,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include	<stdio.h>
-#include	<stdlib.h>
-#include	<string.h>
-#include	<time.h>
-
+#include    "internal.h"
 #include	"purple.h"
 
 #include	"protocol.h"
--- a/libpurple/protocols/mxit/chunk.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/mxit/chunk.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,10 +23,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include	<stdio.h>
-#include	<unistd.h>
-#include	<string.h>
-
+#include    "internal.h"
 #include	"purple.h"
 #include	"protocol.h"
 #include	"mxit.h"
--- a/libpurple/protocols/mxit/cipher.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/mxit/cipher.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,10 +23,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include	<stdio.h>
-#include	<unistd.h>
-#include	<string.h>
-
+#include    "internal.h"
 #include	"purple.h"
 
 #include	"mxit.h"
--- a/libpurple/protocols/mxit/filexfer.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/mxit/filexfer.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,10 +23,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include	<stdio.h>
-#include	<unistd.h>
-#include	<string.h>
-
+#include    "internal.h"
 #include	"purple.h"
 #include	"protocol.h"
 #include	"mxit.h"
--- a/libpurple/protocols/mxit/formcmds.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/mxit/formcmds.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,8 +23,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include <string.h>
-#include <glib.h>
+
+#include "internal.h"
 #include <glib/gprintf.h>
 
 #include "purple.h"
--- a/libpurple/protocols/mxit/http.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/mxit/http.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,11 +23,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include	<stdio.h>
-#include	<unistd.h>
-#include	<string.h>
-#include	<errno.h>
-
+#include    "internal.h"
 #include	"purple.h"
 
 #include	"mxit.h"
--- a/libpurple/protocols/mxit/login.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/mxit/login.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,9 +23,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include	<stdio.h>
-#include	<string.h>
-
+#include    "internal.h"
 #include	"purple.h"
 
 #include	"protocol.h"
--- a/libpurple/protocols/mxit/markup.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/mxit/markup.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,10 +23,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include	<stdio.h>
-#include	<unistd.h>
-#include	<string.h>
-
+#include    "internal.h"
 #include	"purple.h"
 
 #include	"protocol.h"
--- a/libpurple/protocols/mxit/multimx.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/mxit/multimx.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,9 +23,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include <string.h>
-#include <errno.h>
-
+#include "internal.h"
 #include "purple.h"
 #include "prpl.h"
 
--- a/libpurple/protocols/mxit/mxit.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/mxit/mxit.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,10 +23,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include	<glib.h>
-#include	<stdio.h>
-#include	<string.h>
-
+#include    "internal.h"
 #include	"purple.h"
 #include	"notify.h"
 #include	"plugin.h"
--- a/libpurple/protocols/mxit/profile.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/mxit/profile.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,9 +23,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include	<ctype.h>
-#include	<string.h>
-
+#include    "internal.h"
 #include	"purple.h"
 
 #include	"mxit.h"
--- a/libpurple/protocols/mxit/protocol.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/mxit/protocol.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,11 +23,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include	<stdio.h>
-#include	<unistd.h>
-#include	<string.h>
-#include	<errno.h>
-
+#include    "internal.h"
 #include	"purple.h"
 
 #include	"protocol.h"
--- a/libpurple/protocols/mxit/roster.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/mxit/roster.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,10 +23,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include	<stdio.h>
-#include	<unistd.h>
-#include	<string.h>
-
+#include    "internal.h"
 #include	"purple.h"
 
 #include	"protocol.h"
--- a/libpurple/protocols/mxit/splashscreen.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/mxit/splashscreen.c	Tue Dec 08 07:43:03 2009 +0000
@@ -23,6 +23,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
+#include "internal.h"
 #include <glib/gstdio.h>
 
 #include "purple.h"
--- a/libpurple/protocols/oscar/clientlogin.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/oscar/clientlogin.c	Tue Dec 08 07:43:03 2009 +0000
@@ -36,12 +36,12 @@
  * http://dev.aol.com/authentication_for_clients
  */
 
+#include "oscar.h"
+#include "oscarcommon.h"
+
 #include "cipher.h"
 #include "core.h"
 
-#include "oscar.h"
-#include "oscarcommon.h"
-
 #define URL_CLIENT_LOGIN "https://api.screenname.aol.com/auth/clientLogin"
 #define URL_START_OSCAR_SESSION "http://api.oscar.aol.com/aim/startOSCARSession"
 
--- a/libpurple/protocols/oscar/family_auth.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/oscar/family_auth.c	Tue Dec 08 07:43:03 2009 +0000
@@ -26,12 +26,12 @@
  *
  */
 
+#include "oscar.h"
+
 #include <ctype.h>
 
 #include "cipher.h"
 
-#include "oscar.h"
-
 /* #define USE_XOR_FOR_ICQ */
 
 #ifdef USE_XOR_FOR_ICQ
--- a/libpurple/protocols/oscar/oscar.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/oscar/oscar.c	Tue Dec 08 07:43:03 2009 +0000
@@ -4650,7 +4650,7 @@
 	if ((conn != NULL) && (conn->ready))
 	{
 		/* If we're directly connected, send a direct IM */
-		purple_debug_info("oscar", "Sending direct IM with flags %i", imflags);
+		purple_debug_info("oscar", "Sending direct IM with flags %i\n", imflags);
 		purple_odc_send_im(conn, tmp1, imflags);
 	} else {
 		struct buddyinfo *bi;
--- a/libpurple/protocols/oscar/oscarcommon.h	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/oscar/oscarcommon.h	Tue Dec 08 07:43:03 2009 +0000
@@ -24,8 +24,9 @@
  * and libicq.c
  */
 
+#include "internal.h"
+
 #include "accountopt.h"
-#include "internal.h"
 #include "prpl.h"
 #include "version.h"
 #include "notify.h"
--- a/libpurple/protocols/yahoo/ycht.c	Tue Dec 08 07:41:37 2009 +0000
+++ b/libpurple/protocols/yahoo/ycht.c	Tue Dec 08 07:43:03 2009 +0000
@@ -25,8 +25,6 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include <string.h>
-
 #include "internal.h"
 #include "prpl.h"
 #include "notify.h"
--- a/pidgin/win32/nsis/pidgin-installer.nsi	Tue Dec 08 07:41:37 2009 +0000
+++ b/pidgin/win32/nsis/pidgin-installer.nsi	Tue Dec 08 07:43:03 2009 +0000
@@ -191,6 +191,7 @@
   !insertmacro MUI_LANGUAGE "Hungarian"
   !insertmacro MUI_LANGUAGE "Dutch"
   !insertmacro MUI_LANGUAGE "Norwegian"
+  !insertmacro MUI_LANGUAGE "NorwegianNynorsk"
   !insertmacro MUI_LANGUAGE "Polish"
   !insertmacro MUI_LANGUAGE "PortugueseBR"
   !insertmacro MUI_LANGUAGE "Portuguese"
@@ -230,6 +231,7 @@
   !insertmacro PIDGIN_MACRO_INCLUDE_LANGFILE "KURDISH"		"${PIDGIN_NSIS_INCLUDE_PATH}\translations\kurdish.nsh"
   !insertmacro PIDGIN_MACRO_INCLUDE_LANGFILE "LITHUANIAN"	"${PIDGIN_NSIS_INCLUDE_PATH}\translations\lithuanian.nsh"
   !insertmacro PIDGIN_MACRO_INCLUDE_LANGFILE "NORWEGIAN"	"${PIDGIN_NSIS_INCLUDE_PATH}\translations\norwegian.nsh"
+  !insertmacro PIDGIN_MACRO_INCLUDE_LANGFILE "NORWEGIANNYNORSK"	"${PIDGIN_NSIS_INCLUDE_PATH}\translations\norwegian_nynorsk.nsh"
   !insertmacro PIDGIN_MACRO_INCLUDE_LANGFILE "POLISH"		"${PIDGIN_NSIS_INCLUDE_PATH}\translations\polish.nsh"
   !insertmacro PIDGIN_MACRO_INCLUDE_LANGFILE "PORTUGUESE"	"${PIDGIN_NSIS_INCLUDE_PATH}\translations\portuguese.nsh"
   !insertmacro PIDGIN_MACRO_INCLUDE_LANGFILE "PORTUGUESEBR"	"${PIDGIN_NSIS_INCLUDE_PATH}\translations\portuguese-br.nsh"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/win32/nsis/translations/norwegian_nynorsk.nsh	Tue Dec 08 07:43:03 2009 +0000
@@ -0,0 +1,80 @@
+;;
+;;  norwegian_nynorsk.nsh
+;;
+;;  Norwegian nynorsk language strings for the Windows Pidgin NSIS installer.
+;;  Windows Code page: 1252
+;;
+;;  Version 3
+
+; Startup Checks
+!define INSTALLER_IS_RUNNING			"Installasjonsprogrammet kjrer allereie."
+!define PIDGIN_IS_RUNNING			"Pidgin kjrer no. Lukk programmet og prv igjen."
+!define GTK_INSTALLER_NEEDED			"GTK+-kjremiljet manglar eller treng  bli oppdatert.$\rInstaller v${GTK_MIN_VERSION} eller nyare av GTK+-kjremiljet"
+
+; License Page
+!define PIDGIN_LICENSE_BUTTON			"Neste >"
+!define PIDGIN_LICENSE_BOTTOM_TEXT		"$(^Name) blir utgjeve med ein GNU General Public License (GPL). Lisensen er berre gjeven her for opplysningsforml. $_CLICK"
+
+; Components Page
+!define PIDGIN_SECTION_TITLE			"Pidgin lynmeldingsklient (pkravd)"
+!define GTK_SECTION_TITLE			"GTK+-kjremilj (pkravd om det ikkje er til stades no)"
+!define PIDGIN_SHORTCUTS_SECTION_TITLE		"Snarvegar"
+!define PIDGIN_DESKTOP_SHORTCUT_SECTION_TITLE	"Skrivebordet"
+!define PIDGIN_STARTMENU_SHORTCUT_SECTION_TITLE	"Startmenyen"
+!define PIDGIN_SECTION_DESCRIPTION		"Pidgin programfiler og DLL-ar"
+!define GTK_SECTION_DESCRIPTION		"Ei grafisk brukargrensesnittverktykasse p fleire plattformer som Pidgin nyttar"
+
+!define PIDGIN_SHORTCUTS_SECTION_DESCRIPTION	"Snarvegar for  starta Pidgin"
+!define PIDGIN_DESKTOP_SHORTCUT_DESC		"Lag ein snarveg til Pidgin p skrivebordet"
+!define PIDGIN_STARTMENU_SHORTCUT_DESC		"Lag ein snarveg til Pidgin p startmenyen"
+
+; GTK+ Directory Page
+!define GTK_UPGRADE_PROMPT			"Fann ei gammal utgve av GTK+-kjremiljet. Vil du oppdatera ho?$\rMerk: $(^Name) vil kanskje ikkje fungera om du ikkje oppdaterer."
+!define GTK_WINDOWS_INCOMPATIBLE		"Windows 95/98/Me er ikkje kompatibelt med GTK+ 2.8.0 eller nyare. GTK+ ${GTK_INSTALL_VERSION} kjem ikkje til  bli installert.$\rInstallasjonen vil bli abvroten om ikkje GTK+ ${GTK_MIN_VERSION} eller nyare allereie er installert."
+
+; Installer Finish Page
+!define PIDGIN_FINISH_VISIT_WEB_SITE		"Besk Pidgin si nettside"
+
+; Pidgin Section Prompts and Texts
+!define PIDGIN_PROMPT_CONTINUE_WITHOUT_UNINSTALL	"Klarte ikkje  avinstallera Pidgin-utgva som er i bruk. Den nye utgva kjem til  bli installert utan  ta vekk den gjeldande."
+
+; GTK+ Section Prompts
+!define GTK_INSTALL_ERROR			"Klarte ikkje  installera GTK+-kjremiljet."
+!define GTK_BAD_INSTALL_PATH			"Klarer ikkje  laga eller f tilgang til bana du skreiv."
+
+; URL Handler section
+!define URI_HANDLERS_SECTION_TITLE		"URI-referanse"
+
+; Uninstall Section Prompts
+!define un.PIDGIN_UNINSTALL_ERROR_1		"Avinstallasjonsprogrammet fann ikkje registerpostar for Pidgin.$\rTruleg har ein annan brukar installert denne applikasjonen."
+!define un.PIDGIN_UNINSTALL_ERROR_2		"Du har ikkje lyve til  kunna avinstallera denne applikasjonen."
+
+; Spellcheck Section Prompts
+!define PIDGIN_SPELLCHECK_SECTION_TITLE	"Stavekontrollhjelp"
+!define PIDGIN_SPELLCHECK_ERROR		"Klarte ikkje  installera stavekontrollen"
+!define PIDGIN_SPELLCHECK_DICT_ERROR		"Klarte ikkje  installera stavekontrollordlista"
+!define PIDGIN_SPELLCHECK_SECTION_DESCRIPTION	"Stavekontrollhjelp (treng internettsamband for  installera)."
+!define ASPELL_INSTALL_FAILED			"Installasjonen feila"
+!define PIDGIN_SPELLCHECK_BRETON		"Bretonsk"
+!define PIDGIN_SPELLCHECK_CATALAN		"Katalansk"
+!define PIDGIN_SPELLCHECK_CZECH		"Tsjekkisk"
+!define PIDGIN_SPELLCHECK_WELSH		"Walisisk"
+!define PIDGIN_SPELLCHECK_DANISH		"Dansk"
+!define PIDGIN_SPELLCHECK_GERMAN		"Tysk"
+!define PIDGIN_SPELLCHECK_GREEK		"Gresk"
+!define PIDGIN_SPELLCHECK_ENGLISH		"Engelsk"
+!define PIDGIN_SPELLCHECK_ESPERANTO		"Esperanto"
+!define PIDGIN_SPELLCHECK_SPANISH		"Spansk"
+!define PIDGIN_SPELLCHECK_FAROESE		"Frysk"
+!define PIDGIN_SPELLCHECK_FRENCH		"Fransk"
+!define PIDGIN_SPELLCHECK_ITALIAN		"Italiensk"
+!define PIDGIN_SPELLCHECK_DUTCH		"Nederlandsk"
+!define PIDGIN_SPELLCHECK_NORWEGIAN		"Norsk"
+!define PIDGIN_SPELLCHECK_POLISH		"Polsk"
+!define PIDGIN_SPELLCHECK_PORTUGUESE		"Portugisisk"
+!define PIDGIN_SPELLCHECK_ROMANIAN		"Rumensk"
+!define PIDGIN_SPELLCHECK_RUSSIAN		"Russisk"
+!define PIDGIN_SPELLCHECK_SLOVAK		"Slovakisk"
+!define PIDGIN_SPELLCHECK_SWEDISH		"Svensk"
+!define PIDGIN_SPELLCHECK_UKRAINIAN		"Ukrainsk"
+
--- a/po/ChangeLog	Tue Dec 08 07:41:37 2009 +0000
+++ b/po/ChangeLog	Tue Dec 08 07:43:03 2009 +0000
@@ -1,5 +1,9 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
+version 2.6.5
+	* Norwegian Nynorsk win32 translation added (Yngve Spjeld Landro)
+	* Russian translation updated (Антон Самохвалов)
+
 version 2.6.4
 	* Afrikaans translation updated (Friedel Wolff)
 	* Chinese (Hong Kong) translation updated (Ambrose C. Li, Paladin R. Liu)
--- a/po/ru.po	Tue Dec 08 07:41:37 2009 +0000
+++ b/po/ru.po	Tue Dec 08 07:43:03 2009 +0000
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: ru\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-29 20:30-0500\n"
+"POT-Creation-Date: 2009-12-05 19:57-0800\n"
 "PO-Revision-Date: 2008-05-14 15:00+0400\n"
 "Last-Translator: Антон Самохвалов <samant.ua@mail.ru>\n"
 "Language-Team: \n"
@@ -1540,7 +1540,7 @@
 msgstr "TinyURL для вышеуказанного: %s"
 
 msgid "Please wait while TinyURL fetches a shorter URL ..."
-msgstr ""
+msgstr "Пожалуйста, подождите пока TinyURL получает короткий адрес ..."
 
 msgid "Only create TinyURL for URLs of this length or greater"
 msgstr "Создайте TinyURL для адресов только с такой длиной или больше"
@@ -3830,6 +3830,13 @@
 msgstr ""
 "Сервер требует аутентификацию простым текстом через нешифрованный поток"
 
+#. This should never happen!
+msgid "Invalid response from server"
+msgstr "Неверный отклик от сервера"
+
+msgid "Server does not use any supported authentication method"
+msgstr "Сервер не использует ни одного поддерживаемого метода аутентификации"
+
 #, c-format
 msgid ""
 "%s requires plaintext authentication over an unencrypted connection.  Allow "
@@ -3841,25 +3848,38 @@
 msgid "Plaintext Authentication"
 msgstr "Аутентификация простым текстом"
 
-msgid "SASL authentication failed"
-msgstr "Аутентификация SASL провалилась"
-
-msgid "Invalid response from server"
-msgstr "Неверный отклик от сервера"
-
-msgid "Server does not use any supported authentication method"
-msgstr "Сервер не использует ни одного поддерживаемого метода аутентификации"
-
 msgid "You require encryption, but it is not available on this server."
 msgstr "Вы запросили шифрование, но оно недоступно на сервере."
 
 msgid "Invalid challenge from server"
 msgstr "Неверный запрос с сервера"
 
+msgid "Server thinks authentication is complete, but client does not"
+msgstr ""
+
+msgid "SASL authentication failed"
+msgstr "Аутентификация SASL провалилась"
+
 #, c-format
 msgid "SASL error: %s"
 msgstr "Ошибка SASL: %s"
 
+#, fuzzy
+msgid "Unable to canonicalize username"
+msgstr "Не удаётся настроить"
+
+#, fuzzy
+msgid "Unable to canonicalize password"
+msgstr "Не удалось открыть прослушиваемый порт."
+
+#, fuzzy
+msgid "Malicious challenge from server"
+msgstr "Неверный запрос с сервера"
+
+#, fuzzy
+msgid "Unexpected response from server"
+msgstr "Получен непредвиденный HTTP-отклик от сервера."
+
 msgid "The BOSH connection manager terminated your session."
 msgstr "Управление соединениями BOSH прервало ваш сеанс."
 
@@ -3959,13 +3979,21 @@
 msgid "Resource"
 msgstr "Ресурс"
 
+#, fuzzy
+msgid "Uptime"
+msgstr "Обновить"
+
+#, c-format
+msgid "%s"
+msgstr ""
+
+msgid "Logged Off"
+msgstr "Вышел из сети"
+
 #, c-format
 msgid "%s ago"
 msgstr "%s назад"
 
-msgid "Logged Off"
-msgstr "Вышел из сети"
-
 msgid "Middle Name"
 msgstr "Отчество"
 
@@ -5818,45 +5846,37 @@
 msgstr "Ваше текущее настроение"
 
 #. add all moods to list
-#, fuzzy
 msgid "New Mood"
-msgstr "Настроение пользователя"
-
-#, fuzzy
+msgstr "Новое настроение"
+
 msgid "Change your Mood"
-msgstr "Изменить пароль"
-
-#, fuzzy
+msgstr "Изменить ваше настроение"
+
 msgid "How do you feel right now?"
-msgstr "Прямо сейчас меня здесь нет"
-
-#, fuzzy
+msgstr "Как вы сейчас?"
+
 msgid "The PIN you entered is invalid."
-msgstr "Введённый ключ SecurID неверный."
-
-#, fuzzy
+msgstr "Введённый PIN-код неправильный."
+
 msgid "The PIN you entered has an invalid length [4-10]."
-msgstr "Введённый ключ SecurID неверный."
+msgstr "Введённый PIN-код неправильной длины [4-10]."
 
 msgid "The PIN is invalid. It should only consist of digits [0-9]."
-msgstr ""
-
-#, fuzzy
+msgstr "PIN-код неправильный. Он должен содержать только цифры [0-9]."
+
 msgid "The two PINs you entered do not match."
-msgstr "Новые пароли не совпадают."
-
-#, fuzzy
+msgstr "Два введённых PIN-кода не совпадают."
+
 msgid "The name you entered is invalid."
-msgstr "Введённый ключ SecurID неверный."
+msgstr "Введённое имя неправильное."
 
 msgid ""
 "The birthday you entered is invalid. The correct format is: 'YYYY-MM-DD'."
-msgstr ""
+msgstr "Введённая вами дата рождения неправильная. Формат такой: 'ГГГГ-ММ-ДД'."
 
 #. show error to user
-#, fuzzy
 msgid "Profile Update Error"
-msgstr "Ошибка записи"
+msgstr "Ошибка Обновления Профиля"
 
 #. no profile information yet, so we cannot update
 #. (reference: "libpurple/request.h")
@@ -5865,89 +5885,80 @@
 
 msgid "Your profile information is not yet retrieved. Please try again later."
 msgstr ""
+"Информация о вашем профиле ещё не получена. Пожалуйста, попробуйте позже."
 
 #. pin
-#, fuzzy
 msgid "PIN"
-msgstr "UIN"
+msgstr "PIN"
 
 msgid "Verify PIN"
-msgstr ""
+msgstr "Проверьте PIN"
 
 #. display name
-#, fuzzy
 msgid "Display Name"
-msgstr "Фамилия"
+msgstr "Показать имя"
 
 #. hidden
 msgid "Hide my number"
-msgstr ""
+msgstr "Скрыть мой номер"
 
 #. mobile number
-#, fuzzy
 msgid "Mobile Number"
-msgstr "Номер мобильного телефона"
-
-#, fuzzy
+msgstr "Номер мобильного"
+
 msgid "Update your Profile"
-msgstr "Профиль пользователя"
+msgstr "Обновить ваш профиль"
 
 msgid "Here you can update your MXit profile"
-msgstr ""
+msgstr "Здесь вы можете обновить ваш MXit-профиль"
 
 msgid "View Splash"
-msgstr ""
+msgstr "Показать заставку"
 
 msgid "There is no splash-screen currently available"
-msgstr ""
-
-#, fuzzy
+msgstr "Сейчас нет доступных экранов-заставок"
+
 msgid "About"
-msgstr "Обо мне"
+msgstr "Про"
 
 #. display / change mood
-#, fuzzy
 msgid "Change Mood..."
-msgstr "Изменить пароль..."
+msgstr "Изменить настроение..."
 
 #. display / change profile
-#, fuzzy
 msgid "Change Profile..."
-msgstr "Изменить пароль..."
+msgstr "Изменить профиль..."
 
 #. display splash-screen
-#, fuzzy
 msgid "View Splash..."
-msgstr "Просмотреть журнал..."
+msgstr "Показать заставку..."
 
 #. display plugin version
-#, fuzzy
 msgid "About..."
-msgstr "Обо мне"
+msgstr "О модуле..."
 
 #. the file is too big
-#, fuzzy
 msgid "The file you are trying to send is too large!"
-msgstr "Сообщение слишком велико."
+msgstr "Файл, которые вы пытаетесь отправить слишком велик!"
 
 msgid ""
 "Unable to connect to the MXit HTTP server. Please check your server settings."
 msgstr ""
-
-#, fuzzy
+"Не удаётся соединиться с сервером HTTP MXit. Пожалуйста, проверьте ваши "
+"настройки сервера."
+
 msgid "Logging In..."
-msgstr "Входит в сеть"
+msgstr "Входит в сеть..."
 
 #, fuzzy
 msgid ""
 "Unable to connect to the MXit server. Please check your server settings."
 msgstr ""
-"Не удаётся соединиться с сервером. Введите адрес сервера, с которым вы "
-"хотите соединиться."
-
-#, fuzzy
+"Не удаётся соединиться с сервером MXit. Пожалуйста, проверьте ваши настройки "
+"сервера."
+
 msgid "Connecting..."
-msgstr "Соединение"
+msgstr "Соединение..."
 
 #, fuzzy
 msgid "The nick name you entered is invalid."
@@ -5959,142 +5970,126 @@
 
 #. mxit login name
 msgid "MXit Login Name"
-msgstr ""
+msgstr "Имя входа MXit"
 
 #. nick name
-#, fuzzy
 msgid "Nick Name"
 msgstr "Псевдоним"
 
 #. show the form to the user to complete
 #, fuzzy
 msgid "Register New MXit Account"
-msgstr "Зарегистрировать новую учётную запись XMPP"
-
-#, fuzzy
+msgstr "Зарегистрировать новую учётную запись MXit"
+
 msgid "Please fill in the following fields:"
-msgstr "Заполните следующие поля"
+msgstr "Пожалуйста, заполните следующие поля:"
 
 #. no reply from the WAP site
 msgid "Error contacting the MXit WAP site. Please try again later."
-msgstr ""
+msgstr "Ошибка связи с сайтом MXit WAP. Пожалуйста, попробуйте позже."
 
 #. wapserver error
 #. server could not find the user
 msgid ""
 "MXit is currently unable to process the request. Please try again later."
-msgstr ""
+msgstr "MXit не может сейчас обработать апрос. Пожалуйста, попробуйте позже."
 
 msgid "Wrong security code entered. Please try again later."
-msgstr ""
+msgstr "Введён ошибочный код безопасности. Пожалуйста, попробуйте позже."
 
 msgid "Your session has expired. Please try again later."
-msgstr ""
+msgstr "Ваш сеанс истёк. Пожалуйста, попробуйте позже."
 
 msgid "Invalid country selected. Please try again."
-msgstr ""
+msgstr "Выбрана неправильная страна. Пожалуйста, попробуйте ещё раз."
 
 msgid "Username is not registered. Please register first."
 msgstr ""
+"Имя пользователя не зарегистрировано. Пожалуйста, сначала зарегистрируйтесь."
 
 msgid "Username is already registered. Please choose another username."
 msgstr ""
-
-#, fuzzy
+"Имя пользователя уже зарегистрировано. Пожалуйста, выберите другое имя."
+
 msgid "Internal error. Please try again later."
-msgstr "Сервер недоступен; повторите попытку позже"
+msgstr "Внутренняя ошибка. Пожалуйста, попробуйте позже."
 
 msgid "You did not enter the security code"
-msgstr ""
-
-#, fuzzy
+msgstr "Вы не ввели код безопасности"
+
 msgid "Security Code"
-msgstr "Безопасность включена"
+msgstr "Код безопасности"
 
 #. ask for input
-#, fuzzy
 msgid "Enter Security Code"
-msgstr "Введите код"
-
-#, fuzzy
+msgstr "Введите код безопасности"
+
 msgid "Your Country"
-msgstr "Страна"
-
-#, fuzzy
+msgstr "Ваша страна"
+
 msgid "Your Language"
-msgstr "Предпочитаемый язык"
+msgstr "Ваш язык"
 
 #. display the form to the user and wait for his/her input
-#, fuzzy
 msgid "MXit Authorization"
-msgstr "Требовать авторизацию"
+msgstr "Авторизация MXit"
 
 msgid "MXit account validation"
-msgstr ""
-
-#, fuzzy
+msgstr "Подтверждение учётной записи MXit"
+
 msgid "Retrieving User Information..."
-msgstr "Информация о сервере"
+msgstr "Получение информации о пользователе..."
 
 msgid "Loading menu..."
-msgstr ""
-
-#, fuzzy
+msgstr "Загрузка меню..."
+
 msgid "Status Message"
-msgstr "Отправленные сообщения"
-
-#, fuzzy
+msgstr "Сообщения состояния"
+
 msgid "Hidden Number"
-msgstr "Отчество"
-
-#, fuzzy
+msgstr "Скрытый номер"
+
 msgid "Your Mobile Number..."
-msgstr "Ввести номер мобильного телефона..."
+msgstr "Номер мобильного телефона..."
 
 #. Configuration options
 #. WAP server (reference: "libpurple/accountopt.h")
-#, fuzzy
 msgid "WAP Server"
-msgstr "Сервер"
-
-#, fuzzy
+msgstr "WAP-сервер"
+
 msgid "Connect via HTTP"
-msgstr "Соединение по TCP"
+msgstr "Соединение через HTTP"
 
 msgid "Enable splash-screen popup"
-msgstr ""
+msgstr "Включить контекстное меню экрана-заставки"
 
 #. we must have lost the connection, so terminate it so that we can reconnect
 msgid "We have lost the connection to MXit. Please reconnect."
-msgstr ""
+msgstr "Мы потеряли соединение с MXit. Пожалуйста, пересоединитесь."
 
 #. packet could not be queued for transmission
-#, fuzzy
 msgid "Message Send Error"
-msgstr "Ошибка сообщения XMPP"
-
-#, fuzzy
+msgstr "Ошибка отправки сообщения"
+
 msgid "Unable to process your request at this time"
-msgstr "Не удаётся соединиться с сервером."
+msgstr "Не удаётся сейчас обработать ваш запрос"
 
 msgid "Timeout while waiting for a response from the MXit server."
-msgstr ""
-
-#, fuzzy
+msgstr "Истекло время во время ожидания ответа от сервера MXit."
+
 msgid "Successfully Logged In..."
-msgstr "Успешно подсоединён Qun"
+msgstr "Успешно вошёл в сеть..."
 
 #, fuzzy, c-format
 msgid ""
 "%s sent you an encrypted message, but it is not supported on this client."
 msgstr "%s послал вам приглашение к веб-камере, которое ещё не поддерживается."
 
-#, fuzzy
 msgid "Message Error"
-msgstr "Ошибка сообщения XMPP"
+msgstr "Сообщение об ошибке"
 
 msgid "Cannot perform redirect using the specified protocol"
-msgstr ""
+msgstr "Не могу осуществить перенаправление используя указанный протокол"
 
 #, fuzzy
 msgid "An internal MXit server error occurred."
@@ -6158,53 +6153,52 @@
 
 #. bad packet
 msgid "Invalid packet received from MXit."
-msgstr ""
+msgstr "Получен неправильный пакет от MXit."
 
 #. connection error
 msgid "A connection error occurred to MXit. (read stage 0x01)"
-msgstr ""
+msgstr "Возникла ошибка соединения с MXit. (этап чтения 0x01)"
 
 #. connection closed
 msgid "A connection error occurred to MXit. (read stage 0x02)"
-msgstr ""
+msgstr "Возникла ошибка соединения с MXit. (этап чтения 0x02)"
 
 msgid "A connection error occurred to MXit. (read stage 0x03)"
-msgstr ""
+msgstr "Возникла ошибка соединения с MXit. (этап чтения 0x03)"
 
 #. malformed packet length record (too long)
 msgid "A connection error occurred to MXit. (read stage 0x04)"
-msgstr ""
+msgstr "Возникла ошибка соединения с MXit. (этап чтения 0x04)"
 
 #. connection error
 msgid "A connection error occurred to MXit. (read stage 0x05)"
-msgstr ""
+msgstr "Возникла ошибка соединения с MXit. (этап чтения 0x05)"
 
 #. connection closed
 msgid "A connection error occurred to MXit. (read stage 0x06)"
-msgstr ""
+msgstr "Возникла ошибка соединения с MXit. (этап чтения 0x06)"
 
 #, fuzzy
 msgid "Pending"
-msgstr "Отправка"
+msgstr "Рассмотрение"
 
 #, fuzzy
 msgid "Invited"
-msgstr "Пригласить"
+msgstr "Приглашено"
 
 #, fuzzy
 msgid "Rejected"
-msgstr "Отвергнуть"
+msgstr "Отклонено"
 
 #, fuzzy
 msgid "Deleted"
-msgstr "Удалить"
+msgstr "Удалено"
 
 msgid "MXit Advertising"
-msgstr ""
-
-#, fuzzy
+msgstr "Реклама MXit"
+
 msgid "More Information"
-msgstr "Информация о работе"
+msgstr "Больше информации"
 
 #, c-format
 msgid "No such user: %s"
@@ -13354,20 +13348,17 @@
 "Выберите тему смайликов, которую вы хотели бы использовать. Новые темы могут "
 "быть установлены перетаскиванием их в список тем."
 
-#, fuzzy
 msgid "Buddy List Theme:"
-msgstr "Тема Списка собеседников"
-
-#, fuzzy
+msgstr "Тема Списка собеседников:"
+
 msgid "Status Icon Theme:"
-msgstr "Статус для %s"
+msgstr "Тема значков состояния:"
 
 msgid "Sound Theme:"
-msgstr ""
-
-#, fuzzy
+msgstr "Звуковая тема:"
+
 msgid "Smiley Theme:"
-msgstr "Темы смайликов"
+msgstr "Тема смайликов:"
 
 msgid "Keyboard Shortcuts"
 msgstr "Горячие клавиши"
@@ -13385,9 +13376,8 @@
 msgid "On unread messages"
 msgstr "При наличии непрочитанных сообщений"
 
-#, fuzzy
 msgid "Conversation Window"
-msgstr "Окна бесед"
+msgstr "Окно беседы"
 
 msgid "_Hide new IM conversations:"
 msgstr "_Скрывать новые беседы:"
@@ -13481,21 +13471,18 @@
 msgid "Cannot start proxy configuration program."
 msgstr "Не могу запустить программу настройки прокси."
 
-#, fuzzy
 msgid "Cannot start browser configuration program."
 msgstr "Не могу запустить программу настройки веб-проводника."
 
-#, fuzzy
 msgid "Disabled"
 msgstr "Отключено"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Use _automatically detected IP address: %s"
-msgstr "Использовать _автоматически обнаруженный IP-адрес: %s"
-
-#, fuzzy
+msgstr "И_спользовать автоматически определённый IP-адрес: %s"
+
 msgid "ST_UN server:"
-msgstr "ST_UN сервер:"
+msgstr "_STUN сервер:"
 
 msgid "<span style=\"italic\">Example: stunserver.org</span>"
 msgstr "<span style=\"italic\">Пример: stunserver.org</span>"
@@ -13519,7 +13506,7 @@
 
 #, fuzzy
 msgid "_End:"
-msgstr "Р_азвернуть"
+msgstr "Коне_ц:"
 
 #. TURN server
 msgid "Relay Server (TURN)"
@@ -13527,15 +13514,15 @@
 
 #, fuzzy
 msgid "_TURN server:"
-msgstr "ST_UN-сервер:"
+msgstr "_TURN-сервер:"
 
 #, fuzzy
 msgid "Use_rname:"
-msgstr "Имя пользователя:"
+msgstr "Им_я пользователя:"
 
 #, fuzzy
 msgid "Pass_word:"
-msgstr "Пароль:"
+msgstr "Паро_ль:"
 
 msgid "Seamonkey"
 msgstr "Seamonkey"