From 905c6283d5f6c50ffe637f4dcb315c1345c0a0b2 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 24 Jun 2010 17:38:35 +0200 Subject: add qxl chunk parser --- server/red_parse_qxl.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ server/red_parse_qxl.h | 8 ++++++++ 2 files changed, 52 insertions(+) (limited to 'server') 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; -- cgit