1 #include <iostream> 2 3 #include "util/exception.h" 4 #include "util/thread.h" 5 6 #include "serverlist.h" 7 #include "config.h" 8 9 /* Static members. */ 10 std::vector<ServerPtr> ServerList::list; 11 12 /* ---------------------------------------------------------------- */ 13 14 class ServerChecker : public Thread 15 { 16 private: 17 std::vector<ServerPtr> server_list; 18 protected: 19 void* run (void); 20 public: 21 ServerChecker(std::vector<ServerPtr> const& server_list); 22 }; 23 24 /* ---------------------------------------------------------------- */ 25 ServerChecker(std::vector<ServerPtr> const & server_list)26ServerChecker::ServerChecker(std::vector<ServerPtr> const& server_list) 27 : server_list(server_list) 28 { 29 } 30 31 void* run(void)32ServerChecker::run (void) 33 { 34 35 for (unsigned int i = 0; i < this->server_list.size(); ++i) 36 { 37 ServerPtr server = this->server_list[i]; 38 try 39 { 40 if (!server->is_refreshing()) 41 server->refresh(); 42 } 43 catch (Exception& s) 44 { 45 std::cout << "Error getting server status: " << s << std::endl; 46 } 47 } 48 49 delete this; 50 return 0; 51 } 52 53 /* ================================================================ */ 54 55 void init_from_config(void)56ServerList::init_from_config (void) 57 { 58 ConfSectionPtr servers = Config::conf.get_section("servermonitor"); 59 for (conf_values_t::iterator iter = servers->values_begin(); 60 iter != servers->values_end(); iter++) 61 { 62 ServerList::add_server(iter->first.substr(2), **iter->second); 63 } 64 65 ConfValuePtr check = Config::conf.get_value("settings.startup_servercheck"); 66 if (check->get_bool()) 67 ServerList::refresh(); 68 } 69 70 /* ---------------------------------------------------------------- */ 71 72 void unload(void)73ServerList::unload (void) 74 { 75 ServerList::list.clear(); 76 } 77 78 /* ---------------------------------------------------------------- */ 79 80 void add_server(std::string const & name,std::string const & host,uint16_t port)81ServerList::add_server (std::string const& name, 82 std::string const& host, uint16_t port) 83 { 84 ServerPtr server = ServerPtr(new Server(name, host, port)); 85 ServerList::list.push_back(server); 86 } 87 88 /* ---------------------------------------------------------------- */ 89 90 void refresh(void)91ServerList::refresh (void) 92 { 93 /* Prevents the creation of a thread if not neccessary. */ 94 if (ServerList::list.size() == 0) 95 return; 96 97 //std::cout << "Refreshing servers..." << std::endl; 98 99 ServerChecker* checker = new ServerChecker(ServerList::list); 100 checker->pt_create(); 101 } 102