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