diff options
Diffstat (limited to 'src/mm-port-qmi.c')
-rw-r--r-- | src/mm-port-qmi.c | 52 |
1 files changed, 45 insertions, 7 deletions
diff --git a/src/mm-port-qmi.c b/src/mm-port-qmi.c index 98dd8c44..3f39bfc0 100644 --- a/src/mm-port-qmi.c +++ b/src/mm-port-qmi.c @@ -41,25 +41,39 @@ struct _MMPortQmiPrivate { /*****************************************************************************/ -QmiClient * -mm_port_qmi_peek_client (MMPortQmi *self, - QmiService service, - MMPortQmiFlag flag) +static QmiClient * +lookup_client (MMPortQmi *self, + QmiService service, + MMPortQmiFlag flag, + gboolean steal) { GList *l; for (l = self->priv->services; l; l = g_list_next (l)) { ServiceInfo *info = l->data; - if (info->service == service && - info->flag == flag) - return info->client; + if (info->service == service && info->flag == flag) { + QmiClient *found; + + found = info->client; + if (steal) + self->priv->services = g_list_delete_link (self->priv->services, l); + return found; + } } return NULL; } QmiClient * +mm_port_qmi_peek_client (MMPortQmi *self, + QmiService service, + MMPortQmiFlag flag) +{ + return lookup_client (self, service, flag, FALSE); +} + +QmiClient * mm_port_qmi_get_client (MMPortQmi *self, QmiService service, MMPortQmiFlag flag) @@ -82,6 +96,30 @@ mm_port_qmi_peek_device (MMPortQmi *self) /*****************************************************************************/ +void +mm_port_qmi_release_client (MMPortQmi *self, + QmiService service, + MMPortQmiFlag flag) +{ + QmiClient *client; + + if (!self->priv->qmi_device) + return; + + client = lookup_client (self, service, flag, TRUE); + if (!client) + return; + + mm_obj_dbg (self, "explicitly releasing client for service '%s'...", qmi_service_get_string (service)); + qmi_device_release_client (self->priv->qmi_device, + client, + QMI_DEVICE_RELEASE_CLIENT_FLAGS_RELEASE_CID, + 3, NULL, NULL, NULL); + g_object_unref (client); +} + +/*****************************************************************************/ + typedef struct { ServiceInfo *info; } AllocateClientContext; |