00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00028 #include <stdio.h>
00029 #include <unistd.h>
00030 #include <wait.h>
00031 #include <sys/socket.h>
00032 #include <sys/errno.h>
00033 #include <netinet/in.h>
00034 #include <arpa/inet.h>
00035 #include <ctype.h>
00036
00037 #include <glib/gutils.h>
00038 #include <gtk/gtk.h>
00039
00040 #include <libergtk/ergtk.h>
00041 #include <liberipc/eripcconnect.h>
00042 #include <liberipc/eripctoolbar.h>
00043 #include <liberregxml/erregapi.h>
00044
00045 #include "connectionMgrLog.h"
00046 #include "displayStatus.h"
00047 #include <liberdm/connectionMgrConstants.h>
00048 #include "erbusy.h"
00049 #include "pagebar.h"
00050 #include "toolbar.h"
00051 #include "connectScreenData.h"
00052 #include "connectionMgr.h"
00053 #include "connectScreen.h"
00054 #include "connectScreenOptions.h"
00055 #include "editScreen.h"
00056 #include "background.h"
00057 #include "modemUtils.h"
00058
00059
00060 static GtkWidget* g_connectScreens = NULL;
00061 static GtkWidget* g_editScreens = NULL;
00062 static cmgrScreen_t g_screen_mode = cmgrScreenUndef_e;
00063
00064
00065 static scanContext_t *g_scan_ctxt = NULL;
00066 static pingContext_t *g_ping_ctxt = NULL;
00067
00068 static volatile int enable_pid = 0;
00069
00070
00071 static on_tbsync_action_t on_toolbar_sync_actions[] = { NULL, NULL };
00072
00073 static guint g_show_idle_handler_id = 0;
00074 static guint g_hide_idle_handler_id = 0;
00075
00076
00077 static void on_toolbar_synchronised(void);
00078
00079 static void on_goto_page(gint new_page);
00080 static gboolean hook_screen_refresh_typing(GSignalInvocationHint *ihint,
00081 guint n_param_values,
00082 const GValue *param_values,
00083 gpointer user_data);
00084
00085 static gboolean on_idle_show_keyboard(gpointer data);
00086 static gboolean on_idle_hide_keyboard(gpointer data);
00087
00088
00089 #define SERVER_BUFFER_SIZE 1024
00090 static erServerChannel_t theServerChannel;
00091 static erClientChannel_t g_ipc_channel_setup;
00092 static void connectMessageReceived(gpointer data,
00093 gint source_fd,
00094 GdkInputCondition condition);
00095
00097
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 GtkWidget *cmgr_screens_create(void)
00109 {
00110 GtkWidget* screens;
00111 guint signal_id;
00112
00113 CN_LOGPRINTF("entry");
00114
00115
00116 screens = gtk_vbox_new(FALSE, 0);
00117
00118
00119 g_connectScreens = connect_screen_create();
00120 connect_screen_set_text();
00121 gtk_box_pack_start(GTK_BOX(screens), g_connectScreens,
00122 FALSE, FALSE, 0);
00123 gtk_widget_hide(g_connectScreens);
00124
00125
00126 g_editScreens = edit_screen_create();
00127 edit_screen_set_text();
00128 gtk_box_pack_start(GTK_BOX(screens), g_editScreens, FALSE, FALSE, 0);
00129 gtk_widget_hide(g_editScreens);
00130
00131
00132
00133 signal_id = g_signal_lookup("screen-refresh", ERGTK_ENTRY_TYPE);
00134 g_assert(signal_id > 0);
00135 g_signal_add_emission_hook(signal_id,
00136 0,
00137 hook_screen_refresh_typing,
00138 (gpointer)TEXT_ENTRY_CHANGED_LEVEL,
00139 NULL);
00140
00141 signal_id = g_signal_lookup("toggled", ERGTK_TOGGLE_BUTTON_TYPE);
00142 g_assert(signal_id > 0);
00143 g_signal_add_emission_hook(signal_id,
00144 0,
00145 hook_screen_refresh_typing,
00146 (gpointer)SETTING_ITEM_CHANGE,
00147 NULL);
00148
00149 gtk_widget_show(screens);
00150 return screens;
00151 }
00152
00153 void cmgr_set_screen_mode(cmgrScreen_t mode)
00154 {
00155 CN_LOGPRINTF("entry: mode [%d] g_screen_mode [%d]",
00156 mode, g_screen_mode);
00157
00158 if (mode != g_screen_mode)
00159 {
00160 switch (mode)
00161 {
00162 case cmgrScreenConnect_e:
00163 g_screen_mode = cmgrScreenConnect_e;
00164
00165 bg_display_title();
00166
00167 gtk_widget_hide(g_editScreens);
00168 gtk_widget_show(g_connectScreens);
00169
00170 connect_set_pagebar();
00171 connect_set_toolbar();
00172
00173 connect_screen_display();
00174 break;
00175
00176 case cmgrScreenEdit_e:
00177 g_screen_mode = cmgrScreenEdit_e;
00178
00179 bg_display_title();
00180
00181 gtk_widget_hide(g_connectScreens);
00182 gtk_widget_show(g_editScreens);
00183
00184 edit_set_toolbar();
00185 edit_set_pagebar();
00186
00187 edit_screen_display();
00188 break;
00189
00190 default:
00191 CN_LOGPRINTF("Illegal screen mode [%d]", mode);
00192 }
00193 }
00194 }
00195
00196
00197 cmgrScreen_t cmgr_get_screen_mode(void)
00198 {
00199 CN_LOGPRINTF("entry: g_screen_mode [%d]", g_screen_mode);
00200 return g_screen_mode;
00201 }
00202
00203 void cmgr_set_toolbar(void)
00204 {
00205 CN_LOGPRINTF("entry: g_screen_mode [%d]", g_screen_mode);
00206
00207 switch (g_screen_mode)
00208 {
00209 case cmgrScreenConnect_e:
00210 connect_set_toolbar();
00211 break;
00212
00213 case cmgrScreenEdit_e:
00214 edit_set_toolbar();
00215 break;
00216
00217 default:
00218 CN_LOGPRINTF("Illegal screen g_screen_mode [%d]",
00219 g_screen_mode);
00220 }
00221
00222 }
00223
00224 void cmgr_set_pagebar(void)
00225 {
00226 CN_LOGPRINTF("entry: g_screen_mode [%d]", g_screen_mode);
00227
00228 switch (g_screen_mode)
00229 {
00230 case cmgrScreenConnect_e:
00231 connect_set_pagebar();
00232 break;
00233
00234 case cmgrScreenEdit_e:
00235 edit_set_pagebar();
00236 break;
00237
00238 default:
00239 CN_LOGPRINTF("Illegal screen g_screen_mode [%d]",
00240 g_screen_mode);
00241 }
00242 }
00243
00244
00245 guint on_cmgr_keypress(GtkWidget *widget,
00246 GdkEventKey *event,
00247 gpointer data)
00248 {
00249 guint returnValue = 0;
00250
00251 CN_LOGPRINTF("entry");
00252
00253 switch (cmgr_get_screen_mode())
00254 {
00255 case cmgrScreenConnect_e:
00256 returnValue = on_connect_keypress(event);
00257 break;
00258 case cmgrScreenEdit_e:
00259 returnValue = on_edit_keypress(event);
00260 break;
00261 default:
00262 ;
00263 }
00264
00265 return returnValue;
00266 }
00267
00268 static void on_cmgr_icon_clicked(int iconID, int iconState)
00269 {
00270 cmgrScreen_t mode;
00271
00272 CN_LOGPRINTF("entry iconID[%d] iconState[%d]", iconID, iconState);
00273
00274 mode = cmgr_get_screen_mode();
00275 switch (mode)
00276 {
00277 case cmgrScreenEdit_e:
00278 on_edit_icon_clicked(iconID, iconState);
00279 break;
00280 case cmgrScreenConnect_e:
00281 on_connect_icon_clicked(iconID, iconState);
00282 break;
00283 default:
00284 break;
00285 }
00286 }
00287
00288 static void on_cmgr_toolbar_synchronised(void)
00289 {
00290 CN_LOGPRINTF("entry");
00291
00292 on_toolbar_synchronised();
00293 }
00294
00295 void cmgr_add_on_toolbar_sync_action(on_tbsync_action_t action)
00296 {
00297 int elementSize, arraySize;
00298 int i, sz;
00299
00300 CN_LOGPRINTF("entry");
00301
00302 g_assert(action != NULL);
00303
00304 elementSize = sizeof(on_toolbar_sync_actions[0]);
00305 arraySize = sizeof(on_toolbar_sync_actions);
00306 sz = arraySize / elementSize;
00307
00308 for (i = 0; i < sz; i++)
00309 {
00310 if (on_toolbar_sync_actions[i] == NULL)
00311 {
00312 on_toolbar_sync_actions[i] = action;
00313 return;
00314 }
00315 }
00316
00317 g_assert_not_reached();
00318 }
00319
00320 static void on_toolbar_synchronised(void)
00321 {
00322 int elementSize, arraySize;
00323 int i, sz;
00324
00325 CN_LOGPRINTF("entry");
00326
00327 display_update_request_screen_refresh(TEXT_ENTRY_CHANGED_LEVEL,
00328 WAVEFORM_TYPING);
00329
00330 elementSize = sizeof(on_toolbar_sync_actions[0]);
00331 arraySize = sizeof(on_toolbar_sync_actions);
00332 sz = arraySize / elementSize;
00333
00334
00335 for (i = 0; i < sz; i++)
00336 {
00337 if (on_toolbar_sync_actions[i] != NULL)
00338 {
00339 on_toolbar_sync_actions[i] ();
00340 on_toolbar_sync_actions[i] = NULL;
00341 }
00342 }
00343 }
00344
00345 static void on_goto_page(gint new_page)
00346 {
00347 CN_LOGPRINTF("entry");
00348
00349 switch (cmgr_get_screen_mode())
00350 {
00351 case cmgrScreenConnect_e:
00352 on_connect_goto_page(new_page);
00353 break;
00354 case cmgrScreenEdit_e:
00355 on_edit_goto_page(new_page);
00356 break;
00357 default:
00358 ;
00359 }
00360 }
00361
00362 static gboolean hook_screen_refresh_typing(GSignalInvocationHint *ihint,
00363 guint n_param_values,
00364 const GValue *param_values,
00365 gpointer user_data)
00366 {
00367 int level = (int)user_data;
00368
00369 CN_LOGPRINTF("entry: level [%d]", level);
00370
00371 display_update_request_screen_refresh(level, WAVEFORM_TYPING);
00372
00373 return TRUE;
00374 }
00375
00377
00379 static void keyboard_remove_idle_handler_ids(void)
00380 {
00381 if (g_show_idle_handler_id)
00382 {
00383 CN_DMPRINTF("\nRemoving the old show keyboard idle handler.\n");
00384
00385 g_source_remove(g_show_idle_handler_id);
00386 g_show_idle_handler_id = 0;
00387 }
00388
00389 if (g_hide_idle_handler_id)
00390 {
00391 CN_DMPRINTF("\nRemoving the old hide keyboard idle handler.\n");
00392
00393 g_source_remove(g_hide_idle_handler_id);
00394 g_hide_idle_handler_id = 0;
00395 }
00396
00397 display_update_remove_idle_handler_id();
00398 }
00399
00400 static gboolean keyboard_is_running(void)
00401 {
00402 const char *cmd = "ps -ef | grep matchbox-keyboard | grep -v grep";
00403 gboolean running = FALSE;
00404
00405 if (system(cmd) == 0)
00406 {
00407 running = TRUE;
00408 }
00409
00410 CN_LOGPRINTF("return %d", running);
00411 return running;
00412 }
00413
00414
00415
00416
00417
00418 static void do_show_keyboard()
00419 {
00420
00421
00422
00423 keyboard_remove_idle_handler_ids();
00424
00425
00426 display_update_increase_level(KEYBOARD_SHOW_HIDE_LEVEL);
00427
00428
00429
00430 g_show_idle_handler_id = g_idle_add(on_idle_show_keyboard, NULL);
00431 }
00432
00433 static gboolean on_idle_show_keyboard(gpointer data)
00434 {
00435 gboolean running = keyboard_is_running();
00436
00437 toolbar_setIconState(iconID_keyboard, iconState_selected);
00438
00439 if (running)
00440 {
00441
00442
00443 CN_DMPRINTF("\nfrom show to show, "
00444 "rely on cmgr refresh the screen\n");
00445 display_update_request_screen_refresh(KEYBOARD_SHOW_HIDE_LEVEL,
00446 WAVEFORM_FULLSCREEN);
00447 }
00448 else
00449 {
00450 CN_DMPRINTF("\nfrom hide to show, "
00451 "rely on keyboard refresh the screen\n");
00452
00453 display_update_decrease_level(LOWEST_LEVEL);
00454 }
00455
00456 g_show_idle_handler_id = 0;
00457 return FALSE;
00458 }
00459
00460
00461
00462
00463
00464 static void do_hide_keyboard(int iconState)
00465 {
00466 g_assert((iconState == iconState_grey)
00467 || (iconState == iconState_normal));
00468
00469
00470
00471 keyboard_remove_idle_handler_ids();
00472
00473
00474 display_update_increase_level(KEYBOARD_SHOW_HIDE_LEVEL);
00475
00476
00477
00478 g_hide_idle_handler_id = g_idle_add(on_idle_hide_keyboard,
00479 (gpointer) iconState);
00480 }
00481
00482 static gboolean on_idle_hide_keyboard(gpointer data)
00483 {
00484 gboolean running = keyboard_is_running();
00485 int iconState = (int)data;
00486
00487 toolbar_setIconState(iconID_keyboard, iconState);
00488
00489 if (!running)
00490 {
00491
00492
00493 CN_DMPRINTF("\nfrom hide to hide, "
00494 "rely on cmgr refresh the screen\n");
00495 display_update_request_screen_refresh(KEYBOARD_SHOW_HIDE_LEVEL,
00496 WAVEFORM_FULLSCREEN);
00497 }
00498 else
00499 {
00500 CN_DMPRINTF("\nfrom show to hide, "
00501 "rely on keyboard refresh the screen\n");
00502
00503 display_update_decrease_level(LOWEST_LEVEL);
00504 }
00505
00506 g_hide_idle_handler_id = 0;
00507 return FALSE;
00508 }
00509
00510
00511 void show_keyboard(gboolean show)
00512 {
00513 CN_LOGPRINTF("entry: show [%d]", show);
00514
00515 if (show)
00516 {
00517
00518 do_show_keyboard();
00519 }
00520 else
00521 {
00522
00523 do_hide_keyboard(iconState_grey);
00524 }
00525 }
00526
00528
00530 gboolean cmgrInstallIpcServer()
00531 {
00532 int ret;
00533 int fd = -1;
00534 int returnValue;
00535
00536 CN_IPCPRINTF("entry");
00537
00538 ret = erIpcOpenServerChannel(ER_CONNECT_CHANNEL, &theServerChannel);
00539
00540 if (ret != (-1))
00541 {
00542 fd = erIpcGetServerFd(theServerChannel);
00543
00544 CN_IPCPRINTF("erIpcGetServerFd returned %d\n", fd);
00545
00546
00547 returnValue = gdk_input_add(fd,
00548 GDK_INPUT_READ,
00549 connectMessageReceived,
00550 (gpointer) theServerChannel);
00551
00552 CN_IPCPRINTF("gdk_input_add returned %d", returnValue);
00553 return TRUE;
00554 }
00555 else
00556 {
00557 CN_ERRORPRINTF("Could not open server channel");
00558 return FALSE;
00559 }
00560 }
00561
00562 gboolean connectStartIpcClientSetup()
00563 {
00564 int ret;
00565
00566 CN_LOGPRINTF("entry\n");
00567
00568 ret = erIpcStartClient(ER_SETUP_CHANNEL, &g_ipc_channel_setup);
00569 CN_IPCPRINTF("erIpcStartClient returned %d\n", ret);
00570
00571 return (ret == 0) ? TRUE : FALSE;
00572 }
00573
00574
00575
00576
00577
00578
00579 static void connectMessageReceived(gpointer data,
00580 gint source_fd,
00581 GdkInputCondition condition)
00582 {
00583 char szBuffer[SERVER_BUFFER_SIZE];
00584 int nBuf = SERVER_BUFFER_SIZE;
00585 int page;
00586
00587 erIpcCmd_t command;
00588
00589
00590 erIpcGetMessage((erServerChannel_t) data, szBuffer, &nBuf);
00591
00592 CN_IPCPRINTF("Received %s\n", szBuffer);
00593
00594 if (cnParseCommand(szBuffer, &command) >= 0)
00595 {
00596 switch (command.cc)
00597 {
00598 case ccCnGotoPage:
00599 page = atoi(command.arg[0]);
00600 CN_IPCPRINTF("Connect Goto Page: %d\n", page);
00601 gdk_threads_enter();
00602 on_goto_page(page);
00603 gdk_threads_leave();
00604 break;
00605
00606 case ccCnToolbar:
00607 {
00608 int iconID = atoi(command.arg[0]);
00609 int iconState = atoi(command.arg[1]);
00610 CN_LOGPRINTF("ccCnToolbarIcon: iconID [%d] iconState [%d]",
00611 iconID, iconState);
00612 gdk_threads_enter();
00613 on_cmgr_icon_clicked(iconID, iconState);
00614 gdk_threads_leave();
00615 }
00616 break;
00617
00618 case ccCnToolbarSync:
00619 gdk_threads_enter();
00620 CN_LOGPRINTF("ccCnToolbarSync");
00621 on_cmgr_toolbar_synchronised();
00622 gdk_threads_leave();
00623 break;
00624
00625 default:
00626 CN_IPCPRINTF("UNKNOWN COMMAND %d", command.cc);
00627 break;
00628 }
00629 }
00630 }
00631
00633
00635 void cmgr_scan_ctxt_init(void)
00636 {
00637 CN_LOGPRINTF("entry");
00638
00639 cmgr_scan_ctxt_destory();
00640 g_scan_ctxt = connect_scan_ctxt_new();
00641 }
00642
00643 void cmgr_scan_ctxt_destory(void)
00644 {
00645 CN_LOGPRINTF("entry");
00646
00647 connect_scan_ctxt_destory(g_scan_ctxt);
00648 g_scan_ctxt = NULL;
00649 }
00650
00651 scanContext_t *cmgr_get_scan_ctxt(void)
00652 {
00653 CN_LOGPRINTF("return %p", g_scan_ctxt);
00654 return g_scan_ctxt;
00655 }
00656
00657 void cmgr_ping_ctxt_init(void)
00658 {
00659 CN_LOGPRINTF("entry");
00660
00661 cmgr_ping_ctxt_destory();
00662 g_ping_ctxt = connect_ping_ctxt_new();
00663 }
00664
00665 void cmgr_ping_ctxt_destory(void)
00666 {
00667 CN_LOGPRINTF("entry");
00668
00669 connect_ping_ctxt_destory(g_ping_ctxt);
00670 g_ping_ctxt = NULL;
00671 }
00672
00673 pingContext_t *cmgr_get_ping_ctxt(void)
00674 {
00675 CN_LOGPRINTF("return %p", g_ping_ctxt);
00676 return g_ping_ctxt;
00677 }
00678
00679 void connect_disable_network()
00680 {
00681
00682 system(COMMAND_IFDOWN_ALL);
00683 }
00684
00685 void connect_enable_network_abort()
00686 {
00687
00688 if (enable_pid > 0)
00689 {
00690 CN_WARNPRINTF("Sending SIGTERM to enable_pid [%d]", enable_pid);
00691 kill(enable_pid, SIGTERM);
00692 }
00693 }
00694
00695 static gboolean is_hex_key(const char *key)
00696 {
00697 int i, len;
00698 gboolean ret = TRUE;
00699
00700 if ((key == NULL)
00701 || ((len = strlen(key)) == 0))
00702 {
00703 return TRUE;
00704 }
00705
00706 for (i = 0; i < len; i++)
00707 {
00708 if (!isxdigit(key[i]))
00709 {
00710 ret = FALSE;
00711 break;
00712 }
00713 }
00714
00715 CN_LOGPRINTF("return %d", ret);
00716 return ret;
00717 }
00718
00719 static void add_key_prefix(const char *pkey, char **ppkey)
00720 {
00721 if (is_hex_key(pkey))
00722 {
00723 *ppkey = g_strdup(pkey);
00724 }
00725 else
00726 {
00727 *ppkey = g_strdup_printf("s:%s", pkey);
00728 }
00729
00730 CN_LOGPRINTF("output[%s]", *ppkey);
00731 }
00732
00733 ecd_err_t connect_enable_network(const regNetworkProfile_t *regNetworkProfile)
00734 {
00735 ecd_err_t err = ECD_FAILURE;
00736 char *command[128];
00737 int arg = 0;
00738 char *freelist[128];
00739 int free_arg = 0;
00740 int rc;
00741 struct in_addr address;
00742 struct in_addr netmask;
00743 struct in_addr broadcast;
00744 char *encrkey;
00745
00746 CN_LOGPRINTF("entry");
00747 g_return_val_if_fail((regNetworkProfile != NULL), err);
00748
00749 if (regNetworkProfile->connection != dialup_t)
00750 {
00751 FILE* fd_iface = NULL;
00752 FILE* fd_resolv = NULL;
00753 FILE* fd_proxy = NULL;
00754
00755
00756 fd_iface = fopen(INTERFACES_FILE_TMP, "w");
00757 fd_resolv = fopen(RESOLVE_CONF_FILE_TMP, "w");
00758 fd_proxy = fopen(HTTP_PROXY_FILE_TMP, "w");
00759 g_return_val_if_fail(( fd_iface != NULL
00760 && fd_resolv != NULL
00761 && fd_proxy != NULL), err);
00762
00763
00764 fputs("iface ", fd_iface);
00765
00766 switch (regNetworkProfile->connection)
00767 {
00768 case wired_t:
00769 fputs(INTERFACE_WIRED, fd_iface);
00770 break;
00771 case wireless_t:
00772 fputs(INTERFACE_WIRELESS, fd_iface);
00773 break;
00774 default:
00775 CN_ERRORPRINTF("Illegal setting->connection [%d]",
00776 (int)regNetworkProfile->connection);
00777 return err;
00778 }
00779
00780 fputs(" inet ", fd_iface);
00781
00782
00783 switch (regNetworkProfile->addressMode)
00784 {
00785 case dhcp_t:
00786 fputs("dhcp ", fd_iface);
00787 break;
00788
00789 case static_t:
00790
00791 fputs( "static ", fd_iface);
00792 fputs("\n address ", fd_iface);
00793 fputs(regNetworkProfile->ipSettings->address, fd_iface);
00794 fputs("\n netmask ", fd_iface);
00795 fputs(regNetworkProfile->ipSettings->netmask, fd_iface);
00796 fputs("\n gateway ", fd_iface);
00797 fputs(regNetworkProfile->ipSettings->gateway, fd_iface);
00798
00799
00800 fputs("nameserver ", fd_resolv);
00801 fputs(regNetworkProfile->ipSettings->dns, fd_resolv);
00802 break;
00803
00804 default:
00805 CN_ERRORPRINTF("Illegal setting->addresMode [%d]",
00806 (int)regNetworkProfile->addressMode);
00807 return err;
00808 }
00809
00810
00811 if (regNetworkProfile->proxySettings == NULL)
00812 {
00813 CN_WARNPRINTF("No proxy needs to be specified");
00814 g_unsetenv("http_proxy");
00815 g_unsetenv("https_proxy");
00816 }
00817 else
00818 {
00819 char proxyString[256];
00820
00821 snprintf(proxyString, sizeof(proxyString),
00822 "http://%s:%s",
00823 regNetworkProfile->proxySettings->address,
00824 regNetworkProfile->proxySettings->port);
00825 fputs(proxyString, fd_proxy);
00826 CN_WARNPRINTF("Setting proxy to %s", proxyString);
00827
00828 g_setenv("http_proxy", proxyString, 1);
00829 g_setenv("https_proxy", proxyString, 1);
00830 }
00831
00832
00833 fputc('\n', fd_iface); fclose(fd_iface);
00834 fputc('\n', fd_resolv); fclose(fd_resolv);
00835 fputc('\n', fd_proxy); fclose(fd_proxy);
00836 }
00837
00838
00839 switch (regNetworkProfile->connection)
00840 {
00841 case wired_t:
00842 err = ECD_WIRED_ERROR;
00843 arg = 0;
00844 command[arg++] = COMMAND_WIRED;
00845 command[arg++] = "start";
00846 if (regNetworkProfile->addressMode == static_t)
00847 {
00848
00849
00850 address.s_addr = inet_addr(regNetworkProfile->ipSettings->address);
00851 netmask.s_addr = inet_addr(regNetworkProfile->ipSettings->netmask);
00852 broadcast.s_addr = address.s_addr | ~netmask.s_addr;
00853
00854 command[arg++] = "static";
00855 command[arg++] = regNetworkProfile->ipSettings->address;
00856 command[arg++] = regNetworkProfile->ipSettings->netmask;
00857 command[arg++] = freelist[free_arg++] = strdup(inet_ntoa(broadcast));
00858 command[arg++] = regNetworkProfile->ipSettings->gateway;
00859 command[arg++] = regNetworkProfile->ipSettings->dns;
00860 }
00861 else
00862 {
00863 command[arg++] = "dhcp";
00864 }
00865 break;
00866
00867 case wireless_t:
00868 err = ECD_WIRELESS_ERROR;
00869 arg = 0;
00870 command[arg++] = COMMAND_WIRELESS;
00871 command[arg++] = "start";
00872 command[arg++] = regNetworkProfile->wirelessSettings->SSID;
00873
00874 switch (regNetworkProfile->wirelessSettings->encrType)
00875 {
00876 case encr_none_t:
00877 ;
00878 break;
00879 case encr_wep_t:
00880 command[arg++] = "enc";
00881 encrkey = regNetworkProfile->wirelessSettings->encrKey;
00882 add_key_prefix(encrkey, &freelist[free_arg]);
00883 command[arg++] = freelist[free_arg];
00884 free_arg++;
00885 break;
00886 case encr_wpa_t:
00887 command[arg++] = "wpa";
00888 encrkey = regNetworkProfile->wirelessSettings->encrKey;
00889 command[arg++] = encrkey;
00890 break;
00891 default:
00892
00893 CN_ERRORPRINTF("Support the ascii settings");
00894 break;
00895 }
00896 break;
00897
00898 case dialup_t:
00899 err = ECD_DIALUP_ERROR;
00900 arg = 0;
00901 command[arg++] = COMMAND_DIALUP;
00902 command[arg++] = "start";
00903 command[arg++] = regNetworkProfile->dialupSettings->phone;
00904 command[arg++] = regNetworkProfile->dialupSettings->user;
00905 command[arg++] = regNetworkProfile->dialupSettings->password;
00906 break;
00907
00908 default:
00909 ;
00910 }
00911
00912
00913 command[arg] = NULL;
00914 if ((enable_pid = fork()) == 0)
00915 {
00916 printf("Execvp returned %d\n", execvp(command[0], command));
00917 printf("execvp error: %d %s", errno, strerror(errno));
00918 exit(1);
00919 }
00920 waitpid(enable_pid, &rc, 0);
00921 if (WIFEXITED(rc) && WEXITSTATUS(rc) == 0)
00922 {
00923 err = ECD_NO_ERROR;
00924 }
00925 enable_pid = 0;
00926
00927 for (free_arg--; free_arg >= 0; free(freelist[free_arg--]));
00928
00929 FILE *fd = fopen("/tmp/profile_name.tmp", "w");
00930 fputs(regNetworkProfile->name, fd);
00931 fputs("\n", fd);
00932 fclose(fd);
00933
00934 CN_LOGPRINTF("done: err [%d]", err);
00935 return err;
00936 }
00937
00939
00941
00942
00943
00944 static void cmgr_get_up_page(const screenPage_t *curPage,
00945 screenPage_t *upPage)
00946 {
00947 CN_LOGPRINTF("entry [%p][%p]", curPage, upPage);
00948
00949 g_return_if_fail(curPage != NULL);
00950 g_return_if_fail(upPage != NULL);
00951
00952 if ((curPage->screen == cmgrScreenConnect_e)
00953 && (curPage->page == connectScreenOptions_e))
00954 {
00955 upPage->screen = cmgrScreenUndef_e;
00956 upPage->page = -1;
00957 }
00958 else if ((curPage->screen == cmgrScreenConnect_e)
00959 && (curPage->page == connectScreenProfiles_e))
00960 {
00961 upPage->screen = cmgrScreenUndef_e;
00962 upPage->page = -1;
00963 }
00964 else if ((curPage->screen == cmgrScreenEdit_e)
00965 && (curPage->page == editScreenProfiles_e))
00966 {
00967 if (main_get_edit_only())
00968 {
00969 upPage->screen = cmgrScreenUndef_e;
00970 upPage->page = -1;
00971 }
00972 else
00973 {
00974 upPage->screen = cmgrScreenConnect_e;
00975 upPage->page = connectScreenOptions_e;
00976 }
00977 }
00978 else if ((curPage->screen == cmgrScreenEdit_e)
00979 && (curPage->screen == editScreenSearch_e))
00980 {
00981 upPage->screen = cmgrScreenEdit_e;
00982 upPage->page = editScreenProfiles_e;
00983 }
00984 else if ((curPage->screen == cmgrScreenEdit_e)
00985 && (curPage->page == editScreenWireless_e))
00986 {
00987 upPage->screen = cmgrScreenEdit_e;
00988 upPage->page = editScreenProfiles_e;
00989 }
00990 else if ((curPage->screen == cmgrScreenEdit_e)
00991 && (curPage->page == editScreenOverview_e))
00992 {
00993 upPage->screen = cmgrScreenEdit_e;
00994 upPage->page = editScreenProfiles_e;
00995 }
00996 else if ((curPage->screen == cmgrScreenEdit_e)
00997 && (curPage->page == editScreenDialup_e))
00998 {
00999 upPage->screen = cmgrScreenEdit_e;
01000 upPage->page = editScreenProfiles_e;
01001 }
01002 else if ((curPage->screen == cmgrScreenEdit_e)
01003 && (curPage->page == editScreenProxy_e))
01004 {
01005 upPage->screen = cmgrScreenEdit_e;
01006 upPage->page = editScreenProfiles_e;
01007 }
01008 else if ((curPage->screen == cmgrScreenEdit_e)
01009 && (curPage->page == editScreenStatic_e))
01010 {
01011 upPage->screen = cmgrScreenEdit_e;
01012 upPage->page = editScreenProfiles_e;
01013 }
01014 else if ((curPage->screen == cmgrScreenEdit_e)
01015 && (curPage->page == editScreenWirelessExt_e))
01016 {
01017 upPage->screen = cmgrScreenEdit_e;
01018 upPage->page = editScreenProfiles_e;
01019 }
01020 else
01021 {
01022 upPage->screen = cmgrScreenUndef_e;
01023 upPage->page = -1;
01024 }
01025 CN_LOGPRINTF("upPage[%d,%d]", upPage->screen, upPage->page);
01026 }
01027
01028
01029
01030 void cmgr_get_back_page(const screenPage_t *curPage,
01031 screenPage_t *backPage)
01032 {
01033 CN_LOGPRINTF("entry [%p][%p]", curPage, backPage);
01034
01035 g_return_if_fail(curPage != NULL);
01036 g_return_if_fail(backPage != NULL);
01037
01038 if ((curPage->screen == cmgrScreenConnect_e)
01039 && (curPage->page == connectScreenOptions_e))
01040 {
01041 backPage->screen = cmgrScreenUndef_e;
01042 backPage->page = -1;
01043 }
01044 else if ((curPage->screen == cmgrScreenConnect_e)
01045 && (curPage->page == connectScreenProfiles_e))
01046 {
01047 backPage->screen = cmgrScreenConnect_e;
01048 backPage->page = connectScreenOptions_e;
01049 }
01050 else if ((curPage->screen == cmgrScreenEdit_e)
01051 && (curPage->page == editScreenProfiles_e))
01052 {
01053 backPage->screen = cmgrScreenUndef_e;
01054 backPage->page = -1;
01055 }
01056 else if ((curPage->screen == cmgrScreenEdit_e)
01057 && (curPage->page == editScreenSearch_e))
01058 {
01059 backPage->screen = cmgrScreenUndef_e;
01060 backPage->page = -1;
01061 }
01062 else if ((curPage->screen == cmgrScreenEdit_e)
01063 && (curPage->page == editScreenWireless_e))
01064 {
01065 if (edit_get_back_overview())
01066 {
01067 backPage->screen = cmgrScreenEdit_e;
01068 backPage->page = editScreenOverview_e;
01069 }
01070 else
01071 {
01072 if (edit_get_wizard_mode())
01073 {
01074 backPage->screen = cmgrScreenEdit_e;
01075 backPage->page = editScreenSearch_e;
01076 }
01077 else
01078 {
01079 backPage->screen = cmgrScreenUndef_e;
01080 backPage->page = -1;
01081 }
01082 }
01083 }
01084 else if ((curPage->screen == cmgrScreenEdit_e)
01085 && (curPage->page == editScreenOverview_e))
01086 {
01087 backPage->screen = cmgrScreenUndef_e;
01088 backPage->page = -1;
01089 }
01090 else if ((curPage->screen == cmgrScreenEdit_e)
01091 && (curPage->page == editScreenDialup_e))
01092 {
01093 if (edit_get_back_overview())
01094 {
01095 backPage->screen = cmgrScreenEdit_e;
01096 backPage->page = editScreenOverview_e;
01097 }
01098 else
01099 {
01100 backPage->screen = cmgrScreenUndef_e;
01101 backPage->page = -1;
01102 }
01103 }
01104 else if ((curPage->screen == cmgrScreenEdit_e)
01105 && (curPage->page == editScreenProxy_e))
01106 {
01107 backPage->screen = cmgrScreenEdit_e;
01108 backPage->page = editScreenOverview_e;
01109 }
01110 else if ((curPage->screen == cmgrScreenEdit_e)
01111 && (curPage->page == editScreenStatic_e))
01112 {
01113 backPage->screen = cmgrScreenEdit_e;
01114 backPage->page = editScreenOverview_e;
01115 }
01116 else if ((curPage->screen == cmgrScreenEdit_e)
01117 && (curPage->page == editScreenWirelessExt_e))
01118 {
01119 if (edit_get_back_overview())
01120 {
01121 backPage->screen = cmgrScreenEdit_e;
01122 backPage->page = editScreenOverview_e;
01123 }
01124 else
01125 {
01126 backPage->screen = cmgrScreenUndef_e;
01127 backPage->page = -1;
01128 }
01129 }
01130 else
01131 {
01132 backPage->screen = cmgrScreenUndef_e;
01133 backPage->page = -1;
01134 }
01135 CN_LOGPRINTF("backPage[%d,%d]", backPage->screen, backPage->page);
01136 }
01137
01138
01139 static void cmgr_get_cur_screen_page(screenPage_t *page)
01140 {
01141 g_return_if_fail(page != NULL);
01142
01143 page->screen = cmgr_get_screen_mode();
01144 switch (page->screen)
01145 {
01146 case cmgrScreenConnect_e:
01147 page->page = connect_get_current_page(NULL);
01148 break;
01149 case cmgrScreenEdit_e:
01150 page->page = edit_get_current_page(NULL);
01151 break;
01152 default:
01153 page->page = -1;
01154 break;
01155 }
01156 }
01157
01158
01159 static void cmgr_goto_screen_page(const screenPage_t *page)
01160 {
01161 scanContext_t* ctxt;
01162
01163 CN_LOGPRINTF("entry [%p]", page);
01164
01165 cmgr_set_screen_mode(page->screen);
01166 switch (page->screen)
01167 {
01168 case cmgrScreenConnect_e:
01169 connect_goto_page(page->page);
01170
01171
01172 if (page->page == connectScreenOptions_e)
01173 {
01174 connect_options_display();
01175
01176 connect_options_restore_scan_ctxt();
01177 ctxt = cmgr_get_scan_ctxt();
01178 connect_scan(ctxt, TRUE);
01179 }
01180 break;
01181 case cmgrScreenEdit_e:
01182 edit_goto_page(page->page);
01183 break;
01184 default:
01185 break;
01186 }
01187 }
01188
01189
01190 void cmgr_up_page(void)
01191 {
01192 screenPage_t curPage, upPage;
01193 editMode_t mode;
01194
01195 CN_LOGPRINTF("entry");
01196
01197 cmgr_get_cur_screen_page(&curPage);
01198 cmgr_get_up_page(&curPage, &upPage);
01199
01200 if ((upPage.screen == cmgrScreenUndef_e)
01201 || (upPage.page == -1))
01202 {
01203 main_quit();
01204 }
01205 else
01206 {
01207 cmgr_goto_screen_page(&upPage);
01208
01209
01210
01211
01212
01213
01214 if (upPage.screen == cmgrScreenEdit_e
01215 && upPage.page == editScreenProfiles_e)
01216 {
01217 mode = edit_get_mode();
01218 if ((mode == editModeConnectFillIn_e)
01219 || (mode == editModeConnectCreate_e))
01220 {
01221 edit_set_mode(editModeConnectNormal_e);
01222 }
01223 }
01224 }
01225 }
01226
01227
01228 static gboolean on_delayed_cmgr_back_page(gpointer data)
01229 {
01230 screenPage_t curPage, backPage;
01231
01232 CN_LOGPRINTF("entry");
01233
01234 erbusy_blink();
01235
01236 cmgr_get_cur_screen_page(&curPage);
01237 cmgr_get_back_page(&curPage, &backPage);
01238
01239
01240 switch (curPage.screen)
01241 {
01242 case cmgrScreenEdit_e:
01243 edit_restore_network_settings(curPage.page);
01244 break;
01245 case cmgrScreenConnect_e:
01246
01247 break;
01248 default:
01249 break;
01250 }
01251
01252 cmgr_goto_screen_page(&backPage);
01253
01254 return FALSE;
01255 }
01256
01257 void cmgr_back_page(void)
01258 {
01259
01260 g_timeout_add(500, on_delayed_cmgr_back_page, NULL);
01261 }
01262