Remove dependency libsystem-settings-util.so
[platform/core/api/system-settings.git] / src / system_settings_vconf.c
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
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 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
20
21 #include <vconf.h>
22 #include <dlog.h>
23
24 #include <system_settings.h>
25 #include <system_settings_private.h>
26
27 #ifdef LOG_TAG
28 #undef LOG_TAG
29 #endif
30
31 #define LOG_TAG "TIZEN_N_SYSTEM_SETTINGS"
32
33 static char *_system_settings_vconf_table[] = {
34         VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR,
35         VCONFKEY_BGSET,
36         VCONFKEY_IDLE_LOCK_BGSET,
37         VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE,
38         VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME,
39         VCONFKEY_SETAPPL_MOTION_ACTIVATION,
40         VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR,
41         VCONFKEY_SETAPPL_USB_DEBUG_MODE_BOOL,
42         VCONFKEY_3G_ENABLE,
43         NULL,
44         VCONFKEY_SETAPPL_3RD_LOCK_PKG_NAME_STR,
45         NULL,
46         VCONFKEY_REGIONFORMAT,
47         VCONFKEY_LANGSET,
48         VCONFKEY_REGIONFORMAT_TIME1224,
49         VCONFKEY_SETAPPL_TIMEZONE_ID,
50         VCONFKEY_SYSTEM_TIME_CHANGED,
51         VCONFKEY_SETAPPL_SOUND_LOCK_BOOL,
52         VCONFKEY_SETAPPL_SOUND_STATUS_BOOL,
53         VCONFKEY_SETAPPL_TOUCH_SOUNDS_BOOL,
54         VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL,
55         VCONFKEY_SETAPPL_DEVICE_NAME_STR,
56         VCONFKEY_SETAPPL_MOTION_ACTIVATION,
57         VCONFKEY_WIFI_ENABLE_QS,
58         VCONFKEY_TELEPHONY_FLIGHT_MODE,
59         VCONFKEY_SETAPPL_LCD_TIMEOUT_NORMAL,
60         VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR,
61         VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT,
62         VCONFKEY_IDLE_LOCK_STATE_READ_ONLY,
63         VCONFKEY_SETAPPL_AD_ID,
64         VCONFKEY_SETAPPL_UDSM,
65         VCONFKEY_SETAPPL_UDSM_PKGID_LIST,
66         VCONFKEY_SETAPPL_ACCESSIBILITY_TTS,
67         VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL,
68         VCONFKEY_SETAPPL_STATE_AUTOMATIC_TIME_UPDATE_BOOL,
69         VCONFKEY_SETAPPL_DEVELOPER_OPTION_STATE,
70         "MAX"
71 };
72
73 int system_setting_vconf_get_value_int(const char *vconf_key, int *value)
74 {
75         return vconf_get_int(vconf_key, value);
76 }
77
78 int system_setting_vconf_get_value_bool(const char *vconf_key, bool *value)
79 {
80         int tempvalue = 0;
81         int ret = vconf_get_bool(vconf_key, &tempvalue);
82
83         if (tempvalue == 1) {
84                 *value = true;
85         } else {
86                 *value = false;
87         }
88         return ret;
89 }
90
91 int system_setting_vconf_get_value_string(const char *vconf_key, char **value)
92 {
93         char *str_value = NULL;
94
95         str_value = vconf_get_str(vconf_key);
96
97         if (str_value != NULL) {
98                 *value = str_value;
99                 return 0;
100         } else {
101                 return -1;
102         }
103 }
104
105 int system_setting_vconf_set_value_int(const char *vconf_key, int value)
106 {
107         return vconf_set_int(vconf_key, value);
108 }
109
110 int system_setting_vconf_set_value_bool(const char *vconf_key, bool value)
111 {
112         return vconf_set_bool(vconf_key, (int)value);
113 }
114
115 int system_setting_vconf_set_value_string(const char *vconf_key, char *value)
116 {
117         return vconf_set_str(vconf_key, value);
118 }
119
120 /*/////////////////////////////////////////////////////////////////////////////////////////// */
121
122 typedef void (*system_setting_vconf_event_cb)(keynode_t *node, void *event_data);
123
124 /*  LCOV_EXCL_START */
125 static void system_setting_vconf_event_cb0(keynode_t *node, void *event_data)
126 {
127         system_settings_key_e pkey = (system_settings_key_e)event_data;
128
129         if (node != NULL) {
130                 system_setting_h system_setting_item;
131
132                 int ret = system_settings_get_item(pkey, &system_setting_item);
133                 if (ret != 0) {
134                         if (ret == SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER)
135                                 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
136                 }
137
138                 void *user_data = NULL;
139                 user_data = system_setting_item->user_data;
140                 system_setting_item->changed_cb(pkey, user_data);
141         }
142 }
143 /*  LCOV_EXCL_STOP */
144
145 /*  LCOV_EXCL_START */
146 static void system_setting_vconf_event_cb1(keynode_t *node, void *event_data)
147 {
148         system_settings_key_e pkey = (system_settings_key_e)event_data;
149
150         if (node != NULL) {
151                 system_setting_h system_setting_item;
152
153                 int ret = system_settings_get_item(pkey, &system_setting_item);
154                 if (ret != 0) {
155                         if (ret == SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER)
156                                 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
157                 }
158
159                 void *user_data = NULL;
160                 user_data = system_setting_item->user_data;
161                 system_setting_item->changed_cb(pkey, user_data);
162         }
163 }
164 /*  LCOV_EXCL_STOP */
165
166 /*  LCOV_EXCL_START */
167 static void system_setting_vconf_event_cb2(keynode_t *node, void *event_data)
168 {
169         system_settings_key_e pkey = (system_settings_key_e)event_data;
170
171         if (node != NULL) {
172                 system_setting_h system_setting_item;
173
174                 int ret = system_settings_get_item(pkey, &system_setting_item);
175                 if (ret != 0) {
176                         if (ret == SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER)
177                                 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
178                 }
179
180                 void *user_data = NULL;
181                 user_data = system_setting_item->user_data;
182                 system_setting_item->changed_cb(pkey, user_data);
183         }
184 }
185 /*  LCOV_EXCL_STOP */
186
187 /*  LCOV_EXCL_START */
188 static void system_setting_vconf_event_cb3(keynode_t *node, void *event_data)
189 {
190         system_settings_key_e pkey = (system_settings_key_e)event_data;
191
192         if (node != NULL) {
193                 system_setting_h system_setting_item;
194
195                 int ret = system_settings_get_item(pkey, &system_setting_item);
196                 if (ret != 0) {
197                         if (ret == SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER)
198                                 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
199                 }
200
201                 void *user_data = NULL;
202                 user_data = system_setting_item->user_data;
203                 system_setting_item->changed_cb(pkey, user_data);
204         }
205 }
206 /*  LCOV_EXCL_STOP */
207
208 /*  LCOV_EXCL_START */
209 static void system_setting_vconf_event_cb4(keynode_t *node, void *event_data)
210 {
211         system_settings_key_e pkey = (system_settings_key_e)event_data;
212
213         if (node != NULL) {
214                 system_setting_h system_setting_item;
215
216                 int ret = system_settings_get_item(pkey, &system_setting_item);
217                 if (ret != 0) {
218                         if (ret == SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER)
219                                 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
220                 }
221
222                 void *user_data = NULL;
223                 user_data = system_setting_item->user_data;
224                 system_setting_item->changed_cb(pkey, user_data);
225         }
226 }
227 /*  LCOV_EXCL_STOP */
228
229 /*  LCOV_EXCL_START */
230 static void system_setting_vconf_event_cb100(keynode_t *node, void *event_data)
231 {
232         system_settings_key_e pkey = (system_settings_key_e)event_data;
233
234         if (node != NULL) {
235                 system_setting_h system_setting_item;
236
237                 int ret = system_settings_get_item(pkey, &system_setting_item);
238                 if (ret != 0) {
239                         if (ret == SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER)
240                                 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
241                 }
242
243                 void *user_data = NULL;
244                 user_data = system_setting_item->user_data;
245                 system_setting_item->changed_cb(pkey, user_data);
246         }
247 }
248 /*  LCOV_EXCL_STOP */
249
250
251 /*  LCOV_EXCL_START */
252 static system_setting_vconf_event_cb system_setting_vconf_get_event_cb_slot(int slot)
253 {
254         switch (slot) {
255         case 0:
256                 return system_setting_vconf_event_cb0;
257
258         case 1:
259                 return system_setting_vconf_event_cb1;
260
261         case 2:
262                 return system_setting_vconf_event_cb2;
263
264         case 3:
265                 return system_setting_vconf_event_cb3;
266
267         case 4:
268                 return system_setting_vconf_event_cb4;
269         case 100:
270                 return system_setting_vconf_event_cb100;
271
272         default:
273                 return NULL;
274         }
275 }
276 /*  LCOV_EXCL_STOP */
277
278 int system_setting_vconf_set_changed_cb(const char *vconf_key, system_settings_key_e key, int slot, void *user_data)
279 {
280         system_setting_vconf_event_cb vconf_event_cb;
281
282         vconf_event_cb = system_setting_vconf_get_event_cb_slot(slot);
283
284         if (vconf_event_cb == NULL) {
285                 LOGE("[%s] INVALID_error , %s", __FUNCTION__, "vconf_event_cb == 0");
286                 return SYSTEM_SETTINGS_ERROR_IO_ERROR;
287         }
288
289 #if 1
290         if (vconf_notify_key_changed(vconf_key, vconf_event_cb, (void *)key))
291 #else
292         if (vconf_notify_key_changed(vconf_key, vconf_event_cb, (void *)user_data))
293 #endif
294         {
295                 LOGE("[%s] INVALID_error , %s", __FUNCTION__, "vconf_notify_key_changed error");
296                 return SYSTEM_SETTINGS_ERROR_IO_ERROR;
297         }
298
299         return SYSTEM_SETTINGS_ERROR_NONE;
300 }
301
302 int system_setting_vconf_unset_changed_cb(const char *vconf_key, int slot)
303 {
304         system_setting_vconf_event_cb vconf_event_cb;
305
306         vconf_event_cb = system_setting_vconf_get_event_cb_slot(slot);
307
308         if (vconf_event_cb != NULL) {
309                 vconf_ignore_key_changed(vconf_key, vconf_event_cb);
310         }
311
312         return SYSTEM_SETTINGS_ERROR_NONE;
313 }
314
315 int system_settings_vconf_get_key_string(system_settings_key_e key, char **key_string)
316 {
317         if (key == SYSTEM_SETTINGS_KEY_DEFAULT_FONT_TYPE) {
318                 *key_string = NULL; /* Not Supported changed callback*/
319                 return SYSTEM_SETTINGS_ERROR_NOT_SUPPORTED;
320         }
321
322         *key_string = _system_settings_vconf_table[(int)key];
323
324         if (*key_string == NULL)
325                 return SYSTEM_SETTINGS_ERROR_NOT_SUPPORTED;
326
327         return SYSTEM_SETTINGS_ERROR_NONE;
328 }
329
330 static void system_setting_vconf_event_multi_cb(keynode_t *node, void *event_data)
331 {
332         LOGE("Enter [%s]", __FUNCTION__);
333         system_settings_key_e pkey = (system_settings_key_e)event_data;
334
335         if (node != NULL) {
336                 system_setting_h system_setting_item;
337
338                 int ret = system_settings_get_item(pkey, &system_setting_item);
339                 if (ret != 0) {
340                         if (ret == SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER)
341                                 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
342                 }
343
344                 invoke_callback_list(&system_setting_item->changed_cb_list, pkey);
345         }
346         LOGE("Leave [%s]", __FUNCTION__);
347 }
348
349 /*  LCOV_EXCL_START */
350 static void system_setting_vconf_event_multi_cb_slot_0(keynode_t *node, void *event_data)
351 {
352         system_setting_vconf_event_multi_cb(node, event_data);
353 }
354 /*  LCOV_EXCL_STOP */
355
356 /*  LCOV_EXCL_START */
357 static void system_setting_vconf_event_multi_cb_slot_1(keynode_t *node, void *event_data)
358 {
359         system_setting_vconf_event_multi_cb(node, event_data);
360 }
361 /*  LCOV_EXCL_STOP */
362
363 /*  LCOV_EXCL_START */
364 static void system_setting_vconf_event_multi_cb_slot_2(keynode_t *node, void *event_data)
365 {
366         system_setting_vconf_event_multi_cb(node, event_data);
367 }
368 /*  LCOV_EXCL_STOP */
369
370 /*  LCOV_EXCL_START */
371 static void system_setting_vconf_event_multi_cb_slot_3(keynode_t *node, void *event_data)
372 {
373         system_setting_vconf_event_multi_cb(node, event_data);
374 }
375 /*  LCOV_EXCL_STOP */
376
377 static system_setting_vconf_event_cb system_setting_vconf_get_event_multi_cb_slot(system_settings_key_e key)
378 {
379         int cal = (int) key;
380         int slot = cal % 4;
381
382         switch (slot) {
383         case 0:
384                 return system_setting_vconf_event_multi_cb_slot_0;
385
386         case 1:
387                 return system_setting_vconf_event_multi_cb_slot_1;
388
389         case 2:
390                 return system_setting_vconf_event_multi_cb_slot_2;
391
392         case 3:
393                 return system_setting_vconf_event_multi_cb_slot_3;
394
395         default:
396                 return NULL;
397         }
398 }
399
400 int system_setting_vconf_set_changed_multi_cb(const char *vconf_key, system_settings_key_e key)
401 {
402         LOGE("Enter [%s]", __FUNCTION__);
403         system_setting_vconf_event_cb vconf_event_cb;
404
405         vconf_event_cb = system_setting_vconf_get_event_multi_cb_slot(key);
406
407         if (vconf_event_cb == NULL)
408                 return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
409
410         int ret = vconf_notify_key_changed(vconf_key, vconf_event_cb, (void *)key);
411         if (ret != 0) {
412                 LOGE("[%s] INVALID_error , ret = %d, %s", __FUNCTION__, ret, "vconf_notify_key_changed error");
413                 return SYSTEM_SETTINGS_ERROR_IO_ERROR;
414         }
415
416         LOGE("Leave [%s]", __FUNCTION__);
417         return SYSTEM_SETTINGS_ERROR_NONE;
418 }
419
420 int system_setting_vconf_unset_changed_multi_cb(const char *vconf_key, system_settings_key_e key)
421 {
422         LOGE("Enter [%s]", __FUNCTION__);
423         system_setting_vconf_event_cb vconf_event_cb;
424
425         vconf_event_cb = system_setting_vconf_get_event_multi_cb_slot(key);
426
427         if (vconf_event_cb == NULL)
428                 return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
429
430         int ret = vconf_ignore_key_changed(vconf_key, vconf_event_cb);
431         if (ret != 0) {
432                 LOGE("[%s] INVALID_error , ret = %d, %s", __FUNCTION__, ret, "vconf_ignore_key_changed error");
433                 return SYSTEM_SETTINGS_ERROR_IO_ERROR;
434         }
435
436         LOGE("Leave [%s]", __FUNCTION__);
437         return SYSTEM_SETTINGS_ERROR_NONE;
438 }
439