Hi,

See my comments below.

On 11/23/2011 01:23 PM, Marc-André Lureau wrote:
It is useful to have a way to prevent sending commands in read-only
sessions (think of multi-client)

No clipboard sharing allowed in this case in gtk-session.
---
  gtk/spice-gtk-session-priv.h |    1 +
  gtk/spice-gtk-session.c      |   23 +++++++++++++++++++----
  gtk/spice-session-priv.h     |    2 ++
  gtk/spice-session.c          |   32 ++++++++++++++++++++++++++++++++
  4 files changed, 54 insertions(+), 4 deletions(-)

diff --git a/gtk/spice-gtk-session-priv.h b/gtk/spice-gtk-session-priv.h
index 19692af..21a4251 100644
--- a/gtk/spice-gtk-session-priv.h
+++ b/gtk/spice-gtk-session-priv.h
@@ -24,6 +24,7 @@ G_BEGIN_DECLS

  void spice_gtk_session_update_keyboard_focus(SpiceGtkSession *self,
                                               gboolean state);
+gboolean spice_gtk_session_get_read_only(SpiceGtkSession *self);

  G_END_DECLS

diff --git a/gtk/spice-gtk-session.c b/gtk/spice-gtk-session.c
index c181c7e..6f50762 100644
--- a/gtk/spice-gtk-session.c
+++ b/gtk/spice-gtk-session.c
@@ -77,6 +77,7 @@ static void channel_new(SpiceSession *session, SpiceChannel 
*channel,
                          gpointer user_data);
  static void channel_destroy(SpiceSession *session, SpiceChannel *channel,
                              gpointer user_data);
+static gboolean read_only(SpiceGtkSession *self);

  /* ------------------------------------------------------------------ */
  /* gobject glue                                                       */

Why introduce a separate function for this, why not simply call
spice_session_get_read_only(priv->session) in the places where you now call
read_only(self) ?

@@ -479,7 +480,7 @@ static void clipboard_owner_change(GtkClipboard        
*clipboard,
          }
          s->clipboard_by_guest[selection] = FALSE;
          s->clip_hasdata[selection] = TRUE;
-        if (s->auto_clipboard_enable)
+        if (s->auto_clipboard_enable&&  !read_only(self))
              gtk_clipboard_request_targets(clipboard, clipboard_get_targets,
                                            self);
          break;
