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;