aboutsummaryrefslogtreecommitdiff
path: root/src/mm-modem-helpers.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mm-modem-helpers.c')
-rw-r--r--src/mm-modem-helpers.c44
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;
}