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_CXX_COMPAT_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)
167 WINPR_ASSERT(s->buffer <= s->pointer);
168 cur = WINPR_STREAM_CAST(
size_t, s->pointer - s->buffer);
169 WINPR_ASSERT(cur >= _offset);
171 s->pointer -= (_offset);
173 s->pointer = s->buffer;
176 WINPR_ATTR_NODISCARD
static inline UINT8 stream_read_u8(
wStream* _s, BOOL seek)
179 WINPR_ASSERT(Stream_GetRemainingLength(_s) >=
sizeof(UINT8));
181 const UINT8 v = winpr_Data_Get_UINT8(_s->pointer);
183 Stream_Seek(_s,
sizeof(UINT8));
187 WINPR_ATTR_NODISCARD
static inline INT8 stream_read_i8(
wStream* _s, BOOL seek)
189 const INT8 v = winpr_Data_Get_INT8(_s->pointer);
191 Stream_Seek(_s,
sizeof(INT8));
195 WINPR_ATTR_NODISCARD
static inline UINT16 stream_read_u16_le(
wStream* _s, BOOL seek)
197 const size_t typesize =
sizeof(UINT16);
199 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
201 const UINT16 v = winpr_Data_Get_UINT16(_s->pointer);
203 Stream_Seek(_s, typesize);
207 WINPR_ATTR_NODISCARD
static inline UINT16 stream_read_u16_be(
wStream* _s, BOOL seek)
209 const size_t typesize =
sizeof(UINT16);
211 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
213 const UINT16 v = winpr_Data_Get_UINT16_BE(_s->pointer);
215 Stream_Seek(_s, typesize);
219 WINPR_ATTR_NODISCARD
static inline INT16 stream_read_i16_le(
wStream* _s, BOOL seek)
221 const size_t typesize =
sizeof(INT16);
223 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
225 const INT16 v = winpr_Data_Get_INT16(_s->pointer);
227 Stream_Seek(_s, typesize);
231 WINPR_ATTR_NODISCARD
static inline INT16 stream_read_i16_be(
wStream* _s, BOOL seek)
233 const size_t typesize =
sizeof(INT16);
235 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
237 const INT16 v = winpr_Data_Get_INT16_BE(_s->pointer);
239 Stream_Seek(_s, typesize);
243 WINPR_ATTR_NODISCARD
static inline UINT32 stream_read_u32_le(
wStream* _s, BOOL seek)
245 const size_t typesize =
sizeof(UINT32);
247 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
249 const UINT32 v = winpr_Data_Get_UINT32(_s->pointer);
251 Stream_Seek(_s, typesize);
255 WINPR_ATTR_NODISCARD
static inline UINT32 stream_read_u32_be(
wStream* _s, BOOL seek)
257 const size_t typesize =
sizeof(UINT32);
259 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
261 const UINT32 v = winpr_Data_Get_UINT32_BE(_s->pointer);
263 Stream_Seek(_s, typesize);
267 WINPR_ATTR_NODISCARD
static inline INT32 stream_read_i32_le(
wStream* _s, BOOL seek)
269 const size_t typesize =
sizeof(INT32);
271 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
273 const INT32 v = winpr_Data_Get_INT32(_s->pointer);
275 Stream_Seek(_s, typesize);
279 WINPR_ATTR_NODISCARD
static inline INT32 stream_read_i32_be(
wStream* _s, BOOL seek)
281 const size_t typesize =
sizeof(INT32);
283 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
285 const INT32 v = winpr_Data_Get_INT32_BE(_s->pointer);
287 Stream_Seek(_s, typesize);
291 WINPR_ATTR_NODISCARD
static inline UINT64 stream_read_u64_le(
wStream* _s, BOOL seek)
293 const size_t typesize =
sizeof(UINT64);
295 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
297 const UINT64 v = winpr_Data_Get_UINT64(_s->pointer);
299 Stream_Seek(_s, typesize);
303 WINPR_ATTR_NODISCARD
static inline UINT64 stream_read_u64_be(
wStream* _s, BOOL seek)
305 const size_t typesize =
sizeof(UINT64);
307 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
309 const UINT64 v = winpr_Data_Get_UINT64_BE(_s->pointer);
311 Stream_Seek(_s, typesize);
315 WINPR_ATTR_NODISCARD
static inline INT64 stream_read_i64_le(
wStream* _s, BOOL seek)
317 const size_t typesize =
sizeof(INT64);
319 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
321 const INT64 v = winpr_Data_Get_INT64(_s->pointer);
323 Stream_Seek(_s, typesize);
327 WINPR_ATTR_NODISCARD
static inline INT64 stream_read_i64_be(
wStream* _s, BOOL seek)
329 const size_t typesize =
sizeof(INT64);
331 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
333 const INT64 v = winpr_Data_Get_INT64_BE(_s->pointer);
335 Stream_Seek(_s, typesize);
345 WINPR_ATTR_NODISCARD
static inline UINT8 Stream_Get_UINT8(
wStream* _s)
347 return stream_read_u8(_s, TRUE);
356 WINPR_ATTR_NODISCARD
static inline INT8 Stream_Get_INT8(
wStream* _s)
358 return stream_read_i8(_s, TRUE);
367 WINPR_ATTR_NODISCARD
static inline UINT16 Stream_Get_UINT16(
wStream* _s)
369 return stream_read_u16_le(_s, TRUE);
378 WINPR_ATTR_NODISCARD
static inline INT16 Stream_Get_INT16(
wStream* _s)
380 return stream_read_i16_le(_s, TRUE);
389 WINPR_ATTR_NODISCARD
static inline UINT16 Stream_Get_UINT16_BE(
wStream* _s)
391 return stream_read_u16_be(_s, TRUE);
400 WINPR_ATTR_NODISCARD
static inline INT16 Stream_Get_INT16_BE(
wStream* _s)
402 return stream_read_i16_be(_s, TRUE);
411 WINPR_ATTR_NODISCARD
static inline UINT32 Stream_Get_UINT32(
wStream* _s)
413 return stream_read_u32_le(_s, TRUE);
422 WINPR_ATTR_NODISCARD
static inline INT32 Stream_Get_INT32(
wStream* _s)
424 return stream_read_i32_le(_s, TRUE);
433 WINPR_ATTR_NODISCARD
static inline UINT32 Stream_Get_UINT32_BE(
wStream* _s)
435 return stream_read_u32_be(_s, TRUE);
444 WINPR_ATTR_NODISCARD
static inline INT32 Stream_Get_INT32_BE(
wStream* _s)
446 return stream_read_i32_be(_s, TRUE);
455 WINPR_ATTR_NODISCARD
static inline UINT64 Stream_Get_UINT64(
wStream* _s)
457 return stream_read_u64_le(_s, TRUE);
466 WINPR_ATTR_NODISCARD
static inline INT64 Stream_Get_INT64(
wStream* _s)
468 return stream_read_i64_le(_s, TRUE);
477 WINPR_ATTR_NODISCARD
static inline UINT64 Stream_Get_UINT64_BE(
wStream* _s)
479 return stream_read_u64_be(_s, TRUE);
488 WINPR_ATTR_NODISCARD
static inline INT64 Stream_Get_INT64_BE(
wStream* _s)
490 return stream_read_i64_be(_s, TRUE);
499 WINPR_ATTR_NODISCARD
static inline UINT8 Stream_Peek_Get_UINT8(
wStream* _s)
501 return stream_read_u8(_s, FALSE);
510 WINPR_ATTR_NODISCARD
static inline INT8 Stream_Peek_Get_INT8(
wStream* _s)
512 return stream_read_i8(_s, FALSE);
521 WINPR_ATTR_NODISCARD
static inline UINT16 Stream_Peek_Get_UINT16(
wStream* _s)
523 return stream_read_u16_le(_s, FALSE);
532 WINPR_ATTR_NODISCARD
static inline INT16 Stream_Peek_Get_INT16(
wStream* _s)
534 return stream_read_i16_le(_s, FALSE);
543 WINPR_ATTR_NODISCARD
static inline UINT16 Stream_Peek_Get_UINT16_BE(
wStream* _s)
545 return stream_read_u16_be(_s, FALSE);
554 WINPR_ATTR_NODISCARD
static inline INT16 Stream_Peek_Get_INT16_BE(
wStream* _s)
556 return stream_read_i16_be(_s, FALSE);
565 WINPR_ATTR_NODISCARD
static inline UINT32 Stream_Peek_Get_UINT32(
wStream* _s)
567 return stream_read_u32_le(_s, FALSE);
576 WINPR_ATTR_NODISCARD
static inline INT32 Stream_Peek_Get_INT32(
wStream* _s)
578 return stream_read_i32_le(_s, FALSE);
587 WINPR_ATTR_NODISCARD
static inline UINT32 Stream_Peek_Get_UINT32_BE(
wStream* _s)
589 return stream_read_u32_be(_s, FALSE);
598 WINPR_ATTR_NODISCARD
static inline INT32 Stream_Peek_Get_INT32_BE(
wStream* _s)
600 return stream_read_i32_be(_s, FALSE);
609 WINPR_ATTR_NODISCARD
static inline UINT64 Stream_Peek_Get_UINT64(
wStream* _s)
611 return stream_read_u64_le(_s, FALSE);
620 WINPR_ATTR_NODISCARD
static inline INT64 Stream_Peek_Get_INT64(
wStream* _s)
622 return stream_read_i64_le(_s, FALSE);
631 WINPR_ATTR_NODISCARD
static inline UINT64 Stream_Peek_Get_UINT64_BE(
wStream* _s)
633 return stream_read_u64_be(_s, FALSE);
642 WINPR_ATTR_NODISCARD
static inline INT64 Stream_Peek_Get_INT64_BE(
wStream* _s)
644 return stream_read_i64_be(_s, FALSE);
647#define Stream_Read_UINT8(_s, _v) \
650 _v = stream_read_u8(_s, TRUE); \
653#define Stream_Read_INT8(_s, _v) \
656 _v = stream_read_i8(_s, TRUE); \
659#define Stream_Read_UINT16(_s, _v) \
662 _v = stream_read_u16_le(_s, TRUE); \
665#define Stream_Read_INT16(_s, _v) \
668 _v = stream_read_i16_le(_s, TRUE); \
671#define Stream_Read_UINT16_BE(_s, _v) \
674 _v = stream_read_u16_be(_s, TRUE); \
677#define Stream_Read_INT16_BE(_s, _v) \
680 _v = stream_read_i16_be(_s, TRUE); \
683#define Stream_Read_UINT32(_s, _v) \
686 _v = stream_read_u32_le(_s, TRUE); \
689#define Stream_Read_INT32(_s, _v) \
692 _v = stream_read_i32_le(_s, TRUE); \
695#define Stream_Read_UINT32_BE(_s, _v) \
698 _v = stream_read_u32_be(_s, TRUE); \
701#define Stream_Read_INT32_BE(_s, _v) \
704 _v = stream_read_i32_be(_s, TRUE); \
707#define Stream_Read_UINT64(_s, _v) \
710 _v = stream_read_u64_le(_s, TRUE); \
713#define Stream_Read_INT64(_s, _v) \
716 _v = stream_read_i64_le(_s, TRUE); \
719#define Stream_Read_UINT64_BE(_s, _v) \
722 _v = stream_read_u64_be(_s, TRUE); \
725#define Stream_Read_INT64_BE(_s, _v) \
728 _v = stream_read_i64_be(_s, TRUE); \
731 static inline void Stream_Read(
wStream* _s,
void* _b,
size_t _n)
734 WINPR_ASSERT(_b || (_n == 0));
735 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= _n);
736 memcpy(_b, (_s->pointer), (_n));
740#define Stream_Peek_UINT8(_s, _v) \
743 _v = stream_read_u8(_s, FALSE); \
746#define Stream_Peek_INT8(_s, _v) \
749 _v = stream_read_i8(_s, FALSE); \
752#define Stream_Peek_UINT16(_s, _v) \
755 _v = stream_read_u16_le(_s, FALSE); \
758#define Stream_Peek_INT16(_s, _v) \
761 _v = stream_read_i16_le(_s, FALSE); \
764#define Stream_Peek_UINT16_BE(_s, _v) \
767 _v = stream_read_u16_be(_s, FALSE); \
770#define Stream_Peek_INT16_BE(_s, _v) \
773 _v = stream_read_i16_be(_s, FALSE); \
776#define Stream_Peek_UINT32(_s, _v) \
779 _v = stream_read_u32_le(_s, FALSE); \
782#define Stream_Peek_INT32(_s, _v) \
785 _v = stream_read_i32_le(_s, FALSE); \
788#define Stream_Peek_UINT32_BE(_s, _v) \
791 _v = stream_read_u32_be(_s, FALSE); \
794#define Stream_Peek_INT32_BE(_s, _v) \
797 _v = stream_read_i32_be(_s, FALSE); \
800#define Stream_Peek_UINT64(_s, _v) \
803 _v = stream_read_u64_le(_s, FALSE); \
806#define Stream_Peek_INT64(_s, _v) \
809 _v = stream_read_i64_le(_s, FALSE); \
812#define Stream_Peek_UINT64_BE(_s, _v) \
815 _v = stream_read_u64_be(_s, FALSE); \
818#define Stream_Peek_INT64_BE(_s, _v) \
821 _v = stream_read_i64_be(_s, FALSE); \
824 static inline void Stream_Peek(
const wStream* _s,
void* _b,
size_t _n)
827 WINPR_ASSERT(_b || (_n == 0));
828 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= _n);
829 memcpy(_b, (_s->pointer), (_n));
832#define Stream_Write_INT8(s, v) \
835 WINPR_ASSERT((v) <= INT8_MAX); \
836 WINPR_ASSERT((v) >= INT8_MIN); \
837 Stream_Write_INT8_unchecked((s), (v)); \
847 static inline void Stream_Write_INT8_unchecked(
wStream* _s, INT8 _v)
850 WINPR_ASSERT(_s->pointer);
851 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 1);
853 winpr_Data_Write_INT8(_s->pointer, _v);
857#define Stream_Write_UINT8(s, v) \
860 WINPR_ASSERT((v) <= UINT8_MAX); \
861 WINPR_ASSERT((v) >= 0); \
862 Stream_Write_UINT8_unchecked((s), (v)); \
872 static inline void Stream_Write_UINT8_unchecked(
wStream* _s, UINT8 _v)
875 WINPR_ASSERT(_s->pointer);
876 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 1);
878 winpr_Data_Write_UINT8(_s->pointer, _v);
882#define Stream_Write_INT16(s, v) \
885 WINPR_ASSERT((v) >= INT16_MIN); \
886 WINPR_ASSERT((v) <= INT16_MAX); \
887 Stream_Write_INT16_unchecked((s), (v)); \
898 static inline void Stream_Write_INT16_unchecked(
wStream* _s, INT16 _v)
901 WINPR_ASSERT(_s->pointer);
902 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 2);
904 winpr_Data_Write_INT16(_s->pointer, _v);
908#define Stream_Write_UINT16(s, v) \
911 WINPR_ASSERT((v) <= UINT16_MAX); \
912 WINPR_ASSERT((v) >= 0); \
913 Stream_Write_UINT16_unchecked((s), (v)); \
924 static inline void Stream_Write_UINT16_unchecked(
wStream* _s, UINT16 _v)
927 WINPR_ASSERT(_s->pointer);
928 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 2);
930 winpr_Data_Write_UINT16(_s->pointer, _v);
934#define Stream_Write_UINT16_BE(s, v) \
937 WINPR_ASSERT((v) <= UINT16_MAX); \
938 WINPR_ASSERT((v) >= 0); \
939 Stream_Write_UINT16_BE_unchecked((s), (v)); \
950 static inline void Stream_Write_UINT16_BE_unchecked(
wStream* _s, UINT16 _v)
953 WINPR_ASSERT(_s->pointer);
954 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 2);
956 winpr_Data_Write_UINT16_BE(_s->pointer, _v);
960#define Stream_Write_INT16_BE(s, v) \
963 WINPR_ASSERT((v) <= INT16_MAX); \
964 WINPR_ASSERT((v) >= INT16_MIN); \
965 Stream_Write_INT16_BE_unchecked((s), (v)); \
978 static inline void Stream_Write_INT16_BE_unchecked(
wStream* _s, INT16 _v)
981 WINPR_ASSERT(_s->pointer);
982 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 2);
984 winpr_Data_Write_INT16_BE(_s->pointer, _v);
988#define Stream_Write_UINT24_BE(s, v) \
991 WINPR_ASSERT((v) <= 0xFFFFFF); \
992 WINPR_ASSERT((v) >= 0); \
993 Stream_Write_UINT24_BE_unchecked((s), (v)); \
1004 static inline void Stream_Write_UINT24_BE_unchecked(
wStream* _s, UINT32 _v)
1007 WINPR_ASSERT(_s->pointer);
1008 WINPR_ASSERT(_v <= 0x00FFFFFF);
1009 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 3);
1011 *_s->pointer++ = ((_v) >> 16) & 0xFF;
1012 *_s->pointer++ = ((_v) >> 8) & 0xFF;
1013 *_s->pointer++ = (_v) & 0xFF;
1016#define Stream_Write_INT32(s, v) \
1019 WINPR_ASSERT((v) <= INT32_MAX); \
1020 WINPR_ASSERT((v) >= INT32_MIN); \
1021 Stream_Write_INT32_unchecked((s), (v)); \
1032 static inline void Stream_Write_INT32_unchecked(
wStream* _s, INT32 _v)
1035 WINPR_ASSERT(_s->pointer);
1036 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 4);
1038 winpr_Data_Write_INT32(_s->pointer, _v);
1042#define Stream_Write_INT32_BE(s, v) \
1045 WINPR_ASSERT((v) <= INT32_MAX); \
1046 WINPR_ASSERT((v) >= INT32_MIN); \
1047 Stream_Write_INT32_BE_unchecked((s), (v)); \
1060 static inline void Stream_Write_INT32_BE_unchecked(
wStream* _s, INT32 _v)
1063 WINPR_ASSERT(_s->pointer);
1064 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 4);
1066 winpr_Data_Write_INT32_BE(_s->pointer, _v);
1070#define Stream_Write_UINT32(s, v) \
1073 WINPR_ASSERT((v) <= UINT32_MAX); \
1074 WINPR_ASSERT((v) >= 0); \
1075 Stream_Write_UINT32_unchecked((s), (v)); \
1086 static inline void Stream_Write_UINT32_unchecked(
wStream* _s, UINT32 _v)
1089 WINPR_ASSERT(_s->pointer);
1090 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 4);
1092 winpr_Data_Write_UINT32(_s->pointer, _v);
1096#define Stream_Write_UINT32_BE(s, v) \
1099 WINPR_ASSERT((v) <= UINT32_MAX); \
1100 WINPR_ASSERT((v) >= 0); \
1101 Stream_Write_UINT32_BE_unchecked((s), (v)); \
1112 static inline void Stream_Write_UINT32_BE_unchecked(
wStream* _s, UINT32 _v)
1114 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 4);
1116 winpr_Data_Write_UINT32_BE(_s->pointer, _v);
1126 static inline void Stream_Write_UINT64(
wStream* _s, UINT64 _v)
1129 WINPR_ASSERT(_s->pointer);
1130 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 8);
1132 winpr_Data_Write_UINT64(_s->pointer, _v);
1142 static inline void Stream_Write_UINT64_BE(
wStream* _s, UINT64 _v)
1145 WINPR_ASSERT(_s->pointer);
1146 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 8);
1148 winpr_Data_Write_UINT64_BE(_s->pointer, _v);
1159 static inline void Stream_Write_INT64(
wStream* _s, INT64 _v)
1162 WINPR_ASSERT(_s->pointer);
1163 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 8);
1165 winpr_Data_Write_INT64(_s->pointer, _v);
1176 static inline void Stream_Write_INT64_BE(
wStream* _s, INT64 _v)
1179 WINPR_ASSERT(_s->pointer);
1180 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 8);
1182 winpr_Data_Write_INT64_BE(_s->pointer, _v);
1186 static inline void Stream_Write(
wStream* _s,
const void* _b,
size_t _n)
1192 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= _n);
1193 memcpy(_s->pointer, (_b), (_n));
1194 Stream_Seek(_s, _n);
1198 static inline void Stream_Seek_UINT8(
wStream* _s)
1200 Stream_Seek(_s,
sizeof(UINT8));
1202 static inline void Stream_Seek_UINT16(
wStream* _s)
1204 Stream_Seek(_s,
sizeof(UINT16));
1206 static inline void Stream_Seek_UINT32(
wStream* _s)
1208 Stream_Seek(_s,
sizeof(UINT32));
1210 static inline void Stream_Seek_UINT64(
wStream* _s)
1212 Stream_Seek(_s,
sizeof(UINT64));
1215 static inline void Stream_Rewind_UINT8(
wStream* _s)
1217 Stream_Rewind(_s,
sizeof(UINT8));
1219 static inline void Stream_Rewind_UINT16(
wStream* _s)
1221 Stream_Rewind(_s,
sizeof(UINT16));
1223 static inline void Stream_Rewind_UINT32(
wStream* _s)
1225 Stream_Rewind(_s,
sizeof(UINT32));
1227 static inline void Stream_Rewind_UINT64(
wStream* _s)
1229 Stream_Rewind(_s,
sizeof(UINT64));
1232 static inline void Stream_Fill(
wStream* _s,
int _v,
size_t _n)
1235 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= (_n));
1236 memset(_s->pointer, _v, (_n));
1237 Stream_Seek(_s, _n);
1240 static inline void Stream_Zero(
wStream* _s,
size_t _n)
1242 Stream_Fill(_s,
'\0', _n);
1245 static inline void Stream_Copy(
wStream* _src,
wStream* _dst,
size_t _n)
1249 WINPR_ASSERT(Stream_GetRemainingCapacity(_src) >= (_n));
1250 WINPR_ASSERT(Stream_GetRemainingCapacity(_dst) >= (_n));
1252 memcpy(_dst->pointer, _src->pointer, _n);
1253 Stream_Seek(_dst, _n);
1254 Stream_Seek(_src, _n);
1261#define Stream_BufferAs(s, type) WINPR_STREAM_CAST(type*, Stream_Buffer(s))
1263 WINPR_ATTR_NODISCARD
static inline BYTE* Stream_Buffer(
wStream* _s)
1273#define Stream_ConstBufferAs(s, type) WINPR_STREAM_CAST(type*, Stream_ConstBuffer(s))
1274 WINPR_ATTR_NODISCARD
static inline const BYTE* Stream_ConstBuffer(
const wStream* _s)
1280#define Stream_GetBuffer(_s, _b) _b = Stream_Buffer(_s)
1286#define Stream_GetBufferAs(_s, _b) _b = Stream_BufferAs(_s, __typeof(_b))
1288#define Stream_PointerAs(s, type) WINPR_STREAM_CAST(type*, Stream_Pointer(s))
1290 WINPR_ATTR_NODISCARD
static inline void* Stream_Pointer(
wStream* _s)
1296 WINPR_ATTR_NODISCARD
static inline const void* Stream_ConstPointer(
const wStream* _s)
1302#define Stream_GetPointer(_s, _p) _p = Stream_Pointer(_s)
1308#define Stream_GetPointerAs(_s, _p) _p = Stream_PointerAs(_s, __typeof(_p))
1310#if defined(WITH_WINPR_DEPRECATED)
1311 WINPR_DEPRECATED_VAR(
"Use Stream_SetPosition instead",
1312 WINPR_ATTR_NODISCARD WINPR_API BOOL Stream_SetPointer(
wStream* _s,
1315 WINPR_DEPRECATED_VAR(
"Use Stream_New(buffer, capacity) instead",
1316 WINPR_ATTR_NODISCARD WINPR_API BOOL Stream_SetBuffer(
wStream* _s,
1319 WINPR_DEPRECATED_VAR(
"Use Stream_New(buffer, capacity) instead",
1320 WINPR_API
void Stream_SetCapacity(
wStream* _s,
size_t capacity));
1323 WINPR_ATTR_NODISCARD
static inline size_t Stream_Length(
const wStream* _s)
1329#define Stream_GetLength(_s, _l) _l = Stream_Length(_s)
1330 WINPR_ATTR_NODISCARD
1331 WINPR_API BOOL Stream_SetLength(
wStream* _s,
size_t _l);
1333 WINPR_ATTR_NODISCARD
static inline size_t Stream_Capacity(
const wStream* _s)
1336 return _s->capacity;
1339#define Stream_GetCapacity(_s, _c) _c = Stream_Capacity(_s);
1341 WINPR_ATTR_NODISCARD
static inline size_t Stream_GetPosition(
const wStream* _s)
1344 WINPR_ASSERT(_s->buffer <= _s->pointer);
1345 return WINPR_STREAM_CAST(
size_t, (_s->pointer - _s->buffer));
1356 static inline void Stream_ResetPosition(
wStream* _s)
1359 _s->pointer = _s->buffer;
1362 WINPR_ATTR_NODISCARD
1363 WINPR_API BOOL Stream_SetPosition(
wStream* _s,
size_t _p);
1365 WINPR_API
void Stream_SealLength(
wStream* _s);
1367 static inline void Stream_Clear(
wStream* _s)
1370 memset(_s->buffer, 0, _s->capacity);
1373#define Stream_SafeSeek(s, size) Stream_SafeSeekEx(s, size, __FILE__, __LINE__, __func__)
1374 WINPR_ATTR_NODISCARD
1375 WINPR_API BOOL Stream_SafeSeekEx(
wStream* s,
size_t size,
const char* file,
size_t line,
1378 WINPR_ATTR_NODISCARD
1379 WINPR_API BOOL Stream_Read_UTF16_String(
wStream* s, WCHAR* dst,
size_t charLength);
1381 WINPR_ATTR_NODISCARD
1382 WINPR_API BOOL Stream_Write_UTF16_String(
wStream* s,
const WCHAR* src,
size_t charLength);
1393 WINPR_ATTR_MALLOC(free, 1)
1394 WINPR_API
char* Stream_Read_UTF16_String_As_UTF8(
wStream* s,
size_t wcharLength,
1395 size_t* pUtfCharLength);
1406 WINPR_ATTR_NODISCARD
1407 WINPR_API SSIZE_T Stream_Read_UTF16_String_As_UTF8_Buffer(
wStream* s,
size_t wcharLength,
1409 size_t utfBufferCharLength);
1422 WINPR_ATTR_NODISCARD
1423 WINPR_API SSIZE_T Stream_Write_UTF16_String_From_UTF8(
wStream* s,
size_t wcharLength,
1424 const
char* src,
size_t length,
1429 WINPR_API
void StreamPool_Return(wStreamPool* pool,
wStream* s);
1436 WINPR_API
void Stream_AddRef(
wStream* s);
1445 WINPR_API
void Stream_Release(
wStream* s);
1447 WINPR_ATTR_MALLOC(Stream_Release, 1)
1448 WINPR_ATTR_NODISCARD
1449 WINPR_API
wStream* StreamPool_Take(wStreamPool* pool,
size_t size);
1451 WINPR_ATTR_NODISCARD
1452 WINPR_API
wStream* StreamPool_Find(wStreamPool* pool, const BYTE* ptr);
1462 WINPR_ATTR_NODISCARD
1463 WINPR_API
size_t StreamPool_UsedCount(wStreamPool* pool);
1475 WINPR_API BOOL StreamPool_WaitForReturn(wStreamPool* pool, UINT32 timeoutMS);
1477 WINPR_API
void StreamPool_Clear(wStreamPool* pool);
1479 WINPR_API
void StreamPool_Free(wStreamPool* pool);
1481 WINPR_ATTR_MALLOC(StreamPool_Free, 1)
1482 WINPR_API wStreamPool* StreamPool_New(BOOL synchronized,
size_t defaultSize);
1484 WINPR_API
char* StreamPool_GetStatistics(wStreamPool* pool,
char* buffer,
size_t size);