From c0e0cf58ce033421d125afb813636f102456592c Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Wed, 19 Nov 2003 02:29:49 +0000 Subject: [PATCH 1/1] - Se agrega el metodo Model::Simulator::set_open() para abrir y cerrar bombas y exclusas. - Se actualiza el server para usarlo y se implementa el comando /plant/set/. - Se limpia un poco mas las respuestas, ahora son todas (?) XML aunque no definitivas. --- Model/configure.in | 2 +- Model/include/simulator.h | 2 +- Model/src/simulator.cpp | 24 +++-- Server/include/plaqui/server/plant.h | 17 +++ Server/src/plant.cpp | 10 +- Server/src/server.cpp | 148 ++++++++++++++------------- 6 files changed, 124 insertions(+), 79 deletions(-) diff --git a/Model/configure.in b/Model/configure.in index 05d0532..f5454e5 100644 --- a/Model/configure.in +++ b/Model/configure.in @@ -10,7 +10,7 @@ AM_PROG_CC_STDC AC_HEADER_STDC PKG_CHECK_MODULES(PACKAGE, - xml2 >= 0.15.0 ) + libxml-2.0 >= 0.15.0 ) AC_SUBST(PACKAGE_CFLAGS) AC_SUBST(PACKAGE_LIBS) diff --git a/Model/include/simulator.h b/Model/include/simulator.h index cd68c05..3713776 100644 --- a/Model/include/simulator.h +++ b/Model/include/simulator.h @@ -50,7 +50,7 @@ public: /// Tipos de elementos enum {PUMP, UNION, SPLITTER, CONDUCT, EXCLUSA, TANK, DRAINAGE}; - bool pump_deactivate(const std::string &name); + bool set_open(const std::string &name, bool open = true); protected: // Los mantengo en listas separadas para ahorrar // CPU y no tener que usar dinamic_cast diff --git a/Model/src/simulator.cpp b/Model/src/simulator.cpp index 2d763fe..3aeacd6 100644 --- a/Model/src/simulator.cpp +++ b/Model/src/simulator.cpp @@ -158,17 +158,27 @@ IConector *Simulator::find(const std::string &name) return NULL; } -bool Simulator::pump_deactivate(const std::string &name) +bool Simulator::set_open(const std::string &name, bool open) { // Busco el elemento, usando RTTI :-( - Pump *pump = dynamic_cast(find(name)); - - if (!pump) { - // Ups!, "name" no era un Pump!!! + IConector *tmp = find(name); + Pump *p; + Exclusa *e; + if ((p = dynamic_cast(tmp))) { + if (open) { + p->activate(); + } else { + p->deactivate(); + } + } else if ((e = dynamic_cast(tmp))) { + if (open) { + e->open(); + } else { + e->close(); + } + } else { return false; } - pump->deactivate(); - return true; } void Simulator::loadBomba(xmlNodePtr nodo) diff --git a/Server/include/plaqui/server/plant.h b/Server/include/plaqui/server/plant.h index c6e64a6..89ee76f 100644 --- a/Server/include/plaqui/server/plant.h +++ b/Server/include/plaqui/server/plant.h @@ -62,6 +62,9 @@ namespace Server { /// Simulador usado para calcular el estado de la planta. Model::Simulator simulator; + /// Mutex para el simulador. + Glib::Mutex simulator_mutex; + /// Nombre del archivo donde esta el XML de la planta. std::string filename; @@ -105,6 +108,20 @@ namespace Server { bool transmission_stop(const string& host, const Connection::Port& port); + /** + * Abre (o cierra) un elemento de la planta. + * + * Sólo la bomba y la exclusa pueden ser abiertos y cerrados. + * + * \param element Nombre del elemento a abrir o cerrar. + * \param open true si se quiere abrir el elemento, false si se + * lo quiere cerrar. + * + * \return true si se abrió o cerró el elemento, false si no existía + * o si no era una bomba o exclusa. + */ + bool set_open(const std::string& element, bool open = true); + /** * Obtiene el XML de la planta. */ diff --git a/Server/src/plant.cpp b/Server/src/plant.cpp index 69ce671..e46e692 100644 --- a/Server/src/plant.cpp +++ b/Server/src/plant.cpp @@ -76,12 +76,15 @@ void Plant::real_run(void) { cerr << __FILE__ << ": real_run." << endl; #endif // DEBUG while (!stop) { + simulator_mutex.lock(); simulator.simulate(); - Glib::Mutex::Lock lock(transmissions_mutex); + simulator_mutex.unlock(); + transmissions_mutex.lock(); for (TransmitterList::iterator i = transmissions.begin(); i != transmissions.end(); i++) { (*i)->send(simulator.get_state_as_xml()); } + transmissions_mutex.unlock(); Glib::usleep(1000000); } } @@ -119,6 +122,11 @@ bool Plant::transmission_stop(const string& host, return false; // No la encontró. } +bool Plant::set_open(const std::string& element, bool open) { + Glib::Mutex::Lock lock(simulator_mutex); + return simulator.set_open(element, open); +} + const string Plant::get_xml(void) const { ostringstream oss; try { diff --git a/Server/src/server.cpp b/Server/src/server.cpp index 8f76922..4247d91 100644 --- a/Server/src/server.cpp +++ b/Server/src/server.cpp @@ -115,10 +115,10 @@ void Server::on_control_command_received(const Command& command, } else if (command.get_command() == "stop") { finish(); response = new HTTPResponse(HTTPMessage::OK, - "El server se apagará en instantes..."); + ""); } else { response = new HTTPResponse(HTTPMessage::NOT_FOUND, - "Invalid command for 'server' taget!"); + ""); } } else if (command.get_target() == "connection") { if (command.get_command() == "list") { @@ -127,7 +127,7 @@ void Server::on_control_command_received(const Command& command, response = cmd_connection_stop(command); } else { response = new HTTPResponse(HTTPMessage::NOT_FOUND, - "Invalid command for 'connection' taget!"); + ""); } } else if (command.get_target() == "transmission") { if (command.get_command() == "list") { @@ -138,7 +138,7 @@ void Server::on_control_command_received(const Command& command, response = cmd_transmission_stop(command); } else { response = new HTTPResponse(HTTPMessage::NOT_FOUND, - "Invalid command for 'transmission' taget!"); + ""); } } else if (command.get_target() == "plant") { if (command.get_command() == "list") { @@ -151,10 +151,11 @@ void Server::on_control_command_received(const Command& command, response = cmd_plant_stop(command); } else { response = new HTTPResponse(HTTPMessage::NOT_FOUND, - "Invalid command for 'plant' taget!"); + ""); } } else { - response = new HTTPResponse(HTTPMessage::NOT_FOUND, "Invalid taget!"); + response = new HTTPResponse(HTTPMessage::NOT_FOUND, + ""); } // FIXME response->headers["Content-Type"] = "text/xml; charset=iso-8859-1"; @@ -170,32 +171,32 @@ void Server::on_control_command_received(const Command& command, HTTPResponse* Server::cmd_server_status(void) const { // FIXME - stringstream response_xml; - response_xml << "" << endl; - response_xml << "\t0.9" << endl; - response_xml << "\t" << endl; - response_xml << "\t\tNicolás Dimov" << endl; - response_xml << "\t\tLeandro Lucarella" << endl; - response_xml << "\t\tRicardo Markiewicz" << endl; - response_xml << "\t" << endl; - response_xml << "" << endl; - return new HTTPResponse(HTTPMessage::OK, response_xml.str()); + stringstream xml; + xml << "" << endl; + xml << "\t0.9" << endl; + xml << "\t" << endl; + xml << "\t\tNicolás Dimov" << endl; + xml << "\t\tLeandro Lucarella" << endl; + xml << "\t\tRicardo Markiewicz" << endl; + xml << "\t" << endl; + xml << "" << endl; + return new HTTPResponse(HTTPMessage::OK, xml.str()); } HTTPResponse* Server::cmd_connection_list(void) { // FIXME TCPServer::ConnectionInfoList cil = get_connected(); - stringstream response_xml; - response_xml << "" << endl; + stringstream xml; + xml << "" << endl; for (TCPServer::ConnectionInfoList::const_iterator i = cil.begin(); i != cil.end(); i++) { - response_xml << "\t" << endl; - response_xml << "\t\t" << i->host << "" << endl; - response_xml << "\t\t" << i->port << "" << endl; - response_xml << "\t" << endl; + xml << "\t" << endl; + xml << "\t\t" << i->host << "" << endl; + xml << "\t\t" << i->port << "" << endl; + xml << "\t" << endl; } - response_xml << "" << endl; - return new HTTPResponse(HTTPMessage::OK, response_xml.str()); + xml << "" << endl; + return new HTTPResponse(HTTPMessage::OK, xml.str()); } HTTPResponse* Server::cmd_connection_stop(const Command& command) { @@ -203,60 +204,60 @@ HTTPResponse* Server::cmd_connection_stop(const Command& command) { Connection::Port port; if (args.size() < 2) { return new HTTPResponse(HTTPMessage::CONFLICT, - "Faltan argumentos."); - } else if (disconnect(args[0], String(args[1]).to(port))) { + ""); + } else if (disconnect(args[0], to(args[1], port))) { return new HTTPResponse(HTTPMessage::OK, - string("La conexión a ") + args[0] + ":" + args[1] - + " se cerrará en instantes..."); + string(""); } else { return new HTTPResponse(HTTPMessage::NOT_FOUND, - string("No existe una conexión a ") + args[0] - + ":" + args[1]); + string(""); } } HTTPResponse* Server::cmd_transmission_list(void) { // FIXME - stringstream response_xml; - response_xml << "" << endl; + stringstream xml; + xml << "" << endl; /*TODO plants_mutex.lock(); for (PlantList::const_iterator i = plants.begin(); i != plants.end(); i++) { trans - response_xml << "
  • " << (*i)->get_host() << ":" + xml << "
  • " << (*i)->get_host() << ":" << (*i)->get_port() << " [get_host() << "/" << (*i)->get_port() << "\">desconectar]
  • " << endl; } transmissions_mutex.unlock();*/ - response_xml << "
    " << endl; - return new HTTPResponse(HTTPMessage::OK, response_xml.str()); + xml << "
    " << endl; + return new HTTPResponse(HTTPMessage::OK, xml.str()); } HTTPResponse* Server::cmd_transmission_start(const Command& command) { const Command::Arguments& args = command.get_args(); if (args.size() < 3) { return new HTTPResponse(HTTPMessage::CONFLICT, - "Faltan argumentos."); + ""); } else { string plant = args[0]; string host = args[1]; - Connection::Port port = String(args[2]).to(port); + Connection::Port port = to(args[2], port); Glib::Mutex::Lock lock(plants_mutex); PlantList::iterator p = plants.find(plant); if (p == plants.end()) { return new HTTPResponse(HTTPMessage::NOT_FOUND, - string("No existe la planta '") + plant + "'."); + string(""); // TODO - agregar chequeo de que la transmision a ese host:port no // exista para otra planta? } else if (plants[plant]->transmission_start(host, port)) { return new HTTPResponse(HTTPMessage::OK, - string("Se empieza a transmitir la planta '") + plant - + "' a " + host + ":" + String().from(port) + "."); + string(""); } else { return new HTTPResponse(HTTPMessage::INTERNAL_SERVER_ERROR, - string("Error al crear la transmisión a de la planta '") - + plant + "' a " + host + ":" + args[2] + "."); + string(""); } } } @@ -265,59 +266,59 @@ HTTPResponse* Server::cmd_transmission_stop(const Command& command) { const Command::Arguments& args = command.get_args(); if (args.size() < 2) { return new HTTPResponse(HTTPMessage::CONFLICT, - "Faltan argumentos."); + ""); } else { const string& host = args[0]; - Connection::Port port = String(args[1]).to(port); + Connection::Port port = to(args[1], port); for (PlantList::iterator i = plants.begin(); i != plants.end(); i++) { // TODO - agregar chequeo para saber si existe una conexion (para // tirar error de que no hay conexion o de que no se pudo // desconectar. if (i->second->transmission_stop(host, port)) { return new HTTPResponse(HTTPMessage::OK, - string("Se finaliza la transmisión de la planta '") - + i->first + "' a " + host + ":" + args[1] + "."); + string("first + "' a " + host + ":" + args[1] + ".\" />"); } } return new HTTPResponse(HTTPMessage::NOT_FOUND, - string("No se puede finalizar la transmisión a ") - + host + ":" + args[1] + "."); + string(""); } } HTTPResponse* Server::cmd_plant_list(void) { // FIXME - stringstream response_xml; - response_xml << "" << endl; + stringstream xml; + xml << "" << endl; plants_mutex.lock(); for (PlantList::const_iterator i = plants.begin(); i != plants.end(); i++) { - response_xml << "\t" << endl; - response_xml << "\t\t" << i->first << "" << endl; - response_xml << "\t" << endl; + xml << "\t" << endl; + xml << "\t\t" << i->first << "" << endl; + xml << "\t" << endl; } plants_mutex.unlock(); - response_xml << "" << endl; - return new HTTPResponse(HTTPMessage::OK, response_xml.str()); + xml << "" << endl; + return new HTTPResponse(HTTPMessage::OK, xml.str()); } HTTPResponse* Server::cmd_plant_get(const Command& command) { if (!command.get_args().size()) { return new HTTPResponse(HTTPMessage::CONFLICT, - "Faltan argumentos."); + ""); } Glib::Mutex::Lock lock(plants_mutex); string plant = command.get_args()[0]; if (plants.find(plant) == plants.end()) { return new HTTPResponse(HTTPMessage::NOT_FOUND, - string("No existe la planta ") + plant); + string(""); } string xml = plants[plant]->get_xml(); if (xml.length()) { return new HTTPResponse(HTTPMessage::OK, xml); } else { return new HTTPResponse(HTTPMessage::INTERNAL_SERVER_ERROR, - ("No se pudo obtener el XML de la planta ") + plant); + (""); } } @@ -325,41 +326,50 @@ HTTPResponse* Server::cmd_plant_set(const Command& command) { const Command::Arguments& args = command.get_args(); if (args.size() < 4) { return new HTTPResponse(HTTPMessage::CONFLICT, - "Faltan argumentos."); + ""); } string plant = args[0]; string element = args[1]; string key = args[2]; + if (key != "open") { + return new HTTPResponse(HTTPMessage::NOT_FOUND, + string(""); + } string value = args[3]; Glib::Mutex::Lock lock(plants_mutex); PlantList::iterator p = plants.find(plant); if (p == plants.end()) { return new HTTPResponse(HTTPMessage::NOT_FOUND, - string("No existe la planta '") + plant + "'."); + string(""); } -/* if (!plants[plant]->set_element(host, port)) { - return new HTTPResponse(HTTPMessage::INTERNAL_SERVER_ERROR, - string("Error al crear la transmisión a de la planta '") - + plant + "' a " + host + ":" + args[2] + "."); - }*/ - return new HTTPResponse(HTTPMessage::OK); + bool open = true; + if ((value == "false") || (value == "0") || (value == "off") + || (value == "no")) { + open = false; + } + if (!plants[plant]->set_open(element, open)) { + return new HTTPResponse(HTTPMessage::CONFLICT, + string(""); + } + return new HTTPResponse(HTTPMessage::OK, + string(""); } HTTPResponse* Server::cmd_plant_stop(const Command& command) { if (!command.get_args().size()) { return new HTTPResponse(HTTPMessage::CONFLICT, - "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("No existe la planta ") + name); + string(""); } // TODO Ver si al frenar la planta se destruye (no deberia!!!) plants[name]->finish(); return new HTTPResponse(HTTPMessage::OK, - string("La planta '") + name + "' se cerrará en instantes..."); + string(""); } } // namespace Server -- 2.43.0