|
Packit |
1fb8d4 |
/*
|
|
Packit |
1fb8d4 |
* WinPR: Windows Portable Runtime
|
|
Packit |
1fb8d4 |
* Stream Utils
|
|
Packit |
1fb8d4 |
*
|
|
Packit |
1fb8d4 |
* Copyright 2011 Vic Lee
|
|
Packit |
1fb8d4 |
* Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
|
|
Packit |
1fb8d4 |
* Copyright 2017 Armin Novak <armin.novak@thincast.com>
|
|
Packit |
1fb8d4 |
* Copyright 2017 Thincast Technologies GmbH
|
|
Packit |
1fb8d4 |
*
|
|
Packit |
1fb8d4 |
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
Packit |
1fb8d4 |
* you may not use this file except in compliance with the License.
|
|
Packit |
1fb8d4 |
* You may obtain a copy of the License at
|
|
Packit |
1fb8d4 |
*
|
|
Packit |
1fb8d4 |
* http://www.apache.org/licenses/LICENSE-2.0
|
|
Packit |
1fb8d4 |
*
|
|
Packit |
1fb8d4 |
* Unless required by applicable law or agreed to in writing, software
|
|
Packit |
1fb8d4 |
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
Packit |
1fb8d4 |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
Packit |
1fb8d4 |
* See the License for the specific language governing permissions and
|
|
Packit |
1fb8d4 |
* limitations under the License.
|
|
Packit |
1fb8d4 |
*/
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifndef WINPR_UTILS_STREAM_H
|
|
Packit |
1fb8d4 |
#define WINPR_UTILS_STREAM_H
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#include <winpr/winpr.h>
|
|
Packit |
1fb8d4 |
#include <winpr/wtypes.h>
|
|
Packit |
1fb8d4 |
#include <winpr/endian.h>
|
|
Packit |
1fb8d4 |
#include <winpr/synch.h>
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifdef __cplusplus
|
|
Packit Service |
5a9772 |
extern "C"
|
|
Packit Service |
5a9772 |
{
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
typedef struct _wStreamPool wStreamPool;
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
struct _wStream
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
BYTE* buffer;
|
|
Packit Service |
5a9772 |
BYTE* pointer;
|
|
Packit Service |
5a9772 |
size_t length;
|
|
Packit Service |
5a9772 |
size_t capacity;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
DWORD count;
|
|
Packit Service |
5a9772 |
wStreamPool* pool;
|
|
Packit Service |
5a9772 |
BOOL isAllocatedStream;
|
|
Packit Service |
5a9772 |
BOOL isOwner;
|
|
Packit Service |
5a9772 |
};
|
|
Packit Service |
5a9772 |
typedef struct _wStream wStream;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
WINPR_API BOOL Stream_EnsureCapacity(wStream* s, size_t size);
|
|
Packit Service |
5a9772 |
WINPR_API BOOL Stream_EnsureRemainingCapacity(wStream* s, size_t size);
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
WINPR_API wStream* Stream_New(BYTE* buffer, size_t size);
|
|
Packit Service |
5a9772 |
WINPR_API void Stream_StaticInit(wStream* s, BYTE* buffer, size_t size);
|
|
Packit Service |
5a9772 |
WINPR_API void Stream_Free(wStream* s, BOOL bFreeBuffer);
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Seek(wStream* s, size_t _offset)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
s->pointer += (_offset);
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Rewind(wStream* s, size_t _offset)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
s->pointer -= (_offset);
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
#define _stream_read_n8(_t, _s, _v, _p) \
|
|
Packit Service |
5a9772 |
do \
|
|
Packit Service |
5a9772 |
{ \
|
|
Packit Service |
5a9772 |
(_v) = (_t)(*(_s)->pointer); \
|
|
Packit Service |
5a9772 |
if (_p) \
|
|
Packit Service |
5a9772 |
Stream_Seek(_s, sizeof(_t)); \
|
|
Packit Service |
5a9772 |
} while (0)
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
#define _stream_read_n16_le(_t, _s, _v, _p) \
|
|
Packit Service |
5a9772 |
do \
|
|
Packit Service |
5a9772 |
{ \
|
|
Packit Service |
5a9772 |
(_v) = (_t)((*(_s)->pointer) + (((UINT16)(*((_s)->pointer + 1))) << 8)); \
|
|
Packit Service |
5a9772 |
if (_p) \
|
|
Packit Service |
5a9772 |
Stream_Seek(_s, sizeof(_t)); \
|
|
Packit Service |
5a9772 |
} while (0)
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
#define _stream_read_n16_be(_t, _s, _v, _p) \
|
|
Packit Service |
5a9772 |
do \
|
|
Packit Service |
5a9772 |
{ \
|
|
Packit Service |
5a9772 |
(_v) = (_t)((((UINT16)(*(_s)->pointer)) << 8) + (UINT16)(*((_s)->pointer + 1))); \
|
|
Packit Service |
5a9772 |
if (_p) \
|
|
Packit Service |
5a9772 |
Stream_Seek(_s, sizeof(_t)); \
|
|
Packit Service |
5a9772 |
} while (0)
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
#define _stream_read_n32_le(_t, _s, _v, _p) \
|
|
Packit Service |
5a9772 |
do \
|
|
Packit Service |
5a9772 |
{ \
|
|
Packit Service |
5a9772 |
(_v) = (_t)((UINT32)(*(_s)->pointer) + (((UINT32)(*((_s)->pointer + 1))) << 8) + \
|
|
Packit Service |
5a9772 |
(((UINT32)(*((_s)->pointer + 2))) << 16) + \
|
|
Packit Service |
5a9772 |
((((UINT32) * ((_s)->pointer + 3))) << 24)); \
|
|
Packit Service |
5a9772 |
if (_p) \
|
|
Packit Service |
5a9772 |
Stream_Seek(_s, sizeof(_t)); \
|
|
Packit Service |
5a9772 |
} while (0)
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
#define _stream_read_n32_be(_t, _s, _v, _p) \
|
|
Packit Service |
5a9772 |
do \
|
|
Packit Service |
5a9772 |
{ \
|
|
Packit Service |
5a9772 |
(_v) = (_t)(((((UINT32) * ((_s)->pointer))) << 24) + \
|
|
Packit Service |
5a9772 |
(((UINT32)(*((_s)->pointer + 1))) << 16) + \
|
|
Packit Service |
5a9772 |
(((UINT32)(*((_s)->pointer + 2))) << 8) + (((UINT32)(*((_s)->pointer + 3))))); \
|
|
Packit Service |
5a9772 |
if (_p) \
|
|
Packit Service |
5a9772 |
Stream_Seek(_s, sizeof(_t)); \
|
|
Packit Service |
5a9772 |
} while (0)
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
#define _stream_read_n64_le(_t, _s, _v, _p) \
|
|
Packit Service |
5a9772 |
do \
|
|
Packit Service |
5a9772 |
{ \
|
|
Packit Service |
5a9772 |
(_v) = (_t)( \
|
|
Packit Service |
5a9772 |
(UINT64)(*(_s)->pointer) + (((UINT64)(*((_s)->pointer + 1))) << 8) + \
|
|
Packit Service |
5a9772 |
(((UINT64)(*((_s)->pointer + 2))) << 16) + (((UINT64)(*((_s)->pointer + 3))) << 24) + \
|
|
Packit Service |
5a9772 |
(((UINT64)(*((_s)->pointer + 4))) << 32) + (((UINT64)(*((_s)->pointer + 5))) << 40) + \
|
|
Packit Service |
5a9772 |
(((UINT64)(*((_s)->pointer + 6))) << 48) + (((UINT64)(*((_s)->pointer + 7))) << 56)); \
|
|
Packit Service |
5a9772 |
if (_p) \
|
|
Packit Service |
5a9772 |
Stream_Seek(_s, sizeof(_t)); \
|
|
Packit Service |
5a9772 |
} while (0)
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
#define _stream_read_n64_be(_t, _s, _v, _p) \
|
|
Packit Service |
5a9772 |
do \
|
|
Packit Service |
5a9772 |
{ \
|
|
Packit Service |
5a9772 |
(_v) = (_t)( \
|
|
Packit Service |
5a9772 |
(((UINT64)(*((_s)->pointer))) << 56) + (((UINT64)(*((_s)->pointer + 1))) << 48) + \
|
|
Packit Service |
5a9772 |
(((UINT64)(*((_s)->pointer + 2))) << 40) + (((UINT64)(*((_s)->pointer + 3))) << 32) + \
|
|
Packit Service |
5a9772 |
(((UINT64)(*((_s)->pointer + 4))) << 24) + (((UINT64)(*((_s)->pointer + 5))) << 16) + \
|
|
Packit Service |
5a9772 |
(((UINT64)(*((_s)->pointer + 6))) << 8) + (((UINT64)(*((_s)->pointer + 7))))); \
|
|
Packit Service |
5a9772 |
if (_p) \
|
|
Packit Service |
5a9772 |
Stream_Seek(_s, sizeof(_t)); \
|
|
Packit Service |
5a9772 |
} while (0)
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define Stream_Read_UINT8(_s, _v) _stream_read_n8(UINT8, _s, _v, TRUE)
|
|
Packit |
1fb8d4 |
#define Stream_Read_INT8(_s, _v) _stream_read_n8(INT8, _s, _v, TRUE)
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define Stream_Read_UINT16(_s, _v) _stream_read_n16_le(UINT16, _s, _v, TRUE)
|
|
Packit |
1fb8d4 |
#define Stream_Read_INT16(_s, _v) _stream_read_n16_le(INT16, _s, _v, TRUE)
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define Stream_Read_UINT16_BE(_s, _v) _stream_read_n16_be(UINT16, _s, _v, TRUE)
|
|
Packit |
1fb8d4 |
#define Stream_Read_INT16_BE(_s, _v) _stream_read_n16_be(INT16, _s, _v, TRUE)
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define Stream_Read_UINT32(_s, _v) _stream_read_n32_le(UINT32, _s, _v, TRUE)
|
|
Packit |
1fb8d4 |
#define Stream_Read_INT32(_s, _v) _stream_read_n32_le(INT32, _s, _v, TRUE)
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define Stream_Read_UINT32_BE(_s, _v) _stream_read_n32_be(UINT32, _s, _v, TRUE)
|
|
Packit |
1fb8d4 |
#define Stream_Read_INT32_BE(_s, _v) _stream_read_n32_be(INT32, _s, _v, TRUE)
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define Stream_Read_UINT64(_s, _v) _stream_read_n64_le(UINT64, _s, _v, TRUE)
|
|
Packit |
1fb8d4 |
#define Stream_Read_INT64(_s, _v) _stream_read_n64_le(INT64, _s, _v, TRUE)
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define Stream_Read_UINT64_BE(_s, _v) _stream_read_n64_be(UINT64, _s, _v, TRUE)
|
|
Packit |
1fb8d4 |
#define Stream_Read_INT64_BE(_s, _v) _stream_read_n64_be(INT64, _s, _v, TRUE)
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Read(wStream* _s, void* _b, size_t _n)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
memcpy(_b, (_s->pointer), (_n));
|
|
Packit Service |
5a9772 |
Stream_Seek(_s, _n);
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define Stream_Peek_UINT8(_s, _v) _stream_read_n8(UINT8, _s, _v, FALSE)
|
|
Packit |
1fb8d4 |
#define Stream_Peek_INT8(_s, _v) _stream_read_n8(INT8, _s, _v, FALSE)
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define Stream_Peek_UINT16(_s, _v) _stream_read_n16_le(UINT16, _s, _v, FALSE)
|
|
Packit |
1fb8d4 |
#define Stream_Peek_INT16(_s, _v) _stream_read_n16_le(INT16, _s, _v, FALSE)
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define Stream_Peek_UINT16_BE(_s, _v) _stream_read_n16_be(UINT16, _s, _v, FALSE)
|
|
Packit |
1fb8d4 |
#define Stream_Peek_INT16_BE(_s, _v) _stream_read_n16_be(INT16, _s, _v, FALSE)
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define Stream_Peek_UINT32(_s, _v) _stream_read_n32_le(UINT32, _s, _v, FALSE)
|
|
Packit |
1fb8d4 |
#define Stream_Peek_INT32(_s, _v) _stream_read_n32_le(INT32, _s, _v, FALSE)
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define Stream_Peek_UINT32_BE(_s, _v) _stream_read_n32_be(UINT32, _s, _v, FALSE)
|
|
Packit |
1fb8d4 |
#define Stream_Peek_INT32_BE(_s, _v) _stream_read_n32_be(INT32, _s, _v, FALSE)
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define Stream_Peek_UINT64(_s, _v) _stream_read_n64_le(UINT64, _s, _v, FALSE)
|
|
Packit |
1fb8d4 |
#define Stream_Peek_INT64(_s, _v) _stream_read_n64_le(INT64, _s, _v, FALSE)
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#define Stream_Peek_UINT64_BE(_s, _v) _stream_read_n64_be(UINT64, _s, _v, FALSE)
|
|
Packit |
1fb8d4 |
#define Stream_Peek_INT64_BE(_s, _v) _stream_read_n64_be(INT64, _s, _v, FALSE)
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Peek(wStream* _s, void* _b, size_t _n)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
memcpy(_b, (_s->pointer), (_n));
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Write_UINT8(wStream* _s, UINT8 _v)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
*_s->pointer++ = (UINT8)(_v);
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Write_INT16(wStream* _s, INT16 _v)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
*_s->pointer++ = (_v)&0xFF;
|
|
Packit Service |
5a9772 |
*_s->pointer++ = ((_v) >> 8) & 0xFF;
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Write_UINT16(wStream* _s, UINT16 _v)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
*_s->pointer++ = (_v)&0xFF;
|
|
Packit Service |
5a9772 |
*_s->pointer++ = ((_v) >> 8) & 0xFF;
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Write_UINT16_BE(wStream* _s, UINT16 _v)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
*_s->pointer++ = ((_v) >> 8) & 0xFF;
|
|
Packit Service |
5a9772 |
*_s->pointer++ = (_v)&0xFF;
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Write_INT32(wStream* _s, INT32 _v)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
*_s->pointer++ = (_v)&0xFF;
|
|
Packit Service |
5a9772 |
*_s->pointer++ = ((_v) >> 8) & 0xFF;
|
|
Packit Service |
5a9772 |
*_s->pointer++ = ((_v) >> 16) & 0xFF;
|
|
Packit Service |
5a9772 |
*_s->pointer++ = ((_v) >> 24) & 0xFF;
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Write_UINT32(wStream* _s, UINT32 _v)
|
|
Packit |
1fb8d4 |
{
|
|
Packit Service |
5a9772 |
*_s->pointer++ = (_v)&0xFF;
|
|
Packit Service |
5a9772 |
*_s->pointer++ = ((_v) >> 8) & 0xFF;
|
|
Packit Service |
5a9772 |
*_s->pointer++ = ((_v) >> 16) & 0xFF;
|
|
Packit Service |
5a9772 |
*_s->pointer++ = ((_v) >> 24) & 0xFF;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Write_UINT32_BE(wStream* _s, UINT32 _v)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
Stream_Write_UINT16_BE(_s, ((_v) >> 16 & 0xFFFF));
|
|
Packit Service |
5a9772 |
Stream_Write_UINT16_BE(_s, ((_v)&0xFFFF));
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Write_UINT64(wStream* _s, UINT64 _v)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
*_s->pointer++ = (UINT64)(_v)&0xFF;
|
|
Packit Service |
5a9772 |
*_s->pointer++ = ((UINT64)(_v) >> 8) & 0xFF;
|
|
Packit Service |
5a9772 |
*_s->pointer++ = ((UINT64)(_v) >> 16) & 0xFF;
|
|
Packit Service |
5a9772 |
*_s->pointer++ = ((UINT64)(_v) >> 24) & 0xFF;
|
|
Packit Service |
5a9772 |
*_s->pointer++ = ((UINT64)(_v) >> 32) & 0xFF;
|
|
Packit Service |
5a9772 |
*_s->pointer++ = ((UINT64)(_v) >> 40) & 0xFF;
|
|
Packit Service |
5a9772 |
*_s->pointer++ = ((UINT64)(_v) >> 48) & 0xFF;
|
|
Packit Service |
5a9772 |
*_s->pointer++ = ((UINT64)(_v) >> 56) & 0xFF;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Write(wStream* _s, const void* _b, size_t _n)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
if (_n > 0)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
memcpy(_s->pointer, (_b), (_n));
|
|
Packit Service |
5a9772 |
Stream_Seek(_s, _n);
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
#define Stream_Seek_UINT8(_s) Stream_Seek(_s, 1)
|
|
Packit Service |
5a9772 |
#define Stream_Seek_UINT16(_s) Stream_Seek(_s, 2)
|
|
Packit Service |
5a9772 |
#define Stream_Seek_UINT32(_s) Stream_Seek(_s, 4)
|
|
Packit Service |
5a9772 |
#define Stream_Seek_UINT64(_s) Stream_Seek(_s, 8)
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
#define Stream_Rewind_UINT8(_s) Stream_Rewind(_s, 1)
|
|
Packit Service |
5a9772 |
#define Stream_Rewind_UINT16(_s) Stream_Rewind(_s, 2)
|
|
Packit Service |
5a9772 |
#define Stream_Rewind_UINT32(_s) Stream_Rewind(_s, 4)
|
|
Packit Service |
5a9772 |
#define Stream_Rewind_UINT64(_s) Stream_Rewind(_s, 8)
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Zero(wStream* _s, size_t _n)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
memset(_s->pointer, '\0', (_n));
|
|
Packit Service |
5a9772 |
Stream_Seek(_s, _n);
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Fill(wStream* _s, int _v, size_t _n)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
memset(_s->pointer, _v, (_n));
|
|
Packit Service |
5a9772 |
Stream_Seek(_s, _n);
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Copy(wStream* _src, wStream* _dst, size_t _n)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
memcpy(_dst->pointer, _src->pointer, _n);
|
|
Packit Service |
5a9772 |
Stream_Seek(_dst, _n);
|
|
Packit Service |
5a9772 |
Stream_Seek(_src, _n);
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE BYTE* Stream_Buffer(wStream* _s)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
return _s->buffer;
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
#define Stream_GetBuffer(_s, _b) _b = Stream_Buffer(_s)
|
|
Packit Service |
5a9772 |
static INLINE void Stream_SetBuffer(wStream* _s, BYTE* _b)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
_s->buffer = _b;
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE BYTE* Stream_Pointer(wStream* _s)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
return _s->pointer;
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
#define Stream_GetPointer(_s, _p) _p = Stream_Pointer(_s)
|
|
Packit Service |
5a9772 |
static INLINE void Stream_SetPointer(wStream* _s, BYTE* _p)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
_s->pointer = _p;
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE size_t Stream_Length(wStream* _s)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
return _s->length;
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
#define Stream_GetLength(_s, _l) _l = Stream_Length(_s)
|
|
Packit Service |
5a9772 |
static INLINE void Stream_SetLength(wStream* _s, size_t _l)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
_s->length = _l;
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE size_t Stream_Capacity(wStream* _s)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
return _s->capacity;
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
#define Stream_GetCapacity(_s, _c) _c = Stream_Capacity(_s);
|
|
Packit Service |
5a9772 |
static INLINE void Stream_SetCapacity(wStream* _s, size_t _c)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
_s->capacity = _c;
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE size_t Stream_GetPosition(wStream* _s)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
return (_s->pointer - _s->buffer);
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_SetPosition(wStream* _s, size_t _p)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
_s->pointer = _s->buffer + (_p);
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_SealLength(wStream* _s)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
_s->length = (_s->pointer - _s->buffer);
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE size_t Stream_GetRemainingCapacity(wStream* _s)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
return (_s->capacity - (_s->pointer - _s->buffer));
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE size_t Stream_GetRemainingLength(wStream* _s)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
return (_s->length - (_s->pointer - _s->buffer));
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE void Stream_Clear(wStream* _s)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
memset(_s->buffer, 0, _s->capacity);
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE BOOL Stream_SafeSeek(wStream* s, size_t size)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
if (Stream_GetRemainingLength(s) < size)
|
|
Packit Service |
5a9772 |
return FALSE;
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
Stream_Seek(s, size);
|
|
Packit Service |
5a9772 |
return TRUE;
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE BOOL Stream_Read_UTF16_String(wStream* s, WCHAR* dst, size_t length)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
size_t x;
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
if (!s || !dst)
|
|
Packit Service |
5a9772 |
return FALSE;
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
if (Stream_GetRemainingLength(s) / sizeof(WCHAR) < length)
|
|
Packit Service |
5a9772 |
return FALSE;
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
for (x = 0; x < length; x++)
|
|
Packit Service |
5a9772 |
Stream_Read_UINT16(s, dst[x]);
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
return TRUE;
|
|
Packit Service |
5a9772 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
static INLINE BOOL Stream_Write_UTF16_String(wStream* s, const WCHAR* src, size_t length)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
size_t x;
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
if (!s || !src)
|
|
Packit Service |
5a9772 |
return FALSE;
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
if (Stream_GetRemainingCapacity(s) / sizeof(WCHAR) < length)
|
|
Packit Service |
5a9772 |
return FALSE;
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
for (x = 0; x < length; x++)
|
|
Packit Service |
5a9772 |
Stream_Write_UINT16(s, src[x]);
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
return TRUE;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
/* StreamPool */
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
struct _wStreamPool
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
int aSize;
|
|
Packit Service |
5a9772 |
int aCapacity;
|
|
Packit Service |
5a9772 |
wStream** aArray;
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
int uSize;
|
|
Packit Service |
5a9772 |
int uCapacity;
|
|
Packit Service |
5a9772 |
wStream** uArray;
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
CRITICAL_SECTION lock;
|
|
Packit Service |
5a9772 |
BOOL synchronized;
|
|
Packit Service |
5a9772 |
size_t defaultSize;
|
|
Packit Service |
5a9772 |
};
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
WINPR_API wStream* StreamPool_Take(wStreamPool* pool, size_t size);
|
|
Packit Service |
5a9772 |
WINPR_API void StreamPool_Return(wStreamPool* pool, wStream* s);
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
WINPR_API void Stream_AddRef(wStream* s);
|
|
Packit Service |
5a9772 |
WINPR_API void Stream_Release(wStream* s);
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
WINPR_API wStream* StreamPool_Find(wStreamPool* pool, BYTE* ptr);
|
|
Packit Service |
5a9772 |
WINPR_API void StreamPool_AddRef(wStreamPool* pool, BYTE* ptr);
|
|
Packit Service |
5a9772 |
WINPR_API void StreamPool_Release(wStreamPool* pool, BYTE* ptr);
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
WINPR_API void StreamPool_Clear(wStreamPool* pool);
|
|
Packit |
1fb8d4 |
|
|
Packit Service |
5a9772 |
WINPR_API wStreamPool* StreamPool_New(BOOL synchronized, size_t defaultSize);
|
|
Packit Service |
5a9772 |
WINPR_API void StreamPool_Free(wStreamPool* pool);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#ifdef __cplusplus
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#endif /* WINPR_UTILS_STREAM_H */
|