diff options
Diffstat (limited to 'src/mm-modem-helpers.c')
-rw-r--r-- | src/mm-modem-helpers.c | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/src/mm-modem-helpers.c b/src/mm-modem-helpers.c index 0bf62378..25e0561d 100644 --- a/src/mm-modem-helpers.c +++ b/src/mm-modem-helpers.c @@ -819,6 +819,151 @@ mm_gsm_parse_cscs_support_response (const char *reply, /*************************************************************************/ +/* Map two letter facility codes into flag values. There are + * many more facilities defined (for various flavors of call + * barring); we only map the ones we care about. */ +static MMModemGsmFacility +mm_gsm_string_to_facility (const char *string) +{ + g_return_val_if_fail (string != NULL, MM_MODEM_GSM_FACILITY_NONE); + + if (!strcmp (string, "SC")) + return MM_MODEM_GSM_FACILITY_SIM; + else if (!strcmp (string, "PS")) + return MM_MODEM_GSM_FACILITY_PH_SIM; + else if (!strcmp (string, "PF")) + return MM_MODEM_GSM_FACILITY_PH_FSIM; + else if (!strcmp (string, "FD")) + return MM_MODEM_GSM_FACILITY_FIXED_DIALING; + else if (!strcmp (string, "PN")) + return MM_MODEM_GSM_FACILITY_NET_PERS; + else if (!strcmp (string, "PU")) + return MM_MODEM_GSM_FACILITY_NET_SUB_PERS; + else if (!strcmp (string, "PP")) + return MM_MODEM_GSM_FACILITY_PROVIDER_PERS; + else if (!strcmp (string, "PC")) + return MM_MODEM_GSM_FACILITY_CORP_PERS; + else + return MM_MODEM_GSM_FACILITY_NONE; + +} + +/*************************************************************************/ + +char * +mm_gsm_get_facility_name (MMModemGsmFacility facility) +{ + switch (facility) { + case MM_MODEM_GSM_FACILITY_SIM: + return "SC"; + case MM_MODEM_GSM_FACILITY_PH_SIM: + return "PS"; + case MM_MODEM_GSM_FACILITY_PH_FSIM: + return "PF"; + case MM_MODEM_GSM_FACILITY_FIXED_DIALING: + return "FD"; + case MM_MODEM_GSM_FACILITY_NET_PERS: + return "PN"; + case MM_MODEM_GSM_FACILITY_NET_SUB_PERS: + return "PU"; + case MM_MODEM_GSM_FACILITY_PROVIDER_PERS: + return "PP"; + case MM_MODEM_GSM_FACILITY_CORP_PERS: + return "PC"; + default: + return NULL; + } +} + +gboolean +mm_gsm_parse_clck_test_response (const char *reply, + MMModemGsmFacility *out_facilities) +{ + MMModemGsmFacility facilities = MM_MODEM_GSM_FACILITY_NONE; + GRegex *r; + GMatchInfo *match_info; + char *p, *str; + gboolean success = FALSE; + + g_return_val_if_fail (reply != NULL, FALSE); + g_return_val_if_fail (out_facilities != NULL, FALSE); + + /* the general format is: + * + * +CLCK: ("SC","AO","AI","PN") + */ + p = strchr (reply, '('); + if (p) + p++; + else { + p = strchr (reply, '"'); + if (!p) + return FALSE; + } + + /* Now parse each facility */ + r = g_regex_new ("\\s*\"([^,\\)]+)\"\\s*", 0, 0, NULL); + if (!r) + return FALSE; + + if (g_regex_match_full (r, p, strlen (p), 0, 0, &match_info, NULL)) { + while (g_match_info_matches (match_info)) { + str = g_match_info_fetch (match_info, 1); + if (str) + facilities |= mm_gsm_string_to_facility (str); + g_free (str); + + g_match_info_next (match_info, NULL); + success = TRUE; + } + } + g_match_info_free (match_info); + g_regex_unref (r); + + if (success) + *out_facilities = facilities; + + return success; +} + +gboolean +mm_gsm_parse_clck_response (const char *reply, gboolean *enabled) +{ + GRegex *r; + GMatchInfo *match_info; + char *p, *str; + gboolean success = FALSE; + + g_return_val_if_fail (reply != NULL, FALSE); + g_return_val_if_fail (enabled != NULL, FALSE); + + p = strchr (reply, ':'); + if (p) + p++; + + r = g_regex_new ("\\s*([01])\\s*", 0, 0, NULL); + if (!r) + return FALSE; + + if (g_regex_match (r, p, 0, &match_info)) { + success = TRUE; + str = g_match_info_fetch (match_info, 1); + if (str) { + if (*str == '0') + *enabled = FALSE; + else if (*str == '1') + *enabled = TRUE; + else + success = FALSE; + } + } + g_match_info_free (match_info); + g_regex_unref (r); + return success; +} + +/*************************************************************************/ + MMModemGsmAccessTech mm_gsm_string_to_access_tech (const char *string) { |