aboutsummaryrefslogtreecommitdiff
path: root/plugins/huawei/mm-modem-helpers-huawei.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/huawei/mm-modem-helpers-huawei.c')
-rw-r--r--plugins/huawei/mm-modem-helpers-huawei.c329
1 files changed, 151 insertions, 178 deletions
diff --git a/plugins/huawei/mm-modem-helpers-huawei.c b/plugins/huawei/mm-modem-helpers-huawei.c
index 3ded6237..67bb7089 100644
--- a/plugins/huawei/mm-modem-helpers-huawei.c
+++ b/plugins/huawei/mm-modem-helpers-huawei.c
@@ -39,8 +39,6 @@ mm_huawei_parse_ndisstatqry_response (const gchar *response,
gboolean *ipv6_connected,
GError **error)
{
- GRegex *r;
- GMatchInfo *match_info;
GError *inner_error = NULL;
if (!response ||
@@ -71,6 +69,9 @@ mm_huawei_parse_ndisstatqry_response (const gchar *response,
/* If multiple fields available, try first parsing method */
if (strchr (response, ',')) {
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+
r = g_regex_new ("\\^NDISSTAT(?:QRY)?(?:Qry)?:\\s*(\\d),([^,]*),([^,]*),([^,\\r\\n]*)(?:\\r\\n)?"
"(?:\\^NDISSTAT:|\\^NDISSTATQRY:)?\\s*,?(\\d)?,?([^,]*)?,?([^,]*)?,?([^,\\r\\n]*)?(?:\\r\\n)?",
G_REGEX_DOLLAR_ENDONLY | G_REGEX_RAW,
@@ -108,12 +109,12 @@ mm_huawei_parse_ndisstatqry_response (const gchar *response,
ip_type_field += 4;
}
}
-
- g_match_info_free (match_info);
- g_regex_unref (r);
}
/* No separate IPv4/IPv6 info given just connected/not connected */
else {
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+
r = g_regex_new ("\\^NDISSTAT(?:QRY)?(?:Qry)?:\\s*(\\d)(?:\\r\\n)?",
G_REGEX_DOLLAR_ENDONLY | G_REGEX_RAW,
0, NULL);
@@ -134,9 +135,6 @@ mm_huawei_parse_ndisstatqry_response (const gchar *response,
*ipv4_connected = (gboolean)connected;
}
}
-
- g_match_info_free (match_info);
- g_regex_unref (r);
}
if (!ipv4_available && !ipv6_available) {
@@ -208,10 +206,10 @@ mm_huawei_parse_dhcp_response (const char *reply,
guint *out_dns2,
GError **error)
{
- gboolean matched;
- GRegex *r;
- GMatchInfo *match_info = NULL;
- GError *match_error = NULL;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ gboolean matched;
+ GError *match_error = NULL;
g_assert (reply != NULL);
g_assert (out_address != NULL);
@@ -257,8 +255,6 @@ mm_huawei_parse_dhcp_response (const char *reply,
}
}
- g_match_info_free (match_info);
- g_regex_unref (r);
return matched;
}
@@ -276,10 +272,10 @@ mm_huawei_parse_sysinfo_response (const char *reply,
guint *out_sys_submode,
GError **error)
{
- gboolean matched;
- GRegex *r;
- GMatchInfo *match_info = NULL;
- GError *match_error = NULL;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ gboolean matched;
+ GError *match_error = NULL;
g_assert (out_srv_status != NULL);
g_assert (out_srv_domain != NULL);
@@ -323,8 +319,6 @@ mm_huawei_parse_sysinfo_response (const char *reply,
}
}
- g_match_info_free (match_info);
- g_regex_unref (r);
return matched;
}
@@ -341,10 +335,10 @@ mm_huawei_parse_sysinfoex_response (const char *reply,
guint *out_sys_submode,
GError **error)
{
- gboolean matched;
- GRegex *r;
- GMatchInfo *match_info = NULL;
- GError *match_error = NULL;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ gboolean matched;
+ GError *match_error = NULL;
g_assert (out_srv_status != NULL);
g_assert (out_srv_domain != NULL);
@@ -387,8 +381,6 @@ mm_huawei_parse_sysinfoex_response (const char *reply,
mm_get_uint_from_match_info (match_info, 8, out_sys_submode);
}
- g_match_info_free (match_info);
- g_regex_unref (r);
return matched;
}
@@ -1189,17 +1181,23 @@ mm_huawei_parse_syscfgex_response (const gchar *response,
/*****************************************************************************/
/* ^NWTIME response parser */
-gboolean mm_huawei_parse_nwtime_response (const gchar *response,
- gchar **iso8601p,
- MMNetworkTimezone **tzp,
- GError **error)
+gboolean
+mm_huawei_parse_nwtime_response (const gchar *response,
+ gchar **iso8601p,
+ MMNetworkTimezone **tzp,
+ GError **error)
{
- GRegex *r;
- GMatchInfo *match_info = NULL;
- GError *match_error = NULL;
- guint year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0, dt = 0;
- gint tz = 0;
- gboolean ret = FALSE;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *match_error = NULL;
+ guint year = 0;
+ guint month = 0;
+ guint day = 0;
+ guint hour = 0;
+ guint minute = 0;
+ guint second = 0;
+ guint dt = 0;
+ gint tz = 0;
g_assert (iso8601p || tzp); /* at least one */
@@ -1211,75 +1209,72 @@ gboolean mm_huawei_parse_nwtime_response (const gchar *response,
g_propagate_error (error, match_error);
g_prefix_error (error, "Could not parse ^NWTIME results: ");
} else {
- g_set_error_literal (error,
- MM_CORE_ERROR,
- MM_CORE_ERROR_FAILED,
+ g_set_error_literal (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
"Couldn't match ^NWTIME reply");
}
- } else {
- /* Remember that g_match_info_get_match_count() includes match #0 */
- g_assert (g_match_info_get_match_count (match_info) >= 9);
-
- if (mm_get_uint_from_match_info (match_info, 1, &year) &&
- mm_get_uint_from_match_info (match_info, 2, &month) &&
- mm_get_uint_from_match_info (match_info, 3, &day) &&
- mm_get_uint_from_match_info (match_info, 4, &hour) &&
- mm_get_uint_from_match_info (match_info, 5, &minute) &&
- mm_get_uint_from_match_info (match_info, 6, &second) &&
- mm_get_int_from_match_info (match_info, 7, &tz) &&
- mm_get_uint_from_match_info (match_info, 8, &dt)) {
-
- ret = TRUE;
-
- /* adjust year */
- if (year < 100)
- year += 2000;
- /*
- * tz = timezone offset in 15 minute intervals
- * dt = daylight adjustment, 0 = none, 1 = 1 hour, 2 = 2 hours
- * other values are marked reserved.
- */
- if (iso8601p) {
- /* Return ISO-8601 format date/time string */
- *iso8601p = mm_new_iso8601_time (year, month, day, hour,
- minute, second,
- TRUE, (tz * 15) + (dt * 60),
- error);
- ret = (*iso8601p != NULL);
- }
- if (tzp) {
- *tzp = mm_network_timezone_new ();
- mm_network_timezone_set_offset (*tzp, tz * 15);
- mm_network_timezone_set_dst_offset (*tzp, dt * 60);
- }
+ return FALSE;
+ }
- } else {
- g_set_error_literal (error,
- MM_CORE_ERROR,
- MM_CORE_ERROR_FAILED,
- "Failed to parse ^NWTIME reply");
+ /* Remember that g_match_info_get_match_count() includes match #0 */
+ g_assert (g_match_info_get_match_count (match_info) >= 9);
+
+ if (mm_get_uint_from_match_info (match_info, 1, &year) &&
+ mm_get_uint_from_match_info (match_info, 2, &month) &&
+ mm_get_uint_from_match_info (match_info, 3, &day) &&
+ mm_get_uint_from_match_info (match_info, 4, &hour) &&
+ mm_get_uint_from_match_info (match_info, 5, &minute) &&
+ mm_get_uint_from_match_info (match_info, 6, &second) &&
+ mm_get_int_from_match_info (match_info, 7, &tz) &&
+ mm_get_uint_from_match_info (match_info, 8, &dt)) {
+
+ /* adjust year */
+ if (year < 100)
+ year += 2000;
+ /*
+ * tz = timezone offset in 15 minute intervals
+ * dt = daylight adjustment, 0 = none, 1 = 1 hour, 2 = 2 hours
+ * other values are marked reserved.
+ */
+ if (tzp) {
+ *tzp = mm_network_timezone_new ();
+ mm_network_timezone_set_offset (*tzp, tz * 15);
+ mm_network_timezone_set_dst_offset (*tzp, dt * 60);
+ }
+ if (iso8601p) {
+ /* Return ISO-8601 format date/time string */
+ *iso8601p = mm_new_iso8601_time (year, month, day, hour,
+ minute, second,
+ TRUE, (tz * 15) + (dt * 60),
+ error);
+ return (*iso8601p != NULL);
}
- }
- g_match_info_free (match_info);
- g_regex_unref (r);
+ return TRUE;
+ }
- return ret;
+ g_set_error_literal (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "Failed to parse ^NWTIME reply");
+ return FALSE;
}
/*****************************************************************************/
/* ^TIME response parser */
-gboolean mm_huawei_parse_time_response (const gchar *response,
- gchar **iso8601p,
- MMNetworkTimezone **tzp,
- GError **error)
+gboolean
+mm_huawei_parse_time_response (const gchar *response,
+ gchar **iso8601p,
+ MMNetworkTimezone **tzp,
+ GError **error)
{
- GRegex *r;
- GMatchInfo *match_info = NULL;
- GError *match_error = NULL;
- guint year, month, day, hour, minute, second;
- gboolean ret = FALSE;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *match_error = NULL;
+ guint year = 0;
+ guint month = 0;
+ guint day = 0;
+ guint hour = 0;
+ guint minute = 0;
+ guint second = 0;
g_assert (iso8601p || tzp); /* at least one */
@@ -1306,41 +1301,35 @@ gboolean mm_huawei_parse_time_response (const gchar *response,
MM_CORE_ERROR_FAILED,
"Couldn't match ^TIME reply");
}
- } else {
- /* Remember that g_match_info_get_match_count() includes match #0 */
- g_assert (g_match_info_get_match_count (match_info) >= 7);
-
- if (mm_get_uint_from_match_info (match_info, 1, &year) &&
- mm_get_uint_from_match_info (match_info, 2, &month) &&
- mm_get_uint_from_match_info (match_info, 3, &day) &&
- mm_get_uint_from_match_info (match_info, 4, &hour) &&
- mm_get_uint_from_match_info (match_info, 5, &minute) &&
- mm_get_uint_from_match_info (match_info, 6, &second)) {
- ret = TRUE;
-
- /* adjust year */
- if (year < 100)
- year += 2000;
+ return FALSE;
+ }
- /* Return ISO-8601 format date/time string */
- if (iso8601p) {
- *iso8601p = mm_new_iso8601_time (year, month, day, hour,
- minute, second, FALSE, 0,
- error);
- ret = (*iso8601p != NULL);
- }
- } else {
- g_set_error_literal (error,
- MM_CORE_ERROR,
- MM_CORE_ERROR_FAILED,
- "Failed to parse ^TIME reply");
+ /* Remember that g_match_info_get_match_count() includes match #0 */
+ g_assert (g_match_info_get_match_count (match_info) >= 7);
+
+ if (mm_get_uint_from_match_info (match_info, 1, &year) &&
+ mm_get_uint_from_match_info (match_info, 2, &month) &&
+ mm_get_uint_from_match_info (match_info, 3, &day) &&
+ mm_get_uint_from_match_info (match_info, 4, &hour) &&
+ mm_get_uint_from_match_info (match_info, 5, &minute) &&
+ mm_get_uint_from_match_info (match_info, 6, &second)) {
+ /* adjust year */
+ if (year < 100)
+ year += 2000;
+
+ /* Return ISO-8601 format date/time string */
+ if (iso8601p) {
+ *iso8601p = mm_new_iso8601_time (year, month, day, hour,
+ minute, second, FALSE, 0,
+ error);
+ return (*iso8601p != NULL);
}
+ return TRUE;
}
- g_match_info_free (match_info);
- g_regex_unref (r);
-
- return ret;
+ g_set_error_literal (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "Failed to parse ^TIME reply");
+ return FALSE;
}
/*****************************************************************************/
@@ -1356,11 +1345,9 @@ mm_huawei_parse_hcsq_response (const gchar *response,
guint *out_value5,
GError **error)
{
- GRegex *r;
- GMatchInfo *match_info = NULL;
- GError *match_error = NULL;
- gboolean ret = FALSE;
- char *s;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *match_error = NULL;
r = g_regex_new ("\\^HCSQ:\\s*\"?([a-zA-Z]*)\"?,(\\d+),?(\\d+)?,?(\\d+)?,?(\\d+)?,?(\\d+)?$", 0, 0, NULL);
g_assert (r != NULL);
@@ -1370,27 +1357,24 @@ mm_huawei_parse_hcsq_response (const gchar *response,
g_propagate_error (error, match_error);
g_prefix_error (error, "Could not parse ^HCSQ results: ");
} else {
- g_set_error_literal (error,
- MM_CORE_ERROR,
- MM_CORE_ERROR_FAILED,
+ g_set_error_literal (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
"Couldn't match ^HCSQ reply");
}
- goto done;
+ return FALSE;
}
/* Remember that g_match_info_get_match_count() includes match #0 */
if (g_match_info_get_match_count (match_info) < 3) {
- g_set_error_literal (error,
- MM_CORE_ERROR,
- MM_CORE_ERROR_FAILED,
+ g_set_error_literal (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
"Not enough elements in ^HCSQ reply");
- goto done;
+ return FALSE;
}
if (out_act) {
+ g_autofree gchar *s = NULL;
+
s = g_match_info_fetch (match_info, 1);
*out_act = mm_string_to_access_tech (s);
- g_free (s);
}
if (out_value1)
@@ -1404,13 +1388,7 @@ mm_huawei_parse_hcsq_response (const gchar *response,
if (out_value5)
mm_get_uint_from_match_info (match_info, 6, out_value5);
- ret = TRUE;
-
-done:
- g_match_info_free (match_info);
- g_regex_unref (r);
-
- return ret;
+ return TRUE;
}
/*****************************************************************************/
@@ -1422,11 +1400,12 @@ mm_huawei_parse_cvoice_response (const gchar *response,
guint *out_bits,
GError **error)
{
- GRegex *r;
- GMatchInfo *match_info = NULL;
- GError *match_error = NULL;
- guint supported = 0, hz = 0, bits = 0;
- gboolean ret = FALSE;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *match_error = NULL;
+ guint supported = 0;
+ guint hz = 0;
+ guint bits = 0;
/* ^CVOICE: <0=supported,1=unsupported>,<hz>,<bits>,<unknown> */
r = g_regex_new ("\\^CVOICE:\\s*(\\d)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)$", 0, 0, NULL);
@@ -1442,37 +1421,31 @@ mm_huawei_parse_cvoice_response (const gchar *response,
MM_CORE_ERROR_FAILED,
"Couldn't match ^CVOICE reply");
}
- } else {
- /* Remember that g_match_info_get_match_count() includes match #0 */
- g_assert (g_match_info_get_match_count (match_info) >= 5);
-
- if (mm_get_uint_from_match_info (match_info, 1, &supported) &&
- mm_get_uint_from_match_info (match_info, 2, &hz) &&
- mm_get_uint_from_match_info (match_info, 3, &bits)) {
- if (supported == 0) {
- if (out_hz)
- *out_hz = hz;
- if (out_bits)
- *out_bits = bits;
- ret = TRUE;
- } else {
- g_set_error_literal (error,
- MM_CORE_ERROR,
- MM_CORE_ERROR_UNSUPPORTED,
- "^CVOICE not supported by this device");
- }
- } else {
- g_set_error_literal (error,
- MM_CORE_ERROR,
- MM_CORE_ERROR_FAILED,
- "Failed to parse ^CVOICE reply");
- }
+ return FALSE;
}
- g_match_info_free (match_info);
- g_regex_unref (r);
+ /* Remember that g_match_info_get_match_count() includes match #0 */
+ g_assert (g_match_info_get_match_count (match_info) >= 5);
+
+ if (mm_get_uint_from_match_info (match_info, 1, &supported) &&
+ mm_get_uint_from_match_info (match_info, 2, &hz) &&
+ mm_get_uint_from_match_info (match_info, 3, &bits)) {
+ if (supported == 0) {
+ if (out_hz)
+ *out_hz = hz;
+ if (out_bits)
+ *out_bits = bits;
+ return TRUE;
+ }
+
+ g_set_error_literal (error, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED,
+ "^CVOICE not supported by this device");
+ return FALSE;
+ }
- return ret;
+ g_set_error_literal (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "Failed to parse ^CVOICE reply");
+ return FALSE;
}
/*****************************************************************************/