summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2018-08-07 00:23:41 +0200
committerAleksander Morgado <aleksander@aleksander.es>2018-08-12 13:53:07 +0200
commit8f095f7d6c8ff9731c4944ca0d4048003eb80f36 (patch)
tree23c087d017c5d4eac569e2f57e4b3224bb2d8954
parent3d8590f83cd145bf4e34a787256b63c15effad4a (diff)
downloadModemManager-8f095f7d6c8ff9731c4944ca0d4048003eb80f36.tar.gz
charsets: new helper to convert binary input data to UTF-8
Most of all the other APIs we have are expecting binary data (e.g. UCS-2 encoded strings) in ASCII hex format, because they were going to be used in text AT commands. For binary protocols allowing binary data, we need use a more generic API that provides an explicit data size.
-rw-r--r--src/mm-charsets.c25
-rw-r--r--src/mm-charsets.h5
2 files changed, 30 insertions, 0 deletions
diff --git a/src/mm-charsets.c b/src/mm-charsets.c
index 55604182a..73dd4da61 100644
--- a/src/mm-charsets.c
+++ b/src/mm-charsets.c
@@ -148,6 +148,31 @@ mm_modem_charset_byte_array_append (GByteArray *array,
return TRUE;
}
+gchar *
+mm_modem_charset_byte_array_to_utf8 (GByteArray *array,
+ MMModemCharset charset)
+{
+ char *converted;
+ const char *iconv_from;
+ GError *error = NULL;
+
+ g_return_val_if_fail (array != NULL, NULL);
+ g_return_val_if_fail (charset != MM_MODEM_CHARSET_UNKNOWN, NULL);
+
+ iconv_from = charset_iconv_from (charset);
+ g_return_val_if_fail (iconv_from != NULL, FALSE);
+
+ converted = g_convert ((const gchar *)array->data, array->len,
+ "UTF-8//TRANSLIT", iconv_from,
+ NULL, NULL, &error);
+ if (!converted || error) {
+ g_clear_error (&error);
+ converted = NULL;
+ }
+
+ return converted;
+}
+
char *
mm_modem_charset_hex_to_utf8 (const char *src, MMModemCharset charset)
{
diff --git a/src/mm-charsets.h b/src/mm-charsets.h
index 340ae95b8..2e3e6f382 100644
--- a/src/mm-charsets.h
+++ b/src/mm-charsets.h
@@ -43,6 +43,11 @@ gboolean mm_modem_charset_byte_array_append (GByteArray *array,
gboolean quoted,
MMModemCharset charset);
+/* Take a string encoded in the given charset in binary form, and
+ * convert it to UTF-8. */
+gchar *mm_modem_charset_byte_array_to_utf8 (GByteArray *array,
+ MMModemCharset charset);
+
/* Take a string in hex representation ("00430052" or "A4BE11" for example)
* and convert it from the given character set to UTF-8.
*/