[virt-tools-list] [virt-viewer 1/2] Add VirtViewerSession::software-smartcard-reader property
Christophe Fergeau
cfergeau at redhat.com
Mon Jul 1 09:51:50 UTC 2013
Ping ?
Christophe
On Mon, Jun 24, 2013 at 05:19:14PM +0200, Christophe Fergeau wrote:
> This property will be set to TRUE when a software smartcard reader
> is available, and FALSE otherwise. This property can only be TRUE
> when using SPICE and when smartcard support is enabled, and when
> both smartcard certificates and smartcard db directory are set.
> ---
> src/virt-viewer-session-spice.c | 75 +++++++++++++++++++++++++++++++++++++----
> src/virt-viewer-session.c | 16 ++++++++-
> 2 files changed, 84 insertions(+), 7 deletions(-)
>
> diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c
> index 06e0005..62616de 100644
> --- a/src/virt-viewer-session-spice.c
> +++ b/src/virt-viewer-session-spice.c
> @@ -51,6 +51,7 @@ struct _VirtViewerSessionSpicePrivate {
> SpiceMainChannel *main_channel;
> const SpiceAudio *audio;
> int channel_count;
> + gboolean has_sw_smartcard_reader;
> };
>
> #define VIRT_VIEWER_SESSION_SPICE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), VIRT_VIEWER_TYPE_SESSION_SPICE, VirtViewerSessionSpicePrivate))
> @@ -58,6 +59,7 @@ struct _VirtViewerSessionSpicePrivate {
> enum {
> PROP_0,
> PROP_SPICE_SESSION,
> + PROP_SW_SMARTCARD_READER,
> };
>
>
> @@ -89,6 +91,9 @@ virt_viewer_session_spice_get_property(GObject *object, guint property_id,
> case PROP_SPICE_SESSION:
> g_value_set_object(value, priv->session);
> break;
> + case PROP_SW_SMARTCARD_READER:
> + g_value_set_boolean(value, priv->has_sw_smartcard_reader);
> + break;
> default:
> G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
> }
> @@ -161,6 +166,9 @@ virt_viewer_session_spice_class_init(VirtViewerSessionSpiceClass *klass)
> SPICE_TYPE_SESSION,
> G_PARAM_READABLE |
> G_PARAM_STATIC_STRINGS));
> + g_object_class_override_property(oclass,
> + PROP_SW_SMARTCARD_READER,
> + "software-smartcard-reader");
> }
>
> static void
> @@ -180,10 +188,46 @@ usb_connect_failed(GObject *object G_GNUC_UNUSED,
> g_signal_emit_by_name(self, "session-usb-failed", error->message);
> }
>
> +static void virt_viewer_session_spice_set_has_sw_reader(VirtViewerSessionSpice *session,
> + gboolean has_sw_reader)
> +{
> + g_return_if_fail(VIRT_VIEWER_IS_SESSION_SPICE(session));
> +
> + if (has_sw_reader != session->priv->has_sw_smartcard_reader) {
> + session->priv->has_sw_smartcard_reader = has_sw_reader;
> + g_object_notify(G_OBJECT(session), "software-smartcard-reader");
> + }
> +}
> +
> +static void reader_added_cb(SpiceSmartcardManager *manager G_GNUC_UNUSED,
> + SpiceSmartcardReader *reader,
> + gpointer user_data)
> +{
> + VirtViewerSessionSpice *session;
> +
> + session = VIRT_VIEWER_SESSION_SPICE(user_data);
> + if (spice_smartcard_reader_is_software(reader)) {
> + virt_viewer_session_spice_set_has_sw_reader(session, TRUE);
> + }
> +}
> +
> +static void reader_removed_cb(SpiceSmartcardManager *manager G_GNUC_UNUSED,
> + SpiceSmartcardReader *reader,
> + gpointer user_data)
> +{
> + VirtViewerSessionSpice *session;
> +
> + session = VIRT_VIEWER_SESSION_SPICE(user_data);
> + if (spice_smartcard_reader_is_software(reader)) {
> + virt_viewer_session_spice_set_has_sw_reader(session, FALSE);
> + }
> +}
> +
> static void
> create_spice_session(VirtViewerSessionSpice *self)
> {
> - SpiceUsbDeviceManager *manager;
> + SpiceUsbDeviceManager *usb_manager;
> + SpiceSmartcardManager *smartcard_manager;
>
> g_return_if_fail(self != NULL);
> g_return_if_fail(self->priv->session == NULL);
> @@ -199,17 +243,36 @@ create_spice_session(VirtViewerSessionSpice *self)
> virt_viewer_signal_connect_object(self->priv->session, "channel-destroy",
> G_CALLBACK(virt_viewer_session_spice_channel_destroy), self, 0);
>
> - manager = spice_usb_device_manager_get(self->priv->session, NULL);
> - if (manager) {
> - g_signal_connect(manager, "auto-connect-failed",
> + usb_manager = spice_usb_device_manager_get(self->priv->session, NULL);
> + if (usb_manager) {
> + g_signal_connect(usb_manager, "auto-connect-failed",
> G_CALLBACK(usb_connect_failed), self);
> - g_signal_connect(manager, "device-error",
> + g_signal_connect(usb_manager, "device-error",
> G_CALLBACK(usb_connect_failed), self);
> }
> -
> g_object_bind_property(self, "auto-usbredir",
> self->priv->gtk_session, "auto-usbredir",
> G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
> +
> + smartcard_manager = spice_smartcard_manager_get();
> + if (smartcard_manager) {
> + GList *readers;
> + GList *it;
> + g_signal_connect(smartcard_manager, "reader-added",
> + (GCallback)reader_added_cb, self);
> + g_signal_connect(smartcard_manager, "reader-removed",
> + (GCallback)reader_removed_cb, self);
> + readers = spice_smartcard_manager_get_readers(smartcard_manager);
> + for (it = readers; it != NULL; it = it->next) {
> + SpiceSmartcardReader *reader;
> + reader = (SpiceSmartcardReader *)it->data;
> + if (spice_smartcard_reader_is_software(reader)) {
> + virt_viewer_session_spice_set_has_sw_reader(self, TRUE);
> + }
> + g_boxed_free(SPICE_TYPE_SMARTCARD_READER, reader);
> + }
> + g_list_free(readers);
> + }
> }
>
> static void
> diff --git a/src/virt-viewer-session.c b/src/virt-viewer-session.c
> index 07e7226..979260a 100644
> --- a/src/virt-viewer-session.c
> +++ b/src/virt-viewer-session.c
> @@ -48,7 +48,8 @@ enum {
>
> PROP_APP,
> PROP_AUTO_USBREDIR,
> - PROP_FILE
> + PROP_FILE,
> + PROP_SW_SMARTCARD_READER,
> };
>
> static void
> @@ -117,6 +118,10 @@ virt_viewer_session_get_property(GObject *object,
> g_value_set_object(value, self->priv->file);
> break;
>
> + case PROP_SW_SMARTCARD_READER:
> + g_value_set_boolean(value, FALSE);
> + break;
> +
> default:
> G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
> break;
> @@ -162,6 +167,15 @@ virt_viewer_session_class_init(VirtViewerSessionClass *class)
> G_PARAM_CONSTRUCT |
> G_PARAM_STATIC_STRINGS));
>
> + g_object_class_install_property(object_class,
> + PROP_SW_SMARTCARD_READER,
> + g_param_spec_boolean("software-smartcard-reader",
> + "Software smartcard reader",
> + "Indicates whether a software smartcard reader is available",
> + FALSE,
> + G_PARAM_READABLE |
> + G_PARAM_STATIC_STRINGS));
> +
> g_signal_new("session-connected",
> G_OBJECT_CLASS_TYPE(object_class),
> G_SIGNAL_RUN_FIRST,
> --
> 1.8.3.1
>
> _______________________________________________
> virt-tools-list mailing list
> virt-tools-list at redhat.com
> https://www.redhat.com/mailman/listinfo/virt-tools-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/virt-tools-list/attachments/20130701/72c02689/attachment.sig>
More information about the virt-tools-list
mailing list