]> git.llucax.com Git - z.facultad/75.42/plaqui.git/commitdiff
Se muda el namespace Plaqui a PlaQui::Server. Se completa un poco la clase Runnable.
authorLeandro Lucarella <llucax@gmail.com>
Tue, 21 Oct 2003 05:14:25 +0000 (05:14 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Tue, 21 Oct 2003 05:14:25 +0000 (05:14 +0000)
19 files changed:
Server/include/plaqui/server/connection.h
Server/include/plaqui/server/controlclient.h
Server/include/plaqui/server/controlserver.h
Server/include/plaqui/server/receiver.h
Server/include/plaqui/server/request.h
Server/include/plaqui/server/runnable.h
Server/include/plaqui/server/server.h
Server/include/plaqui/server/string.h
Server/include/plaqui/server/transmitter.h
Server/src/connection.cpp
Server/src/controlclient.cpp
Server/src/controlserver.cpp
Server/src/receiver.cpp
Server/src/request.cpp
Server/src/runnable.cpp
Server/src/server.cpp
Server/src/string.cpp
Server/src/transmitter.cpp
Server/tests/server_test.cpp

index ef1fa2491e209b6c6a3094ba31aec0c7f34fddf5..5b777db38d7a6ee69247211f0e2536682b7d41c1 100644 (file)
@@ -31,7 +31,9 @@
 #include "plaqui/server/runnable.h"
 #include <socket++/sockinet.h>
 
-namespace Plaqui {
+namespace PlaQui {
+
+namespace Server {
 
        /// Conexión.
        class Connection: public Runnable {
@@ -58,13 +60,6 @@ namespace Plaqui {
                         */
                        Connection(const sockbuf::sockdesc& sd);
 
-                       /**
-                        * Constructor.
-                        *
-                        * \param socket Socket a usar en la conexión.
-                        */
-                       //Connection(const sockinetbuf& sb);
-
                        /**
                         * Constructor.
                         *
@@ -76,4 +71,6 @@ namespace Plaqui {
 
 }
 
+}
+
 #endif // PLAQUI_CONNECTION_H 
index 3b61edcc4aff8934cfe94d09b7a325fa76d90545..8341a5f4549698b4bfb86a0ed8ee5f5bdda33446 100644 (file)
@@ -31,7 +31,9 @@
 #include "plaqui/server/connection.h"
 #include <string>
 
-namespace Plaqui {
+namespace PlaQui {
+
+namespace Server {
 
        /// Conexión para enviar comandos de control a una planta.
        class ControlClient: public Connection {
@@ -63,4 +65,6 @@ namespace Plaqui {
 
 }
 
+}
+
 #endif // PLAQUI_CONTROLCLIENT_H
index 99f8dead3e641de46438f98d2a9ade21afd9472f..7ad14cb594cb6a891ab09f3b0d46219657633987 100644 (file)
@@ -31,7 +31,9 @@
 #include "plaqui/server/connection.h"
 #include <socket++/sockinet.h>
 
-namespace Plaqui {
+namespace PlaQui {
+
+namespace Server {
 
        /// Conexión para recibir comandos de control para una planta.
        class ControlServer: public Connection {
@@ -61,5 +63,6 @@ namespace Plaqui {
 
 }
 
+}
 
 #endif // PLAQUI_CONTROLSERVER_H
index 91c3014acc5e23b131a2298ff5c459eadea0cabf..4bfda778309d51175f145fe04487b0fa990c6e9f 100644 (file)
@@ -32,7 +32,9 @@
 #include <socket++/sockinet.h>
 #include <string>
 
-namespace Plaqui {
+namespace PlaQui {
+
+namespace Server {
 
        /// Conexión para recibir el estado de una planta.
        class Receiver: public Connection {
@@ -61,4 +63,6 @@ namespace Plaqui {
 
 }
 
+}
+
 #endif // PLAQUI_RECEIVER_H
index acc5091229568be7bfbbd2fc32f3c5e70b61add3..86541bcc815d5484171c8dff0ed5bb0fb85393b6 100644 (file)
@@ -31,7 +31,9 @@
 #include <map>
 #include <string>
 
-namespace Plaqui {
+namespace PlaQui {
+
+namespace Server {
 
        /// Conexión.
        class Request: public std::map<std::string, std::string> {
@@ -93,4 +95,6 @@ namespace Plaqui {
 
 }
 
+}
+
 #endif // PLAQUI_REQUEST_H 
index 39a221f26a684bc1569c6930a9529b42d6f92f11..145a2316ebda83e74cdb58acb2bd08cdb53bee9d 100644 (file)
 #define PLAQUI_RUNNABLE_H
 
 #include <glibmm/thread.h>
+#include <sigc++/signal.h>
 
-namespace Plaqui {
+namespace PlaQui {
+
+namespace Server {
 
        /// ealizauna tarea (generalmente en un thread).
        class Runnable {
 
+               // Tipos.
+
+               public:
+
+                       /// Tipo de señal para indicar que se finalizó la tarea.
+                       typedef SigC::Signal0<void> SignalFinished;
+
+               // Atributos.
+
                private:
-                       // Thread en el cual correr la tarea.
+
+                       /// Thread en el cual correr la tarea.
                        Glib::Thread* thread;
 
+                       /// Indica si se debe frinalizar la tarea.
+                       bool stop;
+
+                       /// Señal que indica que se finalizó la tarea.
+                       SignalFinished finished;
+
+               // Métodos.
+
+               private:
+
+                       /**
+                        * Corre la tarea controlando cuando termina.
+                        *
+                        * \param runner Objeto con la tarea a realizar.
+                        */
+                       static void static_run(Runnable* runner);
+
                protected:
 
                        /// Realiza la terea.
@@ -57,15 +87,36 @@ namespace Plaqui {
                        Runnable(void);
 
                        /**
-                        * Comienza la tares.
+                        * Comienza la tarea.
                         *
                         * \param detach Si es true se corre en un thread propio. Si no no
                         *                               retorna hasta que finaliza.
                         */
                        virtual void run(bool detach = true);
 
+                       /**
+                        * Finaliza la tarea.
+                        *
+                        * \param attach Si es true, la función no retorna hasta que no
+                        *               finalice la tearea (no recomendable).
+                        *
+                        * \see Para saber cuando la tarea fue finalizada puede utilizar
+                        *      la señal signal_finished().
+                        */
+                       virtual void finish(bool attach = false);
+
+                       /**
+                        * Obtiene la señal que avisa cuando la tarea es finalizada.
+                        *
+                        * \see Para saber cuando la tarea fue finalizada puede utilizar
+                        *      la señal signal_finished().
+                        */
+                       SignalFinished& signal_finished(void);
+
        };
 
 }
 
+}
+
 #endif // PLAQUI_RUNNABLE_H
index 2364273e0d731a97440133aa573ec65218972089..6265b6fe757113c2ffcb7097a9e1f6a5c8f3fb71 100644 (file)
@@ -34,7 +34,9 @@
 #include <string>
 #include <list>
 
-namespace Plaqui {
+namespace PlaQui {
+
+namespace Server {
 
        /**
         * Servidor de plantas químicas.
@@ -112,4 +114,6 @@ namespace Plaqui {
 
 }
 
+}
+
 #endif // PLAQUI_SERVER_H
index 292055fd92895dbff668158ecb18b22009e8a9a7..8ab2b8f447ffd4a10b594853d6135a2db8e998ab 100644 (file)
@@ -30,7 +30,9 @@
 
 #include <string>
 
-namespace Plaqui {
+namespace PlaQui {
+
+namespace Server {
 
        /// Conexión.
        class String: public std::string {
@@ -73,4 +75,6 @@ namespace Plaqui {
 
 }
 
+}
+
 #endif // PLAQUI_STRING_H 
index faff2ef0b79d39cd6237f6d785059328549c345c..c3467a4b90d559d7e44ef05209c6df0c7f13459a 100644 (file)
@@ -31,7 +31,9 @@
 #include "plaqui/server/connection.h"
 #include <string>
 
-namespace Plaqui {
+namespace PlaQui {
+
+namespace Server {
 
        /// Conexión para transmitir el estado de una planta.
        class Transmitter: public Connection {
@@ -62,4 +64,6 @@ namespace Plaqui {
 
 }
 
+}
+
 #endif // PLAQUI_TRANSMITTER_H
index 44d74dfaf5a2d9c508a9c9d069fdcfdd2adf7c0e..c97685f96422e27fb5e35e5d0ebddcfa06d42152 100644 (file)
@@ -28,7 +28,7 @@
 #include "plaqui/server/connection.h"
 #include <socket++/sockinet.h>
 
-using namespace Plaqui;
+using namespace PlaQui::Server;
 
 Connection::Connection(const sockbuf::sockdesc& sd):
                socket(sd) {
index 62e693ebc3c86fb101cdff5a7afdf52b4ffd0df9..7138b44f09820ef5005dd0fe4b9bbc3ab77b74c9 100644 (file)
@@ -29,7 +29,7 @@
 // XXX
 #include <iostream>
 
-using namespace Plaqui;
+using namespace PlaQui::Server;
 
 ControlClient::ControlClient(std::string host, int port):
                Connection(sockbuf::sock_stream) {
index 69de3a7c69612936d1b745bdd31881d62038746c..8789af1df4649630dad67e9db431c9d75266321d 100644 (file)
@@ -30,7 +30,7 @@
 #include <cstring>
 #include <sstream>
 
-using namespace Plaqui;
+using namespace PlaQui::Server;
 
 ControlServer::ControlServer(const sockbuf::sockdesc& sd):
                Connection(sd) {
@@ -50,20 +50,13 @@ void ControlServer::real_run(void) {
                bool is_first = true;
                while (!stop && socket.getline(buf, BUFFER_SIZE)) {
 #ifdef DEBUG
-                       std::cerr << "Reciviendo (crudo): " << buf << std::endl;
+                       std::cerr << "Reciviendo linea: " << buf << std::endl;
 #endif // DEBUG
                        int len = strlen(buf);
                        // Si tiene un retorno de carro, lo elimina.
                        if (len && (buf[len-1] == '\r')) {
                                buf[--len] = '\0';
                        }
-#ifdef DEBUG
-                       std::cerr << "Reciviendo (sin \\r): " << buf << std::endl;
-                       std::cerr << "len: " << len << std::endl;
-                       if (len == 1) {
-                               std::cerr << std::hex << "Caracter: " << *buf << std::endl;
-                       }
-#endif // DEBUG
                        // Si tiene contenido, lo agrego a la información del request.
                        if (len) {
                                // Si es la primera línea, es el request.
index 4f720f4450c0af6196e4ae419dde066c57ef1e3a..c492fe13abfebb9f8c78861dd2e43a39d6a76708 100644 (file)
@@ -27,7 +27,7 @@
 
 #include "plaqui/server/receiver.h"
 
-using namespace Plaqui;
+using namespace PlaQui::Server;
 
 Receiver::Receiver(int port, std::string host):
                Connection(sockbuf::sock_dgram) {
index 1eb8b0be1d83805a5885706e413ccb489c5c71c9..92bb7e1d7c7fc9386318e0122f225ea4db77ac65 100644 (file)
@@ -34,7 +34,7 @@
 #      include <iostream>
 #endif // DEBUG
 
-using namespace Plaqui;
+using namespace PlaQui::Server;
 
 const std::string Request::CHARS_DIGIT = "0123456789";
 
index 0e8b4bde525dae9c80e9cdd4382fab2e5bd47b41..66579acda263b663cd45a67c7e237e3162de3ff7 100644 (file)
 #      include <iostream>
 #endif // DEBUG
 
-using namespace Plaqui;
+PlaQui::Server::Runnable::Runnable(void): thread(0), stop(false) {
+}
 
-Runnable::Runnable(void): thread(0) {
+void PlaQui::Server::Runnable::static_run(PlaQui::Server::Runnable* runner) {
+#ifdef DEBUG
+       std::cerr << __FILE__ << ": runner = " << runner << std::endl;
+#endif // DEBUG
+       runner->real_run();
+       runner->signal_finished().emit();
+       delete runner;
 }
 
-void Runnable::run(bool detach) {
+void PlaQui::Server::Runnable::run(bool detach) {
 #ifdef DEBUG
        std::cerr << __FILE__ << ": detach = " << detach << std::endl;
 #endif // DEBUG
@@ -47,9 +54,13 @@ void Runnable::run(bool detach) {
                if (!Glib::thread_supported()) {
                        Glib::thread_init();
                }
-               // Corremos el thread.
+               // Corremos el thread en una funcion estática para poder destruirlo al
+               // finalizar, pasandole el puntero al objeto.
                thread = Glib::Thread::create(
-                               SigC::slot_class(*this, &Runnable::real_run), true);
+                               SigC::bind<Runnable*>(
+                                       SigC::slot(&PlaQui::Server::Runnable::static_run),
+                                       this),
+                               true);
        // Si no corremos la tarea normalmente.
        } else {
                real_run();
@@ -57,3 +68,19 @@ void Runnable::run(bool detach) {
                
 }
 
+void PlaQui::Server::Runnable::finish(bool attach) {
+#ifdef DEBUG
+       std::cerr << __FILE__ << ": attach = " << attach << std::endl;
+#endif // DEBUG
+       // TODO - necesita un mutex?
+       stop = true;
+       if (attach) {
+               thread->join();
+       }
+}
+
+PlaQui::Server::Runnable::SignalFinished&
+PlaQui::Server::Runnable::signal_finished(void) {
+       return finished;
+}
+
index 6507d6d7862ac95365a2089390caa023eae6ad8a..1206b1c16ea7a8670284fb352b5ca1d0ddc50add 100644 (file)
@@ -30,7 +30,7 @@
 #      include <iostream>
 #endif // DEBUG
 
-using namespace Plaqui;
+using namespace PlaQui::Server;
 
 Server::Server(int port):
                socket(sockbuf::sock_stream) {
index caa657b3d5522199c7999192b2264439f972645d..24904a76c3bf00d751fa59fb21a7876fa3c6cf93 100644 (file)
@@ -32,7 +32,7 @@
 #      include <iostream>
 #endif // DEBUG
 
-using namespace Plaqui;
+using namespace PlaQui::Server;
 
 const std::string String::SPACE_CHARS = " \t\n\r";
                        
index d4306e3ab0f16193e2c3756a0fa518d645268429..37113cc1b8f2147bfe4d0755b4fd8362e05d7701 100644 (file)
@@ -29,7 +29,7 @@
 #include <socket++/sockinet.h>
 #include <string>
 
-using namespace Plaqui;
+using namespace PlaQui::Server;
 
 Transmitter::Transmitter(std::string host, int port):
                Connection(sockbuf::sock_dgram) {
index 2e169354007bfc9e0dfd1f4322879b20b533b9d2..5b0df0034595e83183932cafd39f04f0e95a736c 100644 (file)
@@ -32,7 +32,7 @@
 #include <exception>
 
 using namespace std;
-using namespace Plaqui;
+using namespace PlaQui::Server;
 
 int main(int argc, char* argv[]) {