summaryrefslogtreecommitdiffstats
path: root/src/util.c
diff options
context:
space:
mode:
authorAndrzej Zaborowski <andrew.zaborowski@intel.com>2010-06-07 12:08:32 +0200
committerDenis Kenzior <denkenz@gmail.com>2010-06-09 12:43:27 -0500
commit9f925b3620efbc88b31d6e651b3306a0b980e810 (patch)
tree9554aab9b9ec1237cc6c997033b752c0edd8614d /src/util.c
parent6120e487b5d8cc946ea35a68cdda2a3897adde68 (diff)
downloadofono-9f925b3620efbc88b31d6e651b3306a0b980e810.tar.bz2
util: Add a "sim string" encoding utility.
Diffstat (limited to 'src/util.c')
-rw-r--r--src/util.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/util.c b/src/util.c
index e5ce7b3a..fd8b3059 100644
--- a/src/util.c
+++ b/src/util.c
@@ -1215,3 +1215,49 @@ char *sim_string_to_utf8(const unsigned char *buffer, int length)
return utf8;
}
+
+unsigned char *utf8_to_sim_string(const char *utf,
+ int max_length, int *out_length)
+{
+ unsigned char *result;
+ unsigned char *ucs2;
+ long gsm_bytes;
+ gsize converted;
+
+ result = convert_utf8_to_gsm(utf, -1, NULL, &gsm_bytes, 0);
+ if (result) {
+ if (gsm_bytes > max_length) {
+ gsm_bytes = max_length;
+ while (gsm_bytes && result[gsm_bytes - 1] == 0x1b)
+ gsm_bytes -= 1;
+ }
+
+ *out_length = gsm_bytes;
+ return result;
+ }
+
+ /* NOTE: UCS2 formats with an offset are never used */
+
+ ucs2 = (guint8 *) g_convert(utf, -1, "UCS-2BE//TRANSLIT", "UTF-8",
+ NULL, &converted, NULL);
+
+ if (!ucs2)
+ return NULL;
+
+ if (max_length != -1 && (int) converted + 1 > max_length)
+ converted = (max_length - 1) & ~1;
+
+ result = g_try_malloc(converted + 1);
+ if (!result) {
+ g_free(ucs2);
+ return NULL;
+ }
+
+ *out_length = converted + 1;
+
+ result[0] = 0x80;
+ memcpy(&result[1], ucs2, converted);
+ g_free(ucs2);
+
+ return result;
+}