diff --git a/zeus/Buffer.cpp b/zeus/Buffer.cpp index 6998556..f397104 100644 --- a/zeus/Buffer.cpp +++ b/zeus/Buffer.cpp @@ -72,15 +72,11 @@ void zeus::Buffer::appendBuffer(const ememory::SharedPtr& _obj) { appendBufferData(std::static_pointer_cast(_obj)); } -size_t zeus::Buffer::getSize() { - return sizeof(headerBin); -} - bool zeus::Buffer::writeOn(enet::WebSocket& _interface) { - uint64_t size = getSize(); - if (_interface.writeHeader(size, false) == false) { + if (_interface.configHeader(false) == false) { return false; } + _interface.writeData((uint8_t*)&m_header, sizeof(headerBin)); return true; } @@ -109,7 +105,7 @@ void zeus::Buffer::generateDisplay(std::ostream& _os) const { _os << " id=" << etk::to_string(getTransactionId()); _os << " cId=" << etk::to_string(getClientId()); if (getPartFinish() == true) { - _os << "finish"; + _os << " finish"; } enum zeus::Buffer::typeMessage type = getType(); switch (type) { @@ -149,7 +145,9 @@ void zeus::BufferCall::generateDisplay(std::ostream& _os) const { void zeus::BufferAnswer::generateDisplay(std::ostream& _os) const { zeus::Buffer::generateDisplay(_os); - _os << " '" + simpleStringParam(0) + "'"; + if (getNumberParameter() != 0) { + _os << " '" + simpleStringParam(0) + "'"; + } if (m_errorType.size() != 0) { _os << " Error='" + m_errorType + "'"; }if (m_errorHelp.size() != 0) { @@ -159,8 +157,8 @@ void zeus::BufferAnswer::generateDisplay(std::ostream& _os) const { void zeus::BufferData::generateDisplay(std::ostream& _os) const { zeus::Buffer::generateDisplay(_os); - _os << " paramId=" << etk::to_string(m_partId); - _os << " part=" << etk::to_string(m_parameterId); + _os << " paramId=" << etk::to_string(m_parameterId); + _os << " part=" << etk::to_string(m_partId); _os << " nbData=" << etk::to_string(m_data.size()); } @@ -200,31 +198,20 @@ enum zeus::Buffer::typeMessage zeus::Buffer::getType() const { // ------------------------------------------------------------------------------------ // -- Multiple parameter // ------------------------------------------------------------------------------------ - - -size_t zeus::BufferParameter::parameterGetSize() { - size_t size = sizeof(uint16_t); - for (auto &it : m_parameter) { - size += sizeof(uint32_t); // parameter size - size += it.second.size(); - } - return size; -} - -bool zeus::BufferParameter::parameterWriteOn(enet::WebSocket& _interface) { +bool zeus::BufferParameter::writeOn(enet::WebSocket& _interface) { uint8_t* data = nullptr; uint32_t dataSize = 0; - uint16_t numberOfParameter = m_parameter.size(); - size_t size = _interface.writeData((uint8_t*)&numberOfParameter, sizeof(uint16_t)); + 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)); + size += _interface.writeData(&it.second[0], it.second.size() * sizeof(uint8_t)); } return true; } -void zeus::BufferParameter::parameterComposeWith(const uint8_t* _buffer, uint32_t _lenght) { +void zeus::BufferParameter::composeWith(const uint8_t* _buffer, uint32_t _lenght) { m_parameter.clear(); uint16_t nbParameters = 0; if (_lenght < sizeof(uint16_t)) { @@ -385,14 +372,10 @@ void zeus::BufferCall::setCall(const std::string& _value) { m_callName = _value; } -size_t zeus::BufferCall::getSize() { - // name + \0 + parameters ... - return m_callName.size()+1 + parameterGetSize(); -} - bool zeus::BufferCall::writeOn(enet::WebSocket& _interface) { + zeus::Buffer::writeOn(_interface); _interface.writeData((uint8_t*)m_callName.c_str(), m_callName.size() + 1); - return parameterWriteOn(_interface); + return BufferParameter::writeOn(_interface); } void zeus::BufferCall::composeWith(const uint8_t* _buffer, uint32_t _lenght) { @@ -401,12 +384,13 @@ void zeus::BufferCall::composeWith(const uint8_t* _buffer, uint32_t _lenght) { uint32_t pos = 0; m_callName.clear(); while( pos < _lenght - && _buffer[pos] != '\0') { + && (char)_buffer[pos] != '\0') { m_callName += _buffer[pos]; pos++; } + pos++; // parse parameters: - parameterComposeWith(&_buffer[pos], _lenght-pos); + BufferParameter::composeWith(&_buffer[pos], _lenght-pos); } void zeus::BufferCall::appendBufferData(const ememory::SharedPtr& _obj) { @@ -434,21 +418,13 @@ void zeus::BufferAnswer::addError(const std::string& _value, const std::string& m_errorHelp = _comment; } -size_t zeus::BufferAnswer::getSize() { - // name + \0 + parameters ... - size_t size = m_errorType.size()+1 + parameterGetSize(); - if (m_errorType.size() != 0) { - size += m_errorHelp.size() + 1; - } - return size; -} - 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 parameterWriteOn(_interface); + return BufferParameter::writeOn(_interface); } void zeus::BufferAnswer::composeWith(const uint8_t* _buffer, uint32_t _lenght) { @@ -462,15 +438,17 @@ void zeus::BufferAnswer::composeWith(const uint8_t* _buffer, uint32_t _lenght) { 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: - parameterComposeWith(&_buffer[pos], _lenght-pos); + BufferParameter::composeWith(&_buffer[pos], _lenght-pos); } void zeus::BufferAnswer::appendBufferData(const ememory::SharedPtr& _obj) { @@ -500,12 +478,8 @@ void zeus::BufferData::setPartId(uint32_t _value) { m_partId = _value; } -size_t zeus::BufferData::getSize() { - // name + \0 + parameters ... - return sizeof(uint32_t) + sizeof(uint16_t) + m_data.size(); -} - 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()); @@ -551,7 +525,7 @@ ememory::SharedPtr zeus::Buffer::create(const std::vector } value->setTransactionId(header.transactionID); value->setClientId(header.clientID); - value->setClientId((header.flags & ZEUS_BUFFER_FLAG_FINISH) != 0); + value->setPartFinish((header.flags & ZEUS_BUFFER_FLAG_FINISH) != 0); value->composeWith(&_buffer[sizeof(headerBin)], _buffer.size() - sizeof(headerBin)); return value; @@ -564,7 +538,7 @@ ememory::SharedPtr zeus::Buffer::create(const std::vector } value->setTransactionId(header.transactionID); value->setClientId(header.clientID); - value->setClientId((header.flags & ZEUS_BUFFER_FLAG_FINISH) != 0); + value->setPartFinish((header.flags & ZEUS_BUFFER_FLAG_FINISH) != 0); value->composeWith(&_buffer[sizeof(headerBin)], _buffer.size() - sizeof(headerBin)); return value; @@ -577,7 +551,7 @@ ememory::SharedPtr zeus::Buffer::create(const std::vector } value->setTransactionId(header.transactionID); value->setClientId(header.clientID); - value->setClientId((header.flags & ZEUS_BUFFER_FLAG_FINISH) != 0); + value->setPartFinish((header.flags & ZEUS_BUFFER_FLAG_FINISH) != 0); value->composeWith(&_buffer[sizeof(headerBin)], _buffer.size() - sizeof(headerBin)); return value; diff --git a/zeus/Buffer.h b/zeus/Buffer.h index afd3164..557478a 100644 --- a/zeus/Buffer.h +++ b/zeus/Buffer.h @@ -231,7 +231,6 @@ namespace zeus { * @return true of no error appear */ virtual bool writeOn(enet::WebSocket& _interface); - virtual size_t getSize(); virtual void generateDisplay(std::ostream& _os) const ; }; class BufferParameter: @@ -283,14 +282,8 @@ namespace zeus { * @return readable string */ std::string simpleStringParam(uint32_t _id) const; - /** - * @brief When receive new data form websocket, it might be added by this input (set all the frame ...) - * @param[in] _buffer Pointer on the data to add. - * @param[in] _lenght number of octet to add. - */ - void parameterComposeWith(const uint8_t* _buffer, uint32_t _lenght); - bool parameterWriteOn(enet::WebSocket& _interface); - size_t parameterGetSize(); + 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 @@ -321,7 +314,6 @@ namespace zeus { void composeWith(const uint8_t* _buffer, uint32_t _lenght) override; void appendBufferData(const ememory::SharedPtr& _obj) override; bool writeOn(enet::WebSocket& _interface) override; - size_t getSize() override; void generateDisplay(std::ostream& _os) const override; public: /** @@ -361,7 +353,6 @@ namespace zeus { void composeWith(const uint8_t* _buffer, uint32_t _lenght) override; void appendBufferData(const ememory::SharedPtr& _obj) override; bool writeOn(enet::WebSocket& _interface) override; - size_t getSize() override; void generateDisplay(std::ostream& _os) const override; public: /** @@ -430,7 +421,6 @@ namespace zeus { void composeWith(const uint8_t* _buffer, uint32_t _lenght) override; // TODO :... void appendBufferData(const ememory::SharedPtr& _obj) override; bool writeOn(enet::WebSocket& _interface) override; - size_t getSize() override; void generateDisplay(std::ostream& _os) const override; public: /** diff --git a/zeus/Client.cpp b/zeus/Client.cpp index b0b9848..01a0ee0 100644 --- a/zeus/Client.cpp +++ b/zeus/Client.cpp @@ -58,6 +58,8 @@ bool zeus::Client::connectTo(const std::string& _address) { ret.wait(); if (ret.hasError() == true) { ZEUS_WARNING("Can not connect to user named: '" << _address << "' ==> return error"); + ZEUS_WARNING(" error: '" << ret.getErrorType() << "'"); + ZEUS_WARNING(" help: '" << ret.getErrorHelp() << "'"); return false; } if (ret.get() == true) { diff --git a/zeus/FutureBase.cpp b/zeus/FutureBase.cpp index fafb368..cf9f905 100644 --- a/zeus/FutureBase.cpp +++ b/zeus/FutureBase.cpp @@ -42,6 +42,7 @@ zeus::FutureBase::FutureBase(uint32_t _transactionId, const ememory::SharedPtrm_sendTime = std::chrono::steady_clock::now(); m_data->m_transactionId = _transactionId; + m_data->m_clientId = _clientId; m_data->m_isSynchronous = false; m_data->m_returnData = _returnData; m_data->m_callbackFinish = _callback; @@ -124,7 +125,7 @@ bool zeus::FutureBase::hasError() const { || m_data->m_returnData == nullptr) { return true; } - if (m_data->m_returnData->getType() == zeus::Buffer::typeMessage::answer) { + if (m_data->m_returnData->getType() != zeus::Buffer::typeMessage::answer) { return true; } return static_cast(m_data->m_returnData.get())->hasError(); @@ -135,7 +136,7 @@ std::string zeus::FutureBase::getErrorType() const { || m_data->m_returnData == nullptr) { return "NULL_PTR"; } - if (m_data->m_returnData->getType() == zeus::Buffer::typeMessage::answer) { + if (m_data->m_returnData->getType() != zeus::Buffer::typeMessage::answer) { return "NOT_ANSWER_MESSAGE"; } return static_cast(m_data->m_returnData.get())->getError(); @@ -146,7 +147,7 @@ std::string zeus::FutureBase::getErrorHelp() const { || m_data->m_returnData == nullptr) { return "This is a nullptr future"; } - if (m_data->m_returnData->getType() == zeus::Buffer::typeMessage::answer) { + if (m_data->m_returnData->getType() != zeus::Buffer::typeMessage::answer) { return "This answer is not a anwser type"; } return static_cast(m_data->m_returnData.get())->getErrorHelp(); diff --git a/zeus/Service.cpp b/zeus/Service.cpp index 6fd5e94..fa4311c 100644 --- a/zeus/Service.cpp +++ b/zeus/Service.cpp @@ -35,28 +35,35 @@ void zeus::Service::onClientData(const ememory::SharedPtr& _value) if (_value == nullptr) { return; } + ZEUS_WARNING("BUFFER" << _value); uint32_t tmpID = _value->getTransactionId(); - uint32_t clientId = _value->getClientId();; - auto it = m_callMultiData.begin(); - while (it != m_callMultiData.end()) { - if ( it->getTransactionId() == tmpID - && it->getClientId() == clientId) { - ZEUS_WARNING("Append data ... " << tmpID); - it->appendData(_value); - if (it->isFinished() == true) { - ZEUS_WARNING("CALL Function ..."); - callBinary(it->getRaw()); - it = m_callMultiData.erase(it); + uint32_t clientId = _value->getClientId(); + if (_value->getType() == zeus::Buffer::typeMessage::data) { + auto it = m_callMultiData.begin(); + while (it != m_callMultiData.end()) { + if ( it->getTransactionId() == tmpID + && it->getClientId() == clientId) { + ZEUS_WARNING("Append data ... " << tmpID); + it->appendData(_value); + if (it->isFinished() == true) { + ZEUS_WARNING("CALL Function ..."); + callBinary(it->getRaw()); + it = m_callMultiData.erase(it); + } + return; } - return; + ++it; } - ++it; + ZEUS_ERROR("Un-associated data ..."); + return; } + ZEUS_WARNING("direct call"); zeus::FutureBase futData(tmpID, _value, nullptr, clientId); if (futData.isFinished() == true) { ZEUS_INFO("Call Binary .."); callBinary(futData.getRaw()); } else { + ZEUS_INFO("ADD ..."); m_callMultiData.push_back(futData); } } diff --git a/zeus/Service.h b/zeus/Service.h index 05e1fbe..f36053c 100644 --- a/zeus/Service.h +++ b/zeus/Service.h @@ -190,7 +190,7 @@ namespace zeus { * @param[in] * @return */ - virtual void callBinary2(const std::string& _call, const ememory::SharedPtr& _obj) = 0; + virtual void callBinary2(const std::string& _call, const ememory::SharedPtr& _obj) = 0; /** * @brief * @param[in] @@ -361,7 +361,7 @@ namespace zeus { * @param[in] * @return */ - void callBinary2(const std::string& _call, const ememory::SharedPtr& _obj) { + void callBinary2(const std::string& _call, const ememory::SharedPtr& _obj) { auto it = m_interface.find(_obj->getClientId()); if (it == m_interface.end()) { m_interfaceClient->answerError(_obj->getTransactionId(), "CLIENT-UNKNOW", "", _obj->getClientId()); diff --git a/zeus/WebServer.cpp b/zeus/WebServer.cpp index 4392fc6..4d3834b 100644 --- a/zeus/WebServer.cpp +++ b/zeus/WebServer.cpp @@ -157,7 +157,9 @@ int32_t zeus::WebServer::writeBinary(const ememory::SharedPtr& _ob if (_obj->haveAsync() == true) { _obj->setPartFinish(false); } + ZEUS_VERBOSE("Send :" << _obj); if (_obj->writeOn(m_connection) == true) { + m_connection.send(); if (_obj->haveAsync() == true) { addAsync(SendAsyncBinary(_obj->getTransactionId(), _obj->getServiceId(), std::move(_obj->moveAsync()))); } @@ -301,7 +303,6 @@ zeus::FutureBase zeus::WebServer::callBinary(uint64_t _transactionId, const ememory::SharedPtr& _obj, zeus::FutureData::ObserverFinish _callback, const uint32_t& _serviceId) { - ZEUS_VERBOSE("Send [START] "); if (isActive() == false) { ZEUS_ERROR("Send [STOP] ==> not connected (no TCP)"); ememory::SharedPtr obj = zeus::BufferAnswer::create(); @@ -314,7 +315,6 @@ zeus::FutureBase zeus::WebServer::callBinary(uint64_t _transactionId, m_pendingCall.push_back(std::make_pair(uint64_t(0), tmpFuture)); } writeBinary(_obj); - ZEUS_VERBOSE("Send [STOP]"); return tmpFuture; } @@ -322,7 +322,6 @@ zeus::FutureBase zeus::WebServer::callForward(uint32_t _clientId, const ememory::SharedPtr& _buffer, uint64_t _singleReferenceId, zeus::FutureData::ObserverFinish _callback) { - ZEUS_VERBOSE("Call Forward [START]"); //zeus::FutureBase ret = callBinary(id, _Buffer, async, _callback); //ret.setSynchronous(); @@ -341,7 +340,6 @@ zeus::FutureBase zeus::WebServer::callForward(uint32_t _clientId, m_pendingCall.push_back(std::make_pair(_singleReferenceId, tmpFuture)); } writeBinary(_buffer); - ZEUS_VERBOSE("Send Forward [STOP]"); return tmpFuture; }