]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Server/src/plant.cpp
definitivamente tengo que aprender a documentar en alguna de esas cosas raras que...
[z.facultad/75.42/plaqui.git] / Server / src / plant.cpp
index e46e692671fb7dc864a909e7862b4f338794ee49..b020e2109e9882c4389bbe4405967c377825cb57 100644 (file)
 
 #include "plaqui/server/plant.h"
 #include <glibmm/timer.h>
-#include <sigc++/slot.h>
+#include <sigc++/class_slot.h>
 #include <fstream>
-#include <iterator>
-#include <algorithm>
 #ifdef DEBUG
 #      include <iostream>
 #endif // DEBUG
@@ -43,7 +41,8 @@ namespace Server {
 
 Plant::~Plant(void) {
 #ifdef DEBUG
-       cerr << __FILE__ << ": destructor." << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               << ": destructor." << endl;
 #endif // DEBUG
        // Termino transmisiones.
        Glib::Mutex::Lock lock(transmissions_mutex);
@@ -55,7 +54,8 @@ Plant::~Plant(void) {
 
 Plant::Plant(const string& filename): simulator(filename), filename(filename) {
 #ifdef DEBUG
-       cerr << __FILE__ << ": constructor. filename = " << filename << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               << ": constructor. filename = " << filename << endl;
 #endif // DEBUG
        // TODO plant
 /*     simulator.add_pump("bomba1");
@@ -73,16 +73,18 @@ Plant::Plant(const string& filename): simulator(filename), filename(filename) {
 
 void Plant::real_run(void) {
 #ifdef DEBUG
-       cerr << __FILE__ << ": real_run." << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               << ": real_run." << endl;
 #endif // DEBUG
        while (!stop) {
                simulator_mutex.lock();
                simulator.simulate();
+               string plantstatus = simulator.get_state_as_xml();
                simulator_mutex.unlock();
                transmissions_mutex.lock();
                for (TransmitterList::iterator i = transmissions.begin();
                                i != transmissions.end(); i++) {
-                       (*i)->send(simulator.get_state_as_xml());
+                       (*i)->send(plantstatus);
                }
                transmissions_mutex.unlock();
                Glib::usleep(1000000);
@@ -90,27 +92,60 @@ void Plant::real_run(void) {
 }
 
 bool Plant::transmission_start(string& host, Connection::Port& port) {
+#ifdef DEBUG
+               cerr << __FILE__ << "(" << __LINE__ << ")"
+                       << ": transmission_start(host = " << host <<
+                       ", port = " << port << ")." << endl;
+#endif // DEBUG
        Glib::Mutex::Lock lock(transmissions_mutex);
        for (TransmitterList::iterator i = transmissions.begin();
                        i != transmissions.end(); i++) {
                if (((*i)->get_host() == host) && ((*i)->get_port() == port)) {
+#ifdef DEBUG
+                       cerr << __FILE__ << "(" << __LINE__ << ")"
+                               << ": transmission_start ERROR: ya existe."
+                               << endl;
+#endif // DEBUG
                        return false;
                }
        }
        Transmitter* trans;
        try {
                trans = new Transmitter(host, port);
-       } catch (...) { // TODO - Hace mas selectivo el catch?
-               delete trans;
+       } catch (const sockerr& e) { // TODO - Hace mas selectivo el catch?
+#ifdef DEBUG
+               cerr << __FILE__ << "(" << __LINE__ << ")"
+                       << ": transmission_start ERROR (" << e.serrno()
+                       << "): " << e.errstr() << endl;
+#endif // DEBUG
+               //delete trans;
                return false;
+//     } catch (...) { // TODO - Hace mas selectivo el catch?
+//#ifdef DEBUG
+//             cerr << __FILE__ << "(" << __LINE__ << ")"
+//                     << ": transmission_start ERROR: desconocido."
+//                     << endl;
+//#endif // DEBUG
+//             //delete trans;
+//             return false;
        }
        transmissions.push_back(trans);
+       trans->signal_finished().connect(SigC::bind<Transmitter*>(
+                               SigC::slot_class(*this, &Plant::on_transmission_finished),
+                               trans));
        trans->run();
+       host = trans->get_host();
+       port = trans->get_port();
        return true;
 }
 
 bool Plant::transmission_stop(const string& host,
                const Connection::Port& port) {
+#ifdef DEBUG
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               << ": transmission_stop(host = " << host <<
+               ", port = " << port << ")." << endl;
+#endif // DEBUG
        Glib::Mutex::Lock lock(transmissions_mutex);
        for (TransmitterList::iterator i = transmissions.begin();
                        i != transmissions.end(); i++) {
@@ -122,21 +157,42 @@ bool Plant::transmission_stop(const string& host,
        return false; // No la encontró.
 }
 
+void Plant::on_transmission_finished(Transmitter* transmission) {
+#ifdef DEBUG
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               <<  ": on_transmission_finished(transmission = "
+               << transmission << ")" << endl;
+#endif // DEBUG
+       Glib::Mutex::Lock lock(transmissions_mutex);
+       transmissions.remove(transmission);
+#ifdef DEBUG
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               <<  ": lista de conexiones" << endl;
+       for (TransmitterList::const_iterator i = transmissions.begin();
+                       i != transmissions.end(); i++) {
+               cerr << "\t " << *i << endl;
+       }
+#endif // DEBUG
+}
+
 bool Plant::set_open(const std::string& element, bool open) {
+#ifdef DEBUG
+               cerr << __FILE__ << "(" << __LINE__ << ")"
+                       << ": set_open(element = " << element <<
+                       ", open = " << open << ")." << endl;
+#endif // DEBUG
        Glib::Mutex::Lock lock(simulator_mutex);
        return simulator.set_open(element, open);
 }
 
 const string Plant::get_xml(void) const {
+#ifdef DEBUG
+               cerr << __FILE__ << "(" << __LINE__ << ")"
+                       << ": get_xml()." << endl;
+#endif // DEBUG
        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 "";
-       }
+       ifstream ifs(filename.c_str());
+       ifs >> oss.rdbuf();
        return oss.str();
 }
 
@@ -154,8 +210,8 @@ bool Plant::transmission_exists(const string& host,
 }
 */
 
-//const std::string& Plant::get_name(void) const {
-//     return name;
+//const std::string& Plant::get_filename(void) const {
+//     return filename;
 //}
 
 /// \todo FIXME esto deberia estar protegido por un mutex.