Mercurial > pidgin.yaz
diff libpurple/protocols/oscar/family_icbm.c @ 27958:518b4a900f19
propagate from branch 'im.pidgin.pidgin' (head 11d28a9362597cbea7fa0957f4202037131a3d6b)
to branch 'im.pidgin.pidgin.yaz' (head c88eab6ab06f08ebe8a58bbc9614d11818aad9e9)
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Mon, 29 Jun 2009 06:24:37 +0000 |
parents | a2508ac2e536 d8e6a2d592a4 |
children | e1cd44c7c7af |
line wrap: on
line diff
--- a/libpurple/protocols/oscar/family_icbm.c Mon Jun 29 05:02:24 2009 +0000 +++ b/libpurple/protocols/oscar/family_icbm.c Mon Jun 29 06:24:37 2009 +0000 @@ -52,8 +52,8 @@ #endif #include "util.h" - - +/* yaz */ +#include "debug.h" /** * Add a standard ICBM header to the given bstream with the given * information. @@ -461,6 +461,9 @@ guchar cookie[8]; GSList *outer_tlvlist = NULL, *inner_tlvlist = NULL; ByteStream hdrbs; + // yaz + char *ucs = NULL; + gsize bytes; if (!od || !(conn = flap_connection_findbygroup(od, SNAC_FAMILY_ICBM))) return -EINVAL; @@ -499,15 +502,51 @@ * raw data, followed by a series of TLVs. * */ +#if 0 byte_stream_new(&hdrbs, 2+8+16+6+4+4+strlen(msg)+4+2+1+strlen(roomname)+2); byte_stream_put16(&hdrbs, 0x0000); /* Unknown! */ byte_stream_putraw(&hdrbs, cookie, sizeof(cookie)); /* I think... */ byte_stream_putcaps(&hdrbs, OSCAR_CAPABILITY_CHAT); - +#endif + //yaz + // convert msg to ascii first. if it succeed, send as plain ascii. + // if it fails, convert msg into UTF-16BE, and send it. + ucs = g_convert(msg, strlen(msg), "ASCII", "UTF-8", NULL, &bytes, NULL); + if(ucs){ + byte_stream_new(&hdrbs, 2+8+16+6+4+4+strlen(msg)+4+2+1+strlen(roomname)+2); + + byte_stream_put16(&hdrbs, 0x0000); /* Unknown! */ + byte_stream_putraw(&hdrbs, cookie, sizeof(cookie)); /* I think... */ + byte_stream_putcaps(&hdrbs, OSCAR_CAPABILITY_CHAT); + + aim_tlvlist_add_16(&inner_tlvlist, 0x000a, 0x0001); + aim_tlvlist_add_noval(&inner_tlvlist, 0x000f); + aim_tlvlist_add_raw(&inner_tlvlist, 0x000c, strlen(msg), (guint8 *)msg); + free(ucs); + } else { + byte_stream_new(&hdrbs, 2+8+16+6+4+4+strlen(msg)+4+2+1+strlen(roomname)+2+4+11); + + byte_stream_put16(&hdrbs, 0x0000); /* Unknown! */ + byte_stream_putraw(&hdrbs, cookie, sizeof(cookie)); /* I think... */ + byte_stream_putcaps(&hdrbs, OSCAR_CAPABILITY_CHAT); + + aim_tlvlist_add_16(&inner_tlvlist, 0x000a, 0x0001); + aim_tlvlist_add_raw(&inner_tlvlist, 0x000d, 11, (guint8 *)"unicode-2-0"); + aim_tlvlist_add_noval(&inner_tlvlist, 0x000f); + //yaz + ucs = g_convert(msg, strlen(msg), "UTF-16BE", "UTF-8", NULL, &bytes, NULL); + if(ucs){ + botch_ucs(ucs, bytes); + aim_tlvlist_add_raw(&inner_tlvlist, 0x000c, bytes, (guint8 *)ucs); + free(ucs); + } + } +#if 0 aim_tlvlist_add_16(&inner_tlvlist, 0x000a, 0x0001); aim_tlvlist_add_noval(&inner_tlvlist, 0x000f); aim_tlvlist_add_str(&inner_tlvlist, 0x000c, msg); +#endif aim_tlvlist_add_chatroom(&inner_tlvlist, 0x2711, exchange, roomname, instance); aim_tlvlist_write(&hdrbs, &inner_tlvlist);