SocketStreams v1.11.1
Loading...
Searching...
No Matches
IOSocketStream.h
Go to the documentation of this file.
1#pragma once
2
3#include <istream>
4#include <limits>
5
6#include "IOSocketBuffer.h"
8
9namespace streams
10{
12 class IOSocketStream : public std::iostream
13 {
14 protected:
15 std::unique_ptr<buffers::IOSocketBuffer> buffer;
16
17 protected:
18 template<web::utility::Fundamental T>
19 int sendFundamental(T value);
20
21 template<web::utility::Fundamental T>
22 int receiveFundamental(T& value);
23
24 virtual int sendFundamentalImplementation(const char* value, int valueSize, bool& endOfStream);
25
26 virtual int receiveFundamentalImplementation(char* value, int valueSize, bool& endOfStream);
27
28 private:
29 IOSocketStream(std::unique_ptr<buffers::IOSocketBuffer>&& buffer);
30
31 IOSocketStream(std::unique_ptr<web::Network>&& network);
32
33 public:
34 template<std::derived_from<web::Network> T, typename... Args>
35 static IOSocketStream createStream(Args&&... args);
36
37 template<std::derived_from<buffers::IOSocketBuffer> T, typename... Args>
38 static IOSocketStream createStream(Args&&... args);
39
40 public:
43
46 IOSocketStream(IOSocketStream&& other) noexcept;
47
52
56 IOSocketStream& operator = (IOSocketStream&& other) noexcept;
57
58 template<std::derived_from<web::Network> T = web::Network>
59 T& getNetwork();
60
61 template<std::derived_from<web::Network> T = web::Network>
62 const T& getNetwork() const;
63
64 std::ostream& operator << (bool value);
65 std::ostream& operator << (short value);
66 std::ostream& operator << (int value);
67 std::ostream& operator << (long value);
68 std::ostream& operator << (long long value);
69
70 std::ostream& operator << (unsigned short value);
71 std::ostream& operator << (unsigned int value);
72 std::ostream& operator << (unsigned long value);
73 std::ostream& operator << (unsigned long long value);
74
75 std::ostream& operator << (float value);
76 std::ostream& operator << (double value);
77 std::ostream& operator << (long double value);
78
79 std::istream& operator >> (bool& value);
80 std::istream& operator >> (short& value);
81 std::istream& operator >> (int& value);
82 std::istream& operator >> (long& value);
83 std::istream& operator >> (long long& value);
84
85 std::istream& operator >> (unsigned short& value);
86 std::istream& operator >> (unsigned int& value);
87 std::istream& operator >> (unsigned long& value);
88 std::istream& operator >> (unsigned long long& value);
89
90 std::istream& operator >> (float& value);
91 std::istream& operator >> (double& value);
92 std::istream& operator >> (long double& value);
93
98 template<web::utility::Container T>
99 std::ostream& operator << (const T& data);
100
105 template<web::utility::Container T>
106 std::istream& operator >> (T& data);
107
108 virtual ~IOSocketStream() = default;
109 };
110
111 template<web::utility::Fundamental T>
113 {
114 try
115 {
116 bool endOfStream = false;
117 int lastPacketSize = this->sendFundamentalImplementation(reinterpret_cast<const char*>(&value), sizeof(value), endOfStream);
118
119 if (endOfStream)
120 {
121 setstate(std::ios_base::eofbit);
122 }
123
124 return lastPacketSize;
125 }
126 catch (const web::exceptions::WebException&)
127 {
128 setstate(std::ios_base::failbit);
129
130 throw;
131 }
132 }
133
134 template<web::utility::Fundamental T>
136 {
137 try
138 {
139 bool endOfStream = false;
140 int lastPacketSize = this->receiveFundamentalImplementation(reinterpret_cast<char*>(&value), sizeof(value), endOfStream);
141
142 if (endOfStream)
143 {
144 setstate(std::ios_base::eofbit);
145 }
146
147 return lastPacketSize;
148 }
149 catch (const web::exceptions::WebException&)
150 {
151 setstate(std::ios_base::failbit);
152
153 throw;
154 }
155 }
156
157 template<std::derived_from<web::Network> T, typename... Args>
159 {
160 return IOSocketStream(std::make_unique<T>(std::forward<Args>(args)...));
161 }
162
163 template<std::derived_from<buffers::IOSocketBuffer> T, typename... Args>
165 {
166 return IOSocketStream(std::make_unique<T>(std::forward<Args>(args)...));
167 }
168
169 template<std::derived_from<web::Network> T>
171 {
172 if (buffer->getNetwork())
173 {
174 return dynamic_cast<T&>(*buffer->getNetwork());
175 }
176
177 throw std::runtime_error("Network is nullptr");
178
179 return dynamic_cast<T&>(*buffer->getNetwork());
180 }
181
182 template<std::derived_from<web::Network> T>
184 {
185 if (buffer->getNetwork())
186 {
187 return dynamic_cast<const T&>(*buffer->getNetwork());
188 }
189
190 throw std::runtime_error("Network is nullptr");
191
192 return dynamic_cast<const T&>(*buffer->getNetwork());
193 }
194
195 template<web::utility::Container T>
196 std::ostream& IOSocketStream::operator << (const T& data)
197 {
198 web::utility::ContainerWrapper container(const_cast<T&>(data));
199 constexpr std::streamsize size = (std::numeric_limits<std::streamsize>::max)();
200
201 try
202 {
203 if (buffer->sputn(reinterpret_cast<const char*>(&container), size) == buffers::IOSocketBuffer::traits_type::eof())
204 {
205 setstate(std::ios_base::eofbit);
206 }
207 }
208 catch (const web::exceptions::WebException&)
209 {
210 setstate(std::ios_base::failbit);
211
212 throw;
213 }
214
215 return *this;
216 }
217
218 template<web::utility::Container T>
219 std::istream& IOSocketStream::operator >> (T& data)
220 {
221 web::utility::ContainerWrapper container(data);
222 constexpr std::streamsize size = (std::numeric_limits<std::streamsize>::max)();
223
224 try
225 {
226 if (buffer->sgetn(reinterpret_cast<char*>(&container), size) == buffers::IOSocketBuffer::traits_type::eof())
227 {
228 setstate(std::ios_base::eofbit);
229 }
230 }
231 catch (const web::exceptions::WebException&)
232 {
233 setstate(std::ios_base::failbit);
234
235 throw;
236 }
237
238 return *this;
239 }
240}
Base input/output socket stream.
Definition IOSocketStream.h:13
int receiveFundamental(T &value)
Definition IOSocketStream.h:135
T & getNetwork()
Definition IOSocketStream.h:170
virtual ~IOSocketStream()=default
std::ostream & operator<<(bool value)
Definition IOSocketStream.cpp:49
IOSocketStream(const IOSocketStream &)=delete
Deleted copy constructor.
int sendFundamental(T value)
Definition IOSocketStream.h:112
virtual int receiveFundamentalImplementation(char *value, int valueSize, bool &endOfStream)
Definition IOSocketStream.cpp:10
static IOSocketStream createStream(Args &&... args)
std::unique_ptr< buffers::IOSocketBuffer > buffer
Definition IOSocketStream.h:15
std::istream & operator>>(bool &value)
Definition IOSocketStream.cpp:133
static IOSocketStream createStream(Args &&... args)
Definition IOSocketStream.h:158
IOSocketStream & operator=(const IOSocketStream &)=delete
Deleted copy assignment operator.
virtual int sendFundamentalImplementation(const char *value, int valueSize, bool &endOfStream)
Definition IOSocketStream.cpp:5
Network exception.
Definition WebException.h:12
Wrap Container concept instance.
Definition ContainerWrapper.h:27
Definition IOSocketStream.cpp:4