diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2014-12-28 18:37:41 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2014-12-28 18:45:06 +0100 |
commit | 1eb52758833dfbf7431f979f1f28ce4beacf3072 (patch) | |
tree | c91d7c6ba8ecc4827ee08a8e917bdc13dc03de32 | |
parent | c8ce23695006266e304e3d5309d3e0303f2c308c (diff) | |
download | libmbim-1eb52758833dfbf7431f979f1f28ce4beacf3072.tar.gz |
libmbim-glib,proxy: force close device if not-opened error detected
-rw-r--r-- | src/libmbim-glib/mbim-proxy.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/libmbim-glib/mbim-proxy.c b/src/libmbim-glib/mbim-proxy.c index 4068487..2670baa 100644 --- a/src/libmbim-glib/mbim-proxy.c +++ b/src/libmbim-glib/mbim-proxy.c @@ -126,6 +126,7 @@ typedef struct { MbimDevice *device; guint indication_id; + guint function_error_id; gboolean service_subscriber_list_enabled; MbimEventEntry **mbim_event_entry_array; gsize mbim_event_entry_array_size; @@ -155,6 +156,9 @@ client_disconnect (Client *client) static void client_indication_cb (MbimDevice *device, MbimMessage *message, Client *client); +static void client_error_cb (MbimDevice *device, + GError *error, + Client *client); static void client_set_device (Client *client, @@ -163,6 +167,8 @@ client_set_device (Client *client, if (client->device) { if (g_signal_handler_is_connected (client->device, client->indication_id)) g_signal_handler_disconnect (client->device, client->indication_id); + if (g_signal_handler_is_connected (client->device, client->function_error_id)) + g_signal_handler_disconnect (client->device, client->function_error_id); g_object_unref (client->device); } @@ -172,9 +178,14 @@ client_set_device (Client *client, MBIM_DEVICE_SIGNAL_INDICATE_STATUS, G_CALLBACK (client_indication_cb), client); + client->function_error_id = g_signal_connect (client->device, + MBIM_DEVICE_SIGNAL_ERROR, + G_CALLBACK (client_error_cb), + client); } else { client->device = NULL; client->indication_id = 0; + client->function_error_id = 0; } } @@ -309,6 +320,20 @@ client_indication_cb (MbimDevice *device, } /*****************************************************************************/ +/* Handling generic function errors */ + +static void +client_error_cb (MbimDevice *device, + GError *error, + Client *client) +{ + if (g_error_matches (error, MBIM_PROTOCOL_ERROR, MBIM_PROTOCOL_ERROR_NOT_OPENED)) { + g_debug ("Device not opened error reported, forcing close"); + mbim_device_close_force (device, NULL); + } +} + +/*****************************************************************************/ /* Request info */ typedef struct { |