- Se agrega comando /plant/get/<planta> para obtener el XML se la planta.
/// Lista de conexiones de control.
typedef std::list<Transmitter*> TransmitterList;
- public:
-
- /// Tipo de señal para indicar que se actualizó la planta.
- //typedef SigC::Signal0<void> SignalUpdated;
-
// Atributos.
/// Simulador usado para calcular el estado de la planta.
Model::Simulator simulator;
- /// Señal para indicar que se actualizó la planta.
- //SignalUpdated updated;
-
- /// Nombre de la planta.
- //std::string name;
+ /// Nombre del archivo donde esta el XML de la planta.
+ std::string filename;
// Métodos.
*
* \return true si comenzó la transmisión, false si hubo problemas.
*/
- bool transmission_start(const string& host,
- const Connection::Port& port);
+ bool transmission_start(string& host, Connection::Port& port);
/**
* Comienza una transmisión del estado de la planta.
const Connection::Port& port);
/**
- * Obtiene la señal para indicar que se actualizó la planta.
+ * Obtiene el XML de la planta.
*/
- //SignalUpdated& signal_updated(void);
+ const std::string get_xml(void) const;
};
*/
HTTPResponse* cmd_plant_list(void);
+ /**
+ * Maneja el comando plant/get.
+ */
+ HTTPResponse* cmd_plant_get(const Command& command);
+
/**
* Maneja el comando plant/stop.
*/
/**
* Constructor.
*
+ * Los parámetros son modificados por los valores reales que toma
+ * una vez conectado.
+ *
* \param host Host al cual transmitir.
* \param port Puerto al cual transmitir.
*/
- Transmitter(const std::string& _host = "localhost",
- const Connection::Port& _port = 7528);
+ Transmitter(std::string& _host, Connection::Port& _port);
/**
* Envia datos.
#include "plaqui/server/plant.h"
#include <glibmm/timer.h>
#include <sigc++/slot.h>
+#include <fstream>
+#include <iterator>
+#include <algorithm>
#ifdef DEBUG
# include <iostream>
#endif // DEBUG
}
}
-Plant::Plant(const string& filename): simulator(filename) {
+Plant::Plant(const string& filename): simulator(filename), filename(filename) {
#ifdef DEBUG
cerr << __FILE__ << ": constructor. filename = " << filename << endl;
#endif // DEBUG
}
}
-bool Plant::transmission_start(const string& host,
- const Connection::Port& port) {
+bool Plant::transmission_start(string& host, Connection::Port& port) {
Glib::Mutex::Lock lock(transmissions_mutex);
for (TransmitterList::iterator i = transmissions.begin();
i != transmissions.end(); i++) {
return false; // No la encontró.
}
+const string Plant::get_xml(void) const {
+ ostringstream oss;
+ try {
+ ifstream ifs(filename.c_str());
+ ifs >> noskipws;
+ copy(istream_iterator<char>(ifs), istream_iterator<char>(),
+ ostream_iterator<char>(oss));
+ } catch (...) { // TODO hacerlo mas selectivo?
+ return "";
+ }
+ return oss.str();
+}
+
/*
bool Plant::transmission_exists(const string& host,
const Connection::Port& port) {
} else if (command.get_target() == "plant") {
if (command.get_command() == "list") {
response = cmd_plant_list();
+ } else if (command.get_command() == "get") {
+ response = cmd_plant_get(command);
} else if (command.get_command() == "stop") {
response = cmd_plant_stop(command);
} else {
response_xml << " <p>versión 0.8</p>" << endl;
response_xml << " <h2>Lista de transmisiones:</h2>" << endl;
response_xml << " <ul>" << endl;
- // TODO - recorrer todas las plantas y sus transmisiones.
-/* transmissions_mutex.lock();
- for (TransmitterList::const_iterator i = transmissions.begin();
- i != transmissions.end(); i++) {
+/*TODO plants_mutex.lock();
+ for (PlantList::const_iterator i = plants.begin();
+ i != plants.end(); i++) {
+ trans
response_xml << " <li>" << (*i)->get_host() << ":"
<< (*i)->get_port() << " [<a href=\"/transmission/stop/"
<< (*i)->get_host() << "/" << (*i)->get_port()
return new HTTPResponse(HTTPMessage::CONFLICT,
"Faltan argumentos.");
} else {
- const string& plant = args[0];
- const string& host = args[1];
+ string plant = args[0];
+ string host = args[1];
Connection::Port port = String(args[2]).to(port);
Glib::Mutex::Lock lock(plants_mutex);
PlantList::iterator p = plants.find(plant);
} else if (plants[plant]->transmission_start(host, port)) {
return new HTTPResponse(HTTPMessage::OK,
string("Se empieza a transmitir la planta '") + plant
- + "' a " + host + ":" + args[1] + ".");
+ + "' a " + host + ":" + String().from(port) + ".");
} else {
return new HTTPResponse(HTTPMessage::INTERNAL_SERVER_ERROR,
string("Error al crear la transmisión a de la planta '")
return new HTTPResponse(HTTPMessage::OK, response_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 name = command.get_args()[0];
+ if (plants.find(name) == plants.end()) {
+ return new HTTPResponse(HTTPMessage::NOT_FOUND,
+ string("No existe la planta ") + name);
+ }
+ string xml = plants[name]->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 ") + name);
+ }
+}
+
HTTPResponse* Server::cmd_plant_stop(const Command& command) {
if (!command.get_args().size()) {
return new HTTPResponse(HTTPMessage::CONFLICT,
#endif // DEBUG
}
-Transmitter::Transmitter(const string& _host, const Connection::Port& _port):
+Transmitter::Transmitter(string& _host, Connection::Port& _port):
Connection(sockbuf::sock_dgram, _host, _port) {
#ifdef DEBUG
cerr << __FILE__ << ": _host = " << _host
<< " | _port = " << _port << endl;
#endif // DEBUG
socket->connect(host.c_str(), port);
- host = socket->peerhost();
- port = socket->peerport();
+ // Reasigno el host y puerto bien, tanto de este objeto como los que se
+ // environ para indicar su valor correcto.
+ host = socket->peerhost();
+ port = socket->peerport();
+ _host = socket->peerhost();
+ _port = socket->peerport();
}
/// \todo debría dar una excepción (?)