23 #include "netloggui.h" 25 #include <gui_utils/logview.h> 26 #include <gui_utils/avahi_dispatcher.h> 27 #include <gui_utils/connection_dispatcher.h> 28 #include <gui_utils/service_chooser_dialog.h> 29 #include <netcomm/fawkes/client.h> 30 #include <netcomm/dns-sd/avahi_thread.h> 32 #include <netinet/in.h> 49 const Glib::RefPtr<Gtk::Builder> &builder)
50 : Gtk::Window(cobject)
52 builder->get_widget(
"vbox_main", vbox_main);
53 builder->get_widget(
"lab_no_connection", lab_no_connection);
54 builder->get_widget(
"tb_connection", tb_connection);
55 builder->get_widget(
"tb_exit", tb_exit);
56 builder->get_widget(
"tb_clear", tb_clear);
58 vbox_main->pack_end(ntb_logviewers);
61 avahi_dispatcher->
signal_service_added().connect(sigc::retype_return<void>(sigc::mem_fun(*
this, &NetLogGuiGtkWindow::on_service_added)));
62 avahi_dispatcher->
signal_service_removed().connect(sigc::mem_fun(*
this, &NetLogGuiGtkWindow::on_service_removed));
65 avahi_thread->
start();
66 avahi_thread->
watch_service(
"_fawkes._tcp", avahi_dispatcher);
68 tb_connection->signal_clicked().connect(sigc::mem_fun(*
this, &NetLogGuiGtkWindow::on_connection_clicked));
69 tb_exit->signal_clicked().connect(sigc::mem_fun(*
this, &NetLogGuiGtkWindow::on_exit_clicked));
70 tb_clear->signal_clicked().connect(sigc::mem_fun(*
this, &NetLogGuiGtkWindow::on_clear_clicked));
79 delete avahi_dispatcher;
86 NetLogGuiGtkWindow::on_connection_clicked()
90 struct sockaddr_in saddr;
91 socklen_t saddr_size =
sizeof(
struct sockaddr_in);
92 Glib::ustring name, hostname;
93 unsigned short int port = 1910;
94 std::list<std::string> txt;
101 hostname.c_str(), port,
102 (
struct sockaddr *)&saddr,
104 page = on_service_added(service);
108 Gtk::ScrolledWindow *scrolled =
dynamic_cast<Gtk::ScrolledWindow *
>(ntb_logviewers.get_nth_page(page));
109 LogView *logview =
dynamic_cast<LogView *
>(scrolled->get_child());
113 Glib::ustring message = *(e.
begin());
114 Gtk::MessageDialog md(*
this, message,
false,
115 Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK,
117 md.set_title(
"Connection failed");
120 ntb_logviewers.remove_page(page);
127 NetLogGuiGtkWindow::on_exit_clicked()
134 NetLogGuiGtkWindow::on_clear_clicked()
136 int page = ntb_logviewers.get_current_page();
138 Gtk::ScrolledWindow *scrolled =
dynamic_cast<Gtk::ScrolledWindow *
>(ntb_logviewers.get_nth_page(page));
148 if ( ntb_logviewers.get_n_pages() == 0 ) {
149 lab_no_connection->hide();
153 ntb_logviewers.show();
156 Gtk::HBox *hbox = Gtk::manage(
new Gtk::HBox(
false, 4));
157 Gtk::Button *button = Gtk::manage(
new Gtk::Button());
158 Gtk::Image *image = Gtk::manage(
new Gtk::Image(Gtk::Stock::CONNECT, Gtk::ICON_SIZE_BUTTON));
160 button->set_relief(Gtk::RELIEF_NONE);
161 Gtk::Label *label = Gtk::manage(
new Gtk::Label());
162 label->set_markup(Glib::ustring(
"<b>") + service->
host() +
"</b>\n" + service->
addr_string());
163 label->set_line_wrap();
164 Gtk::Label *invisible = Gtk::manage(
new Gtk::Label(Glib::ustring(service->
name()) +
"::" + service->
type() +
"::" + service->
domain()));
165 Gtk::ScrolledWindow *scrolled = Gtk::manage(
new Gtk::ScrolledWindow());
166 scrolled->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
171 hbox->pack_start(*button);
172 hbox->pack_start(*label);
173 hbox->pack_start(*invisible);
175 button->signal_clicked().connect(sigc::bind(sigc::mem_fun(*
this, &NetLogGuiGtkWindow::on_connbut_clicked), image, logview));
186 int rv = ntb_logviewers.append_page(*logview, *hbox);
195 bool removed =
false;
199 for (
int i = 0; ! removed && (i < ntb_logviewers.get_n_pages()); ++i) {
200 Gtk::Widget *child = ntb_logviewers.get_nth_page(i);
201 Gtk::Widget *tab_label = ntb_logviewers.get_tab_label(*child);
202 Gtk::HBox *hbox =
dynamic_cast<Gtk::HBox *
>(tab_label);
205 std::vector<Gtk::Widget *> children = hbox->get_children();
206 Gtk::Widget *w = children[2];
208 Gtk::Label *label =
dynamic_cast<Gtk::Label *
>(w);
210 Glib::ustring s = Glib::ustring(service->
name()) +
"::" + service->
type() +
"::" + service->
domain();
211 if (label->get_text() == s) {
212 ntb_logviewers.remove_page(i);
221 if ( ntb_logviewers.get_n_pages() == 0 ) {
222 ntb_logviewers.hide();
226 lab_no_connection->show();
232 NetLogGuiGtkWindow::on_connbut_clicked(Gtk::Image *image,
fawkes::LogView *logview)
241 Glib::ustring message = *(e.
begin());
242 Gtk::MessageDialog md(*
this, message,
false,
243 Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK,
245 md.set_title(
"Connection failed");
253 NetLogGuiGtkWindow::on_connected(Gtk::Image *image)
255 image->set(Gtk::Stock::DISCONNECT, Gtk::ICON_SIZE_BUTTON);
260 NetLogGuiGtkWindow::on_disconnected(Gtk::Image *image)
262 image->set(Gtk::Stock::CONNECT, Gtk::ICON_SIZE_BUTTON);
sigc::signal< void > signal_disconnected()
Get "disconnected" signal.
sigc::signal< void > signal_connected()
Get "connected" signal.
ConnectionDispatcher * get_connection_dispatcher() const
Get ConnectionDispatcher instance that is used internally.
Simple Fawkes network client.
void clear()
Clear all records.
FawkesNetworkClient * get_client()
Get the used FawkesNetworkClient.
Fawkes library namespace.
void disconnect()
Disconnect socket.
const char * host() const
Get host of service.
void connect()
Connect to remote.
std::string addr_string() const
Get IP address of entry as string.
unsigned short int port() const
Get port of service.
sigc::signal< void, NetworkService * > signal_service_removed()
Get "service remove" signal.
Base class for exceptions in Fawkes.
~NetLogGuiGtkWindow()
Destructor.
void watch_service(const char *service_type, ServiceBrowseHandler *h)
Add a result handler.
iterator begin()
Get iterator for messages.
void get_raw_address(struct sockaddr *addr, socklen_t addr_size)
Get raw address.
Representation of a service announced or found via service discovery (i.e.
void cancel()
Cancel a thread.
const char * domain() const
Get domain of service.
void join()
Join the thread.
bool connected() const
Check if connection is alive.
void get_selected_service(Glib::ustring &name, Glib::ustring &hostname, unsigned short int &port)
Get selected service.
sigc::signal< void, NetworkService * > signal_service_added()
Get "service added" signal.
const char * type() const
Get type of service.
NetLogGuiGtkWindow(BaseObjectType *cobject, const Glib::RefPtr< Gtk::Builder > &builder)
Constructor.
void start(bool wait=true)
Call this method to start the thread.
const char * name() const
Get name of service.