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 void get_signal_quality (MMModemCdma *modem, MMModemUIntFn callback, gpointer user_data) { MMCallbackInfo *info; MMAtSerialPort *port; MMModemCdma *parent_iface; port = mm_generic_cdma_get_best_at_port (MM_GENERIC_CDMA (modem), NULL); if (!port) { /* Let the superclass handle it */ parent_iface = g_type_interface_peek_parent (MM_MODEM_CDMA_GET_INTERFACE (modem)); parent_iface->get_signal_quality (MM_MODEM_CDMA (modem), callback, user_data); return; } info = mm_callback_info_uint_new (MM_MODEM (modem), callback, user_data); /* Many Novatel CDMA cards don't report CSQ in standard 0 - 31 and the CSQ * reply doesn't appear to be in positive dBm either; instead try the custom * Novatel command for it. */ mm_at_serial_port_queue_command (port, "$NWRSSI", 3, get_rssi_done, info); }
void mm_hso_modem_authenticate (MMModemHso *self, const char *username, const char *password, MMModemFn callback, gpointer user_data) { MMModemHsoPrivate *priv; MMCallbackInfo *info; g_return_if_fail (self != NULL); g_return_if_fail (MM_IS_MODEM_HSO (self)); g_return_if_fail (callback != NULL); info = mm_callback_info_new (MM_MODEM (self), callback, user_data); priv = MM_MODEM_HSO_GET_PRIVATE (self); g_free (priv->username); priv->username = (username && strlen (username)) ? g_strdup (username) : NULL; g_free (priv->password); priv->password = (password && strlen (password)) ? g_strdup (password) : NULL; _internal_hso_modem_authenticate (self, info); }
MMModem * mm_modem_huawei_cdma_new (const char *device, const char *driver, const char *plugin, gboolean evdo_rev0, gboolean evdo_revA, guint32 vendor, guint32 product) { gboolean try_css = TRUE; g_return_val_if_fail (device != NULL, NULL); g_return_val_if_fail (driver != NULL, NULL); g_return_val_if_fail (plugin != NULL, NULL); /* Don't use AT+CSS on EVDO-capable hardware for determining registration * status, because often the device will have only an EVDO connection and * AT+CSS won't necessarily report EVDO registration status, only 1X. */ if (evdo_rev0 || evdo_revA) try_css = FALSE; return MM_MODEM (g_object_new (MM_TYPE_MODEM_HUAWEI_CDMA, MM_MODEM_MASTER_DEVICE, device, MM_MODEM_DRIVER, driver, MM_MODEM_PLUGIN, plugin, MM_GENERIC_CDMA_EVDO_REV0, evdo_rev0, MM_GENERIC_CDMA_EVDO_REVA, evdo_revA, MM_GENERIC_CDMA_REGISTRATION_TRY_CSS, try_css, MM_MODEM_HW_VID, vendor, MM_MODEM_HW_PID, product, NULL)); }
static void uint_call_not_supported (MMModemGsmCard *self, MMModemUIntFn callback, gpointer user_data) { MMCallbackInfo *info; info = mm_callback_info_uint_new (MM_MODEM (self), callback, user_data); info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_OPERATION_NOT_SUPPORTED, "Operation not supported"); mm_callback_info_schedule (info); }
static MMCallbackInfo * mm_callback_info_icera_timestamp_new (MMModemIcera *modem, MMModemIceraTimestampFn callback, gpointer user_data) { g_return_val_if_fail (modem != NULL, NULL); return mm_callback_info_new_full (MM_MODEM (modem), invoke_mm_modem_icera_timestamp_fn, (GCallback) callback, user_data); }
MMModem * mm_modem_nokia_new (const char *device, const char *driver, const char *plugin) { g_return_val_if_fail (device != NULL, NULL); g_return_val_if_fail (driver != NULL, NULL); g_return_val_if_fail (plugin != NULL, NULL); return MM_MODEM (g_object_new (MM_TYPE_MODEM_NOKIA, MM_MODEM_MASTER_DEVICE, device, MM_MODEM_DRIVER, driver, MM_MODEM_PLUGIN, plugin, NULL)); }
static void imsi_auth_cb (MMAuthRequest *req, GObject *owner, DBusGMethodInvocation *context, gpointer user_data) { MMModemGsmCard *self = MM_MODEM_GSM_CARD (owner); GError *error = NULL; /* Return any authorization error, otherwise get the IMSI */ if (!mm_modem_auth_finish (MM_MODEM (self), req, &error)) { dbus_g_method_return_error (context, error); g_error_free (error); } else mm_modem_gsm_card_get_imsi (self, str_call_done, context); }
MMModem * mm_modem_hso_new (const char *device, const char *driver, const char *plugin) { g_return_val_if_fail (device != NULL, NULL); g_return_val_if_fail (driver != NULL, NULL); g_return_val_if_fail (plugin != NULL, NULL); return MM_MODEM (g_object_new (MM_TYPE_MODEM_HSO, MM_MODEM_MASTER_DEVICE, device, MM_MODEM_DRIVER, driver, MM_MODEM_PLUGIN, plugin, MM_MODEM_IP_METHOD, MM_MODEM_IP_METHOD_STATIC, NULL)); }
void mm_modem_icera_get_allowed_mode (MMModemIcera *self, MMModemUIntFn callback, gpointer user_data) { MMCallbackInfo *info; MMAtSerialPort *port; info = mm_callback_info_uint_new (MM_MODEM (self), callback, user_data); port = mm_generic_gsm_get_best_at_port (MM_GENERIC_GSM (self), &info->error); if (!port) { mm_callback_info_schedule (info); return; } mm_at_serial_port_queue_command (port, "%IPSYS?", 3, get_allowed_mode_done, info); }
static void change_pin_auth_cb (MMAuthRequest *req, GObject *owner, DBusGMethodInvocation *context, gpointer user_data) { MMModemGsmCard *self = MM_MODEM_GSM_CARD (owner); SendPinPukInfo *info = user_data; GError *error = NULL; /* Return any authorization error, otherwise change the PIN */ if (!mm_modem_auth_finish (MM_MODEM (self), req, &error)) { dbus_g_method_return_error (context, error); g_error_free (error); } else mm_modem_gsm_card_change_pin (self, info->pin, info->pin2, async_call_done, context); }
static void impl_gsm_modem_get_imsi (MMModemGsmCard *modem, DBusGMethodInvocation *context) { GError *error = NULL; /* Make sure the caller is authorized to get the IMSI */ if (!mm_modem_auth_request (MM_MODEM (modem), MM_AUTHORIZATION_DEVICE_INFO, context, imsi_auth_cb, NULL, NULL, &error)) { dbus_g_method_return_error (context, error); g_error_free (error); } }
static void get_access_technology (MMGenericGsm *modem, MMModemUIntFn callback, gpointer user_data) { MMAtSerialPort *port; MMCallbackInfo *info; info = mm_callback_info_uint_new (MM_MODEM (modem), callback, user_data); port = mm_generic_gsm_get_best_at_port (modem, &info->error); if (!port) { mm_callback_info_schedule (info); return; } mm_at_serial_port_queue_command (port, "+PSRAT", 3, get_act_request_done, info); }
static void get_allowed_mode (MMGenericGsm *gsm, MMModemUIntFn callback, gpointer user_data) { MMCallbackInfo *info; MMAtSerialPort *port; info = mm_callback_info_uint_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; } mm_at_serial_port_queue_command (port, "AT+MODODR?", 3, get_allowed_mode_done, info); }
static void do_disconnect (MMGenericGsm *gsm, gint cid, MMModemFn callback, gpointer user_data) { MMCallbackInfo *info; MMAtSerialPort *primary; char *command; 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); command = g_strdup_printf ("AT_OWANCALL=%d,0,0", cid); mm_at_serial_port_queue_command (primary, command, 3, disconnect_owancall_done, info); g_free (command); }
MMModem * mm_modem_wavecom_gsm_new (const char *device, const char *driver, const char *plugin, guint32 vendor, guint32 product) { g_return_val_if_fail (device != NULL, NULL); g_return_val_if_fail (driver != NULL, NULL); g_return_val_if_fail (plugin != NULL, NULL); return MM_MODEM (g_object_new (MM_TYPE_MODEM_WAVECOM_GSM, MM_MODEM_MASTER_DEVICE, device, MM_MODEM_DRIVER, driver, MM_MODEM_PLUGIN, plugin, MM_MODEM_HW_VID, vendor, MM_MODEM_HW_PID, product, NULL)); }
void mm_modem_icera_do_disconnect (MMGenericGsm *gsm, gint cid, MMModemFn callback, gpointer user_data) { MMCallbackInfo *info; MMAtSerialPort *primary; char *command; info = mm_callback_info_new (MM_MODEM (gsm), callback, user_data); primary = mm_generic_gsm_get_at_port (gsm, MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); command = g_strdup_printf ("%%IPDPACT=%d,0", cid); mm_at_serial_port_queue_command (primary, command, 3, disconnect_ipdpact_done, info); g_free (command); }
MMModem * mm_modem_novatel_cdma_new (const char *device, const char *driver, const char *plugin, gboolean evdo_rev0, gboolean evdo_revA) { g_return_val_if_fail (device != NULL, NULL); g_return_val_if_fail (driver != NULL, NULL); g_return_val_if_fail (plugin != NULL, NULL); return MM_MODEM (g_object_new (MM_TYPE_MODEM_NOVATEL_CDMA, MM_MODEM_MASTER_DEVICE, device, MM_MODEM_DRIVER, driver, MM_MODEM_PLUGIN, plugin, MM_GENERIC_CDMA_EVDO_REV0, evdo_rev0, MM_GENERIC_CDMA_EVDO_REVA, evdo_revA, NULL)); }
void mm_modem_icera_set_allowed_mode (MMModemIcera *self, MMModemGsmAllowedMode mode, MMModemFn callback, gpointer user_data) { MMCallbackInfo *info; MMAtSerialPort *port; char *command; int i; info = mm_callback_info_new (MM_MODEM (self), callback, user_data); port = mm_generic_gsm_get_best_at_port (MM_GENERIC_GSM (self), &info->error); if (!port) { mm_callback_info_schedule (info); return; } switch (mode) { case MM_MODEM_GSM_ALLOWED_MODE_2G_ONLY: i = 0; break; case MM_MODEM_GSM_ALLOWED_MODE_3G_ONLY: i = 1; break; case MM_MODEM_GSM_ALLOWED_MODE_2G_PREFERRED: i = 2; break; case MM_MODEM_GSM_ALLOWED_MODE_3G_PREFERRED: i = 3; break; case MM_MODEM_GSM_ALLOWED_MODE_ANY: default: i = 5; break; } command = g_strdup_printf ("%%IPSYS=%d", i); mm_at_serial_port_queue_command (port, command, 3, set_allowed_mode_done, info); g_free (command); }
static void hso_call_control (MMModemHso *self, gboolean activate, gboolean ignore_errors, MMModemFn callback, gpointer user_data) { MMCallbackInfo *info; char *command; MMAtSerialPort *primary; info = mm_callback_info_new (MM_MODEM (self), callback, user_data); mm_callback_info_set_data (info, IGNORE_ERRORS_TAG, GUINT_TO_POINTER (ignore_errors), NULL); command = g_strdup_printf ("AT_OWANCALL=%d,%d,1", hso_get_cid (self), activate ? 1 : 0); primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_PORT_TYPE_PRIMARY); g_assert (primary); mm_at_serial_port_queue_command (primary, command, 3, hso_call_control_done, info); g_free (command); }
void mm_modem_icera_get_ip4_config (MMModemIcera *self, MMModemIp4Fn callback, gpointer user_data) { MMCallbackInfo *info; char *command; MMAtSerialPort *primary; info = mm_callback_info_new_full (MM_MODEM (self), ip4_config_invoke, G_CALLBACK (callback), user_data); primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); command = g_strdup_printf ("%%IPDPADDR=%d", _get_cid (self)); mm_at_serial_port_queue_command (primary, command, 3, get_ip4_config_done, info); g_free (command); }
static void impl_gsm_modem_send_pin (MMModemGsmCard *modem, const char *pin, DBusGMethodInvocation *context) { GError *error = NULL; SendPinPukInfo *info; info = send_pin_puk_info_new (NULL, pin, NULL, FALSE); /* Make sure the caller is authorized to unlock the modem */ if (!mm_modem_auth_request (MM_MODEM (modem), MM_AUTHORIZATION_DEVICE_CONTROL, context, send_pin_auth_cb, info, send_pin_puk_info_destroy, &error)) { dbus_g_method_return_error (context, error); g_error_free (error); } }
static void set_allowed_mode (MMGenericGsm *gsm, MMModemGsmAllowedMode mode, MMModemFn callback, gpointer user_data) { MMCallbackInfo *info; MMAtSerialPort *port; char *command; int mododr = 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: mododr = 3; break; case MM_MODEM_GSM_ALLOWED_MODE_3G_ONLY: mododr = 1; break; case MM_MODEM_GSM_ALLOWED_MODE_ANY: case MM_MODEM_GSM_ALLOWED_MODE_3G_PREFERRED: case MM_MODEM_GSM_ALLOWED_MODE_2G_PREFERRED: default: mododr = 2; break; } command = g_strdup_printf ("+MODODR=%d", mododr); mm_at_serial_port_queue_command (port, command, 3, set_allowed_mode_done, info); g_free (command); }
void mm_modem_icera_do_connect (MMModemIcera *self, const char *number, MMModemFn callback, gpointer user_data) { MMModem *modem = MM_MODEM (self); MMModemIceraPrivate *priv = MM_MODEM_ICERA_GET_PRIVATE (self); MMCallbackInfo *info; MMAtSerialPort *primary; gint cid; char *command; mm_modem_set_state (modem, MM_MODEM_STATE_CONNECTING, MM_MODEM_STATE_REASON_NONE); info = mm_callback_info_new (modem, callback, user_data); primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (self), MM_AT_PORT_FLAG_PRIMARY); g_assert (primary); cid = _get_cid (self); /* Both user and password are required; otherwise firmware returns an error */ if (!priv->username || !priv->password) command = g_strdup_printf ("%%IPDPCFG=%d,0,0,\"\",\"\"", cid); else { command = g_strdup_printf ("%%IPDPCFG=%d,0,1,\"%s\",\"%s\"", cid, priv->username ? priv->username : "", priv->password ? priv->password : ""); } mm_at_serial_port_queue_command (primary, command, 3, auth_done, info); g_free (command); }