diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-generic-gsm.c | 161 | ||||
-rw-r--r-- | src/mm-generic-gsm.h | 3 |
2 files changed, 83 insertions, 81 deletions
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, |