summaryrefslogtreecommitdiffstats
path: root/drivers/atmodem/atutil.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/atmodem/atutil.c')
-rw-r--r--drivers/atmodem/atutil.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/drivers/atmodem/atutil.c b/drivers/atmodem/atutil.c
index f5662375..fe7cbfc1 100644
--- a/drivers/atmodem/atutil.c
+++ b/drivers/atmodem/atutil.c
@@ -341,3 +341,86 @@ gboolean at_util_parse_sms_index_delivery(GAtResult *result, const char *prefix,
return TRUE;
}
+
+static gboolean at_util_charset_string_to_charset(const char *str,
+ enum at_util_charset *charset)
+{
+ if (!g_strcmp0(str, "GSM"))
+ *charset = AT_UTIL_CHARSET_GSM;
+ else if (!g_strcmp0(str, "HEX"))
+ *charset = AT_UTIL_CHARSET_HEX;
+ else if (!g_strcmp0(str, "IRA"))
+ *charset = AT_UTIL_CHARSET_IRA;
+ else if (!g_strcmp0(str, "PCCP437"))
+ *charset = AT_UTIL_CHARSET_PCCP437;
+ else if (!g_strcmp0(str, "PCDN"))
+ *charset = AT_UTIL_CHARSET_PCDN;
+ else if (!g_strcmp0(str, "UCS2"))
+ *charset = AT_UTIL_CHARSET_UCS2;
+ else if (!g_strcmp0(str, "UTF-8"))
+ *charset = AT_UTIL_CHARSET_UTF8;
+ else if (!g_strcmp0(str, "8859-1"))
+ *charset = AT_UTIL_CHARSET_8859_1;
+ else if (!g_strcmp0(str, "8859-2"))
+ *charset = AT_UTIL_CHARSET_8859_2;
+ else if (!g_strcmp0(str, "8859-3"))
+ *charset = AT_UTIL_CHARSET_8859_3;
+ else if (!g_strcmp0(str, "8859-4"))
+ *charset = AT_UTIL_CHARSET_8859_4;
+ else if (!g_strcmp0(str, "8859-5"))
+ *charset = AT_UTIL_CHARSET_8859_5;
+ else if (!g_strcmp0(str, "8859-6"))
+ *charset = AT_UTIL_CHARSET_8859_6;
+ else if (!g_strcmp0(str, "8859-C"))
+ *charset = AT_UTIL_CHARSET_8859_C;
+ else if (!g_strcmp0(str, "8859-A"))
+ *charset = AT_UTIL_CHARSET_8859_A;
+ else if (!g_strcmp0(str, "8859-G"))
+ *charset = AT_UTIL_CHARSET_8859_G;
+ else if (!g_strcmp0(str, "8859-H"))
+ *charset = AT_UTIL_CHARSET_8859_H;
+ else
+ return FALSE;
+
+ return TRUE;
+}
+
+gboolean at_util_parse_cscs_supported(GAtResult *result, int *supported)
+{
+ GAtResultIter iter;
+ const char *str;
+ enum at_util_charset charset;
+ g_at_result_iter_init(&iter, result);
+
+ if (!g_at_result_iter_next(&iter, "+CSCS:"))
+ return FALSE;
+
+ /* Some modems don't report CSCS in a proper list */
+ g_at_result_iter_open_list(&iter);
+
+ while (g_at_result_iter_next_string(&iter, &str)) {
+ if (at_util_charset_string_to_charset(str, &charset))
+ *supported |= charset;
+ }
+
+ g_at_result_iter_close_list(&iter);
+
+ return TRUE;
+}
+
+gboolean at_util_parse_cscs_query(GAtResult *result,
+ enum at_util_charset *charset)
+{
+ GAtResultIter iter;
+ const char *str;
+
+ g_at_result_iter_init(&iter, result);
+
+ if (!g_at_result_iter_next(&iter, "+CSCS:"))
+ return FALSE;
+
+ if (g_at_result_iter_next_string(&iter, &str))
+ return at_util_charset_string_to_charset(str, charset);
+
+ return FALSE;
+}