23#ifndef WINPR_UTILS_STREAM_H
24#define WINPR_UTILS_STREAM_H
26#include <winpr/winpr.h>
27#include <winpr/wtypes.h>
28#include <winpr/endian.h>
29#include <winpr/synch.h>
30#include <winpr/assert.h>
31#include <winpr/cast.h>
32#include <winpr/wlog.h>
39 typedef struct s_wStreamPool wStreamPool;
50 BOOL isAllocatedStream;
60 static inline wStream Stream_Init(
void)
62 const wStream empty = {
nullptr,
nullptr, 0, 0, 0,
nullptr, FALSE, FALSE };
66 WINPR_ATTR_NODISCARD
static inline size_t Stream_Capacity(
const wStream* _s);
69 WINPR_API
size_t Stream_GetRemainingCapacity(
const wStream* _s);
72 WINPR_API
size_t Stream_GetRemainingLength(
const wStream* _s);
75 WINPR_API BOOL Stream_EnsureCapacity(
wStream* s,
size_t size);
78 WINPR_API BOOL Stream_EnsureRemainingCapacity(
wStream* s,
size_t size);
80#define WINPR_STREAM_CAST(t, val) WINPR_PACKED_ALIGN_CAST(t, val)
82#define Stream_CheckAndLogRequiredCapacityOfSize(tag, s, nmemb, size) \
83 Stream_CheckAndLogRequiredCapacityEx(tag, WLOG_WARN, s, nmemb, size, "%s(%s:%" PRIuz ")", \
84 __func__, __FILE__, (size_t)__LINE__)
85#define Stream_CheckAndLogRequiredCapacity(tag, s, len) \
86 Stream_CheckAndLogRequiredCapacityOfSize((tag), (s), (len), 1)
89 WINPR_API BOOL Stream_CheckAndLogRequiredCapacityEx(
const char* tag, DWORD level,
wStream* s,
90 size_t nmemb,
size_t size,
const char* fmt,
94 WINPR_API BOOL Stream_CheckAndLogRequiredCapacityExVa(
const char* tag, DWORD level,
wStream* s,
95 size_t nmemb,
size_t size,
96 const char* fmt, va_list args);
98#define Stream_CheckAndLogRequiredCapacityOfSizeWLog(log, s, nmemb, size) \
99 Stream_CheckAndLogRequiredCapacityWLogEx(log, WLOG_WARN, s, nmemb, size, "%s(%s:%" PRIuz ")", \
100 __func__, __FILE__, (size_t)__LINE__)
102#define Stream_CheckAndLogRequiredCapacityWLog(log, s, len) \
103 Stream_CheckAndLogRequiredCapacityOfSizeWLog((log), (s), (len), 1)
106 WINPR_API BOOL Stream_CheckAndLogRequiredCapacityWLogEx(wLog* log, DWORD level,
wStream* s,
107 size_t nmemb,
size_t size,
108 const char* fmt, ...);
111 WINPR_API BOOL Stream_CheckAndLogRequiredCapacityWLogExVa(wLog* log, DWORD level,
wStream* s,
112 size_t nmemb,
size_t size,
113 const char* fmt, va_list args);
115 WINPR_API
void Stream_Free(
wStream* s, BOOL bFreeBuffer);
117 WINPR_ATTR_MALLOC(Stream_Free, 1)
118 WINPR_API
wStream* Stream_New(BYTE* buffer,
size_t size);
120 WINPR_API
wStream* Stream_StaticConstInit(
wStream* s, const BYTE* buffer,
size_t size);
122 WINPR_API
wStream* Stream_StaticInit(
wStream* s, BYTE* buffer,
size_t size);
124#define Stream_CheckAndLogRequiredLengthOfSize(tag, s, nmemb, size) \
125 Stream_CheckAndLogRequiredLengthEx(tag, WLOG_WARN, s, nmemb, size, "%s(%s:%" PRIuz ")", \
126 __func__, __FILE__, (size_t)__LINE__)
127#define Stream_CheckAndLogRequiredLength(tag, s, len) \
128 Stream_CheckAndLogRequiredLengthOfSize(tag, s, len, 1)
131 WINPR_API BOOL Stream_CheckAndLogRequiredLengthEx(
const char* tag, DWORD level,
wStream* s,
132 size_t nmemb,
size_t size,
const char* fmt,
136 WINPR_API BOOL Stream_CheckAndLogRequiredLengthExVa(
const char* tag, DWORD level,
wStream* s,
137 size_t nmemb,
size_t size,
const char* fmt,
140#define Stream_CheckAndLogRequiredLengthOfSizeWLog(log, s, nmemb, size) \
141 Stream_CheckAndLogRequiredLengthWLogEx(log, WLOG_WARN, s, nmemb, size, "%s(%s:%" PRIuz ")", \
142 __func__, __FILE__, (size_t)__LINE__)
143#define Stream_CheckAndLogRequiredLengthWLog(log, s, len) \
144 Stream_CheckAndLogRequiredLengthOfSizeWLog(log, s, len, 1)
147 WINPR_API BOOL Stream_CheckAndLogRequiredLengthWLogEx(wLog* log, DWORD level,
wStream* s,
148 size_t nmemb,
size_t size,
149 const char* fmt, ...);
152 WINPR_API BOOL Stream_CheckAndLogRequiredLengthWLogExVa(wLog* log, DWORD level,
wStream* s,
153 size_t nmemb,
size_t size,
154 const char* fmt, va_list args);
156 static inline void Stream_Seek(
wStream* s,
size_t _offset)
159 WINPR_ASSERT(Stream_GetRemainingCapacity(s) >= _offset);
160 s->pointer += (_offset);
163 static inline void Stream_Rewind(
wStream* s,
size_t _offset)
166 WINPR_ASSERT(s->buffer <= s->pointer);
167 const size_t cur = WINPR_ASSERTING_INT_CAST(
size_t, s->pointer - s->buffer);
168 WINPR_ASSERT(cur >= _offset);
170 s->pointer -= (_offset);
172 s->pointer = s->buffer;
175 WINPR_ATTR_NODISCARD
static inline UINT8 stream_read_u8(
wStream* _s, BOOL seek)
178 WINPR_ASSERT(Stream_GetRemainingLength(_s) >=
sizeof(UINT8));
180 const UINT8 v = winpr_Data_Get_UINT8(_s->pointer);
182 Stream_Seek(_s,
sizeof(UINT8));
186 WINPR_ATTR_NODISCARD
static inline INT8 stream_read_i8(
wStream* _s, BOOL seek)
188 const INT8 v = winpr_Data_Get_INT8(_s->pointer);
190 Stream_Seek(_s,
sizeof(INT8));
194 WINPR_ATTR_NODISCARD
static inline UINT16 stream_read_u16_le(
wStream* _s, BOOL seek)
196 const size_t typesize =
sizeof(UINT16);
198 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
200 const UINT16 v = winpr_Data_Get_UINT16(_s->pointer);
202 Stream_Seek(_s, typesize);
206 WINPR_ATTR_NODISCARD
static inline UINT16 stream_read_u16_be(
wStream* _s, BOOL seek)
208 const size_t typesize =
sizeof(UINT16);
210 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
212 const UINT16 v = winpr_Data_Get_UINT16_BE(_s->pointer);
214 Stream_Seek(_s, typesize);
218 WINPR_ATTR_NODISCARD
static inline INT16 stream_read_i16_le(
wStream* _s, BOOL seek)
220 const size_t typesize =
sizeof(INT16);
222 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
224 const INT16 v = winpr_Data_Get_INT16(_s->pointer);
226 Stream_Seek(_s, typesize);
230 WINPR_ATTR_NODISCARD
static inline INT16 stream_read_i16_be(
wStream* _s, BOOL seek)
232 const size_t typesize =
sizeof(INT16);
234 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
236 const INT16 v = winpr_Data_Get_INT16_BE(_s->pointer);
238 Stream_Seek(_s, typesize);
242 WINPR_ATTR_NODISCARD
static inline UINT32 stream_read_u32_le(
wStream* _s, BOOL seek)
244 const size_t typesize =
sizeof(UINT32);
246 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
248 const UINT32 v = winpr_Data_Get_UINT32(_s->pointer);
250 Stream_Seek(_s, typesize);
254 WINPR_ATTR_NODISCARD
static inline UINT32 stream_read_u32_be(
wStream* _s, BOOL seek)
256 const size_t typesize =
sizeof(UINT32);
258 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
260 const UINT32 v = winpr_Data_Get_UINT32_BE(_s->pointer);
262 Stream_Seek(_s, typesize);
266 WINPR_ATTR_NODISCARD
static inline INT32 stream_read_i32_le(
wStream* _s, BOOL seek)
268 const size_t typesize =
sizeof(INT32);
270 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
272 const INT32 v = winpr_Data_Get_INT32(_s->pointer);
274 Stream_Seek(_s, typesize);
278 WINPR_ATTR_NODISCARD
static inline INT32 stream_read_i32_be(
wStream* _s, BOOL seek)
280 const size_t typesize =
sizeof(INT32);
282 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
284 const INT32 v = winpr_Data_Get_INT32_BE(_s->pointer);
286 Stream_Seek(_s, typesize);
290 WINPR_ATTR_NODISCARD
static inline UINT64 stream_read_u64_le(
wStream* _s, BOOL seek)
292 const size_t typesize =
sizeof(UINT64);
294 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
296 const UINT64 v = winpr_Data_Get_UINT64(_s->pointer);
298 Stream_Seek(_s, typesize);
302 WINPR_ATTR_NODISCARD
static inline UINT64 stream_read_u64_be(
wStream* _s, BOOL seek)
304 const size_t typesize =
sizeof(UINT64);
306 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
308 const UINT64 v = winpr_Data_Get_UINT64_BE(_s->pointer);
310 Stream_Seek(_s, typesize);
314 WINPR_ATTR_NODISCARD
static inline INT64 stream_read_i64_le(
wStream* _s, BOOL seek)
316 const size_t typesize =
sizeof(INT64);
318 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
320 const INT64 v = winpr_Data_Get_INT64(_s->pointer);
322 Stream_Seek(_s, typesize);
326 WINPR_ATTR_NODISCARD
static inline INT64 stream_read_i64_be(
wStream* _s, BOOL seek)
328 const size_t typesize =
sizeof(INT64);
330 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
332 const INT64 v = winpr_Data_Get_INT64_BE(_s->pointer);
334 Stream_Seek(_s, typesize);
344 WINPR_ATTR_NODISCARD
static inline UINT8 Stream_Get_UINT8(
wStream* _s)
346 return stream_read_u8(_s, TRUE);
355 WINPR_ATTR_NODISCARD
static inline INT8 Stream_Get_INT8(
wStream* _s)
357 return stream_read_i8(_s, TRUE);
366 WINPR_ATTR_NODISCARD
static inline UINT16 Stream_Get_UINT16(
wStream* _s)
368 return stream_read_u16_le(_s, TRUE);
377 WINPR_ATTR_NODISCARD
static inline INT16 Stream_Get_INT16(
wStream* _s)
379 return stream_read_i16_le(_s, TRUE);
388 WINPR_ATTR_NODISCARD
static inline UINT16 Stream_Get_UINT16_BE(
wStream* _s)
390 return stream_read_u16_be(_s, TRUE);
399 WINPR_ATTR_NODISCARD
static inline INT16 Stream_Get_INT16_BE(
wStream* _s)
401 return stream_read_i16_be(_s, TRUE);
410 WINPR_ATTR_NODISCARD
static inline UINT32 Stream_Get_UINT32(
wStream* _s)
412 return stream_read_u32_le(_s, TRUE);
421 WINPR_ATTR_NODISCARD
static inline INT32 Stream_Get_INT32(
wStream* _s)
423 return stream_read_i32_le(_s, TRUE);
432 WINPR_ATTR_NODISCARD
static inline UINT32 Stream_Get_UINT32_BE(
wStream* _s)
434 return stream_read_u32_be(_s, TRUE);
443 WINPR_ATTR_NODISCARD
static inline INT32 Stream_Get_INT32_BE(
wStream* _s)
445 return stream_read_i32_be(_s, TRUE);
454 WINPR_ATTR_NODISCARD
static inline UINT64 Stream_Get_UINT64(
wStream* _s)
456 return stream_read_u64_le(_s, TRUE);
465 WINPR_ATTR_NODISCARD
static inline INT64 Stream_Get_INT64(
wStream* _s)
467 return stream_read_i64_le(_s, TRUE);
476 WINPR_ATTR_NODISCARD
static inline UINT64 Stream_Get_UINT64_BE(
wStream* _s)
478 return stream_read_u64_be(_s, TRUE);
487 WINPR_ATTR_NODISCARD
static inline INT64 Stream_Get_INT64_BE(
wStream* _s)
489 return stream_read_i64_be(_s, TRUE);
498 WINPR_ATTR_NODISCARD
static inline UINT8 Stream_Peek_Get_UINT8(
wStream* _s)
500 return stream_read_u8(_s, FALSE);
509 WINPR_ATTR_NODISCARD
static inline INT8 Stream_Peek_Get_INT8(
wStream* _s)
511 return stream_read_i8(_s, FALSE);
520 WINPR_ATTR_NODISCARD
static inline UINT16 Stream_Peek_Get_UINT16(
wStream* _s)
522 return stream_read_u16_le(_s, FALSE);
531 WINPR_ATTR_NODISCARD
static inline INT16 Stream_Peek_Get_INT16(
wStream* _s)
533 return stream_read_i16_le(_s, FALSE);
542 WINPR_ATTR_NODISCARD
static inline UINT16 Stream_Peek_Get_UINT16_BE(
wStream* _s)
544 return stream_read_u16_be(_s, FALSE);
553 WINPR_ATTR_NODISCARD
static inline INT16 Stream_Peek_Get_INT16_BE(
wStream* _s)
555 return stream_read_i16_be(_s, FALSE);
564 WINPR_ATTR_NODISCARD
static inline UINT32 Stream_Peek_Get_UINT32(
wStream* _s)
566 return stream_read_u32_le(_s, FALSE);
575 WINPR_ATTR_NODISCARD
static inline INT32 Stream_Peek_Get_INT32(
wStream* _s)
577 return stream_read_i32_le(_s, FALSE);
586 WINPR_ATTR_NODISCARD
static inline UINT32 Stream_Peek_Get_UINT32_BE(
wStream* _s)
588 return stream_read_u32_be(_s, FALSE);
597 WINPR_ATTR_NODISCARD
static inline INT32 Stream_Peek_Get_INT32_BE(
wStream* _s)
599 return stream_read_i32_be(_s, FALSE);
608 WINPR_ATTR_NODISCARD
static inline UINT64 Stream_Peek_Get_UINT64(
wStream* _s)
610 return stream_read_u64_le(_s, FALSE);
619 WINPR_ATTR_NODISCARD
static inline INT64 Stream_Peek_Get_INT64(
wStream* _s)
621 return stream_read_i64_le(_s, FALSE);
630 WINPR_ATTR_NODISCARD
static inline UINT64 Stream_Peek_Get_UINT64_BE(
wStream* _s)
632 return stream_read_u64_be(_s, FALSE);
641 WINPR_ATTR_NODISCARD
static inline INT64 Stream_Peek_Get_INT64_BE(
wStream* _s)
643 return stream_read_i64_be(_s, FALSE);
646#define Stream_Read_UINT8(_s, _v) \
649 _v = stream_read_u8(_s, TRUE); \
652#define Stream_Read_INT8(_s, _v) \
655 _v = stream_read_i8(_s, TRUE); \
658#define Stream_Read_UINT16(_s, _v) \
661 _v = stream_read_u16_le(_s, TRUE); \
664#define Stream_Read_INT16(_s, _v) \
667 _v = stream_read_i16_le(_s, TRUE); \
670#define Stream_Read_UINT16_BE(_s, _v) \
673 _v = stream_read_u16_be(_s, TRUE); \
676#define Stream_Read_INT16_BE(_s, _v) \
679 _v = stream_read_i16_be(_s, TRUE); \
682#define Stream_Read_UINT32(_s, _v) \
685 _v = stream_read_u32_le(_s, TRUE); \
688#define Stream_Read_INT32(_s, _v) \
691 _v = stream_read_i32_le(_s, TRUE); \
694#define Stream_Read_UINT32_BE(_s, _v) \
697 _v = stream_read_u32_be(_s, TRUE); \
700#define Stream_Read_INT32_BE(_s, _v) \
703 _v = stream_read_i32_be(_s, TRUE); \
706#define Stream_Read_UINT64(_s, _v) \
709 _v = stream_read_u64_le(_s, TRUE); \
712#define Stream_Read_INT64(_s, _v) \
715 _v = stream_read_i64_le(_s, TRUE); \
718#define Stream_Read_UINT64_BE(_s, _v) \
721 _v = stream_read_u64_be(_s, TRUE); \
724#define Stream_Read_INT64_BE(_s, _v) \
727 _v = stream_read_i64_be(_s, TRUE); \
730 static inline void Stream_Read(
wStream* _s,
void* _b,
size_t _n)
733 WINPR_ASSERT(_b || (_n == 0));
734 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= _n);
735 memcpy(_b, (_s->pointer), (_n));
739#define Stream_Peek_UINT8(_s, _v) \
742 _v = stream_read_u8(_s, FALSE); \
745#define Stream_Peek_INT8(_s, _v) \
748 _v = stream_read_i8(_s, FALSE); \
751#define Stream_Peek_UINT16(_s, _v) \
754 _v = stream_read_u16_le(_s, FALSE); \
757#define Stream_Peek_INT16(_s, _v) \
760 _v = stream_read_i16_le(_s, FALSE); \
763#define Stream_Peek_UINT16_BE(_s, _v) \
766 _v = stream_read_u16_be(_s, FALSE); \
769#define Stream_Peek_INT16_BE(_s, _v) \
772 _v = stream_read_i16_be(_s, FALSE); \
775#define Stream_Peek_UINT32(_s, _v) \
778 _v = stream_read_u32_le(_s, FALSE); \
781#define Stream_Peek_INT32(_s, _v) \
784 _v = stream_read_i32_le(_s, FALSE); \
787#define Stream_Peek_UINT32_BE(_s, _v) \
790 _v = stream_read_u32_be(_s, FALSE); \
793#define Stream_Peek_INT32_BE(_s, _v) \
796 _v = stream_read_i32_be(_s, FALSE); \
799#define Stream_Peek_UINT64(_s, _v) \
802 _v = stream_read_u64_le(_s, FALSE); \
805#define Stream_Peek_INT64(_s, _v) \
808 _v = stream_read_i64_le(_s, FALSE); \
811#define Stream_Peek_UINT64_BE(_s, _v) \
814 _v = stream_read_u64_be(_s, FALSE); \
817#define Stream_Peek_INT64_BE(_s, _v) \
820 _v = stream_read_i64_be(_s, FALSE); \
823 static inline void Stream_Peek(
const wStream* _s,
void* _b,
size_t _n)
826 WINPR_ASSERT(_b || (_n == 0));
827 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= _n);
828 memcpy(_b, (_s->pointer), (_n));
831#define Stream_Write_INT8(s, v) \
834 WINPR_ASSERT((v) <= INT8_MAX); \
835 WINPR_ASSERT((v) >= INT8_MIN); \
836 Stream_Write_INT8_unchecked((s), (v)); \
846 static inline void Stream_Write_INT8_unchecked(
wStream* _s, INT8 _v)
849 WINPR_ASSERT(_s->pointer);
850 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 1);
852 winpr_Data_Write_INT8(_s->pointer, _v);
856#define Stream_Write_UINT8(s, v) \
859 WINPR_ASSERT((v) <= UINT8_MAX); \
860 WINPR_ASSERT((v) >= 0); \
861 Stream_Write_UINT8_unchecked((s), (v)); \
871 static inline void Stream_Write_UINT8_unchecked(
wStream* _s, UINT8 _v)
874 WINPR_ASSERT(_s->pointer);
875 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 1);
877 winpr_Data_Write_UINT8(_s->pointer, _v);
881#define Stream_Write_INT16(s, v) \
884 WINPR_ASSERT((v) >= INT16_MIN); \
885 WINPR_ASSERT((v) <= INT16_MAX); \
886 Stream_Write_INT16_unchecked((s), (v)); \
897 static inline void Stream_Write_INT16_unchecked(
wStream* _s, INT16 _v)
900 WINPR_ASSERT(_s->pointer);
901 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 2);
903 winpr_Data_Write_INT16(_s->pointer, _v);
907#define Stream_Write_UINT16(s, v) \
910 WINPR_ASSERT((v) <= UINT16_MAX); \
911 WINPR_ASSERT((v) >= 0); \
912 Stream_Write_UINT16_unchecked((s), (v)); \
923 static inline void Stream_Write_UINT16_unchecked(
wStream* _s, UINT16 _v)
926 WINPR_ASSERT(_s->pointer);
927 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 2);
929 winpr_Data_Write_UINT16(_s->pointer, _v);
933#define Stream_Write_UINT16_BE(s, v) \
936 WINPR_ASSERT((v) <= UINT16_MAX); \
937 WINPR_ASSERT((v) >= 0); \
938 Stream_Write_UINT16_BE_unchecked((s), (v)); \
949 static inline void Stream_Write_UINT16_BE_unchecked(
wStream* _s, UINT16 _v)
952 WINPR_ASSERT(_s->pointer);
953 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 2);
955 winpr_Data_Write_UINT16_BE(_s->pointer, _v);
959#define Stream_Write_INT16_BE(s, v) \
962 WINPR_ASSERT((v) <= INT16_MAX); \
963 WINPR_ASSERT((v) >= INT16_MIN); \
964 Stream_Write_INT16_BE_unchecked((s), (v)); \
977 static inline void Stream_Write_INT16_BE_unchecked(
wStream* _s, INT16 _v)
980 WINPR_ASSERT(_s->pointer);
981 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 2);
983 winpr_Data_Write_INT16_BE(_s->pointer, _v);
987#define Stream_Write_UINT24_BE(s, v) \
990 WINPR_ASSERT((v) <= 0xFFFFFF); \
991 WINPR_ASSERT((v) >= 0); \
992 Stream_Write_UINT24_BE_unchecked((s), (v)); \
1003 static inline void Stream_Write_UINT24_BE_unchecked(
wStream* _s, UINT32 _v)
1006 WINPR_ASSERT(_s->pointer);
1007 WINPR_ASSERT(_v <= 0x00FFFFFF);
1008 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 3);
1010 *_s->pointer++ = ((_v) >> 16) & 0xFF;
1011 *_s->pointer++ = ((_v) >> 8) & 0xFF;
1012 *_s->pointer++ = (_v) & 0xFF;
1015#define Stream_Write_INT32(s, v) \
1018 WINPR_ASSERT((v) <= INT32_MAX); \
1019 WINPR_ASSERT((v) >= INT32_MIN); \
1020 Stream_Write_INT32_unchecked((s), (v)); \
1031 static inline void Stream_Write_INT32_unchecked(
wStream* _s, INT32 _v)
1034 WINPR_ASSERT(_s->pointer);
1035 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 4);
1037 winpr_Data_Write_INT32(_s->pointer, _v);
1041#define Stream_Write_INT32_BE(s, v) \
1044 WINPR_ASSERT((v) <= INT32_MAX); \
1045 WINPR_ASSERT((v) >= INT32_MIN); \
1046 Stream_Write_INT32_BE_unchecked((s), (v)); \
1059 static inline void Stream_Write_INT32_BE_unchecked(
wStream* _s, INT32 _v)
1062 WINPR_ASSERT(_s->pointer);
1063 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 4);
1065 winpr_Data_Write_INT32_BE(_s->pointer, _v);
1069#define Stream_Write_UINT32(s, v) \
1072 WINPR_ASSERT((v) <= UINT32_MAX); \
1073 WINPR_ASSERT((v) >= 0); \
1074 Stream_Write_UINT32_unchecked((s), (v)); \
1085 static inline void Stream_Write_UINT32_unchecked(
wStream* _s, UINT32 _v)
1088 WINPR_ASSERT(_s->pointer);
1089 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 4);
1091 winpr_Data_Write_UINT32(_s->pointer, _v);
1095#define Stream_Write_UINT32_BE(s, v) \
1098 WINPR_ASSERT((v) <= UINT32_MAX); \
1099 WINPR_ASSERT((v) >= 0); \
1100 Stream_Write_UINT32_BE_unchecked((s), (v)); \
1111 static inline void Stream_Write_UINT32_BE_unchecked(
wStream* _s, UINT32 _v)
1113 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 4);
1115 winpr_Data_Write_UINT32_BE(_s->pointer, _v);
1125 static inline void Stream_Write_UINT64(
wStream* _s, UINT64 _v)
1128 WINPR_ASSERT(_s->pointer);
1129 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 8);
1131 winpr_Data_Write_UINT64(_s->pointer, _v);
1141 static inline void Stream_Write_UINT64_BE(
wStream* _s, UINT64 _v)
1144 WINPR_ASSERT(_s->pointer);
1145 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 8);
1147 winpr_Data_Write_UINT64_BE(_s->pointer, _v);
1158 static inline void Stream_Write_INT64(
wStream* _s, INT64 _v)
1161 WINPR_ASSERT(_s->pointer);
1162 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 8);
1164 winpr_Data_Write_INT64(_s->pointer, _v);
1175 static inline void Stream_Write_INT64_BE(
wStream* _s, INT64 _v)
1178 WINPR_ASSERT(_s->pointer);
1179 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 8);
1181 winpr_Data_Write_INT64_BE(_s->pointer, _v);
1185 static inline void Stream_Write(
wStream* _s,
const void* _b,
size_t _n)
1191 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= _n);
1192 memcpy(_s->pointer, (_b), (_n));
1193 Stream_Seek(_s, _n);
1197 static inline void Stream_Seek_UINT8(
wStream* _s)
1199 Stream_Seek(_s,
sizeof(UINT8));
1201 static inline void Stream_Seek_UINT16(
wStream* _s)
1203 Stream_Seek(_s,
sizeof(UINT16));
1205 static inline void Stream_Seek_UINT32(
wStream* _s)
1207 Stream_Seek(_s,
sizeof(UINT32));
1209 static inline void Stream_Seek_UINT64(
wStream* _s)
1211 Stream_Seek(_s,
sizeof(UINT64));
1214 static inline void Stream_Rewind_UINT8(
wStream* _s)
1216 Stream_Rewind(_s,
sizeof(UINT8));
1218 static inline void Stream_Rewind_UINT16(
wStream* _s)
1220 Stream_Rewind(_s,
sizeof(UINT16));
1222 static inline void Stream_Rewind_UINT32(
wStream* _s)
1224 Stream_Rewind(_s,
sizeof(UINT32));
1226 static inline void Stream_Rewind_UINT64(
wStream* _s)
1228 Stream_Rewind(_s,
sizeof(UINT64));
1231 static inline void Stream_Fill(
wStream* _s,
int _v,
size_t _n)
1234 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= (_n));
1235 memset(_s->pointer, _v, (_n));
1236 Stream_Seek(_s, _n);
1239 static inline void Stream_Zero(
wStream* _s,
size_t _n)
1241 Stream_Fill(_s,
'\0', _n);
1244#define Stream_SafeZero(s, size) Stream_SafeZeroEx(s, size, __FILE__, __LINE__, __func__)
1261 WINPR_ATTR_NODISCARD
1262 WINPR_API BOOL Stream_SafeZeroEx(
wStream* s,
size_t size,
const char* file,
size_t line,
1265 static inline void Stream_Copy(
wStream* _src,
wStream* _dst,
size_t _n)
1269 WINPR_ASSERT(Stream_GetRemainingCapacity(_src) >= (_n));
1270 WINPR_ASSERT(Stream_GetRemainingCapacity(_dst) >= (_n));
1272 memcpy(_dst->pointer, _src->pointer, _n);
1273 Stream_Seek(_dst, _n);
1274 Stream_Seek(_src, _n);
1281#define Stream_BufferAs(s, type) WINPR_STREAM_CAST(type*, Stream_Buffer(s))
1283 WINPR_ATTR_NODISCARD
static inline BYTE* Stream_Buffer(
wStream* _s)
1293#define Stream_ConstBufferAs(s, type) WINPR_STREAM_CAST(type*, Stream_ConstBuffer(s))
1294 WINPR_ATTR_NODISCARD
static inline const BYTE* Stream_ConstBuffer(
const wStream* _s)
1300#define Stream_GetBuffer(_s, _b) _b = Stream_Buffer(_s)
1306#define Stream_GetBufferAs(_s, _b) _b = Stream_BufferAs(_s, __typeof(_b))
1308#define Stream_PointerAs(s, type) WINPR_STREAM_CAST(type*, Stream_Pointer(s))
1310 WINPR_ATTR_NODISCARD
static inline void* Stream_Pointer(
wStream* _s)
1316 WINPR_ATTR_NODISCARD
static inline const void* Stream_ConstPointer(
const wStream* _s)
1322#define Stream_GetPointer(_s, _p) _p = Stream_Pointer(_s)
1328#define Stream_GetPointerAs(_s, _p) _p = Stream_PointerAs(_s, __typeof(_p))
1330#if defined(WITH_WINPR_DEPRECATED)
1331 WINPR_DEPRECATED_VAR(
"Use Stream_SetPosition instead",
1332 WINPR_ATTR_NODISCARD WINPR_API BOOL Stream_SetPointer(
wStream* _s,
1335 WINPR_DEPRECATED_VAR(
"Use Stream_New(buffer, capacity) instead",
1336 WINPR_ATTR_NODISCARD WINPR_API BOOL Stream_SetBuffer(
wStream* _s,
1339 WINPR_DEPRECATED_VAR(
"Use Stream_New(buffer, capacity) instead",
1340 WINPR_API
void Stream_SetCapacity(
wStream* _s,
size_t capacity));
1343 WINPR_ATTR_NODISCARD
static inline size_t Stream_Length(
const wStream* _s)
1349#define Stream_GetLength(_s, _l) _l = Stream_Length(_s)
1350 WINPR_ATTR_NODISCARD
1351 WINPR_API BOOL Stream_SetLength(
wStream* _s,
size_t _l);
1353 WINPR_ATTR_NODISCARD
static inline size_t Stream_Capacity(
const wStream* _s)
1356 return _s->capacity;
1359#define Stream_GetCapacity(_s, _c) _c = Stream_Capacity(_s);
1361 WINPR_ATTR_NODISCARD
static inline size_t Stream_GetPosition(
const wStream* _s)
1364 WINPR_ASSERT(_s->buffer <= _s->pointer);
1365 return WINPR_ASSERTING_INT_CAST(
size_t, (_s->pointer - _s->buffer));
1376 static inline void Stream_ResetPosition(
wStream* _s)
1379 _s->pointer = _s->buffer;
1382 WINPR_ATTR_NODISCARD
1383 WINPR_API BOOL Stream_SetPosition(
wStream* _s,
size_t _p);
1385 WINPR_API
void Stream_SealLength(
wStream* _s);
1387 static inline void Stream_Clear(
wStream* _s)
1390 memset(_s->buffer, 0, _s->capacity);
1393#define Stream_SafeSeek(s, size) Stream_SafeSeekEx(s, size, __FILE__, __LINE__, __func__)
1394 WINPR_ATTR_NODISCARD
1395 WINPR_API BOOL Stream_SafeSeekEx(
wStream* s,
size_t size,
const char* file,
size_t line,
1398 WINPR_ATTR_NODISCARD
1399 WINPR_API BOOL Stream_Read_UTF16_String(
wStream* s, WCHAR* dst,
size_t charLength);
1401 WINPR_ATTR_NODISCARD
1402 WINPR_API BOOL Stream_Write_UTF16_String(
wStream* s,
const WCHAR* src,
size_t charLength);
1413 WINPR_ATTR_MALLOC(free, 1)
1414 WINPR_API
char* Stream_Read_UTF16_String_As_UTF8(
wStream* s,
size_t wcharLength,
1415 size_t* pUtfCharLength);
1426 WINPR_ATTR_NODISCARD
1427 WINPR_API SSIZE_T Stream_Read_UTF16_String_As_UTF8_Buffer(
wStream* s,
size_t wcharLength,
1429 size_t utfBufferCharLength);
1445 WINPR_ATTR_NODISCARD
1446 WINPR_API SSIZE_T Stream_Write_UTF16_String_From_UTF8(
wStream* s,
size_t wcharLength,
1447 const
char* src,
size_t length,
1452 WINPR_API
void StreamPool_Return(wStreamPool* pool,
wStream* s);
1459 WINPR_API
void Stream_AddRef(
wStream* s);
1468 WINPR_API
void Stream_Release(
wStream* s);
1470 WINPR_ATTR_MALLOC(Stream_Release, 1)
1471 WINPR_ATTR_NODISCARD
1472 WINPR_API
wStream* StreamPool_Take(wStreamPool* pool,
size_t size);
1474 WINPR_ATTR_NODISCARD
1475 WINPR_API
wStream* StreamPool_Find(wStreamPool* pool, const BYTE* ptr);
1485 WINPR_ATTR_NODISCARD
1486 WINPR_API
size_t StreamPool_UsedCount(wStreamPool* pool);
1498 WINPR_API BOOL StreamPool_WaitForReturn(wStreamPool* pool, UINT32 timeoutMS);
1500 WINPR_API
void StreamPool_Clear(wStreamPool* pool);
1502 WINPR_API
void StreamPool_Free(wStreamPool* pool);
1504 WINPR_ATTR_MALLOC(StreamPool_Free, 1)
1505 WINPR_API wStreamPool* StreamPool_New(BOOL synchronized,
size_t defaultSize);
1507 WINPR_API
char* StreamPool_GetStatistics(wStreamPool* pool,
char* buffer,
size_t size);