]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Server/src/server.cpp
- Se agrega la posibilidad de pausar una planta.
[z.facultad/75.42/plaqui.git] / Server / src / server.cpp
index 4247d9124297fda8dfbc22326379983da3ae8ee7..fac84190fd31f51a2b90667ccd0a93028b56b5de 100644 (file)
@@ -29,8 +29,9 @@
 #include "plaqui/server/connection.h"
 #include "plaqui/server/controlserver.h"
 #include <sigc++/class_slot.h>
 #include "plaqui/server/connection.h"
 #include "plaqui/server/controlserver.h"
 #include <sigc++/class_slot.h>
-// FIXME - sacar sstream (a menos que se necesite)
+#include <glibmm/timer.h>
 #include <sstream>
 #include <sstream>
+#include <exception>
 #ifdef DEBUG
 #      include "plaqui/server/string.h"
 #      include <iostream>
 #ifdef DEBUG
 #      include "plaqui/server/string.h"
 #      include <iostream>
@@ -44,55 +45,59 @@ namespace Server {
 
 Server::~Server(void) {
 #ifdef DEBUG
 
 Server::~Server(void) {
 #ifdef DEBUG
-       cerr << __FILE__ <<  ": destructor." << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               <<  ": destructor." << endl;
 #endif // DEBUG
 #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
 #ifdef DEBUG
-       cerr << __FILE__ <<  ": port = " << port << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               <<  ": port = " << port << endl;
 #endif // DEBUG
 #endif // DEBUG
-       // FIXME
+       // FIXME - hacer que se puedan cargar mas plantas bien.
        Glib::Mutex::Lock lock(plants_mutex);
        plants["default"] = new Plant(plant_filename);
        Glib::Mutex::Lock lock(plants_mutex);
        plants["default"] = new Plant(plant_filename);
-       plants["default"]->signal_finished().connect(
-                       SigC::bind<const char*>(
-                               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();
 }
 
        plants["default"]->run();
 }
 
-Connection* Server::new_connection(
-               const sockbuf::sockdesc& sd) {
+Connection* Server::new_connection(const sockbuf::sockdesc& sd) {
 #ifdef DEBUG
 #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);
        // TODO verificar si el new se hace bien? no creo.
                << endl;
 #endif // DEBUG
        ControlServer* connection = new ControlServer(sd);
        // TODO verificar si el new se hace bien? no creo.
-       connection->signal_command_received().connect(
-                       SigC::bind<ControlServer*>(
-                               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;
 }
 
        // TODO: 
        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
 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);
 #endif // DEBUG
        Glib::Mutex::Lock lock(plants_mutex);
        plants.erase(plant);
@@ -102,7 +107,8 @@ void Server::on_plant_finished(const char* plant) {
 void Server::on_control_command_received(const Command& command,
                ControlServer* controlserver) {
 #ifdef DEBUG
 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;
                << command.get_target() << ", command = " << command.get_command()
                << ", args = [" << String::join(command.get_args(), ", ") << "])"
                << endl;
@@ -113,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") {
                if (command.get_command() == "status") {
                        response = cmd_server_status();
                } else if (command.get_command() == "stop") {
-                       finish();
                        response = new HTTPResponse(HTTPMessage::OK,
                                        "<response desc=\"El server se apagará en instantes...\" />");
                        response = new HTTPResponse(HTTPMessage::OK,
                                        "<response desc=\"El server se apagará en instantes...\" />");
+                       // 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,
                                        "<response desc=\"Invalid command for 'server' taget!\" />");
                } else {
                        response = new HTTPResponse(HTTPMessage::NOT_FOUND,
                                        "<response desc=\"Invalid command for 'server' taget!\" />");
@@ -147,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);
                        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 {
                } else if (command.get_command() == "stop") {
                        response = cmd_plant_stop(command);
                } else {
@@ -173,7 +189,7 @@ HTTPResponse* Server::cmd_server_status(void) const {
        // FIXME
        stringstream xml;
        xml << "<serverstatus>" << endl;
        // FIXME
        stringstream xml;
        xml << "<serverstatus>" << endl;
-       xml << "\t<version>0.9</version>" << endl;
+       xml << "\t<version>" VERSION "</version>" << endl;
        xml << "\t<authors>" << endl;
        xml << "\t\t<author>Nicolás Dimov</author>" << endl;
        xml << "\t\t<author>Leandro Lucarella</author>" << endl;
        xml << "\t<authors>" << endl;
        xml << "\t\t<author>Nicolás Dimov</author>" << endl;
        xml << "\t\t<author>Leandro Lucarella</author>" << endl;
@@ -313,6 +329,7 @@ HTTPResponse* Server::cmd_plant_get(const Command& command) {
                return new HTTPResponse(HTTPMessage::NOT_FOUND,
                                string("<response desc=\"No existe la planta ") + plant + "\" />");
        }
                return new HTTPResponse(HTTPMessage::NOT_FOUND,
                                string("<response desc=\"No existe la planta ") + plant + "\" />");
        }
+       // TODO try/catch?
        string xml = plants[plant]->get_xml();
        if (xml.length()) {
                return new HTTPResponse(HTTPMessage::OK, xml);
        string xml = plants[plant]->get_xml();
        if (xml.length()) {
                return new HTTPResponse(HTTPMessage::OK, xml);
@@ -355,6 +372,40 @@ HTTPResponse* Server::cmd_plant_set(const Command& command) {
                        string("<response desc=\"Se cambió el estado del elemento '") + element + "'.\" />");
 }
 
                        string("<response desc=\"Se cambió el estado del elemento '") + element + "'.\" />");
 }
 
+HTTPResponse* Server::cmd_plant_set_frequency(const Command& command) {
+       if (command.get_args().size() < 2) {
+               return new HTTPResponse(HTTPMessage::CONFLICT,
+                               "<response desc=\"Faltan argumentos.\" />");
+       }
+       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("<response desc=\"No existe la planta ") + name + "\" />");
+       }
+       unsigned hz;
+       to(command.get_args()[1], hz);
+       plants[name]->set_frequency(hz);
+       return new HTTPResponse(HTTPMessage::OK,
+                       string("<response desc=\"La planta '") + name + "' fue pausada.\" />");
+}
+
+HTTPResponse* Server::cmd_plant_start(const Command& command) {
+       if (!command.get_args().size()) {
+               return new HTTPResponse(HTTPMessage::CONFLICT,
+                               "<response desc=\"Faltan argumentos.\" />");
+       }
+       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("<response desc=\"No existe la planta ") + name + "\" />");
+       }
+       plants[name]->set_paused(false);
+       return new HTTPResponse(HTTPMessage::OK,
+                       string("<response desc=\"La planta '") + name + "' fue reanudada.\" />");
+}
+
 HTTPResponse* Server::cmd_plant_stop(const Command& command) {
        if (!command.get_args().size()) {
                return new HTTPResponse(HTTPMessage::CONFLICT,
 HTTPResponse* Server::cmd_plant_stop(const Command& command) {
        if (!command.get_args().size()) {
                return new HTTPResponse(HTTPMessage::CONFLICT,
@@ -366,7 +417,22 @@ HTTPResponse* Server::cmd_plant_stop(const Command& command) {
                return new HTTPResponse(HTTPMessage::NOT_FOUND,
                                string("<response desc=\"No existe la planta ") + name + "\" />");
        }
                return new HTTPResponse(HTTPMessage::NOT_FOUND,
                                string("<response desc=\"No existe la planta ") + name + "\" />");
        }
-       // TODO Ver si al frenar la planta se destruye (no deberia!!!)
+       plants[name]->set_paused(true);
+       return new HTTPResponse(HTTPMessage::OK,
+                       string("<response desc=\"La planta '") + name + "' fue pausada.\" />");
+}
+
+HTTPResponse* Server::cmd_plant_remove(const Command& command) {
+       if (!command.get_args().size()) {
+               return new HTTPResponse(HTTPMessage::CONFLICT,
+                               "<response desc=\"Faltan argumentos.\" />");
+       }
+       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("<response desc=\"No existe la planta ") + name + "\" />");
+       }
        plants[name]->finish();
        return new HTTPResponse(HTTPMessage::OK,
                        string("<response desc=\"La planta '") + name + "' se cerrará en instantes...\" />");
        plants[name]->finish();
        return new HTTPResponse(HTTPMessage::OK,
                        string("<response desc=\"La planta '") + name + "' se cerrará en instantes...\" />");