libfreerdp-core: improve server-side primary order header construction

This commit is contained in:
Marc-André Moreau 2013-05-07 15:33:52 -04:00
parent afefc7a57f
commit fe42b77118
4 changed files with 68 additions and 17 deletions

View File

@ -73,6 +73,7 @@ typedef struct rdp_brush rdpBrush;
struct _ORDER_INFO
{
BYTE controlFlags;
UINT32 orderType;
UINT32 fieldFlags;
rdpBounds bounds;

View File

@ -99,7 +99,7 @@ static const char* const ALTSEC_DRAWING_ORDER_STRINGS[] =
#endif /* WITH_DEBUG_ORDERS */
static const BYTE PRIMARY_DRAWING_ORDER_FIELD_BYTES[] =
const BYTE PRIMARY_DRAWING_ORDER_FIELD_BYTES[] =
{
DSTBLT_ORDER_FIELD_BYTES,
PATBLT_ORDER_FIELD_BYTES,
@ -1126,6 +1126,7 @@ BOOL update_read_polyline_order(wStream* s, ORDER_INFO* orderInfo, POLYLINE_ORDE
return update_read_delta_points(s, polyline->points, polyline->numPoints, polyline->xStart, polyline->yStart);
}
return TRUE;
}
@ -1154,7 +1155,7 @@ BOOL update_write_memblt_order(wStream* s, ORDER_INFO* orderInfo, MEMBLT_ORDER*
cacheId = (memblt->cacheId & 0xFF) | ((memblt->colorIndex & 0xFF) << 8);
orderInfo->fieldFlags |= ORDER_FIELD_01;
stream_write_UINT16(s, memblt->cacheId);
stream_write_UINT16(s, cacheId);
orderInfo->fieldFlags |= ORDER_FIELD_02;
update_write_coord(s, memblt->nLeftRect);
@ -2188,6 +2189,20 @@ BOOL update_read_field_flags(wStream* s, UINT32* fieldFlags, BYTE flags, BYTE fi
return TRUE;
}
BOOL update_write_field_flags(wStream* s, UINT32 fieldFlags, BYTE flags, BYTE fieldBytes)
{
int i;
BYTE byte;
for (i = fieldBytes - 1; i >= 0; i--)
{
byte = (fieldFlags << (i * 8)) & 0xFF;
stream_write_BYTE(s, byte);
}
return TRUE;
}
BOOL update_read_bounds(wStream* s, rdpBounds* bounds)
{
BYTE flags;

View File

@ -188,6 +188,9 @@
BOOL update_recv_order(rdpUpdate* update, wStream* s);
BOOL update_read_field_flags(wStream* s, UINT32* fieldFlags, BYTE flags, BYTE fieldBytes);
BOOL update_write_field_flags(wStream* s, UINT32 fieldFlags, BYTE flags, BYTE fieldBytes);
BOOL update_read_dstblt_order(wStream* s, ORDER_INFO* orderInfo, DSTBLT_ORDER* dstblt);
BOOL update_read_patblt_order(wStream* s, ORDER_INFO* orderInfo, PATBLT_ORDER* patblt);
BOOL update_write_patblt_order(wStream* s, ORDER_INFO* orderInfo, PATBLT_ORDER* patblt);

View File

@ -43,6 +43,8 @@ static const char* const UPDATE_TYPE_STRINGS[] =
};
*/
extern const BYTE PRIMARY_DRAWING_ORDER_FIELD_BYTES[];
BOOL update_recv_orders(rdpUpdate* update, wStream* s)
{
UINT16 numberOrders;
@ -600,22 +602,29 @@ static void update_send_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt)
{
wStream* s;
BYTE *bm, *em;
int headerLength;
ORDER_INFO orderInfo;
rdpRdp* rdp = context->rdp;
orderInfo.controlFlags = ORDER_STANDARD | ORDER_TYPE_CHANGE;
orderInfo.orderType = ORDER_TYPE_SCRBLT;
orderInfo.fieldFlags = 0;
headerLength = 4 + PRIMARY_DRAWING_ORDER_FIELD_BYTES[orderInfo.orderType];
s = fastpath_update_pdu_init(rdp->fastpath);
bm = Stream_Pointer(s);
Stream_Seek(s, 5);
Stream_Seek(s, headerLength);
update_write_scrblt_order(s, &orderInfo, scrblt);
em = Stream_Pointer(s);
Stream_Pointer(s) = bm;
stream_write_UINT16(s, 1); /* numberOrders (2 bytes) */
stream_write_BYTE(s, ORDER_STANDARD | ORDER_TYPE_CHANGE); /* controlFlags (1 byte) */
stream_write_BYTE(s, ORDER_TYPE_SCRBLT); /* orderType (1 byte) */
stream_write_BYTE(s, orderInfo.fieldFlags); /* fieldFlags (variable) */
stream_write_BYTE(s, orderInfo.controlFlags); /* controlFlags (1 byte) */
stream_write_BYTE(s, orderInfo.orderType); /* orderType (1 byte) */
update_write_field_flags(s, orderInfo.fieldFlags, orderInfo.controlFlags,
PRIMARY_DRAWING_ORDER_FIELD_BYTES[orderInfo.orderType]);
Stream_Pointer(s) = em;
fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_ORDERS, s);
@ -625,22 +634,29 @@ static void update_send_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaq
{
wStream* s;
BYTE *bm, *em;
int headerLength;
ORDER_INFO orderInfo;
rdpRdp* rdp = context->rdp;
orderInfo.controlFlags = ORDER_STANDARD | ORDER_TYPE_CHANGE;
orderInfo.orderType = ORDER_TYPE_OPAQUE_RECT;
orderInfo.fieldFlags = 0;
headerLength = 4 + PRIMARY_DRAWING_ORDER_FIELD_BYTES[orderInfo.orderType];
s = fastpath_update_pdu_init(rdp->fastpath);
bm = Stream_Pointer(s);
Stream_Seek(s, 5);
Stream_Seek(s, headerLength);
update_write_opaque_rect_order(s, &orderInfo, opaque_rect);
em = Stream_Pointer(s);
Stream_Pointer(s) = bm;
stream_write_UINT16(s, 1); /* numberOrders (2 bytes) */
stream_write_BYTE(s, ORDER_STANDARD | ORDER_TYPE_CHANGE); /* controlFlags (1 byte) */
stream_write_BYTE(s, ORDER_TYPE_OPAQUE_RECT); /* orderType (1 byte) */
stream_write_BYTE(s, orderInfo.fieldFlags); /* fieldFlags (variable) */
stream_write_BYTE(s, orderInfo.controlFlags); /* controlFlags (1 byte) */
stream_write_BYTE(s, orderInfo.orderType); /* orderType (1 byte) */
update_write_field_flags(s, orderInfo.fieldFlags, orderInfo.controlFlags,
PRIMARY_DRAWING_ORDER_FIELD_BYTES[orderInfo.orderType]);
Stream_Pointer(s) = em;
fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_ORDERS, s);
@ -650,22 +666,30 @@ static void update_send_memblt(rdpContext* context, MEMBLT_ORDER* memblt)
{
wStream* s;
BYTE *bm, *em;
int headerLength;
ORDER_INFO orderInfo;
rdpRdp* rdp = context->rdp;
orderInfo.controlFlags = ORDER_STANDARD | ORDER_TYPE_CHANGE;
orderInfo.orderType = ORDER_TYPE_MEMBLT;
orderInfo.fieldFlags = 0;
headerLength = 4 + PRIMARY_DRAWING_ORDER_FIELD_BYTES[orderInfo.orderType];
s = fastpath_update_pdu_init(rdp->fastpath);
bm = Stream_Pointer(s);
Stream_Seek(s, 5);
Stream_Seek(s, headerLength);
update_write_memblt_order(s, &orderInfo, memblt);
em = Stream_Pointer(s);
Stream_Pointer(s) = bm;
stream_write_UINT16(s, 1); /* numberOrders (2 bytes) */
stream_write_BYTE(s, ORDER_STANDARD | ORDER_TYPE_CHANGE); /* controlFlags (1 byte) */
stream_write_BYTE(s, ORDER_TYPE_MEMBLT); /* orderType (1 byte) */
stream_write_BYTE(s, orderInfo.controlFlags); /* controlFlags (1 byte) */
stream_write_BYTE(s, orderInfo.orderType); /* orderType (1 byte) */
stream_write_BYTE(s, orderInfo.fieldFlags); /* fieldFlags (variable) */
update_write_field_flags(s, orderInfo.fieldFlags, orderInfo.controlFlags,
PRIMARY_DRAWING_ORDER_FIELD_BYTES[orderInfo.orderType]);
Stream_Pointer(s) = em;
fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_ORDERS, s);
@ -675,22 +699,30 @@ static void update_send_glyph_index(rdpContext* context, GLYPH_INDEX_ORDER* glyp
{
wStream* s;
BYTE *bm, *em;
int headerLength;
ORDER_INFO orderInfo;
rdpRdp* rdp = context->rdp;
orderInfo.controlFlags = ORDER_STANDARD | ORDER_TYPE_CHANGE;
orderInfo.orderType = ORDER_TYPE_GLYPH_INDEX;
orderInfo.fieldFlags = 0;
headerLength = 4 + PRIMARY_DRAWING_ORDER_FIELD_BYTES[orderInfo.orderType];
s = fastpath_update_pdu_init(rdp->fastpath);
bm = Stream_Pointer(s);
Stream_Seek(s, 5);
Stream_Seek(s, headerLength);
update_write_glyph_index_order(s, &orderInfo, glyph_index);
em = Stream_Pointer(s);
Stream_Pointer(s) = bm;
stream_write_UINT16(s, 1); /* numberOrders (2 bytes) */
stream_write_BYTE(s, ORDER_STANDARD | ORDER_TYPE_CHANGE); /* controlFlags (1 byte) */
stream_write_BYTE(s, ORDER_TYPE_GLYPH_INDEX); /* orderType (1 byte) */
stream_write_BYTE(s, orderInfo.controlFlags); /* controlFlags (1 byte) */
stream_write_BYTE(s, orderInfo.orderType); /* orderType (1 byte) */
stream_write_BYTE(s, orderInfo.fieldFlags); /* fieldFlags (variable) */
update_write_field_flags(s, orderInfo.fieldFlags, orderInfo.controlFlags,
PRIMARY_DRAWING_ORDER_FIELD_BYTES[orderInfo.orderType]);
Stream_Pointer(s) = em;
fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_ORDERS, s);
@ -708,7 +740,7 @@ static void update_send_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORD
bm = Stream_Pointer(s);
Stream_Seek(s, 8);
update_write_cache_bitmap_v2_order(s, cache_bitmap_v2, FALSE, &flags);
update_write_cache_bitmap_v2_order(s, cache_bitmap_v2, cache_bitmap_v2->compressed, &flags);
em = Stream_Pointer(s);
Stream_Pointer(s) = bm;