X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/c0e0cf58ce033421d125afb813636f102456592c..212f9ae5dc8899bab8b23ed13d81c28c510db3c3:/Server/src/server.cpp diff --git a/Server/src/server.cpp b/Server/src/server.cpp index 4247d91..e332866 100644 --- a/Server/src/server.cpp +++ b/Server/src/server.cpp @@ -29,8 +29,9 @@ #include "plaqui/server/connection.h" #include "plaqui/server/controlserver.h" #include -// FIXME - sacar sstream (a menos que se necesite) +#include #include +#include #ifdef DEBUG # include "plaqui/server/string.h" # include @@ -44,21 +45,32 @@ namespace Server { Server::~Server(void) { #ifdef DEBUG - cerr << __FILE__ << ": destructor." << endl; + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": destructor." << endl; #endif // DEBUG - // Termino plantas. - Glib::Mutex::Lock lock(plants_mutex); - for (PlantList::iterator i = plants.end(); i != plants.end(); i++) { - i->second->finish(true); + // Mando a terminar todas las plantas. + plants_mutex.lock(); + for (PlantList::iterator i = plants.begin(); i != plants.end(); i++) { + i->second->finish(); + } + PlantList::size_type count = plants.size(); + plants_mutex.unlock(); + // Espero que terminen realmente. + while (count) { + Glib::usleep(10000); // 10 milisegundos + plants_mutex.lock(); + count = plants.size(); + plants_mutex.unlock(); } } -Server::Server(const string& plant_filename, const Connection::Port& port): - TCPServer(port) { +Server::Server(const string& plant_filename, const Connection::Port& port) + throw(sockerr): TCPServer(port) { #ifdef DEBUG - cerr << __FILE__ << ": port = " << port << endl; + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": port = " << port << endl; #endif // DEBUG - // FIXME + // FIXME - hacer que se puedan cargar mas plantas bien. Glib::Mutex::Lock lock(plants_mutex); plants["default"] = new Plant(plant_filename); plants["default"]->signal_finished().connect( @@ -68,10 +80,10 @@ Server::Server(const string& plant_filename, const Connection::Port& port): plants["default"]->run(); } -Connection* Server::new_connection( - const sockbuf::sockdesc& sd) { +Connection* Server::new_connection(const sockbuf::sockdesc& sd) { #ifdef DEBUG - cerr << __FILE__ << ": new_connection(sd = " << sd.sock << ")" + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": new_connection(sd = " << sd.sock << ")" << endl; #endif // DEBUG ControlServer* connection = new ControlServer(sd); @@ -84,15 +96,10 @@ Connection* Server::new_connection( return connection; } -void Server::on_plant_updated(const Plant* plant) { -#ifdef DEBUG - cerr << __FILE__ << ": on_plant_updated(plant = " << plant << ")." << endl; -#endif // DEBUG -} - void Server::on_plant_finished(const char* plant) { #ifdef DEBUG - cerr << __FILE__ << ": on_plant_finished(plant_name = " << plant << endl; + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": on_plant_finished(plant_name = " << plant << endl; #endif // DEBUG Glib::Mutex::Lock lock(plants_mutex); plants.erase(plant); @@ -102,7 +109,8 @@ void Server::on_plant_finished(const char* plant) { void Server::on_control_command_received(const Command& command, ControlServer* controlserver) { #ifdef DEBUG - cerr << __FILE__ << ": on_control_command_received(target = " + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": on_control_command_received(target = " << command.get_target() << ", command = " << command.get_command() << ", args = [" << String::join(command.get_args(), ", ") << "])" << endl; @@ -116,6 +124,19 @@ void Server::on_control_command_received(const Command& command, finish(); response = new HTTPResponse(HTTPMessage::OK, ""); + response->headers["Content-Type"] = "text/xml; charset=iso-8859-1"; + controlserver->send(*response); + delete response; + // Creo una conexión suicida para que el accept() del server retorne + // el control y el server pueda terminar realmente. + try { + sockinetbuf suicida(sockbuf::sock_stream); + suicida.connect(socket.localhost(), socket.localport()); + } catch (...) { + // FIXME + signal_error().emit(12345, "ahhhh! no puedo crear conexion suicida"); + } + return; } else { response = new HTTPResponse(HTTPMessage::NOT_FOUND, ""); @@ -173,7 +194,7 @@ HTTPResponse* Server::cmd_server_status(void) const { // FIXME stringstream xml; xml << "" << endl; - xml << "\t0.9" << endl; + xml << "\t" VERSION "" << endl; xml << "\t" << endl; xml << "\t\tNicolás Dimov" << endl; xml << "\t\tLeandro Lucarella" << endl; @@ -313,6 +334,7 @@ HTTPResponse* Server::cmd_plant_get(const Command& command) { return new HTTPResponse(HTTPMessage::NOT_FOUND, string(""); } + // TODO try/catch? string xml = plants[plant]->get_xml(); if (xml.length()) { return new HTTPResponse(HTTPMessage::OK, xml);