diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/atmodem/atutil.c | 83 | ||||
-rw-r--r-- | drivers/atmodem/atutil.h | 25 |
2 files changed, 108 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; +} diff --git a/drivers/atmodem/atutil.h b/drivers/atmodem/atutil.h index 9e0a84bf..7dbb8a6d 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 = 0x1, + AT_UTIL_CHARSET_HEX = 0x2, + AT_UTIL_CHARSET_IRA = 0x4, + AT_UTIL_CHARSET_PCCP437 = 0x8, + AT_UTIL_CHARSET_PCDN = 0x10, + AT_UTIL_CHARSET_UCS2 = 0x20, + AT_UTIL_CHARSET_UTF8 = 0x40, + AT_UTIL_CHARSET_8859_1 = 0x80, + AT_UTIL_CHARSET_8859_2 = 0x100, + AT_UTIL_CHARSET_8859_3 = 0x200, + AT_UTIL_CHARSET_8859_4 = 0x400, + AT_UTIL_CHARSET_8859_5 = 0x800, + AT_UTIL_CHARSET_8859_6 = 0x1000, + AT_UTIL_CHARSET_8859_C = 0x2000, + AT_UTIL_CHARSET_8859_A = 0x4000, + AT_UTIL_CHARSET_8859_G = 0x8000, + AT_UTIL_CHARSET_8859_H = 0x10000, +}; + 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,10 @@ gboolean at_util_parse_sms_index_delivery(GAtResult *result, const char *prefix, enum at_util_sms_store *store, int *index); +gboolean at_util_parse_cscs_supported(GAtResult *result, int *supported); +gboolean at_util_parse_cscs_query(GAtResult *result, + enum at_util_charset *charset); + struct cb_data { void *cb; void *data; |