]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Client/src/principal.cpp
Se implementa una señal entre Thread con Glib::Dispatch .. no se si soluciona el...
[z.facultad/75.42/plaqui.git] / Client / src / principal.cpp
1
2
3
4 #include "principal.h"
5 #include <iostream>
6 #include <sstream>
7 #include <string>
8 #include "plaqui/server/string.h"
9 #include "item_codo.h"
10 #include "item_conduct.h"
11 #include "item_exclusa.h"
12 #include "item_tank.h"
13 #include "item_pump.h"
14 #include "item_union.h"
15 #include "item_drain.h"
16 #include <unistd.h>
17
18 Principal::Principal(BaseObjectType *co, const Glib::RefPtr<Gnome::Glade::Xml> &rg):Gtk::Window(co),refXml(rg)
19 {
20         Gtk::MenuItem *conect=0, *exit=0, *about=0, *mnu_prop=0, *mnu_disconnect;
21         Gtk::Button *btn_get=0, *bar_connect=0;
22         txt_view = 0;
23         txt_target = txt_command = txt_args = 0;
24         work_place = 0;
25         lbl_nombre = lbl_color = lbl_flujo = 0;
26
27         rg->get_widget("lbl_nombre", lbl_nombre);
28         rg->get_widget("mnu_file_connect", conect);
29         rg->get_widget("mnu_file_disconnect", mnu_disconnect);
30         rg->get_widget("mnu_file_exit", exit);
31         rg->get_widget("mnu_help_about", about);
32         rg->get_widget("mnu_prop", mnu_prop);
33         rg->get_widget_derived("dlgConectar", dlg_conectar);
34         rg->get_widget("btn_get", btn_get);
35         rg->get_widget("txt_view", txt_view);
36         rg->get_widget("txt_target", txt_target);
37         rg->get_widget("txt_command", txt_command);
38         rg->get_widget("txt_args", txt_args);
39         rg->get_widget("bar_connect", bar_connect);
40         rg->get_widget("work_place", work_place);
41         rg->get_widget("ico_conected", ico_conected);
42
43         dlg_conectar->get_ok_button()->signal_clicked().connect( SigC::slot(*this, &Principal::on_dlg_connect_ok) );
44         mnu_disconnect->signal_activate().connect( SigC::slot(*this, &Principal::on_mnu_file_disconnect));
45         conect->signal_activate().connect( SigC::slot(*this, &Principal::on_mnu_file_connect));
46         bar_connect->signal_clicked().connect( SigC::slot(*this, &Principal::on_mnu_file_connect));
47         exit->signal_activate().connect( SigC::slot(*this, &Principal::on_mnu_file_exit));
48         about->signal_activate().connect( SigC::slot(*this, &Principal::on_mnu_help_about));
49         btn_get->signal_clicked().connect( SigC::slot(*this, &Principal::on_get_clicked) );
50
51         conexion = NULL;
52         is_xml_loaded = false;
53
54         load_xml_dispatch.connect( SigC::slot(*this, &Principal::loadXML ) );
55 }
56
57 Principal::~Principal()
58 {
59         delete conexion;
60 }
61
62 void Principal::on_dlg_connect_ok()
63 {
64         if (conexion == NULL) {
65                 // Creo la conexion
66                 try {
67                         conexion = new PlaQui::Server::ControlClient(dlg_conectar->get_server_name(), dlg_conectar->get_server_port());
68                 }
69                 catch (...) {
70                         txt_view->get_buffer()->insert_at_cursor("NO SE PUDO CREAR OBJETO\n");
71                         delete conexion;
72                         conexion == NULL;
73                         return;
74                 }
75
76                 // Conecto las señales
77                 conexion->signal_ok_received().connect( SigC::slot(*this, &Principal::on_conexion_ok) );
78                 conexion->signal_error_received().connect( SigC::slot(*this, &Principal::on_conexion_error) );
79                 conexion->signal_connected().connect( SigC::slot(*this, &Principal::on_conexion_connected) );
80                 conexion->signal_finished().connect( SigC::slot(*this, &Principal::on_conexion_finished) );
81                 conexion->signal_frame_received().connect(SigC::slot(*this, &Principal::on_conexion_frame));
82                 // Lanzo la conexion!
83                 try {
84                         conexion->run();
85                 }
86                 catch (...) {
87                         txt_view->get_buffer()->insert_at_cursor("no se puede correr conexion->run()!!!\n");
88                 }
89         } else {
90                 txt_view->get_buffer()->insert_at_cursor("YA ESTAS CONECTADO\n");
91         }
92         dlg_conectar->hide();
93 }
94
95 void Principal::on_mnu_file_exit()
96 {
97         Gtk::Main::quit();
98 }
99
100 void Principal::on_mnu_file_disconnect()
101 {
102         if (conexion == NULL) return;
103
104         PlaQui::Server::Command c("connection", "stop");
105         c.add_arg(conexion->get_host());
106         c.add_arg(conexion->get_port());
107         conexion->send(c);
108 }
109
110 void Principal::on_mnu_file_connect()
111 {
112         dlg_conectar->show();
113 }
114
115 void Principal::on_mnu_help_about()
116 {
117         // preparo para leer el archivo ChangeLog
118 /*      Glib::RefPtr<Gnome::Glade::Xml> xml;
119         Glib::ustring line;
120         Glib::RefPtr<Gtk::TextBuffer> log_buffer;
121         Glib::RefPtr<Glib::IOChannel> log_io;
122
123         log_buffer = Gtk::TextBuffer::create();
124         log_io = Glib::IOChannel::create_from_file("../ChangeLog", "r");
125         while (log_io->read_line(line) != Glib::IO_STATUS_EOF) {
126                 log_buffer->insert_at_cursor(line);
127         }
128
129         try {
130                 xml = Gnome::Glade::Xml::create("client.glade", "dlgAbout");
131         }
132         catch(const Gnome::Glade::XmlError &ex) {
133                 std::cerr << ex.what() << std::endl;
134                 return;
135         }
136         Gtk::Window *dlg = 0;
137         Gtk::Button *btn_cerrar = 0;
138         Gtk::TextView *txt_changelog = 0;
139         xml->get_widget("dlgAbout", dlg);
140         xml->get_widget("btn_close", btn_cerrar);
141         xml->get_widget("txt_changelog", txt_changelog);
142         btn_cerrar->signal_clicked().connect(SigC::slot(*dlg, &Gtk::Dialog::hide));
143         txt_changelog->set_buffer(log_buffer);
144         dlg->show();*/
145 }
146
147 bool Principal::on_item_clicked(GdkEventButton *e, ViewItem *i)
148 {
149         lbl_nombre->set_text(i->get_name());
150         txt_view->get_buffer()->insert_at_cursor("Selecciono ");
151         txt_view->get_buffer()->insert_at_cursor(i->get_name());
152         txt_view->get_buffer()->insert_at_cursor("\n");
153 }
154
155 void Principal::on_conexion_connected()
156 {
157         txt_view->get_buffer()->insert_at_cursor("CONNECTED\n");
158         ico_conected->set( Gtk::Stock::YES , Gtk::IconSize(Gtk::ICON_SIZE_LARGE_TOOLBAR));
159
160         // Pido la planta por defecto
161         PlaQui::Server::Command c("plant", "get");
162         c.add_arg("default");
163         conexion->send(c);
164 }
165
166 void Principal::on_conexion_frame(const std::string &frame)
167 {
168         std::cout << "LLEGO : " << frame << std::endl;
169 }
170
171 void Principal::on_conexion_finished()
172 {
173         txt_view->get_buffer()->insert_at_cursor("HANG UP\n");
174         ico_conected->set( Gtk::Stock::NO , Gtk::IconSize(Gtk::ICON_SIZE_LARGE_TOOLBAR));
175         conexion = NULL;
176 }
177
178 #include <gdk/gdk.h>
179
180 void Principal::on_conexion_ok(const std::string &body)
181 {
182         /* lo paso a la carga del XML */
183         /* verifico que body este completo */
184         if ((body.find("</planta>")>0) && (body.find("<planta>")>0)) {
185                 //loadXML(body);
186                 xml_body = body;
187                 load_xml_dispatch();
188         } else {
189                 txt_view->get_buffer()->insert_at_cursor("<IN>\n");
190                 txt_view->get_buffer()->insert_at_cursor(Glib::locale_to_utf8(body));
191                 txt_view->get_buffer()->insert_at_cursor("</IN>\n");
192         }
193 }
194
195 void Principal::on_conexion_error(unsigned code)
196 {
197         std::stringstream a;
198         std::string s;
199         a << code;
200         a >> s;
201         txt_view->get_buffer()->insert_at_cursor("El server dice que hay error : ");
202         txt_view->get_buffer()->insert_at_cursor(s);
203         txt_view->get_buffer()->insert_at_cursor("\n");
204         
205 }
206
207 void Principal::on_get_clicked()
208 {
209         if (conexion == NULL) {
210                 txt_view->get_buffer()->insert_at_cursor("SIN CONEXION\n");
211                 return;
212         }
213
214         
215         PlaQui::Server::Command command(txt_target->get_text(), txt_command->get_text());
216         command.add_arg( txt_args->get_text() );
217         txt_view->get_buffer()->insert_at_cursor("Enviando comando\n");
218         try {
219                 conexion->send(command);
220         }
221         catch (...) {
222                 txt_view->get_buffer()->insert_at_cursor("EXCEPTION EN conexion->send !!\n");
223         }
224
225 }
226
227 void Principal::loadXML()
228 {
229         // ya lo cargue
230         if (is_xml_loaded) return;
231
232         /* Parseo de ejemplo de un XML desde archivo */
233         xmlDocPtr document;
234         document = xmlParseMemory(xml_body.c_str(),xml_body.size());
235         if (document == NULL) {
236                 std::cout << "EEERRRRRRROOOOOOOOOO" << std::endl;
237                 return;
238         }
239         is_xml_loaded = true;
240         /* bien, el archivo se parseo bien! */
241         xmlNodePtr nodo, items;
242         nodo = document->children;
243
244         if (strcmp((char *)nodo->name, "planta") == 0) {
245                 items = nodo->children;
246                 while (items != NULL) {
247                         if (items->type == XML_ELEMENT_NODE) {
248                                 if (xmlStrcmp(items->name, BAD_CAST"bomba")==0) {
249                                         loadBomba(items);
250                                 } else if (xmlStrcmp(items->name, BAD_CAST"codo")==0) {
251                                         loadCodo(items);
252                                 } else if (xmlStrcmp(items->name, BAD_CAST"tubo")==0) {
253                                         loadConduct(items);
254                                 } else if (xmlStrcmp(items->name, BAD_CAST"exclusa")==0) {
255                                         loadExclusa(items);
256                                 } else if (xmlStrcmp(items->name, BAD_CAST"tanque")==0) {
257                                         loadTank(items);
258                                 } else if (xmlStrcmp(items->name, BAD_CAST"empalme")==0) {
259                                         loadUnion(items);
260                                 } else if (xmlStrcmp(items->name, BAD_CAST"drenaje")==0) {
261                                         loadDrain(items);
262                                 }
263
264                         }
265                         items = items->next;
266                 }
267         }
268 }
269
270 void Principal::loadBomba(xmlNodePtr nodo)
271 {
272         Glib::ustring name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
273         int orientacion=0, x, y;
274
275         nodo = nodo->children;
276         while (nodo != NULL) {
277                 if (nodo->type == XML_ELEMENT_NODE) {
278                         if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
279                                 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
280                         } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
281                                 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
282                         } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
283                                 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
284                         }
285                 }
286                 nodo = nodo->next;
287         }
288
289         // listo, ya recolecte todos los datos, ahora creo el objeto!
290         ViewPump *b = new ViewPump(name, orientacion);
291         b->signal_button_press_event().connect(SigC::bind( SigC::slot(*this, &Principal::on_item_clicked), b) );
292         b->set_position(x,y);
293         work_place->put(*b, x, y);
294         b->show();
295         // los agrego al hash
296         mapItems[name] = b;
297 }
298
299 void Principal::loadCodo(xmlNodePtr nodo)
300 {
301         std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
302         int orientacion=0, x, y;
303
304         nodo = nodo->children;
305         while (nodo != NULL) {
306                 if (nodo->type == XML_ELEMENT_NODE) {
307                         if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
308                                 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
309                         } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
310                                 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
311                         } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
312                                 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
313                         }
314                 }
315                 nodo = nodo->next;
316         }
317
318         // listo, ya recolecte todos los datos, ahora creo el objeto!
319         ViewItem *b = new ViewCodo(name, orientacion);
320         b->signal_button_press_event().connect(SigC::bind( SigC::slot(*this, &Principal::on_item_clicked), b) );
321         b->set_position(x,y);
322         work_place->put(*b, x, y);
323         b->show();
324         // los agrego al hash
325         mapItems[name] = b;
326 }
327
328 void Principal::loadConduct(xmlNodePtr nodo)
329 {
330         Glib::ustring name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
331         int orientacion=0, x, y;
332
333         nodo = nodo->children;
334         while (nodo != NULL) {
335                 if (nodo->type == XML_ELEMENT_NODE) {
336                         if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
337                                 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
338                         } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
339                                 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
340                         } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
341                                 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
342                         }
343                 }
344                 nodo = nodo->next;
345         }
346
347         // listo, ya recolecte todos los datos, ahora creo el objeto!
348         ViewConduct *b = new ViewConduct(name, orientacion);
349         b->signal_button_press_event().connect(SigC::bind( SigC::slot(*this, &Principal::on_item_clicked), b) );
350         b->set_position(x,y);
351         work_place->put(*b, x, y);
352         b->show();
353         // los agrego al hash
354         mapItems[name] = b;
355 }
356
357 void Principal::loadExclusa(xmlNodePtr nodo)
358 {
359         Glib::ustring name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
360         int orientacion=0, x, y;
361
362         nodo = nodo->children;
363         while (nodo != NULL) {
364                 if (nodo->type == XML_ELEMENT_NODE) {
365                         if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
366                                 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
367                         } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
368                                 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
369                         } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
370                                 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
371                         }
372                 }
373                 nodo = nodo->next;
374         }
375
376         // listo, ya recolecte todos los datos, ahora creo el objeto!
377         ViewExclusa *b = new ViewExclusa(name, orientacion);
378         b->signal_button_press_event().connect(SigC::bind( SigC::slot(*this, &Principal::on_item_clicked), b) );
379         b->set_position(x,y);
380         work_place->put(*b, x, y);
381         b->show();
382         // los agrego al hash
383         mapItems[name] = b;
384 }
385
386 void Principal::loadTank(xmlNodePtr nodo)
387 {
388         Glib::ustring name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
389         int orientacion=0, x, y;
390
391         nodo = nodo->children;
392         while (nodo != NULL) {
393                 if (nodo->type == XML_ELEMENT_NODE) {
394                         if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
395                                 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
396                         } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
397                                 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
398                         } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
399                                 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
400                         }
401                 }
402                 nodo = nodo->next;
403         }
404
405         // listo, ya recolecte todos los datos, ahora creo el objeto!
406         ViewTank *b = new ViewTank(name, orientacion);
407         b->signal_button_press_event().connect(SigC::bind( SigC::slot(*this, &Principal::on_item_clicked), b) );
408         b->set_position(x,y);
409         work_place->put(*b, x, y);
410         b->show();
411         // los agrego al hash
412         mapItems[name] = b;
413 }
414
415 void Principal::loadUnion(xmlNodePtr nodo)
416 {
417         Glib::ustring name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
418         int orientacion=0, x, y;
419
420         nodo = nodo->children;
421         while (nodo != NULL) {
422                 if (nodo->type == XML_ELEMENT_NODE) {
423                         if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
424                                 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
425                         } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
426                                 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
427                         } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
428                                 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
429                         }
430                 }
431                 nodo = nodo->next;
432         }
433
434         // listo, ya recolecte todos los datos, ahora creo el objeto!
435         ViewUnion *b = new ViewUnion(name, orientacion);
436         b->signal_button_release_event().connect(SigC::bind( SigC::slot(*this, &Principal::on_item_clicked), b) );
437         b->set_position(x,y);
438         work_place->put(*b, x, y);
439         b->show();
440         // los agrego al hash
441         mapItems[name] = b;
442 }
443
444 void Principal::loadDrain(xmlNodePtr nodo)
445 {
446         Glib::ustring name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
447         int orientacion=0, x, y;
448
449         nodo = nodo->children;
450         while (nodo != NULL) {
451                 if (nodo->type == XML_ELEMENT_NODE) {
452                         if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
453                                 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
454                         } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
455                                 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
456                         } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
457                                 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
458                         }
459                 }
460                 nodo = nodo->next;
461         }
462
463         // listo, ya recolecte todos los datos, ahora creo el objeto!
464         ViewDrain *b = new ViewDrain(name, orientacion);
465         b->signal_button_release_event().connect(SigC::bind( SigC::slot(*this, &Principal::on_item_clicked), b) );
466         b->set_position(x,y);
467         work_place->put(*b, x, y);
468         b->show();
469         // los agrego al hash
470         mapItems[name] = b;
471 }