diff options
author | Alexander Larsson <alexl@redhat.com> | 2010-06-17 10:15:15 +0200 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2010-06-18 20:27:32 +0200 |
commit | ee91ed475dc5b9ea8f5ee05faa3dd153306e3471 (patch) | |
tree | adfd3b9086bb875db3d3748c4ab88c8977e17ff5 /client/red_peer.cpp | |
parent | 13026676627887a7d85abb49a0468150ac75ebe6 (diff) | |
download | spice-ee91ed475dc5b9ea8f5ee05faa3dd153306e3471.tar.gz spice-ee91ed475dc5b9ea8f5ee05faa3dd153306e3471.tar.xz spice-ee91ed475dc5b9ea8f5ee05faa3dd153306e3471.zip |
Switch client to use generated marshallers
Diffstat (limited to 'client/red_peer.cpp')
-rw-r--r-- | client/red_peer.cpp | 65 |
1 files changed, 43 insertions, 22 deletions
diff --git a/client/red_peer.cpp b/client/red_peer.cpp index be18dfbc..9a608adc 100644 --- a/client/red_peer.cpp +++ b/client/red_peer.cpp @@ -726,38 +726,59 @@ uint32_t RedPeer::send(uint8_t *buf, uint32_t size) return pos - buf; } +uint32_t RedPeer::do_send(RedPeer::OutMessage& message, uint32_t skip_bytes) +{ + uint8_t *data; + int free_data; + size_t len; + uint32_t res; + + data = spice_marshaller_linearize(message.marshaller(), skip_bytes, + &len, &free_data); + + res = send(data, len); + + if (free_data) { + free(data); + } + return res; +} + uint32_t RedPeer::send(RedPeer::OutMessage& message) { + message.header().serial = ++_serial; - return send(message.base(), message.message_size()); + message.header().size = message.message_size() - sizeof(SpiceDataHeader); + + return do_send(message, 0); } -RedPeer::OutMessage::OutMessage(uint32_t type, uint32_t size) - : _data (new uint8_t[size + sizeof(SpiceDataHeader)]) - , _size (size) +RedPeer::OutMessage::OutMessage(uint32_t type) + : _marshaller (spice_marshaller_new()) { - header().type = type; - header().size = size; + SpiceDataHeader *header; + header = (SpiceDataHeader *) + spice_marshaller_reserve_space(_marshaller, sizeof(SpiceDataHeader)); + spice_marshaller_set_base(_marshaller, sizeof(SpiceDataHeader)); + + header->type = type; + header->sub_list = 0; } -RedPeer::OutMessage::~OutMessage() +void RedPeer::OutMessage::reset(uint32_t type) { - delete[] _data; + spice_marshaller_reset(_marshaller); + + SpiceDataHeader *header; + header = (SpiceDataHeader *) + spice_marshaller_reserve_space(_marshaller, sizeof(SpiceDataHeader)); + spice_marshaller_set_base(_marshaller, sizeof(SpiceDataHeader)); + + header->type = type; + header->sub_list = 0; } -void RedPeer::OutMessage::resize(uint32_t size) +RedPeer::OutMessage::~OutMessage() { - if (size <= _size) { - header().size = size; - return; - } - uint32_t type = header().type; - delete[] _data; - _data = NULL; - _size = 0; - _data = new uint8_t[size + sizeof(SpiceDataHeader)]; - _size = size; - header().type = type; - header().size = size; + spice_marshaller_destroy(_marshaller); } - |