shared-quectel: don't assume that parent object supports location

The generic MBIM modem implementation does not have location
capabilities support, so the relevant function pointers in the
interface are NULL.

Fixes: 306566ad7e
This commit is contained in:
Aleksander Morgado
2024-04-01 09:07:10 +00:00
parent f08803e858
commit 3c4fa90c92
+42 -22
View File
@@ -686,6 +686,36 @@ probe_qgps_ready (MMBaseModem *_self,
g_object_unref (task);
}
static void
quectel_load_capabilities (GTask *task)
{
MMSharedQuectel *self;
Private *priv;
self = MM_SHARED_QUECTEL (g_task_get_source_object (task));
priv = get_private (self);
/* Now our own check. If we don't have any GPS port, we're done */
if (!mm_base_modem_peek_port_gps (MM_BASE_MODEM (self))) {
MMModemLocationSource sources;
sources = GPOINTER_TO_UINT (g_task_get_task_data (task));
mm_obj_dbg (self, "no GPS data port found: no GPS capabilities");
g_task_return_int (task, sources);
g_object_unref (task);
return;
}
/* Probe QGPS support */
g_assert (priv->qgps_supported == FEATURE_SUPPORT_UNKNOWN);
mm_base_modem_at_command (MM_BASE_MODEM (self),
"+QGPS=?",
3,
TRUE, /* cached */
(GAsyncReadyCallback)probe_qgps_ready,
task);
}
static void
parent_load_capabilities_ready (MMIfaceModemLocation *self,
GAsyncResult *res,
@@ -703,25 +733,8 @@ parent_load_capabilities_ready (MMIfaceModemLocation *self,
return;
}
/* Now our own check. If we don't have any GPS port, we're done */
if (!mm_base_modem_peek_port_gps (MM_BASE_MODEM (self))) {
mm_obj_dbg (self, "no GPS data port found: no GPS capabilities");
g_task_return_int (task, sources);
g_object_unref (task);
return;
}
/* Store parent supported sources in task data */
g_task_set_task_data (task, GUINT_TO_POINTER (sources), NULL);
/* Probe QGPS support */
g_assert (priv->qgps_supported == FEATURE_SUPPORT_UNKNOWN);
mm_base_modem_at_command (MM_BASE_MODEM (self),
"+QGPS=?",
3,
TRUE, /* cached */
(GAsyncReadyCallback)probe_qgps_ready,
task);
quectel_load_capabilities (task);
}
void
@@ -735,10 +748,17 @@ mm_shared_quectel_location_load_capabilities (MMIfaceModemLocation *_self,
task = g_task_new (_self, NULL, callback, user_data);
priv = get_private (MM_SHARED_QUECTEL (_self));
/* Chain up parent's setup */
priv->iface_modem_location_parent->load_capabilities (_self,
(GAsyncReadyCallback)parent_load_capabilities_ready,
task);
/* Chain up parent's setup, if any */
if (priv->iface_modem_location_parent->load_capabilities &&
priv->iface_modem_location_parent->load_capabilities_finish) {
priv->iface_modem_location_parent->load_capabilities (_self,
(GAsyncReadyCallback)parent_load_capabilities_ready,
task);
return;
}
g_task_set_task_data (task, GUINT_TO_POINTER (MM_MODEM_LOCATION_SOURCE_NONE), NULL);
quectel_load_capabilities (task);
}
/*****************************************************************************/