24 #include <arpa/inet.h>
25 #include <core/exception.h>
26 #include <core/exceptions/software.h>
27 #include <gui_utils/service_chooser_dialog.h>
28 #include <gui_utils/service_model.h>
29 #include <netcomm/fawkes/client.h>
30 #include <netcomm/utils/resolver.h>
31 #include <netinet/in.h>
32 #include <sys/socket.h>
33 #include <sys/types.h>
34 #include <utils/system/argparser.h>
40 # define GCONF_DIR "/apps/fawkes/service_chooser_dialog"
41 # define GCONF_PREFIX GCONF_DIR "/"
62 : Gtk::Dialog(title, parent, true), parent_(parent), expander_(
"Manual entry")
79 : Gtk::Dialog(title, parent, true), parent_(parent), expander_(
"Manual entry")
90 if (expander_.get_expanded() && !treeview_.has_focus() && entry_.get_text_length() > 0) {
91 gconf_->set(GCONF_PREFIX
"manual_host", entry_.get_text());
92 gconf_->set(GCONF_PREFIX
"manual_expanded",
true);
94 gconf_->set(GCONF_PREFIX
"manual_expanded",
false);
97 delete service_model_;
101 ServiceChooserDialog::ctor()
103 set_default_size(480, 300);
108 scrollwin_.add(treeview_);
109 scrollwin_.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
111 expander_.add(entry_);
113 entry_.set_activates_default(
true);
115 Glib::ustring default_host(
"localhost");
117 gconf_ = Gnome::Conf::Client::get_default_client();
118 gconf_->add_dir(GCONF_DIR);
119 Gnome::Conf::Value host_val = gconf_->get_without_default(GCONF_PREFIX
"manual_host");
120 if (host_val.get_type() == Gnome::Conf::VALUE_STRING) {
121 default_host = host_val.get_string();
125 char *fawkes_ip = getenv(
"FAWKES_IP");
127 entry_.set_text(fawkes_ip);
129 entry_.set_text(default_host);
131 Gtk::Box *vbox = get_vbox();
132 vbox->pack_start(scrollwin_);
133 vbox->pack_end(expander_, Gtk::PACK_SHRINK);
137 add_button(Gtk::Stock::CANCEL, 0);
138 add_button(Gtk::Stock::OK, 1);
140 set_default_response(1);
142 treeview_.signal_row_activated().connect(
143 sigc::bind(sigc::hide<0>(sigc::hide<0>(sigc::mem_fun(*
this, &ServiceChooserDialog::response))),
146 #ifdef GLIBMM_PROPERTIES_ENABLED
147 expander_.property_expanded().signal_changed().connect(
152 if (gconf_->get_bool(GCONF_PREFIX
"manual_expanded")) {
153 expander_.set_expanded(
true);
168 Glib::ustring & hostname,
169 unsigned short int &port)
171 Glib::RefPtr<Gtk::TreeSelection> treesel = treeview_.get_selection();
172 if (expander_.get_expanded() && !treeview_.has_focus()) {
173 if (entry_.get_text_length() > 0) {
174 std::string tmp_hostname;
176 hostname = tmp_hostname;
182 Gtk::TreeModel::iterator iter = treesel->get_selected();
184 Gtk::TreeModel::Row row = *iter;
205 struct sockaddr_storage &sockaddr)
207 Glib::RefPtr<Gtk::TreeSelection> treesel = treeview_.get_selection();
208 if (expander_.get_expanded() && !treeview_.has_focus() && entry_.get_text_length() > 0) {
209 throw Exception(
"May not be called for manual entry");
212 Gtk::TreeModel::iterator iter = treesel->get_selected();
214 Gtk::TreeModel::Row row = *iter;
261 if (expander_.get_expanded()) {
264 treeview_.grab_focus();
281 throw Exception(
"Client is already connected");
285 if (expander_.get_expanded() && !treeview_.has_focus() && entry_.get_text_length() > 0) {
286 Glib::ustring name, hostname;
287 unsigned short int port;
289 client_->
connect(hostname.c_str(), port);
292 struct sockaddr_storage sockaddr;
293 Glib::ustring hostname;
295 client_->
connect(hostname.c_str(), sockaddr);
298 Glib::ustring message = *(e.
begin());
299 Gtk::MessageDialog md(parent_,
305 md.set_title(
"Connection failed");
static void parse_hostport_s(const char *s, char **host, unsigned short int *port)
Parse host:port string.
Base class for exceptions in Fawkes.
iterator begin()
Get iterator for messages.
Simple Fawkes network client.
bool connected() const
Check if connection is alive.
void connect()
Connect to remote.
A NULL pointer was supplied where not allowed.
void get_raw_address(struct sockaddr *addr, socklen_t addr_size)
Get raw address.
ServiceChooserDialog(Gtk::Window &parent, FawkesNetworkClient *client, Glib::ustring title="Select Service", const char *service="_fawkes._tcp")
Constructor.
virtual ~ServiceChooserDialog()
Destructor.
virtual void on_expander_changed()
Signal handler for expander event.
void run_and_connect()
Run dialog and try to connect.
void get_selected_service(Glib::ustring &name, Glib::ustring &hostname, unsigned short int &port)
Get selected service.
Gtk::TreeModelColumn< unsigned short > port
The port the service is running on.
Gtk::TreeModelColumn< Glib::ustring > addrport
Address:port string.
Gtk::TreeModelColumn< Glib::ustring > name
The name of the service.
Gtk::TreeModelColumn< struct sockaddr_storage > sockaddr
sockaddr structure
Gtk::TreeModelColumn< Glib::ustring > ipaddr
The IP address as string of the host the service is running on.
Abstract base class for widgets that allow to view the detected services of a certain type.
ServiceRecord & get_column_record()
Access the column record.
Glib::RefPtr< Gtk::ListStore > & get_list_store()
Get a reference to the model.
Fawkes library namespace.