summaryrefslogtreecommitdiffstats
path: root/src/Core/ConnectionManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Core/ConnectionManager.cpp')
-rw-r--r--src/Core/ConnectionManager.cpp44
1 files changed, 36 insertions, 8 deletions
diff --git a/src/Core/ConnectionManager.cpp b/src/Core/ConnectionManager.cpp
index 98288ba..78497e7 100644
--- a/src/Core/ConnectionManager.cpp
+++ b/src/Core/ConnectionManager.cpp
@@ -20,6 +20,7 @@
#include "ConnectionManager.h"
#include "ConfigManager.h"
#include "RequestHandlers/CoreStatusRequestHandler.h"
+#include "RequestHandlers/DaemonStatusRequestHandler.h"
#include "RequestHandlers/GSSAPIAuthRequestHandler.h"
#include <Net/ServerConnection.h>
#include <Net/Packet.h>
@@ -29,6 +30,9 @@
namespace Mad {
namespace Core {
+std::auto_ptr<ConnectionManager> ConnectionManager::connectionManager;
+
+
void ConnectionManager::refreshPollfds() {
pollfds.clear();
pollfdMap.clear();
@@ -53,15 +57,22 @@ void ConnectionManager::refreshPollfds() {
}
}
-ConnectionManager::ConnectionManager(const ConfigManager& configManager) : requestManager(true) {
- requestManager.registerPacketType<RequestHandlers::CoreStatusRequestHandler>(Net::Packet::CORE_STATUS);
- requestManager.registerPacketType<RequestHandlers::GSSAPIAuthRequestHandler>(Net::Packet::GSSAPI_AUTH);
+ConnectionManager::ConnectionManager() {
+ Common::RequestManager::init(true);
+
+ Common::RequestManager::getRequestManager()->registerPacketType<RequestHandlers::CoreStatusRequestHandler>(Net::Packet::CORE_STATUS);
+ Common::RequestManager::getRequestManager()->registerPacketType<RequestHandlers::DaemonStatusRequestHandler>(Net::Packet::DAEMON_STATUS);
+ Common::RequestManager::getRequestManager()->registerPacketType<RequestHandlers::GSSAPIAuthRequestHandler>(Net::Packet::GSSAPI_AUTH);
- const std::vector<Net::IPAddress> &listenerAddresses = configManager.getListenerAddresses();
+ ConfigManager *configManager = ConfigManager::getConfigManager();
+
+ Net::Connection::init();
+
+ const std::vector<Net::IPAddress> &listenerAddresses = configManager->getListenerAddresses();
if(listenerAddresses.empty()) {
try {
- listeners.push_back(new Net::Listener(configManager.getX509CertFile(), configManager.getX509KeyFile()));
+ listeners.push_back(new Net::Listener(configManager->getX509CertFile(), configManager->getX509KeyFile()));
}
catch(Net::Exception &e) {
// TODO Log error
@@ -70,7 +81,7 @@ ConnectionManager::ConnectionManager(const ConfigManager& configManager) : reque
else {
for(std::vector<Net::IPAddress>::const_iterator address = listenerAddresses.begin(); address != listenerAddresses.end(); ++address) {
try {
- listeners.push_back(new Net::Listener(configManager.getX509CertFile(), configManager.getX509KeyFile(), *address));
+ listeners.push_back(new Net::Listener(configManager->getX509CertFile(), configManager->getX509KeyFile(), *address));
}
catch(Net::Exception &e) {
// TODO Log error
@@ -79,6 +90,13 @@ ConnectionManager::ConnectionManager(const ConfigManager& configManager) : reque
}
refreshPollfds();
+
+ const std::vector<DaemonInfo>& daemons = configManager->getDaemonList();
+
+ for(std::vector<DaemonInfo>::const_iterator daemon = daemons.begin(); daemon != daemons.end(); ++daemon) {
+ daemonInfo.insert(std::make_pair(daemon->getName(), *daemon));
+ identifiedDaemonConnections.insert(std::make_pair<std::string,Net::ServerConnection*>(daemon->getName(), 0));
+ }
}
ConnectionManager::~ConnectionManager() {
@@ -87,6 +105,8 @@ ConnectionManager::~ConnectionManager() {
for(std::list<Net::ServerConnection*>::iterator con = clientConnections.begin(); con != clientConnections.end(); ++con)
delete *con;
+
+ Net::Connection::deinit();
}
void ConnectionManager::handleConnections(std::list<Net::ServerConnection*>& connections) {
@@ -100,7 +120,7 @@ void ConnectionManager::handleConnections(std::list<Net::ServerConnection*>& con
++con;
}
else {
- requestManager.unregisterConnection(*con);
+ Common::RequestManager::getRequestManager()->unregisterConnection(*con);
delete *con;
connections.erase(con++);
}
@@ -118,12 +138,20 @@ void ConnectionManager::run() {
while((con = (*listener)->getConnection(pollfdMap)) != 0) {
(con->isDaemonConnection() ? daemonConnections : clientConnections).push_back(con);
- requestManager.registerConnection(con);
+ Common::RequestManager::getRequestManager()->registerConnection(con);
}
}
refreshPollfds();
}
+Net::Connection* ConnectionManager::getDaemonConnection(const std::string &name) const {
+ std::map<std::string,Net::ServerConnection*>::const_iterator daemon = identifiedDaemonConnections.find(name);
+ if(daemon == identifiedDaemonConnections.end())
+ return 0;
+
+ return daemon->second;
+}
+
}
}