aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/mm-modem-gobi-gsm.c11
-rw-r--r--plugins/mm-modem-huawei-gsm.c76
-rw-r--r--plugins/mm-modem-mbm.c29
-rw-r--r--plugins/mm-modem-option.c24
-rw-r--r--plugins/mm-modem-sierra-gsm.c21
-rw-r--r--plugins/mm-modem-zte.c36
-rw-r--r--src/mm-generic-gsm.c161
-rw-r--r--src/mm-generic-gsm.h3
8 files changed, 197 insertions, 164 deletions
diff --git a/plugins/mm-modem-gobi-gsm.c b/plugins/mm-modem-gobi-gsm.c
index 566d0c82..3b9e9ece 100644
--- a/plugins/mm-modem-gobi-gsm.c
+++ b/plugins/mm-modem-gobi-gsm.c
@@ -76,13 +76,16 @@ get_imsi (MMModemGsmCard *modem,
MMModemStringFn callback,
gpointer user_data)
{
- MMAtSerialPort *primary;
+ MMAtSerialPort *port;
MMCallbackInfo *info;
info = mm_callback_info_string_new (MM_MODEM (modem), callback, user_data);
- primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY);
- g_assert (primary);
- mm_at_serial_port_queue_command_cached (primary, "+CIMI", 3, get_string_done, info);
+
+ port = mm_generic_gsm_get_best_at_port (MM_GENERIC_GSM (modem), &info->error);
+ if (port)
+ mm_at_serial_port_queue_command_cached (port, "+CIMI", 3, get_string_done, info);
+ else
+ mm_callback_info_schedule (info);
}
static void
diff --git a/plugins/mm-modem-huawei-gsm.c b/plugins/mm-modem-huawei-gsm.c
index 87cda359..619fe375 100644
--- a/plugins/mm-modem-huawei-gsm.c
+++ b/plugins/mm-modem-huawei-gsm.c
@@ -174,26 +174,17 @@ set_allowed_mode (MMGenericGsm *gsm,
gpointer user_data)
{
MMCallbackInfo *info;
- MMAtSerialPort *port, *primary, *secondary;
+ MMAtSerialPort *port;
int a, b;
char *command;
info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data);
- port = primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY);
- if (mm_port_get_connected (MM_PORT (primary))) {
- secondary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_SECONDARY);
- if (!secondary) {
- info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED,
- "Cannot set allowed mode while connected");
- mm_callback_info_schedule (info);
- return;
- }
-
- /* Use secondary port if primary is connected */
- port = secondary;
+ port = mm_generic_gsm_get_best_at_port (gsm, &info->error);
+ if (!port) {
+ mm_callback_info_schedule (info);
+ return;
}
- g_assert (port);
switch (mode) {
case MM_MODEM_GSM_ALLOWED_MODE_2G_ONLY:
@@ -250,12 +241,17 @@ get_allowed_mode (MMGenericGsm *gsm,
gpointer user_data)
{
MMCallbackInfo *info;
- MMAtSerialPort *primary;
+ MMAtSerialPort *port;
info = mm_callback_info_uint_new (MM_MODEM (gsm), callback, user_data);
- primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY);
- g_assert (primary);
- mm_at_serial_port_queue_command (primary, "AT^SYSCFG?", 3, get_allowed_mode_done, info);
+
+ port = mm_generic_gsm_get_best_at_port (gsm, &info->error);
+ if (!port) {
+ mm_callback_info_schedule (info);
+ return;
+ }
+
+ mm_at_serial_port_queue_command (port, "AT^SYSCFG?", 3, get_allowed_mode_done, info);
}
static void
@@ -285,24 +281,16 @@ set_band (MMModemGsmNetwork *modem,
gpointer user_data)
{
MMCallbackInfo *info;
- MMAtSerialPort *port, *primary, *secondary;
+ MMAtSerialPort *port;
char *command;
guint32 huawei_band = 0x3FFFFFFF;
info = mm_callback_info_new (MM_MODEM (modem), callback, user_data);
- port = primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY);
- if (mm_port_get_connected (MM_PORT (primary))) {
- secondary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_SECONDARY);
- if (!secondary) {
- info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED,
- "Cannot set band while connected");
- mm_callback_info_schedule (info);
- return;
- }
-
- /* Use secondary port if primary is connected */
- port = secondary;
+ port = mm_generic_gsm_get_best_at_port (MM_GENERIC_GSM (modem), &info->error);
+ if (!port) {
+ mm_callback_info_schedule (info);
+ return;
}
if (!band_mm_to_huawei (band, &huawei_band)) {
@@ -345,27 +333,29 @@ get_band (MMModemGsmNetwork *modem,
gpointer user_data)
{
MMModemHuaweiGsmPrivate *priv = MM_MODEM_HUAWEI_GSM_GET_PRIVATE (modem);
- MMAtSerialPort *primary;
+ MMAtSerialPort *port;
+ MMCallbackInfo *info;
+ info = mm_callback_info_uint_new (MM_MODEM (modem), callback, user_data);
+
+ /* Prefer cached band from unsolicited messages if we have it */
if (priv->band != 0) {
- /* have cached band (from an unsolicited message). Use that */
- MMCallbackInfo *info;
MMModemGsmBand mm_band = MM_MODEM_GSM_BAND_ANY;
band_huawei_to_mm (priv->band, &mm_band);
-
- info = mm_callback_info_uint_new (MM_MODEM (modem), callback, user_data);
mm_callback_info_set_result (info, GUINT_TO_POINTER (mm_band), NULL);
mm_callback_info_schedule (info);
- } else {
- /* Get it from modem */
- MMCallbackInfo *info;
+ return;
+ }
- info = mm_callback_info_uint_new (MM_MODEM (modem), callback, user_data);
- primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY);
- g_assert (primary);
- mm_at_serial_port_queue_command (primary, "AT^SYSCFG?", 3, get_band_done, info);
+ /* Otherwise ask the modem */
+ port = mm_generic_gsm_get_best_at_port (MM_GENERIC_GSM (modem), &info->error);
+ if (!port) {
+ mm_callback_info_schedule (info);
+ return;
}
+
+ mm_at_serial_port_queue_command (port, "AT^SYSCFG?", 3, get_band_done, info);
}
/* Unsolicited message handlers */
diff --git a/plugins/mm-modem-mbm.c b/plugins/mm-modem-mbm.c
index 49442224..13c5b9ba 100644
--- a/plugins/mm-modem-mbm.c
+++ b/plugins/mm-modem-mbm.c
@@ -111,13 +111,9 @@ register_done (gpointer user_data)
MMModemMbm *self = MM_MODEM_MBM (reg_data->modem);
MMModemMbmPrivate *priv = MM_MODEM_MBM_GET_PRIVATE (self);
MMModemGsmNetwork *parent_modem_iface;
- MMAtSerialPort *primary;
priv->reg_id = 0;
- primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_PORT_TYPE_PRIMARY);
- g_assert (primary);
-
parent_modem_iface = g_type_interface_peek_parent (MM_MODEM_GSM_NETWORK_GET_INTERFACE (self));
parent_modem_iface->do_register (MM_MODEM_GSM_NETWORK (self),
reg_data->network_id,
@@ -189,14 +185,18 @@ set_allowed_mode (MMGenericGsm *gsm,
{
MMCallbackInfo *info;
char *command;
- MMAtSerialPort *primary;
+ MMAtSerialPort *port;
info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data);
- primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY);
- g_assert (primary);
+
+ port = mm_generic_gsm_get_best_at_port (gsm, &info->error);
+ if (!port) {
+ mm_callback_info_schedule (info);
+ return;
+ }
command = g_strdup_printf ("+CFUN=%d", mbm_parse_allowed_mode (mode));
- mm_at_serial_port_queue_command (primary, command, 3, mbm_set_allowed_mode_done, info);
+ mm_at_serial_port_queue_command (port, command, 3, mbm_set_allowed_mode_done, info);
g_free (command);
}
@@ -280,12 +280,17 @@ get_allowed_mode (MMGenericGsm *gsm,
gpointer user_data)
{
MMCallbackInfo *info;
- MMAtSerialPort *primary;
+ MMAtSerialPort *port;
info = mm_callback_info_uint_new (MM_MODEM (gsm), callback, user_data);
- primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY);
- g_assert (primary);
- mm_at_serial_port_queue_command (primary, "CFUN?", 3, get_allowed_mode_done, info);
+
+ port = mm_generic_gsm_get_best_at_port (gsm, &info->error);
+ if (!port) {
+ mm_callback_info_schedule (info);
+ return;
+ }
+
+ mm_at_serial_port_queue_command (port, "CFUN?", 3, get_allowed_mode_done, info);
}
/*****************************************************************************/
diff --git a/plugins/mm-modem-option.c b/plugins/mm-modem-option.c
index 42cd927c..6c9dfe1d 100644
--- a/plugins/mm-modem-option.c
+++ b/plugins/mm-modem-option.c
@@ -138,12 +138,16 @@ get_allowed_mode (MMGenericGsm *gsm,
gpointer user_data)
{
MMCallbackInfo *info;
- MMAtSerialPort *primary;
+ MMAtSerialPort *port;
info = mm_callback_info_uint_new (MM_MODEM (gsm), callback, user_data);
- primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY);
- g_assert (primary);
- mm_at_serial_port_queue_command (primary, "AT_OPSYS?", 3, get_allowed_mode_done, info);
+
+ port = mm_generic_gsm_get_best_at_port (gsm, &info->error);
+ if (!port) {
+ mm_callback_info_schedule (info);
+ return;
+ }
+ mm_at_serial_port_queue_command (port, "AT_OPSYS?", 3, get_allowed_mode_done, info);
}
static void
@@ -167,12 +171,18 @@ set_allowed_mode (MMGenericGsm *gsm,
gpointer user_data)
{
MMCallbackInfo *info;
- MMAtSerialPort *primary;
+ MMAtSerialPort *port;
char *command;
int i;
info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data);
+ port = mm_generic_gsm_get_best_at_port (gsm, &info->error);
+ if (!port) {
+ mm_callback_info_schedule (info);
+ return;
+ }
+
switch (mode) {
case MM_MODEM_GSM_ALLOWED_MODE_2G_ONLY:
i = 0;
@@ -193,9 +203,7 @@ set_allowed_mode (MMGenericGsm *gsm,
}
command = g_strdup_printf ("AT_OPSYS=%d,2", i);
- primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY);
- g_assert (primary);
- mm_at_serial_port_queue_command (primary, command, 3, set_allowed_mode_done, info);
+ mm_at_serial_port_queue_command (port, command, 3, set_allowed_mode_done, info);
g_free (command);
}
diff --git a/plugins/mm-modem-sierra-gsm.c b/plugins/mm-modem-sierra-gsm.c
index e11f64f5..6bbead9c 100644
--- a/plugins/mm-modem-sierra-gsm.c
+++ b/plugins/mm-modem-sierra-gsm.c
@@ -122,8 +122,16 @@ get_allowed_mode (MMGenericGsm *gsm,
MMAtSerialPort *primary;
info = mm_callback_info_uint_new (MM_MODEM (gsm), callback, user_data);
+
+ /* Sierra secondary ports don't have full AT command interpreters */
primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY);
- g_assert (primary);
+ if (!primary || mm_port_get_connected (MM_PORT (primary))) {
+ g_set_error_literal (&info->error, MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED,
+ "Cannot perform this operation while connected");
+ mm_callback_info_schedule (info);
+ return;
+ }
+
mm_at_serial_port_queue_command (primary, "!SELRAT?", 3, get_allowed_mode_done, info);
}
@@ -154,6 +162,15 @@ set_allowed_mode (MMGenericGsm *gsm,
info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data);
+ /* Sierra secondary ports don't have full AT command interpreters */
+ primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY);
+ if (!primary || mm_port_get_connected (MM_PORT (primary))) {
+ g_set_error_literal (&info->error, MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED,
+ "Cannot perform this operation while connected");
+ mm_callback_info_schedule (info);
+ return;
+ }
+
switch (mode) {
case MM_MODEM_GSM_ALLOWED_MODE_2G_ONLY:
idx = 2;
@@ -173,8 +190,6 @@ set_allowed_mode (MMGenericGsm *gsm,
}
command = g_strdup_printf ("!SELRAT=%d", idx);
- primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY);
- g_assert (primary);
mm_at_serial_port_queue_command (primary, command, 3, set_allowed_mode_done, info);
g_free (command);
}
diff --git a/plugins/mm-modem-zte.c b/plugins/mm-modem-zte.c
index 67d6ead5..d5aa5f31 100644
--- a/plugins/mm-modem-zte.c
+++ b/plugins/mm-modem-zte.c
@@ -159,12 +159,17 @@ get_allowed_mode (MMGenericGsm *gsm,
gpointer user_data)
{
MMCallbackInfo *info;
- MMAtSerialPort *primary;
+ MMAtSerialPort *port;
info = mm_callback_info_uint_new (MM_MODEM (gsm), callback, user_data);
- primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY);
- g_assert (primary);
- mm_at_serial_port_queue_command (primary, "AT+ZSNT?", 3, get_allowed_mode_done, info);
+
+ port = mm_generic_gsm_get_best_at_port (gsm, &info->error);
+ if (!port) {
+ mm_callback_info_schedule (info);
+ return;
+ }
+
+ mm_at_serial_port_queue_command (port, "AT+ZSNT?", 3, get_allowed_mode_done, info);
}
static void
@@ -188,12 +193,18 @@ set_allowed_mode (MMGenericGsm *gsm,
gpointer user_data)
{
MMCallbackInfo *info;
- MMAtSerialPort *primary;
+ MMAtSerialPort *port;
char *command;
int cm_mode = 0, pref_acq = 0;
info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data);
+ port = mm_generic_gsm_get_best_at_port (gsm, &info->error);
+ if (!port) {
+ mm_callback_info_schedule (info);
+ return;
+ }
+
switch (mode) {
case MM_MODEM_GSM_ALLOWED_MODE_2G_ONLY:
cm_mode = 1;
@@ -217,9 +228,7 @@ set_allowed_mode (MMGenericGsm *gsm,
}
command = g_strdup_printf ("AT+ZSNT=%d,0,%d", cm_mode, pref_acq);
- primary = mm_generic_gsm_get_at_port (gsm, MM_PORT_TYPE_PRIMARY);
- g_assert (primary);
- mm_at_serial_port_queue_command (primary, command, 3, set_allowed_mode_done, info);
+ mm_at_serial_port_queue_command (port, command, 3, set_allowed_mode_done, info);
g_free (command);
}
@@ -237,13 +246,14 @@ cpms_timeout_cb (gpointer user_data)
{
MMCallbackInfo *info = user_data;
MMModem *modem = info->modem;
- MMModemZtePrivate *priv = MM_MODEM_ZTE_GET_PRIVATE (modem);
MMAtSerialPort *primary;
- priv->cpms_timeout = 0;
-
- primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY);
- mm_at_serial_port_queue_command (primary, "+CPMS?", 10, cpms_try_done, info);
+ if (modem) {
+ MM_MODEM_ZTE_GET_PRIVATE (modem)->cpms_timeout = 0;
+ primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY);
+ g_assert (primary);
+ mm_at_serial_port_queue_command (primary, "+CPMS?", 10, cpms_try_done, info);
+ }
return FALSE;
}
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c
index a398b8f7..67554c5f 100644
--- a/src/mm-generic-gsm.c
+++ b/src/mm-generic-gsm.c
@@ -517,15 +517,11 @@ periodic_poll_cb (gpointer user_data)
{
MMGenericGsm *self = MM_GENERIC_GSM (user_data);
MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (self);
- MMAtSerialPort *port = priv->primary;
+ MMAtSerialPort *port;
- if (mm_port_get_connected (MM_PORT (priv->primary))) {
- if (!priv->secondary)
- return TRUE; /* oh well, try later */
-
- /* Use secondary port if primary is connected */
- port = priv->secondary;
- }
+ port = mm_generic_gsm_get_best_at_port (self, NULL);
+ if (!port)
+ return TRUE; /* oh well, try later */
if (priv->creg_poll)
mm_at_serial_port_queue_command (port, "+CREG?", 10, reg_poll_response, self);
@@ -1162,7 +1158,8 @@ get_card_info (MMModem *modem,
mm_at_serial_port_queue_command_cached (priv->primary, "+CGMR", 3, get_version_done, info);
}
-#define PIN_CLOSE_PORT_TAG "close-port"
+#define PIN_CLOSE_PORT_TAG "pin-close-port"
+#define PIN_PORT_TAG "pin-port"
static void
pin_puk_recheck_done (MMModem *modem, GError *error, gpointer user_data)
@@ -1176,10 +1173,10 @@ pin_puk_recheck_done (MMModem *modem, GError *error, gpointer user_data)
info->error = mm_modem_check_removed (modem, error);
if (modem && close_port) {
- MMSerialPort *port;
+ MMSerialPort *port = mm_callback_info_get_data (info, PIN_PORT_TAG);
- port = MM_SERIAL_PORT (MM_GENERIC_GSM_GET_PRIVATE (modem)->primary);
- mm_serial_port_close (port);
+ if (port && MM_IS_SERIAL_PORT (port))
+ mm_serial_port_close (port);
}
mm_callback_info_schedule (info);
@@ -1213,36 +1210,35 @@ send_puk (MMModemGsmCard *modem,
MMModemFn callback,
gpointer user_data)
{
- MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (modem);
MMCallbackInfo *info;
char *command;
- gboolean connected;
+ MMAtSerialPort *port;
info = mm_callback_info_new (MM_MODEM (modem), callback, user_data);
- connected = mm_port_get_connected (MM_PORT (priv->primary));
- if (connected && !priv->secondary) {
- /* Ensure we have a usable port to use for the unlock */
- info->error = g_error_new_literal (MM_MODEM_ERROR,
- MM_MODEM_ERROR_CONNECTED,
- "Cannot unlock device while connected");
+ /* Ensure we have a usable port to use for the unlock */
+ port = mm_generic_gsm_get_best_at_port (MM_GENERIC_GSM (modem), &info->error);
+ if (!port) {
mm_callback_info_schedule (info);
return;
- } else if (!mm_serial_port_is_open (MM_SERIAL_PORT (priv->primary))) {
+ }
+
+ if (!mm_serial_port_is_open (MM_SERIAL_PORT (port))) {
/* Modem may not be enabled yet, which sometimes can't be done until
* the device has been unlocked.
*/
- if (!mm_serial_port_open (MM_SERIAL_PORT (priv->primary), &info->error)) {
+ if (!mm_serial_port_open (MM_SERIAL_PORT (port), &info->error)) {
mm_callback_info_schedule (info);
return;
}
/* Clean up after ourselves if we opened the port */
mm_callback_info_set_data (info, PIN_CLOSE_PORT_TAG, GUINT_TO_POINTER (TRUE), NULL);
+ mm_callback_info_set_data (info, PIN_PORT_TAG, port, NULL);
}
command = g_strdup_printf ("+CPIN=\"%s\",\"%s\"", puk, pin);
- mm_at_serial_port_queue_command (connected ? priv->secondary : priv->primary, command, 3, send_puk_done, info);
+ mm_at_serial_port_queue_command (port, command, 3, send_puk_done, info);
g_free (command);
}
@@ -1273,36 +1269,35 @@ send_pin (MMModemGsmCard *modem,
MMModemFn callback,
gpointer user_data)
{
- MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (modem);
MMCallbackInfo *info;
char *command;
- gboolean connected;
+ MMAtSerialPort *port;
info = mm_callback_info_new (MM_MODEM (modem), callback, user_data);
- connected = mm_port_get_connected (MM_PORT (priv->primary));
- if (connected && !priv->secondary) {
- /* Ensure we have a usable port to use for the unlock */
- info->error = g_error_new_literal (MM_MODEM_ERROR,
- MM_MODEM_ERROR_CONNECTED,
- "Cannot unlock device while connected");
+ /* Ensure we have a usable port to use for the unlock */
+ port = mm_generic_gsm_get_best_at_port (MM_GENERIC_GSM (modem), &info->error);
+ if (!port) {
mm_callback_info_schedule (info);
return;
- } else if (!mm_serial_port_is_open (MM_SERIAL_PORT (priv->primary))) {
+ }
+
+ if (!mm_serial_port_is_open (MM_SERIAL_PORT (port))) {
/* Modem may not be enabled yet, which sometimes can't be done until
* the device has been unlocked.
*/
- if (!mm_serial_port_open (MM_SERIAL_PORT (priv->primary), &info->error)) {
+ if (!mm_serial_port_open (MM_SERIAL_PORT (port), &info->error)) {
mm_callback_info_schedule (info);
return;
}
/* Clean up after ourselves if we opened the port */
mm_callback_info_set_data (info, PIN_CLOSE_PORT_TAG, GUINT_TO_POINTER (TRUE), NULL);
+ mm_callback_info_set_data (info, PIN_PORT_TAG, port, NULL);
}
command = g_strdup_printf ("+CPIN=\"%s\"", pin);
- mm_at_serial_port_queue_command (connected ? priv->secondary : priv->primary, command, 3, send_pin_done, info);
+ mm_at_serial_port_queue_command (port, command, 3, send_pin_done, info);
g_free (command);
}
@@ -2455,16 +2450,18 @@ get_signal_quality (MMModemGsmNetwork *modem,
{
MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (modem);
MMCallbackInfo *info;
- gboolean connected;
-
- connected = mm_port_get_connected (MM_PORT (priv->primary));
- if (connected && !priv->secondary) {
- callback (MM_MODEM (modem), priv->signal_quality, NULL, user_data);
- return;
- }
+ MMAtSerialPort *port;
info = mm_callback_info_uint_new (MM_MODEM (modem), callback, user_data);
- mm_at_serial_port_queue_command (connected ? priv->secondary : priv->primary, "+CSQ", 3, get_signal_quality_done, info);
+
+ port = mm_generic_gsm_get_best_at_port (MM_GENERIC_GSM (modem), NULL);
+ if (port)
+ mm_at_serial_port_queue_command (port, "+CSQ", 3, get_signal_quality_done, info);
+ else {
+ /* Use cached signal quality */
+ mm_callback_info_set_result (info, GUINT_TO_POINTER (priv->signal_quality), NULL);
+ mm_callback_info_schedule (info);
+ }
}
/*****************************************************************************/
@@ -2671,28 +2668,25 @@ get_supported_charsets (MMModem *modem,
MMGenericGsm *self = MM_GENERIC_GSM (modem);
MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (self);
MMCallbackInfo *info;
- MMAtSerialPort *port = priv->primary;
+ MMAtSerialPort *port;
info = mm_callback_info_uint_new (MM_MODEM (self), callback, user_data);
- if (mm_port_get_connected (MM_PORT (priv->primary))) {
- if (!priv->secondary) {
- info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED,
- "Cannot get serving system while connected");
- mm_callback_info_schedule (info);
- return;
- }
-
- /* Use secondary port if primary is connected */
- port = priv->secondary;
- }
-
/* Use cached value if we have one */
- if (MM_GENERIC_GSM_GET_PRIVATE (self)->charsets) {
+ if (priv->charsets) {
mm_callback_info_set_result (info, GUINT_TO_POINTER (priv->charsets), NULL);
mm_callback_info_schedule (info);
- } else
- mm_at_serial_port_queue_command (port, "+CSCS=?", 3, get_charsets_done, info);
+ return;
+ }
+
+ /* Otherwise hit up the modem */
+ port = mm_generic_gsm_get_best_at_port (self, &info->error);
+ if (!port) {
+ mm_callback_info_schedule (info);
+ return;
+ }
+
+ mm_at_serial_port_queue_command (port, "+CSCS=?", 3, get_charsets_done, info);
}
static void
@@ -2793,7 +2787,7 @@ set_charset (MMModem *modem,
MMCallbackInfo *info;
const char *str;
char *command;
- MMAtSerialPort *port = priv->primary;
+ MMAtSerialPort *port;
info = mm_callback_info_new (modem, callback, user_data);
@@ -2816,16 +2810,10 @@ set_charset (MMModem *modem,
return;
}
- if (mm_port_get_connected (MM_PORT (priv->primary))) {
- if (!priv->secondary) {
- info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED,
- "Cannot get set character set while connected");
- mm_callback_info_schedule (info);
- return;
- }
-
- /* Use secondary port if primary is connected */
- port = priv->secondary;
+ port = mm_generic_gsm_get_best_at_port (MM_GENERIC_GSM (modem), &info->error);
+ if (!port) {
+ mm_callback_info_schedule (info);
+ return;
}
mm_callback_info_set_data (info, "charset", GUINT_TO_POINTER (charset), NULL);
@@ -2871,24 +2859,14 @@ sms_send (MMModemGsmSms *modem,
MMModemFn callback,
gpointer user_data)
{
- MMGenericGsmPrivate *priv;
MMCallbackInfo *info;
char *command;
- gboolean connected;
- MMAtSerialPort *port = NULL;
+ MMAtSerialPort *port;
info = mm_callback_info_new (MM_MODEM (modem), callback, user_data);
- priv = MM_GENERIC_GSM_GET_PRIVATE (info->modem);
- connected = mm_port_get_connected (MM_PORT (priv->primary));
- if (connected)
- port = priv->secondary;
- else
- port = priv->primary;
-
+ port = mm_generic_gsm_get_best_at_port (MM_GENERIC_GSM (modem), &info->error);
if (!port) {
- info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED,
- "Cannot send SMS while connected");
mm_callback_info_schedule (info);
return;
}
@@ -2916,6 +2894,27 @@ mm_generic_gsm_get_at_port (MMGenericGsm *modem,
return NULL;
}
+MMAtSerialPort *
+mm_generic_gsm_get_best_at_port (MMGenericGsm *self, GError **error)
+{
+ MMGenericGsmPrivate *priv;
+
+ g_return_val_if_fail (self != NULL, NULL);
+ g_return_val_if_fail (MM_IS_GENERIC_GSM (self), NULL);
+
+ priv = MM_GENERIC_GSM_GET_PRIVATE (self);
+
+ if (!mm_port_get_connected (MM_PORT (priv->primary)))
+ return priv->primary;
+
+ if (!priv->secondary) {
+ g_set_error_literal (error, MM_MODEM_ERROR, MM_MODEM_ERROR_CONNECTED,
+ "Cannot perform this operation while connected");
+ }
+
+ return priv->secondary;
+}
+
/*****************************************************************************/
/* MMModemSimple interface */
diff --git a/src/mm-generic-gsm.h b/src/mm-generic-gsm.h
index 1c5b2120..4fca7b42 100644
--- a/src/mm-generic-gsm.h
+++ b/src/mm-generic-gsm.h
@@ -150,6 +150,9 @@ void mm_generic_gsm_update_signal_quality (MMGenericGsm *modem, guint32 quality)
MMAtSerialPort *mm_generic_gsm_get_at_port (MMGenericGsm *modem,
MMPortType ptype);
+MMAtSerialPort *mm_generic_gsm_get_best_at_port (MMGenericGsm *modem,
+ GError **error);
+
MMPort *mm_generic_gsm_grab_port (MMGenericGsm *modem,
const char *subsys,
const char *name,