2 * Copyright 2012 Samsung Electronics Co., Ltd
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
8 * http://www.tizenopensource.org/license
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.
20 #include "view_staticip.h"
21 #include "view_detail.h"
22 #include "i18nmanager.h"
23 #include "view_detail_datamodel.h"
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;
33 static int view_staticip_end = TRUE;
35 static Elm_Genlist_Item_Class ip_itc;
36 static Elm_Genlist_Item_Class sep_itc;
38 typedef enum VIEW_STATICIP_TYPES
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,
46 } VIEW_STATICIP_TYPES;
48 typedef struct _view_staticip_description_data
52 } _view_staticip_description_data;
53 /////////////////////////////////////////////////////////////////
55 /////////////////////////////////////////////////////////////////
57 /////////////////////////////////////////////////////////////////
58 static Elm_Object_Item* _add_list_item(Evas_Object* list,
59 VIEW_STATICIP_TYPES tag,
62 _view_staticip_description_data* data = NULL;
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));
69 data->title = strdup(title);
72 Elm_Object_Item* det = NULL;
73 det = elm_genlist_item_append(
78 ELM_GENLIST_ITEM_NONE,
81 assertm_if(NULL == det, "NULL!!");
90 static void _entry_changed_cb(void* data, Evas_Object* obj, void* event_info)
92 if (obj == NULL || view_staticip_end == TRUE)
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");
99 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
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);
106 _view_staticip_description_data* det =
107 (_view_staticip_description_data*) data;
110 case VIEW_STATICIP_TYPE_IP:
111 view_detail_datamodel_static_ip_address_set(txt);
113 case VIEW_STATICIP_TYPE_SUBNET:
114 view_detail_datamodel_static_subnet_mask_set(txt);
116 case VIEW_STATICIP_TYPE_GATEWAY:
117 view_detail_datamodel_static_gateway_address_set(txt);
119 case VIEW_STATICIP_TYPE_DNS1:
120 view_detail_datamodel_static_dns1_address_set(txt);
122 case VIEW_STATICIP_TYPE_DNS2:
123 view_detail_datamodel_static_dns2_address_set(txt);
128 static void _entry_focused_cb(void *data, Evas_Object *obj, void *event_info)
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");
135 static void _entry_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
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");
142 static void _eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
144 elm_entry_entry_set(data, "");
147 static Evas_Object *_view_staticip_content_get(void *data, Evas_Object *obj, const char *part)
149 __COMMON_FUNC_ENTER__;
151 Evas_Object* layout = NULL;
153 assertm_if(NULL == part, "NULL!!");
154 DEBUG_LOG(UG_NAME_NORMAL, "part [%s]", part);
156 if(!strncmp(part, "elm.icon", strlen(part))) {
157 _view_staticip_description_data* det =
158 (_view_staticip_description_data*) data;
160 layout = elm_layout_add(obj);
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);
171 const char* txt = NULL;
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);
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);
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);
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);
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);
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);
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);
214 evas_object_show(entry);
219 __COMMON_FUNC_EXIT__;
223 static void _view_staticip_list_del(void *data, Evas_Object *obj)
225 __COMMON_FUNC_ENTER__;
230 _view_staticip_description_data* det = (_view_staticip_description_data *) data;
237 __COMMON_FUNC_EXIT__;
240 static Evas_Object* _create_list(Evas_Object* parent)
242 __COMMON_FUNC_ENTER__;
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;
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);
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;
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);
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));
273 __COMMON_FUNC_EXIT__;
278 static boolean isValidIP(const char *szIP)
280 __COMMON_FUNC_ENTER__;
282 unsigned int n1,n2,n3,n4;
284 __COMMON_FUNC_EXIT__;
288 INFO_LOG(UG_NAME_NORMAL, "* str [%s]", szIP);
292 for(i=0; i<strlen(szIP); i++) {
295 } else if(szIP[i] == ':') {
296 __COMMON_FUNC_EXIT__;
298 } else if(szIP[i] == '\0') {
300 } else if(0 == isdigit((int)szIP[i])) {
301 __COMMON_FUNC_EXIT__;
307 __COMMON_FUNC_EXIT__;
311 /* check dotted decial addressing format */
312 if(sscanf(szIP, "%u.%u.%u.%u", &n1, &n2, &n3, &n4) != 4) {
313 __COMMON_FUNC_EXIT__;
317 /* check IPv4 address class invariants */
318 //if(!n1) return FALSE;
320 /* check address range */
325 __COMMON_FUNC_EXIT__;
328 __COMMON_FUNC_EXIT__;
333 static boolean _staticip_check(void)
335 __COMMON_FUNC_ENTER__;
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();
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!!");
352 /** reset target value from "" to guide-text when user input is zero */
353 if(0 == strlen(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();
359 if(0 == strlen(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();
365 if(0 == strlen(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();
371 if(0 == strlen(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();
377 if(0 == strlen(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();
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) {
402 __COMMON_FUNC_EXIT__;
406 static void static_done_cb(void *data, Evas_Object *obj, void *event_info)
408 __COMMON_FUNC_ENTER__;
410 if(view_staticip_end == TRUE) {
411 __COMMON_FUNC_EXIT__;
414 view_staticip_end = TRUE;
416 boolean det = _staticip_check();
418 detailview_ip_and_dns_type_set_as_static();
419 elm_naviframe_item_pop(viewer_manager_get_naviframe());
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);
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;
433 winset_popup_mode_set(NULL, POPUP_MODE_INPUT_FAILED,
434 POPUP_OPTION_INPUT_FAILED_PROXY_IP_MISTYPE);
435 view_staticip_end = FALSE;
438 __COMMON_FUNC_EXIT__;
441 static void static_back_cb(void *data, Evas_Object *obj, void *event_info)
443 __COMMON_FUNC_ENTER__;
445 if(view_staticip_end == TRUE) {
446 __COMMON_FUNC_EXIT__;
449 view_staticip_end = TRUE;
451 __COMMON_FUNC_EXIT__;
454 static Evas_Object* _create_conformant(Evas_Object* parent)
456 assertm_if(NULL == parent, "NULL!!");
458 Evas_Object* conform = NULL;
459 elm_win_conformant_set(parent, TRUE);
460 conform = elm_conformant_add(parent);
461 assertm_if(NULL == conform, "NULL!!");
463 elm_object_style_set(conform, "internal_layout");
464 evas_object_show(conform);
471 __COMMON_FUNC_ENTER__;
473 view_staticip_end = FALSE;
475 Evas_Object* navi_frame = NULL;
476 navi_frame = viewer_manager_get_naviframe();
477 assertm_if(NULL == navi_frame, "NULL!!");
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);
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);
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);
493 Evas_Object* bx = NULL;
494 bx = _create_list(conform);
495 assertm_if(NULL == bx, "NULL!!");
497 evas_object_show(layout);
498 elm_object_content_set(conform, bx);
500 Elm_Object_Item *navi_it = elm_naviframe_item_push(navi_frame, sc(PACKAGE, I18N_TYPE_Static_IP), NULL, NULL, layout, NULL);
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);
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);
512 __COMMON_FUNC_EXIT__;