00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00026 #include "config.h"
00027
00028 #include <string.h>
00029
00030 #include <gtk/gtk.h>
00031
00032 #include <liberdm/connectionMgrConstants.h>
00033 #include <liberdm/display.h>
00034 #include <liberregxml/erregapi.h>
00035 #include <libergtk/ergtk.h>
00036
00037 #include "connectionMgrLog.h"
00038 #include "displayStatus.h"
00039 #include "erbusy.h"
00040 #include "background.h"
00041 #include "connectionMgr.h"
00042 #include "gtkSettingItem.h"
00043 #include "gtkInfoItem.h"
00044 #include "widgetUtils.h"
00045 #include "connectScreen.h"
00046 #include "connectScreenData.h"
00047 #include "editScreen.h"
00048 #include "editScreenOverview.h"
00049 #include "editScreenWireless.h"
00050 #include "connectScan.h"
00051 #include "connectBackground.h"
00052 #include "languages.h"
00053
00054 typedef enum
00055 {
00056 inputSSID_e,
00057 inputEncrType_e,
00058 inputEncrKeyWEP_e,
00059 inputEncrKeyWPA_e,
00060 wlanInputProfileName_e,
00061 wlanConnecting_e,
00062 wlanConnected_e,
00063 wlanUnconnected_e,
00064 wlanAborting_e,
00065 wlanAborted_e,
00066 undefWlanStatus_e
00067 }wlanStatus_t;
00068
00069
00070 static GtkWidget* g_wireless = NULL;
00071
00072 static bkWdtLabelEntry *g_ssid = NULL;
00073 static bkWdtLabelButton *g_encrtype = NULL;
00074 static bkWdtLabelEntry *g_encrkey = NULL;
00075 static bkWdtLabelEntry *g_profilename = NULL;
00076 static bkWdtLabelButton *g_buttons = NULL;
00077
00078 static GtkWidget *g_info = NULL;
00079
00080 static wlanStatus_t g_wlan_status = undefWlanStatus_e;
00081
00082 static network_spec_t* g_found_network = NULL;
00083
00084 static regWirelessSetting_t *g_old_settings = NULL;
00085 static char *g_old_profilename = NULL;
00086
00087 static void edit_wireless_set_status(wlanStatus_t status);
00088
00089 static void on_ssid_changed(GtkEntry *widget, gpointer data);
00090 static void on_ssid_next(GtkToggleButton *button, gpointer data);
00091
00092 static void on_encrtype_update(GtkWidget *selection,
00093 gpointer button,
00094 gpointer data);
00095
00096 static void on_encrkey_changed(GtkEntry *widget, gpointer data);
00097
00098 static void on_profilename_changed(GtkEntry *widget, gpointer data);
00099 static void on_profilename_next(GtkToggleButton *button, gpointer data);
00100
00101 static void on_buttons_update(GtkWidget *selection,
00102 gpointer button,
00103 gpointer data);
00104
00105 static gboolean delayed_deactive_button(gpointer data);
00106
00107 static void on_test(void);
00108 static void on_save(void);
00109 static void on_saveconnect(void);
00110
00111 static void edit_wireless_restore_scan_ctxt(void);
00112 static void scan_done(connection_t networkType,
00113 network_spec_t* pScanNetworks,
00114 int nScanNetworks);
00115 static void scan_done_after(void);
00116 static void edit_wireless_restore_ping_ctxt(void);
00117 static void on_connected(int profileIndex);
00118 static void on_failed(void);
00119 static void ui_update_status(int profileIndex, pingStatus_t status);
00120 static void ui_display_settings(int profileIndex, gboolean resetStatus);
00121 static void ui_select_profile(int profileIndex);
00122 static void ui_unselect_all_profile(void);
00123
00124 static void edit_wireless_freeze_ui(gboolean freeze);
00125
00127
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140 GtkWidget *edit_wireless_create(void)
00141 {
00142 GtkWidget *item;
00143 GtkWidget *vbox;
00144 bkWdtLabelEntry *ssid;
00145 bkWdtLabelButton *encrtype;
00146 bkWdtLabelEntry *encrkey;
00147 bkWdtLabelEntry *profilename;
00148 bkWdtLabelButton *buttons;
00149 GtkWidget *info;
00150 GtkWidget *widget;
00151
00152 CN_LOGPRINTF("entry");
00153
00154
00155 item = gtk_settingitem_new("");
00156
00157
00158 vbox = gtk_vbox_new(FALSE, VBOX_SPACING);
00159 gtk_settingitem_add_details(GTK_SETTINGITEM(item), vbox);
00160
00161
00162 ssid = bk_wdt_label_entry_new(string_e);
00163 gtk_box_pack_start(GTK_BOX(vbox), ssid->background, FALSE, FALSE, 0);
00164
00165
00166 encrtype = bk_wdt_label_button_new(3, TRUE, 0, 1);
00167 gtk_box_pack_start(GTK_BOX(vbox), encrtype->background,
00168 FALSE, FALSE, 0);
00169
00170
00171 encrkey = bk_wdt_label_entry_new(string_e);
00172 gtk_entry_set_visibility(GTK_ENTRY(encrkey->details->entry), FALSE);
00173 gtk_box_pack_start(GTK_BOX(vbox), encrkey->background,
00174 FALSE, FALSE, 0);
00175
00176
00177 profilename = bk_wdt_label_entry_new(string_e);
00178 gtk_box_pack_start(GTK_BOX(vbox), profilename->background,
00179 FALSE, FALSE, 0);
00180
00181
00182 buttons = bk_wdt_label_button_new(3, FALSE, 0, 1);
00183 gtk_box_pack_start(GTK_BOX(vbox), buttons->background,
00184 FALSE, FALSE, 0);
00185
00186
00187 info = gtk_infoitem_new(FALSE);
00188 gtk_box_pack_start(GTK_BOX(vbox), info, FALSE, FALSE, 0);
00189
00190
00191 widget = ssid->details->entry;
00192 g_signal_connect_after(G_OBJECT(widget), "changed-stable",
00193 G_CALLBACK(on_ssid_changed), NULL);
00194 widget = ssid->details->button;
00195 g_signal_connect_after(G_OBJECT(widget), "toggled",
00196 G_CALLBACK(on_ssid_next), NULL);
00197
00198 widget = GTK_WIDGET(encrtype->details->selection);
00199 g_signal_connect(G_OBJECT(widget), "selection-update",
00200 G_CALLBACK(on_encrtype_update), NULL);
00201
00202 widget = encrkey->details->entry;
00203 g_signal_connect_after(G_OBJECT(widget), "changed-stable",
00204 G_CALLBACK(on_encrkey_changed), NULL);
00205
00206 widget = profilename->details->entry;
00207 g_signal_connect_after(G_OBJECT(widget), "changed-stable",
00208 G_CALLBACK(on_profilename_changed), NULL);
00209 widget = profilename->details->button;
00210 g_signal_connect_after(G_OBJECT(widget), "toggled",
00211 G_CALLBACK(on_profilename_next), NULL);
00212
00213 widget = GTK_WIDGET(buttons->details->selection);
00214 g_signal_connect(G_OBJECT(widget), "selection-update",
00215 G_CALLBACK(on_buttons_update), NULL);
00216
00217
00218 gtk_widget_show(item);
00219 gtk_widget_show(vbox);
00220 gtk_widget_show(ssid->background);
00221 gtk_widget_show(encrtype->background);
00222 gtk_widget_show(encrkey->background);
00223 gtk_widget_hide(encrkey->details->button);
00224 gtk_widget_show(profilename->background);
00225 gtk_widget_show(buttons->background);
00226 gtk_widget_show(info);
00227
00228
00229 g_wireless = item;
00230 g_ssid = ssid;
00231 g_encrtype = encrtype;
00232 g_encrkey = encrkey;
00233 g_profilename = profilename;
00234 g_buttons = buttons;
00235 g_info = info;
00236
00237 CN_LOGPRINTF("done");
00238
00239
00240 return item;
00241 }
00242
00243 static void edit_wireless_show_widgets(wlanStatus_t mode)
00244 {
00245 wireless_encr_type_t encrtype;
00246
00247 CN_LOGPRINTF("entry mode[%d]", mode);
00248
00249 switch (mode)
00250 {
00251 case inputSSID_e:
00252 gtk_widget_show(g_ssid->background);
00253 gtk_widget_show(g_ssid->details->button);
00254 gtk_widget_hide(g_encrtype->background);
00255 gtk_widget_hide(g_encrkey->background);
00256 gtk_widget_hide(g_profilename->background);
00257 gtk_widget_hide(g_buttons->background);
00258 gtk_widget_grab_focus(g_ssid->details->entry);
00259 break;
00260 case inputEncrType_e:
00261 gtk_widget_show(g_ssid->background);
00262 gtk_widget_hide(g_ssid->details->button);
00263 gtk_widget_show(g_encrtype->background);
00264 gtk_widget_hide(g_encrkey->background);
00265 gtk_widget_hide(g_profilename->background);
00266 gtk_widget_hide(g_buttons->background);
00267 break;
00268 case inputEncrKeyWEP_e:
00269 case inputEncrKeyWPA_e:
00270 gtk_widget_show(g_ssid->background);
00271 gtk_widget_hide(g_ssid->details->button);
00272 gtk_widget_show(g_encrtype->background);
00273 gtk_widget_show(g_encrkey->background);
00274 gtk_widget_show(g_profilename->background);
00275 gtk_widget_show(g_buttons->background);
00276 gtk_widget_grab_focus(g_encrkey->details->entry);
00277 break;
00278 case wlanInputProfileName_e:
00279 case undefWlanStatus_e:
00280 default:
00281 gtk_widget_show(g_ssid->background);
00282 gtk_widget_hide(g_ssid->details->button);
00283 gtk_widget_show(g_encrtype->background);
00284 encrtype = edit_wireless_get_encrtype();
00285 if (encrtype == encr_none_t)
00286 {
00287 gtk_widget_hide(g_encrkey->background);
00288 }
00289 else
00290 {
00291 gtk_widget_show(g_encrkey->background);
00292 }
00293 gtk_widget_show(g_profilename->background);
00294 gtk_widget_show(g_buttons->background);
00295 gtk_widget_grab_focus(g_profilename->details->entry);
00296 break;
00297 }
00298 }
00299
00300 void edit_wireless_enable_save_button(gboolean enable)
00301 {
00302 GtkWidget *widget;
00303
00304 CN_LOGPRINTF("entry %d", enable);
00305
00306 if (g_buttons)
00307 {
00308 widget = GTK_WIDGET(g_buttons->details->buttonList[1]);
00309 gtk_widget_set_sensitive(widget, enable);
00310 }
00311 }
00312
00313 void edit_wireless_set_text (void)
00314 {
00315 GtkWidget *widget;
00316
00317 CN_LOGPRINTF("entry");
00318
00319 if (g_wireless)
00320 {
00321 gtk_settingitem_set_header_text(GTK_SETTINGITEM(g_wireless),
00322 _("Network profile"));
00323 }
00324
00325 if (g_ssid)
00326 {
00327 widget = g_ssid->details->label;
00328 gtk_label_set_text(GTK_LABEL(widget),
00329 _("Type the network name (SSID) and click 'Next'."));
00330
00331 widget = g_ssid->details->button;
00332 gtk_button_set_label(GTK_BUTTON(widget), _("Next"));
00333 }
00334
00335 if (g_encrtype)
00336 {
00337 widget = g_encrtype->details->label;
00338 gtk_label_set_text(GTK_LABEL(widget),
00339 _("Select the security type of this wireless network."));
00340
00341 widget = GTK_WIDGET(g_encrtype->details->buttonList[0]);
00342 gtk_button_set_label(GTK_BUTTON(widget), _("Off"));
00343
00344 widget = GTK_WIDGET(g_encrtype->details->buttonList[1]);
00345 gtk_button_set_label(GTK_BUTTON(widget), _("WEP"));
00346
00347 widget = GTK_WIDGET(g_encrtype->details->buttonList[2]);
00348 gtk_button_set_label(GTK_BUTTON(widget), _("WPA"));
00349 }
00350
00351 if (g_encrkey)
00352 {
00353 widget = g_encrkey->details->label;
00354 gtk_label_set_text(GTK_LABEL(widget),
00355 _("Enter the security key / passphrase:"));
00356 }
00357
00358 if (g_profilename)
00359 {
00360 widget = g_profilename->details->label;
00361 gtk_label_set_text(GTK_LABEL(widget),
00362 _("You can personalize the profile name."));
00363
00364 widget = g_profilename->details->button;
00365 gtk_button_set_label(GTK_BUTTON(widget), _("Next"));
00366 }
00367
00368 if (g_buttons)
00369 {
00370 widget = g_buttons->details->label;
00371 gtk_label_set_text(GTK_LABEL(widget),
00372 _("Select an action for this profile."));
00373
00374 widget = GTK_WIDGET(g_buttons->details->buttonList[0]);
00375 gtk_button_set_label(GTK_BUTTON(widget), _("Test"));
00376
00377 widget = GTK_WIDGET(g_buttons->details->buttonList[1]);
00378 gtk_button_set_label(GTK_BUTTON(widget), _("Save"));
00379
00380 widget = GTK_WIDGET(g_buttons->details->buttonList[2]);
00381 gtk_button_set_label(GTK_BUTTON(widget), _("Save & Connect"));
00382 }
00383 }
00384
00385 static void edit_wireless_update_info_text(wlanStatus_t status)
00386 {
00387 CN_LOGPRINTF("entry");
00388
00389 g_return_if_fail(g_info != NULL);
00390
00391 switch (status)
00392 {
00393 case inputSSID_e:
00394 gtk_infoitem_set_icon(GTK_INFOITEM(g_info), iconInfo_e);
00395 gtk_infoitem_set_text(GTK_INFOITEM(g_info),
00396 _("If you do not know the network name "
00397 "for this access point, "
00398 "please ask your network administrator."));
00399 break;
00400 case inputEncrType_e:
00401 gtk_infoitem_set_icon(GTK_INFOITEM(g_info), iconInfo_e);
00402 gtk_infoitem_set_text(GTK_INFOITEM(g_info),
00403 _("Click 'Off' for a non secured network "
00404 "or choose the security type of "
00405 "your network.\n"
00406 "Both 'WEP' and 'WPA' requires a security key."));
00407 break;
00408 case inputEncrKeyWEP_e:
00409 gtk_infoitem_set_icon(GTK_INFOITEM(g_info), iconInfo_e);
00410 gtk_infoitem_set_text(GTK_INFOITEM(g_info),
00411 _("For WEP, set your local router device to a HEX key.\n"
00412 "Hint: If you do not know the security key "
00413 "for this network, "
00414 "please ask your network adminitrator."));
00415 break;
00416 case inputEncrKeyWPA_e:
00417 gtk_infoitem_set_icon(GTK_INFOITEM(g_info), iconInfo_e);
00418 gtk_infoitem_set_text(GTK_INFOITEM(g_info),
00419 _("For WPA, set your router to PSK mode with TKIP.\n"
00420 "Hint: If you do not know the security key "
00421 "for this network, "
00422 "please ask your network administrator."));
00423 break;
00424 case wlanInputProfileName_e:
00425 case undefWlanStatus_e:
00426 gtk_infoitem_set_icon(GTK_INFOITEM(g_info), iconInfo_e);
00427 gtk_infoitem_set_text(GTK_INFOITEM(g_info),
00428 _("If you personalize the profile name, "
00429 "it will be easy to recognize "
00430 "in the iLiad's network profile list.\n"
00431 "Click 'Next' for more advanced settings."));
00432 break;
00433 case wlanConnecting_e:
00434 gtk_infoitem_set_icon(GTK_INFOITEM(g_info), iconInfo_e);
00435 gtk_infoitem_set_text(GTK_INFOITEM(g_info),
00436 _("The iLiad is trying to connect to the server."));
00437 break;
00438 case wlanConnected_e:
00439 gtk_infoitem_set_icon(GTK_INFOITEM(g_info), iconOk_e);
00440 gtk_infoitem_set_text(GTK_INFOITEM(g_info),
00441 _("Connection to the server established."));
00442 break;
00443 case wlanUnconnected_e:
00444 gtk_infoitem_set_icon(GTK_INFOITEM(g_info), iconFailed_e);
00445 gtk_infoitem_set_text(GTK_INFOITEM(g_info),
00446 _("Connection to server "
00447 "can not been established correctly."));
00448 break;
00449 case wlanAborting_e:
00450 gtk_infoitem_set_icon(GTK_INFOITEM(g_info), iconInfo_e);
00451 gtk_infoitem_set_text(GTK_INFOITEM(g_info),
00452 _("The iLiad is aborting the connection."));
00453 break;
00454 case wlanAborted_e:
00455 gtk_infoitem_set_icon(GTK_INFOITEM(g_info), iconInfo_e);
00456 gtk_infoitem_set_text(GTK_INFOITEM(g_info),
00457 _("The connection has been aborted."));
00458 break;
00459
00460 default:
00461 break;
00462 }
00463 }
00464
00465
00466 static wlanStatus_t edit_wireless_detect_status(void)
00467 {
00468 erGtkEntry *ssid, *encrkey, *profilename;
00469 wireless_encr_type_t encrtype;
00470 wlanStatus_t status = undefWlanStatus_e;
00471
00472 CN_LOGPRINTF("entry");
00473
00474 ssid = ERGTK_ENTRY(g_ssid->details->entry);
00475 encrtype = edit_wireless_get_encrtype();
00476 profilename = ERGTK_ENTRY(g_profilename->details->entry);
00477 encrkey = ERGTK_ENTRY(g_encrkey->details->entry);
00478
00479 if (!ergtk_entry_check_field(ssid))
00480 {
00481 status = inputSSID_e;
00482 }
00483 else if (encrtype == encr_undefined_t)
00484 {
00485 status = inputEncrType_e;
00486 }
00487 else if (encrtype == encr_none_t)
00488 {
00489 if (!ergtk_entry_check_field(profilename))
00490 {
00491 status = wlanInputProfileName_e;
00492 }
00493 }
00494 else if (!ergtk_entry_check_field(encrkey))
00495 {
00496 if (encrtype == encr_wep_t)
00497 {
00498 status = inputEncrKeyWEP_e;
00499 }
00500 else if (encrtype == encr_wpa_t)
00501 {
00502 status = inputEncrKeyWPA_e;
00503 }
00504 }
00505 else if (!ergtk_entry_check_field(profilename))
00506 {
00507 status = wlanInputProfileName_e;
00508 }
00509
00510 CN_LOGPRINTF("return %d", status);
00511 return status;
00512 }
00513
00514 void edit_wireless_determine_status(void)
00515 {
00516 wlanStatus_t status;
00517
00518 status = edit_wireless_detect_status();
00519 edit_wireless_set_status(status);
00520 }
00521
00522 static gboolean on_delay_determine_status(gpointer data)
00523 {
00524 CN_LOGPRINTF("entry");
00525
00526 edit_wireless_determine_status();
00527 return FALSE;
00528 }
00529
00530 void delay_edit_wireless_determine_status(void)
00531 {
00532 g_idle_add(on_delay_determine_status, NULL);
00533 }
00534
00535 static void edit_wireless_set_status(wlanStatus_t status)
00536 {
00537 CN_LOGPRINTF("entry status[%d]", status);
00538
00539 g_wlan_status = status;
00540
00541 edit_wireless_show_widgets(status);
00542 edit_wireless_update_info_text(status);
00543 }
00544
00546
00548
00549 void edit_wireless_set_network_settings(const regNetworkProfile_t* settings)
00550 {
00551 gchar *ssid = NULL;
00552 wireless_encr_type_t encrtype = encr_none_t;
00553 gchar *encrkey = NULL;
00554 gchar *profilename = NULL;
00555 regWirelessSetting_t *wirelessSettings = NULL;
00556
00557 CN_LOGPRINTF("entry");
00558
00559 g_return_if_fail(settings != NULL);
00560 g_return_if_fail(settings->connection == wireless_t);
00561
00562 profilename = settings->name;
00563
00564 wirelessSettings = settings->wirelessSettings;
00565 if (wirelessSettings)
00566 {
00567 ssid = wirelessSettings->SSID;
00568 encrtype = wirelessSettings->encrType;
00569 encrkey = wirelessSettings->encrKey;
00570 }
00571
00572
00573 edit_wireless_set_ssid(ssid);
00574 edit_wireless_set_encrtype(encrtype);
00575 edit_wireless_set_encrkey(encrkey);
00576 edit_wireless_set_profilename(profilename);
00577
00578 delay_edit_wireless_determine_status();
00579
00580
00581 edit_wireless_backup_network_settings();
00582 }
00583
00584 void edit_wireless_set_ssid(const char* ssid)
00585 {
00586 GtkWidget* widget;
00587
00588 CN_LOGPRINTF("entry ssid[%s]", ssid);
00589
00590 if (g_ssid)
00591 {
00592 widget = g_ssid->details->entry;
00593 gtk_entry_set_text(GTK_ENTRY(widget), ssid ? ssid : "");
00594 }
00595 }
00596
00597 void edit_wireless_set_encrtype(const wireless_encr_type_t encrType)
00598 {
00599 GtkWidget *widget;
00600 erGtkSelectionGroup *sel;
00601 int nsel;
00602
00603 CN_LOGPRINTF("entry: encrType [%d]", encrType);
00604
00605
00606 switch (encrType)
00607 {
00608 case encr_undefined_t:
00609 widget = g_encrtype->details->selection;
00610 sel = ERGTK_SELECTION_GROUP(widget);
00611 ergtk_selection_group_get_selected_buttons(sel, &nsel, 1);
00612 if ((nsel >= 0) && (nsel <= 2))
00613 {
00614 widget = GTK_WIDGET(g_encrtype->details->buttonList[nsel]);
00615 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), FALSE);
00616 }
00617 break;
00618 case encr_none_t:
00619 widget = GTK_WIDGET(g_encrtype->details->buttonList[0]);
00620 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
00621 break;
00622 case encr_wep_t:
00623 widget = GTK_WIDGET(g_encrtype->details->buttonList[1]);
00624 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
00625 break;
00626 case encr_wpa_t:
00627 widget = GTK_WIDGET(g_encrtype->details->buttonList[2]);
00628 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
00629 break;
00630 default:
00631 CN_ERRORPRINTF("Illegal encryption type [%d]", encrType);
00632 g_assert_not_reached();
00633 }
00634 }
00635
00636 void edit_wireless_set_encrkey(const char* encrkey)
00637 {
00638 GtkWidget *widget;
00639
00640 CN_LOGPRINTF("entry encrkey[%s]", encrkey);
00641
00642 if (g_encrkey)
00643 {
00644 widget = g_encrkey->details->entry;
00645 gtk_entry_set_text(GTK_ENTRY(widget), encrkey ? encrkey : "");
00646 }
00647 }
00648
00649 void edit_wireless_set_profilename(const gchar* profilename)
00650 {
00651 GtkWidget *widget;
00652
00653 CN_LOGPRINTF("entry profilename[%s]", profilename);
00654
00655 if (g_profilename)
00656 {
00657 widget = g_profilename->details->entry;
00658 gtk_entry_set_text(GTK_ENTRY(widget),
00659 profilename ? profilename : "");
00660 }
00661 }
00662
00663 void edit_wireless_get_network_settings(regNetworkProfile_t* settings)
00664 {
00665 const char *ssid = NULL;
00666 const char *encrkey = NULL;
00667 const char *profilename = NULL;
00668 regWirelessSetting_t *wirelessSettings;
00669
00670 CN_LOGPRINTF("entry");
00671
00672 g_return_if_fail(settings != NULL);
00673 g_return_if_fail(settings->connection == wireless_t);
00674
00675
00676 wirelessSettings = settings->wirelessSettings;
00677 if (wirelessSettings)
00678 {
00679 g_free(wirelessSettings->SSID);
00680 g_free(wirelessSettings->encrKey);
00681 g_free(wirelessSettings);
00682 wirelessSettings = NULL;
00683 settings->wirelessSettings = NULL;
00684 }
00685
00686
00687 if (settings->connection == wireless_t)
00688 {
00689 ssid = edit_wireless_get_ssid();
00690 encrkey = edit_wireless_get_encrkey();
00691 profilename = edit_wireless_get_profilename();
00692
00693 g_free(settings->name);
00694 settings->name = g_strdup(profilename);
00695
00696 wirelessSettings = g_new0(regWirelessSetting_t, 1);
00697 g_assert(wirelessSettings != NULL);
00698 wirelessSettings->SSID = g_strdup(ssid);
00699 wirelessSettings->encrType = edit_wireless_get_encrtype();
00700 wirelessSettings->encrKey = g_strdup(encrkey);
00701
00702 wirelessSettings->broadcast = FALSE;
00703 settings->wirelessSettings = wirelessSettings;
00704 }
00705 }
00706
00707 const char* edit_wireless_get_ssid(void)
00708 {
00709 GtkWidget *widget;
00710 const char *ssid = NULL;
00711
00712 if (g_ssid)
00713 {
00714 widget = g_ssid->details->entry;
00715 ssid = gtk_entry_get_text(GTK_ENTRY(widget));
00716 }
00717
00718 CN_LOGPRINTF("return ssid=%s", ssid);
00719 return ssid;
00720 }
00721
00722 wireless_encr_type_t edit_wireless_get_encrtype(void)
00723 {
00724 GtkWidget *widget;
00725 erGtkSelectionGroup *sel;
00726 int nsel;
00727 wireless_encr_type_t encrType;
00728
00729 CN_LOGPRINTF("entry");
00730
00731 g_return_val_if_fail(g_encrtype != NULL, encr_undefined_t);
00732
00733
00734 widget = g_encrtype->details->selection;
00735 sel = ERGTK_SELECTION_GROUP(widget);
00736 ergtk_selection_group_get_selected_buttons(sel, &nsel, 1);
00737 switch (nsel)
00738 {
00739 case 0:
00740 encrType = encr_none_t;
00741 break;
00742 case 1:
00743 encrType = encr_wep_t;
00744 break;
00745 case 2:
00746 encrType = encr_wpa_t;
00747 break;
00748 default:
00749 encrType = encr_undefined_t;
00750 break;
00751 }
00752
00753 CN_LOGPRINTF("return encrType=%d", encrType);
00754 return encrType;
00755 }
00756
00757 const char* edit_wireless_get_encrkey(void)
00758 {
00759 GtkWidget *widget;
00760 const char *encrkey = NULL;
00761
00762 CN_LOGPRINTF("entry");
00763
00764 if (g_encrkey)
00765 {
00766 widget = g_encrkey->details->entry;
00767 encrkey = gtk_entry_get_text(GTK_ENTRY(widget));
00768 }
00769
00770 CN_LOGPRINTF("return encrkey=%s", encrkey);
00771 return encrkey;
00772 }
00773
00774 const char* edit_wireless_get_profilename(void)
00775 {
00776 GtkWidget *widget;
00777 const char *profilename = NULL;
00778
00779 CN_LOGPRINTF("entry");
00780
00781 if (g_profilename)
00782 {
00783 widget = g_profilename->details->entry;
00784 profilename = gtk_entry_get_text(GTK_ENTRY(widget));
00785 }
00786
00787 CN_LOGPRINTF("return profilename=%s", profilename);
00788 return profilename;
00789 }
00790
00791 gboolean edit_wireless_check_network_settings(void)
00792 {
00793 wlanStatus_t status;
00794 gboolean valid = TRUE;
00795
00796 status = edit_wireless_detect_status();
00797 if (status != undefWlanStatus_e)
00798 {
00799 valid = FALSE;
00800 }
00801
00802 CN_LOGPRINTF("return valid=%d", valid);
00803 return valid;
00804 }
00805
00806 void edit_wireless_backup_network_settings(void)
00807 {
00808 const char *ssid, *encrkey, *profilename;
00809
00810 CN_LOGPRINTF("entry");
00811
00812 ssid = edit_wireless_get_ssid();
00813 encrkey = edit_wireless_get_encrkey();
00814 profilename = edit_wireless_get_profilename();
00815
00816 if (g_old_settings)
00817 {
00818 g_free(g_old_settings->SSID);
00819 g_free(g_old_settings->encrKey);
00820 g_free(g_old_settings);
00821 }
00822
00823 g_old_settings = g_new0(regWirelessSetting_t, 1);
00824 g_assert(g_old_settings != NULL);
00825 g_old_settings->SSID = g_strdup(ssid);
00826 g_old_settings->encrType = edit_wireless_get_encrtype();
00827 g_old_settings->encrKey = g_strdup(encrkey);
00828
00829 g_free(g_old_profilename);
00830 g_old_profilename = g_strdup(profilename);
00831 }
00832
00833 void edit_wireless_restore_network_settings(void)
00834 {
00835 char *ssid = NULL;
00836 char *encrkey = NULL;
00837 char *profilename = NULL;
00838
00839 CN_LOGPRINTF("entry");
00840
00841 if (g_old_settings)
00842 {
00843 ssid = g_old_settings->SSID;
00844 encrkey = g_old_settings->encrKey;
00845 }
00846
00847 if (g_old_profilename)
00848 {
00849 profilename = g_old_profilename;
00850 }
00851
00852 edit_wireless_set_ssid(ssid);
00853 edit_wireless_set_encrtype(g_old_settings->encrType);
00854 edit_wireless_set_encrkey(encrkey);
00855 edit_wireless_set_profilename(profilename);
00856 }
00857
00859
00861
00862 static void on_ssid_changed(GtkEntry* widget, gpointer data)
00863 {
00864 CN_LOGPRINTF("entry");
00865
00866 edit_wireless_set_status(inputSSID_e);
00867 }
00868
00869
00870 static void on_ssid_next(GtkToggleButton* button, gpointer data)
00871 {
00872 gboolean active;
00873 const char *ssid;
00874 scanContext_t *ctxt;
00875
00876 CN_LOGPRINTF("entry");
00877
00878 active = gtk_toggle_button_get_active(button);
00879 if (active)
00880 {
00881 ssid = edit_wireless_get_ssid();
00882 if (ssid && ssid[0] != '\0')
00883 {
00884 edit_wireless_restore_scan_ctxt();
00885 ctxt = cmgr_get_scan_ctxt();
00886 connect_scan_ctxt_set_ssidlist(ctxt, (char*)ssid);
00887 connect_scan(ctxt, TRUE);
00888 }
00889 else
00890 {
00891 g_timeout_add(500, delayed_deactive_button, button);
00892 }
00893 }
00894 }
00895
00896 static gboolean delayed_deactive_button(gpointer data)
00897 {
00898 GtkToggleButton *button = GTK_TOGGLE_BUTTON(data);
00899
00900 if (button)
00901 {
00902 gtk_toggle_button_set_active(button, FALSE);
00903 }
00904
00905 return FALSE;
00906 }
00907
00908 static void on_encrtype_update(GtkWidget* selection,
00909 gpointer button,
00910 gpointer data)
00911 {
00912 int nsel;
00913 erGtkSelectionGroup *widget;
00914
00915 CN_LOGPRINTF("entry");
00916
00917 g_return_if_fail(g_encrtype != NULL);
00918
00919 widget = ERGTK_SELECTION_GROUP(selection);
00920 ergtk_selection_group_get_selected_buttons(widget, &nsel, 1);
00921 switch (nsel)
00922 {
00923 case 0:
00924 edit_wireless_set_status(wlanInputProfileName_e);
00925 break;
00926 case 1:
00927 edit_wireless_set_status(inputEncrKeyWEP_e);
00928 break;
00929 case 2:
00930 edit_wireless_set_status(inputEncrKeyWPA_e);
00931 break;
00932 default:
00933
00934 edit_wireless_set_status(inputEncrType_e);
00935 break;
00936 }
00937 }
00938
00939 static void on_encrkey_changed(GtkEntry *widget, gpointer data)
00940 {
00941 wireless_encr_type_t encrtype;
00942
00943 CN_LOGPRINTF("entry");
00944
00945 encrtype = edit_wireless_get_encrtype();
00946 switch (encrtype)
00947 {
00948 case encr_wep_t:
00949 edit_wireless_set_status(inputEncrKeyWEP_e);
00950 break;
00951 case encr_wpa_t:
00952 edit_wireless_set_status(inputEncrKeyWPA_e);
00953 break;
00954 case encr_none_t:
00955 default:
00956 break;
00957 }
00958 }
00959
00960 static void on_profilename_changed(GtkEntry* widget, gpointer data)
00961 {
00962 CN_LOGPRINTF("entry");
00963
00964 edit_wireless_set_status(wlanInputProfileName_e);
00965 }
00966
00967 static gboolean on_delayed_profilename_next(gpointer data)
00968 {
00969 CN_LOGPRINTF("entry");
00970
00971 erbusy_blink();
00972
00973 edit_wireless_backup_network_settings();
00974
00975 edit_goto_page(editScreenOverview_e);
00976 edit_overview_update_info_text(inputProxy_e);
00977 edit_overview_update_profile();
00978
00979 return FALSE;
00980 }
00981
00982
00983 static void on_profilename_next(GtkToggleButton* button, gpointer data)
00984 {
00985 gboolean active;
00986 gboolean valid;
00987
00988 CN_LOGPRINTF("entry");
00989
00990 active = gtk_toggle_button_get_active(button);
00991 if (active)
00992 {
00993 valid = edit_wireless_check_network_settings();
00994 if (valid)
00995 {
00996
00997 g_timeout_add(500, on_delayed_profilename_next, NULL);
00998 }
00999 else
01000 {
01001 edit_wireless_determine_status();
01002 }
01003
01004 g_timeout_add(500, delayed_deactive_button, button);
01005 }
01006 }
01007
01008 static void on_buttons_update(GtkWidget *selection,
01009 gpointer button,
01010 gpointer data)
01011 {
01012 gboolean active;
01013 gboolean valid;
01014 int nsel;
01015 GtkWidget *widget;
01016 erGtkSelectionGroup *sel;
01017 gboolean toDeactive = TRUE;
01018
01019 CN_LOGPRINTF("entry");
01020
01021 active = gtk_toggle_button_get_active(button);
01022 valid = edit_wireless_check_network_settings();
01023 if (!valid)
01024 {
01025 edit_wireless_determine_status();
01026 }
01027
01028 if (active && valid)
01029 {
01030 widget = g_buttons->details->selection;
01031 sel = ERGTK_SELECTION_GROUP(widget);
01032 ergtk_selection_group_get_selected_buttons(sel, &nsel, 1);
01033
01034 switch (nsel)
01035 {
01036 case 0:
01037
01038 on_test();
01039 toDeactive = FALSE;
01040 break;
01041 case 1:
01042
01043 on_save();
01044 toDeactive = FALSE;
01045 break;
01046 case 2:
01047
01048 on_saveconnect();
01049 toDeactive = FALSE;
01050 break;
01051 default:
01052 break;
01053 }
01054 }
01055
01056 if (active && toDeactive)
01057 {
01058 g_timeout_add(500, delayed_deactive_button, button);
01059 }
01060 }
01061
01062 static gboolean on_delayed_test(gpointer data)
01063 {
01064 GtkToggleButton *button;
01065
01066 CN_LOGPRINTF("entry");
01067
01068 erbusy_blink();
01069
01070 edit_wireless_backup_network_settings();
01071
01072 edit_goto_page(editScreenOverview_e);
01073
01074 edit_overview_update_profile();
01075
01076
01077 edit_overview_click_test();
01078
01079 if (g_buttons)
01080 {
01081 button = g_buttons->details->buttonList[0];
01082 gtk_toggle_button_set_active(button, FALSE);
01083 }
01084
01085 return FALSE;
01086 }
01087
01088 static void on_test(void)
01089 {
01090 CN_LOGPRINTF("entry");
01091
01092
01093 g_timeout_add(500, on_delayed_test, NULL);
01094 }
01095
01096 static gboolean on_delayed_save(gpointer data)
01097 {
01098 GtkToggleButton *button;
01099
01100 CN_LOGPRINTF("entry");
01101
01102 erbusy_blink();
01103
01104 edit_save_profile();
01105
01106 edit_goto_page(editScreenProfiles_e);
01107 if (g_buttons)
01108 {
01109 button = g_buttons->details->buttonList[1];
01110 gtk_toggle_button_set_active(button, FALSE);
01111 }
01112
01113 return FALSE;
01114 }
01115
01116 static void on_save(void)
01117 {
01118 CN_LOGPRINTF("entry");
01119
01120
01121 g_timeout_add(500, on_delayed_save, NULL);
01122 }
01123
01124 static void on_saveconnect(void)
01125 {
01126 pingContext_t *ctxt;
01127
01128 CN_LOGPRINTF("entry");
01129
01130 erbusy_blink();
01131
01132 edit_wireless_freeze_ui(TRUE);
01133
01134 edit_wireless_restore_ping_ctxt();
01135
01136 ctxt = cmgr_get_ping_ctxt();
01137 connect_ping_select_initial_profile(ctxt);
01138 connect_ping(ctxt, TRUE);
01139 }
01140
01142
01144 static void edit_wireless_restore_scan_ctxt(void)
01145 {
01146 scanContext_t *ctxt;
01147
01148 CN_LOGPRINTF("entry");
01149
01150 ctxt = cmgr_get_scan_ctxt();
01151 if (ctxt)
01152 {
01153 connect_scan_ctxt_set_mode(ctxt, editScan_e);
01154 connect_scan_ctxt_set_network_type(ctxt, wireless_t);
01155 connect_scan_ctxt_set_done_callbacks(ctxt,
01156 scan_done, scan_done_after);
01157 }
01158 }
01159
01160 static void scan_done(connection_t networkType,
01161 network_spec_t* pScanNetworks,
01162 int nScanNetworks)
01163 {
01164 int i;
01165 const char *ssid;
01166
01167 CN_LOGPRINTF("entry");
01168
01169 g_found_network = NULL;
01170
01171 ssid = edit_wireless_get_ssid();
01172 if (pScanNetworks && (nScanNetworks != 0) && ssid)
01173 {
01174 for (i = 0; i < nScanNetworks; i++)
01175 {
01176 if (pScanNetworks[i].ssid
01177 && (strcmp(pScanNetworks[i].ssid, ssid) == 0))
01178 {
01179 CN_LOGPRINTF("found [%d]", i);
01180 g_found_network = &pScanNetworks[i];
01181 break;
01182 }
01183 }
01184 }
01185 }
01186
01187 static void scan_done_after(void)
01188 {
01189 GtkToggleButton *button;
01190 wireless_encr_type_t encrtype;
01191
01192 CN_LOGPRINTF("entry");
01193
01194
01195 if (g_ssid)
01196 {
01197 button = GTK_TOGGLE_BUTTON(g_ssid->details->button);
01198 gtk_toggle_button_set_active(button, FALSE);
01199 }
01200
01201 CN_ERRORPRINTF("%p", g_found_network);
01202
01203 if (g_found_network)
01204 {
01205 encrtype = g_found_network->encryption;
01206 }
01207 else
01208 {
01209 encrtype = encr_undefined_t;
01210 }
01211
01212 edit_wireless_set_encrtype(encrtype);
01213
01214 edit_wireless_determine_status();
01215 display_update_request_screen_refresh(STATUS_ITEM_CHANGE,
01216 WAVEFORM_TYPING);
01217 }
01218
01220
01222 static void edit_wireless_restore_ping_ctxt(void)
01223 {
01224 pingContext_t *ctxt;
01225 cmgrConnectType_t connectType;
01226
01227 CN_LOGPRINTF("entry");
01228
01229 ctxt = cmgr_get_ping_ctxt();
01230 if (ctxt)
01231 {
01232
01233 connect_ping_ctxt_set_mode(ctxt, editPing_e);
01234 connectType = connect_data_get_connect_type();
01235 connect_ping_ctxt_set_connect_type(ctxt, connectType);
01236
01237
01238 connect_ping_ctxt_set_done_callbacks(ctxt,
01239 on_connected, on_failed);
01240
01241
01242 connect_ping_ctxt_set_get_initial_profile(ctxt,
01243 edit_get_initial_profile);
01244 connect_ping_ctxt_set_access_network_profiles_callbacks(ctxt,
01245 edit_get_n_network_profiles,
01246 edit_get_network_profile,
01247 edit_select_next_regprofile);
01248
01249
01250 connect_ping_ctxt_set_ui_callbacks(ctxt,
01251 ui_update_status,
01252 ui_display_settings,
01253 ui_select_profile,
01254 ui_unselect_all_profile);
01255 }
01256 }
01257
01258 static void on_connected(int profileIndex)
01259 {
01260 GtkToggleButton *button;
01261
01262 CN_LOGPRINTF("entry");
01263
01264 edit_save_profile();
01265
01266 edit_wireless_freeze_ui(FALSE);
01267
01268 if (g_buttons)
01269 {
01270 button = g_buttons->details->buttonList[2];
01271 g_timeout_add(500, delayed_deactive_button, button);
01272 }
01273
01274 edit_on_connected();
01275 }
01276
01277 static void on_failed(void)
01278 {
01279 GtkToggleButton *button;
01280
01281 CN_LOGPRINTF("entry");
01282
01283 edit_wireless_freeze_ui(FALSE);
01284
01285 if (g_buttons)
01286 {
01287 button = g_buttons->details->buttonList[2];
01288 g_timeout_add(500, delayed_deactive_button, button);
01289 }
01290 }
01291
01292 static void ui_update_status(int profileIndex, pingStatus_t status)
01293 {
01294 wlanStatus_t state;
01295
01296 CN_LOGPRINTF("entry");
01297
01298 switch (status)
01299 {
01300 case pingSucceeded_e:
01301 state = wlanConnected_e;
01302 break;
01303 case pingFailed_e:
01304 case pingFailedPCShare_e:
01305 case pingFailedNetwork_e:
01306 state = wlanUnconnected_e;
01307 break;
01308 case pingConnecting_e:
01309 state = wlanConnecting_e;
01310 break;
01311 case pingAborting_e:
01312 state = wlanAborting_e;
01313 break;
01314 case pingAborted_e:
01315 state = wlanAborted_e;
01316 on_failed();
01317 break;
01318 default:
01319 state = undefWlanStatus_e;
01320 break;
01321 }
01322
01323 edit_wireless_update_info_text(state);
01324 display_update_request_screen_refresh(STATUS_ITEM_CHANGE,
01325 WAVEFORM_TYPING);
01326 }
01327
01328 static void ui_display_settings(int profileIndex, gboolean resetStatus)
01329 {
01330 CN_LOGPRINTF("entry");
01331
01332 }
01333
01334 static void ui_select_profile(int profileIndex)
01335 {
01336 CN_LOGPRINTF("entry");
01337
01338 }
01339
01340 static void ui_unselect_all_profile(void)
01341 {
01342 CN_LOGPRINTF("entry");
01343
01344 }
01345
01346 static void edit_wireless_click_ssid_next(void)
01347 {
01348 GtkToggleButton *button;
01349
01350 CN_LOGPRINTF("entry");
01351
01352 g_return_if_fail(g_ssid != NULL);
01353
01354 button = GTK_TOGGLE_BUTTON(g_ssid->details->button);
01355 gtk_toggle_button_set_active(button, TRUE);
01356 }
01357
01358 static void edit_wireless_click_encr_none(void)
01359 {
01360 GtkToggleButton *button;
01361
01362 CN_LOGPRINTF("entry");
01363
01364 g_return_if_fail(g_encrtype != NULL);
01365
01366 button = g_encrtype->details->buttonList[0];
01367 gtk_toggle_button_set_active(button, TRUE);
01368 }
01369
01370 static void edit_wireless_click_saveconnect(void)
01371 {
01372 GtkToggleButton *button;
01373
01374 CN_LOGPRINTF("entry");
01375
01376 g_return_if_fail(g_buttons != NULL);
01377
01378 button = g_buttons->details->buttonList[2];
01379 gtk_toggle_button_set_active(button, TRUE);
01380 }
01381
01382 gboolean on_edit_wireless_keypress(GdkEventKey *event)
01383 {
01384 pingContext_t *ctxt;
01385 const char *encrkey = NULL;
01386 gboolean ret = FALSE;
01387
01388 CN_LOGPRINTF("entry");
01389
01390 ctxt = cmgr_get_ping_ctxt();
01391 switch (event->keyval)
01392 {
01393 case GDK_Return:
01394
01395 if (!connect_ping_in_pinging(ctxt))
01396 {
01397 switch (g_wlan_status)
01398 {
01399 case inputSSID_e:
01400
01401
01402 edit_wireless_click_ssid_next();
01403 break;
01404 case inputEncrType_e:
01405
01406 edit_wireless_click_encr_none();
01407 break;
01408 case inputEncrKeyWEP_e:
01409 case inputEncrKeyWPA_e:
01410 encrkey = edit_wireless_get_encrkey();
01411 if (encrkey && (encrkey[0] != '\0'))
01412 {
01413
01414 edit_wireless_set_status(wlanInputProfileName_e);
01415 display_update_request_screen_refresh(STATUS_ITEM_CHANGE,
01416 WAVEFORM_TYPING);
01417
01418 }
01419 break;
01420 case wlanInputProfileName_e:
01421 case undefWlanStatus_e:
01422
01423 edit_wireless_click_saveconnect();
01424 break;
01425 default:
01426 break;
01427 }
01428 ret = TRUE;
01429 }
01430 break;
01431
01432 case GDK_F5:
01433
01434
01435 connect_ping_abort(ctxt);
01436 cmgr_up_page();
01437 ret = TRUE;
01438 break;
01439 case GDK_Down:
01440 case GDK_Up:
01441
01442 erbusy_off();
01443 ret = TRUE;
01444 default:
01445 erbusy_off();
01446 }
01447
01448 return ret;
01449 }
01450
01452
01454
01455 static void edit_wireless_freeze_ui(gboolean freeze)
01456 {
01457 editMode_t mode;
01458 gboolean sensitive;
01459 GtkWidget *widget;
01460
01461 CN_LOGPRINTF("entry[%d]", freeze);
01462
01463 sensitive = !freeze;
01464
01465
01466 widget = g_ssid->details->entry;
01467 gtk_widget_set_sensitive(widget, sensitive);
01468
01469
01470 widget = GTK_WIDGET(g_encrtype->details->buttonList[0]);
01471 gtk_widget_set_sensitive(widget, sensitive);
01472
01473 widget = GTK_WIDGET(g_encrtype->details->buttonList[1]);
01474 gtk_widget_set_sensitive(widget, sensitive);
01475
01476 widget = GTK_WIDGET(g_encrtype->details->buttonList[2]);
01477 gtk_widget_set_sensitive(widget, sensitive);
01478
01479
01480 widget = g_encrkey->details->entry;
01481 gtk_widget_set_sensitive(widget, sensitive);
01482
01483
01484 widget = g_profilename->details->entry;
01485 gtk_widget_set_sensitive(widget, sensitive);
01486
01487 widget = g_profilename->details->button;
01488 gtk_widget_set_sensitive(widget, sensitive);
01489
01490
01491 widget = GTK_WIDGET(g_buttons->details->buttonList[0]);
01492 gtk_widget_set_sensitive(widget, sensitive);
01493
01494 widget = GTK_WIDGET(g_buttons->details->buttonList[1]);
01495 gtk_widget_set_sensitive(widget, sensitive);
01496
01497 widget = GTK_WIDGET(g_buttons->details->buttonList[2]);
01498 gtk_widget_set_sensitive(widget, sensitive);
01499
01500 if (sensitive)
01501 {
01502
01503
01504 mode = edit_get_mode();
01505 if ((mode == editModeConnectFillIn_e)
01506 || (mode == editModeConnectCreate_e)
01507 || (mode == editModeConnectNormal_e))
01508 {
01509 edit_wireless_enable_save_button(FALSE);
01510 }
01511 }
01512 }
01513