/* * InformationManager.cpp * * Copyright (C) 2008 Matthias Schiffer * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "InformationManager.h" #include "Requests/DaemonListRequest.h" #include #include #include #include namespace Mad { namespace Client { Common::SingletonPtr InformationManager::informationManager; void InformationManager::DaemonStateUpdateRequest::handlePacket(Net::Connection *connection, const Net::Packet &packet) { if(packet.getType() != Net::Packet::DAEMON_STATE_UPDATE) { Common::Logger::log(Common::Logger::ERROR, "Received an unexpected packet."); connection->send(Net::Packets::ErrorPacket(Net::Packet::ERROR, packet.getRequestId(), Common::Exception(Common::Exception::UNEXPECTED_PACKET))); signalFinished().emit(); return; } // TODO Require authentication Net::Packets::HostStatePacket hostStatePacket(packet); std::map::iterator host = informationManager.get()->daemons.find(hostStatePacket.getName()); if(host != informationManager.get()->daemons.end()) host->second.setState(hostStatePacket.getState()); else Common::Logger::log(Common::Logger::WARNING, "Received a state update for an unknown host."); connection->send(Net::Packet(Net::Packet::OK, packet.getRequestId())); signalFinished().emit(); } InformationManager::InformationManager() : updating(false) { Common::RequestManager::get()->registerPacketType(Net::Packet::DAEMON_STATE_UPDATE); } InformationManager::~InformationManager() { Common::RequestManager::get()->unregisterPacketType(Net::Packet::DAEMON_STATE_UPDATE); } void InformationManager::updateDaemonList(Net::Connection *con) { if(updating) return; Common::RequestManager::get()->sendRequest(con, std::auto_ptr( new Requests::DaemonListRequest(sigc::mem_fun(this, &InformationManager::daemonListRequestFinished)) ) ); updating = true; } void InformationManager::daemonListRequestFinished(const Common::Request &request) { try { const std::vector &hostInfo = request.getResult().getHostInfo(); for(std::vector::const_iterator daemon = hostInfo.begin(); daemon != hostInfo.end(); ++daemon) { daemons.clear(); daemons.insert(std::make_pair(daemon->getName(), *daemon)); } } catch(Common::Exception &e) { Common::Logger::logf(Common::Logger::CRITICAL, "Host list request failed: %s", e.strerror().c_str()); } updating = false; } } }