From e8a09ef7d2d41d94dd8c6743f4f9f2328c160142 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Sat, 14 Oct 2017 11:27:20 +0200 Subject: [PATCH] [DEV/DEBUG] add etk::typeInfo declaration and correct add and remove object in list not thread safe --- zeus/AbstractFunction.cpp | 3 + zeus/AbstractFunctionTypeClass.hpp | 8 +- zeus/Client.cpp | 4 + zeus/FutureBase.cpp | 4 + zeus/FutureGroup.cpp | 4 + zeus/Object.cpp | 2 + zeus/ObjectIntrospect.cpp | 4 + zeus/ObjectRemote.cpp | 3 +- zeus/ObjectRemote.hpp | 1 + zeus/Promise.cpp | 3 + zeus/Proxy.cpp | 4 + zeus/Raw.cpp | 3 +- zeus/RemoteProcessCall.cpp | 4 + zeus/WebObj.cpp | 4 + zeus/WebServer.cpp | 256 ++++++++++++++++++----------- zeus/WebServer.hpp | 35 +++- zeus/message/Answer.cpp | 3 + zeus/message/Call.cpp | 4 + zeus/message/Data.cpp | 4 + zeus/message/Event.cpp | 4 + zeus/message/Message.cpp | 2 + zeus/message/ParamType.cpp | 2 + zeus/message/Parameter.cpp | 3 + zeus/message/type.cpp | 4 + zeus/zeus-File.impl.cpp | 14 +- zeus/zeus-File.impl.hpp | 2 +- zeus/zeus-Media.impl.cpp | 7 + 27 files changed, 275 insertions(+), 116 deletions(-) diff --git a/zeus/AbstractFunction.cpp b/zeus/AbstractFunction.cpp index f80143c..3f8a432 100644 --- a/zeus/AbstractFunction.cpp +++ b/zeus/AbstractFunction.cpp @@ -7,6 +7,9 @@ #include #include +#include +ETK_DECLARE_TYPE(zeus::AbstractFunction); + static int32_t firstCall(bool& _value) { _value = false; return 51; diff --git a/zeus/AbstractFunctionTypeClass.hpp b/zeus/AbstractFunctionTypeClass.hpp index 154146e..78604ca 100644 --- a/zeus/AbstractFunctionTypeClass.hpp +++ b/zeus/AbstractFunctionTypeClass.hpp @@ -41,7 +41,7 @@ namespace zeus { ret = (*_pointer.*_func)(notifs, _obj->getParameter(idParam--)...); } if (_interfaceClient == nullptr) { - ZEUS_ERROR("Nullptr for _interfaceWeb"); + ZEUS_ERROR("Nullptr for _interfaceClient"); return; } _interfaceClient->addAsync([=](WebServer* _interface) { @@ -75,7 +75,7 @@ namespace zeus { ret = (*_pointer.*_func)(_obj->getParameter(idParam--)...); } if (_interfaceClient == nullptr) { - ZEUS_ERROR("Nullptr for _interfaceWeb"); + ZEUS_ERROR("Nullptr for _interfaceClient"); return; } _interfaceClient->addAsync([=](WebServer* _interface) { @@ -109,7 +109,7 @@ namespace zeus { (*_pointer.*_func)(notifs, _obj->getParameter(idParam--)...); } if (_interfaceClient == nullptr) { - ZEUS_ERROR("Nullptr for _interfaceWeb"); + ZEUS_ERROR("Nullptr for _interfaceClient"); return; } _interfaceClient->addAsync([=](WebServer* _interface) { @@ -142,7 +142,7 @@ namespace zeus { (*_pointer.*_func)(_obj->getParameter(idParam--)...); } if (_interfaceClient == nullptr) { - ZEUS_ERROR("Nullptr for _interfaceWeb"); + ZEUS_ERROR("Nullptr for _interfaceClient"); return; } _interfaceClient->addAsync([=](WebServer* _interface) { diff --git a/zeus/Client.cpp b/zeus/Client.cpp index 61e5e49..dc586aa 100644 --- a/zeus/Client.cpp +++ b/zeus/Client.cpp @@ -11,6 +11,10 @@ static const etk::String protocolError = "PROTOCOL-ERROR"; +#include +ETK_DECLARE_TYPE(zeus::Client); + + void zeus::Client::answerProtocolError(uint32_t _transactionId, const etk::String& _errorHelp) { m_interfaceWeb->answerError(_transactionId, 0, ZEUS_ID_SERVICE_ROOT, protocolError, _errorHelp); m_interfaceWeb->disconnect(); diff --git a/zeus/FutureBase.cpp b/zeus/FutureBase.cpp index 5d0e035..539050f 100644 --- a/zeus/FutureBase.cpp +++ b/zeus/FutureBase.cpp @@ -8,6 +8,10 @@ #include + +#include +ETK_DECLARE_TYPE(zeus::FutureBase); + zeus::FutureBase::FutureBase(const zeus::FutureBase& _base): m_promise(_base.m_promise) { diff --git a/zeus/FutureGroup.cpp b/zeus/FutureGroup.cpp index cd7d364..8bca2c4 100644 --- a/zeus/FutureGroup.cpp +++ b/zeus/FutureGroup.cpp @@ -7,6 +7,10 @@ #include #include + +#include +ETK_DECLARE_TYPE(zeus::FutureGroup); + void zeus::FutureGroup::add(const zeus::FutureBase& _fut) { m_listFuture.pushBack(_fut); } diff --git a/zeus/Object.cpp b/zeus/Object.cpp index d02d520..6edec77 100644 --- a/zeus/Object.cpp +++ b/zeus/Object.cpp @@ -10,6 +10,8 @@ #include #include +#include +ETK_DECLARE_TYPE(zeus::Object); zeus::Object::Object(const ememory::SharedPtr& _iface, uint16_t _objectId) : diff --git a/zeus/ObjectIntrospect.cpp b/zeus/ObjectIntrospect.cpp index eac9bc1..69866d0 100644 --- a/zeus/ObjectIntrospect.cpp +++ b/zeus/ObjectIntrospect.cpp @@ -6,6 +6,10 @@ #include + +#include +ETK_DECLARE_TYPE(zeus::ObjectIntrospect); + zeus::ObjectIntrospect::ObjectIntrospect(zeus::ObjectRemote& _obj): m_obj(_obj) { diff --git a/zeus/ObjectRemote.cpp b/zeus/ObjectRemote.cpp index f8fc464..04a38e2 100644 --- a/zeus/ObjectRemote.cpp +++ b/zeus/ObjectRemote.cpp @@ -7,7 +7,8 @@ #include #include - +#include +ETK_DECLARE_TYPE(zeus::ObjectRemoteBase); zeus::ObjectRemoteBase::ObjectRemoteBase(const ememory::SharedPtr& _iface, uint16_t _localId, uint16_t _localObjectId, uint32_t _address, const etk::String& _type): zeus::WebObj(_iface, _localId, _localObjectId), diff --git a/zeus/ObjectRemote.hpp b/zeus/ObjectRemote.hpp index d858106..1ebc171 100644 --- a/zeus/ObjectRemote.hpp +++ b/zeus/ObjectRemote.hpp @@ -25,6 +25,7 @@ namespace zeus { etk::String m_type; //!< name of the remote object uint32_t m_remoteAddress; //!< remote adress of the object bool m_isLinked; //!< link status of the object + ememory::SharedPtr m_adressLocalObject; //!< Pointer on the local object if we are in the same process. public: /** * @brief Contructor of the remote object diff --git a/zeus/Promise.cpp b/zeus/Promise.cpp index fec46bd..c249023 100644 --- a/zeus/Promise.cpp +++ b/zeus/Promise.cpp @@ -10,6 +10,9 @@ #include #include +#include +ETK_DECLARE_TYPE(zeus::Promise); + zeus::Promise::Promise(uint32_t _transactionId, uint32_t _source) { m_sendTime = echrono::Steady::now(); diff --git a/zeus/Proxy.cpp b/zeus/Proxy.cpp index 6bde23a..1d35f10 100644 --- a/zeus/Proxy.cpp +++ b/zeus/Proxy.cpp @@ -7,6 +7,10 @@ #include #include + +#include +ETK_DECLARE_TYPE(zeus::Proxy); + const zeus::Proxy& zeus::Proxy::operator= (const zeus::ObjectRemote& _obj) { m_obj = _obj; return *this; diff --git a/zeus/Raw.cpp b/zeus/Raw.cpp index 444c1e0..10e2b33 100644 --- a/zeus/Raw.cpp +++ b/zeus/Raw.cpp @@ -6,7 +6,8 @@ #include #include "debug.hpp" - +#include +ETK_DECLARE_TYPE(zeus::Raw); zeus::Raw::Raw() : m_size(0), diff --git a/zeus/RemoteProcessCall.cpp b/zeus/RemoteProcessCall.cpp index cc7a16d..83a773f 100644 --- a/zeus/RemoteProcessCall.cpp +++ b/zeus/RemoteProcessCall.cpp @@ -5,6 +5,10 @@ */ #include + +#include +ETK_DECLARE_TYPE(zeus::RemoteProcessCall); + zeus::RemoteProcessCall::RemoteProcessCall(const ememory::SharedPtr& _iface, uint16_t _id, uint16_t _objectId) : zeus::WebObj(_iface, _id, _objectId), m_type("UNKNOW") { diff --git a/zeus/WebObj.cpp b/zeus/WebObj.cpp index 5a2cf27..4911eb4 100644 --- a/zeus/WebObj.cpp +++ b/zeus/WebObj.cpp @@ -7,6 +7,10 @@ #include #include + +#include +ETK_DECLARE_TYPE(zeus::WebObj); + zeus::WebObj::WebObj(const ememory::SharedPtr& _iface, uint16_t _id, uint16_t _objectId) : m_interfaceWeb(_iface), m_id(_id), diff --git a/zeus/WebServer.cpp b/zeus/WebServer.cpp index 01f90a4..d4d710b 100644 --- a/zeus/WebServer.cpp +++ b/zeus/WebServer.cpp @@ -11,6 +11,10 @@ #include +#include +ETK_DECLARE_TYPE(zeus::WebServer); + + ememory::SharedPtr zeus::createBaseCall(const ememory::SharedPtr& _iface, uint64_t _transactionId, const uint32_t& _source, @@ -109,18 +113,19 @@ void zeus::WebServer::setInterfaceName(const etk::String& _name) { } void zeus::WebServer::addWebObj(ememory::SharedPtr _obj) { - //ethread::UniqueLock lock(m_mutex); + ethread::UniqueLock lock(m_listObjectMutex); m_listObject.pushBack(_obj); } void zeus::WebServer::addWebObjRemote(ememory::SharedPtr _obj) { - //ethread::UniqueLock lock(m_mutex); + ethread::UniqueLock lock(m_listRemoteObjectMutex); m_listRemoteObject.pushBack(_obj); } void zeus::WebServer::interfaceRemoved(etk::Vector _list) { ZEUS_WARNING("Remove interface : " << _list); for (int32_t iii=0; iii < _list.size(); ++iii) { + ethread::UniqueLock lock(m_listRemoteObjectMutex); // Call All remote Object object for (auto it=m_listRemoteObject.begin(); it != m_listRemoteObject.end(); @@ -139,6 +144,7 @@ void zeus::WebServer::interfaceRemoved(etk::Vector _list) { } } for (int32_t iii=0; iii < _list.size(); ++iii) { + ethread::UniqueLock lock(m_listObjectMutex); // Call All remote Object object for (auto it=m_listObject.begin(); it != m_listObject.end(); @@ -283,7 +289,7 @@ int32_t zeus::WebServer::writeBinary(ememory::SharedPtr _obj) { return -1; } -bool zeus::WebServer::onReceiveUri(const etk::String& _uri, const etk::Vector& _protocols) { +etk::String zeus::WebServer::onReceiveUri(const etk::String& _uri, const etk::Vector& _protocols) { ZEUS_INFO("Receive Header uri: " << _uri); bool findProtocol = false; for (auto &it : _protocols) { @@ -295,17 +301,35 @@ bool zeus::WebServer::onReceiveUri(const etk::String& _uri, const etk::Vector options; + etk::String uri; + size_t pos = _uri.find('?'); + if (pos == etk::String::npos) { + uri = _uri; + } else { + uri = _uri.extract(0, pos); + etk::String opt = _uri.extract(pos+1, _uri.size()); + etk::Vector listValue = opt.split('&'); + for (auto &it: listValue) { + pos = it.find('='); + if (pos == etk::String::npos) { + options.set(it, ""); + } else { + options.set(it.extract(0,pos), it.extract(pos+1, it.size())); + } + } + } + return m_observerRequestUri(uri, options); } if (_uri == "/") { - return true; + return "OK"; } ZEUS_ERROR("Disable connection all time the uri is not accepted by the server if the URI is not '/' URI='" << _uri << "'"); - return false; + return "CLOSE"; } void zeus::WebServer::onReceiveData(etk::Vector& _frame, bool _isBinary) { @@ -414,42 +438,47 @@ void zeus::WebServer::newMessage(ememory::SharedPtr _buffer) { // Not find a pending call ==> execute it ... if (future.isValid() == false) { uint32_t dest = _buffer->getDestination(); - // Call local object - for (auto &it : m_listObject) { - if (it == nullptr) { - continue; - } - if (it->getFullId() == dest) { - // send in an other async to syncronize the - m_processingPool.async( - [=](){ - ememory::SharedPtr tmpObj = it; - ZEUS_LOG_INPUT_OUTPUT("PROCESS : " << _buffer); - tmpObj->receive(_buffer); - }, - dest - ); - return; + { + ethread::UniqueLock lock(m_listObjectMutex); + // Call local object + for (auto &it : m_listObject) { + if (it == nullptr) { + continue; + } + if (it->getFullId() == dest) { + // send in an other async to syncronize the + m_processingPool.async( + [=](){ + ememory::SharedPtr tmpObj = it; + ZEUS_LOG_INPUT_OUTPUT("PROCESS : " << _buffer); + tmpObj->receive(_buffer); + }, + dest + ); + return; + } } } - //ethread::UniqueLock lock(m_mutex); - // call local map object on remote object - for (auto &it : m_listRemoteObject) { - ememory::SharedPtr tmp = it.lock(); - if (tmp == nullptr) { - continue; - } - if (tmp->getFullId() == dest) { - // send in an other async to syncronize the - m_processingPool.async( - [=](){ - ememory::SharedPtr tmpObj = tmp; - ZEUS_LOG_INPUT_OUTPUT("PROCESS : " << _buffer); - tmpObj->receive(_buffer); - }, - dest - ); - return; + { + ethread::UniqueLock lock(m_listRemoteObjectMutex); + // call local map object on remote object + for (auto &it : m_listRemoteObject) { + ememory::SharedPtr tmp = it.lock(); + if (tmp == nullptr) { + continue; + } + if (tmp->getFullId() == dest) { + // send in an other async to syncronize the + m_processingPool.async( + [=](){ + ememory::SharedPtr tmpObj = tmp; + ZEUS_LOG_INPUT_OUTPUT("PROCESS : " << _buffer); + tmpObj->receive(_buffer); + }, + dest + ); + return; + } } } if (m_observerElement != nullptr) { @@ -496,24 +525,29 @@ void zeus::WebServer::newMessage(ememory::SharedPtr _buffer) { } void zeus::WebServer::listObjects() { - //ethread::UniqueLock lock(m_mutex); if ( m_listObject.size() == 0 && m_listRemoteObject.size() == 0) { return; } ZEUS_DEBUG("[" << m_interfaceId << "] Interface WebServer:"); - for (auto &it : m_listObject) { - if (it == nullptr) { - continue; + { + ethread::UniqueLock lock(m_listObjectMutex); + for (auto &it : m_listObject) { + if (it == nullptr) { + continue; + } + it->display(); } - it->display(); } - for (auto &it : m_listRemoteObject) { - ememory::SharedPtr tmpp = it.lock(); - if (tmpp == nullptr) { - continue; + { + ethread::UniqueLock lock(m_listRemoteObjectMutex); + for (auto &it : m_listRemoteObject) { + ememory::SharedPtr tmpp = it.lock(); + if (tmpp == nullptr) { + continue; + } + tmpp->display(); } - tmpp->display(); } } @@ -523,27 +557,37 @@ void zeus::WebServer::cleanDeadObject() { && m_listRemoteObject.size() == 0) { return; } - for (auto it=m_listObject.begin(); - it!=m_listObject.end(); - /* no auto increment*/) { - if (*it == nullptr) { - it = m_listObject.erase(it); - continue; + ZEUS_INFO("Clean DEAD object... total=" << m_listObject.size()); + etk::Vector> tmpToRemoveObjectInAsync; + { + ethread::UniqueLock lock(m_listObjectMutex); + for (auto it=m_listObject.begin(); + it!=m_listObject.end(); + /* no auto increment*/) { + if (*it == nullptr) { + it = m_listObject.erase(it); + continue; + } + if ((*it)->haveRemoteConnected() == false) { + tmpToRemoveObjectInAsync.pushBack(*it); + it = m_listObject.erase(it); + continue; + } + ++it; } - if ((*it)->haveRemoteConnected() == false) { - it = m_listObject.erase(it); - continue; - } - ++it; } - for (auto it=m_listRemoteObject.begin(); - it!=m_listRemoteObject.end(); - /* no auto increment*/) { - if (it->expired() == true) { - it = m_listRemoteObject.erase(it); - continue; + tmpToRemoveObjectInAsync.clear(); + { + ethread::UniqueLock lock(m_listRemoteObjectMutex); + for (auto it=m_listRemoteObject.begin(); + it!=m_listRemoteObject.end(); + /* no auto increment*/) { + if (it->expired() == true) { + it = m_listRemoteObject.erase(it); + continue; + } + ++it; } - ++it; } } @@ -553,22 +597,28 @@ bool zeus::WebServer::transferRemoteObjectOwnership(uint16_t _objectAddress, uin && m_listRemoteObject.size() == 0) { return false; } - for (auto &it : m_listObject) { - if (it == nullptr) { - continue; - } - if (it->getObjectId() == _objectAddress) { - return it->transferOwnership(_sourceAddress, _destinataireAddress); + { + ethread::UniqueLock lock(m_listObjectMutex); + for (auto &it : m_listObject) { + if (it == nullptr) { + continue; + } + if (it->getObjectId() == _objectAddress) { + return it->transferOwnership(_sourceAddress, _destinataireAddress); + } } } - for (auto &it : m_listRemoteObject) { - ememory::SharedPtr tmp = it.lock(); - if (tmp == nullptr) { - continue; - } - if (tmp->getObjectId() == _objectAddress) { - ZEUS_ERROR("return a remote Object is not permited ... ==> link directly to the original elements"); - return false; + { + ethread::UniqueLock lock(m_listRemoteObjectMutex); + for (auto &it : m_listRemoteObject) { + ememory::SharedPtr tmp = it.lock(); + if (tmp == nullptr) { + continue; + } + if (tmp->getObjectId() == _objectAddress) { + ZEUS_ERROR("return a remote Object is not permited ... ==> link directly to the original elements"); + return false; + } } } return false; @@ -580,24 +630,30 @@ bool zeus::WebServer::removeObjectOwnership(uint16_t _objectAddress, uint32_t _s && m_listRemoteObject.size() == 0) { return false; } - for (auto &it : m_listObject) { - if (it == nullptr) { - continue; - } - //ZEUS_INFO("1 Remove ownership of " << it->getObjectId() << " == " << _objectAddress); - if (it->getObjectId() == _objectAddress) { - return it->removeOwnership(_sourceAddress); + { + ethread::UniqueLock lock(m_listObjectMutex); + for (auto &it : m_listObject) { + if (it == nullptr) { + continue; + } + ZEUS_INFO("1 Remove ownership of " << it->getObjectId() << " == " << _objectAddress); + if (it->getObjectId() == _objectAddress) { + return it->removeOwnership(_sourceAddress); + } } } - for (auto &it : m_listRemoteObject) { - ememory::SharedPtr tmp = it.lock(); - if (tmp == nullptr) { - continue; - } - //ZEUS_INFO("2 Remove ownership of " << tmp->getObjectId() << " == " << _objectAddress); - if (tmp->getObjectId() == _objectAddress) { - ZEUS_ERROR("return a remote Object is not permited ... ==> link directly to the original elements"); - return false; + { + ethread::UniqueLock lock(m_listRemoteObjectMutex); + for (auto &it : m_listRemoteObject) { + ememory::SharedPtr tmp = it.lock(); + if (tmp == nullptr) { + continue; + } + ZEUS_INFO("2 Remove ownership of " << tmp->getObjectId() << " == " << _objectAddress); + if (tmp->getObjectId() == _objectAddress) { + ZEUS_ERROR("return a remote Object is not permited ... ==> link directly to the original elements"); + return false; + } } } return false; @@ -618,6 +674,7 @@ void zeus::WebServer::threadAsyncCallback() { if (m_threadAsyncList2.size() != 0) { ethread::UniqueLock lock(m_threadAsyncMutex); for (auto &it : m_threadAsyncList2) { + ZEUS_INFO("Add async"); m_threadAsyncList.pushBack(it); } m_threadAsyncList2.clear(); @@ -632,6 +689,7 @@ void zeus::WebServer::threadAsyncCallback() { bool ret = (*it)(this); if (ret == true) { // Remove it ... + ZEUS_INFO("Remove async"); it = m_threadAsyncList.erase(it); } else { ++it; diff --git a/zeus/WebServer.hpp b/zeus/WebServer.hpp index 1cf9aff..b312798 100644 --- a/zeus/WebServer.hpp +++ b/zeus/WebServer.hpp @@ -115,6 +115,7 @@ namespace zeus { private: enet::WebSocket m_connection; //!< Zeus protocol is based on a webSocket to be compatible with Java-script ethread::Pool m_processingPool; //!< Thread pool processing of the input data + // access only with the tcp thread only etk::Vector> m_listPartialMessage; //!< list of all message that data has not finished to arrive. uint16_t m_localAddress; //!< Local client address. uint16_t m_localIdObjectIncrement; //!< attribute an unique ID for an object. @@ -141,8 +142,18 @@ namespace zeus { ethread::UniqueLock lock(m_mutex); return m_localIdObjectIncrement++; } + public: + /** + * @brief Get the address of the connection source IP:port or empty string + * @return string with the remote address name. + */ + const etk::String& getRemoteAddress() const { + return m_connection.getRemoteAddress(); + } private: + ethread::Mutex m_listObjectMutex; //!< m_listObject object protection etk::Vector> m_listObject; //!< List of all local object that is reference in the system. + ethread::Mutex m_listRemoteObjectMutex; //!< m_listObject object protection etk::Vector> m_listRemoteObject; //!< List of all object that we have a reference in the local interface. public: /** @@ -165,6 +176,7 @@ namespace zeus { void interfaceRemoved(etk::Vector _list); private: uint32_t m_interfaceId; //!< local client interface ID + // TODO: add a lock here or an atomic get + increment uint16_t m_transmissionId; //!< Unique Id of a transmission (it is != 0) /** * @brief Get a new transmission ID @@ -188,7 +200,15 @@ namespace zeus { }; } public: - using ObserverRequestUri = etk::Function; //!< Define an Observer on the specific URI requested callback: function pointer (return true if the connection is accepted or not) + /** + * @brief Declare callback function for URI requesting + * @param[in] _uri URI connection (GET) + * @param[in] _protocols Protocol requested in the URI (ZEUS:1.0/ZEUS:0.8) + * @return "OK" Connection accepted ==> send header + * @return "CLOSE" Close the current connection: 404 + * @return "REDIRECT:IP:port" Redirect at the specific IP and port + */ + using ObserverRequestUri = etk::Function& _options)>; //!< Define an Observer on the specific URI requested callback: function pointer (return true if the connection is accepted or not) protected: ObserverRequestUri m_observerRequestUri; //!< Observer on a requesting URI connection public: @@ -198,9 +218,9 @@ namespace zeus { * @param[in] _func Function to call. */ template - void connectUri(CLASS_TYPE* _class, bool (CLASS_TYPE::*_func)(const etk::String&)) { - m_observerRequestUri = [=](const etk::String& _value){ - return (*_class.*_func)(_value); + void connectUri(CLASS_TYPE* _class, etk::String (CLASS_TYPE::*_func)(const etk::String& _uri, const etk::Map& _options)) { + m_observerRequestUri = [=](const etk::String& _uri, const etk::Map& _options){ + return (*_class.*_func)(_uri, _options); }; } /** @@ -268,10 +288,11 @@ namespace zeus { * @brief Called by the underprotocol for a new URI connection * @param[in] _uri URI connection (GET) * @param[in] _protocols Protocol requested in the URI (ZEUS:1.0/ZEUS:0.8) - * @return true the connection is accepted - * @return false the connection is rejected + * @return "OK" Connection accepted ==> send header + * @return "CLOSE" Close the current connection: 404 + * @return "REDIRECT:IP:port" Redirect at the specific IP and port */ - bool onReceiveUri(const etk::String& _uri, const etk::Vector& _protocols); + etk::String onReceiveUri(const etk::String& _uri, const etk::Vector& _protocols); /** * @brief The Zeus protocol is based on a webSocket, then the connection can send full fragment (it call newMessage when data is parsed * @param[in] _frame A frame that has been just received diff --git a/zeus/message/Answer.cpp b/zeus/message/Answer.cpp index 902a10d..0ff22f3 100644 --- a/zeus/message/Answer.cpp +++ b/zeus/message/Answer.cpp @@ -10,6 +10,9 @@ #include #include +#include +ETK_DECLARE_TYPE(zeus::message::Answer); + void zeus::message::Answer::generateDisplay(etk::Stream& _os) const { zeus::Message::generateDisplay(_os); if (getNumberParameter() != 0) { diff --git a/zeus/message/Call.cpp b/zeus/message/Call.cpp index 3b4108b..8fe5913 100644 --- a/zeus/message/Call.cpp +++ b/zeus/message/Call.cpp @@ -10,6 +10,10 @@ #include #include + +#include +ETK_DECLARE_TYPE(zeus::message::Call); + void zeus::message::Call::generateDisplay(etk::Stream& _os) const { zeus::Message::generateDisplay(_os); _os << " '" + m_callName + "'"; diff --git a/zeus/message/Data.cpp b/zeus/message/Data.cpp index 290a9e8..e3e6bdc 100644 --- a/zeus/message/Data.cpp +++ b/zeus/message/Data.cpp @@ -10,6 +10,10 @@ #include #include + +#include +ETK_DECLARE_TYPE(zeus::message::Data); + void zeus::message::Data::generateDisplay(etk::Stream& _os) const { zeus::Message::generateDisplay(_os); _os << " paramId=" << etk::toString(m_parameterId); diff --git a/zeus/message/Event.cpp b/zeus/message/Event.cpp index 2c7b87e..813bbf3 100644 --- a/zeus/message/Event.cpp +++ b/zeus/message/Event.cpp @@ -10,6 +10,10 @@ #include #include + +#include +ETK_DECLARE_TYPE(zeus::message::Event); + void zeus::message::Event::generateDisplay(etk::Stream& _os) const { zeus::Message::generateDisplay(_os); if (getNumberParameter() != 0) { diff --git a/zeus/message/Message.cpp b/zeus/message/Message.cpp index dde0e46..d2e195e 100644 --- a/zeus/message/Message.cpp +++ b/zeus/message/Message.cpp @@ -17,6 +17,8 @@ #include #include +#include +ETK_DECLARE_TYPE(zeus::Message); zeus::Message::Message(ememory::SharedPtr _iface): m_iface(_iface) { diff --git a/zeus/message/ParamType.cpp b/zeus/message/ParamType.cpp index ac4f67e..c94f5db 100644 --- a/zeus/message/ParamType.cpp +++ b/zeus/message/ParamType.cpp @@ -8,6 +8,8 @@ #include #include +#include +ETK_DECLARE_TYPE(zeus::message::ParamType); bool zeus::message::checkCompatibility(const ParamType& _type, const ParamType& _params) { if (_params == _type) { diff --git a/zeus/message/Parameter.cpp b/zeus/message/Parameter.cpp index 3468dc1..e50c7d5 100644 --- a/zeus/message/Parameter.cpp +++ b/zeus/message/Parameter.cpp @@ -12,6 +12,9 @@ #include #include +#include +ETK_DECLARE_TYPE(zeus::message::Parameter); + zeus::message::Parameter::Parameter(ememory::SharedPtr _iface): Message(_iface) { diff --git a/zeus/message/type.cpp b/zeus/message/type.cpp index 43195d0..73eaea0 100644 --- a/zeus/message/type.cpp +++ b/zeus/message/type.cpp @@ -7,6 +7,10 @@ #include #include + +#include +ETK_DECLARE_TYPE(zeus::message::type); + namespace etk { template<> etk::String toString(const enum zeus::message::type& _value) { switch (_value) { diff --git a/zeus/zeus-File.impl.cpp b/zeus/zeus-File.impl.cpp index 4ab5d63..d0e1f9e 100644 --- a/zeus/zeus-File.impl.cpp +++ b/zeus/zeus-File.impl.cpp @@ -13,6 +13,10 @@ #include "debug.hpp" +#include +ETK_DECLARE_TYPE(zeus::FileImpl); + + ememory::SharedPtr zeus::File::create(etk::String _fileNameReal) { return ememory::makeShared(_fileNameReal); } @@ -28,16 +32,17 @@ ememory::SharedPtr zeus::File::create(etk::String _fileNameReal, etk return ememory::makeShared(_fileNameReal, _fileNameShow, _mineType, _sha512); } -ememory::SharedPtr zeus::File::create(etk::Vector _fileNameReal, etk::String _virtualName, etk::String _mineType) { - return ememory::makeShared(_fileNameReal, _virtualName, _mineType); +ememory::SharedPtr zeus::File::create(etk::Vector _fileData, etk::String _virtualName, etk::String _mineType) { + return ememory::makeShared(etk::move(_fileData), _virtualName, _mineType); } -zeus::FileImpl::FileImpl(const etk::Vector& _value, etk::String _virtualName, etk::String _mineType) : +zeus::FileImpl::FileImpl(etk::Vector _value, etk::String _virtualName, etk::String _mineType) : m_filename(_virtualName), m_gettedData(0), m_mineType(_mineType), m_sha512("") { + ZEUS_ERROR(" ==============>>>>>>>>>>>>>> CREATE FILE"); m_dataRaw = true; m_data = _value; m_size = m_data.size(); @@ -47,6 +52,7 @@ zeus::FileImpl::FileImpl(etk::String _fileNameReal, etk::String _sha512) : m_node(_fileNameReal), m_gettedData(0), m_sha512(_sha512) { + ZEUS_ERROR(" ==============>>>>>>>>>>>>>> CREATE FILE"); m_size = m_node.fileSize(); etk::String extention; if ( _fileNameReal.rfind('.') != etk::String::npos @@ -69,6 +75,7 @@ zeus::FileImpl::FileImpl(etk::String _fileNameReal, etk::String _fileNameShow, e m_gettedData(0), m_mineType(_mineType), m_sha512(_sha512) { + ZEUS_ERROR(" ==============>>>>>>>>>>>>>> CREATE FILE"); m_size = m_node.fileSize(); if ( _sha512.size() > 0 && _sha512.size() != 128) { @@ -78,6 +85,7 @@ zeus::FileImpl::FileImpl(etk::String _fileNameReal, etk::String _fileNameShow, e } zeus::FileImpl::~FileImpl() { + ZEUS_ERROR(" <<<<<<<<<<<<<<============== DESTROY FILE"); if (m_node.fileIsOpen() == true) { m_node.fileClose(); } diff --git a/zeus/zeus-File.impl.hpp b/zeus/zeus-File.impl.hpp index ef08fdb..9121cd9 100644 --- a/zeus/zeus-File.impl.hpp +++ b/zeus/zeus-File.impl.hpp @@ -22,7 +22,7 @@ namespace zeus { public: FileImpl(etk::String _fileNameReal, etk::String _fileNameShow, etk::String _mineType, etk::String _sha512=""); FileImpl(etk::String _fileNameReal, etk::String _sha512=""); - FileImpl(const etk::Vector& _value, etk::String _virtualName, etk::String _mineType); + FileImpl(etk::Vector _value, etk::String _virtualName, etk::String _mineType); ~FileImpl(); uint64_t getSize() override; etk::String getName() override; diff --git a/zeus/zeus-Media.impl.cpp b/zeus/zeus-Media.impl.cpp index 52d71c7..6920cf8 100644 --- a/zeus/zeus-Media.impl.cpp +++ b/zeus/zeus-Media.impl.cpp @@ -11,6 +11,10 @@ #include #include "debug.hpp" + +#include +ETK_DECLARE_TYPE(zeus::MediaImpl); + ememory::SharedPtr zeus::Media::create(etk::String _fileNameReal) { return ememory::makeShared(0, _fileNameReal); } @@ -31,6 +35,7 @@ ejson::Object zeus::MediaImpl::getJson() { zeus::MediaImpl::MediaImpl(const etk::String& _basePath, ejson::Object _property) : m_basePath(_basePath) { + ZEUS_ERROR(" ==============>>>>>>>>>>>>>> CREATE MEDIA"); m_id = _property["id"].toNumber().getU64(); ZEUS_INFO("get ID : " << m_id); m_fileName = _property["file-name"].toString().get(); @@ -53,6 +58,7 @@ zeus::MediaImpl::MediaImpl(uint64_t _id, const etk::String& _fileNameReal, const m_id(_id), m_basePath(_basePath), m_fileName(_fileNameReal) { + ZEUS_ERROR(" ==============>>>>>>>>>>>>>> CREATE MEDIA"); etk::String extention; if ( m_fileName.rfind('.') != etk::String::npos && m_fileName.rfind('.') != 0) { @@ -66,6 +72,7 @@ zeus::MediaImpl::MediaImpl(uint64_t _id, const etk::String& _fileNameReal, const } zeus::MediaImpl::~MediaImpl() { + ZEUS_ERROR(" <<<<<<<<<<<<<<============== DESTROY MEDIA"); }