Sophie

Sophie

distrib > Mandriva > 2008.0 > x86_64 > media > main-backports-src > by-pkgid > fbdada2f02f1c2feb5882f36a9db2065 > files > 1

pidgin-2.5.1-1mdv2008.0.src.rpm

diff -ru pidgin-2.3.1.orig/libpurple/protocols/qq/char_conv.c pidgin-2.3.1/libpurple/protocols/qq/char_conv.c
--- pidgin-2.3.1.orig/libpurple/protocols/qq/char_conv.c	2007-12-07 22:37:09.000000000 +0800
+++ pidgin-2.3.1/libpurple/protocols/qq/char_conv.c	2008-02-17 15:28:38.000000000 +0800
@@ -101,7 +101,7 @@
 }
 
 /* convert a string from from_charset to to_charset, using g_convert */
-static gchar *_my_convert(const gchar *str, gssize len, const gchar *to_charset, const gchar *from_charset) 
+static gchar *_my_convert(gchar *str, gssize len, const gchar *to_charset, const gchar *from_charset) 
 {
 	GError *error = NULL;
 	gchar *ret;
@@ -112,11 +112,12 @@
 	ret = g_convert(str, len, to_charset, from_charset, &byte_read, &byte_write, &error);
 
 	if (error == NULL)
+		
 		return ret;	/* conversion is OK */
 	else {			/* conversion error */
 		gchar *failed = hex_dump_to_str((guint8 *) str, (len == -1) ? strlen(str) : len);
 		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "%s\n", error->message);
-		purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Dump failed text\n%s", failed);
+		purple_debug(PURPLE_DEBUG_WARNING, "QQ", "Dump failed text, length = %d\n%s", len, failed);
 		g_free(failed);
 		g_error_free(error);
 		return g_strdup(QQ_NULL_MSG);
@@ -138,6 +139,19 @@
 	return len + 1;
 }
 
+/* Dino <linux@sun7.cn> : Add 2 bytes size pascal string parser */
+gint convert_as_pascal_string2(guint8 *data, gchar **ret, const gchar *from_charset) 
+{
+	guint16 len;
+
+	g_return_val_if_fail(data != NULL && from_charset != NULL, -1);
+
+	len = ntohs(*((unsigned short *)(data)));
+	*ret = _my_convert((gchar *) (data + 2), (gssize) len, UTF8, from_charset);
+
+	return len + 2;
+}
+
 /* convert QQ formatted msg to Purple formatted msg (and UTF-8) */
 gchar *qq_encode_to_purple(guint8 *data, gint len, const gchar *msg)
 {
diff -ru pidgin-2.3.1.orig/libpurple/protocols/qq/char_conv.h pidgin-2.3.1/libpurple/protocols/qq/char_conv.h
--- pidgin-2.3.1.orig/libpurple/protocols/qq/char_conv.h	2007-12-07 22:37:09.000000000 +0800
+++ pidgin-2.3.1/libpurple/protocols/qq/char_conv.h	2008-02-17 15:28:07.000000000 +0800
@@ -30,6 +30,8 @@
 #define QQ_CHARSET_DEFAULT      "GB18030"
 
 gint convert_as_pascal_string(guint8 *data, gchar **ret, const gchar *from_charset);
+/* Dino <linux@sun7.cn> : Add 2 bytes size pascal string parser */
+gint convert_as_pascal_string2(guint8 *data, gchar **ret, const gchar *from_charset);
 
 gchar *qq_smiley_to_purple(gchar *text);
 
diff -ru pidgin-2.3.1.orig/libpurple/protocols/qq/group_info.c pidgin-2.3.1/libpurple/protocols/qq/group_info.c
--- pidgin-2.3.1.orig/libpurple/protocols/qq/group_info.c	2007-12-07 22:37:09.000000000 +0800
+++ pidgin-2.3.1/libpurple/protocols/qq/group_info.c	2008-02-17 15:30:39.000000000 +0800
@@ -170,11 +170,13 @@
 	GSList *pending_id;
 	gint pascal_len, i;
 	guint32 unknown4;
+	guint32 unknown5;
 	guint8 unknown1;
+	guint8 unknown6;
 
 	g_return_if_fail(data != NULL && len > 0);
 	qd = (qq_data *) gc->proto_data;
-
+	
 	read_packet_dw(data, cursor, len, &(internal_group_id));
 	g_return_if_fail(internal_group_id > 0);
 	read_packet_dw(data, cursor, len, &(external_group_id));
@@ -198,12 +200,14 @@
 	read_packet_dw(data, cursor, len, &(group->group_category));
 	read_packet_w(data, cursor, len, &max_members);
 	read_packet_b(data, cursor, len, &unknown1);
-	read_packet_dw(data, cursor, len, &(unknown4));	/* versionID */
-
+	/* Dino <linux@sun7.cn> : delete useless fields */
+	read_packet_b(data, cursor, len, &unknown1); /* versionID */
+	
 	pascal_len = convert_as_pascal_string(*cursor, &(group->group_name_utf8), QQ_CHARSET_DEFAULT);
 	*cursor += pascal_len;
-	read_packet_w(data, cursor, len, &(unknown));	/* 0x0000 */
-	pascal_len = convert_as_pascal_string(*cursor, &(group->notice_utf8), QQ_CHARSET_DEFAULT);
+	read_packet_w(data, cursor, len, &(unknown6));	/* 0x00 */
+	/* Dino <linux@sun7.cn> : Add 2 bytes size pascal string parser */
+	pascal_len = convert_as_pascal_string2(*cursor, &(group->notice_utf8), QQ_CHARSET_DEFAULT);
 	*cursor += pascal_len;
 	pascal_len = convert_as_pascal_string(*cursor, &(group->group_desc_utf8), QQ_CHARSET_DEFAULT);
 	*cursor += pascal_len;