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;
59 static inline wStream Stream_Init(
void)
61 const wStream empty = {
nullptr,
nullptr, 0, 0, 0,
nullptr, FALSE, FALSE };
65 static inline size_t Stream_Capacity(
const wStream* _s);
66 WINPR_API
size_t Stream_GetRemainingCapacity(
const wStream* _s);
67 WINPR_API
size_t Stream_GetRemainingLength(
const wStream* _s);
69 WINPR_API BOOL Stream_EnsureCapacity(
wStream* s,
size_t size);
70 WINPR_API BOOL Stream_EnsureRemainingCapacity(
wStream* s,
size_t size);
72#define WINPR_STREAM_CAST(t, val) WINPR_CXX_COMPAT_CAST(t, val)
74#define Stream_CheckAndLogRequiredCapacityOfSize(tag, s, nmemb, size) \
75 Stream_CheckAndLogRequiredCapacityEx(tag, WLOG_WARN, s, nmemb, size, "%s(%s:%" PRIuz ")", \
76 __func__, __FILE__, (size_t)__LINE__)
77#define Stream_CheckAndLogRequiredCapacity(tag, s, len) \
78 Stream_CheckAndLogRequiredCapacityOfSize((tag), (s), (len), 1)
80 WINPR_API BOOL Stream_CheckAndLogRequiredCapacityEx(
const char* tag, DWORD level,
wStream* s,
81 size_t nmemb,
size_t size,
const char* fmt,
83 WINPR_API BOOL Stream_CheckAndLogRequiredCapacityExVa(
const char* tag, DWORD level,
wStream* s,
84 size_t nmemb,
size_t size,
85 const char* fmt, va_list args);
87#define Stream_CheckAndLogRequiredCapacityOfSizeWLog(log, s, nmemb, size) \
88 Stream_CheckAndLogRequiredCapacityWLogEx(log, WLOG_WARN, s, nmemb, size, "%s(%s:%" PRIuz ")", \
89 __func__, __FILE__, (size_t)__LINE__)
91#define Stream_CheckAndLogRequiredCapacityWLog(log, s, len) \
92 Stream_CheckAndLogRequiredCapacityOfSizeWLog((log), (s), (len), 1)
94 WINPR_API BOOL Stream_CheckAndLogRequiredCapacityWLogEx(wLog* log, DWORD level,
wStream* s,
95 size_t nmemb,
size_t size,
96 const char* fmt, ...);
97 WINPR_API BOOL Stream_CheckAndLogRequiredCapacityWLogExVa(wLog* log, DWORD level,
wStream* s,
98 size_t nmemb,
size_t size,
99 const char* fmt, va_list args);
101 WINPR_API
void Stream_Free(
wStream* s, BOOL bFreeBuffer);
103 WINPR_ATTR_MALLOC(Stream_Free, 1)
105 WINPR_API
wStream* Stream_New(BYTE* buffer,
size_t size);
106 WINPR_API
wStream* Stream_StaticConstInit(
wStream* s, const BYTE* buffer,
size_t size);
107 WINPR_API
wStream* Stream_StaticInit(
wStream* s, BYTE* buffer,
size_t size);
109#define Stream_CheckAndLogRequiredLengthOfSize(tag, s, nmemb, size) \
110 Stream_CheckAndLogRequiredLengthEx(tag, WLOG_WARN, s, nmemb, size, "%s(%s:%" PRIuz ")", \
111 __func__, __FILE__, (size_t)__LINE__)
112#define Stream_CheckAndLogRequiredLength(tag, s, len) \
113 Stream_CheckAndLogRequiredLengthOfSize(tag, s, len, 1)
115 WINPR_API BOOL Stream_CheckAndLogRequiredLengthEx(
const char* tag, DWORD level,
wStream* s,
116 size_t nmemb,
size_t size,
const char* fmt,
118 WINPR_API BOOL Stream_CheckAndLogRequiredLengthExVa(
const char* tag, DWORD level,
wStream* s,
119 size_t nmemb,
size_t size,
const char* fmt,
122#define Stream_CheckAndLogRequiredLengthOfSizeWLog(log, s, nmemb, size) \
123 Stream_CheckAndLogRequiredLengthWLogEx(log, WLOG_WARN, s, nmemb, size, "%s(%s:%" PRIuz ")", \
124 __func__, __FILE__, (size_t)__LINE__)
125#define Stream_CheckAndLogRequiredLengthWLog(log, s, len) \
126 Stream_CheckAndLogRequiredLengthOfSizeWLog(log, s, len, 1)
128 WINPR_API BOOL Stream_CheckAndLogRequiredLengthWLogEx(wLog* log, DWORD level,
wStream* s,
129 size_t nmemb,
size_t size,
130 const char* fmt, ...);
131 WINPR_API BOOL Stream_CheckAndLogRequiredLengthWLogExVa(wLog* log, DWORD level,
wStream* s,
132 size_t nmemb,
size_t size,
133 const char* fmt, va_list args);
135 static inline void Stream_Seek(
wStream* s,
size_t _offset)
138 WINPR_ASSERT(Stream_GetRemainingCapacity(s) >= _offset);
139 s->pointer += (_offset);
142 static inline void Stream_Rewind(
wStream* s,
size_t _offset)
146 WINPR_ASSERT(s->buffer <= s->pointer);
147 cur = WINPR_STREAM_CAST(
size_t, s->pointer - s->buffer);
148 WINPR_ASSERT(cur >= _offset);
150 s->pointer -= (_offset);
152 s->pointer = s->buffer;
155 static inline UINT8 stream_read_u8(
wStream* _s, BOOL seek)
158 WINPR_ASSERT(Stream_GetRemainingLength(_s) >=
sizeof(UINT8));
160 const UINT8 v = winpr_Data_Get_UINT8(_s->pointer);
162 Stream_Seek(_s,
sizeof(UINT8));
166 static inline INT8 stream_read_i8(
wStream* _s, BOOL seek)
168 const INT8 v = winpr_Data_Get_INT8(_s->pointer);
170 Stream_Seek(_s,
sizeof(INT8));
174 static inline UINT16 stream_read_u16_le(
wStream* _s, BOOL seek)
176 const size_t typesize =
sizeof(UINT16);
178 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
180 const UINT16 v = winpr_Data_Get_UINT16(_s->pointer);
182 Stream_Seek(_s, typesize);
186 static inline UINT16 stream_read_u16_be(
wStream* _s, BOOL seek)
188 const size_t typesize =
sizeof(UINT16);
190 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
192 const UINT16 v = winpr_Data_Get_UINT16_BE(_s->pointer);
194 Stream_Seek(_s, typesize);
198 static inline INT16 stream_read_i16_le(
wStream* _s, BOOL seek)
200 const size_t typesize =
sizeof(INT16);
202 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
204 const INT16 v = winpr_Data_Get_INT16(_s->pointer);
206 Stream_Seek(_s, typesize);
210 static inline INT16 stream_read_i16_be(
wStream* _s, BOOL seek)
212 const size_t typesize =
sizeof(INT16);
214 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
216 const INT16 v = winpr_Data_Get_INT16_BE(_s->pointer);
218 Stream_Seek(_s, typesize);
222 static inline UINT32 stream_read_u32_le(
wStream* _s, BOOL seek)
224 const size_t typesize =
sizeof(UINT32);
226 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
228 const UINT32 v = winpr_Data_Get_UINT32(_s->pointer);
230 Stream_Seek(_s, typesize);
234 static inline UINT32 stream_read_u32_be(
wStream* _s, BOOL seek)
236 const size_t typesize =
sizeof(UINT32);
238 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
240 const UINT32 v = winpr_Data_Get_UINT32_BE(_s->pointer);
242 Stream_Seek(_s, typesize);
246 static inline INT32 stream_read_i32_le(
wStream* _s, BOOL seek)
248 const size_t typesize =
sizeof(INT32);
250 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
252 const INT32 v = winpr_Data_Get_INT32(_s->pointer);
254 Stream_Seek(_s, typesize);
258 static inline INT32 stream_read_i32_be(
wStream* _s, BOOL seek)
260 const size_t typesize =
sizeof(INT32);
262 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
264 const INT32 v = winpr_Data_Get_INT32_BE(_s->pointer);
266 Stream_Seek(_s, typesize);
270 static inline UINT64 stream_read_u64_le(
wStream* _s, BOOL seek)
272 const size_t typesize =
sizeof(UINT64);
274 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
276 const UINT64 v = winpr_Data_Get_UINT64(_s->pointer);
278 Stream_Seek(_s, typesize);
282 static inline UINT64 stream_read_u64_be(
wStream* _s, BOOL seek)
284 const size_t typesize =
sizeof(UINT64);
286 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
288 const UINT64 v = winpr_Data_Get_UINT64_BE(_s->pointer);
290 Stream_Seek(_s, typesize);
294 static inline INT64 stream_read_i64_le(
wStream* _s, BOOL seek)
296 const size_t typesize =
sizeof(INT64);
298 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
300 const INT64 v = winpr_Data_Get_INT64(_s->pointer);
302 Stream_Seek(_s, typesize);
306 static inline INT64 stream_read_i64_be(
wStream* _s, BOOL seek)
308 const size_t typesize =
sizeof(INT64);
310 WINPR_ASSERT(Stream_GetRemainingLength(_s) >= typesize);
312 const INT64 v = winpr_Data_Get_INT64_BE(_s->pointer);
314 Stream_Seek(_s, typesize);
324 static inline UINT8 Stream_Get_UINT8(
wStream* _s)
326 return stream_read_u8(_s, TRUE);
335 static inline INT8 Stream_Get_INT8(
wStream* _s)
337 return stream_read_i8(_s, TRUE);
346 static inline UINT16 Stream_Get_UINT16(
wStream* _s)
348 return stream_read_u16_le(_s, TRUE);
357 static inline INT16 Stream_Get_INT16(
wStream* _s)
359 return stream_read_i16_le(_s, TRUE);
368 static inline UINT16 Stream_Get_UINT16_BE(
wStream* _s)
370 return stream_read_u16_be(_s, TRUE);
379 static inline INT16 Stream_Get_INT16_BE(
wStream* _s)
381 return stream_read_i16_be(_s, TRUE);
390 static inline UINT32 Stream_Get_UINT32(
wStream* _s)
392 return stream_read_u32_le(_s, TRUE);
401 static inline INT32 Stream_Get_INT32(
wStream* _s)
403 return stream_read_i32_le(_s, TRUE);
412 static inline UINT32 Stream_Get_UINT32_BE(
wStream* _s)
414 return stream_read_u32_be(_s, TRUE);
423 static inline INT32 Stream_Get_INT32_BE(
wStream* _s)
425 return stream_read_i32_be(_s, TRUE);
434 static inline UINT64 Stream_Get_UINT64(
wStream* _s)
436 return stream_read_u64_le(_s, TRUE);
445 static inline INT64 Stream_Get_INT64(
wStream* _s)
447 return stream_read_i64_le(_s, TRUE);
456 static inline UINT64 Stream_Get_UINT64_BE(
wStream* _s)
458 return stream_read_u64_be(_s, TRUE);
467 static inline INT64 Stream_Get_INT64_BE(
wStream* _s)
469 return stream_read_i64_be(_s, TRUE);
478 static inline UINT8 Stream_Peek_Get_UINT8(
wStream* _s)
480 return stream_read_u8(_s, FALSE);
489 static inline INT8 Stream_Peek_Get_INT8(
wStream* _s)
491 return stream_read_i8(_s, FALSE);
500 static inline UINT16 Stream_Peek_Get_UINT16(
wStream* _s)
502 return stream_read_u16_le(_s, FALSE);
511 static inline INT16 Stream_Peek_Get_INT16(
wStream* _s)
513 return stream_read_i16_le(_s, FALSE);
522 static inline UINT16 Stream_Peek_Get_UINT16_BE(
wStream* _s)
524 return stream_read_u16_be(_s, FALSE);
533 static inline INT16 Stream_Peek_Get_INT16_BE(
wStream* _s)
535 return stream_read_i16_be(_s, FALSE);
544 static inline UINT32 Stream_Peek_Get_UINT32(
wStream* _s)
546 return stream_read_u32_le(_s, FALSE);
555 static inline INT32 Stream_Peek_Get_INT32(
wStream* _s)
557 return stream_read_i32_le(_s, FALSE);
566 static inline UINT32 Stream_Peek_Get_UINT32_BE(
wStream* _s)
568 return stream_read_u32_be(_s, FALSE);
577 static inline INT32 Stream_Peek_Get_INT32_BE(
wStream* _s)
579 return stream_read_i32_be(_s, FALSE);
588 static inline UINT64 Stream_Peek_Get_UINT64(
wStream* _s)
590 return stream_read_u64_le(_s, FALSE);
599 static inline INT64 Stream_Peek_Get_INT64(
wStream* _s)
601 return stream_read_i64_le(_s, FALSE);
610 static inline UINT64 Stream_Peek_Get_UINT64_BE(
wStream* _s)
612 return stream_read_u64_be(_s, FALSE);
621 static inline INT64 Stream_Peek_Get_INT64_BE(
wStream* _s)
623 return stream_read_i64_be(_s, FALSE);
626#define Stream_Read_UINT8(_s, _v) \
629 _v = stream_read_u8(_s, TRUE); \
632#define Stream_Read_INT8(_s, _v) \
635 _v = stream_read_i8(_s, TRUE); \
638#define Stream_Read_UINT16(_s, _v) \
641 _v = stream_read_u16_le(_s, TRUE); \
644#define Stream_Read_INT16(_s, _v) \
647 _v = stream_read_i16_le(_s, TRUE); \
650#define Stream_Read_UINT16_BE(_s, _v) \
653 _v = stream_read_u16_be(_s, TRUE); \
656#define Stream_Read_INT16_BE(_s, _v) \
659 _v = stream_read_i16_be(_s, TRUE); \
662#define Stream_Read_UINT32(_s, _v) \
665 _v = stream_read_u32_le(_s, TRUE); \
668#define Stream_Read_INT32(_s, _v) \
671 _v = stream_read_i32_le(_s, TRUE); \
674#define Stream_Read_UINT32_BE(_s, _v) \
677 _v = stream_read_u32_be(_s, TRUE); \
680#define Stream_Read_INT32_BE(_s, _v) \
683 _v = stream_read_i32_be(_s, TRUE); \
686#define Stream_Read_UINT64(_s, _v) \
689 _v = stream_read_u64_le(_s, TRUE); \
692#define Stream_Read_INT64(_s, _v) \
695 _v = stream_read_i64_le(_s, TRUE); \
698#define Stream_Read_UINT64_BE(_s, _v) \
701 _v = stream_read_u64_be(_s, TRUE); \
704#define Stream_Read_INT64_BE(_s, _v) \
707 _v = stream_read_i64_be(_s, TRUE); \
710 static inline void Stream_Read(
wStream* _s,
void* _b,
size_t _n)
713 WINPR_ASSERT(_b || (_n == 0));
714 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= _n);
715 memcpy(_b, (_s->pointer), (_n));
719#define Stream_Peek_UINT8(_s, _v) \
722 _v = stream_read_u8(_s, FALSE); \
725#define Stream_Peek_INT8(_s, _v) \
728 _v = stream_read_i8(_s, FALSE); \
731#define Stream_Peek_UINT16(_s, _v) \
734 _v = stream_read_u16_le(_s, FALSE); \
737#define Stream_Peek_INT16(_s, _v) \
740 _v = stream_read_i16_le(_s, FALSE); \
743#define Stream_Peek_UINT16_BE(_s, _v) \
746 _v = stream_read_u16_be(_s, FALSE); \
749#define Stream_Peek_INT16_BE(_s, _v) \
752 _v = stream_read_i16_be(_s, FALSE); \
755#define Stream_Peek_UINT32(_s, _v) \
758 _v = stream_read_u32_le(_s, FALSE); \
761#define Stream_Peek_INT32(_s, _v) \
764 _v = stream_read_i32_le(_s, FALSE); \
767#define Stream_Peek_UINT32_BE(_s, _v) \
770 _v = stream_read_u32_be(_s, FALSE); \
773#define Stream_Peek_INT32_BE(_s, _v) \
776 _v = stream_read_i32_be(_s, FALSE); \
779#define Stream_Peek_UINT64(_s, _v) \
782 _v = stream_read_u64_le(_s, FALSE); \
785#define Stream_Peek_INT64(_s, _v) \
788 _v = stream_read_i64_le(_s, FALSE); \
791#define Stream_Peek_UINT64_BE(_s, _v) \
794 _v = stream_read_u64_be(_s, FALSE); \
797#define Stream_Peek_INT64_BE(_s, _v) \
800 _v = stream_read_i64_be(_s, FALSE); \
803 static inline void Stream_Peek(
const wStream* _s,
void* _b,
size_t _n)
806 WINPR_ASSERT(_b || (_n == 0));
807 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= _n);
808 memcpy(_b, (_s->pointer), (_n));
811#define Stream_Write_INT8(s, v) \
814 WINPR_ASSERT((v) <= INT8_MAX); \
815 WINPR_ASSERT((v) >= INT8_MIN); \
816 Stream_Write_INT8_unchecked((s), (v)); \
826 static inline void Stream_Write_INT8_unchecked(
wStream* _s, INT8 _v)
829 WINPR_ASSERT(_s->pointer);
830 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 1);
832 winpr_Data_Write_INT8(_s->pointer, _v);
836#define Stream_Write_UINT8(s, v) \
839 WINPR_ASSERT((v) <= UINT8_MAX); \
840 WINPR_ASSERT((v) >= 0); \
841 Stream_Write_UINT8_unchecked((s), (v)); \
851 static inline void Stream_Write_UINT8_unchecked(
wStream* _s, UINT8 _v)
854 WINPR_ASSERT(_s->pointer);
855 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 1);
857 winpr_Data_Write_UINT8(_s->pointer, _v);
861#define Stream_Write_INT16(s, v) \
864 WINPR_ASSERT((v) >= INT16_MIN); \
865 WINPR_ASSERT((v) <= INT16_MAX); \
866 Stream_Write_INT16_unchecked((s), (v)); \
877 static inline void Stream_Write_INT16_unchecked(
wStream* _s, INT16 _v)
880 WINPR_ASSERT(_s->pointer);
881 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 2);
883 winpr_Data_Write_INT16(_s->pointer, _v);
887#define Stream_Write_UINT16(s, v) \
890 WINPR_ASSERT((v) <= UINT16_MAX); \
891 WINPR_ASSERT((v) >= 0); \
892 Stream_Write_UINT16_unchecked((s), (v)); \
903 static inline void Stream_Write_UINT16_unchecked(
wStream* _s, UINT16 _v)
906 WINPR_ASSERT(_s->pointer);
907 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 2);
909 winpr_Data_Write_UINT16(_s->pointer, _v);
913#define Stream_Write_UINT16_BE(s, v) \
916 WINPR_ASSERT((v) <= UINT16_MAX); \
917 WINPR_ASSERT((v) >= 0); \
918 Stream_Write_UINT16_BE_unchecked((s), (v)); \
929 static inline void Stream_Write_UINT16_BE_unchecked(
wStream* _s, UINT16 _v)
932 WINPR_ASSERT(_s->pointer);
933 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 2);
935 winpr_Data_Write_UINT16_BE(_s->pointer, _v);
939#define Stream_Write_INT16_BE(s, v) \
942 WINPR_ASSERT((v) <= INT16_MAX); \
943 WINPR_ASSERT((v) >= INT16_MIN); \
944 Stream_Write_INT16_BE_unchecked((s), (v)); \
957 static inline void Stream_Write_INT16_BE_unchecked(
wStream* _s, INT16 _v)
960 WINPR_ASSERT(_s->pointer);
961 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 2);
963 winpr_Data_Write_INT16_BE(_s->pointer, _v);
967#define Stream_Write_UINT24_BE(s, v) \
970 WINPR_ASSERT((v) <= 0xFFFFFF); \
971 WINPR_ASSERT((v) >= 0); \
972 Stream_Write_UINT24_BE_unchecked((s), (v)); \
983 static inline void Stream_Write_UINT24_BE_unchecked(
wStream* _s, UINT32 _v)
986 WINPR_ASSERT(_s->pointer);
987 WINPR_ASSERT(_v <= 0x00FFFFFF);
988 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 3);
990 *_s->pointer++ = ((_v) >> 16) & 0xFF;
991 *_s->pointer++ = ((_v) >> 8) & 0xFF;
992 *_s->pointer++ = (_v) & 0xFF;
995#define Stream_Write_INT32(s, v) \
998 WINPR_ASSERT((v) <= INT32_MAX); \
999 WINPR_ASSERT((v) >= INT32_MIN); \
1000 Stream_Write_INT32_unchecked((s), (v)); \
1011 static inline void Stream_Write_INT32_unchecked(
wStream* _s, INT32 _v)
1014 WINPR_ASSERT(_s->pointer);
1015 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 4);
1017 winpr_Data_Write_INT32(_s->pointer, _v);
1021#define Stream_Write_INT32_BE(s, v) \
1024 WINPR_ASSERT((v) <= INT32_MAX); \
1025 WINPR_ASSERT((v) >= INT32_MIN); \
1026 Stream_Write_INT32_BE_unchecked((s), (v)); \
1039 static inline void Stream_Write_INT32_BE_unchecked(
wStream* _s, INT32 _v)
1042 WINPR_ASSERT(_s->pointer);
1043 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 4);
1045 winpr_Data_Write_INT32_BE(_s->pointer, _v);
1049#define Stream_Write_UINT32(s, v) \
1052 WINPR_ASSERT((v) <= UINT32_MAX); \
1053 WINPR_ASSERT((v) >= 0); \
1054 Stream_Write_UINT32_unchecked((s), (v)); \
1065 static inline void Stream_Write_UINT32_unchecked(
wStream* _s, UINT32 _v)
1068 WINPR_ASSERT(_s->pointer);
1069 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 4);
1071 winpr_Data_Write_UINT32(_s->pointer, _v);
1075#define Stream_Write_UINT32_BE(s, v) \
1078 WINPR_ASSERT((v) <= UINT32_MAX); \
1079 WINPR_ASSERT((v) >= 0); \
1080 Stream_Write_UINT32_BE_unchecked((s), (v)); \
1091 static inline void Stream_Write_UINT32_BE_unchecked(
wStream* _s, UINT32 _v)
1093 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 4);
1095 winpr_Data_Write_UINT32_BE(_s->pointer, _v);
1105 static inline void Stream_Write_UINT64(
wStream* _s, UINT64 _v)
1108 WINPR_ASSERT(_s->pointer);
1109 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 8);
1111 winpr_Data_Write_UINT64(_s->pointer, _v);
1121 static inline void Stream_Write_UINT64_BE(
wStream* _s, UINT64 _v)
1124 WINPR_ASSERT(_s->pointer);
1125 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 8);
1127 winpr_Data_Write_UINT64_BE(_s->pointer, _v);
1138 static inline void Stream_Write_INT64(
wStream* _s, INT64 _v)
1141 WINPR_ASSERT(_s->pointer);
1142 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 8);
1144 winpr_Data_Write_INT64(_s->pointer, _v);
1155 static inline void Stream_Write_INT64_BE(
wStream* _s, INT64 _v)
1158 WINPR_ASSERT(_s->pointer);
1159 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= 8);
1161 winpr_Data_Write_INT64_BE(_s->pointer, _v);
1165 static inline void Stream_Write(
wStream* _s,
const void* _b,
size_t _n)
1171 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= _n);
1172 memcpy(_s->pointer, (_b), (_n));
1173 Stream_Seek(_s, _n);
1177 static inline void Stream_Seek_UINT8(
wStream* _s)
1179 Stream_Seek(_s,
sizeof(UINT8));
1181 static inline void Stream_Seek_UINT16(
wStream* _s)
1183 Stream_Seek(_s,
sizeof(UINT16));
1185 static inline void Stream_Seek_UINT32(
wStream* _s)
1187 Stream_Seek(_s,
sizeof(UINT32));
1189 static inline void Stream_Seek_UINT64(
wStream* _s)
1191 Stream_Seek(_s,
sizeof(UINT64));
1194 static inline void Stream_Rewind_UINT8(
wStream* _s)
1196 Stream_Rewind(_s,
sizeof(UINT8));
1198 static inline void Stream_Rewind_UINT16(
wStream* _s)
1200 Stream_Rewind(_s,
sizeof(UINT16));
1202 static inline void Stream_Rewind_UINT32(
wStream* _s)
1204 Stream_Rewind(_s,
sizeof(UINT32));
1206 static inline void Stream_Rewind_UINT64(
wStream* _s)
1208 Stream_Rewind(_s,
sizeof(UINT64));
1211 static inline void Stream_Fill(
wStream* _s,
int _v,
size_t _n)
1214 WINPR_ASSERT(Stream_GetRemainingCapacity(_s) >= (_n));
1215 memset(_s->pointer, _v, (_n));
1216 Stream_Seek(_s, _n);
1219 static inline void Stream_Zero(
wStream* _s,
size_t _n)
1221 Stream_Fill(_s,
'\0', _n);
1224 static inline void Stream_Copy(
wStream* _src,
wStream* _dst,
size_t _n)
1228 WINPR_ASSERT(Stream_GetRemainingCapacity(_src) >= (_n));
1229 WINPR_ASSERT(Stream_GetRemainingCapacity(_dst) >= (_n));
1231 memcpy(_dst->pointer, _src->pointer, _n);
1232 Stream_Seek(_dst, _n);
1233 Stream_Seek(_src, _n);
1240#define Stream_BufferAs(s, type) WINPR_STREAM_CAST(type*, Stream_Buffer(s))
1242 static inline BYTE* Stream_Buffer(
wStream* _s)
1252#define Stream_ConstBufferAs(s, type) WINPR_STREAM_CAST(type*, Stream_ConstBuffer(s))
1253 static inline const BYTE* Stream_ConstBuffer(
const wStream* _s)
1259#define Stream_GetBuffer(_s, _b) _b = Stream_Buffer(_s)
1265#define Stream_GetBufferAs(_s, _b) _b = Stream_BufferAs(_s, __typeof(_b))
1267#define Stream_PointerAs(s, type) WINPR_STREAM_CAST(type*, Stream_Pointer(s))
1269 static inline void* Stream_Pointer(
wStream* _s)
1275 static inline const void* Stream_ConstPointer(
const wStream* _s)
1281#define Stream_GetPointer(_s, _p) _p = Stream_Pointer(_s)
1287#define Stream_GetPointerAs(_s, _p) _p = Stream_PointerAs(_s, __typeof(_p))
1289#if defined(WITH_WINPR_DEPRECATED)
1290 WINPR_DEPRECATED_VAR(
"Use Stream_SetPosition instead",
1291 WINPR_API BOOL Stream_SetPointer(
wStream* _s, BYTE* _p));
1292 WINPR_DEPRECATED_VAR(
"Use Stream_New(buffer, capacity) instead",
1293 WINPR_API BOOL Stream_SetBuffer(
wStream* _s, BYTE* _b));
1294 WINPR_DEPRECATED_VAR(
"Use Stream_New(buffer, capacity) instead",
1295 WINPR_API
void Stream_SetCapacity(
wStream* _s,
size_t capacity));
1298 static inline size_t Stream_Length(
const wStream* _s)
1304#define Stream_GetLength(_s, _l) _l = Stream_Length(_s)
1305 WINPR_API BOOL Stream_SetLength(
wStream* _s,
size_t _l);
1307 static inline size_t Stream_Capacity(
const wStream* _s)
1310 return _s->capacity;
1313#define Stream_GetCapacity(_s, _c) _c = Stream_Capacity(_s);
1315 static inline size_t Stream_GetPosition(
const wStream* _s)
1318 WINPR_ASSERT(_s->buffer <= _s->pointer);
1319 return WINPR_STREAM_CAST(
size_t, (_s->pointer - _s->buffer));
1322 WINPR_API BOOL Stream_SetPosition(
wStream* _s,
size_t _p);
1324 WINPR_API
void Stream_SealLength(
wStream* _s);
1326 static inline void Stream_Clear(
wStream* _s)
1329 memset(_s->buffer, 0, _s->capacity);
1332#define Stream_SafeSeek(s, size) Stream_SafeSeekEx(s, size, __FILE__, __LINE__, __func__)
1333 WINPR_API BOOL Stream_SafeSeekEx(
wStream* s,
size_t size,
const char* file,
size_t line,
1336 WINPR_API BOOL Stream_Read_UTF16_String(
wStream* s, WCHAR* dst,
size_t charLength);
1337 WINPR_API BOOL Stream_Write_UTF16_String(
wStream* s,
const WCHAR* src,
size_t charLength);
1348 WINPR_API
char* Stream_Read_UTF16_String_As_UTF8(
wStream* s,
size_t wcharLength,
1349 size_t* pUtfCharLength);
1360 WINPR_API SSIZE_T Stream_Read_UTF16_String_As_UTF8_Buffer(
wStream* s,
size_t wcharLength,
1362 size_t utfBufferCharLength);
1375 WINPR_API SSIZE_T Stream_Write_UTF16_String_From_UTF8(
wStream* s,
size_t wcharLength,
1376 const char* src,
size_t length,
1381 WINPR_API
void StreamPool_Return(wStreamPool* pool,
wStream* s);
1388 WINPR_API
void Stream_AddRef(
wStream* s);
1397 WINPR_API
void Stream_Release(
wStream* s);
1399 WINPR_ATTR_MALLOC(Stream_Release, 1)
1400 WINPR_ATTR_NODISCARD
1401 WINPR_API
wStream* StreamPool_Take(wStreamPool* pool,
size_t size);
1403 WINPR_API
wStream* StreamPool_Find(wStreamPool* pool, const BYTE* ptr);
1413 WINPR_API
size_t StreamPool_UsedCount(wStreamPool* pool);
1425 WINPR_API BOOL StreamPool_WaitForReturn(wStreamPool* pool, UINT32 timeoutMS);
1427 WINPR_API
void StreamPool_Clear(wStreamPool* pool);
1429 WINPR_API
void StreamPool_Free(wStreamPool* pool);
1431 WINPR_ATTR_MALLOC(StreamPool_Free, 1)
1432 WINPR_ATTR_NODISCARD
1433 WINPR_API wStreamPool* StreamPool_New(BOOL synchronized,
size_t defaultSize);
1435 WINPR_API
char* StreamPool_GetStatistics(wStreamPool* pool,
char* buffer,
size_t size);