[Spice-devel] [PATCH spice-gtk 8/8] Do not send specific messages in read-only
Marc-André Lureau
marcandre.lureau at gmail.com
Wed Nov 23 07:43:12 PST 2011
---
gtk/channel-inputs.c | 22 +++++++++++++++++++++-
gtk/channel-main.c | 5 ++++-
gtk/channel-record.c | 5 +++++
gtk/channel-smartcard.c | 3 +++
gtk/channel-usbredir.c | 3 +++
gtk/spice-channel-priv.h | 1 +
gtk/spice-channel.c | 8 +++++++-
7 files changed, 44 insertions(+), 3 deletions(-)
diff --git a/gtk/channel-inputs.c b/gtk/channel-inputs.c
index f6c4a3e..bacbba3 100644
--- a/gtk/channel-inputs.c
+++ b/gtk/channel-inputs.c
@@ -215,6 +215,9 @@ static void send_position(SpiceInputsChannel *channel)
{
SpiceMsgOut *msg;
+ if (spice_channel_get_read_only(SPICE_CHANNEL(channel)))
+ return;
+
msg = mouse_position(channel);
if (!msg) /* if no motion */
return;
@@ -228,6 +231,9 @@ static void send_motion(SpiceInputsChannel *channel)
{
SpiceMsgOut *msg;
+ if (spice_channel_get_read_only(SPICE_CHANNEL(channel)))
+ return;
+
msg = mouse_motion(channel);
if (!msg) /* if no motion */
return;
@@ -382,6 +388,8 @@ void spice_inputs_button_press(SpiceInputsChannel *channel, gint button,
if (SPICE_CHANNEL(channel)->priv->state != SPICE_CHANNEL_STATE_READY)
return;
+ if (spice_channel_get_read_only(SPICE_CHANNEL(channel)))
+ return;
c = channel->priv;
switch (button) {
@@ -428,6 +436,8 @@ void spice_inputs_button_release(SpiceInputsChannel *channel, gint button,
if (SPICE_CHANNEL(channel)->priv->state != SPICE_CHANNEL_STATE_READY)
return;
+ if (spice_channel_get_read_only(SPICE_CHANNEL(channel)))
+ return;
c = channel->priv;
switch (button) {
@@ -442,7 +452,7 @@ void spice_inputs_button_release(SpiceInputsChannel *channel, gint button,
break;
}
- c->bs = button_state;
+ c->bs = button_state;
send_motion(channel);
send_position(channel);
@@ -471,6 +481,8 @@ void spice_inputs_key_press(SpiceInputsChannel *channel, guint scancode)
g_return_if_fail(SPICE_CHANNEL(channel)->priv->state != SPICE_CHANNEL_STATE_UNCONNECTED);
if (SPICE_CHANNEL(channel)->priv->state != SPICE_CHANNEL_STATE_READY)
return;
+ if (spice_channel_get_read_only(SPICE_CHANNEL(channel)))
+ return;
SPICE_DEBUG("%s: scancode %d", __FUNCTION__, scancode);
if (scancode < 0x100) {
@@ -502,6 +514,8 @@ void spice_inputs_key_release(SpiceInputsChannel *channel, guint scancode)
g_return_if_fail(SPICE_CHANNEL(channel)->priv->state != SPICE_CHANNEL_STATE_UNCONNECTED);
if (SPICE_CHANNEL(channel)->priv->state != SPICE_CHANNEL_STATE_READY)
return;
+ if (spice_channel_get_read_only(SPICE_CHANNEL(channel)))
+ return;
SPICE_DEBUG("%s: scancode %d", __FUNCTION__, scancode);
if (scancode < 0x100) {
@@ -552,6 +566,9 @@ void spice_inputs_set_key_locks(SpiceInputsChannel *channel, guint locks)
{
SpiceMsgOut *msg;
+ if (spice_channel_get_read_only(SPICE_CHANNEL(channel)))
+ return;
+
msg = set_key_locks(channel, locks);
if (!msg) /* you can set_key_locks() even if the channel is not ready */
return;
@@ -566,6 +583,9 @@ static void spice_inputs_channel_up(SpiceChannel *channel)
SpiceInputsChannelPrivate *c = SPICE_INPUTS_CHANNEL(channel)->priv;
SpiceMsgOut *msg;
+ if (spice_channel_get_read_only(channel))
+ return;
+
msg = set_key_locks(SPICE_INPUTS_CHANNEL(channel), c->locks);
spice_msg_out_send_internal(msg);
spice_msg_out_unref(msg);
diff --git a/gtk/channel-main.c b/gtk/channel-main.c
index 90eb0fd..b2d44b6 100644
--- a/gtk/channel-main.c
+++ b/gtk/channel-main.c
@@ -1054,11 +1054,14 @@ static void set_mouse_mode(SpiceMainChannel *channel, uint32_t supported, uint32
}
/* switch to client mode if possible */
- if ((supported & SPICE_MOUSE_MODE_CLIENT) && (current != SPICE_MOUSE_MODE_CLIENT)) {
+ if (!spice_channel_get_read_only(SPICE_CHANNEL(channel)) &&
+ supported & SPICE_MOUSE_MODE_CLIENT &&
+ current != SPICE_MOUSE_MODE_CLIENT) {
SpiceMsgcMainMouseModeRequest req = {
.mode = SPICE_MOUSE_MODE_CLIENT,
};
SpiceMsgOut *out;
+
out = spice_msg_out_new(SPICE_CHANNEL(channel), SPICE_MSGC_MAIN_MOUSE_MODE_REQUEST);
out->marshallers->msgc_main_mouse_mode_request(out->marshaller, &req);
spice_msg_out_send_internal(out);
diff --git a/gtk/channel-record.c b/gtk/channel-record.c
index 443337c..bb66c3b 100644
--- a/gtk/channel-record.c
+++ b/gtk/channel-record.c
@@ -277,6 +277,8 @@ static void spice_record_mode(SpiceRecordChannel *channel, uint32_t time,
SpiceMsgOut *msg;
g_return_if_fail(channel != NULL);
+ if (spice_channel_get_read_only(SPICE_CHANNEL(channel)))
+ return;
m.mode = mode;
m.time = time;
@@ -309,6 +311,8 @@ static void spice_record_start_mark(SpiceRecordChannel *channel, uint32_t time)
SpiceMsgOut *msg;
g_return_if_fail(channel != NULL);
+ if (spice_channel_get_read_only(SPICE_CHANNEL(channel)))
+ return;
m.time = time;
@@ -336,6 +340,7 @@ void spice_record_send_data(SpiceRecordChannel *channel, gpointer data,
uint8_t *celt_buf = NULL;
g_return_if_fail(channel != NULL);
+ g_return_if_fail(spice_channel_get_read_only(SPICE_CHANNEL(channel)) == FALSE);
rc = channel->priv;
diff --git a/gtk/channel-smartcard.c b/gtk/channel-smartcard.c
index 5fec217..c5aa17b 100644
--- a/gtk/channel-smartcard.c
+++ b/gtk/channel-smartcard.c
@@ -281,6 +281,9 @@ static void smartcard_message_send(SpiceSmartcardChannel *channel,
{
SpiceSmartcardChannelMessage *message;
+ if (spice_channel_get_read_only(SPICE_CHANNEL(channel)))
+ return;
+
SPICE_DEBUG("smartcard: send message %d, %s",
msg_type, queue ? "queued" : "now");
if (!queue) {
diff --git a/gtk/channel-usbredir.c b/gtk/channel-usbredir.c
index 9479b6b..00647b6 100644
--- a/gtk/channel-usbredir.c
+++ b/gtk/channel-usbredir.c
@@ -350,6 +350,9 @@ void spice_usbredir_channel_do_write(SpiceUsbredirChannel *channel)
{
SpiceUsbredirChannelPrivate *priv = channel->priv;
+ if (spice_channel_get_read_only(SPICE_CHANNEL(channel)))
+ return;
+
/* No recursion allowed! */
g_return_if_fail(priv->msg_out == NULL);
diff --git a/gtk/spice-channel-priv.h b/gtk/spice-channel-priv.h
index df661f8..83e7e25 100644
--- a/gtk/spice-channel-priv.h
+++ b/gtk/spice-channel-priv.h
@@ -167,6 +167,7 @@ gint spice_channel_get_channel_id(SpiceChannel *channel);
gint spice_channel_get_channel_type(SpiceChannel *channel);
void spice_channel_swap(SpiceChannel *channel, SpiceChannel *swap);
void spice_channel_set_common_capability(SpiceChannel *channel, guint32 cap);
+gboolean spice_channel_get_read_only(SpiceChannel *channel);
/* coroutine context */
#define emit_main_context(object, event, args...) \
diff --git a/gtk/spice-channel.c b/gtk/spice-channel.c
index c2133ab..c9af0ba 100644
--- a/gtk/spice-channel.c
+++ b/gtk/spice-channel.c
@@ -1561,6 +1561,12 @@ void spice_channel_wakeup(SpiceChannel *channel)
g_io_wakeup(&c->wait);
}
+G_GNUC_INTERNAL
+gboolean spice_channel_get_read_only(SpiceChannel *channel)
+{
+ return spice_session_get_read_only(channel->priv->session);
+}
+
/* coroutine context if @buffered is FALSE,
system context if @buffered is TRUE */
static void spice_channel_send_msg(SpiceChannel *channel, SpiceMsgOut *out, gboolean buffered)
@@ -1573,7 +1579,7 @@ static void spice_channel_send_msg(SpiceChannel *channel, SpiceMsgOut *out, gboo
g_return_if_fail(out != NULL);
if (out->ro_check &&
- spice_session_get_read_only(channel->priv->session)) {
+ spice_channel_get_read_only(channel)) {
g_warning("Try to send message while read-only. Please report a bug.");
return;
}
--
1.7.7
More information about the Spice-devel
mailing list