[Spice-devel] [spice-gtk PATCH v2 8/8] channel-smartcard: do not attach temporary migration channel to smartcard

Yonit Halperin yhalperi at redhat.com
Sat Aug 25 13:20:24 PDT 2012


During migration, the smartcard channel that belongs to the temporary
copied session shouldn't be active.
---
 gtk/channel-main.c       |    1 +
 gtk/channel-smartcard.c  |   55 ++++++++++++++++++++++++++++++----------------
 gtk/spice-session-priv.h |    1 +
 3 files changed, 38 insertions(+), 19 deletions(-)

diff --git a/gtk/channel-main.c b/gtk/channel-main.c
index 7e478af..ff9b0c1 100644
--- a/gtk/channel-main.c
+++ b/gtk/channel-main.c
@@ -1701,6 +1701,7 @@ static gboolean migrate_connect(gpointer data)
 
     session = spice_channel_get_session(mig->src_channel);
     mig->session = spice_session_new_from_session(session);
+    mig->session->priv->migration_copy = true;
 
     if ((c->peer_hdr.major_version == 1) &&
         (c->peer_hdr.minor_version < 1)) {
diff --git a/gtk/channel-smartcard.c b/gtk/channel-smartcard.c
index 6fa4435..41d9554 100644
--- a/gtk/channel-smartcard.c
+++ b/gtk/channel-smartcard.c
@@ -27,6 +27,7 @@
 #include "spice-channel-priv.h"
 #include "smartcard-manager.h"
 #include "smartcard-manager-priv.h"
+#include "spice-session-priv.h"
 
 /**
  * SECTION:channel-smartcard
@@ -120,28 +121,39 @@ static void spice_smartcard_channel_init(SpiceSmartcardChannel *channel)
     priv->message_queue = g_queue_new();
 
 #ifdef USE_SMARTCARD
-    SpiceSmartcardManager *manager;
-
-    manager = spice_smartcard_manager_get();
-
     priv->pending_card_insertions =
         g_hash_table_new_full(g_direct_hash, g_direct_equal,
                               (GDestroyNotify)vreader_free, NULL);
     priv->pending_reader_removals =
          g_hash_table_new_full(g_direct_hash, g_direct_equal,
                                (GDestroyNotify)vreader_free, NULL);
-
-    g_signal_connect(G_OBJECT(manager), "reader-added",
-                     (GCallback)reader_added_cb, channel);
-    g_signal_connect(G_OBJECT(manager), "reader-removed",
-                     (GCallback)reader_removed_cb, channel);
-    g_signal_connect(G_OBJECT(manager), "card-inserted",
-                     (GCallback)card_inserted_cb, channel);
-    g_signal_connect(G_OBJECT(manager), "card-removed",
-                     (GCallback)card_removed_cb, channel);
 #endif
 }
 
+static void spice_smartcard_channel_constructed(GObject *object)
+{
+    SpiceSession *s = spice_channel_get_session(SPICE_CHANNEL(object));
+    SpiceSmartcardChannel *channel = SPICE_SMARTCARD_CHANNEL(object);
+    SpiceSmartcardManager *manager = spice_smartcard_manager_get();
+
+
+    g_return_if_fail(s != NULL);
+    if (!s->priv->migration_copy) {
+        g_signal_connect(G_OBJECT(manager), "reader-added",
+                         (GCallback)reader_added_cb, channel);
+        g_signal_connect(G_OBJECT(manager), "reader-removed",
+                         (GCallback)reader_removed_cb, channel);
+        g_signal_connect(G_OBJECT(manager), "card-inserted",
+                         (GCallback)card_inserted_cb, channel);
+        g_signal_connect(G_OBJECT(manager), "card-removed",
+                         (GCallback)card_removed_cb, channel);
+    }
+
+    if (G_OBJECT_CLASS(spice_smartcard_channel_parent_class)->constructed)
+        G_OBJECT_CLASS(spice_smartcard_channel_parent_class)->constructed(object);
+
+}
+
 static void spice_smartcard_channel_finalize(GObject *obj)
 {
     SpiceSmartcardChannelPrivate *c = SPICE_SMARTCARD_CHANNEL_GET_PRIVATE(obj);
@@ -200,6 +212,8 @@ static void spice_smartcard_channel_class_init(SpiceSmartcardChannelClass *klass
     SpiceChannelClass *channel_class = SPICE_CHANNEL_CLASS(klass);
 
     gobject_class->finalize     = spice_smartcard_channel_finalize;
+    gobject_class->constructed  = spice_smartcard_channel_constructed;
+
     channel_class->handle_msg   = spice_smartcard_handle_msg;
     channel_class->channel_up   = spice_smartcard_channel_up;
     channel_class->channel_reset = spice_smartcard_channel_reset;
@@ -448,16 +462,19 @@ static void spice_smartcard_channel_up_cb(GObject *source_object,
                                           gpointer user_data)
 {
     SpiceChannel *channel = SPICE_CHANNEL(user_data);
-    GError *error = NULL;
 
     g_return_if_fail(channel != NULL);
     g_return_if_fail(SPICE_IS_SESSION(source_object));
 
-    spice_smartcard_manager_init_finish(SPICE_SESSION(source_object),
-                                        res, &error);
-    if (error)
-        g_warning("%s", error->message);
-    g_clear_error(&error);
+    if (!spice_channel_get_session(SPICE_CHANNEL(channel))->priv->migration_copy) {
+        GError *error = NULL;
+
+        spice_smartcard_manager_init_finish(SPICE_SESSION(source_object),
+                                            res, &error);
+        if (error)
+            g_warning("%s", error->message);
+        g_clear_error(&error);
+    }
 }
 
 static void spice_smartcard_channel_up(SpiceChannel *channel)
diff --git a/gtk/spice-session-priv.h b/gtk/spice-session-priv.h
index e6cd17f..13345b4 100644
--- a/gtk/spice-session-priv.h
+++ b/gtk/spice-session-priv.h
@@ -86,6 +86,7 @@ struct _SpiceSessionPrivate {
     gboolean          disconnecting;
     gboolean          migrate_wait_init;
     guint             after_main_init;
+    gboolean          migration_copy;
 
     display_cache     images;
     display_cache     palettes;
-- 
1.7.7.6



More information about the Spice-devel mailing list