---
drivers/atmodem/atutil.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++
drivers/atmodem/atutil.h | 26 +++++++++++++++
2 files changed, 104 insertions(+), 0 deletions(-)
diff --git a/drivers/atmodem/atutil.c b/drivers/atmodem/atutil.c
index f566237..ffbcb6c 100644
--- a/drivers/atmodem/atutil.c
+++ b/drivers/atmodem/atutil.c
@@ -341,3 +341,81 @@ gboolean at_util_parse_sms_index_delivery(GAtResult *result, const
char *prefix,
return TRUE;
}
+
+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, const char **charset)
+{
+ GAtResultIter iter;
+
+ g_at_result_iter_init(&iter, result);
+
+ if (!g_at_result_iter_next(&iter, "+CSCS:"))
+ return FALSE;
+
+ return g_at_result_iter_next_string(&iter, charset);
+}
diff --git a/drivers/atmodem/atutil.h b/drivers/atmodem/atutil.h
index 9e0a84b..845d8de 100644
--- a/drivers/atmodem/atutil.h
+++ b/drivers/atmodem/atutil.h
@@ -27,6 +27,27 @@ enum at_util_sms_store {
AT_UTIL_SMS_STORE_BM = 4,
};
+/* 3GPP TS 27.007 Release 8 Section 5.5 */
+enum at_util_charset {
+ AT_UTIL_CHARSET_GSM = 1,
+ AT_UTIL_CHARSET_HEX = 2,
+ AT_UTIL_CHARSET_IRA = 3,
+ AT_UTIL_CHARSET_PCCP437 = 4,
+ AT_UTIL_CHARSET_PCDN = 5,
+ AT_UTIL_CHARSET_UCS2 = 6,
+ AT_UTIL_CHARSET_UTF8 = 7,
+ AT_UTIL_CHARSET_8859_1 = 8,
+ AT_UTIL_CHARSET_8859_2 = 9,
+ AT_UTIL_CHARSET_8859_3 = 10,
+ AT_UTIL_CHARSET_8859_4 = 11,
+ AT_UTIL_CHARSET_8859_5 = 12,
+ AT_UTIL_CHARSET_8859_6 = 13,
+ AT_UTIL_CHARSET_8859_C = 14,
+ AT_UTIL_CHARSET_8859_A = 15,
+ AT_UTIL_CHARSET_8859_G = 16,
+ AT_UTIL_CHARSET_8859_H = 17,
+};
+
void decode_at_error(struct ofono_error *error, const char *final);
gint at_util_call_compare_by_status(gconstpointer a, gconstpointer b);
gint at_util_call_compare_by_phone_number(gconstpointer a, gconstpointer b);
@@ -46,6 +67,11 @@ gboolean at_util_parse_sms_index_delivery(GAtResult *result, const char
*prefix,
enum at_util_sms_store *store,
int *index);
+gboolean at_util_charset_string_to_charset(const char *str,
+ enum at_util_charset *charset);
+gboolean at_util_parse_cscs_supported(GAtResult *result, int *supported);
+gboolean at_util_parse_cscs_query(GAtResult *result, const char **charset);
+
struct cb_data {
void *cb;
void *data;
--
1.7.0.4