I tested this for MM1 outgoing messages and it works. I don't know if it will perform ok (or does matter) for other protocols.
--- mbuni-cvs/mmlib/mms_msg.c 2010-10-26 12:18:13.000000000 +0200 +++ mbuni/mmlib/mms_msg.c 2010-11-26 13:05:18.950730650 +0100 @@ -53,6 +53,34 @@ wsp_pack_short_integer(s, c); } +static void pack_utf8_encoded_text(Octstr *s, Octstr *value) +{ + const unsigned short short_len = 30; + const unsigned char length_quote = 31; + const unsigned char utf8_enc = 0x6a; + int need_space = octstr_get_char(value, 0) > 0x7f; /* see below */ + unsigned long len = octstr_len(value) + 2 + need_space; + /* Pack value length */ + if(len <= short_len) { + octstr_append_char(s, len); + } else { + octstr_append_char(s, length_quote); + octstr_append_uintvar(s, len); + } + /* Pack encoding */ + wsp_pack_short_integer(s, utf8_enc); + + /* Pack the rest */ + if(need_space) { + /* it looks like if UTF-8 character goes first, it's not properly + decoded on handsets, so we insert a space before it. Ugly, but + appears to work. */ + octstr_append_char(s, 0x20); + } + octstr_append(s, value); + octstr_append_char(s, 0); +} + #if 0 static void encode_uint(Octstr *os, unsigned int l) { @@ -683,11 +711,12 @@ unsigned char c; switch (field_type) { - + case MMS_HEADER_SUBJECT: + pack_utf8_encoded_text(os, value); + break; case MMS_HEADER_TO: case MMS_HEADER_CC: case MMS_HEADER_BCC: - case MMS_HEADER_SUBJECT: case MMS_HEADER_TRANSACTION_ID: case MMS_HEADER_MESSAGE_ID: case MMS_HEADER_REPLY_CHARGING_ID: @@ -695,8 +724,8 @@ case MMS_HEADER_STORE_STATUS_TEXT: - wsp_pack_text(os, value); /* XXX need to deal with charset issues. */ - break; + wsp_pack_text(os, value); /* XXX need to deal with charset issues. */ + break; case MMS_HEADER_RESPONSE_TEXT: /* make sure response status does not begin with digit!! Has special meaning*/ case MMS_HEADER_CONTENT_LOCATION:
pgpLUFjS4GYeL.pgp
Description: PGP signature
_______________________________________________ Devel mailing list Devel@mbuni.org http://lists.mbuni.org/mailman/listinfo/devel