modem-helpers: new CPMS format result parser

This commit is contained in:
Aleksander Morgado
2012-02-09 23:45:35 +01:00
parent 23508ddd7f
commit 09adad847e
2 changed files with 97 additions and 0 deletions

View File

@@ -294,6 +294,98 @@ mm_3gpp_parse_scan_response (const gchar *reply,
/*************************************************************************/
static MMSmsStorage
storage_from_str (const gchar *str)
{
if (g_str_equal (str, "SM"))
return MM_SMS_STORAGE_SM;
if (g_str_equal (str, "ME"))
return MM_SMS_STORAGE_ME;
if (g_str_equal (str, "MT"))
return MM_SMS_STORAGE_MT;
if (g_str_equal (str, "SR"))
return MM_SMS_STORAGE_SR;
if (g_str_equal (str, "BM"))
return MM_SMS_STORAGE_BM;
if (g_str_equal (str, "TA"))
return MM_SMS_STORAGE_TA;
return MM_SMS_STORAGE_UNKNOWN;
}
gboolean
mm_3gpp_parse_cpms_format_response (const gchar *reply,
GArray **mem1,
GArray **mem2,
GArray **mem3)
{
GRegex *r;
gchar **split;
guint i;
g_assert (mem1 != NULL);
g_assert (mem2 != NULL);
g_assert (mem3 != NULL);
/*
* +CPMS: ("SM","ME"),("SM","ME"),("SM","ME")
*/
split = g_strsplit_set (mm_strip_tag (reply, "+CPMS:"), "()", -1);
if (!split)
return FALSE;
r = g_regex_new ("\\s*\"([^,\\)]+)\"\\s*", 0, 0, NULL);
g_assert (r);
for (i = 0; split[i]; i++) {
GMatchInfo *match_info;
/* Got a range group to match */
if (g_regex_match_full (r, split[i], strlen (split[i]), 0, 0, &match_info, NULL)) {
GArray *array = NULL;
while (g_match_info_matches (match_info)) {
gchar *str;
str = g_match_info_fetch (match_info, 1);
if (str) {
MMSmsStorage storage;
if (!array)
array = g_array_new (FALSE, FALSE, sizeof (MMSmsStorage));
storage = storage_from_str (str);
g_array_append_val (array, storage);
g_free (str);
}
g_match_info_next (match_info, NULL);
}
if (!*mem1)
*mem1 = array;
else if (!*mem2)
*mem2 = array;
else if (!*mem3)
*mem3 = array;
}
g_match_info_free (match_info);
if (*mem3 != NULL)
break; /* once we got the last group, exit... */
}
g_strfreev (split);
g_regex_unref (r);
g_warn_if_fail (*mem1 != NULL);
g_warn_if_fail (*mem2 != NULL);
g_warn_if_fail (*mem3 != NULL);
return (*mem1 && *mem2 && *mem3);
}
/*************************************************************************/
#define CMGF_TAG "+CMGF:"
gboolean

View File

@@ -69,6 +69,11 @@ gboolean mm_3gpp_parse_cmgf_format_response (const gchar *reply,
gboolean *sms_text_supported,
GError **error);
gboolean mm_3gpp_parse_cpms_format_response (const gchar *reply,
GArray **mem1,
GArray **mem2,
GArray **mem3);
GRegex *mm_3gpp_ciev_regex_get (void);
GRegex *mm_3gpp_cusd_regex_get (void);