[Spice-devel] Cross-platform mobile (iOS and Android) client
Christophe Fergeau
cfergeau at redhat.com
Fri Jun 24 10:10:04 UTC 2016
On Thu, Jun 23, 2016 at 02:30:14PM +0200, Christophe Fergeau wrote:
> On Thu, Jun 23, 2016 at 02:19:22PM +0200, Christophe Fergeau wrote:
> > Actually there is a much bigger set of changes to the spice-gtk package when
> > I compare http://depot.flexvdi.com/sources/spice-gtk-flexvdi-2.2.2.tgz
> > with the upstream spice-gtk 0.28 tarball (see attached patch).
>
> Here is the attachment.
And then I realized I hadn't looked if there were changes in the
spice-common or spice-protocol submodules, see attachments.
Christophe
-------------- next part --------------
diff --git a/common/client_marshallers.h b/common/client_marshallers.h
index 85051a0..bc04297 100644
--- a/common/client_marshallers.h
+++ b/common/client_marshallers.h
@@ -72,6 +72,7 @@ typedef struct {
void (*msgc_smartcard_reader_add)(SpiceMarshaller *m, VSCMsgReaderAdd *msg);
#endif
void (*msgc_port_event)(SpiceMarshaller *m, SpiceMsgcPortEvent *msg);
+ void (*msgc_main_power_event_request)(SpiceMarshaller *m, SpiceMsgcMainPowerEventRequest *msg);
} SpiceMessageMarshallers;
SpiceMessageMarshallers *spice_message_marshallers_get(void);
diff --git a/common/log.c b/common/log.c
index fc5c129..eca17b9 100644
--- a/common/log.c
+++ b/common/log.c
@@ -19,6 +19,7 @@
#include <config.h>
#endif
+#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
@@ -60,6 +61,13 @@ static const char * spice_log_level_to_string(SpiceLogLevel level)
return str;
}
+const char * spice_log_date(void) {
+ static char date[20];
+ time_t now = time(NULL);
+ strftime(date, 20, "%Y/%m/%d %H:%M:%S", localtime(&now));
+ return date;
+}
+
#ifndef SPICE_ABORT_LEVEL_DEFAULT
#ifdef SPICE_DISABLE_ABORT
#define SPICE_ABORT_LEVEL_DEFAULT -1
@@ -87,7 +95,7 @@ void spice_logv(const char *log_domain,
if (debug_level < (int) log_level)
return;
- fprintf(stderr, "(%s:%d): ", getenv("_"), getpid());
+ fprintf(stderr, "%s (%s:%d): ", spice_log_date(), getenv("_"), getpid());
if (log_domain) {
fprintf(stderr, "%s-", log_domain);
diff --git a/common/log.h b/common/log.h
index d9e6023..8f0158e 100644
--- a/common/log.h
+++ b/common/log.h
@@ -55,6 +55,8 @@ void spice_log(const char *log_domain,
const char *format,
...) SPICE_ATTR_PRINTF(5, 6);
+const char * spice_log_date(void);
+
#ifndef spice_return_if_fail
#define spice_return_if_fail(x) SPICE_STMT_START { \
if SPICE_LIKELY(x) { } else { \
@@ -81,7 +83,7 @@ void spice_log(const char *log_domain,
#ifndef spice_printerr
#define spice_printerr(format, ...) SPICE_STMT_START { \
- fprintf(stderr, "%s: " format "\n", __FUNCTION__, ## __VA_ARGS__); \
+ fprintf(stderr, "%s %s: " format "\n", spice_log_date(), __FUNCTION__, ## __VA_ARGS__); \
} SPICE_STMT_END
#endif
diff --git a/common/marshaller.c b/common/marshaller.c
index bd012d7..9da7453 100644
--- a/common/marshaller.c
+++ b/common/marshaller.c
@@ -32,8 +32,16 @@
#define write_uint16(ptr,v) (*((uint16_t *)(ptr)) = SPICE_BYTESWAP16((uint16_t)(v)))
#define write_int32(ptr,v) (*((int32_t *)(ptr)) = SPICE_BYTESWAP32((uint32_t)(v)))
#define write_uint32(ptr,v) (*((uint32_t *)(ptr)) = SPICE_BYTESWAP32((uint32_t)(v)))
+#if defined(__arm__) || defined(_M_ARM)
+// In ARM, there may be problems with unaligned accesses in 64 bit values
+#warning Compiling for big-endian ARM architecture
+#define write_int64(ptr,v) do { *((uint32_t *)(ptr)) = SPICE_BYTESWAP32(*((uint32_t *)(&v) + 1)); \
+ *((uint32_t *)(ptr) + 1) = SPICE_BYTESWAP32(*((uint32_t *)(&v))); } while(0)
+#define write_uint64(ptr,v) write_int64(ptr,v)
+#else
#define write_int64(ptr,v) (*((int64_t *)(ptr)) = SPICE_BYTESWAP64((uint64_t)(v)))
#define write_uint64(ptr,v) (*((uint64_t *)(ptr)) = SPICE_BYTESWAP64((uint64_t)(v)))
+#endif
#else
#define write_int8(ptr,v) (*((int8_t *)(ptr)) = v)
#define write_uint8(ptr,v) (*((uint8_t *)(ptr)) = v)
@@ -41,9 +49,17 @@
#define write_uint16(ptr,v) (*((uint16_t *)(ptr)) = v)
#define write_int32(ptr,v) (*((int32_t *)(ptr)) = v)
#define write_uint32(ptr,v) (*((uint32_t *)(ptr)) = v)
+#if defined(__arm__) || defined(_M_ARM)
+// In ARM, there may be problems with unaligned accesses in 64 bit values
+#warning Compiling for little-endian ARM architecture
+#define write_int64(ptr,v) do { *((uint32_t *)(ptr)) = *((uint32_t *)(&v)); \
+ *((uint32_t *)(ptr)+1) = *((uint32_t *)(&v)+1); } while(0)
+#define write_uint64(ptr,v) write_int64(ptr,v)
+#else
#define write_int64(ptr,v) (*((int64_t *)(ptr)) = v)
#define write_uint64(ptr,v) (*((uint64_t *)(ptr)) = v)
#endif
+#endif
typedef struct {
uint8_t *data;
diff --git a/common/messages.h b/common/messages.h
index a8a0eee..cee2a54 100644
--- a/common/messages.h
+++ b/common/messages.h
@@ -630,6 +630,10 @@ typedef struct SpiceMsgcPortEvent {
uint8_t event;
} SpiceMsgcPortEvent;
+typedef struct SpiceMsgcMainPowerEventRequest {
+ uint32_t event_id;
+} SpiceMsgcMainPowerEventRequest;
+
SPICE_END_DECLS
#endif /* _H_SPICE_PROTOCOL */
diff --git a/common/rect.h b/common/rect.h
index 8c9faed..06947f1 100644
--- a/common/rect.h
+++ b/common/rect.h
@@ -75,10 +75,10 @@ static inline int rect_is_same_size(const SpiceRect *r1, const SpiceRect *r2)
r1->bottom - r1->top == r2->bottom - r2->top;
}
-static inline int rect_contains(const SpiceRect *big, const SpiceRect *small)
+static inline int rect_contains(const SpiceRect *big_rect, const SpiceRect *small_rect)
{
- return big->left <= small->left && big->right >= small->right &&
- big->top <= small->top && big->bottom >= small->bottom;
+ return (big_rect->left <= small_rect->left && big_rect->right >= small_rect->right &&
+ big_rect->top <= small_rect->top && big_rect->bottom >= small_rect->bottom);
}
static inline int rect_get_area(const SpiceRect *r)
diff --git a/python_modules/demarshal.py b/python_modules/demarshal.py
index 109f5e6..8fb6227 100644
--- a/python_modules/demarshal.py
+++ b/python_modules/demarshal.py
@@ -41,7 +41,7 @@ def write_parser_helpers(writer):
writer = writer.function_helper()
writer.writeln("#ifdef WORDS_BIGENDIAN")
- for size in [8, 16, 32, 64]:
+ for size in [8, 16, 32]:
for sign in ["", "u"]:
utype = "uint%d" % (size)
type = "%sint%d" % (sign, size)
@@ -52,12 +52,48 @@ def write_parser_helpers(writer):
else:
writer.macro("read_%s" % type, "ptr", "((%s_t)%s(*((%s_t *)(ptr))))" % (type, swap, utype))
writer.macro("write_%s" % type, "ptr, val", "*(%s_t *)(ptr) = %s((%s_t)val)" % (utype, swap, utype))
+ writer.writeln("#if defined(__arm__) || defined(_M_ARM)")
+ for sign in ["", "u"]:
+ ctype = "%sint64_t" % sign
+ scope = writer.function("read_%sint64" % sign, ctype, "uint8_t *ptr", True)
+ scope.variable_def(ctype, "val")
+ writer.assign("*((uint32_t *)(&val))", "SPICE_BYTESWAP32(*((uint32_t *)(ptr) + 1))")
+ writer.assign("*((uint32_t *)(&val) + 1)", "SPICE_BYTESWAP32(*((uint32_t *)(ptr)))")
+ writer.statement("return val")
+ writer.end_block()
+ writer.macro("write_%sint64" % sign, "ptr, val", "\\")
+ writer.writeln(" do { *((uint32_t *)(ptr)) = SPICE_BYTESWAP32(*((uint32_t *)(&val) + 1)); \\")
+ writer.writeln(" *((uint32_t *)(ptr) + 1) = SPICE_BYTESWAP32(*((uint32_t *)(&val))); } while(0)")
writer.writeln("#else")
- for size in [8, 16, 32, 64]:
+ for sign in ["", "u"]:
+ writer.macro("read_%sint64" % sign, "ptr", "((%sint64_t)SPICE_BYTESWAP64(*((uint64_t *)(ptr))))" % sign)
+ writer.macro("write_%sint64" % sign, "ptr, val", "*(uint64_t *)(ptr) = SPICE_BYTESWAP64((uint64_t)val)")
+ writer.writeln("#endif")
+ writer.writeln("#else")
+ for size in [8, 16, 32]:
for sign in ["", "u"]:
type = "%sint%d" % (sign, size)
writer.macro("read_%s" % type, "ptr", "(*((%s_t *)(ptr)))" % type)
writer.macro("write_%s" % type, "ptr, val", "(*((%s_t *)(ptr))) = val" % type)
+ writer.writeln("#if defined(__arm__) || defined(_M_ARM)")
+ writer.writeln("#warning Compiling for ARM, avoiding unaligned accesses")
+ for sign in ["", "u"]:
+ ctype = "%sint64_t" % sign
+ scope = writer.function("read_%sint64" % sign, ctype, "uint8_t *ptr", True)
+ scope.variable_def(ctype, "val")
+ writer.assign("*((uint32_t *)(&val))", "SPICE_BYTESWAP32(*((uint32_t *)(ptr)))")
+ writer.assign("*((uint32_t *)(&val) + 1)", "SPICE_BYTESWAP32(*((uint32_t *)(ptr) + 1))")
+ writer.statement("return val")
+ writer.end_block()
+ writer.macro("write_%sint64" % sign, "ptr, val", "\\")
+ writer.writeln(" do { *((uint32_t *)(ptr)) = *((uint32_t *)(&val)); \\")
+ writer.writeln(" *((uint32_t *)(ptr) + 1) = *((uint32_t *)(&val) + 1); } while(0)")
+ writer.writeln("#else")
+ for sign in ["", "u"]:
+ type = "%sint64" % sign
+ writer.macro("read_%s" % type, "ptr", "(*((%s_t *)(ptr)))" % type)
+ writer.macro("write_%s" % type, "ptr, val", "(*((%s_t *)(ptr))) = val" % type)
+ writer.writeln("#endif")
writer.writeln("#endif")
for size in [8, 16, 32, 64]:
diff --git a/spice-protocol b/spice-protocol
deleted file mode 160000
index 7566c5b..0000000
--- a/spice-protocol
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 7566c5b3ad47b0b487e15b58d72e151882d05541
diff --git a/spice.proto b/spice.proto
index 01493c9..70dccaf 100644
--- a/spice.proto
+++ b/spice.proto
@@ -113,6 +113,12 @@ enum16 pubkey_type {
EC,
};
+enum32 power_event {
+ RESET,
+ SHUTDOWN,
+ POWERDOWN,
+};
+
message Empty {
};
@@ -313,6 +319,10 @@ channel MainChannel : BaseChannel {
} migrate_dst_do_seamless;
Empty migrate_connected_seamless;
+
+ message {
+ uint32 event_id;
+ } power_event_request;
};
enum8 clip_type {
diff --git a/spice1.proto b/spice1.proto
index 67eb0e6..67b1f18 100644
--- a/spice1.proto
+++ b/spice1.proto
@@ -82,6 +82,12 @@ enum16 pubkey_type {
EC,
};
+enum32 power_event {
+ RESET,
+ SHUTDOWN,
+ POWERDOWN,
+};
+
message Empty {
};
@@ -253,6 +259,10 @@ channel MainChannel : BaseChannel {
message {
uint32 num_tokens;
} @ctype(SpiceMsgcMainAgentTokens) agent_token;
+
+ message {
+ uint32 event_id;
+ } power_event_request;
};
enum32 clip_type {
-------------- next part --------------
diff --git a/configure.ac b/configure.ac
index cb82da4..ece6672 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@ AC_PREREQ([2.57])
m4_define([SPICE_MAJOR], 0)
m4_define([SPICE_MINOR], 12)
-m4_define([SPICE_MICRO], 9)
+m4_define([SPICE_MICRO], 10)
AC_INIT(spice-protocol, [SPICE_MAJOR.SPICE_MINOR.SPICE_MICRO], [], spice-protocol)
diff --git a/spice/enums.h b/spice/enums.h
index 16885ac..96e72a4 100644
--- a/spice/enums.h
+++ b/spice/enums.h
@@ -121,6 +121,14 @@ typedef enum SpicePubkeyType {
SPICE_PUBKEY_TYPE_ENUM_END
} SpicePubkeyType;
+typedef enum SpicePowerEvent {
+ SPICE_POWER_EVENT_RESET,
+ SPICE_POWER_EVENT_SHUTDOWN,
+ SPICE_POWER_EVENT_POWERDOWN,
+
+ SPICE_POWER_EVENT_ENUM_END
+} SpicePowerEvent;
+
typedef enum SpiceClipType {
SPICE_CLIP_TYPE_NONE,
SPICE_CLIP_TYPE_RECTS,
@@ -467,6 +475,7 @@ enum {
SPICE_MSGC_MAIN_MIGRATE_END,
SPICE_MSGC_MAIN_MIGRATE_DST_DO_SEAMLESS,
SPICE_MSGC_MAIN_MIGRATE_CONNECTED_SEAMLESS,
+ SPICE_MSGC_MAIN_POWER_EVENT_REQUEST,
SPICE_MSGC_END_MAIN
};
diff --git a/spice/protocol.h b/spice/protocol.h
index d3c5962..3de833b 100644
--- a/spice/protocol.h
+++ b/spice/protocol.h
@@ -125,6 +125,7 @@ enum {
SPICE_MAIN_CAP_NAME_AND_UUID,
SPICE_MAIN_CAP_AGENT_CONNECTED_TOKENS,
SPICE_MAIN_CAP_SEAMLESS_MIGRATE,
+ SPICE_MAIN_CAP_POWER_REQUEST,
};
enum {
diff --git a/spice/vd_agent.h b/spice/vd_agent.h
index 7732eca..0f6916e 100644
--- a/spice/vd_agent.h
+++ b/spice/vd_agent.h
@@ -78,6 +78,13 @@ enum {
VD_AGENT_CLIENT_DISCONNECTED,
VD_AGENT_MAX_CLIPBOARD,
VD_AGENT_AUDIO_VOLUME_SYNC,
+ VD_AGENT_PORT_FORWARD_LISTEN,
+ VD_AGENT_PORT_FORWARD_ACCEPTED,
+ VD_AGENT_PORT_FORWARD_DATA,
+ VD_AGENT_PORT_FORWARD_ACK,
+ VD_AGENT_PORT_FORWARD_CLOSE,
+ VD_AGENT_PORT_FORWARD_SHUTDOWN,
+ VD_AGENT_PORT_FORWARD_CONNECT,
VD_AGENT_END_MESSAGE,
};
@@ -227,6 +234,8 @@ enum {
VD_AGENT_CAP_GUEST_LINEEND_CRLF,
VD_AGENT_CAP_MAX_CLIPBOARD,
VD_AGENT_CAP_AUDIO_VOLUME_SYNC,
+ VD_AGENT_CAP_MONITORS_CONFIG_POSITION,
+ VD_AGENT_CAP_PORT_FORWARDING,
VD_AGENT_END_CAP,
};
@@ -241,6 +250,43 @@ typedef struct SPICE_ATTR_PACKED VDAgentAnnounceCapabilities {
uint32_t caps[0];
} VDAgentAnnounceCapabilities;
+typedef struct SPICE_ATTR_PACKED VDAgentPortForwardListenMessage {
+ uint16_t port;
+ char bind_address[0];
+} VDAgentPortForwardListenMessage;
+
+typedef struct SPICE_ATTR_PACKED VDAgentPortForwardAcceptedMessage {
+ uint16_t port;
+ uint32_t id;
+ uint32_t ack_interval;
+} VDAgentPortForwardAcceptedMessage;
+
+typedef struct SPICE_ATTR_PACKED VDAgentPortForwardDataMessage {
+ uint32_t id;
+ uint64_t size;
+ uint8_t data[0];
+} VDAgentPortForwardDataMessage;
+
+typedef struct SPICE_ATTR_PACKED VDAgentPortForwardAckMessage {
+ uint32_t id;
+ uint64_t size;
+} VDAgentPortForwardAckMessage;
+
+typedef struct SPICE_ATTR_PACKED VDAgentPortForwardCloseMessage {
+ uint32_t id;
+} VDAgentPortForwardCloseMessage;
+
+typedef struct SPICE_ATTR_PACKED VDAgentPortForwardShutdownMessage {
+ uint16_t port;
+} VDAgentPortForwardShutdownMessage;
+
+typedef struct SPICE_ATTR_PACKED VDAgentPortForwardConnectMessage {
+ uint16_t port;
+ uint32_t id;
+ uint32_t ack_interval;
+ char host[0];
+} VDAgentPortForwardConnectMessage;
+
#define VD_AGENT_CAPS_SIZE_FROM_MSG_SIZE(msg_size) \
(((msg_size) - sizeof(VDAgentAnnounceCapabilities)) / sizeof(uint32_t))
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20160624/c069fde4/attachment.sig>
More information about the Spice-devel
mailing list