22#include <freerdp/config.h>
25#include <winpr/assert.h>
26#include <winpr/stream.h>
28#include "rdpgfx_common.h"
43 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
44 return ERROR_INVALID_DATA;
46 Stream_Read_UINT16(s, header->cmdId);
47 Stream_Read_UINT16(s, header->flags);
48 Stream_Read_UINT32(s, header->pduLength);
50 if (header->pduLength < 8)
52 WLog_Print(log, WLOG_ERROR,
"header->pduLength %u less than 8!", header->pduLength);
53 return ERROR_INVALID_DATA;
56 const size_t size = (header->pduLength - 8ull);
57 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, size))
58 return ERROR_INVALID_DATA;
60 *pPacketLength = size;
75 if (!Stream_EnsureRemainingCapacity(s, 8))
76 return CHANNEL_RC_NO_MEMORY;
77 Stream_Write_UINT16(s, header->cmdId);
78 Stream_Write_UINT16(s, header->flags);
79 Stream_Write_UINT32(s, header->pduLength);
93 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
94 return ERROR_INVALID_DATA;
96 Stream_Read_UINT16(s, pt16->x);
97 Stream_Read_UINT16(s, pt16->y);
109 WINPR_ASSERT(point16);
111 if (!Stream_EnsureRemainingCapacity(s, 4))
112 return CHANNEL_RC_NO_MEMORY;
114 Stream_Write_UINT16(s, point16->x);
115 Stream_Write_UINT16(s, point16->y);
116 return CHANNEL_RC_OK;
127 WINPR_ASSERT(rect16);
129 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
130 return ERROR_INVALID_DATA;
132 Stream_Read_UINT16(s, rect16->left);
133 Stream_Read_UINT16(s, rect16->top);
134 Stream_Read_UINT16(s, rect16->right);
135 Stream_Read_UINT16(s, rect16->bottom);
136 if (rect16->left >= rect16->right)
138 WLog_Print(log, WLOG_ERROR,
"Invalid RECTANGLE_16: left(%" PRIu16
") > right(%" PRIu16
")",
139 rect16->left, rect16->right);
140 return ERROR_INVALID_DATA;
142 if (rect16->top >= rect16->bottom)
144 WLog_Print(log, WLOG_ERROR,
"Invalid RECTANGLE_16: top(%" PRIu16
") > bottom(%" PRIu16
")",
145 rect16->top, rect16->bottom);
146 return ERROR_INVALID_DATA;
148 return CHANNEL_RC_OK;
159 WINPR_ASSERT(rect16);
161 if (!Stream_EnsureRemainingCapacity(s, 8))
162 return CHANNEL_RC_NO_MEMORY;
164 Stream_Write_UINT16(s, rect16->left);
165 Stream_Write_UINT16(s, rect16->top);
166 Stream_Write_UINT16(s, rect16->right);
167 Stream_Write_UINT16(s, rect16->bottom);
168 return CHANNEL_RC_OK;
179 WINPR_ASSERT(color32);
181 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
182 return ERROR_INVALID_DATA;
184 Stream_Read_UINT8(s, color32->B);
185 Stream_Read_UINT8(s, color32->G);
186 Stream_Read_UINT8(s, color32->R);
187 Stream_Read_UINT8(s, color32->XA);
188 return CHANNEL_RC_OK;
199 WINPR_ASSERT(color32);
201 if (!Stream_EnsureRemainingCapacity(s, 4))
202 return CHANNEL_RC_NO_MEMORY;
204 Stream_Write_UINT8(s, color32->B);
205 Stream_Write_UINT8(s, color32->G);
206 Stream_Write_UINT8(s, color32->R);
207 Stream_Write_UINT8(s, color32->XA);
208 return CHANNEL_RC_OK;