00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <gui_utils/service_selector_cbe.h>
00026 #include <gui_utils/service_model.h>
00027 #include <gui_utils/connection_dispatcher.h>
00028 #include <netcomm/fawkes/client.h>
00029
00030 #include <sstream>
00031
00032 using namespace fawkes;
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 ServiceSelectorCBE::ServiceSelectorCBE( Gtk::ComboBoxEntry* services,
00074 Gtk::Button* connect,
00075 Gtk::Window* parent,
00076 const char* service )
00077 {
00078 m_service_model = new ServiceModel(service);
00079
00080 m_cbe_services = services;
00081 m_btn_connect = connect;
00082 m_tbtn_connect = NULL;
00083 m_parent = parent;
00084
00085 initialize();
00086 }
00087
00088
00089
00090
00091
00092
00093
00094 ServiceSelectorCBE::ServiceSelectorCBE( Gtk::ComboBoxEntry* services,
00095 Gtk::ToolButton* connect,
00096 Gtk::Window* parent,
00097 const char* service )
00098 {
00099 m_service_model = new ServiceModel(service);
00100
00101 m_cbe_services = services;
00102 m_btn_connect = NULL;
00103 m_tbtn_connect = connect;
00104 m_parent = parent;
00105
00106 initialize();
00107 }
00108
00109 #ifdef HAVE_GLADEMM
00110
00111
00112
00113
00114
00115
00116
00117 ServiceSelectorCBE::ServiceSelectorCBE( Glib::RefPtr<Gnome::Glade::Xml> ref_xml,
00118 const char* cbe_name,
00119 const char* btn_name,
00120 const char* wnd_name,
00121 const char* service )
00122 {
00123 m_service_model = new ServiceModel(service);
00124
00125 ref_xml->get_widget(wnd_name, m_parent);
00126 ref_xml->get_widget(cbe_name, m_cbe_services);
00127 ref_xml->get_widget(btn_name, m_btn_connect);
00128
00129 initialize();
00130 }
00131 #endif
00132
00133
00134 void
00135 ServiceSelectorCBE::initialize()
00136 {
00137 m_cbe_services->set_model( m_service_model->get_list_store() );
00138 m_cbe_services->set_text_column(m_service_model->get_column_record().name);
00139 m_cbe_services->get_entry()->set_activates_default(true);
00140 m_cbe_services->signal_changed().connect( sigc::mem_fun( *this, &ServiceSelectorCBE::on_service_selected) );
00141
00142 Gtk::Entry *ent = static_cast<Gtk::Entry *>(m_cbe_services->get_child());
00143 if (ent)
00144 {
00145 char * fawkes_ip = getenv("FAWKES_IP");
00146 if (fawkes_ip) ent->set_text(fawkes_ip);
00147 else ent->set_text("localhost");
00148 }
00149
00150 if ( m_btn_connect )
00151 {
00152 m_btn_connect->signal_clicked().connect( sigc::mem_fun( *this, &ServiceSelectorCBE::on_btn_connect_clicked) );
00153 m_btn_connect->set_label("gtk-connect");
00154 m_btn_connect->set_use_stock(true);
00155 m_btn_connect->grab_default();
00156 }
00157 else
00158 {
00159 m_tbtn_connect->signal_clicked().connect( sigc::mem_fun( *this, &ServiceSelectorCBE::on_btn_connect_clicked) );
00160 m_tbtn_connect->set_stock_id( Gtk::StockID("gtk-connect") );
00161 m_tbtn_connect->grab_default();
00162 }
00163
00164 m_dispatcher = new ConnectionDispatcher();
00165 m_dispatcher->signal_connected().connect(sigc::mem_fun(*this, &ServiceSelectorCBE::on_connected));
00166 m_dispatcher->signal_disconnected().connect(sigc::mem_fun(*this, &ServiceSelectorCBE::on_disconnected));
00167
00168 __hostname = "";
00169 __port = 0;
00170 }
00171
00172
00173 ServiceSelectorCBE::~ServiceSelectorCBE()
00174 {
00175 delete m_dispatcher;
00176 delete m_service_model;
00177 }
00178
00179
00180
00181
00182 FawkesNetworkClient*
00183 ServiceSelectorCBE::get_network_client()
00184 {
00185 return m_dispatcher->get_client();
00186 }
00187
00188
00189
00190
00191
00192 Glib::ustring
00193 ServiceSelectorCBE::get_hostname()
00194 {
00195 return __hostname;
00196 }
00197
00198
00199
00200
00201
00202 Glib::ustring
00203 ServiceSelectorCBE::get_name()
00204 {
00205 return __servicename;
00206 }
00207
00208
00209
00210
00211
00212 unsigned int
00213 ServiceSelectorCBE::get_port()
00214 {
00215 return __port;
00216 }
00217
00218
00219
00220
00221 sigc::signal<void>
00222 ServiceSelectorCBE::signal_connected()
00223 {
00224 return m_dispatcher->signal_connected();
00225 }
00226
00227
00228
00229
00230 sigc::signal<void>
00231 ServiceSelectorCBE::signal_disconnected()
00232 {
00233 return m_dispatcher->signal_disconnected();
00234 }
00235
00236
00237
00238
00239 void
00240 ServiceSelectorCBE::on_btn_connect_clicked()
00241 {
00242 FawkesNetworkClient *client = m_dispatcher->get_client();
00243
00244 if (client->connected())
00245 {
00246 client->disconnect();
00247 if ( m_btn_connect )
00248 { m_btn_connect->set_label("gtk-connect"); }
00249 else
00250 { m_tbtn_connect->set_label("gtk-connect"); }
00251 }
00252 else
00253 {
00254 if ( -1 == m_cbe_services->get_active_row_number() )
00255 {
00256 Gtk::Entry* entry = m_cbe_services->get_entry();
00257 __hostname = entry->get_text();
00258
00259 Glib::ustring::size_type pos;
00260 if ((pos = __hostname.find(':')) != Glib::ustring::npos)
00261 {
00262 Glib::ustring host = "";
00263 unsigned int port = 1234567;
00264 std::istringstream is(__hostname.replace(pos, 1, " "));
00265 is >> host;
00266 is >> port;
00267
00268 if (port != 1234567 && host.size())
00269 {
00270 __hostname = host;
00271 __port = port;
00272 }
00273 }
00274 else __port = 1910;
00275 __servicename = __hostname;
00276 }
00277 else
00278 {
00279 Gtk::TreeModel::Row row = *m_cbe_services->get_active();
00280 __hostname = row[m_service_model->get_column_record().hostname];
00281 __servicename = row[m_service_model->get_column_record().name];
00282 __port = row[m_service_model->get_column_record().port];
00283 }
00284
00285 try
00286 {
00287 client->connect( __hostname.c_str(), __port );
00288 }
00289 catch (Exception& e)
00290 {
00291 Glib::ustring message = *(e.begin());
00292 Gtk::MessageDialog md(*m_parent, message, false,
00293 Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK,
00294 true);
00295 md.set_title("Connection failed");
00296 md.run();
00297 }
00298 }
00299 }
00300
00301
00302
00303
00304 void
00305 ServiceSelectorCBE::on_service_selected()
00306 {
00307 if ( -1 == m_cbe_services->get_active_row_number() ) return;
00308
00309 FawkesNetworkClient *client = m_dispatcher->get_client();
00310 if ( client->connected() )
00311 {
00312 client->disconnect();
00313 }
00314
00315 Gtk::TreeModel::Row row = *m_cbe_services->get_active();
00316 __hostname = row[m_service_model->get_column_record().hostname];
00317 __servicename = row[m_service_model->get_column_record().name];
00318 __port = row[m_service_model->get_column_record().port];
00319
00320 m_cbe_services->get_entry()->set_text(__hostname);
00321
00322 try
00323 {
00324 client->connect( __hostname.c_str(), __port );
00325 }
00326 catch (Exception& e)
00327 {
00328 Glib::ustring message = *(e.begin());
00329 Gtk::MessageDialog md(*m_parent, message, false,
00330 Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK,
00331 true);
00332 md.set_title("Connection failed");
00333 md.run();
00334 }
00335 }
00336
00337
00338 void
00339 ServiceSelectorCBE::on_connected()
00340 {
00341 if ( m_btn_connect )
00342 { m_btn_connect->set_label("gtk-disconnect"); }
00343 else
00344 { m_tbtn_connect->set_stock_id( Gtk::StockID("gtk-disconnect") ); }
00345 }
00346
00347
00348 void
00349 ServiceSelectorCBE::on_disconnected()
00350 {
00351 if ( m_btn_connect )
00352 { m_btn_connect->set_label("gtk-connect"); }
00353 else
00354 { m_tbtn_connect->set_stock_id( Gtk::StockID("gtk-connect") ); }
00355 }