changeset 30502:92767d9eac2e

merge of '4f95778269e5a6f5dc65dc999e28f67e5604b35a' and 'fb76a1cdbe11d4297b67af0a12356362323f60c5'
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Fri, 21 May 2010 21:57:18 +0000
parents ee423c6c71b6 (current diff) c940e427e486 (diff)
children c80d5cf9d88e 66e7fe9f7810
files ChangeLog
diffstat 20 files changed, 250 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri May 21 07:45:11 2010 +0000
+++ b/ChangeLog	Fri May 21 21:57:18 2010 +0000
@@ -20,6 +20,10 @@
 	* Support for direct connections, enabling faster file transfers,
 	  smiley and buddy icon loading.  (Gábor Szuromi)
 
+	XMPP:
+	* Allow connecting to servers that advertise EXTERNAL (broken in
+	  2.7.0)
+
 version 2.7.0 (05/12/2010):
 	General:
 	* Changed GTK+ minimum version requirement to 2.10.0.
--- a/libpurple/protocols/jabber/auth_cyrus.c	Fri May 21 07:45:11 2010 +0000
+++ b/libpurple/protocols/jabber/auth_cyrus.c	Fri May 21 21:57:18 2010 +0000
@@ -270,7 +270,7 @@
 					 */
 					js->auth_mech = NULL;
 					jabber_auth_start_old(js);
-					return JABBER_SASL_STATE_CONTINUE;					
+					return JABBER_SASL_STATE_CONTINUE;
 				}
 
 				break;
@@ -408,7 +408,8 @@
 	{
 		char *mech_name = xmlnode_get_data(mechnode);
 
-		if (!mech_name || !*mech_name) {
+		if (!mech_name || !*mech_name ||
+				g_str_equal(mech_name, "EXTERNAL")) {
 			g_free(mech_name);
 			continue;
 		}
@@ -550,7 +551,7 @@
 
 			return jabber_auth_start_cyrus(js, reply, error);
 
-		} else if ((js->auth_fail_count == 1) && 
+		} else if ((js->auth_fail_count == 1) &&
 				   (js->current_mech && g_str_equal(js->current_mech, "GSSAPI"))) {
 			/* If we tried GSSAPI first, it failed, and it was the only method we had to try, try jabber:iq:auth
 			 * for compatibility with iChat 10.5 Server and other jabberd based servers.
--- a/libpurple/protocols/jabber/auth_scram.c	Fri May 21 07:45:11 2010 +0000
+++ b/libpurple/protocols/jabber/auth_scram.c	Fri May 21 21:57:18 2010 +0000
@@ -517,13 +517,24 @@
 	gsize len;
 
 	enc_in = xmlnode_get_data(packet);
-	g_return_val_if_fail(enc_in != NULL && *enc_in != '\0', FALSE);
+	if (data->step != 3 && (!enc_in || *enc_in == '\0')) {
+		*error = g_strdup(_("Invalid challenge from server"));
+		g_free(enc_in);
+		return JABBER_SASL_STATE_FAIL;
+	}
 
-	if (data->step == 3)
+	if (data->step == 3) {
+		/*
+		 * If the server took the slow approach (sending the verifier
+		 * as a challenge/response pair), we get here.
+		 */
+		g_free(enc_in);
 		return JABBER_SASL_STATE_OK;
+	}
 
 	if (data->step != 2) {
 		*error = g_strdup(_("Unexpected response from server"));
+		g_free(enc_in);
 		return JABBER_SASL_STATE_FAIL;
 	}
 
@@ -532,7 +543,7 @@
 	if (!dec_in || len != strlen(dec_in)) {
 		/* Danger afoot; SCRAM shouldn't contain NUL bytes */
 		g_free(dec_in);
-		*error = g_strdup(_("Invalid challenge from server"));
+		*error = g_strdup(_("Malicious challenge from server"));
 		return JABBER_SASL_STATE_FAIL;
 	}
 
--- a/libpurple/protocols/mxit/actions.c	Fri May 21 07:45:11 2010 +0000
+++ b/libpurple/protocols/mxit/actions.c	Fri May 21 21:57:18 2010 +0000
@@ -225,6 +225,13 @@
 	group = purple_request_field_group_new( NULL );
 	purple_request_fields_add_group( fields, group );
 
+	/* mxitId (read-only) */
+	if ( session->mxitId ) {
+		field = purple_request_field_string_new( "mxitid", _( "Your MXitId" ), session->mxitId, FALSE );
+		purple_request_field_string_set_editable( field, FALSE );
+		purple_request_field_group_add_field( group, field );
+	}
+
 	/* pin */
 	field = purple_request_field_string_new( "pin", _( "PIN" ), session->acc->password, FALSE );
 	purple_request_field_string_set_masked( field, TRUE );
@@ -252,7 +259,7 @@
 	purple_request_field_group_add_field( group, field );
 
 	/* title */
-	field = purple_request_field_string_new( "title", _( "Job Title" ), profile->title, FALSE );
+	field = purple_request_field_string_new( "title", _( "Title" ), profile->title, FALSE );
 	purple_request_field_group_add_field( group, field );
 
 	/* first name */
@@ -304,11 +311,12 @@
 	char	version[256];
 
 	g_snprintf( version, sizeof( version ), "MXit libPurple Plugin v%s\n"
-											"MXit Client Protocol v%s\n\n"
+											"MXit Client Protocol v%i.%i\n\n"
 											"Author:\nPieter Loubser\n\n"
 											"Contributors:\nAndrew Victor\n\n"
 											"Testers:\nBraeme Le Roux\n\n",
-											MXIT_PLUGIN_VERSION, MXIT_CP_RELEASE );
+											MXIT_PLUGIN_VERSION,
+											( MXIT_CP_PROTO_VESION / 10 ), ( MXIT_CP_PROTO_VESION % 10 ) );
 
 	mxit_popup( PURPLE_NOTIFY_MSG_INFO, _( "About" ), version );
 }
