|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef WINPTY_SHARED_BUFFER_H |
|
#define WINPTY_SHARED_BUFFER_H |
|
|
|
#include <stdint.h> |
|
#include <string.h> |
|
|
|
#include <algorithm> |
|
#include <utility> |
|
#include <vector> |
|
#include <string> |
|
|
|
#include "WinptyException.h" |
|
|
|
class WriteBuffer { |
|
private: |
|
std::vector<char> m_buf; |
|
|
|
public: |
|
WriteBuffer() {} |
|
|
|
template <typename T> void putRawValue(const T &t) { |
|
putRawData(&t, sizeof(t)); |
|
} |
|
template <typename T> void replaceRawValue(size_t pos, const T &t) { |
|
replaceRawData(pos, &t, sizeof(t)); |
|
} |
|
|
|
void putRawData(const void *data, size_t len); |
|
void replaceRawData(size_t pos, const void *data, size_t len); |
|
void putInt32(int32_t i); |
|
void putInt64(int64_t i); |
|
void putWString(const wchar_t *str, size_t len); |
|
void putWString(const wchar_t *str) { putWString(str, wcslen(str)); } |
|
void putWString(const std::wstring &str) { putWString(str.data(), str.size()); } |
|
std::vector<char> &buf() { return m_buf; } |
|
|
|
|
|
WriteBuffer(WriteBuffer &&other) : m_buf(std::move(other.m_buf)) {} |
|
WriteBuffer &operator=(WriteBuffer &&other) { |
|
m_buf = std::move(other.m_buf); |
|
return *this; |
|
} |
|
}; |
|
|
|
class ReadBuffer { |
|
public: |
|
class DecodeError : public WinptyException { |
|
virtual const wchar_t *what() const WINPTY_NOEXCEPT override { |
|
return L"DecodeError: RPC message decoding error"; |
|
} |
|
}; |
|
|
|
private: |
|
std::vector<char> m_buf; |
|
size_t m_off = 0; |
|
|
|
public: |
|
explicit ReadBuffer(std::vector<char> &&buf) : m_buf(std::move(buf)) {} |
|
|
|
template <typename T> T getRawValue() { |
|
T ret = {}; |
|
getRawData(&ret, sizeof(ret)); |
|
return ret; |
|
} |
|
|
|
void getRawData(void *data, size_t len); |
|
int32_t getInt32(); |
|
int64_t getInt64(); |
|
std::wstring getWString(); |
|
void assertEof(); |
|
|
|
|
|
ReadBuffer(ReadBuffer &&other) : |
|
m_buf(std::move(other.m_buf)), m_off(other.m_off) {} |
|
ReadBuffer &operator=(ReadBuffer &&other) { |
|
m_buf = std::move(other.m_buf); |
|
m_off = other.m_off; |
|
return *this; |
|
} |
|
}; |
|
|
|
#endif |
|
|