21 #include <freerdp/config.h>
23 #include <winpr/crt.h>
24 #include <winpr/cast.h>
25 #include <winpr/stream.h>
27 #include "rdpei_common.h"
29 #include <freerdp/log.h>
31 #define TAG FREERDP_TAG("channels.rdpei.common")
33 BOOL rdpei_read_2byte_unsigned(
wStream* s, UINT16* value)
37 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
40 Stream_Read_UINT8(s,
byte);
44 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
47 const INT32 ibyte = ((
byte & 0x7F) << 8);
48 *value = WINPR_ASSERTING_INT_CAST(UINT16, ibyte);
49 Stream_Read_UINT8(s,
byte);
54 *value = (
byte & 0x7F);
60 BOOL rdpei_write_2byte_unsigned(
wStream* s, UINT16 value)
64 if (!Stream_EnsureRemainingCapacity(s, 2))
72 byte = ((value & 0x7F00) >> 8);
73 Stream_Write_UINT8(s,
byte | 0x80);
74 byte = (value & 0xFF);
75 Stream_Write_UINT8(s,
byte);
79 byte = (value & 0x7F);
80 Stream_Write_UINT8(s,
byte);
86 BOOL rdpei_read_2byte_signed(
wStream* s, INT16* value)
91 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
94 Stream_Read_UINT8(s,
byte);
96 negative = (
byte & 0x40) ? TRUE : FALSE;
98 const BYTE val = (
byte & 0x3F);
102 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
105 Stream_Read_UINT8(s,
byte);
106 *value = (INT16)((val << 8) | byte);
117 BOOL rdpei_write_2byte_signed(
wStream* s, INT16 value)
120 BOOL negative = FALSE;
122 if (!Stream_EnsureRemainingCapacity(s, 2))
136 byte = ((value & 0x3F00) >> 8);
141 Stream_Write_UINT8(s,
byte | 0x80);
142 byte = (value & 0xFF);
143 Stream_Write_UINT8(s,
byte);
147 byte = (value & 0x3F);
152 Stream_Write_UINT8(s,
byte);
158 BOOL rdpei_read_4byte_unsigned(
wStream* s, UINT32* value)
163 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
166 Stream_Read_UINT8(s,
byte);
168 count = (
byte & 0xC0) >> 6;
170 if (!Stream_CheckAndLogRequiredLength(TAG, s, count))
176 *value = (
byte & 0x3F);
180 *value = ((
byte & 0x3F) << 8) & 0xFF00;
181 Stream_Read_UINT8(s,
byte);
186 *value = ((
byte & 0x3F) << 16) & 0xFF0000;
187 Stream_Read_UINT8(s,
byte);
188 *value |= ((
byte << 8) & 0xFF00);
189 Stream_Read_UINT8(s,
byte);
194 *value = ((
byte & 0x3F) << 24) & 0xFF000000;
195 Stream_Read_UINT8(s,
byte);
196 *value |= ((
byte << 16) & 0xFF0000);
197 Stream_Read_UINT8(s,
byte);
198 *value |= ((
byte << 8) & 0xFF00);
199 Stream_Read_UINT8(s,
byte);
210 BOOL rdpei_write_4byte_unsigned(
wStream* s, UINT32 value)
214 if (!Stream_EnsureRemainingCapacity(s, 4))
219 Stream_Write_UINT8(s, WINPR_ASSERTING_INT_CAST(uint8_t, value));
221 else if (value <= 0x3FFFUL)
223 byte = (value >> 8) & 0x3F;
224 Stream_Write_UINT8(s,
byte | 0x40);
225 byte = (value & 0xFF);
226 Stream_Write_UINT8(s,
byte);
228 else if (value <= 0x3FFFFFUL)
230 byte = (value >> 16) & 0x3F;
231 Stream_Write_UINT8(s,
byte | 0x80);
232 byte = (value >> 8) & 0xFF;
233 Stream_Write_UINT8(s,
byte);
234 byte = (value & 0xFF);
235 Stream_Write_UINT8(s,
byte);
237 else if (value <= 0x3FFFFFFFUL)
239 byte = (value >> 24) & 0x3F;
240 Stream_Write_UINT8(s,
byte | 0xC0);
241 byte = (value >> 16) & 0xFF;
242 Stream_Write_UINT8(s,
byte);
243 byte = (value >> 8) & 0xFF;
244 Stream_Write_UINT8(s,
byte);
245 byte = (value & 0xFF);
246 Stream_Write_UINT8(s,
byte);
256 BOOL rdpei_read_4byte_signed(
wStream* s, INT32* value)
262 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
265 Stream_Read_UINT8(s,
byte);
267 count = (
byte & 0xC0) >> 6;
268 negative = (
byte & 0x20) ? TRUE : FALSE;
270 if (!Stream_CheckAndLogRequiredLength(TAG, s, count))
276 *value = (
byte & 0x1F);
280 *value = (
byte & 0x1F) << 8;
281 Stream_Read_UINT8(s,
byte);
286 *value = (
byte & 0x1F) << 16;
287 Stream_Read_UINT8(s,
byte);
288 *value |= (
byte << 8);
289 Stream_Read_UINT8(s,
byte);
294 *value = (
byte & 0x1F) << 24;
295 Stream_Read_UINT8(s,
byte);
296 *value |= (
byte << 16);
297 Stream_Read_UINT8(s,
byte);
298 *value |= (
byte << 8);
299 Stream_Read_UINT8(s,
byte);
313 BOOL rdpei_write_4byte_signed(
wStream* s, INT32 value)
316 BOOL negative = FALSE;
318 if (!Stream_EnsureRemainingCapacity(s, 4))
334 Stream_Write_UINT8(s,
byte);
336 else if (value <= 0x1FFFL)
338 byte = (value >> 8) & 0x1F;
343 Stream_Write_UINT8(s,
byte | 0x40);
344 byte = (value & 0xFF);
345 Stream_Write_UINT8(s,
byte);
347 else if (value <= 0x1FFFFFL)
349 byte = (value >> 16) & 0x1F;
354 Stream_Write_UINT8(s,
byte | 0x80);
355 byte = (value >> 8) & 0xFF;
356 Stream_Write_UINT8(s,
byte);
357 byte = (value & 0xFF);
358 Stream_Write_UINT8(s,
byte);
360 else if (value <= 0x1FFFFFFFL)
362 byte = (value >> 24) & 0x1F;
367 Stream_Write_UINT8(s,
byte | 0xC0);
368 byte = (value >> 16) & 0xFF;
369 Stream_Write_UINT8(s,
byte);
370 byte = (value >> 8) & 0xFF;
371 Stream_Write_UINT8(s,
byte);
372 byte = (value & 0xFF);
373 Stream_Write_UINT8(s,
byte);
383 BOOL rdpei_read_8byte_unsigned(
wStream* s, UINT64* value)
388 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
391 Stream_Read_UINT8(s,
byte);
393 count = (
byte & 0xE0) >> 5;
395 if (!Stream_CheckAndLogRequiredLength(TAG, s, count))
401 *value = (
byte & 0x1F);
405 *value = (
byte & 0x1FU) << 8U;
406 Stream_Read_UINT8(s,
byte);
411 *value = (
byte & 0x1FU) << 16U;
412 Stream_Read_UINT8(s,
byte);
413 *value |= (
byte << 8U);
414 Stream_Read_UINT8(s,
byte);
419 *value = (
byte & 0x1FU) << 24U;
420 Stream_Read_UINT8(s,
byte);
421 *value |= (
byte << 16U);
422 Stream_Read_UINT8(s,
byte);
423 *value |= (
byte << 8U);
424 Stream_Read_UINT8(s,
byte);
429 *value = ((
byte & 0x1FU)) << 32U;
430 Stream_Read_UINT8(s,
byte);
431 *value |= (
byte << 24U);
432 Stream_Read_UINT8(s,
byte);
433 *value |= (
byte << 16U);
434 Stream_Read_UINT8(s,
byte);
435 *value |= (
byte << 8U);
436 Stream_Read_UINT8(s,
byte);
441 *value = ((
byte & 0x1FU)) << 40U;
442 Stream_Read_UINT8(s,
byte);
443 *value |= ((byte) << 32U);
444 Stream_Read_UINT8(s,
byte);
445 *value |= (
byte << 24U);
446 Stream_Read_UINT8(s,
byte);
447 *value |= (
byte << 16U);
448 Stream_Read_UINT8(s,
byte);
449 *value |= (
byte << 8U);
450 Stream_Read_UINT8(s,
byte);
455 *value = ((
byte & 0x1FU)) << 48U;
456 Stream_Read_UINT8(s,
byte);
457 *value |= ((byte) << 40U);
458 Stream_Read_UINT8(s,
byte);
459 *value |= ((byte) << 32U);
460 Stream_Read_UINT8(s,
byte);
461 *value |= (
byte << 24U);
462 Stream_Read_UINT8(s,
byte);
463 *value |= (
byte << 16U);
464 Stream_Read_UINT8(s,
byte);
465 *value |= (
byte << 8U);
466 Stream_Read_UINT8(s,
byte);
471 *value = ((
byte & 0x1FU)) << 56U;
472 Stream_Read_UINT8(s,
byte);
473 *value |= ((byte) << 48U);
474 Stream_Read_UINT8(s,
byte);
475 *value |= ((byte) << 40U);
476 Stream_Read_UINT8(s,
byte);
477 *value |= ((byte) << 32U);
478 Stream_Read_UINT8(s,
byte);
479 *value |= (
byte << 24U);
480 Stream_Read_UINT8(s,
byte);
481 *value |= (
byte << 16U);
482 Stream_Read_UINT8(s,
byte);
483 *value |= (
byte << 8U);
484 Stream_Read_UINT8(s,
byte);
495 BOOL rdpei_write_8byte_unsigned(
wStream* s, UINT64 value)
499 if (!Stream_EnsureRemainingCapacity(s, 8))
502 if (value <= 0x1FULL)
505 Stream_Write_UINT8(s,
byte);
507 else if (value <= 0x1FFFULL)
509 byte = (value >> 8) & 0x1F;
511 Stream_Write_UINT8(s,
byte);
512 byte = (value & 0xFF);
513 Stream_Write_UINT8(s,
byte);
515 else if (value <= 0x1FFFFFULL)
517 byte = (value >> 16) & 0x1F;
519 Stream_Write_UINT8(s,
byte);
520 byte = (value >> 8) & 0xFF;
521 Stream_Write_UINT8(s,
byte);
522 byte = (value & 0xFF);
523 Stream_Write_UINT8(s,
byte);
525 else if (value <= 0x1FFFFFFFULL)
527 byte = (value >> 24) & 0x1F;
529 Stream_Write_UINT8(s,
byte);
530 byte = (value >> 16) & 0xFF;
531 Stream_Write_UINT8(s,
byte);
532 byte = (value >> 8) & 0xFF;
533 Stream_Write_UINT8(s,
byte);
534 byte = (value & 0xFF);
535 Stream_Write_UINT8(s,
byte);
537 else if (value <= 0x1FFFFFFFFFULL)
539 byte = (value >> 32) & 0x1F;
541 Stream_Write_UINT8(s,
byte);
542 byte = (value >> 24) & 0x1F;
543 Stream_Write_UINT8(s,
byte);
544 byte = (value >> 16) & 0xFF;
545 Stream_Write_UINT8(s,
byte);
546 byte = (value >> 8) & 0xFF;
547 Stream_Write_UINT8(s,
byte);
548 byte = (value & 0xFF);
549 Stream_Write_UINT8(s,
byte);
551 else if (value <= 0x1FFFFFFFFFFFULL)
553 byte = (value >> 40) & 0x1F;
555 Stream_Write_UINT8(s,
byte);
556 byte = (value >> 32) & 0x1F;
557 Stream_Write_UINT8(s,
byte);
558 byte = (value >> 24) & 0x1F;
559 Stream_Write_UINT8(s,
byte);
560 byte = (value >> 16) & 0xFF;
561 Stream_Write_UINT8(s,
byte);
562 byte = (value >> 8) & 0xFF;
563 Stream_Write_UINT8(s,
byte);
564 byte = (value & 0xFF);
565 Stream_Write_UINT8(s,
byte);
567 else if (value <= 0x1FFFFFFFFFFFFFULL)
569 byte = (value >> 48) & 0x1F;
571 Stream_Write_UINT8(s,
byte);
572 byte = (value >> 40) & 0x1F;
573 Stream_Write_UINT8(s,
byte);
574 byte = (value >> 32) & 0x1F;
575 Stream_Write_UINT8(s,
byte);
576 byte = (value >> 24) & 0x1F;
577 Stream_Write_UINT8(s,
byte);
578 byte = (value >> 16) & 0xFF;
579 Stream_Write_UINT8(s,
byte);
580 byte = (value >> 8) & 0xFF;
581 Stream_Write_UINT8(s,
byte);
582 byte = (value & 0xFF);
583 Stream_Write_UINT8(s,
byte);
585 else if (value <= 0x1FFFFFFFFFFFFFFFULL)
587 byte = (value >> 56) & 0x1F;
589 Stream_Write_UINT8(s,
byte);
590 byte = (value >> 48) & 0x1F;
591 Stream_Write_UINT8(s,
byte);
592 byte = (value >> 40) & 0x1F;
593 Stream_Write_UINT8(s,
byte);
594 byte = (value >> 32) & 0x1F;
595 Stream_Write_UINT8(s,
byte);
596 byte = (value >> 24) & 0x1F;
597 Stream_Write_UINT8(s,
byte);
598 byte = (value >> 16) & 0xFF;
599 Stream_Write_UINT8(s,
byte);
600 byte = (value >> 8) & 0xFF;
601 Stream_Write_UINT8(s,
byte);
602 byte = (value & 0xFF);
603 Stream_Write_UINT8(s,
byte);
615 for (UINT16 i = 0; i <
event->frameCount; i++)
616 touch_frame_reset(&event->frames[i]);
619 event->frames = NULL;
620 event->frameCount = 0;
625 free(frame->contacts);
626 frame->contacts = NULL;
627 frame->contactCount = 0;
632 for (UINT16 i = 0; i <
event->frameCount; i++)
633 pen_frame_reset(&event->frames[i]);
636 event->frames = NULL;
637 event->frameCount = 0;
642 free(frame->contacts);
643 frame->contacts = NULL;
644 frame->contactCount = 0;