--- a/libpurple/protocols/mxit/formcmds.c	Fri May 21 07:45:11 2010 +0000
+++ b/libpurple/protocols/mxit/formcmds.c	Fri May 21 21:57:18 2010 +0000
@@ -42,7 +42,7 @@
 typedef enum
 {
 	MXIT_CMD_UNKNOWN = 0,		/* Unknown command */
-	MXIT_CMD_CLRSCR,			/* Clear screen (clrmsgscreen) */
+	MXIT_CMD_CLEAR,				/* Clear (clear) */
 	MXIT_CMD_SENDSMS,			/* Send SMS (sendsms) */
 	MXIT_CMD_REPLY,				/* Reply (reply) */
 	MXIT_CMD_PLATREQ,			/* Platform Request (platreq) */
@@ -138,8 +138,8 @@
 			type = g_hash_table_lookup(hash, "type");
 			if (type == NULL)								/* no command provided */
 				return MXIT_CMD_UNKNOWN;
-			else if (strcmp(type, "clrmsgscreen") == 0)		/* clear the screen */
-				return MXIT_CMD_CLRSCR;
+			else if (strcmp(type, "clear") == 0)			/* clear */
+				return MXIT_CMD_CLEAR;
 			else if (strcmp(type, "sendsms") == 0)			/* send an SMS */
 				return MXIT_CMD_SENDSMS;
 			else if (strcmp(type, "reply") == 0)			/* list of options */
@@ -205,27 +205,38 @@
 
 
 /*------------------------------------------------------------------------
- * Process a ClearScreen MXit command.
+ * Process a Clear MXit command.
+ *  [::op=cmd|type=clear|clearmsgscreen=true|auto=true|id=12345:]
  *
- *  @param session			The MXit session object
- *  @param from				The sender of the message.
+ *  @param session		The MXit session object
+ *  @param from			The sender of the message.
+ *  @param hash			The MXit command <key,value> map
  */
-static void command_clearscreen(struct MXitSession* session, const char* from)
+static void command_clear(struct MXitSession* session, const char* from, GHashTable* hash)
 {
 	PurpleConversation *conv;
+	char* clearmsgscreen;
 
-    conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, from, session->acc);
-    if (conv == NULL) {
-        purple_debug_error(MXIT_PLUGIN_ID, _( "Conversation with '%s' not found\n" ), from);
-        return;
-    }
+	conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, from, session->acc);
+	if (conv == NULL) {
+		purple_debug_error(MXIT_PLUGIN_ID, _( "Conversation with '%s' not found\n" ), from);
+		return;
+	}
 
