From 39ee4f034316ec6e7589b6c30aa8a010fdc00e61 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Mon, 11 Jul 2016 23:36:41 +0200 Subject: [PATCH] [DEV] separate buffer class ==> done --- lutin_zeus.py | 2 + zeus/AbstractFunction.h | 1 + zeus/Buffer.cpp | 367 +------------------------- zeus/Buffer.h | 283 +------------------- zeus/BufferAnswer.cpp | 86 ++++++ zeus/BufferAnswer.h | 80 ++++++ zeus/BufferCall.cpp | 69 +++++ zeus/BufferCall.h | 52 ++++ zeus/BufferData.cpp | 67 +++++ zeus/BufferData.h | 75 ++++++ zeus/BufferEvent.cpp | 22 ++ zeus/BufferEvent.h | 40 +++ zeus/BufferFlow.cpp | 22 ++ zeus/BufferFlow.h | 38 +++ zeus/BufferParameter.cpp | 175 ++++++++++++ zeus/BufferParameter.h | 79 ++++++ zeus/BufferParameter_addParameter.cpp | 1 + zeus/Future.cpp | 1 + zeus/FutureBase.cpp | 1 + zeus/WebServer.cpp | 1 + zeus/WebServer.h | 1 + 21 files changed, 820 insertions(+), 643 deletions(-) diff --git a/lutin_zeus.py b/lutin_zeus.py index f5da1e1..09df52b 100644 --- a/lutin_zeus.py +++ b/lutin_zeus.py @@ -40,6 +40,7 @@ def create(target, module_name): 'zeus/BufferParameter.cpp', 'zeus/BufferCall.cpp', 'zeus/BufferAnswer.cpp', + 'zeus/BufferData.cpp', 'zeus/BufferEvent.cpp', 'zeus/BufferFlow.cpp', 'zeus/BufferParameter_addParameter.cpp', @@ -64,6 +65,7 @@ def create(target, module_name): 'zeus/BufferParameter.h', 'zeus/BufferCall.h', 'zeus/BufferAnswer.h', + 'zeus/BufferData.h', 'zeus/BufferEvent.h', 'zeus/BufferFlow.h', 'zeus/ParamType.h', diff --git a/zeus/AbstractFunction.h b/zeus/AbstractFunction.h index e0f02b1..71b188a 100644 --- a/zeus/AbstractFunction.h +++ b/zeus/AbstractFunction.h @@ -8,6 +8,7 @@ #include #include #include +#include #include diff --git a/zeus/Buffer.cpp b/zeus/Buffer.cpp index f397104..017e399 100644 --- a/zeus/Buffer.cpp +++ b/zeus/Buffer.cpp @@ -10,6 +10,11 @@ #include #include #include +#include +#include +#include +#include +#include namespace etk { template<> std::string to_string(const enum zeus::Buffer::typeMessage& _value) { @@ -127,41 +132,6 @@ void zeus::Buffer::generateDisplay(std::ostream& _os) const { } } -void zeus::BufferCall::generateDisplay(std::ostream& _os) const { - zeus::Buffer::generateDisplay(_os); - _os << " '" + m_callName + "'"; - _os << " nbParam=" + etk::to_string(getNumberParameter()); - if (getNumberParameter() != 0) { - _os << " paramType("; - for (int32_t iii=0; iii missing parameter count"); - return; - } - uint32_t offset = 0; - memcpy(&nbParameters, &_buffer[offset], sizeof(uint16_t)); - offset += sizeof(uint16_t); - m_parameter.resize(nbParameters, std::make_pair(-1, std::vector())); - // Load all Parameters - nbParameters = 0; - while ( nbParameters < m_parameter.size() - && offset < _lenght) { - // parameters is contituated with size + data assiciated - uint32_t sizeParam; - memcpy(&sizeParam, &_buffer[offset], sizeof(uint32_t)); - offset += sizeof(uint32_t); - if (offset+sizeParam > _lenght) { - ZEUS_ERROR("Wrong parameter size : " << sizeParam << " / availlable=" << _lenght-offset); - return; - } - std::vector data; - data.resize(sizeParam); - memcpy(&data[0], &_buffer[offset], data.size() * sizeof(uint8_t)); - offset += data.size() * sizeof(uint8_t); - m_parameter[nbParameters].second = data; - nbParameters++; - } -} - -zeus::ParamType zeus::BufferParameter::getParameterType(int32_t _id) const { - if (m_parameter.size() <= _id) { - ZEUS_ERROR("out of range Id for parameter ... " << _id << " have " << m_parameter.size()); - return createType(); - } - if (m_parameter[_id].second.size() < 2) { - ZEUS_ERROR("try to get type with no ID value Type (not enouth data)"); - return createType(); - } - uint16_t typeId = (uint16_t(m_parameter[_id].second[0]) << 8) + uint16_t(m_parameter[_id].second[1]); - if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } - if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } - if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } - if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } - if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } - if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } - if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } - if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } - if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } - if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } - if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } - if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } - if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } - if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } - if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } - if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } - if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } - if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } - if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } - if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } - if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } - if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } - if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } - if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } - if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } - if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } - if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } - if (typeId == paramTypeRaw) { - m_parameter[_id].first = sizeof(uint16_t); - return zeus::ParamType("raw", paramTypeRaw); - } - if (typeId == paramTypeObject) { - std::string type = reinterpret_cast(&m_parameter[_id].second[2]); - m_parameter[_id].first = type.size() + sizeof(uint16_t); - // TODO : Check error of \0 ==> limit at 256 char ... - return zeus::ParamType(type, paramTypeObject); - } - ZEUS_ERROR("Can not get type of parameter ... "); - return createType(); -} - -const uint8_t* zeus::BufferParameter::getParameterPointer(int32_t _id) const { - const uint8_t* out = nullptr; - if (m_parameter.size() <= _id) { - ZEUS_ERROR("out of range Id for parameter ... " << _id << " have " << m_parameter.size()); - return out; - } - if (m_parameter[_id].first <= -1) { - getParameterType(_id); // this function initialize this parameter if needed ... - } - out = reinterpret_cast(&m_parameter[_id].second[m_parameter[_id].first]); - return out; -} - -uint32_t zeus::BufferParameter::getParameterSize(int32_t _id) const { - int32_t out = 0; - if (m_parameter.size() <= _id) { - ZEUS_ERROR("out of range Id for parameter ... " << _id << " have " << m_parameter.size()); - return 0; - } - if (m_parameter[_id].first <= -1) { - getParameterType(_id); // this function initialize this parameter if needed ... - } - return m_parameter[_id].second.size() - m_parameter[_id].first; -} - -uint16_t zeus::BufferParameter::getNumberParameter() const { - return m_parameter.size(); -} - -std::string zeus::BufferParameter::simpleStringParam(uint32_t _id) const { - zeus::ParamType paramType = getParameterType(_id); - if (paramType.isVector() == false) { - if (paramType.isNumber() == true) { - return etk::to_string(getParameter(_id)); - } - } - if (paramType == createType()) { - return etk::to_string(getParameter(_id)); - } - if (paramType == createType()) { - return "{" + getParameter(_id) + "}"; - } - if (paramType == createType>()) { - return "[" + etk::to_string(getParameter>(_id)) + "]"; - } - return paramType.getName(); -} - -void zeus::BufferParameter::parameterAppendBufferData(const ememory::SharedPtr& _obj) { - // At this point we just add data at the parameter value: - uint16_t parameterID = _obj->getParameterId(); - - if (_obj->getData().size() == 0) { - // no data (normal case) - return; - } - // now, we will add datas: - if (parameterID >= m_parameter.size()) { - ZEUS_ERROR("Try to add data on an unexisting parameter..."); - return; - } - int32_t offset = m_parameter[parameterID].second.size(); - m_parameter[parameterID].second.resize(offset + _obj->getData().size()); - memcpy(&m_parameter[parameterID].second[offset], &_obj->getData()[0], _obj->getData().size()); -} - -// ------------------------------------------------------------------------------------ -// -- Call -// ------------------------------------------------------------------------------------ - -const std::string& zeus::BufferCall::getCall() const { - return m_callName; -} - -void zeus::BufferCall::setCall(const std::string& _value) { - m_callName = _value; -} - -bool zeus::BufferCall::writeOn(enet::WebSocket& _interface) { - zeus::Buffer::writeOn(_interface); - _interface.writeData((uint8_t*)m_callName.c_str(), m_callName.size() + 1); - return BufferParameter::writeOn(_interface); -} - -void zeus::BufferCall::composeWith(const uint8_t* _buffer, uint32_t _lenght) { - // First element iw the call name, after, this is the parameters... - // parse the string: (call name) - uint32_t pos = 0; - m_callName.clear(); - while( pos < _lenght - && (char)_buffer[pos] != '\0') { - m_callName += _buffer[pos]; - pos++; - } - pos++; - // parse parameters: - BufferParameter::composeWith(&_buffer[pos], _lenght-pos); -} - -void zeus::BufferCall::appendBufferData(const ememory::SharedPtr& _obj) { - parameterAppendBufferData(_obj); -} - -// ------------------------------------------------------------------------------------ -// -- Answer -// ------------------------------------------------------------------------------------ - -bool zeus::BufferAnswer::hasError() { - return m_errorType.size() != 0; -} - -const std::string& zeus::BufferAnswer::getError() { - return m_errorType; -} - -const std::string& zeus::BufferAnswer::getErrorHelp() { - return m_errorHelp; -} - -void zeus::BufferAnswer::addError(const std::string& _value, const std::string& _comment) { - m_errorType = _value; - m_errorHelp = _comment; -} - -bool zeus::BufferAnswer::writeOn(enet::WebSocket& _interface) { - zeus::Buffer::writeOn(_interface); - _interface.writeData((uint8_t*)m_errorType.c_str(), m_errorType.size() + 1); - if (m_errorType.size() != 0) { - _interface.writeData((uint8_t*)m_errorHelp.c_str(), m_errorHelp.size() + 1); - } - return BufferParameter::writeOn(_interface); -} - -void zeus::BufferAnswer::composeWith(const uint8_t* _buffer, uint32_t _lenght) { - // First element iw the call name, after, this is the parameters... - // parse the string: (call name) - uint32_t pos = 0; - m_errorType.clear(); - m_errorHelp.clear(); - while( pos < _lenght - && _buffer[pos] != '\0') { - m_errorType += _buffer[pos]; - pos++; - } - pos++; - if (m_errorType.size() != 0) { - while( pos < _lenght - && _buffer[pos] != '\0') { - m_errorHelp += _buffer[pos]; - pos++; - } - pos++; - } - // parse parameters: - BufferParameter::composeWith(&_buffer[pos], _lenght-pos); -} - -void zeus::BufferAnswer::appendBufferData(const ememory::SharedPtr& _obj) { - parameterAppendBufferData(_obj); -} - -// ------------------------------------------------------------------------------------ -// -- Data -// ------------------------------------------------------------------------------------ - -void zeus::BufferData::addData(uint16_t _parameterId, void* _data, uint32_t _size) { - m_parameterId = _parameterId; - m_data.resize(_size); - memcpy(&m_data[0], _data, _size); -} - -// note limited 15 bits -uint32_t zeus::BufferData::getPartId() const { - return m_partId; -} - -void zeus::BufferData::setPartId(uint32_t _value) { - if (_value == 0) { - ZEUS_ERROR("Part ID must be != of 0"); - return; - } - m_partId = _value; -} - -bool zeus::BufferData::writeOn(enet::WebSocket& _interface) { - zeus::Buffer::writeOn(_interface); - _interface.writeData((uint8_t*)&m_partId, sizeof(uint32_t)); - _interface.writeData((uint8_t*)&m_parameterId, sizeof(uint16_t)); - _interface.writeData((uint8_t*)&m_data[0], m_data.size()); - return true; -} - -void zeus::BufferData::composeWith(const uint8_t* _buffer, uint32_t _lenght) { - // First element iw the call name, after, this is the parameters... - // parse the string: (call name) - uint32_t pos = 0; - m_partId = 0; - m_parameterId = 0; - memcpy(reinterpret_cast(&m_partId), &_buffer[pos], sizeof(uint32_t)); - pos += sizeof(uint32_t); - memcpy(reinterpret_cast(&m_parameterId), &_buffer[pos], sizeof(uint16_t)); - pos += sizeof(uint16_t); - m_data.resize(_lenght - pos); - memcpy(&m_data[0], &_buffer[pos], m_data.size()); -} - // ------------------------------------------------------------------------------------ // -- Factory // ------------------------------------------------------------------------------------ @@ -564,24 +228,3 @@ ememory::SharedPtr zeus::Buffer::create(const std::vector return nullptr; } -ememory::SharedPtr zeus::BufferCall::create() { - return ememory::SharedPtr(new zeus::BufferCall); -} - -ememory::SharedPtr zeus::BufferAnswer::create() { - return ememory::SharedPtr(new zeus::BufferAnswer); -} - -ememory::SharedPtr zeus::BufferData::create() { - return ememory::SharedPtr(new zeus::BufferData); -} -/* -ememory::SharedPtr zeus::BufferEvent::create() { - return ememory::SharedPtr(new zeus::BufferEvent); -} - -ememory::SharedPtr zeus::BufferFlow::create() { - return ememory::SharedPtr(new zeus::BufferFlow); -} -*/ - diff --git a/zeus/Buffer.h b/zeus/Buffer.h index 557478a..c4ab6c1 100644 --- a/zeus/Buffer.h +++ b/zeus/Buffer.h @@ -36,7 +36,8 @@ namespace zeus { uint32_t clientID; // same as sevice ID uint8_t flags; // List of flags & type message: // - 0-2: Type of the message - // - 3-6: Reserved + // - 3-5: Reserved + // - 6: message data is zipped // - 7: message finished }; #pragma pack(pop) @@ -233,286 +234,6 @@ namespace zeus { virtual bool writeOn(enet::WebSocket& _interface); virtual void generateDisplay(std::ostream& _os) const ; }; - class BufferParameter: - public Buffer { - protected: - mutable std::vector>> m_parameter; //!< list of the parameter (offset of start data and buffer of data (subprotocol...) - public: - /** - * @brief Template to get a parameter with a specific type - * @param[in] _id Number of the parameter - * @return Converted type of the parameter (or empty value) - */ - template - ZEUS_TYPE_DATA getParameter(int32_t _id) const; - /** - * @brief Get the type of a parameter. - * @param[in] _id Number of the parameter - * @return type of the parameter - */ - zeus::ParamType getParameterType(int32_t _id) const; - /** - * @brief Get the start pointer of the parameter - * @param[in] _id Number of the parameter - * @return pointer of the parameter or nullptr - */ - const uint8_t* getParameterPointer(int32_t _id) const; - /** - * @brief Get the size of the parameter availlable in the parameter pointer - * @param[in] _id Number of the parameter - * @return size of the parameter buffer - */ - uint32_t getParameterSize(int32_t _id) const; - /** - * @brief Get the number of parameter availlable - * @return number of parameter - */ - uint16_t getNumberParameter() const; - /** - * @brief Add an empty vector with no type - */ - void addParameterEmptyVector(); - /** - * @brief Add parameter (or not.. this is the end of an auto resursive add parameter) - */ - void addParameter(); - /** - * @brief Convert the parameter in a simple human readable string - * @param[in] _id Number of the parameter - * @return readable string - */ - std::string simpleStringParam(uint32_t _id) const; - void composeWith(const uint8_t* _buffer, uint32_t _lenght) override; - bool writeOn(enet::WebSocket& _interface) override; - protected: - /** - * @brief Add a parameter at a specific position - * @param[in] _paramId Id of the parameter (needed for the multiple packet sending) - * @param[in] _value Value to add in parameter - */ - template - void addParameter(uint16_t _paramId, const ZEUS_TYPE_DATA& _value); - public: - template - void addParameter(const ZEUS_TYPE_DATA& _value) { - addParameter(m_parameter.size(), _value); - } - void parameterAppendBufferData(const ememory::SharedPtr& _obj); - }; - class BufferCall : - public BufferParameter { - friend class zeus::Buffer; - protected: - std::string m_callName; - protected: - /** - * @brief basic constructor (hidden to force the use of ememory::SharedPtr) @ref zeus::BufferCall::create - */ - BufferCall() { - m_header.flags = ZEUS_BUFFER_FLAG_FINISH + uint8_t(zeus::Buffer::typeMessage::call); - }; - void composeWith(const uint8_t* _buffer, uint32_t _lenght) override; - void appendBufferData(const ememory::SharedPtr& _obj) override; - bool writeOn(enet::WebSocket& _interface) override; - void generateDisplay(std::ostream& _os) const override; - public: - /** - * @brief Create a shared pointer on the BufferCall - * @return Allocated Buffer. - */ - static ememory::SharedPtr create(); - public: - enum zeus::Buffer::typeMessage getType() const override { - return zeus::Buffer::typeMessage::call; - } - /** - * @brief get the call value of the buffer - * @return string of the function to call - */ - const std::string& getCall() const; - /** - * @brief Set the call value of the buffer - * @param[in] _value Function to call - */ - void setCall(const std::string& _value); - - }; - class BufferAnswer : - public BufferParameter { - friend class zeus::Buffer; - protected: - std::string m_errorType; - std::string m_errorHelp; - protected: - /** - * @brief basic constructor (hidden to force the use of ememory::SharedPtr) @ref zeus::BufferAnswer::create - */ - BufferAnswer() { - m_header.flags = ZEUS_BUFFER_FLAG_FINISH + uint8_t(zeus::Buffer::typeMessage::answer); - }; - void composeWith(const uint8_t* _buffer, uint32_t _lenght) override; - void appendBufferData(const ememory::SharedPtr& _obj) override; - bool writeOn(enet::WebSocket& _interface) override; - void generateDisplay(std::ostream& _os) const override; - public: - /** - * @brief Create a shared pointer on the BufferAnswer - * @return Allocated Buffer. - */ - static ememory::SharedPtr create(); - public: - enum zeus::Buffer::typeMessage getType() const override { - return zeus::Buffer::typeMessage::answer; - } - /** - * @brief set the answer of the call - * @param[in] _value Value to add - */ - template - void addAnswer(const ZEUS_TYPE_DATA& _value) { - addParameter(_value); - } - /** - * @brief get the answer value - * @param[in] Data of the answer - */ - // TODO : Do it better check error ... ==> can be good ... - template - ZEUS_TYPE_DATA getAnswer() const { - return getParameter(0); - } - /** - * @brief Ann an error on the message answer - * @param[in] _value error value (simple string with no space with all capital letter separaete with '_' - * @param[in] _comment Human readable help to understand the error - */ - void addError(const std::string& _value, const std::string& _comment); - /** - * @brief Check if the answer have an error - * @return status of the error. - */ - bool hasError(); - /** - * @brief get the error value (if exist) - * @return string of the error - */ - const std::string& getError(); - /** - * @brief get the error help (if exist) - * @return string of the error help - */ - const std::string& getErrorHelp(); - }; - class BufferData: - public Buffer { - friend class zeus::Buffer; - protected: - uint32_t m_partId; - uint16_t m_parameterId; - std::vector m_data; - protected: - /** - * @brief basic constructor (hidden to force the use of ememory::SharedPtr) @ref zeus::BufferData::create - */ - BufferData(): - m_partId(0) { - m_header.flags = ZEUS_BUFFER_FLAG_FINISH + uint8_t(zeus::Buffer::typeMessage::data); - }; - void composeWith(const uint8_t* _buffer, uint32_t _lenght) override; - // TODO :... void appendBufferData(const ememory::SharedPtr& _obj) override; - bool writeOn(enet::WebSocket& _interface) override; - void generateDisplay(std::ostream& _os) const override; - public: - /** - * @brief Create a shared pointer on the BufferData - * @return Allocated Buffer. - */ - static ememory::SharedPtr create(); - public: - enum zeus::Buffer::typeMessage getType() const override { - return zeus::Buffer::typeMessage::data; - } - /** - * @brief Get the parameter Id of the buffer - * @return Part Identifier - */ - uint16_t getParameterId() const { - return m_parameterId; - } - /** - * @brief Get the part Id of the buffer - * @return Part Identifier - */ - uint32_t getPartId() const; - /** - * @brief Set the part Id of the buffer - * @param[in] _value New Part ID - */ - void setPartId(uint32_t _value); - /** - * @brief add a raw data on the buffer - * @param[in] _parameterId Parameter id of the destination of the data - * @param[in] _data Pointer on the data - * @param[in] _size size of the data to add - */ - void addData(uint16_t _parameterId, void* _data, uint32_t _size); - /** - * @brief Get data reference - */ - const std::vector& getData() const { - return m_data; - } - - }; - /* - class BufferEvent : - public BufferParameter { - friend class zeus::Buffer; - protected: - / ** - * @brief basic constructor (hidden to force the use of ememory::SharedPtr) @ref zeus::BufferEvent::create - * / - BufferEvent() { - m_header.flags = ZEUS_BUFFER_FLAG_FINISH + uint8_t(zeus::Buffer::typeMessage::event); - }; - void composeWith(const uint8_t* _buffer, uint32_t _lenght) override; - void appendBufferData(const ememory::SharedPtr& _obj) override; - public: - / ** - * @brief Create a shared pointer on the BufferEvent - * @return Allocated Buffer. - * / - static ememory::SharedPtr create(); - public: - enum zeus::Buffer::typeMessage getType() const override { - return zeus::Buffer::typeMessage::event; - } - - }; - class BufferFlow: - public Buffer { - friend class zeus::Buffer; - protected: - / ** - * @brief basic constructor (hidden to force the use of ememory::SharedPtr) @ref zeus::BufferFlow::create - * / - BufferFlow() { - m_header.flags = ZEUS_BUFFER_FLAG_FINISH + uint8_t(zeus::Buffer::typeMessage::flow); - }; - void composeWith(const uint8_t* _buffer, uint32_t _lenght) override; - public: - / ** - * @brief Create a shared pointer on the BufferFlow - * @return Allocated Buffer. - * / - static ememory::SharedPtr create(); - public: - enum zeus::Buffer::typeMessage getType() const override { - return zeus::Buffer::typeMessage::flow; - } - - }; - */ /** * @brief generate a display of the typemessage * @param[in] _os stream to add data diff --git a/zeus/BufferAnswer.cpp b/zeus/BufferAnswer.cpp index e69de29..04ae23f 100644 --- a/zeus/BufferAnswer.cpp +++ b/zeus/BufferAnswer.cpp @@ -0,0 +1,86 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2016, Edouard DUPIN, all right reserved + * @license APACHE v2.0 (see license file) + */ +#include +#include +#include +#include +#include +#include + +void zeus::BufferAnswer::generateDisplay(std::ostream& _os) const { + zeus::Buffer::generateDisplay(_os); + if (getNumberParameter() != 0) { + _os << " '" + simpleStringParam(0) + "'"; + } + if (m_errorType.size() != 0) { + _os << " Error='" + m_errorType + "'"; + }if (m_errorHelp.size() != 0) { + _os << " Help='" + m_errorHelp + "'"; + } +} + +bool zeus::BufferAnswer::hasError() { + return m_errorType.size() != 0; +} + +const std::string& zeus::BufferAnswer::getError() { + return m_errorType; +} + +const std::string& zeus::BufferAnswer::getErrorHelp() { + return m_errorHelp; +} + +void zeus::BufferAnswer::addError(const std::string& _value, const std::string& _comment) { + m_errorType = _value; + m_errorHelp = _comment; +} + +bool zeus::BufferAnswer::writeOn(enet::WebSocket& _interface) { + zeus::Buffer::writeOn(_interface); + _interface.writeData((uint8_t*)m_errorType.c_str(), m_errorType.size() + 1); + if (m_errorType.size() != 0) { + _interface.writeData((uint8_t*)m_errorHelp.c_str(), m_errorHelp.size() + 1); + } + return BufferParameter::writeOn(_interface); +} + +void zeus::BufferAnswer::composeWith(const uint8_t* _buffer, uint32_t _lenght) { + // First element iw the call name, after, this is the parameters... + // parse the string: (call name) + uint32_t pos = 0; + m_errorType.clear(); + m_errorHelp.clear(); + while( pos < _lenght + && _buffer[pos] != '\0') { + m_errorType += _buffer[pos]; + pos++; + } + pos++; + if (m_errorType.size() != 0) { + while( pos < _lenght + && _buffer[pos] != '\0') { + m_errorHelp += _buffer[pos]; + pos++; + } + pos++; + } + // parse parameters: + BufferParameter::composeWith(&_buffer[pos], _lenght-pos); +} + +void zeus::BufferAnswer::appendBufferData(const ememory::SharedPtr& _obj) { + parameterAppendBufferData(_obj); +} + +// ------------------------------------------------------------------------------------ +// -- Factory +// ------------------------------------------------------------------------------------ + +ememory::SharedPtr zeus::BufferAnswer::create() { + return ememory::SharedPtr(new zeus::BufferAnswer); +} + diff --git a/zeus/BufferAnswer.h b/zeus/BufferAnswer.h index e69de29..1321661 100644 --- a/zeus/BufferAnswer.h +++ b/zeus/BufferAnswer.h @@ -0,0 +1,80 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2016, Edouard DUPIN, all right reserved + * @license APACHE v2.0 (see license file) + */ +#pragma once +#include +#include +#include +#include + +namespace zeus { + + class BufferAnswer : + public BufferParameter { + friend class zeus::Buffer; + protected: + std::string m_errorType; + std::string m_errorHelp; + protected: + /** + * @brief basic constructor (hidden to force the use of ememory::SharedPtr) @ref zeus::BufferAnswer::create + */ + BufferAnswer() { + m_header.flags = ZEUS_BUFFER_FLAG_FINISH + uint8_t(zeus::Buffer::typeMessage::answer); + }; + void composeWith(const uint8_t* _buffer, uint32_t _lenght) override; + void appendBufferData(const ememory::SharedPtr& _obj) override; + bool writeOn(enet::WebSocket& _interface) override; + void generateDisplay(std::ostream& _os) const override; + public: + /** + * @brief Create a shared pointer on the BufferAnswer + * @return Allocated Buffer. + */ + static ememory::SharedPtr create(); + public: + enum zeus::Buffer::typeMessage getType() const override { + return zeus::Buffer::typeMessage::answer; + } + /** + * @brief set the answer of the call + * @param[in] _value Value to add + */ + template + void addAnswer(const ZEUS_TYPE_DATA& _value) { + addParameter(_value); + } + /** + * @brief get the answer value + * @param[in] Data of the answer + */ + // TODO : Do it better check error ... ==> can be good ... + template + ZEUS_TYPE_DATA getAnswer() const { + return getParameter(0); + } + /** + * @brief Ann an error on the message answer + * @param[in] _value error value (simple string with no space with all capital letter separaete with '_' + * @param[in] _comment Human readable help to understand the error + */ + void addError(const std::string& _value, const std::string& _comment); + /** + * @brief Check if the answer have an error + * @return status of the error. + */ + bool hasError(); + /** + * @brief get the error value (if exist) + * @return string of the error + */ + const std::string& getError(); + /** + * @brief get the error help (if exist) + * @return string of the error help + */ + const std::string& getErrorHelp(); + }; +} diff --git a/zeus/BufferCall.cpp b/zeus/BufferCall.cpp index e69de29..5f07286 100644 --- a/zeus/BufferCall.cpp +++ b/zeus/BufferCall.cpp @@ -0,0 +1,69 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2016, Edouard DUPIN, all right reserved + * @license APACHE v2.0 (see license file) + */ +#include +#include +#include +#include +#include +#include + +void zeus::BufferCall::generateDisplay(std::ostream& _os) const { + zeus::Buffer::generateDisplay(_os); + _os << " '" + m_callName + "'"; + _os << " nbParam=" + etk::to_string(getNumberParameter()); + if (getNumberParameter() != 0) { + _os << " paramType("; + for (int32_t iii=0; iii& _obj) { + parameterAppendBufferData(_obj); +} + +// ------------------------------------------------------------------------------------ +// -- Factory +// ------------------------------------------------------------------------------------ + + +ememory::SharedPtr zeus::BufferCall::create() { + return ememory::SharedPtr(new zeus::BufferCall); +} diff --git a/zeus/BufferCall.h b/zeus/BufferCall.h index e69de29..4cf1966 100644 --- a/zeus/BufferCall.h +++ b/zeus/BufferCall.h @@ -0,0 +1,52 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2016, Edouard DUPIN, all right reserved + * @license APACHE v2.0 (see license file) + */ +#pragma once +#include +#include +#include +#include + +namespace zeus { + + class BufferCall : + public BufferParameter { + friend class zeus::Buffer; + protected: + std::string m_callName; + protected: + /** + * @brief basic constructor (hidden to force the use of ememory::SharedPtr) @ref zeus::BufferCall::create + */ + BufferCall() { + m_header.flags = ZEUS_BUFFER_FLAG_FINISH + uint8_t(zeus::Buffer::typeMessage::call); + }; + void composeWith(const uint8_t* _buffer, uint32_t _lenght) override; + void appendBufferData(const ememory::SharedPtr& _obj) override; + bool writeOn(enet::WebSocket& _interface) override; + void generateDisplay(std::ostream& _os) const override; + public: + /** + * @brief Create a shared pointer on the BufferCall + * @return Allocated Buffer. + */ + static ememory::SharedPtr create(); + public: + enum zeus::Buffer::typeMessage getType() const override { + return zeus::Buffer::typeMessage::call; + } + /** + * @brief get the call value of the buffer + * @return string of the function to call + */ + const std::string& getCall() const; + /** + * @brief Set the call value of the buffer + * @param[in] _value Function to call + */ + void setCall(const std::string& _value); + + }; +} diff --git a/zeus/BufferData.cpp b/zeus/BufferData.cpp index e69de29..c0afa44 100644 --- a/zeus/BufferData.cpp +++ b/zeus/BufferData.cpp @@ -0,0 +1,67 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2016, Edouard DUPIN, all right reserved + * @license APACHE v2.0 (see license file) + */ +#include +#include +#include +#include +#include +#include + +void zeus::BufferData::generateDisplay(std::ostream& _os) const { + zeus::Buffer::generateDisplay(_os); + _os << " paramId=" << etk::to_string(m_parameterId); + _os << " part=" << etk::to_string(m_partId); + _os << " nbData=" << etk::to_string(m_data.size()); +} + +void zeus::BufferData::addData(uint16_t _parameterId, void* _data, uint32_t _size) { + m_parameterId = _parameterId; + m_data.resize(_size); + memcpy(&m_data[0], _data, _size); +} + +// note limited 15 bits +uint32_t zeus::BufferData::getPartId() const { + return m_partId; +} + +void zeus::BufferData::setPartId(uint32_t _value) { + if (_value == 0) { + ZEUS_ERROR("Part ID must be != of 0"); + return; + } + m_partId = _value; +} + +bool zeus::BufferData::writeOn(enet::WebSocket& _interface) { + zeus::Buffer::writeOn(_interface); + _interface.writeData((uint8_t*)&m_partId, sizeof(uint32_t)); + _interface.writeData((uint8_t*)&m_parameterId, sizeof(uint16_t)); + _interface.writeData((uint8_t*)&m_data[0], m_data.size()); + return true; +} + +void zeus::BufferData::composeWith(const uint8_t* _buffer, uint32_t _lenght) { + // First element iw the call name, after, this is the parameters... + // parse the string: (call name) + uint32_t pos = 0; + m_partId = 0; + m_parameterId = 0; + memcpy(reinterpret_cast(&m_partId), &_buffer[pos], sizeof(uint32_t)); + pos += sizeof(uint32_t); + memcpy(reinterpret_cast(&m_parameterId), &_buffer[pos], sizeof(uint16_t)); + pos += sizeof(uint16_t); + m_data.resize(_lenght - pos); + memcpy(&m_data[0], &_buffer[pos], m_data.size()); +} + +// ------------------------------------------------------------------------------------ +// -- Factory +// ------------------------------------------------------------------------------------ + +ememory::SharedPtr zeus::BufferData::create() { + return ememory::SharedPtr(new zeus::BufferData); +} diff --git a/zeus/BufferData.h b/zeus/BufferData.h index e69de29..3f1077d 100644 --- a/zeus/BufferData.h +++ b/zeus/BufferData.h @@ -0,0 +1,75 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2016, Edouard DUPIN, all right reserved + * @license APACHE v2.0 (see license file) + */ +#pragma once +#include +#include +#include +#include + +namespace zeus { + + class BufferData: + public Buffer { + friend class zeus::Buffer; + protected: + uint32_t m_partId; + uint16_t m_parameterId; + std::vector m_data; + protected: + /** + * @brief basic constructor (hidden to force the use of ememory::SharedPtr) @ref zeus::BufferData::create + */ + BufferData(): + m_partId(0) { + m_header.flags = ZEUS_BUFFER_FLAG_FINISH + uint8_t(zeus::Buffer::typeMessage::data); + }; + void composeWith(const uint8_t* _buffer, uint32_t _lenght) override; + // TODO :... void appendBufferData(const ememory::SharedPtr& _obj) override; + bool writeOn(enet::WebSocket& _interface) override; + void generateDisplay(std::ostream& _os) const override; + public: + /** + * @brief Create a shared pointer on the BufferData + * @return Allocated Buffer. + */ + static ememory::SharedPtr create(); + public: + enum zeus::Buffer::typeMessage getType() const override { + return zeus::Buffer::typeMessage::data; + } + /** + * @brief Get the parameter Id of the buffer + * @return Part Identifier + */ + uint16_t getParameterId() const { + return m_parameterId; + } + /** + * @brief Get the part Id of the buffer + * @return Part Identifier + */ + uint32_t getPartId() const; + /** + * @brief Set the part Id of the buffer + * @param[in] _value New Part ID + */ + void setPartId(uint32_t _value); + /** + * @brief add a raw data on the buffer + * @param[in] _parameterId Parameter id of the destination of the data + * @param[in] _data Pointer on the data + * @param[in] _size size of the data to add + */ + void addData(uint16_t _parameterId, void* _data, uint32_t _size); + /** + * @brief Get data reference + */ + const std::vector& getData() const { + return m_data; + } + + }; +} diff --git a/zeus/BufferEvent.cpp b/zeus/BufferEvent.cpp index e69de29..bbfcaf2 100644 --- a/zeus/BufferEvent.cpp +++ b/zeus/BufferEvent.cpp @@ -0,0 +1,22 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2016, Edouard DUPIN, all right reserved + * @license APACHE v2.0 (see license file) + */ +#include +#include +#include +#include +#include +#include + +/* +// ------------------------------------------------------------------------------------ +// -- Factory +// ------------------------------------------------------------------------------------ + +ememory::SharedPtr zeus::BufferEvent::create() { + return ememory::SharedPtr(new zeus::BufferEvent); +} +*/ + diff --git a/zeus/BufferEvent.h b/zeus/BufferEvent.h index e69de29..7ba5278 100644 --- a/zeus/BufferEvent.h +++ b/zeus/BufferEvent.h @@ -0,0 +1,40 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2016, Edouard DUPIN, all right reserved + * @license APACHE v2.0 (see license file) + */ +#pragma once +#include +#include +#include + +namespace zeus { + + /* + class BufferEvent : + public BufferParameter { + friend class zeus::Buffer; + protected: + / ** + * @brief basic constructor (hidden to force the use of ememory::SharedPtr) @ref zeus::BufferEvent::create + * / + BufferEvent() { + m_header.flags = ZEUS_BUFFER_FLAG_FINISH + uint8_t(zeus::Buffer::typeMessage::event); + }; + void composeWith(const uint8_t* _buffer, uint32_t _lenght) override; + void appendBufferData(const ememory::SharedPtr& _obj) override; + public: + / ** + * @brief Create a shared pointer on the BufferEvent + * @return Allocated Buffer. + * / + static ememory::SharedPtr create(); + public: + enum zeus::Buffer::typeMessage getType() const override { + return zeus::Buffer::typeMessage::event; + } + + }; + */ +} + diff --git a/zeus/BufferFlow.cpp b/zeus/BufferFlow.cpp index e69de29..4257037 100644 --- a/zeus/BufferFlow.cpp +++ b/zeus/BufferFlow.cpp @@ -0,0 +1,22 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2016, Edouard DUPIN, all right reserved + * @license APACHE v2.0 (see license file) + */ +#include +#include +#include +#include +#include +#include + +/* +// ------------------------------------------------------------------------------------ +// -- Factory +// ------------------------------------------------------------------------------------ + +ememory::SharedPtr zeus::BufferFlow::create() { + return ememory::SharedPtr(new zeus::BufferFlow); +} +*/ + diff --git a/zeus/BufferFlow.h b/zeus/BufferFlow.h index e69de29..3a156fc 100644 --- a/zeus/BufferFlow.h +++ b/zeus/BufferFlow.h @@ -0,0 +1,38 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2016, Edouard DUPIN, all right reserved + * @license APACHE v2.0 (see license file) + */ +#pragma once +#include +#include +#include + +namespace zeus { + + /* + class BufferFlow: + public Buffer { + friend class zeus::Buffer; + protected: + / ** + * @brief basic constructor (hidden to force the use of ememory::SharedPtr) @ref zeus::BufferFlow::create + * / + BufferFlow() { + m_header.flags = ZEUS_BUFFER_FLAG_FINISH + uint8_t(zeus::Buffer::typeMessage::flow); + }; + void composeWith(const uint8_t* _buffer, uint32_t _lenght) override; + public: + / ** + * @brief Create a shared pointer on the BufferFlow + * @return Allocated Buffer. + * / + static ememory::SharedPtr create(); + public: + enum zeus::Buffer::typeMessage getType() const override { + return zeus::Buffer::typeMessage::flow; + } + + }; + */ +} diff --git a/zeus/BufferParameter.cpp b/zeus/BufferParameter.cpp index e69de29..bcb31b7 100644 --- a/zeus/BufferParameter.cpp +++ b/zeus/BufferParameter.cpp @@ -0,0 +1,175 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2016, Edouard DUPIN, all right reserved + * @license APACHE v2.0 (see license file) + */ +#include +#include +#include +#include +#include +#include +#include +#include + +bool zeus::BufferParameter::writeOn(enet::WebSocket& _interface) { + uint8_t* data = nullptr; + uint32_t dataSize = 0; + uint16_t nbParameters = m_parameter.size(); + size_t size = _interface.writeData((uint8_t*)&nbParameters, sizeof(uint16_t)); + for (auto &it : m_parameter) { + uint32_t paramSize = it.second.size(); + size = _interface.writeData((uint8_t*)¶mSize, sizeof(uint32_t)); + size += _interface.writeData(&it.second[0], it.second.size() * sizeof(uint8_t)); + } + return true; +} + +void zeus::BufferParameter::composeWith(const uint8_t* _buffer, uint32_t _lenght) { + m_parameter.clear(); + uint16_t nbParameters = 0; + if (_lenght < sizeof(uint16_t)) { + ZEUS_ERROR("wrong size of the buffer ==> missing parameter count"); + return; + } + uint32_t offset = 0; + memcpy(&nbParameters, &_buffer[offset], sizeof(uint16_t)); + offset += sizeof(uint16_t); + m_parameter.resize(nbParameters, std::make_pair(-1, std::vector())); + // Load all Parameters + nbParameters = 0; + while ( nbParameters < m_parameter.size() + && offset < _lenght) { + // parameters is contituated with size + data assiciated + uint32_t sizeParam; + memcpy(&sizeParam, &_buffer[offset], sizeof(uint32_t)); + offset += sizeof(uint32_t); + if (offset+sizeParam > _lenght) { + ZEUS_ERROR("Wrong parameter size : " << sizeParam << " / availlable=" << _lenght-offset); + return; + } + std::vector data; + data.resize(sizeParam); + memcpy(&data[0], &_buffer[offset], data.size() * sizeof(uint8_t)); + offset += data.size() * sizeof(uint8_t); + m_parameter[nbParameters].second = data; + nbParameters++; + } +} + +zeus::ParamType zeus::BufferParameter::getParameterType(int32_t _id) const { + if (m_parameter.size() <= _id) { + ZEUS_ERROR("out of range Id for parameter ... " << _id << " have " << m_parameter.size()); + return createType(); + } + if (m_parameter[_id].second.size() < 2) { + ZEUS_ERROR("try to get type with no ID value Type (not enouth data)"); + return createType(); + } + uint16_t typeId = (uint16_t(m_parameter[_id].second[0]) << 8) + uint16_t(m_parameter[_id].second[1]); + if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } + if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } + if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } + if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } + if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } + if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } + if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } + if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } + if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } + if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } + if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } + if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } + if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } + if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } + if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } + if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } + if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } + if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } + if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } + if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } + if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } + if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } + if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } + if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } + if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } + if (typeId == createType>().getId()) { m_parameter[_id].first = 2; return createType>(); } + if (typeId == createType().getId()) { m_parameter[_id].first = 2; return createType(); } + if (typeId == paramTypeRaw) { + m_parameter[_id].first = sizeof(uint16_t); + return zeus::ParamType("raw", paramTypeRaw); + } + if (typeId == paramTypeObject) { + std::string type = reinterpret_cast(&m_parameter[_id].second[2]); + m_parameter[_id].first = type.size() + sizeof(uint16_t); + // TODO : Check error of \0 ==> limit at 256 char ... + return zeus::ParamType(type, paramTypeObject); + } + ZEUS_ERROR("Can not get type of parameter ... "); + return createType(); +} + +const uint8_t* zeus::BufferParameter::getParameterPointer(int32_t _id) const { + const uint8_t* out = nullptr; + if (m_parameter.size() <= _id) { + ZEUS_ERROR("out of range Id for parameter ... " << _id << " have " << m_parameter.size()); + return out; + } + if (m_parameter[_id].first <= -1) { + getParameterType(_id); // this function initialize this parameter if needed ... + } + out = reinterpret_cast(&m_parameter[_id].second[m_parameter[_id].first]); + return out; +} + +uint32_t zeus::BufferParameter::getParameterSize(int32_t _id) const { + int32_t out = 0; + if (m_parameter.size() <= _id) { + ZEUS_ERROR("out of range Id for parameter ... " << _id << " have " << m_parameter.size()); + return 0; + } + if (m_parameter[_id].first <= -1) { + getParameterType(_id); // this function initialize this parameter if needed ... + } + return m_parameter[_id].second.size() - m_parameter[_id].first; +} + +uint16_t zeus::BufferParameter::getNumberParameter() const { + return m_parameter.size(); +} + +std::string zeus::BufferParameter::simpleStringParam(uint32_t _id) const { + zeus::ParamType paramType = getParameterType(_id); + if (paramType.isVector() == false) { + if (paramType.isNumber() == true) { + return etk::to_string(getParameter(_id)); + } + } + if (paramType == createType()) { + return etk::to_string(getParameter(_id)); + } + if (paramType == createType()) { + return "{" + getParameter(_id) + "}"; + } + if (paramType == createType>()) { + return "[" + etk::to_string(getParameter>(_id)) + "]"; + } + return paramType.getName(); +} + +void zeus::BufferParameter::parameterAppendBufferData(const ememory::SharedPtr& _obj) { + // At this point we just add data at the parameter value: + uint16_t parameterID = _obj->getParameterId(); + + if (_obj->getData().size() == 0) { + // no data (normal case) + return; + } + // now, we will add datas: + if (parameterID >= m_parameter.size()) { + ZEUS_ERROR("Try to add data on an unexisting parameter..."); + return; + } + int32_t offset = m_parameter[parameterID].second.size(); + m_parameter[parameterID].second.resize(offset + _obj->getData().size()); + memcpy(&m_parameter[parameterID].second[offset], &_obj->getData()[0], _obj->getData().size()); +} diff --git a/zeus/BufferParameter.h b/zeus/BufferParameter.h index e69de29..0c0f3a5 100644 --- a/zeus/BufferParameter.h +++ b/zeus/BufferParameter.h @@ -0,0 +1,79 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2016, Edouard DUPIN, all right reserved + * @license APACHE v2.0 (see license file) + */ +#pragma once +#include +#include +#include + +namespace zeus { + + class BufferParameter: + public Buffer { + protected: + mutable std::vector>> m_parameter; //!< list of the parameter (offset of start data and buffer of data (subprotocol...) + public: + /** + * @brief Template to get a parameter with a specific type + * @param[in] _id Number of the parameter + * @return Converted type of the parameter (or empty value) + */ + template + ZEUS_TYPE_DATA getParameter(int32_t _id) const; + /** + * @brief Get the type of a parameter. + * @param[in] _id Number of the parameter + * @return type of the parameter + */ + zeus::ParamType getParameterType(int32_t _id) const; + /** + * @brief Get the start pointer of the parameter + * @param[in] _id Number of the parameter + * @return pointer of the parameter or nullptr + */ + const uint8_t* getParameterPointer(int32_t _id) const; + /** + * @brief Get the size of the parameter availlable in the parameter pointer + * @param[in] _id Number of the parameter + * @return size of the parameter buffer + */ + uint32_t getParameterSize(int32_t _id) const; + /** + * @brief Get the number of parameter availlable + * @return number of parameter + */ + uint16_t getNumberParameter() const; + /** + * @brief Add an empty vector with no type + */ + void addParameterEmptyVector(); + /** + * @brief Add parameter (or not.. this is the end of an auto resursive add parameter) + */ + void addParameter(); + /** + * @brief Convert the parameter in a simple human readable string + * @param[in] _id Number of the parameter + * @return readable string + */ + std::string simpleStringParam(uint32_t _id) const; + void composeWith(const uint8_t* _buffer, uint32_t _lenght) override; + bool writeOn(enet::WebSocket& _interface) override; + protected: + /** + * @brief Add a parameter at a specific position + * @param[in] _paramId Id of the parameter (needed for the multiple packet sending) + * @param[in] _value Value to add in parameter + */ + template + void addParameter(uint16_t _paramId, const ZEUS_TYPE_DATA& _value); + public: + template + void addParameter(const ZEUS_TYPE_DATA& _value) { + addParameter(m_parameter.size(), _value); + } + void parameterAppendBufferData(const ememory::SharedPtr& _obj); + }; +} diff --git a/zeus/BufferParameter_addParameter.cpp b/zeus/BufferParameter_addParameter.cpp index 3bd3c0b..c73b91c 100644 --- a/zeus/BufferParameter_addParameter.cpp +++ b/zeus/BufferParameter_addParameter.cpp @@ -5,6 +5,7 @@ */ #include #include +#include #include #include #include diff --git a/zeus/Future.cpp b/zeus/Future.cpp index eeccb83..adf30e8 100644 --- a/zeus/Future.cpp +++ b/zeus/Future.cpp @@ -4,6 +4,7 @@ * @license APACHE v2.0 (see license file) */ #include +#include #include #include #include diff --git a/zeus/FutureBase.cpp b/zeus/FutureBase.cpp index cf9f905..8a31d50 100644 --- a/zeus/FutureBase.cpp +++ b/zeus/FutureBase.cpp @@ -4,6 +4,7 @@ * @license APACHE v2.0 (see license file) */ #include +#include #include #include diff --git a/zeus/WebServer.cpp b/zeus/WebServer.cpp index 4d3834b..687429e 100644 --- a/zeus/WebServer.cpp +++ b/zeus/WebServer.cpp @@ -7,6 +7,7 @@ #include #include #include +#include ememory::SharedPtr zeus::createBaseCall(uint64_t _transactionId, const std::string& _functionName, const uint32_t& _serviceId) { diff --git a/zeus/WebServer.h b/zeus/WebServer.h index ac884a1..746c18c 100644 --- a/zeus/WebServer.h +++ b/zeus/WebServer.h @@ -5,6 +5,7 @@ */ #pragma once #include +#include #include #include #include