apply FSL(Flora Software License)
[apps/home/ug-wifi-efl.git] / sources / ui-gadget / viewers-layout / view_staticip.c
1 /*
2   * Copyright 2012  Samsung Electronics Co., Ltd
3   *
4   * Licensed under the Flora License, Version 1.0 (the "License");
5   * you may not use this file except in compliance with the License.
6   * You may obtain a copy of the License at
7   *
8   *    http://www.tizenopensource.org/license
9   *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16
17
18
19 #include "wifi.h"
20 #include "view_staticip.h"
21 #include "view_detail.h"
22 #include "i18nmanager.h"
23 #include "view_detail_datamodel.h"
24 #include "popup.h"
25
26
27 static char* guide_text_ip = NULL;
28 static char* guide_text_subnet = NULL;
29 static char* guide_text_gateway = NULL;
30 static char* guide_text_dns1 = NULL;
31 static char* guide_text_dns2 = NULL;
32
33 static int view_staticip_end = TRUE;
34
35 static Elm_Genlist_Item_Class ip_itc;
36 static Elm_Genlist_Item_Class sep_itc;
37
38 typedef enum VIEW_STATICIP_TYPES
39 {
40         VIEW_STATICIP_TYPE_IP,
41         VIEW_STATICIP_TYPE_SUBNET,
42         VIEW_STATICIP_TYPE_GATEWAY,
43         VIEW_STATICIP_TYPE_DNS1,
44         VIEW_STATICIP_TYPE_DNS2,
45
46 } VIEW_STATICIP_TYPES;
47
48 typedef struct _view_staticip_description_data
49 {
50         char* title;
51         int tag;
52 } _view_staticip_description_data;
53 /////////////////////////////////////////////////////////////////
54
55 /////////////////////////////////////////////////////////////////
56 // implementations 
57 /////////////////////////////////////////////////////////////////
58 static Elm_Object_Item* _add_list_item(Evas_Object* list,
59                                 VIEW_STATICIP_TYPES tag,
60                                 char* title)
61 {
62         _view_staticip_description_data* data = NULL;
63
64         data = (_view_staticip_description_data*) malloc (
65                         sizeof( _view_staticip_description_data));
66         assertm_if(NULL == data, "NULL!!");
67         memset(data, 0, sizeof(_view_staticip_description_data));
68
69         data->title = strdup(title);
70         data->tag = tag;
71
72         Elm_Object_Item* det = NULL;
73         det = elm_genlist_item_append(
74                         list,
75                         &ip_itc,
76                         data,
77                         NULL,
78                         ELM_GENLIST_ITEM_NONE,
79                         NULL,
80                         NULL);
81         assertm_if(NULL == det, "NULL!!");
82         if (det == NULL) {
83                 g_free(data->title);
84                 g_free(data);
85         }
86
87         return det;
88 }
89
90 static void _entry_changed_cb(void* data, Evas_Object* obj, void* event_info)
91 {
92         if (obj == NULL || view_staticip_end == TRUE)
93                 return;
94
95         if (elm_object_focus_get(data)) {
96                 if (elm_entry_is_empty(obj))
97                         elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
98                 else
99                         elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
100         }
101
102         const char* txt = elm_entry_markup_to_utf8(elm_entry_entry_get(obj));
103         assertm_if(NULL == txt, "NULL!!");
104         DEBUG_LOG( UG_NAME_NORMAL, "text [%s]", txt);
105
106         _view_staticip_description_data* det = 
107                 (_view_staticip_description_data*) data;
108
109         switch(det->tag) {
110                 case VIEW_STATICIP_TYPE_IP:
111                         view_detail_datamodel_static_ip_address_set(txt);
112                         break;
113                 case VIEW_STATICIP_TYPE_SUBNET:
114                         view_detail_datamodel_static_subnet_mask_set(txt);
115                         break;
116                 case VIEW_STATICIP_TYPE_GATEWAY:
117                         view_detail_datamodel_static_gateway_address_set(txt);
118                         break;
119                 case VIEW_STATICIP_TYPE_DNS1:
120                         view_detail_datamodel_static_dns1_address_set(txt);
121                         break;
122                 case VIEW_STATICIP_TYPE_DNS2:
123                         view_detail_datamodel_static_dns2_address_set(txt);
124                         break;
125         }
126 }
127
128 static void _entry_focused_cb(void *data, Evas_Object *obj, void *event_info)
129 {
130         if (!elm_entry_is_empty(obj))
131                 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
132         elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
133 }
134
135 static void _entry_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
136 {
137         if (elm_entry_is_empty(obj))
138                 elm_object_signal_emit(data, "elm,state,guidetext,show", "elm");
139         elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
140 }
141
142 static void _eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
143 {
144         elm_entry_entry_set(data, "");
145 }
146
147 static Evas_Object *_view_staticip_content_get(void *data, Evas_Object *obj, const char *part)
148 {
149         __COMMON_FUNC_ENTER__;
150
151         Evas_Object* layout = NULL;
152
153         assertm_if(NULL == part, "NULL!!");
154         DEBUG_LOG(UG_NAME_NORMAL, "part [%s]", part);
155
156         if(!strncmp(part, "elm.icon", strlen(part))) {
157                 _view_staticip_description_data* det = 
158                         (_view_staticip_description_data*) data;
159
160                 layout = elm_layout_add(obj);
161                 if (layout) {
162                         elm_layout_theme_set(layout, "layout", "editfield", "title");
163                         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
164                         evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
165                         Evas_Object *entry = elm_entry_add(obj);
166                         elm_object_part_content_set(layout, "elm.swallow.content", entry);
167                         elm_object_part_text_set(layout, "elm.text", det->title);
168                         elm_entry_single_line_set(entry, EINA_TRUE);
169                         elm_entry_scrollable_set(entry, EINA_TRUE);
170
171                         const char* txt = NULL;
172                         switch(det->tag) {
173                         case VIEW_STATICIP_TYPE_IP:
174                                 txt = view_detail_datamodel_static_ip_address_get();
175                                 DEBUG_LOG(UG_NAME_NORMAL, "* IP [%s]", txt);
176                                 g_free(guide_text_ip);
177                                 guide_text_ip = g_strdup(txt);
178                                 break;
179                         case VIEW_STATICIP_TYPE_SUBNET:
180                                 txt = view_detail_datamodel_static_subnet_mask_get();
181                                 DEBUG_LOG(UG_NAME_NORMAL, "* SUBNET [%s]", txt);
182                                 g_free(guide_text_subnet);
183                                 guide_text_subnet = g_strdup(txt);
184                                 break;
185                         case VIEW_STATICIP_TYPE_GATEWAY:
186                                 txt = view_detail_datamodel_static_gateway_address_get();
187                                 DEBUG_LOG(UG_NAME_NORMAL, "* GATEWAY [%s]", txt);
188                                 g_free(guide_text_gateway);
189                                 guide_text_gateway = g_strdup(txt);
190                                 break;
191                         case VIEW_STATICIP_TYPE_DNS1:
192                                 txt = view_detail_datamodel_static_dns1_address_get();
193                                 DEBUG_LOG(UG_NAME_NORMAL, "* DNS1 [%s]", txt);
194                                 g_free(guide_text_dns1);
195                                 guide_text_dns1 = g_strdup(txt);
196                                 break;
197                         case VIEW_STATICIP_TYPE_DNS2:
198                                 txt = view_detail_datamodel_static_dns2_address_get();
199                                 DEBUG_LOG(UG_NAME_NORMAL, "* DNS2 [%s]", txt);
200                                 g_free(guide_text_dns2);
201                                 guide_text_dns2 = g_strdup(txt);
202                                 break;
203                         }
204
205                         elm_object_part_text_set(layout, "elm.guidetext", txt);
206                         elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_IP);
207                         elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_NO_IMAGE);
208
209                         evas_object_smart_callback_add(entry, "changed", _entry_changed_cb, layout);
210                         evas_object_smart_callback_add(entry, "focused", _entry_focused_cb, layout);
211                         evas_object_smart_callback_add(entry, "unfocused", _entry_unfocused_cb, layout);
212                         elm_object_signal_callback_add(layout, "elm,eraser,clicked", "elm", _eraser_clicked_cb, entry);
213
214                         evas_object_show(entry);
215                 }
216
217         }
218
219         __COMMON_FUNC_EXIT__;
220         return layout;
221 }
222
223 static void _view_staticip_list_del(void *data, Evas_Object *obj)
224 {
225         __COMMON_FUNC_ENTER__;
226
227         if (data == NULL)
228                 return;
229
230         _view_staticip_description_data* det = (_view_staticip_description_data *) data;
231
232         if (det->title)
233                 g_free(det->title);
234
235         g_free(data);
236
237         __COMMON_FUNC_EXIT__;
238 }
239
240 static Evas_Object* _create_list(Evas_Object* parent)
241 {
242         __COMMON_FUNC_ENTER__;
243
244         ip_itc.item_style = "1icon";
245         ip_itc.func.text_get = NULL;
246         ip_itc.func.content_get = _view_staticip_content_get;
247         ip_itc.func.state_get = NULL;
248         ip_itc.func.del = _view_staticip_list_del;
249
250         Evas_Object *list = elm_genlist_add(parent);
251         elm_genlist_mode_set(list, ELM_LIST_LIMIT);
252         evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
253         evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
254         evas_object_show(list);
255
256         sep_itc.item_style = "dialogue/seperator";
257         sep_itc.func.text_get = NULL;
258         sep_itc.func.content_get = NULL;
259         sep_itc.func.state_get = NULL;
260         sep_itc.func.del = NULL;
261
262         Elm_Object_Item *sep = NULL;
263         sep = elm_genlist_item_append(list, &sep_itc, NULL, NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL);
264         elm_genlist_item_select_mode_set(sep, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
265
266         /* add list */
267         _add_list_item(list, VIEW_STATICIP_TYPE_IP, sc(PACKAGE, I18N_TYPE_IP_address));
268         _add_list_item(list, VIEW_STATICIP_TYPE_SUBNET, sc(PACKAGE, I18N_TYPE_Subnet_mask));
269         _add_list_item(list, VIEW_STATICIP_TYPE_GATEWAY, sc(PACKAGE, I18N_TYPE_Gateway));
270         _add_list_item(list, VIEW_STATICIP_TYPE_DNS1, sc(PACKAGE, I18N_TYPE_DNS_1));
271         _add_list_item(list, VIEW_STATICIP_TYPE_DNS2, sc(PACKAGE, I18N_TYPE_DNS_2));
272
273         __COMMON_FUNC_EXIT__;
274
275         return list;
276 }
277
278 static boolean isValidIP(const char *szIP)
279 {
280         __COMMON_FUNC_ENTER__;
281
282         unsigned int n1,n2,n3,n4;
283         if (NULL == szIP) {
284                 __COMMON_FUNC_EXIT__;
285                 return FALSE;
286         }
287
288         INFO_LOG(UG_NAME_NORMAL, "* str [%s]", szIP);
289
290         int i;
291         int nDotCnt = 0;
292         for(i=0; i<strlen(szIP); i++) {
293                 if(szIP[i] == '.') {
294                         ++nDotCnt;
295                 } else if(szIP[i] == ':') {
296                         __COMMON_FUNC_EXIT__;
297                         return FALSE;
298                 } else if(szIP[i] == '\0') {
299                         break;
300                 } else if(0 == isdigit((int)szIP[i])) {
301                         __COMMON_FUNC_EXIT__;
302                         return FALSE;   
303                 }
304         }
305
306         if (nDotCnt > 3){
307                 __COMMON_FUNC_EXIT__;
308                 return FALSE;
309         }
310
311         /* check dotted decial addressing format */
312         if(sscanf(szIP, "%u.%u.%u.%u", &n1, &n2, &n3, &n4) != 4) {
313                 __COMMON_FUNC_EXIT__;
314                 return FALSE;
315         }
316
317         /* check IPv4 address class invariants */
318         //if(!n1) return FALSE;
319
320         /* check address range */
321         if ((n1 < 0x100) &&
322                         (n2 < 0x100) &&
323                         (n3 < 0x100) &&
324                         (n4 < 0x100)){
325                 __COMMON_FUNC_EXIT__;
326                 return TRUE;
327         } else {
328                 __COMMON_FUNC_EXIT__;
329                 return FALSE;
330         }
331 }
332
333 static boolean _staticip_check(void)
334 {
335         __COMMON_FUNC_ENTER__;
336
337         boolean ret = FALSE;
338
339         /** current addresses get */
340         char* str1= view_detail_datamodel_static_ip_address_get();
341         char* str2= view_detail_datamodel_static_subnet_mask_get();
342         char* str3= view_detail_datamodel_static_gateway_address_get();
343         char* str4= view_detail_datamodel_static_dns1_address_get();
344         char* str5= view_detail_datamodel_static_dns2_address_get();
345
346         assertm_if(NULL == str1, "NULL!!");
347         assertm_if(NULL == str2, "NULL!!");
348         assertm_if(NULL == str3, "NULL!!");
349         assertm_if(NULL == str4, "NULL!!");
350         assertm_if(NULL == str5, "NULL!!");
351
352         /** reset target value from "" to guide-text when user input is zero */
353         if(0 == strlen(str1)) {
354                 g_free(str1);
355                 DEBUG_LOG(UG_NAME_NORMAL, "reset address to guide text [%s]", guide_text_ip);
356                 view_detail_datamodel_static_ip_address_set(guide_text_ip);
357                 str1 = view_detail_datamodel_static_ip_address_get();
358         }
359         if(0 == strlen(str2)) {
360                 g_free(str2);
361                 DEBUG_LOG(UG_NAME_NORMAL, "reset address to guide text [%s]", guide_text_subnet);
362                 view_detail_datamodel_static_subnet_mask_set(guide_text_subnet);
363                 str2 = view_detail_datamodel_static_subnet_mask_get();
364         }
365         if(0 == strlen(str3)) {
366                 g_free(str3);
367                 DEBUG_LOG(UG_NAME_NORMAL, "reset address to guide text [%s]", guide_text_gateway);
368                 view_detail_datamodel_static_gateway_address_set(guide_text_gateway);
369                 str3 = view_detail_datamodel_static_gateway_address_get();
370         }
371         if(0 == strlen(str4)) {
372                 g_free(str4);
373                 DEBUG_LOG(UG_NAME_NORMAL, "reset address to guide text [%s]", guide_text_dns1);
374                 view_detail_datamodel_static_dns1_address_set(guide_text_dns1);
375                 str4 = view_detail_datamodel_static_dns1_address_get();
376         }
377         if(0 == strlen(str5)) {
378                 g_free(str5);
379                 DEBUG_LOG(UG_NAME_NORMAL, "reset address to guide text [%s]", guide_text_dns2);
380                 view_detail_datamodel_static_dns2_address_set(guide_text_dns2);
381                 str5 = view_detail_datamodel_static_dns2_address_get();
382         }
383
384         /** Judge valid or not */
385         if(isValidIP(str1) == TRUE && 
386                 isValidIP(str2) == TRUE && 
387                 isValidIP(str3) == TRUE && 
388                 isValidIP(str4) == TRUE && 
389                 isValidIP(str5) == TRUE) {
390
391                 ret = TRUE;
392         } else {
393                 ret = FALSE;
394         }
395
396         g_free(str1);
397         g_free(str2);
398         g_free(str3);
399         g_free(str4);
400         g_free(str5);
401
402         __COMMON_FUNC_EXIT__;
403         return ret;
404 }
405
406 static void static_done_cb(void *data, Evas_Object *obj, void *event_info)
407 {
408         __COMMON_FUNC_ENTER__;
409
410         if(view_staticip_end == TRUE) {
411                 __COMMON_FUNC_EXIT__;
412                 return;
413         }
414         view_staticip_end = TRUE;
415
416         boolean det = _staticip_check();
417         if (det) {
418                 detailview_ip_and_dns_type_set_as_static();
419                 elm_naviframe_item_pop(viewer_manager_get_naviframe());
420
421                 g_free((gpointer) guide_text_ip);
422                 g_free((gpointer) guide_text_subnet);
423                 g_free((gpointer) guide_text_gateway);
424                 g_free((gpointer) guide_text_dns1);
425                 g_free((gpointer) guide_text_dns2);
426
427                 guide_text_ip = NULL;
428                 guide_text_subnet = NULL;
429                 guide_text_gateway = NULL;
430                 guide_text_dns1 = NULL;
431                 guide_text_dns2 = NULL;
432         } else {
433                 winset_popup_mode_set(NULL, POPUP_MODE_INPUT_FAILED,
434                                 POPUP_OPTION_INPUT_FAILED_PROXY_IP_MISTYPE);
435                 view_staticip_end = FALSE;
436         }
437
438         __COMMON_FUNC_EXIT__;
439 }
440
441 static void static_back_cb(void *data, Evas_Object *obj, void *event_info)
442 {
443         __COMMON_FUNC_ENTER__;
444
445         if(view_staticip_end == TRUE) {
446                 __COMMON_FUNC_EXIT__;
447                 return;
448         }
449         view_staticip_end = TRUE;
450
451         __COMMON_FUNC_EXIT__;
452 }
453
454 static Evas_Object* _create_conformant(Evas_Object* parent)
455 {
456         assertm_if(NULL == parent, "NULL!!");
457
458         Evas_Object* conform = NULL;
459         elm_win_conformant_set(parent, TRUE);
460         conform = elm_conformant_add(parent);
461         assertm_if(NULL == conform, "NULL!!");
462
463         elm_object_style_set(conform, "internal_layout");
464         evas_object_show(conform);
465
466         return conform;
467 }
468
469 void view_staticip()
470 {
471         __COMMON_FUNC_ENTER__;
472
473         view_staticip_end = FALSE;
474
475         Evas_Object* navi_frame = NULL;
476         navi_frame = viewer_manager_get_naviframe();
477         assertm_if(NULL == navi_frame, "NULL!!");
478
479         Evas_Object *layout = elm_layout_add(navi_frame);
480         elm_layout_theme_set(layout, "layout", "application", "noindicator");
481         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
482
483         Evas_Object *bg = elm_bg_add(layout);
484         evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
485         elm_object_style_set(bg, "group_list");
486         elm_object_part_content_set(layout, "elm.swallow.bg", bg);
487
488         Evas_Object* conform = NULL;
489         conform = _create_conformant(layout);
490         assertm_if(NULL == conform, "NULL!!");
491         elm_object_part_content_set(layout, "elm.swallow.content", conform);
492
493         Evas_Object* bx = NULL;
494         bx = _create_list(conform);
495         assertm_if(NULL == bx, "NULL!!");
496
497         evas_object_show(layout);
498         elm_object_content_set(conform, bx);
499
500         Elm_Object_Item *navi_it = elm_naviframe_item_push(navi_frame, sc(PACKAGE, I18N_TYPE_Static_IP), NULL, NULL, layout, NULL);
501
502         Evas_Object *button_done = elm_button_add(navi_frame);
503         elm_object_style_set(button_done, "naviframe/title/default");
504         elm_object_text_set(button_done, sc(PACKAGE, I18N_TYPE_Done));
505         evas_object_smart_callback_add(button_done, "clicked", (Evas_Smart_Cb) static_done_cb, NULL);
506         elm_object_item_part_content_set(navi_it, "title_right_btn", button_done);
507
508         Evas_Object* button_back = elm_object_item_part_content_get(navi_it, "prev_btn");
509         elm_object_focus_allow_set(button_back, EINA_TRUE);
510         evas_object_smart_callback_add(button_back, "clicked", (Evas_Smart_Cb)static_back_cb, NULL);
511
512         __COMMON_FUNC_EXIT__;
513 }