aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-base-modem-at.c6
-rw-r--r--src/mm-base-modem-at.h24
-rw-r--r--src/mm-broadband-modem.c68
3 files changed, 62 insertions, 36 deletions
diff --git a/src/mm-base-modem-at.c b/src/mm-base-modem-at.c
index e1537af5..101c9549 100644
--- a/src/mm-base-modem-at.c
+++ b/src/mm-base-modem-at.c
@@ -616,3 +616,9 @@ mm_base_modem_at_command_raw (MMBaseModem *self,
{
_at_command (self, command, timeout, allow_cached, TRUE, callback, user_data);
}
+
+void
+mm_base_modem_at_command_alloc_clear (MMBaseModemAtCommandAlloc *command)
+{
+ g_free (command->command);
+}
diff --git a/src/mm-base-modem-at.h b/src/mm-base-modem-at.h
index e155c908..d92a0610 100644
--- a/src/mm-base-modem-at.h
+++ b/src/mm-base-modem-at.h
@@ -51,10 +51,10 @@ typedef gboolean (* MMBaseModemAtResponseProcessor) (MMBaseModem *self,
GVariant **result,
GError **result_error);
-/* Struct to configure AT command operations */
+/* Struct to configure AT command operations (constant) */
typedef struct {
/* The AT command */
- gchar *command;
+ const gchar *command;
/* Timeout of the command, in seconds */
guint timeout;
/* Flag to allow cached replies */
@@ -164,4 +164,24 @@ const gchar *mm_base_modem_at_command_full_finish (MMBaseModem *self,
GAsyncResult *res,
GError **error);
+/******************************************************************************/
+/* Support for MMBaseModemAtCommand with heap allocated contents */
+
+/* Exactly same format as MMBaseModemAtCommand, just without
+ * a constant command string. */
+typedef struct {
+ gchar *command;
+ guint timeout;
+ gboolean allow_cached;
+ MMBaseModemAtResponseProcessor response_processor;
+} MMBaseModemAtCommandAlloc;
+
+G_STATIC_ASSERT (sizeof (MMBaseModemAtCommandAlloc) == sizeof (MMBaseModemAtCommand));
+G_STATIC_ASSERT (G_STRUCT_OFFSET (MMBaseModemAtCommandAlloc, command) == G_STRUCT_OFFSET (MMBaseModemAtCommand, command));
+G_STATIC_ASSERT (G_STRUCT_OFFSET (MMBaseModemAtCommandAlloc, timeout) == G_STRUCT_OFFSET (MMBaseModemAtCommand, timeout));
+G_STATIC_ASSERT (G_STRUCT_OFFSET (MMBaseModemAtCommandAlloc, allow_cached) == G_STRUCT_OFFSET (MMBaseModemAtCommand, allow_cached));
+G_STATIC_ASSERT (G_STRUCT_OFFSET (MMBaseModemAtCommandAlloc, response_processor) == G_STRUCT_OFFSET (MMBaseModemAtCommand, response_processor));
+
+void mm_base_modem_at_command_alloc_clear (MMBaseModemAtCommandAlloc *command);
+
#endif /* MM_BASE_MODEM_AT_H */
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index d512accc..4b81c6a3 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -675,10 +675,10 @@ parse_caps_cgmm (MMBaseModem *self,
}
static const MMBaseModemAtCommand capabilities[] = {
- { (gchar *)"+GCAP", 2, TRUE, parse_caps_gcap },
- { (gchar *)"I", 1, TRUE, parse_caps_gcap }, /* yes, really parse as +GCAP */
- { (gchar *)"+CPIN?", 1, FALSE, parse_caps_cpin },
- { (gchar *)"+CGMM", 1, TRUE, parse_caps_cgmm },
+ { "+GCAP", 2, TRUE, parse_caps_gcap },
+ { "I", 1, TRUE, parse_caps_gcap }, /* yes, really parse as +GCAP */
+ { "+CPIN?", 1, FALSE, parse_caps_cpin },
+ { "+CGMM", 1, TRUE, parse_caps_cgmm },
{ NULL }
};
@@ -926,8 +926,8 @@ modem_load_manufacturer_finish (MMIfaceModem *self,
}
static const MMBaseModemAtCommand manufacturers[] = {
- { (gchar *)"+CGMI", 3, TRUE, response_processor_string_ignore_at_errors },
- { (gchar *)"+GMI", 3, TRUE, response_processor_string_ignore_at_errors },
+ { "+CGMI", 3, TRUE, response_processor_string_ignore_at_errors },
+ { "+GMI", 3, TRUE, response_processor_string_ignore_at_errors },
{ NULL }
};
@@ -966,8 +966,8 @@ modem_load_model_finish (MMIfaceModem *self,
}
static const MMBaseModemAtCommand models[] = {
- { (gchar *)"+CGMM", 3, TRUE, response_processor_string_ignore_at_errors },
- { (gchar *)"+GMM", 3, TRUE, response_processor_string_ignore_at_errors },
+ { "+CGMM", 3, TRUE, response_processor_string_ignore_at_errors },
+ { "+GMM", 3, TRUE, response_processor_string_ignore_at_errors },
{ NULL }
};
@@ -1006,8 +1006,8 @@ modem_load_revision_finish (MMIfaceModem *self,
}
static const MMBaseModemAtCommand revisions[] = {
- { (gchar *)"+CGMR", 3, TRUE, response_processor_string_ignore_at_errors },
- { (gchar *)"+GMR", 3, TRUE, response_processor_string_ignore_at_errors },
+ { "+CGMR", 3, TRUE, response_processor_string_ignore_at_errors },
+ { "+GMR", 3, TRUE, response_processor_string_ignore_at_errors },
{ NULL }
};
@@ -1066,8 +1066,8 @@ modem_load_equipment_identifier_finish (MMIfaceModem *self,
}
static const MMBaseModemAtCommand equipment_identifiers[] = {
- { (gchar *)"+CGSN", 3, TRUE, response_processor_string_ignore_at_errors },
- { (gchar *)"+GSN", 3, TRUE, response_processor_string_ignore_at_errors },
+ { "+CGSN", 3, TRUE, response_processor_string_ignore_at_errors },
+ { "+GSN", 3, TRUE, response_processor_string_ignore_at_errors },
{ NULL }
};
@@ -1156,8 +1156,8 @@ parse_ati_reply (MMBaseModem *self,
}
static const MMBaseModemAtCommand device_identifier_steps[] = {
- { (gchar *)"ATI", 3, TRUE, (MMBaseModemAtResponseProcessor)parse_ati_reply },
- { (gchar *)"ATI1", 3, TRUE, (MMBaseModemAtResponseProcessor)parse_ati_reply },
+ { "ATI", 3, TRUE, (MMBaseModemAtResponseProcessor)parse_ati_reply },
+ { "ATI1", 3, TRUE, (MMBaseModemAtResponseProcessor)parse_ati_reply },
{ NULL }
};
@@ -2083,8 +2083,8 @@ signal_quality_csq_ready (MMBroadbandModem *self,
* try the other command if the first one fails.
*/
static const MMBaseModemAtCommand signal_quality_csq_sequence[] = {
- { (gchar *)"+CSQ", 3, FALSE, response_processor_string_ignore_at_errors },
- { (gchar *)"+CSQ?", 3, FALSE, response_processor_string_ignore_at_errors },
+ { "+CSQ", 3, FALSE, response_processor_string_ignore_at_errors },
+ { "+CSQ?", 3, FALSE, response_processor_string_ignore_at_errors },
{ NULL }
};
@@ -3600,14 +3600,14 @@ typedef struct {
* First one with quotes
* Second without.
* + last NUL */
- MMBaseModemAtCommand charset_commands[3];
+ MMBaseModemAtCommandAlloc charset_commands[3];
} SetupCharsetContext;
static void
setup_charset_context_free (SetupCharsetContext *ctx)
{
- g_free (ctx->charset_commands[0].command);
- g_free (ctx->charset_commands[1].command);
+ mm_base_modem_at_command_alloc_clear (&ctx->charset_commands[0]);
+ mm_base_modem_at_command_alloc_clear (&ctx->charset_commands[1]);
g_free (ctx);
}
@@ -3735,7 +3735,7 @@ modem_setup_charset (MMIfaceModem *self,
/* Launch sequence */
mm_base_modem_at_sequence (
MM_BASE_MODEM (self),
- ctx->charset_commands,
+ (const MMBaseModemAtCommand *)ctx->charset_commands,
NULL, /* response_processor_context */
NULL, /* response_processor_context_free */
(GAsyncReadyCallback)charset_change_ready,
@@ -5235,43 +5235,43 @@ parse_registration_setup_reply (MMBaseModem *self,
static const MMBaseModemAtCommand cs_registration_sequence[] = {
/* Enable unsolicited registration notifications in CS network, with location */
- { (gchar *)"+CREG=2", 3, FALSE, parse_registration_setup_reply },
+ { "+CREG=2", 3, FALSE, parse_registration_setup_reply },
/* Enable unsolicited registration notifications in CS network, without location */
- { (gchar *)"+CREG=1", 3, FALSE, parse_registration_setup_reply },
+ { "+CREG=1", 3, FALSE, parse_registration_setup_reply },
{ NULL }
};
static const MMBaseModemAtCommand cs_unregistration_sequence[] = {
/* Disable unsolicited registration notifications in CS network */
- { (gchar *)"+CREG=0", 3, FALSE, parse_registration_setup_reply },
+ { "+CREG=0", 3, FALSE, parse_registration_setup_reply },
{ NULL }
};
static const MMBaseModemAtCommand ps_registration_sequence[] = {
/* Enable unsolicited registration notifications in PS network, with location */
- { (gchar *)"+CGREG=2", 3, FALSE, parse_registration_setup_reply },
+ { "+CGREG=2", 3, FALSE, parse_registration_setup_reply },
/* Enable unsolicited registration notifications in PS network, without location */
- { (gchar *)"+CGREG=1", 3, FALSE, parse_registration_setup_reply },
+ { "+CGREG=1", 3, FALSE, parse_registration_setup_reply },
{ NULL }
};
static const MMBaseModemAtCommand ps_unregistration_sequence[] = {
/* Disable unsolicited registration notifications in PS network */
- { (gchar *)"+CGREG=0", 3, FALSE, parse_registration_setup_reply },
+ { "+CGREG=0", 3, FALSE, parse_registration_setup_reply },
{ NULL }
};
static const MMBaseModemAtCommand eps_registration_sequence[] = {
/* Enable unsolicited registration notifications in EPS network, with location */
- { (gchar *)"+CEREG=2", 3, FALSE, parse_registration_setup_reply },
+ { "+CEREG=2", 3, FALSE, parse_registration_setup_reply },
/* Enable unsolicited registration notifications in EPS network, without location */
- { (gchar *)"+CEREG=1", 3, FALSE, parse_registration_setup_reply },
+ { "+CEREG=1", 3, FALSE, parse_registration_setup_reply },
{ NULL }
};
static const MMBaseModemAtCommand eps_unregistration_sequence[] = {
/* Disable unsolicited registration notifications in PS network */
- { (gchar *)"+CEREG=0", 3, FALSE, parse_registration_setup_reply },
+ { "+CEREG=0", 3, FALSE, parse_registration_setup_reply },
{ NULL }
};
@@ -7039,16 +7039,16 @@ cnmi_response_processor (MMBaseModem *self,
}
static const MMBaseModemAtCommand cnmi_sequence[] = {
- { (gchar *)"+CNMI=2,1,2,1,0", 3, FALSE, cnmi_response_processor },
+ { "+CNMI=2,1,2,1,0", 3, FALSE, cnmi_response_processor },
/* Many Qualcomm-based devices don't support <ds> of '1', despite
* reporting they support it in the +CNMI=? response. But they do
* accept '2'.
*/
- { (gchar *)"+CNMI=2,1,2,2,0", 3, FALSE, cnmi_response_processor },
+ { "+CNMI=2,1,2,2,0", 3, FALSE, cnmi_response_processor },
/* Last resort: turn off delivery status reports altogether */
- { (gchar *)"+CNMI=2,1,2,0,0", 3, FALSE, cnmi_response_processor },
+ { "+CNMI=2,1,2,0,0", 3, FALSE, cnmi_response_processor },
{ NULL }
};
@@ -9881,8 +9881,8 @@ modem_time_load_network_timezone (MMIfaceModemTime *self,
/* Check support (Time interface) */
static const MMBaseModemAtCommand time_check_sequence[] = {
- { (gchar *)"+CTZU=1", 3, TRUE, mm_base_modem_response_processor_no_result_continue },
- { (gchar *)"+CCLK?", 3, TRUE, mm_base_modem_response_processor_string },
+ { "+CTZU=1", 3, TRUE, mm_base_modem_response_processor_no_result_continue },
+ { "+CCLK?", 3, TRUE, mm_base_modem_response_processor_string },
{ NULL }
};