summaryrefslogtreecommitdiffstats
path: root/src/Client
diff options
context:
space:
mode:
Diffstat (limited to 'src/Client')
-rw-r--r--src/Client/InformationManager.cpp33
-rw-r--r--src/Client/InformationManager.h26
2 files changed, 35 insertions, 24 deletions
diff --git a/src/Client/InformationManager.cpp b/src/Client/InformationManager.cpp
index 8a3227c..1d54498 100644
--- a/src/Client/InformationManager.cpp
+++ b/src/Client/InformationManager.cpp
@@ -28,7 +28,7 @@
namespace Mad {
namespace Client {
-std::auto_ptr<InformationManager> InformationManager::informationManager;
+InformationManager InformationManager::informationManager;
void InformationManager::DaemonStateUpdateRequest::handlePacket(Net::Connection *connection, const Net::Packet &packet) {
@@ -44,8 +44,8 @@ void InformationManager::DaemonStateUpdateRequest::handlePacket(Net::Connection
Net::Packets::HostStatePacket hostStatePacket(packet);
- std::map<std::string, Common::HostInfo>::iterator host = informationManager->daemons.find(hostStatePacket.getName());
- if(host != informationManager->daemons.end())
+ std::map<std::string, Common::HostInfo>::iterator host = informationManager.daemons.find(hostStatePacket.getName());
+ if(host != informationManager.daemons.end())
host->second.setState(hostStatePacket.getState());
else
Common::Logger::log(Common::Logger::WARNING, "Received a state update for an unknown host.");
@@ -56,20 +56,29 @@ void InformationManager::DaemonStateUpdateRequest::handlePacket(Net::Connection
}
-InformationManager::InformationManager(Net::Connection *connection) : initFinished(false) {
- Common::RequestManager::getRequestManager()->sendRequest(connection,
- std::auto_ptr<Common::RequestBase>(
- new Requests::DaemonListRequest(sigc::mem_fun(this, &InformationManager::daemonListRequestFinished))
- )
- );
+void InformationManager::doInit() {
+ Common::RequestManager::getRequestManager()->init();
Common::RequestManager::getRequestManager()->registerPacketType<DaemonStateUpdateRequest>(Net::Packet::DAEMON_STATE_UPDATE);
}
-InformationManager::~InformationManager() {
+void InformationManager::doUninit() {
Common::RequestManager::getRequestManager()->unregisterPacketType(Net::Packet::DAEMON_STATE_UPDATE);
}
+void InformationManager::updateDaemonList(Net::Connection *con) {
+ if(updating)
+ return;
+
+ Common::RequestManager::getRequestManager()->sendRequest(con,
+ std::auto_ptr<Common::RequestBase>(
+ new Requests::DaemonListRequest(sigc::mem_fun(this, &InformationManager::daemonListRequestFinished))
+ )
+ );
+
+ updating = true;
+}
+
void InformationManager::daemonListRequestFinished(const Common::Request<Net::Packets::HostListPacket> &request) {
try {
const std::vector<Common::HostInfo> &hostInfo = request.getResult().getHostInfo();
@@ -78,12 +87,12 @@ void InformationManager::daemonListRequestFinished(const Common::Request<Net::Pa
daemons.clear();
daemons.insert(std::make_pair(daemon->getName(), *daemon));
}
-
- initFinished = true;
}
catch(Common::Exception &e) {
Common::Logger::logf(Common::Logger::CRITICAL, "Host list request failed: %s", e.strerror().c_str());
}
+
+ updating = false;
}
}
diff --git a/src/Client/InformationManager.h b/src/Client/InformationManager.h
index bf2d67a..739c359 100644
--- a/src/Client/InformationManager.h
+++ b/src/Client/InformationManager.h
@@ -24,6 +24,7 @@
#include <memory>
#include <Common/HostInfo.h>
+#include <Common/Initializable.h>
#include <Common/Request.h>
namespace Mad {
@@ -39,7 +40,7 @@ class HostListPacket;
namespace Client {
-class InformationManager {
+class InformationManager : public Common::Initializable {
private:
class DaemonStateUpdateRequest : public Common::RequestHandler {
protected:
@@ -49,32 +50,33 @@ class InformationManager {
DaemonStateUpdateRequest() {}
};
- static std::auto_ptr<InformationManager> informationManager;
+ static InformationManager informationManager;
std::map<std::string, Common::HostInfo> daemons;
- bool initFinished;
+
+ bool updating;
// Prevent shallow copy
InformationManager(const InformationManager &o);
InformationManager& operator=(const InformationManager &o);
- InformationManager(Net::Connection *connection);
+ InformationManager() : updating(false) {}
void daemonListRequestFinished(const Common::Request<Net::Packets::HostListPacket> &request);
- public:
- ~InformationManager();
+ protected:
+ virtual void doInit();
+ virtual void doUninit();
+ public:
static InformationManager* getInformationManager() {
- return informationManager.get();
+ return &informationManager;
}
- static void init(Net::Connection *connection) {
- informationManager = std::auto_ptr<InformationManager>(new InformationManager(connection));
- }
+ void updateDaemonList(Net::Connection *con);
- bool isInitialised() const {
- return initFinished;
+ bool isUpdating() const {
+ return updating;
}
const std::map<std::string, Common::HostInfo>& getDaemons() const {