port-qmi: allow users to release clients when no longer needed
This commit is contained in:
@@ -41,24 +41,38 @@ struct _MMPortQmiPrivate {
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
QmiClient *
|
static QmiClient *
|
||||||
mm_port_qmi_peek_client (MMPortQmi *self,
|
lookup_client (MMPortQmi *self,
|
||||||
QmiService service,
|
QmiService service,
|
||||||
MMPortQmiFlag flag)
|
MMPortQmiFlag flag,
|
||||||
|
gboolean steal)
|
||||||
{
|
{
|
||||||
GList *l;
|
GList *l;
|
||||||
|
|
||||||
for (l = self->priv->services; l; l = g_list_next (l)) {
|
for (l = self->priv->services; l; l = g_list_next (l)) {
|
||||||
ServiceInfo *info = l->data;
|
ServiceInfo *info = l->data;
|
||||||
|
|
||||||
if (info->service == service &&
|
if (info->service == service && info->flag == flag) {
|
||||||
info->flag == flag)
|
QmiClient *found;
|
||||||
return info->client;
|
|
||||||
|
found = info->client;
|
||||||
|
if (steal)
|
||||||
|
self->priv->services = g_list_delete_link (self->priv->services, l);
|
||||||
|
return found;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QmiClient *
|
||||||
|
mm_port_qmi_peek_client (MMPortQmi *self,
|
||||||
|
QmiService service,
|
||||||
|
MMPortQmiFlag flag)
|
||||||
|
{
|
||||||
|
return lookup_client (self, service, flag, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
QmiClient *
|
QmiClient *
|
||||||
mm_port_qmi_get_client (MMPortQmi *self,
|
mm_port_qmi_get_client (MMPortQmi *self,
|
||||||
QmiService service,
|
QmiService service,
|
||||||
@@ -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 {
|
typedef struct {
|
||||||
ServiceInfo *info;
|
ServiceInfo *info;
|
||||||
} AllocateClientContext;
|
} AllocateClientContext;
|
||||||
|
@@ -80,6 +80,10 @@ gboolean mm_port_qmi_allocate_client_finish (MMPortQmi *self,
|
|||||||
GAsyncResult *res,
|
GAsyncResult *res,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
void mm_port_qmi_release_client (MMPortQmi *self,
|
||||||
|
QmiService service,
|
||||||
|
MMPortQmiFlag flag);
|
||||||
|
|
||||||
QmiClient *mm_port_qmi_peek_client (MMPortQmi *self,
|
QmiClient *mm_port_qmi_peek_client (MMPortQmi *self,
|
||||||
QmiService service,
|
QmiService service,
|
||||||
MMPortQmiFlag flag);
|
MMPortQmiFlag flag);
|
||||||
|
Reference in New Issue
Block a user