diff options
Diffstat (limited to 'src/mm-modem-helpers.c')
-rw-r--r-- | src/mm-modem-helpers.c | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/src/mm-modem-helpers.c b/src/mm-modem-helpers.c index 25998b1f..f13b4f27 100644 --- a/src/mm-modem-helpers.c +++ b/src/mm-modem-helpers.c @@ -25,6 +25,7 @@ #include "mm-errors.h" #include "mm-modem-helpers.h" +#include "mm-log.h" const char * mm_strip_tag (const char *str, const char *cmd) @@ -242,10 +243,14 @@ mm_gsm_destroy_scan_data (gpointer data) /* +CREG: <n>,<stat>,<lac>,<ci>,<AcT> (ETSI 27.007 solicited and some CREG=2 unsolicited) */ #define CREG6 "\\+(CREG|CGREG):\\s*(\\d{1}),\\s*(\\d{1})\\s*,\\s*([^,\\s]*)\\s*,\\s*([^,\\s]*)\\s*,\\s*(\\d{1,2})" +/* +CREG: <n>,<stat>,<lac>,<ci>,<AcT?>,<something> (Samsung Wave S8500) */ +/* '<CR><LF>+CREG: 2,1,000B,2816, B, C2816<CR><LF><CR><LF>OK<CR><LF>' */ +#define CREG7 "\\+(CREG|CGREG):\\s*(\\d{1}),\\s*(\\d{1})\\s*,\\s*([^,\\s]*)\\s*,\\s*([^,\\s]*)\\s*,\\s*([^,\\s]*)\\s*,\\s*[^,\\s]*" + GPtrArray * mm_gsm_creg_regex_get (gboolean solicited) { - GPtrArray *array = g_ptr_array_sized_new (6); + GPtrArray *array = g_ptr_array_sized_new (7); GRegex *regex; /* #1 */ @@ -296,6 +301,14 @@ mm_gsm_creg_regex_get (gboolean solicited) g_assert (regex); g_ptr_array_add (array, regex); + /* #7 */ + if (solicited) + regex = g_regex_new (CREG7 "$", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); + else + regex = g_regex_new ("\\r\\n" CREG7 "\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); + g_assert (regex); + g_ptr_array_add (array, regex); + return array; } @@ -785,7 +798,9 @@ mm_gsm_string_to_access_tech (const char *string) /* Better technologies are listed first since modems sometimes say * stuff like "GPRS/EDGE" and that should be handled as EDGE. */ - if (strcasestr (string, "HSPA")) + if (strcasestr (string, "HSPA+")) + return MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS; + else if (strcasestr (string, "HSPA")) return MM_MODEM_GSM_ACCESS_TECH_HSPA; else if (strcasestr (string, "HSDPA/HSUPA")) return MM_MODEM_GSM_ACCESS_TECH_HSPA; @@ -815,10 +830,9 @@ mm_create_device_identifier (guint vid, const char *gsn, const char *revision, const char *model, - const char *manf, - gboolean debug) + const char *manf) { - GString *devid, *dbg = NULL; + GString *devid, *msg = NULL; GChecksum *sum; char *p, *ret = NULL; char str_vid[10], str_pid[10]; @@ -845,41 +859,35 @@ mm_create_device_identifier (guint vid, return NULL; p = devid->str; - if (debug) - dbg = g_string_sized_new (strlen (devid->str) + 17); + msg = g_string_sized_new (strlen (devid->str) + 17); sum = g_checksum_new (G_CHECKSUM_SHA1); if (vid) { snprintf (str_vid, sizeof (str_vid) - 1, "%08x", vid); g_checksum_update (sum, (const guchar *) &str_vid[0], strlen (str_vid)); - if (dbg) - g_string_append_printf (dbg, "%08x", vid); + g_string_append_printf (msg, "%08x", vid); } if (vid) { snprintf (str_pid, sizeof (str_pid) - 1, "%08x", pid); g_checksum_update (sum, (const guchar *) &str_pid[0], strlen (str_pid)); - if (dbg) - g_string_append_printf (dbg, "%08x", pid); + g_string_append_printf (msg, "%08x", pid); } while (*p) { /* Strip spaces and linebreaks */ if (!isblank (*p) && !isspace (*p) && isascii (*p)) { g_checksum_update (sum, (const guchar *) p, 1); - if (dbg) - g_string_append_c (dbg, *p); + g_string_append_c (msg, *p); } p++; } ret = g_strdup (g_checksum_get_string (sum)); g_checksum_free (sum); - if (dbg) { - g_debug ("Device ID source '%s'", dbg->str); - g_debug ("Device ID '%s'", ret); - g_string_free (dbg, TRUE); - } + mm_dbg ("Device ID source '%s'", msg->str); + mm_dbg ("Device ID '%s'", ret); + g_string_free (msg, TRUE); return ret; } |