-	purple_conversation_clear_message_history(conv);			// TODO: This doesn't actually clear the screen.
+	clearmsgscreen = g_hash_table_lookup(hash, "clearmsgscreen");
+	if ( (clearmsgscreen) && (strcmp(clearmsgscreen, "true") == 0) ) {
+		/* this is a command to clear the chat screen */
+		purple_debug_info(MXIT_PLUGIN_ID, "Clear the screen\n");
+
+		purple_conversation_clear_message_history(conv);			// TODO: This doesn't actually clear the screen.
+	}
 }
 
 
 /*------------------------------------------------------------------------
  * Process a Reply MXit command.
+ *  [::op=cmd|type=reply|replymsg=back|selmsg=b) Back|id=12345:]
+ *  [::op=cmd|nm=rep|type=reply|replymsg=back|selmsg=b) Back|id=12345:]
  *
  *  @param mx			The received message data object
  *  @param hash			The MXit command <key,value> map
@@ -234,10 +245,21 @@
 {
 	char* replymsg;
 	char* selmsg;
+	char* nm;
 
 	selmsg = g_hash_table_lookup(hash, "selmsg");			/* find the selection message */
 	replymsg = g_hash_table_lookup(hash, "replymsg");		/* find the reply message */
-	if ((selmsg) && (replymsg)) {
+	nm = g_hash_table_lookup(hash, "nm");					/* name parameter */
+	if ((selmsg) && (replymsg) && (nm)) {
+		gchar*	seltext = g_markup_escape_text(purple_url_decode(selmsg), -1);
+		gchar*	replycmd = g_strdup_printf("::type=reply|nm=%s|res=%s|err=0:", nm, replymsg);
+
+		mxit_add_html_link( mx, replycmd, seltext );
+
+		g_free(seltext);
+		g_free(replycmd);
+	}
+	else if ((selmsg) && (replymsg)) {
 		gchar*	seltext = g_markup_escape_text(purple_url_decode(selmsg), -1);
 
 		mxit_add_html_link( mx, purple_url_decode(replymsg), seltext );
@@ -366,8 +388,8 @@
 			MXitCommandType type = command_type(hash);
 
 			switch (type) {
-				case MXIT_CMD_CLRSCR :
-					command_clearscreen(mx->session, mx->from);
+				case MXIT_CMD_CLEAR :
+					command_clear(mx->session, mx->from, hash);
 					break;
 				case MXIT_CMD_REPLY :
 					command_reply(mx, hash);
--- a/libpurple/protocols/mxit/mxit.c	Fri May 21 07:45:11 2010 +0000
+++ b/libpurple/protocols/mxit/mxit.c	Fri May 21 21:57:18 2010 +0000
@@ -92,8 +92,8 @@
 		goto skip;
 	con = purple_account_get_connection( account );
 
-//	/* determine if it's a command-response to send */
-//	is_command = g_str_has_prefix( parts[4], "::type=reply|" );
+	/* determine if it's a command-response to send */
+	is_command = g_str_has_prefix( parts[4], "::type=reply|" );
 
 	/* send click message back to MXit */
 	mxit_send_message( con->proto_data, parts[3], parts[4], FALSE, is_command );
@@ -352,6 +352,10 @@
 	if ( contact->subtype != 0 )
 		purple_notify_user_info_add_pair( info, _( "Subscription" ), mxit_convert_subtype_to_name( contact->subtype ) );
 
+	/* rejection message */
+	if ( ( contact->subtype == MXIT_SUBTYPE_REJECTED ) && ( contact->msg != NULL ) )
+		purple_notify_user_info_add_pair( info, _( "Rejection Message" ), contact->msg );
+
 	/* hidden number */
 	if ( contact->flags & MXIT_CFLAG_HIDDEN )
 		purple_notify_user_info_add_pair( info, _( "Hidden Number" ), _( "Yes" ) );
@@ -491,6 +495,8 @@
 			g_free( contact->statusMsg );
 		if ( contact->avatarId )
 			g_free( contact->avatarId );
+		if ( contact->msg )
+			g_free( contact->msg );
 		g_free( contact );
 	}
 
@@ -552,8 +558,8 @@
 static void mxit_get_info( PurpleConnection *gc, const char *who )
 {
 	struct MXitSession*		session			= (struct MXitSession*) gc->proto_data;
-	const char*				profilelist[]	= { CP_PROFILE_BIRTHDATE, CP_PROFILE_GENDER, CP_PROFILE_HIDENUMBER, CP_PROFILE_FULLNAME,
-												CP_PROFILE_TITLE, CP_PROFILE_FIRSTNAME, CP_PROFILE_LASTNAME, CP_PROFILE_EMAIL };
+	const char*				profilelist[]	= { CP_PROFILE_BIRTHDATE, CP_PROFILE_GENDER, CP_PROFILE_FULLNAME,
+												CP_PROFILE_FIRSTNAME, CP_PROFILE_LASTNAME, CP_PROFILE_REGCOUNTRY };
 
 	purple_debug_info( MXIT_PLUGIN_ID, "mxit_get_info: '%s'\n", who );
 
--- a/libpurple/protocols/mxit/mxit.h	Fri May 21 07:45:11 2010 +0000
+++ b/libpurple/protocols/mxit/mxit.h	Fri May 21 21:57:18 2010 +0000
@@ -63,7 +63,7 @@
 /* Plugin details */
 #define		MXIT_PLUGIN_ID				"prpl-loubserp-mxit"
 #define		MXIT_PLUGIN_NAME			"MXit"
-#define		MXIT_PLUGIN_VERSION			"2.3.0"
+#define		MXIT_PLUGIN_VERSION			"2.4.0"
 #define		MXIT_PLUGIN_EMAIL			"Pieter Loubser <libpurple@mxit.com>"
 #define		MXIT_PLUGIN_WWW				"http://www.mxit.com"
 #define		MXIT_PLUGIN_SUMMARY			"MXit Protocol Plugin"
@@ -151,6 +151,7 @@
 
 	/* personal (profile) */
 	struct MXitProfile*	profile;					/* user's profile information */
+	char*				mxitId;						/* the user's MXitId */
 
 	/* libpurple */
 	PurpleAccount*		acc;						/* pointer to the libpurple internal account struct */
--- a/libpurple/protocols/mxit/profile.c	Fri May 21 07:45:11 2010 +0000
+++ b/libpurple/protocols/mxit/profile.c	Fri May 21 21:57:18 2010 +0000
@@ -123,15 +123,14 @@
 	purple_notify_user_info_add_pair( info, _( "Nick Name" ), profile->nickname );
 	purple_notify_user_info_add_pair( info, _( "Birthday" ), profile->birthday );
 	purple_notify_user_info_add_pair( info, _( "Gender" ), profile->male ? _( "Male" ) : _( "Female" ) );
-	purple_notify_user_info_add_pair( info, _( "Hidden Number" ), profile->hidden ? _( "Yes" ) : _( "No" ) );
-
-	purple_notify_user_info_add_section_break( info );
+//	purple_notify_user_info_add_pair( info, _( "Hidden Number" ), profile->hidden ? _( "Yes" ) : _( "No" ) );
 
 	/* optional information */
-	purple_notify_user_info_add_pair( info, _( "Job Title" ), profile->title );
+//	purple_notify_user_info_add_pair( info, _( "Title" ), profile->title );
 	purple_notify_user_info_add_pair( info, _( "First Name" ), profile->firstname );
 	purple_notify_user_info_add_pair( info, _( "Last Name" ), profile->lastname );
-	purple_notify_user_info_add_pair( info, _( "Email" ), profile->email );
+//	purple_notify_user_info_add_pair( info, _( "Email" ), profile->email );
+	purple_notify_user_info_add_pair( info, _( "Country" ), profile->regcountry );
 
 	purple_notify_user_info_add_section_break( info );
 
@@ -151,6 +150,10 @@
 
 		/* subscription type */
 		purple_notify_user_info_add_pair( info, _( "Subscription" ), mxit_convert_subtype_to_name( contact->subtype ) );
+
+		/* hidden number */
+		purple_notify_user_info_add_pair( info, _( "Hidden Number" ), ( contact->flags & MXIT_CFLAG_HIDDEN ) ? _( "Yes" ) : _( "No" ) );
+
 	}
 
 	purple_notify_userinfo( session->con, username, info, NULL, NULL );
--- a/libpurple/protocols/mxit/profile.h	Fri May 21 07:45:11 2010 +0000
+++ b/libpurple/protocols/mxit/profile.h	Fri May 21 21:57:18 2010 +0000
@@ -43,6 +43,7 @@
 	char		lastname[64];						/* user's last name (aka 'surname') */
 	char		email[64];							/* user's email address */
 	char		mobilenr[21];						/* user's mobile number */
+	char		regcountry[3];						/* user's registered country code */
 
 	gboolean	hidden;								/* set if the user's msisdn should remain hidden */
 };
--- a/libpurple/protocols/mxit/protocol.c	Fri May 21 07:45:11 2010 +0000
+++ b/libpurple/protocols/mxit/protocol.c	Fri May 21 21:57:18 2010 +0000
@@ -672,10 +672,12 @@
 	/* convert the packet to a byte stream */
 	datalen = sprintf( data,	"ms=%s%c%s%c%i%c"			/* "ms"=password\1version\1getContacts\1 */
 								"%s%c%s%c%i%c"				/* capabilities\1dc\1features\1 */
-								"%s%c%s",					/* dialingcode\1locale */
+								"%s%c%s%c"					/* dialingcode\1locale\1 */
+								"%i%c%i%c%i",				/* maxReplyLen\1protocolVer\1lastRosterUpdate */
 								session->encpwd, CP_FLD_TERM, MXIT_CP_VERSION, CP_FLD_TERM, 1, CP_FLD_TERM,
 								MXIT_CP_CAP, CP_FLD_TERM, session->distcode, CP_FLD_TERM, MXIT_CP_FEATURES, CP_FLD_TERM,
-								session->dialcode, CP_FLD_TERM, locale
+								session->dialcode, CP_FLD_TERM, locale, CP_FLD_TERM,
+								CP_MAX_FILESIZE, CP_FLD_TERM, MXIT_CP_PROTO_VESION, CP_FLD_TERM, 0
 	);
 
 	/* include "custom resource" information */
@@ -1300,6 +1302,10 @@
 		session->http_sesid = atoi( records[0]->fields[0]->data );
 	}
 