@@ -622,7 +623,9 @@ static gboolean clipboard_grab(SpiceMainChannel *main, 
guint selection,
      /* Receiving a grab implies we've released our own grab */
      s->clip_grabbed[selection] = FALSE;

-    if (!s->auto_clipboard_enable || s->nclip_targets[selection] == 0)
+    if (read_only(self) ||
+        !s->auto_clipboard_enable ||
+        s->nclip_targets[selection] == 0)
          goto skip_grab_clipboard;

      if (!gtk_clipboard_set_with_data(cb, targets, i, clipboard_get,
@@ -694,6 +697,9 @@ static gboolean clipboard_request(SpiceMainChannel *main, 
guint selection,
      GtkClipboard* cb;
      int m;

+    if (read_only(self))
+        return FALSE;
+
      cb = get_clipboard_from_selection(s, selection);
      g_return_val_if_fail(cb != NULL, FALSE);

@@ -773,6 +779,14 @@ static void channel_destroy(SpiceSession *session, 
SpiceChannel *channel,
      }
  }

+static gboolean read_only(SpiceGtkSession *self) {
+    gboolean read_only;
+
+    g_object_get(self->priv->session, "read-only",&read_only, NULL);
+
+    return read_only;
+}
+
  /* ---------------------------------------------------------------- */
  /* private functions (usbredir related)                             */
  G_GNUC_INTERNAL
@@ -791,9 +805,8 @@ void 
spice_gtk_session_update_keyboard_focus(SpiceGtkSession *self,
          auto_connect = TRUE;

      manager = spice_usb_device_manager_get(s->session, NULL, NULL);
-    if (manager) {
+    if (manager)
          g_object_set(manager, "auto-connect", auto_connect, NULL);
-    }
  }

  /* ------------------------------------------------------------------ */

This seems like an unrelated code cleanup change.

@@ -843,6 +856,7 @@ SpiceGtkSession *spice_gtk_session_get(SpiceSession 
*session)
  void spice_gtk_session_copy_to_guest(SpiceGtkSession *self)
  {
      g_return_if_fail(SPICE_IS_GTK_SESSION(self));
+    g_return_if_fail(read_only(self) == FALSE);

      SpiceGtkSessionPrivate *s = self->priv;
      int selection = VD_AGENT_CLIPBOARD_SELECTION_CLIPBOARD;
@@ -864,6 +878,7 @@ void spice_gtk_session_copy_to_guest(SpiceGtkSession *self)
  void spice_gtk_session_paste_from_guest(SpiceGtkSession *self)
  {
      g_return_if_fail(SPICE_IS_GTK_SESSION(self));
+    g_return_if_fail(read_only(self) == FALSE);

      SpiceGtkSessionPrivate *s = self->priv;
      int selection = VD_AGENT_CLIPBOARD_SELECTION_CLIPBOARD;
diff --git a/gtk/spice-session-priv.h b/gtk/spice-session-priv.h
index 8f10407..0aafd27 100644
--- a/gtk/spice-session-priv.h
+++ b/gtk/spice-session-priv.h
@@ -37,6 +37,7 @@ struct _SpiceSessionPrivate {
      GByteArray        *pubkey;
      char              *cert_subject;
      guint             verify;
+    gboolean          read_only;

      /* whether to enable audio */
      gboolean          audio;
@@ -118,6 +119,7 @@ void spice_session_get_caches(SpiceSession *session,
                                SpiceGlzDecoderWindow **glz_window);
  void spice_session_palettes_clear(SpiceSession *session);
  void spice_session_images_clear(SpiceSession *session);
+gboolean spice_session_get_read_only(SpiceSession *session);

  G_END_DECLS

diff --git a/gtk/spice-session.c b/gtk/spice-session.c
index 9e30c74..e637521 100644
--- a/gtk/spice-session.c
+++ b/gtk/spice-session.c
@@ -98,6 +98,7 @@ enum {
      PROP_USBREDIR,
      PROP_DISABLE_EFFECTS,
      PROP_COLOR_DEPTH,
+    PROP_READ_ONLY,
  };

  /* signals */
@@ -369,6 +370,9 @@ static void spice_session_get_property(GObject    *gobject,
      case PROP_AUDIO:
          g_value_set_boolean(value, s->audio);
          break;
+    case PROP_READ_ONLY:
+        g_value_set_boolean(value, s->read_only);
+       break;
      default:
        G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
        break;
@@ -462,6 +466,10 @@ static void spice_session_set_property(GObject      
*gobject,
      case PROP_AUDIO:
          s->audio = g_value_get_boolean(value);
          break;
+    case PROP_READ_ONLY:
+        s->read_only = g_value_get_boolean(value);
+        g_object_notify(gobject, "read-only");
+        break;
      default:
          G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
          break;
@@ -833,6 +841,22 @@ static void spice_session_class_init(SpiceSessionClass 
*klass)
                       1,
                       SPICE_TYPE_CHANNEL);

+    /**
+     * SpiceSession:read-only:
+     *
+     * Whether this connection is read-only mode.
+     *
+     * Since: 0.8
+     **/
+    g_object_class_install_property
+        (gobject_class, PROP_READ_ONLY,
+         g_param_spec_boolean("read-only", "Read-only",
+                              "Whether this connection is read-only mode",
+                              FALSE,
+                              G_PARAM_READWRITE |
+                              G_PARAM_CONSTRUCT |
+                              G_PARAM_STATIC_STRINGS));
+
      g_type_class_add_private(klass, sizeof(SpiceSessionPrivate));
  }

@@ -1097,6 +1121,14 @@ void spice_session_channel_migrate(SpiceSession 
*session, SpiceChannel *channel)
      }
  }

+G_GNUC_INTERNAL
+gboolean spice_session_get_read_only(SpiceSession *self)
+{
+    g_return_val_if_fail(SPICE_IS_SESSION(self), FALSE);
+
+    return self->priv->read_only;
+}
+
  /**
   * spice_session_disconnect:
   * @session:

Regards,

Hans
_______________________________________________
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/spice-devel

Reply via email to