summaryrefslogtreecommitdiff
path: root/src/3rd_party-static/message_broker/src/lib_messagebroker/CMessageBrokerRegistry.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rd_party-static/message_broker/src/lib_messagebroker/CMessageBrokerRegistry.cpp')
-rw-r--r--src/3rd_party-static/message_broker/src/lib_messagebroker/CMessageBrokerRegistry.cpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/src/3rd_party-static/message_broker/src/lib_messagebroker/CMessageBrokerRegistry.cpp b/src/3rd_party-static/message_broker/src/lib_messagebroker/CMessageBrokerRegistry.cpp
new file mode 100644
index 0000000000..fb24d08f1c
--- /dev/null
+++ b/src/3rd_party-static/message_broker/src/lib_messagebroker/CMessageBrokerRegistry.cpp
@@ -0,0 +1,191 @@
+/**
+ * \file CMessageBrokerRegistry.cpp
+ * \brief CMessageBrokerRegistry singletone class implementation.
+ * \author AKara
+ */
+
+#include "CMessageBrokerRegistry.hpp"
+#include "libMBDebugHelper.h"
+
+#include <vector>
+#include <string>
+
+namespace NsMessageBroker
+{
+ CMessageBrokerRegistry::CMessageBrokerRegistry()
+ {
+ }
+
+ CMessageBrokerRegistry::~CMessageBrokerRegistry()
+ {
+ }
+
+ CMessageBrokerRegistry* CMessageBrokerRegistry::getInstance()
+ {
+ static CMessageBrokerRegistry instance;
+ return &instance;
+ }
+
+ bool CMessageBrokerRegistry::addController(int fd, std::string name)
+ {
+ DBG_MSG(("CMessageBrokerRegistry::addController()\n"));
+ bool result = false;
+ std::map <std::string, int>::iterator it;
+
+ sync_primitives::AutoLock lock(mControllersListLock);
+ it = mControllersList.find(name);
+ if (it == mControllersList.end())
+ {
+ mControllersList.insert(std::map <std::string, int>::value_type(name, fd));
+ result = true;
+ } else
+ {
+ DBG_MSG(("Controller already exists!\n"));
+ }
+
+ DBG_MSG(("Count of controllers: %d\n", mControllersList.size()));
+ return result;
+ }
+
+ void CMessageBrokerRegistry::deleteController(std::string name)
+ {
+ DBG_MSG(("CMessageBrokerRegistry::deleteController()\n"));
+ std::map <std::string, int>::iterator it;
+
+ int fd;
+ {
+ sync_primitives::AutoLock lock(mControllersListLock);
+ it = mControllersList.find(name);
+ if (it != mControllersList.end())
+ {
+ fd = it->second;
+ mControllersList.erase(it);
+ } else {
+ DBG_MSG(("No such controller in the list!\n"));
+ return;
+ }
+ DBG_MSG(("Count of controllers: %d\n", mControllersList.size()));
+ }
+ removeSubscribersByDescriptor(fd);
+ }
+
+ void CMessageBrokerRegistry::removeControllersByDescriptor(const int fd) {
+ DBG_MSG(("CMessageBrokerRegistry::removeControllersByDescriptor(%d)\n",
+ fd));
+ {
+ sync_primitives::AutoLock lock(mControllersListLock);
+ std::map <std::string, int>::iterator it = mControllersList.begin();
+ for (; it != mControllersList.end();) {
+ if (it->second == fd) {
+ mControllersList.erase(it++);
+ } else {
+ ++it;
+ }
+ }
+ }
+ removeSubscribersByDescriptor(fd);
+ }
+
+ void CMessageBrokerRegistry::removeSubscribersByDescriptor(const int fd) {
+ DBG_MSG(("CMessageBrokerRegistry::removeSubscribersByDescriptor(%d)\n",
+ fd));
+ sync_primitives::AutoLock lock(mSubscribersListLock);
+ std::multimap <std::string, int>::iterator it_s = mSubscribersList.begin();
+ for (; it_s !=mSubscribersList.end(); ) {
+ if (it_s->second == fd) {
+ mSubscribersList.erase(it_s++);
+ } else {
+ ++it_s;
+ }
+ }
+ }
+
+ bool CMessageBrokerRegistry::addSubscriber(int fd, std::string name)
+ {
+ DBG_MSG(("CMessageBrokerRegistry::addSubscriber()\n"));
+ bool result = true;
+
+ sync_primitives::AutoLock lock(mSubscribersListLock);
+ std::pair<std::multimap <std::string, int>::iterator, std::multimap <std::string, int>::iterator> p = mSubscribersList.equal_range(name);
+ if (p.first != p.second)
+ {
+ std::multimap <std::string, int>::iterator itr;
+ for (itr = p.first; itr != p.second; itr++)
+ {
+ if (fd == itr->second)
+ {
+ result = false;
+ DBG_MSG(("Subscriber already exists!\n"));
+ }
+ }
+ }
+ if (result)
+ {
+ mSubscribersList.insert(std::map <std::string, int>::value_type(name, fd));
+ }
+
+ DBG_MSG(("Count of subscribers: %d\n", mSubscribersList.size()));
+ return result;
+ }
+
+ void CMessageBrokerRegistry::deleteSubscriber(int fd, std::string name)
+ {
+ DBG_MSG(("CMessageBrokerRegistry::deleteSubscriber()\n"));
+
+ sync_primitives::AutoLock lock(mSubscribersListLock);
+ std::pair<std::multimap <std::string, int>::iterator, std::multimap <std::string, int>::iterator> p = mSubscribersList.equal_range(name);
+ if (p.first != p.second) {
+ std::multimap <std::string, int>::iterator itr;
+ for (itr = p.first; itr != p.second; ) {
+ DBG_MSG(("My for loop %s, %d", itr->first.c_str() ,itr->second));
+ if (fd == itr->second) {
+ mSubscribersList.erase(itr++);
+ } else {
+ ++itr;
+ }
+ }
+ }
+
+ DBG_MSG(("Count of subscribers: %d\n", mSubscribersList.size()));
+ }
+
+ int CMessageBrokerRegistry::getDestinationFd(std::string name)
+ {
+ DBG_MSG(("CMessageBrokerRegistry::getDestinationFd()\n"));
+ int result = -1;
+ std::map <std::string, int>::iterator it;
+
+ sync_primitives::AutoLock lock(mControllersListLock);
+ it = mControllersList.find(name);
+ if (it != mControllersList.end())
+ {
+ result = it->second;
+ }
+
+ DBG_MSG(("Controllers Fd: %d\n", result));
+ return result;
+ }
+
+ int CMessageBrokerRegistry::getSubscribersFd(std::string name, std::vector<int>& result)
+ {
+ DBG_MSG(("CMessageBrokerRegistry::getSubscribersFd()\n"));
+ int res = 0;
+ std::map <std::string, int>::iterator it;
+
+ sync_primitives::AutoLock lock(mSubscribersListLock);
+ std::pair<std::multimap <std::string, int>::iterator, std::multimap <std::string, int>::iterator> p = mSubscribersList.equal_range(name);
+ if (p.first != p.second)
+ {
+ std::multimap <std::string, int>::iterator itr;
+ for (itr = p.first; itr != p.second; itr++)
+ {
+ result.push_back(itr->second);
+ DBG_MSG(("Controllers Fd: %d\n", itr->second));
+ }
+ }
+
+ res = result.size();
+ DBG_MSG(("Result vector size: %d\n", res));
+ return res;
+ }
+} /* namespace NsMessageBroker */