summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJeevaka Badrappan <jeevaka.badrappan@elektrobit.com>2010-09-09 11:56:03 -0700
committerDenis Kenzior <denkenz@gmail.com>2010-09-10 12:00:43 -0500
commita632cfe11bd49855a37e069f7efb1f496fe9a7b3 (patch)
tree11501f24b2fa91d691cf4ea7a0cb24e473d9727d /drivers
parent73e8b6aeb602cad8cb0d903b7eeb467da70e7b50 (diff)
downloadofono-a632cfe11bd49855a37e069f7efb1f496fe9a7b3.tar.bz2
atutil: Add parsing of CSCS queries
Diffstat (limited to 'drivers')
-rw-r--r--drivers/atmodem/atutil.c83
-rw-r--r--drivers/atmodem/atutil.h25
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;