[PATCH] device: add SIGNAL_REMOVED and propagate through proxy

Aleksander Morgado aleksander at aleksander.es
Fri Oct 6 08:33:18 UTC 2017


On 21/09/17 23:20, Eric Caruso wrote:
> Adds a signal for when a HUP is received from the device, and
> propagates this to qmi-proxy clients via untracking them when
> the device emits it.

Pushed to git master now.
I also pushed a follow-up commit fixing several documentation related issues.

> ---
>  src/libqmi-glib/qmi-device.c | 20 ++++++++++++++++++++
>  src/libqmi-glib/qmi-device.h |  9 +++++++++
>  src/libqmi-glib/qmi-proxy.c  | 14 ++++++++++++++
>  3 files changed, 43 insertions(+)
> 
> diff --git a/src/libqmi-glib/qmi-device.c b/src/libqmi-glib/qmi-device.c
> index f35021e..690619d 100644
> --- a/src/libqmi-glib/qmi-device.c
> +++ b/src/libqmi-glib/qmi-device.c
> @@ -76,6 +76,7 @@ enum {
>  
>  enum {
>      SIGNAL_INDICATION,
> +    SIGNAL_REMOVED,
>      SIGNAL_LAST
>  };
>  
> @@ -1561,6 +1562,7 @@ input_ready_cb (GInputStream *istream,
>      if (r == 0) {
>          /* HUP! */
>          g_warning ("Cannot read from istream: connection broken");
> +        g_signal_emit (self, signals[SIGNAL_REMOVED], 0);
>          return FALSE;
>      }
>  
> @@ -3167,4 +3169,22 @@ qmi_device_class_init (QmiDeviceClass *klass)
>                        G_TYPE_NONE,
>                        1,
>                        G_TYPE_BYTE_ARRAY);
> +
> +    /**
> +     * QmiDevice::device-removed:
> +     * @object: A #QmiDevice.
> +     * @output: none
> +     *
> +     * The ::device-removed signal is emitted when an unexpected port hang-up is received.
> +     */
> +    signals[SIGNAL_REMOVED] =
> +        g_signal_new (QMI_DEVICE_SIGNAL_REMOVED,
> +                      G_OBJECT_CLASS_TYPE (G_OBJECT_CLASS (klass)),
> +                      G_SIGNAL_RUN_LAST,
> +                      0,
> +                      NULL,
> +                      NULL,
> +                      NULL,
> +                      G_TYPE_NONE,
> +                      0);
>  }
> diff --git a/src/libqmi-glib/qmi-device.h b/src/libqmi-glib/qmi-device.h
> index 8ff2318..4677354 100644
> --- a/src/libqmi-glib/qmi-device.h
> +++ b/src/libqmi-glib/qmi-device.h
> @@ -105,6 +105,15 @@ typedef struct _QmiDevicePrivate QmiDevicePrivate;
>  #define QMI_DEVICE_SIGNAL_INDICATION "indication"
>  
>  /**
> + * QMI_DEVICE_REMOVED:
> + *
> + * Symbol defining the #QmiDevice::device-removed signal.
> + *
> + * Since: 1.19
> + */
> +#define QMI_DEVICE_SIGNAL_REMOVED "device-removed"
> +
> +/**
>   * QmiDevice:
>   *
>   * The #QmiDevice structure contains private data and should only be accessed
> diff --git a/src/libqmi-glib/qmi-proxy.c b/src/libqmi-glib/qmi-proxy.c
> index 0e19cd8..bfb362e 100644
> --- a/src/libqmi-glib/qmi-proxy.c
> +++ b/src/libqmi-glib/qmi-proxy.c
> @@ -98,6 +98,7 @@ typedef struct {
>      QmiMessage *internal_proxy_open_request;
>      GArray *qmi_client_info_array;
>      guint indication_id;
> +    guint device_removed_id;
>  } Client;
>  
>  static gboolean connection_readable_cb (GSocket *socket, GIOCondition condition, Client *client);
> @@ -131,6 +132,8 @@ client_unref (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->device_removed_id))
> +                g_signal_handler_disconnect (client->device, client->device_removed_id);
>              g_object_unref (client->device);
>          }
>  
> @@ -322,6 +325,13 @@ indication_cb (QmiDevice *device,
>  }
>  
>  static void
> +device_removed_cb (QmiDevice *device,
> +                   Client *client)
> +{
> +    untrack_client (client->proxy, client);
> +}
> +
> +static void
>  device_open_ready (QmiDevice *device,
>                     GAsyncResult *res,
>                     Client *client)
> @@ -355,6 +365,10 @@ device_open_ready (QmiDevice *device,
>                                                "indication",
>                                                G_CALLBACK (indication_cb),
>                                                client);
> +    client->device_removed_id = g_signal_connect (client->device,
> +                                                  "device-removed",
> +                                                  G_CALLBACK (device_removed_cb),
> +                                                  client);
>  
>      complete_internal_proxy_open (self, client);
>  
> 


-- 
Aleksander
https://aleksander.es


More information about the libqmi-devel mailing list