gsm: simplify finding the right serial port for commands
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
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);
|
||||
return;
|
||||
}
|
||||
|
||||
/* 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 */
|
||||
|
||||
+17
-12
@@ -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);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
+23
-13
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+80
-81
@@ -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 */
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user