aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2018-06-27 12:41:19 +0200
committerDan Williams <dcbw@redhat.com>2018-08-21 13:26:08 +0000
commit811a80e5ead636a933f5be1318f80e1b72059f7a (patch)
tree8a73ed5df4b440c9c1c761802ddfc825419d86c1 /src
parentf9cbe045e5ac50234cd608f1ffbae520b52dc525 (diff)
shared-qmi: new interface to handle common QMI implementations
This new interface will include implementations that are shared between the MMBroadbandModemQmi and the MMBroadbandModemMbim. For now, it just provides a way to implement the common client allocation methods.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am2
-rw-r--r--src/mm-broadband-modem-qmi.c412
-rw-r--r--src/mm-shared-qmi.c84
-rw-r--r--src/mm-shared-qmi.h60
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 */