tizen_2.0_build
[profile/ivi/indicator-win.git] / modules / setting / wifi-direct.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 #include <stdio.h>
19 #include <stdlib.h>
20 #include <vconf.h>
21 #include "common.h"
22 #include "indicator.h"
23 #include "indicator_icon_util.h"
24 #include "modules.h"
25 #include "indicator_ui.h"
26
27 #define ICON_PRIORITY   INDICATOR_PRIORITY_NON_FIXED_5
28 #define MODULE_NAME             "wifi_direct"
29
30 extern void show_trnsfr_icon(void *data);
31 extern void hide_trnsfr_icon(void);
32
33 static int register_wifi_direct_module(void *data);
34 static int unregister_wifi_direct_module(void);
35
36 Indicator_Icon_Object wifi_direct = {
37         .type = INDICATOR_IMG_ICON,
38         .name = MODULE_NAME,
39         .priority = ICON_PRIORITY,
40         .always_top = EINA_TRUE,
41         .exist_in_view = EINA_FALSE,
42         .txt_obj = {0,},
43         .img_obj = {0,},
44         .obj_exist = EINA_FALSE,
45         .fixed = EINA_FALSE,
46         .init = register_wifi_direct_module,
47         .fini = unregister_wifi_direct_module,
48 };
49
50 static Eina_Bool wifi_direct_transferring = EINA_FALSE;
51
52 enum {
53         WIFI_DIRECT_ACTIVATE = 0,
54         WIFI_DIRECT_CONNECTED,
55         WIFI_DIRECT_DISCOVERING,
56         WIFI_DIRECT_GROUP_OWNER,
57         WIFI_DIRECT_MAX,
58 };
59
60 #define WIFI_D_ICON_NOT_CONNECTED \
61         "Bluetooth_NFC_GPS/B03_Wi-fi_direct_On_not_connected.png"
62
63 #define WIFI_D_ICON_CONNECTED \
64         "Bluetooth_NFC_GPS/B03_Wi-fi_direct_On_connected.png"
65
66 static const char *icon_path[WIFI_DIRECT_MAX] = {
67         [WIFI_DIRECT_ACTIVATE] = WIFI_D_ICON_NOT_CONNECTED,
68         [WIFI_DIRECT_CONNECTED] = WIFI_D_ICON_CONNECTED,
69         [WIFI_DIRECT_DISCOVERING] = NULL,
70         [WIFI_DIRECT_GROUP_OWNER] = WIFI_D_ICON_CONNECTED,
71 };
72
73
74 static void show_icon(void *data, int i)
75 {
76         if (i < WIFI_DIRECT_ACTIVATE || i >= WIFI_DIRECT_MAX)
77                 i = WIFI_DIRECT_ACTIVATE;
78
79         wifi_direct.img_obj.data = icon_path[i];
80         indicator_util_icon_show(&wifi_direct);
81 }
82
83 static void hide_icon(void)
84 {
85         indicator_util_icon_hide(&wifi_direct);
86 }
87
88 static void indicator_wifi_direct_change_cb(keynode_t *node, void *data)
89 {
90         int status;
91         int ret;
92
93         retif(data == NULL, , "Invalid parameter!");
94
95         ret = vconf_get_int(VCONFKEY_WIFI_DIRECT_STATE, &status);
96
97         if (ret == OK) {
98                 INFO("wifi_direct STATUS: %d", status);
99
100                 switch (status) {
101                 case VCONFKEY_WIFI_DIRECT_ACTIVATED:
102                         show_icon(data, WIFI_DIRECT_ACTIVATE);
103                         break;
104                 case VCONFKEY_WIFI_DIRECT_CONNECTED:
105                         show_icon(data, WIFI_DIRECT_CONNECTED);
106                         break;
107                 case VCONFKEY_WIFI_DIRECT_DISCOVERING:
108                         break;
109                 case VCONFKEY_WIFI_DIRECT_GROUP_OWNER:
110                         show_icon(data, WIFI_DIRECT_GROUP_OWNER);
111                         break;
112                 default:
113                         hide_icon();
114                         break;
115                 }
116                 return;
117         }
118
119         hide_icon();
120         return;
121 }
122
123
124 static void
125 indicator_wifi_direct_transfer_change_cb(keynode_t *node, void *data)
126 {
127         int status;
128         int ret;
129
130         retif(data == NULL, , "Invalid parameter!");
131
132         ret = vconf_get_int(VCONFKEY_WIFI_DIRECT_TRANSFER_STATE, &status);
133
134         if (ret == OK) {
135                 INFO("wifi_direct transferring STATUS: %d", status);
136                 switch (status) {
137                 case VCONFKEY_WIFI_DIRECT_TRANSFER_START:
138                         if (wifi_direct_transferring != EINA_TRUE) {
139                                 show_trnsfr_icon(data);
140                                 wifi_direct_transferring = EINA_TRUE;
141                         }
142                         break;
143                 case VCONFKEY_WIFI_DIRECT_TRANSFER_FAIL:
144                         if (wifi_direct_transferring == EINA_TRUE) {
145                                 hide_trnsfr_icon();
146                                 wifi_direct_transferring = EINA_FALSE;
147                         }
148                         break;
149                 case VCONFKEY_WIFI_DIRECT_TRANSFER_FINISH:
150                         if (wifi_direct_transferring == EINA_TRUE) {
151                                 hide_trnsfr_icon();
152                                 wifi_direct_transferring = EINA_FALSE;
153                         }
154                         break;
155                 }
156         }
157 }
158
159 static int register_wifi_direct_module(void *data)
160 {
161         int ret;
162
163         retif(data == NULL, FAIL, "Invalid parameter!");
164
165         ret = vconf_notify_key_changed(VCONFKEY_WIFI_DIRECT_STATE,
166                                        indicator_wifi_direct_change_cb, data);
167         if (ret != OK)
168                 ERR("Failed to register callback! : %s",
169                         VCONFKEY_WIFI_DIRECT_STATE);
170
171         ret = vconf_notify_key_changed(VCONFKEY_WIFI_DIRECT_TRANSFER_STATE,
172                                indicator_wifi_direct_transfer_change_cb, data);
173
174         indicator_wifi_direct_change_cb(NULL, data);
175         indicator_wifi_direct_transfer_change_cb(NULL, data);
176
177         return ret;
178 }
179
180 static int unregister_wifi_direct_module(void)
181 {
182         int ret;
183
184         ret = vconf_ignore_key_changed(VCONFKEY_WIFI_DIRECT_STATE,
185                                        indicator_wifi_direct_change_cb);
186         if (ret != OK)
187                 ERR("Failed to unregister callback!");
188
189         ret = vconf_ignore_key_changed(VCONFKEY_WIFI_DIRECT_TRANSFER_STATE,
190                                indicator_wifi_direct_transfer_change_cb);
191         if (ret != OK)
192                 ERR("Failed to unregister callback!");
193
194         if (wifi_direct_transferring == EINA_TRUE) {
195                 hide_trnsfr_icon();
196                 wifi_direct_transferring = EINA_FALSE;
197 }
198
199         hide_icon();
200
201         return OK;
202 }