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;
54 static inline size_t Stream_Capacity(
const wStream* _s);
55 WINPR_API
size_t Stream_GetRemainingCapacity(
const wStream* _s);
56 WINPR_API
size_t Stream_GetRemainingLength(
const wStream* _s);
58 WINPR_API BOOL Stream_EnsureCapacity(
wStream* s,
size_t size);
59 WINPR_API BOOL Stream_EnsureRemainingCapacity(
wStream* s,
size_t size);
61#define WINPR_STREAM_CAST(t, val) WINPR_CXX_COMPAT_CAST(t, val)
63#define Stream_CheckAndLogRequiredCapacityOfSize(tag, s, nmemb, size) \
64 Stream_CheckAndLogRequiredCapacityEx(tag, WLOG_WARN, s, nmemb, size, "%s(%s:%" PRIuz ")", \
65 __func__, __FILE__, (size_t)__LINE__)
66#define Stream_CheckAndLogRequiredCapacity(tag, s, len) \
67 Stream_CheckAndLogRequiredCapacityOfSize((tag), (s), (len), 1)
69 WINPR_API BOOL Stream_CheckAndLogRequiredCapacityEx(
const char* tag, DWORD level,
wStream* s,
70 size_t nmemb,
size_t size,
const char* fmt,
72 WINPR_API BOOL Stream_CheckAndLogRequiredCapacityExVa(
const char* tag, DWORD level,
wStream* s,
73 size_t nmemb,
size_t size,
74 const char* fmt, va_list args);
76#define Stream_CheckAndLogRequiredCapacityOfSizeWLog(log, s, nmemb, size) \
77 Stream_CheckAndLogRequiredCapacityWLogEx(log, WLOG_WARN, s, nmemb, size, "%s(%s:%" PRIuz ")", \
78 __func__, __FILE__, (size_t)__LINE__)
80#define Stream_CheckAndLogRequiredCapacityWLog(log, s, len) \
81 Stream_CheckAndLogRequiredCapacityOfSizeWLog((log), (s), (len), 1)
83 WINPR_API BOOL Stream_CheckAndLogRequiredCapacityWLogEx(wLog* log, DWORD level,
wStream* s,
84 size_t nmemb,
size_t size,
85 const char* fmt, ...);
86 WINPR_API BOOL Stream_CheckAndLogRequiredCapacityWLogExVa(wLog* log, DWORD level,
wStream* s,
87 size_t nmemb,
size_t size,
88 const char* fmt, va_list args);
90 WINPR_API
void Stream_Free(
wStream* s, BOOL bFreeBuffer);
92 WINPR_ATTR_MALLOC(Stream_Free, 1)
94 WINPR_API
wStream* Stream_New(BYTE* buffer,
size_t size);
95 WINPR_API
wStream* Stream_StaticConstInit(
wStream* s, const BYTE* buffer,
size_t size);
96 WINPR_API
wStream* Stream_StaticInit(
wStream* s, BYTE* buffer,
size_t size);
98#define Stream_CheckAndLogRequiredLengthOfSize(tag, s, nmemb, size) \
99 Stream_CheckAndLogRequiredLengthEx(tag, WLOG_WARN, s, nmemb, size, "%s(%s:%" PRIuz ")", \
100 __func__, __FILE__, (size_t)__LINE__)
101#define Stream_CheckAndLogRequiredLength(tag, s, len) \
102 Stream_CheckAndLogRequiredLengthOfSize(tag, s, len, 1)
104 WINPR_API BOOL Stream_CheckAndLogRequiredLengthEx(
const char* tag, DWORD level,
wStream* s,
105 size_t nmemb,
size_t size,
const char* fmt,
107 WINPR_API BOOL Stream_CheckAndLogRequiredLengthExVa(
const char* tag, DWORD level,
wStream* s,
108 size_t nmemb,
size_t size,
const char* fmt,
111#define Stream_CheckAndLogRequiredLengthOfSizeWLog(log, s, nmemb, size) \
112 Stream_CheckAndLogRequiredLengthWLogEx(log, WLOG_WARN, s, nmemb, size, "%s(%s:%" PRIuz ")", \
113 __func__, __FILE__, (size_t)__LINE__)
114#define Stream_CheckAndLogRequiredLengthWLog(log, s, len) \
115 Stream_CheckAndLogRequiredLengthOfSizeWLog(log, s, len, 1)
117 WINPR_API BOOL Stream_CheckAndLogRequiredLengthWLogEx(wLog* log, DWORD level,
wStream* s,
118 size_t nmemb,
size_t size,
119 const char* fmt, ...);
120 WINPR_API BOOL Stream_CheckAndLogRequiredLengthWLogExVa(wLog* log, DWORD level,
wStream* s,
121 size_t nmemb,
size_t size,
122 const char* fmt, va_list args);
124 static inline void Stream_Seek(
wStream* s,
size_t _offset)
127 WINPR_ASSERT(Stream_GetRemainingCapacity(s) >= _offset);
128 s->pointer += (_offset);
131 static inline void Stream_Rewind(
wStream* s,
size_t _offset)
135 WINPR_ASSERT(s->buffer <= s->pointer);
136 cur = WINPR_STREAM_CAST(
size_t, s->pointer - s->buffer);
137 WINPR_ASSERT(cur >= _offset);
139 s->pointer -= (_offset);
141 s->pointer = s->buffer;
144 static inline UINT8 stream_read_u8(
wStream* _s, BOOL seek)
147 WINPR_ASSERT(Stream_GetRemainingLength(_s) >=
sizeof(UINT8));
149 const UINT8 v = winpr_Data_Get_UINT8(_s->pointer);
151 Stream_Seek(_s,
sizeof(UINT8));
155 static inline INT8 stream_read_i8(
wStream* _s, BOOL seek)
157 const INT8 v = winpr_Data_Get_INT8(_s->pointer);
159 Stream_Seek(_s,
sizeof(INT8));
163 static inline UINT16 stream_read_u16_le(
wStream* _s, BOOL seek)
165 const size_t typesize =
sizeof(UINT16);
167 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
169 const UINT16 v = winpr_Data_Get_UINT16(_s->pointer);
171 Stream_Seek(_s, typesize);
175 static inline UINT16 stream_read_u16_be(
wStream* _s, BOOL seek)
177 const size_t typesize =
sizeof(UINT16);
179 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
181 const UINT16 v = winpr_Data_Get_UINT16_BE(_s->pointer);
183 Stream_Seek(_s, typesize);
187 static inline INT16 stream_read_i16_le(
wStream* _s, BOOL seek)
189 const size_t typesize =
sizeof(INT16);
191 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
193 const INT16 v = winpr_Data_Get_INT16(_s->pointer);
195 Stream_Seek(_s, typesize);
199 static inline INT16 stream_read_i16_be(
wStream* _s, BOOL seek)
201 const size_t typesize =
sizeof(INT16);
203 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
205 const INT16 v = winpr_Data_Get_INT16_BE(_s->pointer);
207 Stream_Seek(_s, typesize);
211 static inline UINT32 stream_read_u32_le(
wStream* _s, BOOL seek)
213 const size_t typesize =
sizeof(UINT32);
215 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
217 const UINT32 v = winpr_Data_Get_UINT32(_s->pointer);
219 Stream_Seek(_s, typesize);
223 static inline UINT32 stream_read_u32_be(
wStream* _s, BOOL seek)
225 const size_t typesize =
sizeof(UINT32);
227 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
229 const UINT32 v = winpr_Data_Get_UINT32_BE(_s->pointer);
231 Stream_Seek(_s, typesize);
235 static inline INT32 stream_read_i32_le(
wStream* _s, BOOL seek)
237 const size_t typesize =
sizeof(INT32);
239 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
241 const INT32 v = winpr_Data_Get_INT32(_s->pointer);
243 Stream_Seek(_s, typesize);
247 static inline INT32 stream_read_i32_be(
wStream* _s, BOOL seek)
249 const size_t typesize =
sizeof(INT32);
251 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
253 const INT32 v = winpr_Data_Get_INT32_BE(_s->pointer);
255 Stream_Seek(_s, typesize);
259 static inline UINT64 stream_read_u64_le(
wStream* _s, BOOL seek)
261 const size_t typesize =
sizeof(UINT64);
263 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
265 const UINT64 v = winpr_Data_Get_UINT64(_s->pointer);
267 Stream_Seek(_s, typesize);
271 static inline UINT64 stream_read_u64_be(
wStream* _s, BOOL seek)
273 const size_t typesize =
sizeof(UINT64);
275 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
277 const UINT64 v = winpr_Data_Get_UINT64_BE(_s->pointer);
279 Stream_Seek(_s, typesize);
283 static inline INT64 stream_read_i64_le(
wStream* _s, BOOL seek)
285 const size_t typesize =
sizeof(INT64);
287 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
289 const INT64 v = winpr_Data_Get_INT64(_s->pointer);
291 Stream_Seek(_s, typesize);
295 static inline INT64 stream_read_i64_be(
wStream* _s, BOOL seek)
297 const size_t typesize =
sizeof(INT64);
299 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
301 const INT64 v = winpr_Data_Get_INT64_BE(_s->pointer);
303 Stream_Seek(_s, typesize);
313 static inline UINT8 Stream_Get_UINT8(
wStream* _s)
315 return stream_read_u8(_s, TRUE);
324 static inline INT8 Stream_Get_INT8(
wStream* _s)
326 return stream_read_i8(_s, TRUE);
335 static inline UINT16 Stream_Get_UINT16(
wStream* _s)
337 return stream_read_u16_le(_s, TRUE);
346 static inline INT16 Stream_Get_INT16(
wStream* _s)
348 return stream_read_i16_le(_s, TRUE);
357 static inline UINT16 Stream_Get_UINT16_BE(
wStream* _s)
359 return stream_read_u16_be(_s, TRUE);
368 static inline INT16 Stream_Get_INT16_BE(
wStream* _s)
370 return stream_read_i16_be(_s, TRUE);
379 static inline UINT32 Stream_Get_UINT32(
wStream* _s)
381 return stream_read_u32_le(_s, TRUE);
390 static inline INT32 Stream_Get_INT32(
wStream* _s)
392 return stream_read_i32_le(_s, TRUE);
401 static inline UINT32 Stream_Get_UINT32_BE(
wStream* _s)
403 return stream_read_u32_be(_s, TRUE);
412 static inline INT32 Stream_Get_INT32_BE(
wStream* _s)
414 return stream_read_i32_be(_s, TRUE);
423 static inline UINT64 Stream_Get_UINT64(
wStream* _s)
425 return stream_read_u64_le(_s, TRUE);
434 static inline INT64 Stream_Get_INT64(
wStream* _s)
436 return stream_read_i64_le(_s, TRUE);
445 static inline UINT64 Stream_Get_UINT64_BE(
wStream* _s)
447 return stream_read_u64_be(_s, TRUE);
456 static inline INT64 Stream_Get_INT64_BE(
wStream* _s)
458 return stream_read_i64_be(_s, TRUE);
467 static inline UINT8 Stream_Peek_Get_UINT8(
wStream* _s)
469 return stream_read_u8(_s, FALSE);
478 static inline INT8 Stream_Peek_Get_INT8(
wStream* _s)
480 return stream_read_i8(_s, FALSE);
489 static inline UINT16 Stream_Peek_Get_UINT16(
wStream* _s)
491 return stream_read_u16_le(_s, FALSE);
500 static inline INT16 Stream_Peek_Get_INT16(
wStream* _s)
502 return stream_read_i16_le(_s, FALSE);
511 static inline UINT16 Stream_Peek_Get_UINT16_BE(
wStream* _s)
513 return stream_read_u16_be(_s, FALSE);
522 static inline INT16 Stream_Peek_Get_INT16_BE(
wStream* _s)
524 return stream_read_i16_be(_s, FALSE);
533 static inline UINT32 Stream_Peek_Get_UINT32(
wStream* _s)
535 return stream_read_u32_le(_s, FALSE);
544 static inline INT32 Stream_Peek_Get_INT32(
wStream* _s)
546 return stream_read_i32_le(_s, FALSE);
555 static inline UINT32 Stream_Peek_Get_UINT32_BE(
wStream* _s)
557 return stream_read_u32_be(_s, FALSE);
566 static inline INT32 Stream_Peek_Get_INT32_BE(
wStream* _s)
568 return stream_read_i32_be(_s, FALSE);
577 static inline UINT64 Stream_Peek_Get_UINT64(
wStream* _s)
579 return stream_read_u64_le(_s, FALSE);
588 static inline INT64 Stream_Peek_Get_INT64(
wStream* _s)
590 return stream_read_i64_le(_s, FALSE);
599 static inline UINT64 Stream_Peek_Get_UINT64_BE(
wStream* _s)
601 return stream_read_u64_be(_s, FALSE);
610 static inline INT64 Stream_Peek_Get_INT64_BE(
wStream* _s)
612 return stream_read_i64_be(_s, FALSE);
615#define Stream_Read_UINT8(_s, _v) \
618 _v = stream_read_u8(_s, TRUE); \
621#define Stream_Read_INT8(_s, _v) \
624 _v = stream_read_i8(_s, TRUE); \
627#define Stream_Read_UINT16(_s, _v) \
630 _v = stream_read_u16_le(_s, TRUE); \
633#define Stream_Read_INT16(_s, _v) \
636 _v = stream_read_i16_le(_s, TRUE); \
639#define Stream_Read_UINT16_BE(_s, _v) \
642 _v = stream_read_u16_be(_s, TRUE); \
645#define Stream_Read_INT16_BE(_s, _v) \
648 _v = stream_read_i16_be(_s, TRUE); \
651#define Stream_Read_UINT32(_s, _v) \
654 _v = stream_read_u32_le(_s, TRUE); \
657#define Stream_Read_INT32(_s, _v) \
660 _v = stream_read_i32_le(_s, TRUE); \
663#define Stream_Read_UINT32_BE(_s, _v) \
666 _v = stream_read_u32_be(_s, TRUE); \
669#define Stream_Read_INT32_BE(_s, _v) \
672 _v = stream_read_i32_be(_s, TRUE); \
675#define Stream_Read_UINT64(_s, _v) \
678 _v = stream_read_u64_le(_s, TRUE); \
681#define Stream_Read_INT64(_s, _v) \
684 _v = stream_read_i64_le(_s, TRUE); \
687#define Stream_Read_UINT64_BE(_s, _v) \
690 _v = stream_read_u64_be(_s, TRUE); \
693#define Stream_Read_INT64_BE(_s, _v) \
696 _v = stream_read_i64_be(_s, TRUE); \
699 static inline void Stream_Read(
wStream* _s,
void* _b,
size_t _n)
702 WINPR_ASSERT(_b || (_n == 0));
703 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= _n);
704 memcpy(_b, (_s->pointer), (_n));
708#define Stream_Peek_UINT8(_s, _v) \
711 _v = stream_read_u8(_s, FALSE); \
714#define Stream_Peek_INT8(_s, _v) \
717 _v = stream_read_i8(_s, FALSE); \
720#define Stream_Peek_UINT16(_s, _v) \
723 _v = stream_read_u16_le(_s, FALSE); \
726#define Stream_Peek_INT16(_s, _v) \
729 _v = stream_read_i16_le(_s, FALSE); \
732#define Stream_Peek_UINT16_BE(_s, _v) \
735 _v = stream_read_u16_be(_s, FALSE); \
738#define Stream_Peek_INT16_BE(_s, _v) \
741 _v = stream_read_i16_be(_s, FALSE); \
744#define Stream_Peek_UINT32(_s, _v) \
747 _v = stream_read_u32_le(_s, FALSE); \
750#define Stream_Peek_INT32(_s, _v) \
753 _v = stream_read_i32_le(_s, FALSE); \
756#define Stream_Peek_UINT32_BE(_s, _v) \
759 _v = stream_read_u32_be(_s, FALSE); \
762#define Stream_Peek_INT32_BE(_s, _v) \
765 _v = stream_read_i32_be(_s, FALSE); \
768#define Stream_Peek_UINT64(_s, _v) \
771 _v = stream_read_u64_le(_s, FALSE); \
774#define Stream_Peek_INT64(_s, _v) \
777 _v = stream_read_i64_le(_s, FALSE); \
780#define Stream_Peek_UINT64_BE(_s, _v) \
783 _v = stream_read_u64_be(_s, FALSE); \
786#define Stream_Peek_INT64_BE(_s, _v) \
789 _v = stream_read_i64_be(_s, FALSE); \
792 static inline void Stream_Peek(
const wStream* _s,
void* _b,
size_t _n)
795 WINPR_ASSERT(_b || (_n == 0));
796 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= _n);
797 memcpy(_b, (_s->pointer), (_n));
800#define Stream_Write_INT8(s, v) \
803 WINPR_ASSERT((v) <= INT8_MAX); \
804 WINPR_ASSERT((v) >= INT8_MIN); \
805 Stream_Write_INT8_unchecked((s), (v)); \
815 static inline void Stream_Write_INT8_unchecked(
wStream* _s, INT8 _v)
818 WINPR_ASSERT(_s->pointer);
819 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 1);
821 winpr_Data_Write_INT8(_s->pointer, _v);
825#define Stream_Write_UINT8(s, v) \
828 WINPR_ASSERT((v) <= UINT8_MAX); \
829 WINPR_ASSERT((v) >= 0); \
830 Stream_Write_UINT8_unchecked((s), (v)); \
840 static inline void Stream_Write_UINT8_unchecked(
wStream* _s, UINT8 _v)
843 WINPR_ASSERT(_s->pointer);
844 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 1);
846 winpr_Data_Write_UINT8(_s->pointer, _v);
850#define Stream_Write_INT16(s, v) \
853 WINPR_ASSERT((v) >= INT16_MIN); \
854 WINPR_ASSERT((v) <= INT16_MAX); \
855 Stream_Write_INT16_unchecked((s), (v)); \
866 static inline void Stream_Write_INT16_unchecked(
wStream* _s, INT16 _v)
869 WINPR_ASSERT(_s->pointer);
870 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 2);
872 winpr_Data_Write_INT16(_s->pointer, _v);
876#define Stream_Write_UINT16(s, v) \
879 WINPR_ASSERT((v) <= UINT16_MAX); \
880 WINPR_ASSERT((v) >= 0); \
881 Stream_Write_UINT16_unchecked((s), (v)); \
892 static inline void Stream_Write_UINT16_unchecked(
wStream* _s, UINT16 _v)
895 WINPR_ASSERT(_s->pointer);
896 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 2);
898 winpr_Data_Write_UINT16(_s->pointer, _v);
902#define Stream_Write_UINT16_BE(s, v) \
905 WINPR_ASSERT((v) <= UINT16_MAX); \
906 WINPR_ASSERT((v) >= 0); \
907 Stream_Write_UINT16_BE_unchecked((s), (v)); \
918 static inline void Stream_Write_UINT16_BE_unchecked(
wStream* _s, UINT16 _v)
921 WINPR_ASSERT(_s->pointer);
922 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 2);
924 winpr_Data_Write_UINT16_BE(_s->pointer, _v);
928#define Stream_Write_INT16_BE(s, v) \
931 WINPR_ASSERT((v) <= INT16_MAX); \
932 WINPR_ASSERT((v) >= INT16_MIN); \
933 Stream_Write_INT16_BE_unchecked((s), (v)); \
946 static inline void Stream_Write_INT16_BE_unchecked(
wStream* _s, INT16 _v)
949 WINPR_ASSERT(_s->pointer);
950 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 2);
952 winpr_Data_Write_INT16_BE(_s->pointer, _v);
956#define Stream_Write_UINT24_BE(s, v) \
959 WINPR_ASSERT((v) <= 0xFFFFFF); \
960 WINPR_ASSERT((v) >= 0); \
961 Stream_Write_UINT24_BE_unchecked((s), (v)); \
972 static inline void Stream_Write_UINT24_BE_unchecked(
wStream* _s, UINT32 _v)
975 WINPR_ASSERT(_s->pointer);
976 WINPR_ASSERT(_v <= 0x00FFFFFF);
977 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 3);
979 *_s->pointer++ = ((_v) >> 16) & 0xFF;
980 *_s->pointer++ = ((_v) >> 8) & 0xFF;
981 *_s->pointer++ = (_v) & 0xFF;
984#define Stream_Write_INT32(s, v) \
987 WINPR_ASSERT((v) <= INT32_MAX); \
988 WINPR_ASSERT((v) >= INT32_MIN); \
989 Stream_Write_INT32_unchecked((s), (v)); \
1000 static inline void Stream_Write_INT32_unchecked(
wStream* _s, INT32 _v)
1003 WINPR_ASSERT(_s->pointer);
1004 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 4);
1006 winpr_Data_Write_INT32(_s->pointer, _v);
1010#define Stream_Write_INT32_BE(s, v) \
1013 WINPR_ASSERT((v) <= INT32_MAX); \
1014 WINPR_ASSERT((v) >= INT32_MIN); \
1015 Stream_Write_INT32_BE_unchecked((s), (v)); \
1028 static inline void Stream_Write_INT32_BE_unchecked(
wStream* _s, INT32 _v)
1031 WINPR_ASSERT(_s->pointer);
1032 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 4);
1034 winpr_Data_Write_INT32_BE(_s->pointer, _v);
1038#define Stream_Write_UINT32(s, v) \
1041 WINPR_ASSERT((v) <= UINT32_MAX); \
1042 WINPR_ASSERT((v) >= 0); \
1043 Stream_Write_UINT32_unchecked((s), (v)); \
1054 static inline void Stream_Write_UINT32_unchecked(
wStream* _s, UINT32 _v)
1057 WINPR_ASSERT(_s->pointer);
1058 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 4);
1060 winpr_Data_Write_UINT32(_s->pointer, _v);
1064#define Stream_Write_UINT32_BE(s, v) \
1067 WINPR_ASSERT((v) <= UINT32_MAX); \
1068 WINPR_ASSERT((v) >= 0); \
1069 Stream_Write_UINT32_BE_unchecked((s), (v)); \
1080 static inline void Stream_Write_UINT32_BE_unchecked(
wStream* _s, UINT32 _v)
1082 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 4);
1084 winpr_Data_Write_UINT32_BE(_s->pointer, _v);
1094 static inline void Stream_Write_UINT64(
wStream* _s, UINT64 _v)
1097 WINPR_ASSERT(_s->pointer);
1098 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 8);
1100 winpr_Data_Write_UINT64(_s->pointer, _v);
1110 static inline void Stream_Write_UINT64_BE(
wStream* _s, UINT64 _v)
1113 WINPR_ASSERT(_s->pointer);
1114 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 8);
1116 winpr_Data_Write_UINT64_BE(_s->pointer, _v);
1127 static inline void Stream_Write_INT64(
wStream* _s, INT64 _v)
1130 WINPR_ASSERT(_s->pointer);
1131 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 8);
1133 winpr_Data_Write_INT64(_s->pointer, _v);
1144 static inline void Stream_Write_INT64_BE(
wStream* _s, INT64 _v)
1147 WINPR_ASSERT(_s->pointer);
1148 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 8);
1150 winpr_Data_Write_INT64_BE(_s->pointer, _v);
1154 static inline void Stream_Write(
wStream* _s,
const void* _b,
size_t _n)
1160 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= _n);
1161 memcpy(_s->pointer, (_b), (_n));
1162 Stream_Seek(_s, _n);
1166 static inline void Stream_Seek_UINT8(
wStream* _s)
1168 Stream_Seek(_s,
sizeof(UINT8));
1170 static inline void Stream_Seek_UINT16(
wStream* _s)
1172 Stream_Seek(_s,
sizeof(UINT16));
1174 static inline void Stream_Seek_UINT32(
wStream* _s)
1176 Stream_Seek(_s,
sizeof(UINT32));
1178 static inline void Stream_Seek_UINT64(
wStream* _s)
1180 Stream_Seek(_s,
sizeof(UINT64));
1183 static inline void Stream_Rewind_UINT8(
wStream* _s)
1185 Stream_Rewind(_s,
sizeof(UINT8));
1187 static inline void Stream_Rewind_UINT16(
wStream* _s)
1189 Stream_Rewind(_s,
sizeof(UINT16));
1191 static inline void Stream_Rewind_UINT32(
wStream* _s)
1193 Stream_Rewind(_s,
sizeof(UINT32));
1195 static inline void Stream_Rewind_UINT64(
wStream* _s)
1197 Stream_Rewind(_s,
sizeof(UINT64));
1200 static inline void Stream_Fill(
wStream* _s,
int _v,
size_t _n)
1203 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= (_n));
1204 memset(_s->pointer, _v, (_n));
1205 Stream_Seek(_s, _n);
1208 static inline void Stream_Zero(
wStream* _s,
size_t _n)
1210 Stream_Fill(_s,
'\0', _n);
1213 static inline void Stream_Copy(
wStream* _src,
wStream* _dst,
size_t _n)
1217 WINPR_ASSERT(Stream_GetRemainingCapacity(_src) >= (_n));
1218 WINPR_ASSERT(Stream_GetRemainingCapacity(_dst) >= (_n));
1220 memcpy(_dst->pointer, _src->pointer, _n);
1221 Stream_Seek(_dst, _n);
1222 Stream_Seek(_src, _n);
1229#define Stream_BufferAs(s, type) WINPR_STREAM_CAST(type*, Stream_Buffer(s))
1231 static inline BYTE* Stream_Buffer(
wStream* _s)
1241#define Stream_ConstBufferAs(s, type) WINPR_STREAM_CAST(type*, Stream_ConstBuffer(s))
1242 static inline const BYTE* Stream_ConstBuffer(
const wStream* _s)
1248#define Stream_GetBuffer(_s, _b) _b = Stream_Buffer(_s)
1254#define Stream_GetBufferAs(_s, _b) _b = Stream_BufferAs(_s, __typeof(_b))
1256#define Stream_PointerAs(s, type) WINPR_STREAM_CAST(type*, Stream_Pointer(s))
1258 static inline void* Stream_Pointer(
wStream* _s)
1264 static inline const void* Stream_ConstPointer(
const wStream* _s)
1270#define Stream_GetPointer(_s, _p) _p = Stream_Pointer(_s)
1276#define Stream_GetPointerAs(_s, _p) _p = Stream_PointerAs(_s, __typeof(_p))
1278#if defined(WITH_WINPR_DEPRECATED)
1279 WINPR_DEPRECATED_VAR(
"Use Stream_SetPosition instead",
1280 WINPR_API BOOL Stream_SetPointer(
wStream* _s, BYTE* _p));
1281 WINPR_DEPRECATED_VAR(
"Use Stream_New(buffer, capacity) instead",
1282 WINPR_API BOOL Stream_SetBuffer(
wStream* _s, BYTE* _b));
1283 WINPR_DEPRECATED_VAR(
"Use Stream_New(buffer, capacity) instead",
1284 WINPR_API
void Stream_SetCapacity(
wStream* _s,
size_t capacity));
1287 static inline size_t Stream_Length(
const wStream* _s)
1293#define Stream_GetLength(_s, _l) _l = Stream_Length(_s)
1294 WINPR_API BOOL Stream_SetLength(
wStream* _s,
size_t _l);
1296 static inline size_t Stream_Capacity(
const wStream* _s)
1299 return _s->capacity;
1302#define Stream_GetCapacity(_s, _c) _c = Stream_Capacity(_s);
1304 static inline size_t Stream_GetPosition(
const wStream* _s)
1307 WINPR_ASSERT(_s->buffer <= _s->pointer);
1308 return WINPR_STREAM_CAST(
size_t, (_s->pointer - _s->buffer));
1311 WINPR_API BOOL Stream_SetPosition(
wStream* _s,
size_t _p);
1313 WINPR_API
void Stream_SealLength(
wStream* _s);
1315 static inline void Stream_Clear(
wStream* _s)
1318 memset(_s->buffer, 0, _s->capacity);
1321#define Stream_SafeSeek(s, size) Stream_SafeSeekEx(s, size, __FILE__, __LINE__, __func__)
1322 WINPR_API BOOL Stream_SafeSeekEx(
wStream* s,
size_t size,
const char* file,
size_t line,
1325 WINPR_API BOOL Stream_Read_UTF16_String(
wStream* s, WCHAR* dst,
size_t charLength);
1326 WINPR_API BOOL Stream_Write_UTF16_String(
wStream* s,
const WCHAR* src,
size_t charLength);
1337 WINPR_API
char* Stream_Read_UTF16_String_As_UTF8(
wStream* s,
size_t wcharLength,
1338 size_t* pUtfCharLength);
1349 WINPR_API SSIZE_T Stream_Read_UTF16_String_As_UTF8_Buffer(
wStream* s,
size_t wcharLength,
1351 size_t utfBufferCharLength);
1364 WINPR_API SSIZE_T Stream_Write_UTF16_String_From_UTF8(
wStream* s,
size_t wcharLength,
1365 const char* src,
size_t length,
1370 WINPR_API
void StreamPool_Return(wStreamPool* pool,
wStream* s);
1377 WINPR_API
void Stream_AddRef(
wStream* s);
1386 WINPR_API
void Stream_Release(
wStream* s);
1388 WINPR_ATTR_MALLOC(Stream_Release, 1)
1389 WINPR_ATTR_NODISCARD
1390 WINPR_API
wStream* StreamPool_Take(wStreamPool* pool,
size_t size);
1392 WINPR_API
wStream* StreamPool_Find(wStreamPool* pool, const BYTE* ptr);
1402 WINPR_API
size_t StreamPool_UsedCount(wStreamPool* pool);
1414 WINPR_API BOOL StreamPool_WaitForReturn(wStreamPool* pool, UINT32 timeoutMS);
1416 WINPR_API
void StreamPool_Clear(wStreamPool* pool);
1418 WINPR_API
void StreamPool_Free(wStreamPool* pool);
1420 WINPR_ATTR_MALLOC(StreamPool_Free, 1)
1421 WINPR_ATTR_NODISCARD
1422 WINPR_API wStreamPool* StreamPool_New(BOOL synchronized,
size_t defaultSize);
1424 WINPR_API
char* StreamPool_GetStatistics(wStreamPool* pool,
char* buffer,
size_t size);