static void unsolicited_disable_done (MMModem *modem, GError *error, gpointer user_data) { MMCallbackInfo *info = user_data; /* Handle modem removal, but ignore other errors */ if (g_error_matches (error, MM_MODEM_ERROR, MM_MODEM_ERROR_REMOVED)) info->error = g_error_copy (error); else if (!modem) { info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_REMOVED, "The modem was removed."); } if (info->error) { mm_callback_info_schedule (info); return; } /* Otherwise, kill any existing connection */ if (mm_generic_gsm_get_cid (MM_GENERIC_GSM (modem)) >= 0) hso_call_control (MM_MODEM_HSO (modem), FALSE, TRUE, disable_done, info); else disable_done (modem, NULL, info); }
static void connection_enabled (MMAtSerialPort *port, GMatchInfo *match_info, gpointer user_data) { MMModemIcera *self = MM_MODEM_ICERA (user_data); MMAtSerialPort *primary; char *str; int status, cid, tmp; cid = mm_generic_gsm_get_cid (MM_GENERIC_GSM (self)); if (cid < 0) return; str = g_match_info_fetch (match_info, 1); g_return_if_fail (str != NULL); tmp = atoi (str); g_free (str); /* Make sure the unsolicited message's CID matches the current CID */ if (tmp != cid) return; str = g_match_info_fetch (match_info, 2); g_return_if_fail (str != NULL); status = atoi (str); g_free (str); switch (status) { case 0: /* Disconnected */ if (mm_modem_get_state (MM_MODEM (self)) >= MM_MODEM_STATE_CONNECTED) mm_modem_disconnect (MM_MODEM (self), icera_disconnect_done, NULL); break; case 1: /* Connected */ connect_pending_done (self); break; case 2: /* Connecting */ break; case 3: /* Call setup failure? */ primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM(self), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); /* Get additional error details */ mm_at_serial_port_queue_command (primary, "AT%IER?", 3, query_network_error_code_done, self); break; default: mm_warn ("Unknown Icera connect status %d", status); break; } }
static gint _get_cid (MMModemIcera *self) { gint cid; cid = mm_generic_gsm_get_cid (MM_GENERIC_GSM (self)); if (cid < 0) { g_warn_if_fail (cid >= 0); cid = 0; } return cid; }