rtphone/src/libs/ice/ICEByteBuffer.h

194 lines
5.6 KiB
C++

/* Copyright(C) 2007-2016 VoIPobjects (voipobjects.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef __ICE_BYTE_BUFFER_H
#define __ICE_BYTE_BUFFER_H
#include "ICEPlatform.h"
#include "ICETypes.h"
#include <vector>
#include <string>
#include <memory>
#include <span>
#include "ICETypes.h"
#include "ICEAddress.h"
namespace ice
{
class ByteBuffer
{
public:
enum class CopyBehavior
{
CopyMemory,
UseExternal
};
ByteBuffer();
ByteBuffer(size_t initialCapacity);
ByteBuffer(const ByteBuffer& src);
ByteBuffer(const void* packetPtr, size_t packetSize, CopyBehavior behavior = CopyBehavior::CopyMemory);
ByteBuffer(const std::span<const uint8_t>& packet, CopyBehavior behavior = CopyBehavior::CopyMemory);
~ByteBuffer();
ByteBuffer& operator = (const ByteBuffer& src);
void clear();
size_t size() const;
const uint8_t* data() const;
uint8_t* mutableData();
std::span<const uint8_t> span();
NetworkAddress& remoteAddress();
void setRemoteAddress(const NetworkAddress& addr);
int component();
void setComponent(int component);
void setComment(std::string comment);
std::string comment();
std::string hexstring();
static std::string toHex(const void* bytes, size_t len);
void reserve(size_t capacity);
void insertTurnPrefix(unsigned short prefix);
void truncate(size_t newsize);
void erase(size_t p, size_t l);
void resize(size_t newsize);
void appendBuffer(const void* data, size_t size);
void* tag();
void setTag(void* tag);
void trim();
bool relayed();
void setRelayed(bool value);
void syncPointer();
uint8_t operator[](int index) const;
uint8_t& operator[](int index);
protected:
std::vector<uint8_t> mData; // Internal storage
uint8_t* mDataPtr; // Pointer to internal storage or external data
size_t mDataSize; // Used only for mCopyBehavior == UseExternal
NetworkAddress mRemoteAddress; // Associates buffer with IP address
int mComponent; // Associates buffer with component ID
std::string mComment; // Comment's for this buffer - useful in debugging
void* mTag; // User tag
bool mRelayed; // Marks if buffer was received via relay
CopyBehavior mCopyBehavior; // Determines if buffer manages internal or external data
void initEmpty();
int bitsInBuffer(uint8_t bufferMask);
};
typedef std::shared_ptr<ByteBuffer> PByteBuffer;
class BitReader
{
protected:
const uint8_t* mStream;
size_t mStreamLen;
size_t mStreamOffset;
size_t mCurrentPosition;
size_t mCurrentBit;
void init();
public:
BitReader(const void* input, size_t bytes);
BitReader(const ByteBuffer& buffer);
~BitReader() = default;
uint8_t readBit();
uint32_t readBits(size_t nrOfBits);
size_t readBits(void* output, size_t nrOfBits);
size_t count() const;
size_t position() const;
};
class BitWriter
{
protected:
uint8_t* mStream;
size_t mStreamLen;
size_t mStreamOffset;
size_t mCurrentPosition;
size_t mCurrentBit;
void init();
public:
BitWriter(void* output);
BitWriter(ByteBuffer& buffer);
~BitWriter() = default;
// Bit must be 0 or 1
BitWriter& writeBit(int bit);
size_t count() const;
};
class BufferReader
{
protected:
const uint8_t* mData;
size_t mSize;
size_t mIndex;
public:
BufferReader(const void* input, size_t bytes);
BufferReader(const ByteBuffer& buffer);
// This methods reads uint32_t from stream and converts network byte order to host byte order.
uint32_t readUInt();
// This method reads uint32_t from stream. No conversion between byte orders.
uint32_t readNativeUInt();
// This method reads uint16_t from stream and converts network byte order to host byte order.
uint16_t readUShort();
// This method reads uint16_t. No conversion between byte orders.
uint16_t readNativeUShort();
uint8_t readUChar();
// Reads in_addr or in6_addr from stream and wraps it to NetworkAddress
NetworkAddress readIp(int family);
// Reads to plain memory buffer
size_t readBuffer(void* dataPtr, size_t dataSize);
// Read directly to byte buffer. New data will be appended to byte buffer
size_t readBuffer(ByteBuffer& bb, size_t dataSize);
size_t count() const;
};
class BufferWriter
{
protected:
uint8_t* mData;
size_t mIndex;
public:
BufferWriter(void* output);
BufferWriter(ByteBuffer& buffer);
void writeUInt(uint32_t value);
void writeUShort(uint16_t value);
void writeUChar(uint8_t value);
void writeIp(const NetworkAddress& ip);
void writeBuffer(const void* dataPtr, size_t dataSize);
void rewind();
void skip(int count);
size_t offset() const;
};
}
#endif