+	/* extract MXitId (from protocol 5.9) */
+	if ( records[1]->fcount >= 9 )
+		session->mxitId = g_strdup( records[1]->fields[8]->data );
+
 	/* display the current splash-screen */
 	if ( splash_popup_enabled( session ) )
 		splash_display( session );
@@ -1513,10 +1519,14 @@
 		contact->mood = atoi( rec->fields[5]->data );
 
 		if ( rec->fcount > 6 ) {
-			/* added in protocol 5.9.0 - flags & subtype */
+			/* added in protocol 5.9 - flags & subtype */
 			contact->flags = atoi( rec->fields[6]->data );
 			contact->subtype = rec->fields[7]->data[0];
 		}
+		if ( rec->fcount > 8 ) {
+			/* added in protocol 6.0 - reject message */
+			contact->msg = g_strdup( rec->fields[8]->data );
+		}
 
 		/* add the contact to the buddy list */
 		if ( contact-> type == MXIT_TYPE_MULTIMX )			/* contact is a MultiMX room */
@@ -1582,7 +1592,16 @@
 
 	purple_debug_info( MXIT_PLUGIN_ID, "mxit_parse_cmd_extprofile: profile for '%s'\n", mxitId );
 
-	profile = g_new0( struct MXitProfile, 1 );
+	if ( records[0]->fields[0]->len == 0 ) {
+		/* no MXitId provided, so this must be our own profile information */
+		if ( session->profile == NULL )
+			session->profile = g_new0( struct MXitProfile, 1 );
+		profile = session->profile;
+	}
+	else {
+		/* is a buddy's profile */
+		profile = g_new0( struct MXitProfile, 1 );
+	}
 
 	/* set the count for attributes */
 	count = atoi( records[0]->fields[1]->data );
