5 #ifndef __DDS__BasicCmd__ 6 #define __DDS__BasicCmd__ 15 #pragma clang diagnostic push 16 #pragma clang diagnostic ignored "-Wdeprecated-register" 17 #include <boost/uuid/uuid.hpp> 18 #include <boost/uuid/uuid_io.hpp> 19 #pragma clang diagnostic pop 25 namespace protocol_api
36 size_t dsize(
const T& _value);
42 return sizeof(uint8_t);
49 return sizeof(uint16_t);
56 return sizeof(uint32_t);
63 return sizeof(uint64_t);
68 inline size_t dsize<std::string>(
const std::string& _value)
70 return _value.size() +
sizeof(uint16_t);
75 inline size_t dsize<std::vector<uint8_t>>(
const std::vector<uint8_t>& _value)
77 return _value.size() *
sizeof(uint8_t) +
sizeof(uint32_t);
82 inline size_t dsize<std::vector<uint16_t>>(
const std::vector<uint16_t>& _value)
84 return _value.size() *
sizeof(uint16_t) +
sizeof(uint16_t);
89 inline size_t dsize<std::vector<uint32_t>>(
const std::vector<uint32_t>& _value)
91 return _value.size() *
sizeof(uint32_t) +
sizeof(uint16_t);
96 inline size_t dsize<std::vector<uint64_t>>(
const std::vector<uint64_t>& _value)
98 return _value.size() *
sizeof(uint64_t) +
sizeof(uint16_t);
103 inline size_t dsize<std::vector<std::string>>(
const std::vector<std::string>& _value)
105 size_t sum(
sizeof(uint16_t));
106 for (
const auto& v : _value)
107 sum += (v.size() +
sizeof(uint16_t));
113 inline size_t dsize<boost::uuids::uuid>(
const boost::uuids::uuid& _value)
115 return boost::uuids::uuid::static_size();
121 template <
typename T>
127 if (_data ==
nullptr || _nPos ==
nullptr || _value ==
nullptr)
128 throw std::invalid_argument(
"readDataFromContainer");
130 *_value = (*_data)[*_nPos];
138 if (_data ==
nullptr || _nPos ==
nullptr || _value ==
nullptr)
139 throw std::invalid_argument(
"readDataFromContainer");
141 *_value = (*_data)[*_nPos];
142 *_value += ((*_data)[++(*_nPos)] << 8);
152 if (_data ==
nullptr || _nPos ==
nullptr || _value ==
nullptr)
153 throw std::invalid_argument(
"readDataFromContainer");
155 *_value = (*_data)[*_nPos];
156 *_value += ((*_data)[++(*_nPos)] << 8);
157 *_value += ((*_data)[++(*_nPos)] << 16);
158 *_value += ((*_data)[++(*_nPos)] << 24);
168 if (_data ==
nullptr || _nPos ==
nullptr || _value ==
nullptr)
169 throw std::invalid_argument(
"readDataFromContainer");
171 *_value = (*_data)[*_nPos];
172 *_value += ((uint64_t)(*_data)[++(*_nPos)] << 8);
173 *_value += ((uint64_t)(*_data)[++(*_nPos)] << 16);
174 *_value += ((uint64_t)(*_data)[++(*_nPos)] << 24);
175 *_value += ((uint64_t)(*_data)[++(*_nPos)] << 32);
176 *_value += ((uint64_t)(*_data)[++(*_nPos)] << 40);
177 *_value += ((uint64_t)(*_data)[++(*_nPos)] << 48);
178 *_value += ((uint64_t)(*_data)[++(*_nPos)] << 56);
188 if (_data ==
nullptr || _nPos ==
nullptr || _value ==
nullptr)
189 throw std::invalid_argument(
"readDataFromContainer");
191 if (_value->size() > std::numeric_limits<uint16_t>::max())
192 throw std::invalid_argument(
"String size can't exceed 2^16 symbols. String size: " +
193 std::to_string(_value->size()));
199 MiscCommon::BYTEVector_t::const_iterator iter = _data->begin();
200 std::advance(iter, *_nPos);
201 MiscCommon::BYTEVector_t::const_iterator iter_end = _data->begin();
202 std::advance(iter_end, (*_nPos + n));
203 std::copy(iter, iter_end, back_inserter(*_value));
209 inline void readData<boost::uuids::uuid>(boost::uuids::uuid* _value,
213 if (_data ==
nullptr || _nPos ==
nullptr || _value ==
nullptr)
214 throw std::invalid_argument(
"readDataFromContainer");
216 MiscCommon::BYTEVector_t::const_iterator iter = _data->begin();
217 std::advance(iter, *_nPos);
218 MiscCommon::BYTEVector_t::const_iterator iter_end = _data->begin();
219 std::advance(iter_end, (*_nPos + boost::uuids::uuid::static_size()));
220 copy(iter, iter_end, _value->begin());
221 (*_nPos) += boost::uuids::uuid::static_size();
224 template <
typename T>
227 if (_data ==
nullptr || _nPos ==
nullptr || _value ==
nullptr)
228 throw std::invalid_argument(
"readDataFromContainer");
230 if (_value->size() > std::numeric_limits<uint16_t>::max())
231 throw std::invalid_argument(
"Vector size can't exceed 2^16 symbols. Vector size: " +
232 std::to_string(_value->size()));
239 for (
size_t i = 0; i < n; ++i)
243 _value->push_back(v);
248 inline void readData<std::vector<uint8_t>>(std::vector<uint8_t>* _value,
252 if (_data ==
nullptr || _nPos ==
nullptr || _value ==
nullptr)
253 throw std::invalid_argument(
"readDataFromContainer");
255 if (_value->size() > std::numeric_limits<uint32_t>::max())
256 throw std::invalid_argument(
"Vector<uint8_t> size can't exceed 2^32 symbols. Vector size: " +
257 std::to_string(_value->size()));
262 MiscCommon::BYTEVector_t::const_iterator iter = _data->begin();
263 std::advance(iter, *_nPos);
264 MiscCommon::BYTEVector_t::const_iterator iter_end = _data->begin();
265 std::advance(iter_end, (*_nPos + n));
266 std::copy(iter, iter_end, back_inserter(*_value));
272 inline void readData<std::vector<uint16_t>>(std::vector<uint16_t>* _value,
276 readDataVector<uint16_t>(_value, _data, _nPos);
280 inline void readData<std::vector<uint32_t>>(std::vector<uint32_t>* _value,
284 readDataVector<uint32_t>(_value, _data, _nPos);
288 inline void readData<std::vector<uint64_t>>(std::vector<uint64_t>* _value,
292 readDataVector<uint64_t>(_value, _data, _nPos);
296 inline void readData<std::vector<std::string>>(std::vector<std::string>* _value,
300 readDataVector<std::string>(_value, _data, _nPos);
307 template <
typename T>
313 if (_data ==
nullptr)
314 throw std::invalid_argument(
"pushDataFromContainer");
316 _data->push_back(_value);
322 if (_data ==
nullptr)
323 throw std::invalid_argument(
"pushDataFromContainer");
326 _data->push_back(value & 0xFF);
327 _data->push_back(value >> 8);
333 if (_data ==
nullptr)
334 throw std::invalid_argument(
"pushDataFromContainer");
337 _data->push_back(value & 0xFF);
338 _data->push_back((value >> 8) & 0xFF);
339 _data->push_back((value >> 16) & 0xFF);
340 _data->push_back((value >> 24) & 0xFF);
346 if (_data ==
nullptr)
347 throw std::invalid_argument(
"pushDataFromContainer");
350 _data->push_back(value & 0xFF);
351 _data->push_back((value >> 8) & 0xFF);
352 _data->push_back((value >> 16) & 0xFF);
353 _data->push_back((value >> 24) & 0xFF);
354 _data->push_back((value >> 32) & 0xFF);
355 _data->push_back((value >> 40) & 0xFF);
356 _data->push_back((value >> 48) & 0xFF);
357 _data->push_back((value >> 56) & 0xFF);
363 if (_data ==
nullptr)
364 throw std::invalid_argument(
"pushDataFromContainer");
366 if (_value.size() > std::numeric_limits<uint16_t>::max())
367 throw std::invalid_argument(
"String size can't exceed 2^16 symbols. String size: " +
368 std::to_string(_value.size()));
370 uint16_t n = _value.size();
372 copy(_value.begin(), _value.end(), back_inserter(*_data));
378 if (_data ==
nullptr)
379 throw std::invalid_argument(
"pushDataFromContainer");
381 copy(_value.begin(), _value.end(), back_inserter(*_data));
384 template <
typename T>
387 if (_data ==
nullptr)
388 throw std::invalid_argument(
"pushDataFromContainer");
390 if (_value.size() > std::numeric_limits<uint16_t>::max())
391 throw std::invalid_argument(
"Vector size can't exceed 2^16 symbols. Vector size: " +
392 std::to_string(_value.size()));
395 uint16_t n = _value.size();
398 for (
const T& v : _value)
407 if (_data ==
nullptr)
408 throw std::invalid_argument(
"pushDataFromContainer");
410 if (_value.size() > std::numeric_limits<uint32_t>::max())
411 throw std::invalid_argument(
"Vector<uint32_t> size can't exceed 2^32 symbols. Vector size: " +
412 std::to_string(_value.size()));
414 uint32_t n = _value.size();
416 copy(_value.begin(), _value.end(), back_inserter(*_data));
420 inline void pushData<std::vector<uint16_t>>(
const std::vector<uint16_t>& _value,
423 pushDataVector<uint16_t>(_value, _data);
427 inline void pushData<std::vector<uint32_t>>(
const std::vector<uint32_t>& _value,
430 pushDataVector<uint32_t>(_value, _data);
434 inline void pushData<std::vector<uint64_t>>(
const std::vector<uint64_t>& _value,
437 pushDataVector<uint64_t>(_value, _data);
441 inline void pushData<std::vector<std::string>>(
const std::vector<std::string>& _value,
444 pushDataVector<std::string>(_value, _data);
461 template <
typename T>
468 template <
typename T>
480 template <
class _Owner>
485 _Owner* p = reinterpret_cast<_Owner*>(
this);
486 if (_data.size() < p->size())
488 std::stringstream ss;
489 ss <<
"Protocol message data is too short, expected " << p->size() <<
" received " << _data.size();
490 throw std::runtime_error(ss.str());
492 p->_convertFromData(_data);
496 const _Owner* p = reinterpret_cast<const _Owner*>(
this);
497 p->_convertToData(_data);
void pushData< uint64_t >(const uint64_t &_value, MiscCommon::BYTEVector_t *_data)
Definition: BasicCmd.h:344
Definition: BasicCmd.h:481
void readData(T *_value, const MiscCommon::BYTEVector_t *_data, size_t *_nPos)
Helper template function reading data from byte array.
size_t dsize< uint32_t >(const uint32_t &_value)
Helper function calculating size of uint32_t.
Definition: BasicCmd.h:54
void convertFromData(const MiscCommon::BYTEVector_t &_data)
Definition: BasicCmd.h:483
SAttachmentDataProvider & get(T &_value)
Definition: BasicCmd.h:462
T normalizeRead(T _value)
size_t dsize< uint16_t >(const uint16_t &_value)
Helper function calculating size of uint16_t.
Definition: BasicCmd.h:47
void pushDataVector(const std::vector< T > &_value, MiscCommon::BYTEVector_t *_data)
Definition: BasicCmd.h:385
size_t dsize< uint8_t >(const uint8_t &_value)
Helper function calculating size of uint8_t.
Definition: BasicCmd.h:40
size_t dsize(const T &_value)
All vectors (except uint8_t) have a maximum size of uint16_t i.e. 2^16. All vector<uint8_t>'s have a ...
void pushData< uint16_t >(const uint16_t &_value, MiscCommon::BYTEVector_t *_data)
Definition: BasicCmd.h:320
void readDataVector(std::vector< T > *_value, const MiscCommon::BYTEVector_t *_data, size_t *_nPos)
Definition: BasicCmd.h:225
void convertToData(MiscCommon::BYTEVector_t *_data) const
Definition: BasicCmd.h:494
size_t dsize< uint64_t >(const uint64_t &_value)
Helper function calculating size of uint64_t.
Definition: BasicCmd.h:61
void readData< uint64_t >(uint64_t *_value, const MiscCommon::BYTEVector_t *_data, size_t *_nPos)
Definition: BasicCmd.h:166
T normalizeWrite(T _value)
Definition: AgentConnectionManager.h:13
Definition: BasicCmd.h:447
void pushData< uint32_t >(const uint32_t &_value, MiscCommon::BYTEVector_t *_data)
Definition: BasicCmd.h:331
void pushData(const T &_value, MiscCommon::BYTEVector_t *_data)
void pushData< uint8_t >(const uint8_t &_value, MiscCommon::BYTEVector_t *_data)
Definition: BasicCmd.h:311
void readData< uint8_t >(uint8_t *_value, const MiscCommon::BYTEVector_t *_data, size_t *_nPos)
Definition: BasicCmd.h:125
const SAttachmentDataProvider & put(const T &_value) const
Definition: BasicCmd.h:469
void readData< uint32_t >(uint32_t *_value, const MiscCommon::BYTEVector_t *_data, size_t *_nPos)
Definition: BasicCmd.h:150
INet declares helpers for Socket and Network operations.
Definition: INet.h:40
std::vector< unsigned char > BYTEVector_t
An STL vector of bytes.
Definition: def.h:127
void readData< uint16_t >(uint16_t *_value, const MiscCommon::BYTEVector_t *_data, size_t *_nPos)
Definition: BasicCmd.h:136
SAttachmentDataProvider(MiscCommon::BYTEVector_t *_data)
Definition: BasicCmd.h:449
SAttachmentDataProvider(const MiscCommon::BYTEVector_t &_data)
Definition: BasicCmd.h:455
Miscellaneous functions and helpers are located here.
Definition: BOOST_FILESYSTEM.h:21