1 // vim: set noexpandtab tabstop=4 shiftwidth=4:
2 //----------------------------------------------------------------------------
4 //----------------------------------------------------------------------------
5 // This file is part of PlaQui.
7 // PlaQui is free software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the Free Software
9 // Foundation; either version 2 of the License, or (at your option) any later
12 // PlaQui is distributed in the hope that it will be useful, but WITHOUT ANY
13 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 // You should have received a copy of the GNU General Public License along
18 // with PlaQui; if not, write to the Free Software Foundation, Inc., 59 Temple
19 // Place, Suite 330, Boston, MA 02111-1307 USA
20 //----------------------------------------------------------------------------
21 // Creado: Sat Oct 18 18:18:36 2003
22 // Autores: Leandro Lucarella <llucare@fi.uba.ar>
23 //----------------------------------------------------------------------------
28 #include "plaqui/server/connection.h"
29 #include "plaqui/server/server.h"
30 #include "plaqui/server/string.h"
31 #include <socket++/sockinet.h>
32 #include <glibmm/timer.h>
38 using namespace PlaQui::Server;
40 Server* server = NULL;
42 void on_error(const Runnable::Error& code, const string& desc) {
43 cerr << "ERROR EN EL SERVIDOR" << endl;
44 cerr << "Código: " << code << endl;
45 cerr << "Descripción: " << desc << endl;
48 void on_finished(void) {
49 cout << "Servidor finalizado!" << endl;
53 void on_connection_opened(const string& host, const Connection::Port& port) {
54 cout << "Se abrió una nueva conexión a " << host << ":" << port << "."
58 void on_signal(int signal) {
59 static bool called = false;
61 cout << "Se recibe señal " << signal << "." << endl;
67 if (!called && server) {
68 cout << "Terminando servidor... " << flush;
76 int main(int argc, char* argv[]) {
78 // Termina con mas informacion si hay una excepcion no manejada.
79 set_terminate(__gnu_cxx::__verbose_terminate_handler);
81 // Calculo número de revisión.
83 rev = rev.substr(6, rev.length() - 8);
86 cout << "PlaQui Server versión " << VERSION << " (revisión " << rev
88 cout << "Modo de uso: " << argv[0] << " [planta] [puerto]" << endl;
91 string filename = "planta.xml";
92 Connection::Port port = 7522;
94 // Obtengo nombre del archivo de la planta.
96 // Si tiene 2 parámetros.
103 // Inicializa threads.
106 // Pone un manejador de señales para salir limpiamente del programa.
107 signal(SIGINT, on_signal);
108 signal(SIGTERM, on_signal);
109 signal(SIGQUIT, on_signal);
112 // Crea el server (empieza a escuchar).
113 server = new Server(port);
114 } catch (const sockerr& e) {
115 cerr << "Socket Error: " << e.operation() << " | serrno = "
116 << e.serrno() << " | errstr = " << e.errstr() << endl;
117 if (e.serrno() == 98) {
118 cerr << "No se puede usar el puerto " << port << " porque ya está "
119 "siendo utilizado por otro programa." << endl;
121 cerr << "Error al crear el socket: operación: " << e.operation()
122 << ", código: " << e.serrno() << ", descripción: "
123 << e.errstr() << endl;
126 } catch (const exception& e) {
127 cerr << "Error: " << e.what() << endl;
129 } catch (const char* e) {
130 cerr << "Error: " << e << endl;
133 cerr << "Error desconocido!" << endl;
137 // Conecto señal para atender errores.
138 server->signal_error().connect(SigC::slot(on_error));
140 // Conecto señal para atender la finalización del server.
141 server->signal_finished().connect(SigC::slot(on_finished));
143 // Conecto señal para saber cuando se abre una nueva conexión.
144 server->signal_connection_opened().connect(SigC::slot(on_connection_opened));
147 if (!server->add_plant("default", filename)) {
148 cerr << "Advertencia: Ya existe una planta llamada 'default'. "
149 "No se puede agregar la planta almacenada en '" << filename
155 cout << "Atendiendo conexiones en el puerto " << port << "." << endl;
157 // Espera a que el server se muera.
159 Glib::usleep(500000); // 0,5 segundos