@@ -1647,23 +1666,19 @@
 			/* mobile number */
 			g_strlcpy( profile->mobilenr, fvalue, sizeof( profile->mobilenr ) );
 		}
+		else if ( strcmp( CP_PROFILE_REGCOUNTRY, fname ) == 0 ) {
+			/* registered country */
+			g_strlcpy( profile->regcountry, fvalue, sizeof( profile->regcountry ) );
+		}
 		else {
 			/* invalid profile attribute */
 			purple_debug_error( MXIT_PLUGIN_ID, "Invalid profile attribute received '%s' \n", fname );
 		}
 	}
 
-	if ( records[0]->fields[0]->len == 0 ) {
-		/* no MXit id provided, so this must be our own profile information */
-		if ( session->profile )
-			g_free( session->profile );
-		session->profile = profile;
-	}
-	else {
-		/* display other user's profile */
+	/* if this is not our profile, just display it */
+	if ( profile != session->profile ) {
 		mxit_show_profile( session, mxitId, profile );
-
-		/* cleanup */
 		g_free( profile );
 	}
 }
@@ -2472,6 +2487,8 @@
 	mxit_free_emoticon_cache( session );
 
 	/* free allocated memory */
+	if ( session->mxitId )
+		g_free( session->mxitId );
 	g_free( session->encpwd );
 	session->encpwd = NULL;
 
