diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2010-06-24 17:38:35 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2010-06-30 22:34:47 +0200 |
commit | 905c6283d5f6c50ffe637f4dcb315c1345c0a0b2 (patch) | |
tree | 7dfd5fe41e409b297be091ebdadd510f24e5ec93 /server | |
parent | 7627fba05d150257a3e933d6a9243eeb2cb12aeb (diff) | |
download | spice-905c6283d5f6c50ffe637f4dcb315c1345c0a0b2.tar.gz spice-905c6283d5f6c50ffe637f4dcb315c1345c0a0b2.tar.xz spice-905c6283d5f6c50ffe637f4dcb315c1345c0a0b2.zip |
add qxl chunk parser
Diffstat (limited to 'server')
-rw-r--r-- | server/red_parse_qxl.c | 44 | ||||
-rw-r--r-- | server/red_parse_qxl.h | 8 |
2 files changed, 52 insertions, 0 deletions
diff --git a/server/red_parse_qxl.c b/server/red_parse_qxl.c index c5a8f566..37aafad8 100644 --- a/server/red_parse_qxl.c +++ b/server/red_parse_qxl.c @@ -20,6 +20,50 @@ #include "red_memslots.h" #include "red_parse_qxl.h" +static size_t red_get_data_chunks(RedMemSlotInfo *slots, int group_id, + RedDataChunk *red, SPICE_ADDRESS addr) +{ + QXLDataChunk *qxl; + RedDataChunk *red_prev; + size_t data_size = 0; + + qxl = (QXLDataChunk*)get_virt(slots, addr, sizeof(*qxl), group_id); + red->data_size = qxl->data_size; + data_size += red->data_size; + validate_virt(slots, (intptr_t)qxl->data, get_memslot_id(slots, addr), + red->data_size, group_id); + red->data = qxl->data; + red->prev_chunk = NULL; + + while (qxl->next_chunk) { + red_prev = red; + red = spice_new(RedDataChunk, 1); + qxl = (QXLDataChunk*)get_virt(slots, qxl->next_chunk, sizeof(*qxl), group_id); + red->data_size = qxl->data_size; + data_size += red->data_size; + validate_virt(slots, (intptr_t)qxl->data, get_memslot_id(slots, addr), + red->data_size, group_id); + red->data = qxl->data; + red->prev_chunk = red_prev; + red_prev->next_chunk = red; + } + + red->next_chunk = NULL; + return data_size; +} + +static void red_put_data_chunks(RedDataChunk *red) +{ + RedDataChunk *tmp; + + red = red->next_chunk; + while (red) { + tmp = red; + red = red->next_chunk; + free(tmp); + } +} + static void red_get_point_ptr(SpicePoint *red, QXLPoint *qxl) { red->x = qxl->x; diff --git a/server/red_parse_qxl.h b/server/red_parse_qxl.h index aece6a9e..079cf065 100644 --- a/server/red_parse_qxl.h +++ b/server/red_parse_qxl.h @@ -67,6 +67,14 @@ typedef struct SPICE_ATTR_PACKED RedMessage { uint8_t *data; } RedMessage; +typedef struct SPICE_ATTR_PACKED RedDataChunk RedDataChunk; +struct SPICE_ATTR_PACKED RedDataChunk { + uint32_t data_size; + RedDataChunk *prev_chunk; + RedDataChunk *next_chunk; + uint8_t *data; +}; + typedef struct SPICE_ATTR_PACKED RedSurfaceCreate { uint32_t format; uint32_t width; |