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