Fix issues reported by static analyzer
[apps/native/ug-wifi-direct.git] / ug-wifidirect / src / wfd_ug.c
1 /*
2 *  WiFi-Direct UG
3 *
4 * Copyright 2012  Samsung Electronics Co., Ltd
5
6 * Licensed under the Flora License, Version 1.1 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9
10 * http://www.tizenopensource.org/license
11
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 */
19
20
21 #ifndef UG_MODULE_API
22 #define UG_MODULE_API __attribute__ ((visibility("default")))
23 #endif
24
25
26 #include <sys/time.h>
27 #include <libintl.h>
28 #include <sys/utsname.h>
29
30 #include <vconf.h>
31 #include <Elementary.h>
32 #include <ui-gadget-module.h>
33 #include <app_control.h>
34
35 #include "wfd_ug.h"
36 #include "wfd_ug_view.h"
37 #include "wfd_client.h"
38 #ifdef MOTION_CONTROL_ENABLE
39 #include "wfd_motion_control.h"
40 #endif
41
42 void initialize_gen_item_class();
43
44 struct ug_data *global_ugd = NULL;
45
46 struct ug_data *wfd_get_ug_data()
47 {
48         return global_ugd;
49 }
50
51 static void __wfd_main_vconf_change_cb(keynode_t *key, void *data)
52 {
53         __FUNC_ENTER__;
54         WFD_RET_IF(NULL == key, "ERROR : key is NULL !!\n");
55         WFD_RET_IF(NULL == data, "ERROR : data is NULL");
56         struct ug_data *ugd = (struct ug_data *) data;
57
58         char *vconf_name = vconf_keynode_get_name(key);
59
60         if (!g_strcmp0(vconf_name, VCONFKEY_SETAPPL_DEVICE_NAME_STR)) {
61                 char *name_value = NULL;
62                 name_value = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
63                 WFD_RET_IF(!name_value, "Get string is failed");
64                 DBG(LOG_INFO, "name : %s", name_value);
65
66                 if (ugd->device_name_item && g_strcmp0(ugd->dev_name, name_value))
67                         wfd_ug_view_refresh_glitem(ugd->device_name_item);
68
69                 free(name_value);
70         } else {
71                 DBG(LOG_ERROR, "vconf_name is error");
72         }
73         __FUNC_EXIT__;
74 }
75
76 #ifdef WIFI_STATE_CB
77 static void _wifi_on_state_cb(keynode_t *key, void *data)
78 {
79         WFD_RET_IF(NULL == key, "ERROR : key is NULL !!\n");
80         WFD_RET_IF(NULL == data, "ERROR : data is NULL");
81
82         struct ug_data *ugd = (struct ug_data *)data;
83         int wifi_state = 0;
84
85         if (vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state) < 0) {
86                 DBG(LOG_ERROR, "Failed to get vconf VCONFKEY_WIFI_STATE\n");
87                 return;
88         }
89
90         DBG(LOG_INFO, "WiFi State [%d]\n", wifi_state);
91         if (wifi_state > VCONFKEY_WIFI_OFF && wifi_state < VCONFKEY_WIFI_STATE_MAX) {
92                 if (WIFI_DIRECT_ERROR_NONE != wifi_direct_get_state(&ugd->wfd_status)) {
93                         DBG(LOG_ERROR, "Failed to Get WiFi Direct State");
94                         return;
95                 }
96                 if (ugd->wfd_status <= WIFI_DIRECT_STATE_DEACTIVATING) {
97                         DBG(LOG_INFO, "Activate WiFi Direct...");
98                         if (FALSE != wfd_client_switch_on(ugd))
99                                 DBG(LOG_ERROR, "Failed to Activate WiFi Direct");
100                 }
101         }
102 }
103 #endif
104
105
106 static void __wfd_hotspot_mode_vconf_change_cb(keynode_t *key, void *data)
107 {
108         DBG(LOG_INFO, "__wfd_hotspot_mode_vconf_change_cb");
109         if (NULL == key || NULL == data) {
110                 DBG(LOG_INFO, "Invalid parameters \n");
111                 return;
112         }
113         struct ug_data *ugd = (struct ug_data *) data;
114         int hotspot_mode = 0;
115         int res = 0;
116
117         res = vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &hotspot_mode);
118         if (res) {
119                 DBG(LOG_INFO, "Failed to get vconf value for PLMN(%d)", res);
120                 return;
121         }
122         DBG(LOG_INFO, "__wfd_hotspot_mode_vconf_change_cb mode %d", hotspot_mode);
123
124         if (VCONFKEY_MOBILE_HOTSPOT_MODE_NONE == hotspot_mode) {
125                 if (NULL != ugd->act_popup)
126                         evas_object_del(ugd->act_popup);
127
128 #ifdef WFD_ON_OFF_GENLIST
129                 wfd_ug_refresh_on_off_check(ugd);
130 #endif
131         } else if (hotspot_mode == VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI ||
132                                 hotspot_mode == VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI_AP) {
133                 if (NULL != ugd->warn_popup) {
134                         evas_object_del(ugd->warn_popup);
135                         ugd->warn_popup = NULL;
136                 }
137         }
138
139 }
140
141 /**
142  *      This function let the ug create backgroud
143  *      @return  backgroud
144  *      @param[in] ugd the pointer to the parent object
145  *      @param[in] ugd the pointer to the main data structure
146  */
147 static Evas_Object *_create_bg(Evas_Object *parent, char *style)
148 {
149         __FUNC_ENTER__;
150         Evas_Object *bg;
151
152         bg = elm_bg_add(parent);
153         evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
154         elm_object_style_set(bg, style);
155         evas_object_show(bg);
156
157         __FUNC_EXIT__;
158         return bg;
159 }
160
161 /**
162  *      This function let the ug create full view
163  *      @return  full view
164  *      @param[in] ugd the pointer to the parent object
165  *      @param[in] ugd the pointer to the main data structure
166  */
167 static Evas_Object *_create_fullview(Evas_Object *parent, struct ug_data *ugd)
168 {
169         __FUNC_ENTER__;
170         Evas_Object *base;
171
172         if (parent == NULL) {
173                 DBG(LOG_ERROR, "Incorrenct parameter");
174                 return NULL;
175         }
176
177         /* Create Full view */
178         base = elm_layout_add(parent);
179         if (!base) {
180                 DBG(LOG_ERROR, "Failed to add layout");
181                 return NULL;
182         }
183
184         if (wfd_ug_util_is_profile_common()) {
185                 elm_layout_file_set(base, WFD_UG_COMMON_MAIN_LAYOUT_EDJ_PATH, "main_layout");
186         } else {
187                 elm_layout_theme_set(base, "layout", "application", "default");
188
189                 ugd->bg = _create_bg(ugd->win, "group_list");
190                 elm_object_part_content_set(ugd->base, "elm.swallow.bg", ugd->bg);
191                 evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
192                 evas_object_size_hint_align_set(base, EVAS_HINT_FILL, EVAS_HINT_FILL);
193         }
194
195         __FUNC_EXIT__;
196         return base;
197 }
198
199 /**
200  *      This function let the ug create frame view
201  *      @return  frame view
202  *      @param[in] ugd the pointer to the parent object
203  *      @param[in] ugd the pointer to the main data structure
204  */
205 static Evas_Object *_create_frameview(Evas_Object *parent, struct ug_data *ugd)
206 {
207         __FUNC_ENTER__;
208         Evas_Object *base;
209
210         if (parent == NULL) {
211                 DBG(LOG_ERROR, "Incorrenct parameter");
212                 return NULL;
213         }
214
215         /* Create Frame view */
216         base = elm_layout_add(parent);
217         if (!base) {
218                 DBG(LOG_ERROR, "Failed to add layout");
219                 return NULL;
220         }
221
222         elm_layout_theme_set(base, "layout", "application", "default");
223         evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
224         evas_object_size_hint_align_set(base, EVAS_HINT_FILL, EVAS_HINT_FILL);
225
226         __FUNC_EXIT__;
227         return base;
228 }
229
230 /**
231  *      This function let the ug destroy the ug
232  *      @return   void
233  *      @param[in] data the pointer to the main data structure
234  */
235 void wfd_destroy_ug(void *data)
236 {
237         __FUNC_ENTER__;
238         struct ug_data *ugd = (struct ug_data *) data;
239
240         DBG(LOG_INFO, "dbus_cancellable is NULL");
241         ug_destroy_me(ugd->ug);
242
243         __FUNC_EXIT__;
244         return;
245 }
246
247 static void wfd_ug_layout_del_cb(void *data , Evas *e, Evas_Object *obj, void *event_info)
248 {
249         __FUNC_ENTER__;
250
251         struct ug_data *ugd = (struct ug_data *) data;
252         if (ugd == NULL) {
253                 DBG(LOG_ERROR, "Incorrect parameter(NULL)");
254                 return;
255         }
256
257         wfd_client_free_raw_discovered_peers(ugd);
258         wfd_ug_view_free_peers(ugd);
259         destroy_wfd_ug_view(ugd);
260
261         __FUNC_EXIT__;
262 }
263
264 static void *on_create(ui_gadget_h ug, enum ug_mode mode, app_control_h control, void *priv)
265 {
266         __FUNC_ENTER__;
267         struct ug_data *ugd;
268         int wfd_status = -1;
269         int ret;
270
271         if (!ug || !priv)
272                 return NULL;
273
274         ugd = priv;
275         ugd->ug = ug;
276
277         bindtextdomain(PACKAGE, LOCALEDIR);
278
279         ugd->win = ug_get_window();
280         if (!ugd->win)
281                 return NULL;
282
283         /* set rotation */
284         if (elm_win_wm_rotation_supported_get(ugd->win)) {
285                 int rots[4] = {0, 90, 180, 270};
286                 elm_win_wm_rotation_available_rotations_set(ugd->win, (const int *)(&rots), 4);
287         }
288
289         /* check the input parameters from app at first */
290         ugd->wfds = NULL;
291         ugd->device_filter = -1; /* show all devices */
292         ugd->is_auto_exit = false;
293         ugd->is_multi_connect = true;
294         ugd->is_init_ok = false;
295         ugd->title = strdup(D_("IDS_WIFI_BODY_WI_FI_DIRECT_ABB"));
296
297         if (control) {
298                 char *wfds = NULL;
299                 char *device_filter = NULL;
300                 char *auto_exit = NULL;
301                 char *multi_connect = NULL;
302                 char *title = NULL;
303                 char* viewtype = NULL;
304
305                 /*
306                 * get the control name
307                 * default value: Wi-Fi Direct
308                 */
309                 ret = app_control_get_extra_data(control, "wfds", &wfds);
310                 if (ret == APP_CONTROL_ERROR_NONE && wfds) {
311                         DBG_SECURE(LOG_INFO, "Wfds name: %s", wfds);
312                         ugd->wfds = strdup(wfds);
313                 }
314                 WFD_IF_FREE_MEM(wfds);
315
316                 ret = app_control_get_extra_data(control, "viewtype", &viewtype);
317                 if (ret == APP_CONTROL_ERROR_NONE && viewtype) {
318                         DBG(LOG_INFO, "viewtype: %s\n", viewtype);
319                         ugd->view_type = strdup(viewtype);
320                 }
321                 WFD_IF_FREE_MEM(viewtype);
322
323                 /*
324                 * get the device filter
325                 * default value: NULL
326                 */
327                 ret = app_control_get_extra_data(control, "device_filter", &device_filter);
328                 if (ret == APP_CONTROL_ERROR_NONE && device_filter) {
329                         DBG(LOG_INFO, "Device filter: %s", device_filter);
330                         if (0 == strncmp(device_filter, "computer", 8))
331                                 ugd->device_filter = WFD_DEVICE_TYPE_COMPUTER;
332                         else if (0 == strncmp(device_filter, "input_device", 12))
333                                 ugd->device_filter = WFD_DEVICE_TYPE_INPUT_DEVICE;
334                         else if (0 == strncmp(device_filter, "printer", 6))
335                                 ugd->device_filter = WFD_DEVICE_TYPE_PRINTER;
336                         else if (0 == strncmp(device_filter, "camera", 6))
337                                 ugd->device_filter = WFD_DEVICE_TYPE_CAMERA;
338                         else if (0 == strncmp(device_filter, "storage", 7))
339                                 ugd->device_filter = WFD_DEVICE_TYPE_STORAGE;
340                         else if (0 == strncmp(device_filter, "network_infra", 13))
341                                 ugd->device_filter = WFD_DEVICE_TYPE_NW_INFRA;
342                         else if (0 == strncmp(device_filter, "display", 7))
343                                 ugd->device_filter = WFD_DEVICE_TYPE_DISPLAYS;
344                         else if (0 == strncmp(device_filter, "multimedia_device", 17))
345                                 ugd->device_filter = WFD_DEVICE_TYPE_MM_DEVICES;
346                         else if (0 == strncmp(device_filter, "game_device", 11))
347                                 ugd->device_filter = WFD_DEVICE_TYPE_GAME_DEVICES;
348                         else if (0 == strncmp(device_filter, "telephone", 9))
349                                 ugd->device_filter = WFD_DEVICE_TYPE_TELEPHONE;
350                         else if (0 == strncmp(device_filter, "audio", 5))
351                                 ugd->device_filter = WFD_DEVICE_TYPE_AUDIO;
352                         else
353                                 ugd->device_filter = WFD_DEVICE_TYPE_OTHER;
354                 }
355                 WFD_IF_FREE_MEM(device_filter);
356
357                 /*
358                 * get whether support auto exit after connection
359                 * default value: false
360                 */
361                 ret = app_control_get_extra_data(control, "auto_exit", &auto_exit);
362                 if (ret == APP_CONTROL_ERROR_NONE && auto_exit) {
363                         DBG(LOG_INFO, "Auto exit: %s", auto_exit);
364                         if (0 == strncmp(auto_exit, "on", 2))
365                                 ugd->is_auto_exit = true;
366                         else
367                                 ugd->is_auto_exit = false;
368                 }
369                 WFD_IF_FREE_MEM(auto_exit);
370
371                 /*
372                 * get whether support multi connection,
373                 * default value: true
374                 */
375                 ret = app_control_get_extra_data(control, "multi_connect", &multi_connect);
376                 if (ret == APP_CONTROL_ERROR_NONE && multi_connect) {
377                         DBG(LOG_INFO, "Multi connection: %s", multi_connect);
378                         if (0 == strncmp(multi_connect, "off", 2))
379                                 ugd->is_multi_connect = false;
380                         else
381                                 ugd->is_multi_connect = true;
382                 }
383                 WFD_IF_FREE_MEM(multi_connect);
384
385                 /*
386                 * get the title of UG
387                 * default value: Wi-Fi Direct
388                 */
389                 ret = app_control_get_extra_data(control, "title_string", &title);
390                 if (ret == APP_CONTROL_ERROR_NONE && title) {
391                         DBG(LOG_INFO, "Title of UG: %s", title);
392                         WFD_IF_FREE_MEM(ugd->title);
393                         ugd->title = strdup(title);
394                 }
395                 WFD_IF_FREE_MEM(title);
396         }
397
398         if (mode == UG_MODE_FULLVIEW)
399                 ugd->base = _create_fullview(ugd->win, ugd);
400         else
401                 ugd->base = _create_frameview(ugd->win, ugd);
402
403         if (ugd->base) {
404                 evas_object_event_callback_add(ugd->base, EVAS_CALLBACK_DEL, wfd_ug_layout_del_cb, ugd);
405         } else {
406                 DBG(LOG_ERROR, "Failed to create base layout\n");
407                 return NULL;
408         }
409
410         /* check status of wifi-direct from vconf */
411         wfd_status = wfd_get_vconf_status();
412         if (wfd_status < 0)
413                 return NULL;
414
415         /* draw UI */
416         initialize_gen_item_class();
417         create_wfd_ug_view(ugd);
418         wfd_ug_view_init_genlist(ugd, true);
419 #ifdef MOTION_CONTROL_ENABLE
420         motion_create(ugd);
421 #endif
422
423         /*
424         * if not deactivated, do initialization at once;
425         * otherwise, do initialization later
426         */
427         if (wfd_status != VCONFKEY_WIFI_DIRECT_DEACTIVATED) {
428                 init_wfd_client(ugd);
429         } else {
430                 ugd->wfd_status = WIFI_DIRECT_STATE_DEACTIVATED;
431
432                 ret = init_wfd_client(ugd);
433                 WFD_RETV_IF(ret != 0, NULL,  "Failed to initialize WFD client library\n");
434
435                 /* Activate WiFi Direct */
436                 DBG(LOG_INFO, "Activating WiFi Direct...");
437                 if (ugd->wfd_status <= WIFI_DIRECT_STATE_DEACTIVATING) {
438                         ret = wfd_client_switch_on(ugd);
439                         WFD_RETV_IF(ret != 0, NULL, "Failed to activate WFD\n");
440                 }
441         }
442         ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
443                         __wfd_main_vconf_change_cb, ugd);
444         if (ret)
445                 DBG(LOG_ERROR, "Failed to set vconf notification callback(VCONFKEY_SETAPPL_DEVICE_NAME_STR)");
446
447 #ifdef WIFI_STATE_CB
448         ret = vconf_notify_key_changed(VCONFKEY_WIFI_STATE, _wifi_on_state_cb, ugd);
449         if (ret)
450                 DBG(LOG_ERROR, "Failed to set vconf notification callback(VCONFKEY_WIFI_STATE)");
451 #endif
452
453         ret = vconf_notify_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE,
454                 __wfd_hotspot_mode_vconf_change_cb, ugd);
455         if (ret)
456                 DBG(LOG_ERROR, "Failed to set vconf notification callback(MOBILE_HOTSPOT_MODE)");
457
458         __FUNC_EXIT__;
459         return ugd->base;
460 }
461
462 static void on_start(ui_gadget_h ug, app_control_h control, void *priv)
463 {
464         __FUNC_ENTER__;
465         struct ug_data *ugd;
466         int res;
467
468         if (!ug || !priv)
469                 return;
470
471         ugd = priv;
472
473         struct utsname kernel_info;
474         res = uname(&kernel_info);
475         if (res != 0) {
476                 DBG(LOG_ERROR, "Failed to detect target type\n");
477         } else {
478                 DBG_SECURE(LOG_INFO, "HW ID of this device [%s]\n", kernel_info.machine);
479                 if (strncmp(kernel_info.machine, "arm", 3) != 0) {
480                         wfd_ug_warn_popup(ugd, D_("IDS_ST_POP_NOT_SUPPORTED"), POPUP_TYPE_TERMINATE_NOT_SUPPORT);
481                         return;
482                 }
483         }
484
485         __FUNC_EXIT__;
486 }
487
488 static void on_pause(ui_gadget_h ug, app_control_h control, void *priv)
489 {
490         __FUNC_ENTER__;
491
492         WFD_RET_IF(ug == NULL || priv == NULL, "The param is NULL\n");
493         struct ug_data *ugd = priv;
494         ugd->is_paused = true;
495
496         wfd_refresh_wifi_direct_state(ugd);
497         DBG(LOG_INFO, "on pause, wfd status: %d\n", ugd->wfd_status);
498
499         if ((WIFI_DIRECT_STATE_DISCOVERING == ugd->wfd_status) &&
500                 (WIFI_DIRECT_ERROR_NONE != wifi_direct_cancel_discovery())) {
501                 DBG(LOG_ERROR, "Failed to send cancel discovery state [%d]\n", ugd->wfd_status);
502                 __FUNC_EXIT__;
503                 return;
504         }
505
506         ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_STOPPED;
507
508         __FUNC_EXIT__;
509 }
510
511 static void on_resume(ui_gadget_h ug, app_control_h control, void *priv)
512 {
513         __FUNC_ENTER__;
514
515         WFD_RET_IF(ug == NULL || priv == NULL, "The param is NULL\n");
516         struct ug_data *ugd = priv;
517         ugd->is_paused = false;
518         int ret;
519         wfd_refresh_wifi_direct_state(ugd);
520         DBG(LOG_INFO, "on resume, status: %d\n", ugd->wfd_status);
521         ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_STOPPED;
522
523         elm_genlist_realized_items_update(ugd->genlist);
524
525         if (ugd->wfd_status > WIFI_DIRECT_STATE_DEACTIVATED && ugd->wfd_status < WIFI_DIRECT_STATE_CONNECTED) {
526                 DBG(LOG_INFO, "Start discovery again\n");
527                 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
528                 ret = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
529                 if (ret != WIFI_DIRECT_ERROR_NONE) {
530                         ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
531                         DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", ret);
532                         wifi_direct_cancel_discovery();
533                 }
534         }
535
536         __FUNC_EXIT__;
537 }
538
539 static void on_destroy(ui_gadget_h ug, app_control_h control, void *priv)
540 {
541         __FUNC_ENTER__;
542
543         WFD_RET_IF(ug == NULL || priv == NULL, "The param is NULL\n");
544
545         struct ug_data *ugd = priv;
546         int ret;
547         WFD_RET_IF(ugd->base == NULL, "The param is NULL\n");
548
549 #ifdef MOTION_CONTROL_ENABLE
550         motion_destroy();
551 #endif
552
553         /* DeInit WiFi Direct */
554         ret = deinit_wfd_client(ugd);
555         if (ret)
556                 DBG(LOG_ERROR, "Failed to DeInit WiFi Direct");
557
558         if (ugd->scan_toolbar) {
559                 wfd_ug_view_refresh_button(ugd->scan_toolbar,
560                         D_("IDS_WIFI_SK4_SCAN"), FALSE);
561         }
562
563         ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
564                         __wfd_main_vconf_change_cb);
565         if (ret == -1)
566                 DBG(LOG_ERROR, "Failed to ignore vconf key callback\n");
567
568 #ifdef WIFI_STATE_CB
569         ret = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_on_state_cb);
570         if (ret == -1)
571                 DBG(LOG_ERROR, "Failed to ignore vconf key callback\n");
572 #endif
573
574         ret = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE,
575                         __wfd_hotspot_mode_vconf_change_cb);
576         if (ret == -1)
577                 DBG(LOG_ERROR, "Failed to ignore vconf key callback MOBILE_HOTSPOT_MODE\n");
578
579         wfd_ug_view_free_peers(ugd);
580         WFD_IF_FREE_MEM(ugd->title);
581         WFD_IF_FREE_MEM(ugd->wfds);
582         WFD_IF_FREE_MEM(ugd->view_type);
583
584         WFD_IF_DEL_OBJ(ugd->bg);
585         WFD_IF_DEL_OBJ(ugd->base);
586         DBG(LOG_INFO, "WFD client deregistered");
587
588         __FUNC_EXIT__;
589         return;
590 }
591
592 static void on_message(ui_gadget_h ug, app_control_h msg, app_control_h control, void *priv)
593 {
594         __FUNC_ENTER__;
595         char* app_msg = NULL;
596         struct ug_data *ugd = priv;
597
598         if (!ug || !priv) {
599                 DBG(LOG_ERROR, "The param is NULL\n");
600                 return;
601         }
602
603         if (msg) {
604                 app_control_get_extra_data(msg, "msg", &app_msg);
605                 if (!app_msg) {
606                         DBG(LOG_ERROR, "Failed to get app_msg");
607                         __FUNC_EXIT__;
608                         return;
609                 }
610
611                 DBG(LOG_DEBUG, "Msg from app: %s", app_msg);
612                 if (!strcmp(app_msg, "destroy")) {
613                         if (!ugd->rename_popup) {
614                                 DBG(LOG_INFO, "Destroying UG.");
615                                 wfd_ug_view_free_peers(ugd);
616                                 wfd_destroy_ug(ugd);
617                         }
618                 }
619                 WFD_IF_FREE_MEM(app_msg);
620         }
621         __FUNC_EXIT__;
622 }
623
624 static void on_event(ui_gadget_h ug, enum ug_event event, app_control_h control, void *priv)
625 {
626         __FUNC_ENTER__;
627
628         if (!ug || !priv) {
629                 DBG(LOG_ERROR, "The param is NULL\n");
630                 return;
631         }
632
633         switch (event) {
634         case UG_EVENT_LOW_MEMORY:
635                 DBG(LOG_INFO, "UG_EVENT_LOW_MEMORY\n");
636                 break;
637         case UG_EVENT_LOW_BATTERY:
638                 DBG(LOG_INFO, "UG_EVENT_LOW_BATTERY\n");
639                 break;
640         case UG_EVENT_LANG_CHANGE:
641                 DBG(LOG_INFO, "UG_EVENT_LANG_CHANGE\n");
642                 break;
643         case UG_EVENT_ROTATE_PORTRAIT:
644                 _ctxpopup_move();
645                 DBG(LOG_INFO, "UG_EVENT_ROTATE_PORTRAIT\n");
646                 break;
647         case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
648                 DBG(LOG_INFO, "UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN\n");
649                 break;
650         case UG_EVENT_ROTATE_LANDSCAPE:
651                 _ctxpopup_move();
652                 DBG(LOG_INFO, "UG_EVENT_ROTATE_LANDSCAPE\n");
653                 break;
654         case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
655                 _ctxpopup_move();
656                 DBG(LOG_INFO, "UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN\n");
657                 break;
658         default:
659                 DBG(LOG_INFO, "default\n");
660                 break;
661         }
662
663         __FUNC_EXIT__;
664 }
665
666 static void on_key_event(ui_gadget_h ug, enum ug_key_event event, app_control_h control, void *priv)
667 {
668         __FUNC_ENTER__;
669
670         if (!ug || !priv) {
671                 DBG(LOG_ERROR, "The param is NULL\n");
672                 return;
673         }
674
675         switch (event) {
676         case UG_KEY_EVENT_END:
677                 DBG(LOG_INFO, "UG_KEY_EVENT_END\n");
678                 break;
679         default:
680                 break;
681         }
682
683         __FUNC_EXIT__;
684 }
685
686 UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops)
687 {
688         __FUNC_ENTER__;
689         struct ug_data *ugd;
690
691         if (!ops) {
692                 DBG(LOG_ERROR, "The param is NULL\n");
693                 return -1;
694         }
695
696         ugd = calloc(1, sizeof(struct ug_data));
697         if (ugd == NULL) {
698                 DBG(LOG_ERROR, "Failed to allocate memory for UG data\n");
699                 return -1;
700         }
701
702         global_ugd = ugd;
703
704         ops->create = on_create;
705         ops->start = on_start;
706         ops->pause = on_pause;
707         ops->resume = on_resume;
708         ops->destroy = on_destroy;
709         ops->message = on_message;
710         ops->event = on_event;
711         ops->key_event = on_key_event;
712         ops->priv = ugd;
713         ops->opt = UG_OPT_INDICATOR_ENABLE;
714
715         __FUNC_EXIT__;
716         return 0;
717 }
718
719 UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
720 {
721         __FUNC_ENTER__;
722
723         struct ug_data *ugd;
724
725         if (!ops) {
726                 DBG(LOG_ERROR, "The param is NULL\n");
727                 return;
728         }
729
730         ugd = ops->priv;
731
732         WFD_IF_FREE_MEM(ugd);
733
734         __FUNC_EXIT__;
735 }
736
737 UG_MODULE_API int setting_plugin_reset(app_control_h control, void *priv)
738 {
739         __FUNC_ENTER__;
740         int res = -1;
741         wifi_direct_state_e state;
742
743         res = wifi_direct_initialize();
744         if (res != WIFI_DIRECT_ERROR_NONE) {
745                 DBG(LOG_ERROR, "Failed to initialize wifi direct. [%d]\n", res);
746                 return -1;
747         }
748
749         res = wifi_direct_get_state(&state);
750         if (res != WIFI_DIRECT_ERROR_NONE) {
751                 DBG(LOG_ERROR, "Failed to get link status. [%d]\n", res);
752                 return -1;
753         }
754
755         if (state < WIFI_DIRECT_STATE_ACTIVATING) {
756                 DBG(LOG_INFO, "No need to reset Wi-Fi Direct.\n");
757         } else {
758                 /*if connected, disconnect all devices*/
759                 if (WIFI_DIRECT_STATE_CONNECTED == state) {
760                         res = wifi_direct_disconnect_all();
761                         if (res != WIFI_DIRECT_ERROR_NONE) {
762                                 DBG(LOG_ERROR, "Failed to send disconnection request to all. [%d]\n", res);
763                                 return -1;
764                         }
765                 }
766
767                 res = wifi_direct_deactivate();
768                 if (res != WIFI_DIRECT_ERROR_NONE) {
769                         DBG(LOG_ERROR, "Failed to reset Wi-Fi Direct. [%d]\n", res);
770                         return -1;
771                 }
772         }
773
774         res = wifi_direct_deinitialize();
775         if (res != WIFI_DIRECT_ERROR_NONE) {
776                 DBG(LOG_ERROR, "Failed to deinitialize wifi direct. [%d]\n", res);
777                 return -1;
778         }
779
780         __FUNC_EXIT__;
781         return 0;
782 }