--- a/libpurple/protocols/mxit/protocol.h	Fri May 21 07:45:11 2010 +0000
+++ b/libpurple/protocols/mxit/protocol.h	Fri May 21 21:57:18 2010 +0000
@@ -85,11 +85,12 @@
 
 /* MXit client version */
 #define		MXIT_CP_DISTCODE		"P"						/* client distribution code (magic, do not touch!) */
-#define		MXIT_CP_RELEASE			"5.9.0"					/* client protocol release version supported */
+#define		MXIT_CP_RELEASE			"5.9.0"					/* client version */
 #define		MXIT_CP_ARCH			"Y"						/* client architecture series (Y not for Yoda but for PC-client) */
 #define		MXIT_CLIENT_ID			"LP"					/* client ID as specified by MXit */
 #define		MXIT_CP_PLATFORM		"PURPLE"				/* client platform */
 #define		MXIT_CP_VERSION			MXIT_CP_DISTCODE"-"MXIT_CP_RELEASE"-"MXIT_CP_ARCH"-"MXIT_CP_PLATFORM
+#define		MXIT_CP_PROTO_VESION	60						/* client protocol version */
 
 /* set operating system name */
 #if defined( __APPLE__ )
@@ -188,6 +189,7 @@
 #define		CP_PROFILE_LASTNAME		"lastname"				/* Last name (UTF8 String) */
 #define		CP_PROFILE_EMAIL		"email"					/* Email address (UTF8 String) */
 #define		CP_PROFILE_MOBILENR		"mobilenumber"			/* Mobile Number (UTF8 String) */
+#define		CP_PROFILE_REGCOUNTRY	"registeredcountry"		/* Registered Country Code (UTF8 String) */
 
 /* extended profile field types */
 #define		CP_PROF_TYPE_BOOL		0x02					/* boolean profile attribute type */
--- a/libpurple/protocols/mxit/roster.h	Fri May 21 07:45:11 2010 +0000
+++ b/libpurple/protocols/mxit/roster.h	Fri May 21 21:57:18 2010 +0000
@@ -105,7 +105,7 @@
 	short		presence;							/* presence state */
 	short		subtype;							/* subscription type */
 
-	char*		msg;								/* invite message */
+	char*		msg;								/* invite/rejection message */
 
 	char		customMood[16];						/* custom mood */
 	char*		statusMsg;							/* status message */
--- a/pidgin/Makefile.am	Fri May 21 07:45:11 2010 +0000
+++ b/pidgin/Makefile.am	Fri May 21 21:57:18 2010 +0000
@@ -22,6 +22,7 @@
 		win32/wspell.c \
 		win32/wspell.h \
 		win32/nsis/generate_gtk_zip.sh \
+		win32/nsis/rpm2zip.sh \
 		win32/nsis/pixmaps/pidgin-header.bmp \
 		win32/nsis/pixmaps/pidgin-intro.bmp \
 		win32/nsis/pixmaps/pidgin-install.ico \
