X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/7e74b790d290cd7d776349503bb361c47933c01f..9317ed8f3f8241a30fd09b6800ff96b2ac138747:/Server/src/server.cpp diff --git a/Server/src/server.cpp b/Server/src/server.cpp index 340c2f0..fac8419 100644 --- a/Server/src/server.cpp +++ b/Server/src/server.cpp @@ -29,6 +29,7 @@ #include "plaqui/server/connection.h" #include "plaqui/server/controlserver.h" #include +#include #include #include #ifdef DEBUG @@ -47,10 +48,19 @@ Server::~Server(void) { 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(); } } @@ -60,13 +70,12 @@ Server::Server(const string& plant_filename, const Connection::Port& port) 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( - SigC::bind( - SigC::slot_class(*this, &Server::on_plant_finished), - "default")); + plants["default"]->signal_finished().connect(SigC::bind( + SigC::slot_class(*this, &Server::on_plant_finished), + "default")); plants["default"]->run(); } @@ -78,10 +87,9 @@ Connection* Server::new_connection(const sockbuf::sockdesc& sd) { #endif // DEBUG ControlServer* connection = new ControlServer(sd); // TODO verificar si el new se hace bien? no creo. - connection->signal_command_received().connect( - SigC::bind( - SigC::slot_class(*this, &Server::on_control_command_received), - connection)); + connection->signal_command_received().connect(SigC::bind( + SigC::slot_class(*this, &Server::on_control_command_received), + connection)); // TODO: return connection; } @@ -111,9 +119,15 @@ void Server::on_control_command_received(const Command& command, if (command.get_command() == "status") { response = cmd_server_status(); } else if (command.get_command() == "stop") { - finish(); response = new HTTPResponse(HTTPMessage::OK, ""); + // XXX - Sin mandar la respuesta enseguida podría ser que el server + // cierre la conexión antes de mandar la respuesta. + //response->headers["Content-Type"] = "text/xml; charset=iso-8859-1"; + //controlserver->send(*response); + //delete response; + finish(); + //return; } else { response = new HTTPResponse(HTTPMessage::NOT_FOUND, ""); @@ -145,6 +159,10 @@ void Server::on_control_command_received(const Command& command, response = cmd_plant_get(command); } else if (command.get_command() == "set") { response = cmd_plant_set(command); + } else if (command.get_command() == "set_frequency") { + response = cmd_plant_set_frequency(command); + } else if (command.get_command() == "start") { + response = cmd_plant_start(command); } else if (command.get_command() == "stop") { response = cmd_plant_stop(command); } else { @@ -354,6 +372,40 @@ HTTPResponse* Server::cmd_plant_set(const Command& command) { string(""); } +HTTPResponse* Server::cmd_plant_set_frequency(const Command& command) { + if (command.get_args().size() < 2) { + return new HTTPResponse(HTTPMessage::CONFLICT, + ""); + } + Glib::Mutex::Lock lock(plants_mutex); + const string name = command.get_args()[0]; + if (plants.find(name) == plants.end()) { + return new HTTPResponse(HTTPMessage::NOT_FOUND, + string(""); + } + unsigned hz; + to(command.get_args()[1], hz); + plants[name]->set_frequency(hz); + return new HTTPResponse(HTTPMessage::OK, + string(""); +} + +HTTPResponse* Server::cmd_plant_start(const Command& command) { + if (!command.get_args().size()) { + return new HTTPResponse(HTTPMessage::CONFLICT, + ""); + } + Glib::Mutex::Lock lock(plants_mutex); + const string name = command.get_args()[0]; + if (plants.find(name) == plants.end()) { + return new HTTPResponse(HTTPMessage::NOT_FOUND, + string(""); + } + plants[name]->set_paused(false); + return new HTTPResponse(HTTPMessage::OK, + string(""); +} + HTTPResponse* Server::cmd_plant_stop(const Command& command) { if (!command.get_args().size()) { return new HTTPResponse(HTTPMessage::CONFLICT, @@ -365,7 +417,22 @@ HTTPResponse* Server::cmd_plant_stop(const Command& command) { return new HTTPResponse(HTTPMessage::NOT_FOUND, string(""); } - // TODO Ver si al frenar la planta se destruye (no deberia!!!) + plants[name]->set_paused(true); + return new HTTPResponse(HTTPMessage::OK, + string(""); +} + +HTTPResponse* Server::cmd_plant_remove(const Command& command) { + if (!command.get_args().size()) { + return new HTTPResponse(HTTPMessage::CONFLICT, + ""); + } + Glib::Mutex::Lock lock(plants_mutex); + const string name = command.get_args()[0]; + if (plants.find(name) == plants.end()) { + return new HTTPResponse(HTTPMessage::NOT_FOUND, + string(""); + } plants[name]->finish(); return new HTTPResponse(HTTPMessage::OK, string("");