diff options
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 412 | ||||
-rw-r--r-- | src/mm-shared-qmi.c | 84 | ||||
-rw-r--r-- | src/mm-shared-qmi.h | 60 |
4 files changed, 354 insertions, 204 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index be2cb02d..7d7bc2e8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -366,6 +366,8 @@ endif # Additional QMI support in ModemManager if WITH_QMI ModemManager_SOURCES += \ + mm-shared-qmi.h \ + mm-shared-qmi.c \ mm-sms-qmi.h \ mm-sms-qmi.c \ mm-sim-qmi.h \ diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index aa640ef2..abf846fa 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -39,6 +39,7 @@ #include "mm-iface-modem-firmware.h" #include "mm-iface-modem-signal.h" #include "mm-iface-modem-oma.h" +#include "mm-shared-qmi.h" #include "mm-sim-qmi.h" #include "mm-bearer-qmi.h" #include "mm-sms-qmi.h" @@ -54,6 +55,7 @@ static void iface_modem_location_init (MMIfaceModemLocation *iface); static void iface_modem_oma_init (MMIfaceModemOma *iface); static void iface_modem_firmware_init (MMIfaceModemFirmware *iface); static void iface_modem_signal_init (MMIfaceModemSignal *iface); +static void shared_qmi_init (MMSharedQmi *iface); static MMIfaceModemMessaging *iface_modem_messaging_parent; static MMIfaceModemLocation *iface_modem_location_parent; @@ -67,7 +69,8 @@ G_DEFINE_TYPE_EXTENDED (MMBroadbandModemQmi, mm_broadband_modem_qmi, MM_TYPE_BRO G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_LOCATION, iface_modem_location_init) G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_SIGNAL, iface_modem_signal_init) G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_OMA, iface_modem_oma_init) - G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_FIRMWARE, iface_modem_firmware_init)) + G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_FIRMWARE, iface_modem_firmware_init) + G_IMPLEMENT_INTERFACE (MM_TYPE_SHARED_QMI, shared_qmi_init)) struct _MMBroadbandModemQmiPrivate { /* Cached device IDs, retrieved by the modem interface when loading device @@ -134,9 +137,10 @@ struct _MMBroadbandModemQmiPrivate { /*****************************************************************************/ static QmiClient * -peek_qmi_client (MMBroadbandModemQmi *self, - QmiService service, - GError **error) +shared_qmi_peek_client (MMSharedQmi *self, + QmiService service, + MMPortQmiFlag flag, + GError **error) { MMPortQmi *port; QmiClient *client; @@ -150,9 +154,7 @@ peek_qmi_client (MMBroadbandModemQmi *self, return NULL; } - client = mm_port_qmi_peek_client (port, - service, - MM_PORT_QMI_FLAG_DEFAULT); + client = mm_port_qmi_peek_client (port, service, flag); if (!client) g_set_error (error, MM_CORE_ERROR, @@ -163,26 +165,6 @@ peek_qmi_client (MMBroadbandModemQmi *self, return client; } -static gboolean -ensure_qmi_client (MMBroadbandModemQmi *self, - QmiService service, - QmiClient **o_client, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GError *error = NULL; - QmiClient *client; - - client = peek_qmi_client (self, service, &error); - if (!client) { - g_task_report_error (self, callback, user_data, ensure_qmi_client, error); - return FALSE; - } - - *o_client = client; - return TRUE; -} - /*****************************************************************************/ /* Power cycle */ @@ -264,9 +246,9 @@ power_cycle (MMBroadbandModemQmi *self, GTask *task; QmiClient *client; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; task = g_task_new (self, NULL, callback, user_data); @@ -522,14 +504,14 @@ modem_load_current_capabilities (MMIfaceModem *self, mm_dbg ("loading current capabilities..."); - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_NAS, &nas_client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &nas_client, + callback, user_data)) return; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &dms_client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &dms_client, + callback, user_data)) return; ctx = g_slice_new0 (LoadCurrentCapabilitiesContext); @@ -655,9 +637,9 @@ modem_load_supported_capabilities (MMIfaceModem *self, { QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; mm_dbg ("loading supported capabilities..."); @@ -879,9 +861,9 @@ set_current_capabilities (MMIfaceModem *self, GTask *task; QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_NAS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &client, + callback, user_data)) return; ctx = g_slice_new0 (SetCurrentCapabilitiesContext); @@ -948,9 +930,9 @@ modem_load_manufacturer (MMIfaceModem *self, { QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; mm_dbg ("loading manufacturer..."); @@ -1008,9 +990,9 @@ modem_load_model (MMIfaceModem *self, { QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; mm_dbg ("loading model..."); @@ -1068,9 +1050,9 @@ modem_load_revision (MMIfaceModem *self, { QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; mm_dbg ("loading revision..."); @@ -1128,9 +1110,9 @@ modem_load_hardware_revision (MMIfaceModem *self, { QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; mm_dbg ("loading hardware revision..."); @@ -1239,9 +1221,9 @@ modem_load_equipment_identifier (MMIfaceModem *self, { QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; mm_dbg ("loading equipment identifier..."); @@ -1332,9 +1314,9 @@ modem_load_own_numbers (MMIfaceModem *self, { QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; mm_dbg ("loading own numbers..."); @@ -1766,7 +1748,10 @@ load_unlock_required_context_step (GTask *task) case LOAD_UNLOCK_REQUIRED_STEP_DMS: if (!self->priv->dms_uim_deprecated) { /* Failure to get DMS client is hard really */ - client = peek_qmi_client (self, QMI_SERVICE_DMS, &error); + client = mm_shared_qmi_peek_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, + MM_PORT_QMI_FLAG_DEFAULT, + &error); if (!client) { g_task_return_error (task, error); g_object_unref (task); @@ -1787,7 +1772,10 @@ load_unlock_required_context_step (GTask *task) case LOAD_UNLOCK_REQUIRED_STEP_UIM: /* Failure to get UIM client at this point is hard as well */ - client = peek_qmi_client (self, QMI_SERVICE_UIM, &error); + client = mm_shared_qmi_peek_client (MM_SHARED_QMI (self), + QMI_SERVICE_UIM, + MM_PORT_QMI_FLAG_DEFAULT, + &error); if (!client) { g_task_return_error (task, error); g_object_unref (task); @@ -1883,7 +1871,10 @@ uim_load_unlock_retries (MMBroadbandModemQmi *self, QmiClient *client; GError *error = NULL; - client = peek_qmi_client (self, QMI_SERVICE_UIM, &error); + client = mm_shared_qmi_peek_client (MM_SHARED_QMI (self), + QMI_SERVICE_UIM, + MM_PORT_QMI_FLAG_DEFAULT, + &error); if (!client) { g_task_return_error (task, error); g_object_unref (task); @@ -1972,7 +1963,10 @@ dms_uim_load_unlock_retries (MMBroadbandModemQmi *self, { QmiClient *client; - client = peek_qmi_client (self, QMI_SERVICE_DMS, NULL); + client = mm_shared_qmi_peek_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, + MM_PORT_QMI_FLAG_DEFAULT, + NULL); if (!client) { /* Very unlikely that this will ever happen, but anyway, try with * UIM service instead */ @@ -2083,9 +2077,9 @@ modem_load_supported_bands (MMIfaceModem *self, { QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; mm_dbg ("loading band capabilities..."); @@ -2216,9 +2210,9 @@ modem_load_current_bands (MMIfaceModem *self, GTask *task; QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_NAS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &client, + callback, user_data)) return; task = g_task_new (self, NULL, callback, user_data); @@ -2297,9 +2291,9 @@ set_current_bands (MMIfaceModem *_self, QmiNasBandPreference qmi_bands = 0; QmiNasLteBandPreference qmi_lte_bands = 0; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_NAS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &client, + callback, user_data)) return; task = g_task_new (self, NULL, callback, user_data); @@ -2815,9 +2809,9 @@ load_signal_quality (MMIfaceModem *self, QmiClient *client = NULL; GTask *task; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_NAS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &client, + callback, user_data)) return; task = g_task_new (self, NULL, callback, user_data); @@ -3028,9 +3022,9 @@ common_power_up_down_off (MMIfaceModem *self, GTask *task; QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; /* Setup context */ @@ -3156,9 +3150,9 @@ load_power_state (MMIfaceModem *self, { QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; mm_dbg ("Getting device operating mode..."); @@ -3279,9 +3273,9 @@ modem_factory_reset (MMIfaceModem *self, QmiClient *client = NULL; GError *error = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; task = g_task_new (self, NULL, callback, user_data); @@ -3518,9 +3512,9 @@ load_current_modes (MMIfaceModem *self, GTask *task; QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_NAS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &client, + callback, user_data)) return; ctx = g_new0 (LoadCurrentModesContext, 1); @@ -3752,9 +3746,9 @@ set_current_modes (MMIfaceModem *self, GTask *task; QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_NAS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &client, + callback, user_data)) return; ctx = g_slice_new0 (SetCurrentModesContext); @@ -4014,9 +4008,9 @@ modem_3gpp_load_enabled_facility_locks (MMIfaceModem3gpp *self, GTask *task; QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; ctx = g_new (LoadEnabledFacilityLocksContext, 1); @@ -4183,9 +4177,9 @@ modem_3gpp_scan_networks (MMIfaceModem3gpp *self, * passed to the caller and deallocated afterwards */ g_assert (callback != NULL); - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_NAS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &client, + callback, user_data)) return; mm_dbg ("Scanning networks..."); @@ -4331,9 +4325,9 @@ modem_3gpp_register_in_network (MMIfaceModem3gpp *self, } /* Get NAS client */ - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_NAS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &client, + callback, user_data)) return; input = qmi_message_nas_initiate_network_register_input_new (); @@ -5123,9 +5117,9 @@ modem_3gpp_run_registration_checks (MMIfaceModem3gpp *self, GTask *task; QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_NAS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &client, + callback, user_data)) return; task = g_task_new (self, NULL, callback, user_data); @@ -5277,9 +5271,9 @@ modem_3gpp_disable_unsolicited_registration_events (MMIfaceModem3gpp *_self, GTask *task; QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_NAS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &client, + callback, user_data)) return; task = unsolicited_registration_events_task_new (self, @@ -5324,9 +5318,9 @@ modem_3gpp_enable_unsolicited_registration_events (MMIfaceModem3gpp *_self, GTask *task; QmiClient *client = NULL; - if (!ensure_qmi_client (self, - QMI_SERVICE_NAS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &client, + callback, user_data)) return; task = unsolicited_registration_events_task_new (self, @@ -5582,9 +5576,9 @@ modem_cdma_run_registration_checks (MMIfaceModemCdma *self, { QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_NAS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &client, + callback, user_data)) return; /* TODO: Run Get System Info in NAS >= 1.8 */ @@ -5661,9 +5655,9 @@ modem_cdma_load_activation_state (MMIfaceModemCdma *self, { QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; qmi_client_dms_get_activation_state (QMI_CLIENT_DMS (client), @@ -6148,9 +6142,9 @@ modem_cdma_activate (MMIfaceModemCdma *_self, CdmaActivationContext *ctx; QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; task = g_task_new (self, NULL, callback, user_data); @@ -6194,9 +6188,9 @@ modem_cdma_activate_manual (MMIfaceModemCdma *_self, CdmaActivationContext *ctx; QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; task = g_task_new (self, NULL, callback, user_data); @@ -6333,9 +6327,9 @@ common_setup_cleanup_unsolicited_registration_events (MMBroadbandModemQmi *self, GTask *task; QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_NAS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &client, + callback, user_data)) return; task = g_task_new (self, NULL, callback, user_data); @@ -6710,9 +6704,9 @@ common_enable_disable_unsolicited_events (MMBroadbandModemQmi *self, GTask *task; QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_NAS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &client, + callback, user_data)) return; task = g_task_new (self, NULL, callback, user_data); @@ -6902,9 +6896,9 @@ common_setup_cleanup_unsolicited_events (MMBroadbandModemQmi *self, GTask *task; QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_NAS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &client, + callback, user_data)) return; task = g_task_new (self, NULL, callback, user_data); @@ -7053,13 +7047,14 @@ messaging_check_support (MMIfaceModemMessaging *self, gpointer user_data) { GTask *task; - MMPortQmi *port; task = g_task_new (self, NULL, callback, user_data); - port = mm_base_modem_peek_port_qmi (MM_BASE_MODEM (self)); /* If we have support for the WMS client, messaging is supported */ - if (!port || !mm_port_qmi_peek_client (port, QMI_SERVICE_WMS, MM_PORT_QMI_FLAG_DEFAULT)) { + if (!mm_shared_qmi_peek_client (MM_SHARED_QMI (self), + QMI_SERVICE_WMS, + MM_PORT_QMI_FLAG_DEFAULT, + NULL)) { /* Try to fallback to AT support */ iface_modem_messaging_parent->check_support ( self, @@ -7223,9 +7218,9 @@ messaging_set_default_storage (MMIfaceModemMessaging *_self, return; } - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_WMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_WMS, &client, + callback, user_data)) return; /* Build routes array and add it as input @@ -7664,9 +7659,9 @@ load_initial_sms_parts (MMIfaceModemMessaging *_self, return iface_modem_messaging_parent->load_initial_sms_parts (_self, storage, callback, user_data); } - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_WMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_WMS, &client, + callback, user_data)) return; ctx = g_slice_new0 (LoadInitialSmsPartsContext); @@ -7832,9 +7827,9 @@ common_setup_cleanup_messaging_unsolicited_events (MMBroadbandModemQmi *self, GTask *task; QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_WMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_WMS, &client, + callback, user_data)) return; task = g_task_new (self, NULL, callback, user_data); @@ -7983,9 +7978,9 @@ common_enable_disable_messaging_unsolicited_events (MMBroadbandModemQmi *self, QmiClient *client = NULL; QmiMessageWmsSetEventReportInput *input; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_WMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_WMS, &client, + callback, user_data)) return; task = g_task_new (self, NULL, callback, user_data); @@ -8108,7 +8103,6 @@ parent_load_capabilities_ready (MMIfaceModemLocation *self, { MMModemLocationSource sources; GError *error = NULL; - MMPortQmi *port; sources = iface_modem_location_parent->load_capabilities_finish (self, res, &error); if (error) { @@ -8117,14 +8111,13 @@ parent_load_capabilities_ready (MMIfaceModemLocation *self, return; } - port = mm_base_modem_peek_port_qmi (MM_BASE_MODEM (self)); - /* Now our own checks */ /* If we have support for the PDS client, GPS and A-GPS location is supported */ - if (port && mm_port_qmi_peek_client (port, - QMI_SERVICE_PDS, - MM_PORT_QMI_FLAG_DEFAULT)) + if (mm_shared_qmi_peek_client (MM_SHARED_QMI (self), + QMI_SERVICE_PDS, + MM_PORT_QMI_FLAG_DEFAULT, + NULL)) sources |= (MM_MODEM_LOCATION_SOURCE_GPS_NMEA | MM_MODEM_LOCATION_SOURCE_GPS_RAW | MM_MODEM_LOCATION_SOURCE_AGPS); @@ -8244,9 +8237,9 @@ location_load_supl_server (MMIfaceModemLocation *self, QmiClient *client = NULL; QmiMessagePdsGetAgpsConfigInput *input; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_PDS, &client, - callback, user_data)) { + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_PDS, &client, + callback, user_data)) { return; } @@ -8364,9 +8357,9 @@ location_set_supl_server (MMIfaceModemLocation *self, guint32 port; GArray *url; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_PDS, &client, - callback, user_data)) { + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_PDS, &client, + callback, user_data)) { return; } @@ -8601,9 +8594,9 @@ disable_location_gathering (MMIfaceModemLocation *_self, } /* Setup context and client */ - if (!ensure_qmi_client (self, - QMI_SERVICE_PDS, &client, - callback, user_data)) { + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_PDS, &client, + callback, user_data)) { g_object_unref (task); return; } @@ -9005,7 +8998,10 @@ parent_enable_location_gathering_ready (MMIfaceModemLocation *_self, } /* Setup context and client */ - client = peek_qmi_client (self, QMI_SERVICE_PDS, &error); + client = mm_shared_qmi_peek_client (MM_SHARED_QMI (self), + QMI_SERVICE_PDS, + MM_PORT_QMI_FLAG_DEFAULT, + &error); if (!client) { g_task_return_error (task, error); g_object_unref (task); @@ -9099,13 +9095,14 @@ oma_check_support (MMIfaceModemOma *self, gpointer user_data) { GTask *task; - MMPortQmi *port; task = g_task_new (self, NULL, callback, user_data); - port = mm_base_modem_peek_port_qmi (MM_BASE_MODEM (self)); /* If we have support for the OMA client, OMA is supported */ - if (!port || !mm_port_qmi_peek_client (port, QMI_SERVICE_OMA, MM_PORT_QMI_FLAG_DEFAULT)) { + if (!mm_shared_qmi_peek_client (MM_SHARED_QMI (self), + QMI_SERVICE_OMA, + MM_PORT_QMI_FLAG_DEFAULT, + NULL)) { mm_dbg ("OMA capabilities not supported"); g_task_return_boolean (task, FALSE); } else { @@ -9187,9 +9184,9 @@ oma_load_features (MMIfaceModemOma *self, { QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_OMA, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_OMA, &client, + callback, user_data)) return; qmi_client_oma_get_feature_setting ( @@ -9241,9 +9238,9 @@ oma_setup (MMIfaceModemOma *self, QmiClient *client = NULL; QmiMessageOmaSetFeatureSettingInput *input; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_OMA, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_OMA, &client, + callback, user_data)) return; input = qmi_message_oma_set_feature_setting_input_new (); @@ -9311,9 +9308,9 @@ oma_start_client_initiated_session (MMIfaceModemOma *self, QmiClient *client = NULL; QmiMessageOmaStartSessionInput *input; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_OMA, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_OMA, &client, + callback, user_data)) return; /* It's already checked in mm-iface-modem-oma; so just assert if this is not ok */ @@ -9378,9 +9375,9 @@ oma_accept_network_initiated_session (MMIfaceModemOma *self, QmiClient *client = NULL; QmiMessageOmaSendSelectionInput *input; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_OMA, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_OMA, &client, + callback, user_data)) return; input = qmi_message_oma_send_selection_input_new (); @@ -9439,9 +9436,9 @@ oma_cancel_session (MMIfaceModemOma *self, { QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_OMA, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_OMA, &client, + callback, user_data)) return; qmi_client_oma_cancel_session ( @@ -9520,9 +9517,9 @@ common_setup_cleanup_oma_unsolicited_events (MMBroadbandModemQmi *self, GTask *task; QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_OMA, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_OMA, &client, + callback, user_data)) return; task = g_task_new (self, NULL, callback, user_data); @@ -9635,9 +9632,9 @@ common_enable_disable_oma_unsolicited_events (MMBroadbandModemQmi *self, QmiClient *client = NULL; QmiMessageOmaSetEventReportInput *input; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_OMA, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_OMA, &client, + callback, user_data)) return; task = g_task_new (self, NULL, callback, user_data); @@ -10041,9 +10038,9 @@ firmware_check_support (MMIfaceModemFirmware *self, GTask *task; QmiClient *client = NULL; - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; ctx = g_slice_new0 (FirmwareCheckSupportContext); @@ -10260,9 +10257,9 @@ firmware_change_current (MMIfaceModemFirmware *_self, guint8 *tmp; gsize tmp_len; - if (!ensure_qmi_client (self, - QMI_SERVICE_DMS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_DMS, &client, + callback, user_data)) return; ctx = g_slice_new0 (FirmwareChangeCurrentContext); @@ -10370,20 +10367,21 @@ signal_check_support (MMIfaceModemSignal *self, GAsyncReadyCallback callback, gpointer user_data) { - MMPortQmi *port; - gboolean supported = FALSE; GTask *task; - port = mm_base_modem_peek_port_qmi (MM_BASE_MODEM (self)); + task = g_task_new (self, NULL, callback, user_data); /* If NAS service is available, assume either signal info or signal strength are supported */ - if (port) - supported = !!mm_port_qmi_peek_client (port, QMI_SERVICE_NAS, MM_PORT_QMI_FLAG_DEFAULT); - - mm_dbg ("Extended signal capabilities %ssupported", supported ? "" : "not "); - - task = g_task_new (self, NULL, callback, user_data); - g_task_return_boolean (task, supported); + if (!mm_shared_qmi_peek_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, + MM_PORT_QMI_FLAG_DEFAULT, + NULL)) { + mm_dbg ("Extended signal capabilities not supported"); + g_task_return_boolean (task, FALSE); + } else { + mm_dbg ("Extended signal capabilities supported"); + g_task_return_boolean (task, TRUE); + } g_object_unref (task); } @@ -10809,9 +10807,9 @@ signal_load_values (MMIfaceModemSignal *self, mm_dbg ("loading extended signal information..."); - if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self), - QMI_SERVICE_NAS, &client, - callback, user_data)) + if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self), + QMI_SERVICE_NAS, &client, + callback, user_data)) return; ctx = g_slice_new0 (SignalLoadValuesContext); @@ -11443,6 +11441,12 @@ iface_modem_firmware_init (MMIfaceModemFirmware *iface) } static void +shared_qmi_init (MMSharedQmi *iface) +{ + iface->peek_client = shared_qmi_peek_client; +} + +static void mm_broadband_modem_qmi_class_init (MMBroadbandModemQmiClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); diff --git a/src/mm-shared-qmi.c b/src/mm-shared-qmi.c new file mode 100644 index 00000000..84ec75d4 --- /dev/null +++ b/src/mm-shared-qmi.c @@ -0,0 +1,84 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details: + * + * Copyright (C) 2018 Aleksander Morgado <aleksander@aleksander.es> + */ + +#include <config.h> +#include <arpa/inet.h> + +#include <glib-object.h> +#include <gio/gio.h> + +#define _LIBMM_INSIDE_MM +#include <libmm-glib.h> + +#include <libqmi-glib.h> + +#include "mm-iface-modem.h" +#include "mm-shared-qmi.h" + +/*****************************************************************************/ + +QmiClient * +mm_shared_qmi_peek_client (MMSharedQmi *self, + QmiService service, + MMPortQmiFlag flag, + GError **error) +{ + g_assert (MM_SHARED_QMI_GET_INTERFACE (self)->peek_client); + return MM_SHARED_QMI_GET_INTERFACE (self)->peek_client (self, service, flag, error); +} + +gboolean +mm_shared_qmi_ensure_client (MMSharedQmi *self, + QmiService service, + QmiClient **o_client, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GError *error = NULL; + QmiClient *client; + + client = mm_shared_qmi_peek_client (self, service, MM_PORT_QMI_FLAG_DEFAULT, &error); + if (!client) { + g_task_report_error (self, callback, user_data, mm_shared_qmi_ensure_client, error); + return FALSE; + } + + *o_client = client; + return TRUE; +} + +static void +shared_qmi_init (gpointer g_iface) +{ +} + +GType +mm_shared_qmi_get_type (void) +{ + static GType shared_qmi_type = 0; + + if (!G_UNLIKELY (shared_qmi_type)) { + static const GTypeInfo info = { + sizeof (MMSharedQmi), /* class_size */ + shared_qmi_init, /* base_init */ + NULL, /* base_finalize */ + }; + + shared_qmi_type = g_type_register_static (G_TYPE_INTERFACE, "MMSharedQmi", &info, 0); + g_type_interface_add_prerequisite (shared_qmi_type, MM_TYPE_IFACE_MODEM); + } + + return shared_qmi_type; +} diff --git a/src/mm-shared-qmi.h b/src/mm-shared-qmi.h new file mode 100644 index 00000000..b4e83e63 --- /dev/null +++ b/src/mm-shared-qmi.h @@ -0,0 +1,60 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details: + * + * Copyright (C) 2018 Aleksander Morgado <aleksander@aleksander.es> + */ + +#ifndef MM_SHARED_QMI_H +#define MM_SHARED_QMI_H + +#include <glib-object.h> +#include <gio/gio.h> + +#define _LIBMM_INSIDE_MM +#include <libmm-glib.h> + +#include <libqmi-glib.h> + +#include "mm-iface-modem.h" +#include "mm-port-qmi.h" + +#define MM_TYPE_SHARED_QMI (mm_shared_qmi_get_type ()) +#define MM_SHARED_QMI(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_SHARED_QMI, MMSharedQmi)) +#define MM_IS_SHARED_QMI(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MM_TYPE_SHARED_QMI)) +#define MM_SHARED_QMI_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), MM_TYPE_SHARED_QMI, MMSharedQmi)) + +typedef struct _MMSharedQmi MMSharedQmi; + +struct _MMSharedQmi { + GTypeInterface g_iface; + + QmiClient * (* peek_client) (MMSharedQmi *self, + QmiService service, + MMPortQmiFlag flag, + GError **error); +}; + +GType mm_shared_qmi_get_type (void); + +QmiClient *mm_shared_qmi_peek_client (MMSharedQmi *self, + QmiService service, + MMPortQmiFlag flag, + GError **error); + +gboolean mm_shared_qmi_ensure_client (MMSharedQmi *self, + QmiService service, + QmiClient **o_client, + GAsyncReadyCallback callback, + gpointer user_data); + + +#endif /* MM_SHARED_QMI_H */ |