SocketStreams v1.11.1
Loading...
Searching...
No Matches
IOSocketBuffer.h
Go to the documentation of this file.
1#pragma once
2
3#include <streambuf>
4#include <memory>
5
6#include "Network.h"
7
8namespace buffers
9{
10 using namespace std::chrono_literals;
11
13 class IOSocketBuffer : public std::streambuf
14 {
15 public:
16 using typename std::streambuf::int_type;
17 using typename std::streambuf::char_type;
18 using typename std::streambuf::traits_type;
19
20 private:
21 class BufferArray
22 {
23 private:
24 size_t totalSize;
25 size_t pageSize;
26 void* pageData;
27
28 private:
29 void free();
30
31 public:
32 BufferArray();
33
34 BufferArray(const BufferArray& other) = delete;
35
36 BufferArray(BufferArray&& other) noexcept;
37
38 BufferArray& operator =(const BufferArray& other) = delete;
39
40 BufferArray& operator =(BufferArray&& other) noexcept;
41
42 size_t size() const;
43
44 char* data();
45
46 const char* data() const;
47
48 void resize(size_t size);
49
50 char& operator [](size_t index);
51
52 ~BufferArray();
53 };
54
55 protected:
56 size_t getAvailableInputSize() const;
57
58 protected:
59 std::unique_ptr<web::Network> network;
61 BufferArray inputData;
63
64 protected:
65 int_type overflow(int_type ch) override;
66
67 int_type underflow() override;
68
69 std::streamsize xsputn(const char_type* s, std::streamsize size) override;
70
71 std::streamsize xsgetn(char_type* s, std::streamsize size) override;
72
73 public:
74 IOSocketBuffer() = default;
75
78
81 IOSocketBuffer(IOSocketBuffer&& other) noexcept = default;
82
86 template<web::Timeout T = std::chrono::seconds>
87 IOSocketBuffer(SOCKET clientSocket, T timeout = 30s);
88
94 template<web::Timeout T = std::chrono::seconds>
95 IOSocketBuffer(std::string_view ip, std::string_view port, T timeout = 30s);
96
97 IOSocketBuffer(std::unique_ptr<web::Network>&& networkSubclass);
98
103
107 IOSocketBuffer& operator = (IOSocketBuffer&& other) noexcept = default;
108
109 const std::unique_ptr<web::Network>& getNetwork() const noexcept;
110
111 int getLastPacketSize() const noexcept;
112
113 bool getEndOfStream() const noexcept;
114
115 ~IOSocketBuffer() = default;
116 };
117}
118
119namespace buffers
120{
121 template<web::Timeout T>
122 IOSocketBuffer::IOSocketBuffer(SOCKET clientSocket, T timeout) :
123 network(std::make_unique<web::Network>(clientSocket, timeout)),
125 endOfStream(false)
126 {
127
128 }
129
130 template<web::Timeout T>
131 IOSocketBuffer::IOSocketBuffer(std::string_view ip, std::string_view port, T timeout) :
132 network(std::make_unique<web::Network>(ip, port, timeout)),
133 lastPacketSize(0),
134 endOfStream(false)
135 {
136
137 }
138}
Base input/output socket buffer.
Definition IOSocketBuffer.h:14
bool getEndOfStream() const noexcept
Definition IOSocketBuffer.cpp:110
IOSocketBuffer(const IOSocketBuffer &)=delete
Deleted copy contructor.
int_type overflow(int_type ch) override
Definition IOSocketBuffer.cpp:16
int getLastPacketSize() const noexcept
Definition IOSocketBuffer.cpp:105
int lastPacketSize
Definition IOSocketBuffer.h:60
size_t getAvailableInputSize() const
Definition IOSocketBuffer.cpp:11
bool endOfStream
Definition IOSocketBuffer.h:62
IOSocketBuffer(IOSocketBuffer &&other) noexcept=default
Move constructor.
std::unique_ptr< web::Network > network
Definition IOSocketBuffer.h:59
std::streamsize xsgetn(char_type *s, std::streamsize size) override
Definition IOSocketBuffer.cpp:69
const std::unique_ptr< web::Network > & getNetwork() const noexcept
Definition IOSocketBuffer.cpp:100
IOSocketBuffer & operator=(const IOSocketBuffer &)=delete
Deleted copy assignment operator.
std::streamsize xsputn(const char_type *s, std::streamsize size) override
Definition IOSocketBuffer.cpp:53
BufferArray inputData
Definition IOSocketBuffer.h:61
int_type underflow() override
Definition IOSocketBuffer.cpp:30
Definition BufferArray.cpp:11
Definition ContainerWrapper.cpp:4