--- a/pidgin/pixmaps/emotes/default/24/Makefile.am	Fri May 21 07:45:11 2010 +0000
+++ b/pidgin/pixmaps/emotes/default/24/Makefile.am	Fri May 21 21:57:18 2010 +0000
@@ -27,6 +27,7 @@
     car.png \
     cat.png \
     chicken.png \
+    chilli.png \
     cigarette.png \
     clap.png \
     clock.png \
@@ -109,6 +110,7 @@
     moneymouth.png \
     monkey.png \
     moon.png \
+    mrgreen.png \
     msn-away.png \
     msn-busy.png \
     msn_online.png \
Binary file pidgin/pixmaps/emotes/default/24/chilli.png has changed
--- a/pidgin/pixmaps/emotes/default/24/default.theme.in	Fri May 21 07:45:11 2010 +0000
+++ b/pidgin/pixmaps/emotes/default/24/default.theme.in	Fri May 21 21:57:18 2010 +0000
@@ -451,3 +451,41 @@
 ! monkey.png        :-(|)   :(|)    8-|)
 ! cyclops.png       O-)     o-)
 
+
+# MXit standard emoticons
+[MXit]
+happy.png           :-)     :)
+sad.png             :-(     :(
+wink.png            ;-)     ;)
+excited.png         :-D     :D     :->      :>
+neutral.png         :-|     :|
+shock.png           :-O     :O
+tongue.png          :-P     :P
+embarrassed.png     :-$     :$
+glasses-cool.png    8-)
+in_love.png         (H)
+rose.png            (F)
+### Added in v3.0
+boy.png             (m)
+girl.png            (f)
+star.png            (*)
+chilli.png          (c)
+kiss.png            (x)
+lamp.png            (i)
+pissed-off.png      :e      :-e
+shut-mouth.png      :-x     :x
+thunder.png         (z)
+coffee.png          (U)
+mrgreen.png         (G)
+### Added in v5.0
+sick.png            :o(
+excruciating.png    :-{     :{
+amorous.png         :-}     :}
+eyeroll.png         8-o     8o
+crying.png          :'(
+thinking.png        :-?     :?
+drool.png           :-~     :~
+sleeping.png        :-z     :z
+lying.png           :L)
+glasses-nerdy.png   8-|     8|
+pirate.png          P-)
Binary file pidgin/pixmaps/emotes/default/24/mrgreen.png has changed
--- a/pidgin/win32/nsis/generate_gtk_zip.sh	Fri May 21 07:45:11 2010 +0000
+++ b/pidgin/win32/nsis/generate_gtk_zip.sh	Fri May 21 21:57:18 2010 +0000
@@ -3,8 +3,8 @@
 
 PIDGIN_BASE=$1
 
-if [ ! -e $PIDGIN_BASE/ChangeLog.win32 ]; then
-	echo `basename $0` must must have the pidgin base dir specified as a parameter.
+if [ ! -e $PIDGIN_BASE/ChangeLog ]; then
+	echo $(basename $0) must must have the pidgin base dir specified as a parameter.
 	exit 1
 fi
 
