diff options
author | Alexandr Galiuzov <agaliuzov@luxoft.com> | 2015-06-13 00:39:00 +0300 |
---|---|---|
committer | Alexandr Galiuzov <agaliuzov@luxoft.com> | 2015-06-13 00:39:00 +0300 |
commit | 41e5c421e89a7cbd80131dceccdcd8c69df91de7 (patch) | |
tree | 9c91e389de200b16ec80a84ff203b9c673fded67 /src/3rd_party-static | |
parent | 63018931319ba6297c714070852ba415ed045c28 (diff) | |
parent | 84d847262b0dbc732d2d38d6654ad2056ee142c1 (diff) | |
download | sdl_core-41e5c421e89a7cbd80131dceccdcd8c69df91de7.tar.gz |
Merge branch 'hotfix/HMIReconnectionSupport' into release/4.0.0
Diffstat (limited to 'src/3rd_party-static')
5 files changed, 48 insertions, 9 deletions
diff --git a/src/3rd_party-static/MessageBroker/include/CMessageBroker.hpp b/src/3rd_party-static/MessageBroker/include/CMessageBroker.hpp index 4de9022ae1..952b250aee 100644 --- a/src/3rd_party-static/MessageBroker/include/CMessageBroker.hpp +++ b/src/3rd_party-static/MessageBroker/include/CMessageBroker.hpp @@ -69,6 +69,11 @@ namespace NsMessageBroker */ void Test(); + /** + * @brief OnSocketClosed should be called if socked is closed by HMI + * @param fd socket descriptor + */ + void OnSocketClosed(const int fd); /** * \brief Starts MessageBroker. diff --git a/src/3rd_party-static/MessageBroker/include/CMessageBrokerRegistry.hpp b/src/3rd_party-static/MessageBroker/include/CMessageBrokerRegistry.hpp index 81d7f79c78..55550eab3a 100644 --- a/src/3rd_party-static/MessageBroker/include/CMessageBrokerRegistry.hpp +++ b/src/3rd_party-static/MessageBroker/include/CMessageBrokerRegistry.hpp @@ -46,6 +46,12 @@ namespace NsMessageBroker void deleteController(std::string name); /** + * \brief Remove all controllers by descriptor + * \param fd descriptor + */ + void removeControllersByDescriptor(const int fd); + + /** * \brief adds notification subscriber to the registry. * \param fd file descriptor of controller. * \param name name of property which should be observed. diff --git a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBroker.cpp b/src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBroker.cpp index 127d568ffc..07f01ea128 100644 --- a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBroker.cpp +++ b/src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBroker.cpp @@ -301,7 +301,8 @@ void CMessageBroker::onMessageReceived(int fd, std::string& aJSONData) { return; } std::string wmes = p->m_recieverWriter.write(root); - DBG_MSG(("Parsed JSON string:%s; length: %d\n", wmes.c_str(), wmes.length())); + DBG_MSG(("Parsed JSON string %d : %s\n", wmes.length(), + wmes.c_str())); DBG_MSG(("Buffer is:%s\n", aJSONData.c_str())); if (aJSONData.length() > wmes.length()) { // wmes string length can differ from buffer substr length @@ -344,6 +345,13 @@ void CMessageBroker::Test() { } } +void CMessageBroker::OnSocketClosed(const int fd) { + DBG_MSG(("CMessageBroker::OnSocketClosed(%d)\n", fd)); + if (p->mpRegistry) { + p->mpRegistry->removeControllersByDescriptor(fd); + } +} + void CMessageBroker::startMessageBroker(CSender* pSender) { DBG_MSG(("CMessageBroker::startMessageBroker()\n")); p->mpSender = pSender; @@ -663,7 +671,7 @@ void CMessageBroker_Private::processError(CMessage* pMessage) { } void CMessageBroker_Private::sendJsonMessage(int fd, Json::Value message) { - DBG_MSG(("CMessageBroker::sendJsonMessage()\n")); + DBG_MSG(("CMessageBroker::sendJsonMessage(%d)\n", fd)); if (mpSender) { std::string mes = m_writer.write(message); int retVal = mpSender->Send(fd, mes); diff --git a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBrokerRegistry.cpp b/src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBrokerRegistry.cpp index 169a3a7a4a..2d55cecd67 100644 --- a/src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBrokerRegistry.cpp +++ b/src/3rd_party-static/MessageBroker/src/lib_messagebroker/CMessageBrokerRegistry.cpp @@ -69,6 +69,19 @@ namespace NsMessageBroker DBG_MSG(("Count of controllers: %d\n", mControllersList.size())); } + void CMessageBrokerRegistry::removeControllersByDescriptor(const int fd) { + DBG_MSG(("CMessageBrokerRegistry::removeControllersByDescriptor(%d)\n", + fd)); + std::map <std::string, int>::iterator it = mControllersList.begin(); + while(it != mControllersList.end()) { + if (it->second == fd) { + deleteController((it++)->first); + } else { + ++it; + } + } + } + bool CMessageBrokerRegistry::addSubscriber(int fd, std::string name) { DBG_MSG(("CMessageBrokerRegistry::addSubscriber()\n")); diff --git a/src/3rd_party-static/MessageBroker/src/server/mb_tcpserver.cpp b/src/3rd_party-static/MessageBroker/src/server/mb_tcpserver.cpp index 9756445ac0..ca27502b9c 100644 --- a/src/3rd_party-static/MessageBroker/src/server/mb_tcpserver.cpp +++ b/src/3rd_party-static/MessageBroker/src/server/mb_tcpserver.cpp @@ -43,8 +43,11 @@ ssize_t TcpServer::Send(int fd, const std::string& data) { int bytesToSend = rep.length(); const char* ptrBuffer = rep.c_str(); do { - int retVal = send(fd, ptrBuffer, bytesToSend, 0); + int retVal = send(fd, ptrBuffer, bytesToSend, MSG_NOSIGNAL); if (retVal == -1) { + if (EPIPE == errno) { + m_purge.push_back(fd); + } return -1; } bytesToSend -= retVal; @@ -54,23 +57,24 @@ ssize_t TcpServer::Send(int fd, const std::string& data) { } bool TcpServer::Recv(int fd) { - DBG_MSG(("TcpServer::Recv(int fd)\n")); + DBG_MSG(("TcpServer::Recv(%d)\n", fd)); ssize_t nb = -1; std::string* pReceivingBuffer = getBufferFor(fd); std::vector<char> buf; buf.reserve(RECV_BUFFER_LENGTH + pReceivingBuffer->size()); - DBG_MSG(("Left in pReceivingBuffer: %d : %s\n", - pReceivingBuffer->size(), pReceivingBuffer->c_str())); + DBG_MSG(("Left in pReceivingBuffer: %d \n", + pReceivingBuffer->size())); buf.assign(pReceivingBuffer->c_str(), pReceivingBuffer->c_str() + pReceivingBuffer->size()); buf.resize(RECV_BUFFER_LENGTH + pReceivingBuffer->size()); - nb = recv(fd, &buf[pReceivingBuffer->size()], MAX_RECV_DATA, 0); + ssize_t received_bytes = recv(fd, &buf[pReceivingBuffer->size()], MAX_RECV_DATA, 0); + nb = received_bytes; DBG_MSG(("Recieved %d from %d\n", nb, fd)); nb += pReceivingBuffer->size(); DBG_MSG(("Recieved with buffer %d from %d\n", nb, fd)); - if (nb > 0) { + if (received_bytes > 0) { unsigned int recieved_data = nb; if (isWebSocket(fd)) { const unsigned int data_length = @@ -126,6 +130,8 @@ bool TcpServer::Recv(int fd) { return true; } else { + DBG_MSG(("Received %d bytes from %d; error = %d\n", + received_bytes, fd, errno)); m_purge.push_back(fd); return false; } @@ -222,8 +228,9 @@ void TcpServer::WaitMessage(uint32_t ms) { itr = m_receivingBuffers.find((*it)); if (itr != m_receivingBuffers.end()) { // delete receiving buffer of disconnected client - delete(*itr).second; + delete itr->second; m_receivingBuffers.erase(itr); + mpMessageBroker->OnSocketClosed(itr->first); } } |