@@ -42,12 +42,18 @@
 function download_and_extract {
 	URL=${1%%\ *}
 	NAME=${1#*\ }
-	FILE=`basename $URL`
+	FILE=$(basename $URL)
 	if [ ! -e $FILE ]; then
 		echo Downloading $NAME
-		wget $URL
+		wget $URL || return 1
 	fi
-	unzip -q $FILE -d $INSTALL_DIR
+	EXTENSION=${FILE##*.}
+	#This is an OpenSuSE build service RPM
+	if [ $EXTENSION == 'rpm' ]; then
+		echo "Generating zip from $FILE"
+		FILE=$(../rpm2zip.sh $FILE)
+	fi
+	unzip -q $FILE -d $INSTALL_DIR || exit 1
 	echo "$NAME" >> $CONTENTS_FILE
 }
 
@@ -63,9 +69,9 @@
 #Blow away translations that we don't have in Pidgin
 for LOCALE_DIR in $INSTALL_DIR/share/locale/*
 do
-	LOCALE=`basename $LOCALE_DIR`
+	LOCALE=$(basename $LOCALE_DIR)
 	if [ ! -e $PIDGIN_BASE/po/$LOCALE.po ]; then
-		echo Remove $LOCALE translation as it is missing from Pidgin
+		echo Removing $LOCALE translation as it is missing from Pidgin
 		rm -r $LOCALE_DIR
 	fi
 done
@@ -73,3 +79,5 @@
 #Generate zip file to be included in installer
 zip -9 -r ../gtk-runtime-$BUNDLE_VERSION.zip Gtk
 
+exit 0
+
--- a/pidgin/win32/nsis/nsis_translations.desktop.in	Fri May 21 07:45:11 2010 +0000
+++ b/pidgin/win32/nsis/nsis_translations.desktop.in	Fri May 21 21:57:18 2010 +0000
@@ -29,6 +29,8 @@
 _PIDGINDESKTOPSHORTCUTDESC=Create a shortcut to Pidgin on the Desktop
 #Installer Subsection Detailed Description
 _PIDGINSTARTMENUSHORTCUTDESC=Create a Start Menu entry for Pidgin
+#Installer Subsection Detailed Description
+_GTKSECTIONDESCRIPTION=A multi-platform GUI toolkit, used by Pidgin
 #Installer Subsection Text
 _DEBUGSYMBOLSSECTIONTITLE=Debug Symbols (for reporting crashes)
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/win32/nsis/rpm2zip.sh	Fri May 21 21:57:18 2010 +0000
@@ -0,0 +1,65 @@
+#!/bin/sh
+
+here=`pwd`
+for F in $*; do
+    case $F in
+        mingw32-*.noarch.rpm|mingw64-*.noarch.rpm|*/mingw32-*.noarch.rpm|*/mingw64-*.noarch.rpm)
+        package=`rpm -qp $F 2>/dev/null`
+        case $package in
+            mingw32-*|mingw64-*)
+            case $package in
+                mingw32-*)
+                cpu=i686
+                bits=32
+                ;;
+                mingw64-*)
+                cpu=x86_64
+                bits=64
+                ;;
+            esac
+            origname=`rpm -qp --queryformat='%{NAME}'  $F 2>/dev/null`
+            name=$origname
+            case $name in
+                *-devel)
+                name=${name%el}
+                ;;
+            esac
+            shortpackage="$name"_`rpm -qp --queryformat='%{VERSION}-%{RELEASE}'_win${bits} $F 2>/dev/null`
+            shortpackage=${shortpackage#mingw32-}
+            shortpackage=${shortpackage#mingw64-}
+            shortname=$name
+            shortname=${shortname#mingw32-}
+            shortname=${shortname#mingw64-}
+            tmp=`mktemp -d`
+            #rpm2cpio $F | lzcat | (cd $tmp && cpio --quiet -id)
+            rpm2cpio $F |  (cd $tmp && cpio --quiet -id)
+            (
+                cd $tmp
+                zipfile="$here/$shortpackage.zip"
+                rm -f $zipfile
+                (cd usr/${cpu}-pc-mingw32/sys-root/mingw && zip -q -r -D $zipfile .)
+                if [ -d usr/share/doc/packages/$origname ] ; then
+                    mv usr/share/doc/packages/$origname usr/share/doc/packages/$shortname
+                    (cd usr && zip -q -r -D $zipfile share/doc/packages/$shortname)
+                fi
+                mkdir -p manifest
+                unzip -l $zipfile >manifest/$shortpackage.mft
+                zip -q $zipfile manifest/$shortpackage.mft
+                N=`unzip -l $zipfile | wc -l | sed -e 's/^ *\([0-9]*\).*/\1/'`
+                Nm1=`expr $N - 1`
+                unzip -l $zipfile | sed -e "1,3 d" -e "$Nm1,$N d" | awk '{print $4}' | grep -v -E '/$' >manifest/$shortpackage.mft
+                zip -q $zipfile manifest/$shortpackage.mft
+                echo $zipfile
+            )
+            rm -rf $tmp
+            ;;
+            *)
+            echo $F is not a mingw32/64 RPM package >&2
+            ;;
+        esac
+        ;;
+        *)
+        echo $F is not a mingw32/64 RPM package >&2
+        ;;
+    esac
+done