#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
-
#include <vconf.h>
#include <dlog.h>
#include <system_settings_private.h>
#include <glib.h>
-#include <assert.h>
#ifdef LOG_TAG
#undef LOG_TAG
system_setting_del_incoming_call_ringtone, /* DEL */
system_setting_list_incoming_call_ringtone, /* LIST */
system_setting_feature_check_incoming_call, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
NULL, /* DEL */
NULL, /* LIST */
system_setting_feature_check_home_screen, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
NULL, /* DEL */
NULL, /* LIST */
system_setting_feature_check_lock_screen, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
NULL, /* DEL */
NULL, /* LIST */
system_setting_feature_check_notification_email, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
system_setting_feature_check_lock_screen, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
system_setting_feature_check_incoming_call, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
system_setting_feature_check_wifi, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* del */
NULL, /* list */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* del */
NULL, /* list */
system_setting_feature_check_telephony, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
NULL, /* del */
NULL, /* list */
system_setting_feature_check_telephony, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* del */
NULL, /* list */
system_setting_feature_check_telephony, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
NULL, /* DEL */
NULL, /* LIST */
NULL, /* feature check */
+ { NULL, 0 }, /* changed callabck list */
NULL, /* user data */
},
{
- SYSTEM_SETTINGS_MAX, -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+ SYSTEM_SETTINGS_MAX, -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, { NULL, 0 }, NULL
}
};
return system_setting_unset_changed_cb(key);
}
+int system_settings_add_changed_cb(system_settings_key_e key, system_settings_changed_cb callback, void *user_data)
+{
+ LOGE("Enter [%s]", __FUNCTION__);
+ char *vconf_string = NULL;
+ system_setting_h system_setting_item;
+
+ if (callback == NULL) {
+ return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
+ }
+
+ if (key == SYSTEM_SETTINGS_KEY_DEFAULT_FONT_TYPE)
+ return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
+
+ int ret = system_settings_get_item(key, &system_setting_item);
+ if (ret != 0) {
+ if (ret == SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER)
+ LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
+ return ret;
+ }
+
+ system_settings_vconf_get_key_string(key, &vconf_string);
+
+ /* Store the callback function from application side */
+ ret = add_multi_callback(&system_setting_item->changed_cb_list, callback, user_data);
+ if (ret != SYSTEM_SETTINGS_ERROR_NONE) {
+ LOGE("[%s] IO_ERROR(0x%08x) : failed to add muti-callback for the system settings", __FUNCTION__, ret);
+ return ret;
+ }
+
+ if (!system_setting_item->changed_cb_list.is_registered) {
+ int ret = system_setting_vconf_set_changed_multi_cb(vconf_string, key);
+ if (ret == SYSTEM_SETTINGS_ERROR_NONE)
+ system_setting_item->changed_cb_list.is_registered = 1;
+ LOGE("Leave [%s]", __FUNCTION__);
+ return ret;
+ }
+
+ LOGE("Leave [%s]", __FUNCTION__);
+ return SYSTEM_SETTINGS_ERROR_NONE;
+}
+
+int system_settings_remove_changed_cb(system_settings_key_e key, system_settings_changed_cb callback)
+{
+ LOGE("Enter [%s]", __FUNCTION__);
+ char *vconf_string = NULL;
+ system_setting_h system_setting_item;
+
+ if (callback == NULL)
+ return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
+
+ if (key == SYSTEM_SETTINGS_KEY_DEFAULT_FONT_TYPE)
+ return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
+
+ int ret = system_settings_get_item(key, &system_setting_item);
+ if (ret != 0) {
+ if (ret == SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER)
+ LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
+ return ret;
+ }
+
+ delete_multi_callback(&system_setting_item->changed_cb_list, callback);
+
+ if (system_setting_item->changed_cb_list.list == NULL) {
+ int ret = 0;
+ system_settings_vconf_get_key_string(key, &vconf_string);
+ if (vconf_string == NULL)
+ return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
+ ret = system_setting_vconf_unset_changed_multi_cb(vconf_string);
+ if (ret == SYSTEM_SETTINGS_ERROR_NONE)
+ system_setting_item->changed_cb_list.is_registered = 0;
+ LOGE("Leave [%s]", __FUNCTION__);
+ return ret;
+ }
+
+ LOGE("Leave [%s]", __FUNCTION__);
+ return SYSTEM_SETTINGS_ERROR_NONE;
+}
+
//////////////////////////////////////////////////////////////////////////////////////////////////
// list
//////////////////////////////////////////////////////////////////////////////////////////////////
return 1;
}
-static GMainLoop* main_loop = NULL;
+static GMainLoop* multi_main_loop = NULL;
static bool _callback_called = false;
//static char *new_ringtonepath = "/usr/apps/org.tizen.setting/shared/res/settings/Ringtones/Basic_Bell.ogg";
static char *new_ringtonepath = "/opt/usr/data/settings/Ringtones/ringtone_sdk.mp3";
/*g_main_loop_quit(main_loop);*/
}
-
/**
* TEST GETTING SYSTEM_SETTINGS_KEY_DEFAULT_FONT_TYPE
*/
return;
}
+#include <unistd.h> /* to use sleep */
+static int call_cnt = 0;
+static void utc_system_settings_changed_multi_callback1(system_settings_key_e key, void *user_data)
+{
+ call_cnt++;
+}
+
+static void utc_system_settings_changed_multi_callback2(system_settings_key_e key, void *user_data)
+{
+ call_cnt++;
+ sleep(1);
+ g_main_loop_quit(multi_main_loop);
+}
+
+static void *test_multi_callback_thread(void *arg)
+{
+ int retcode = system_settings_add_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR,
+ utc_system_settings_changed_multi_callback1, NULL);
+ my_assert_ret(retcode);
+
+ retcode = system_settings_add_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR,
+ utc_system_settings_changed_multi_callback1, NULL);
+
+ /* not support same callback about 1 system-settings key */
+ g_assert_cmpint(retcode, ==, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
+
+ retcode = system_settings_add_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR,
+ utc_system_settings_changed_multi_callback2, NULL);
+
+ bool bk_state = false;
+ system_settings_get_value_bool(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR , &bk_state);
+
+ bool state = true;
+ system_settings_set_value_bool(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR , state);
+
+ sleep(1);
+
+ my_assert_ret(retcode);
+ retcode = system_settings_remove_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR,
+ utc_system_settings_changed_multi_callback1);
+ my_assert_ret(retcode);
+ retcode = system_settings_remove_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR,
+ utc_system_settings_changed_multi_callback2);
+ my_assert_ret(retcode);
+
+ system_settings_set_value_bool(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR , bk_state);
+
+
+}
+/**
+ * @testcase utc_system_settings_add_changed_cb_p1
+ * @since_tizen 4.0
+ * @description check if SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR is able to set the callback for change-notification.
+ */
+static void utc_system_settings_add_changed_cb_p1(void)
+{
+ multi_main_loop = g_main_loop_new(NULL, FALSE);
+ pthread_t test_thread;
+
+ pthread_create(&test_thread, NULL, test_multi_callback_thread, NULL);
+ pthread_detach(test_thread);
+
+ g_main_loop_run(multi_main_loop);
+
+ g_assert_cmpint(call_cnt, ==, 2);
+ return;
+}
+
+
static void simple_test_case(void)
{
/* a suitable test */
{
/* hook up your test functions */
g_test_add_func("/API Test Case", simple_test_case);
+ g_test_add_func("/utc_system_settings_add_changed_cb_p1", utc_system_settings_add_changed_cb_p1);
g_test_add_func("/utc_system_settings_get_value_string_p1", utc_system_settings_get_value_string_p1);
g_test_add_func("/utc_system_settings_get_value_string_p2", utc_system_settings_get_value_string_p2);
g_test_add_func("/utc_system_settings_get_value_string_p3", utc_system_settings_get_value_string_p3);
#define LOG_TAG "TIZEN_N_SYSTEM_SETTINGS"
+static char* _system_settings_vconf_table[38] = {
+ VCONFKEY_SETAPPL_CALL_RINGTONE_PATH_STR,
+ VCONFKEY_BGSET,
+ VCONFKEY_IDLE_LOCK_BGSET,
+ VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE,
+ VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME,
+ VCONFKEY_SETAPPL_MOTION_ACTIVATION,
+ VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR,
+ VCONFKEY_SETAPPL_USB_DEBUG_MODE_BOOL,
+ VCONFKEY_3G_ENABLE,
+ NULL,
+ VCONFKEY_SETAPPL_3RD_LOCK_PKG_NAME_STR,
+ NULL,
+ VCONFKEY_REGIONFORMAT,
+ VCONFKEY_LANGSET,
+ VCONFKEY_REGIONFORMAT_TIME1224,
+ VCONFKEY_SETAPPL_TIMEZONE_ID,
+ VCONFKEY_SYSTEM_TIME_CHANGED,
+ VCONFKEY_SETAPPL_SOUND_LOCK_BOOL,
+ VCONFKEY_SETAPPL_SOUND_STATUS_BOOL,
+ VCONFKEY_SETAPPL_TOUCH_SOUNDS_BOOL,
+ VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL,
+ VCONFKEY_SETAPPL_DEVICE_NAME_STR,
+ VCONFKEY_SETAPPL_MOTION_ACTIVATION,
+ VCONFKEY_WIFI_ENABLE_QS,
+ VCONFKEY_TELEPHONY_FLIGHT_MODE,
+ VCONFKEY_SETAPPL_LCD_TIMEOUT_NORMAL,
+ VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR,
+ VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT,
+ VCONFKEY_IDLE_LOCK_STATE_READ_ONLY,
+ VCONFKEY_SETAPPL_AD_ID,
+ VCONFKEY_SETAPPL_UDSM,
+ VCONFKEY_SETAPPL_UDSM_PKGID_LIST,
+ VCONFKEY_SETAPPL_ACCESSIBILITY_TTS,
+ VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL,
+ "MAX"
+};
int system_setting_vconf_get_value_int(const char *vconf_key, int *value)
{
return SYSTEM_SETTINGS_ERROR_NONE;
}
+int system_settings_vconf_get_key_string(system_settings_key_e key, char **key_string)
+{
+ if (key == SYSTEM_SETTINGS_KEY_DEFAULT_FONT_TYPE) {
+ *key_string = NULL; /* Not Supported changed callback*/
+ return SYSTEM_SETTINGS_ERROR_NOT_SUPPORTED;
+ }
+
+ *key_string = _system_settings_vconf_table[(int)key];
+
+ if (*key_string == NULL)
+ return SYSTEM_SETTINGS_ERROR_NOT_SUPPORTED;
+
+ return SYSTEM_SETTINGS_ERROR_NONE;
+}
+
+static void system_setting_vconf_event_multi_cb(keynode_t *node, void *event_data)
+{
+ LOGE("Enter [%s]", __FUNCTION__);
+ system_settings_key_e pkey = (system_settings_key_e)event_data;
+
+ if (node != NULL) {
+ system_setting_h system_setting_item;
+
+ int ret = system_settings_get_item(pkey, &system_setting_item);
+ if (ret != 0) {
+ if (ret == SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER)
+ LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
+ }
+
+ invoke_callback_list(&system_setting_item->changed_cb_list, pkey);
+ }
+ LOGE("Leave [%s]", __FUNCTION__);
+}
+
+int system_setting_vconf_set_changed_multi_cb(const char *vconf_key, system_settings_key_e key)
+{
+ LOGE("Enter [%s]", __FUNCTION__);
+ if (vconf_notify_key_changed(vconf_key, system_setting_vconf_event_multi_cb, (void *)key)) {
+ LOGE("[%s] INVALID_error , %s", __FUNCTION__, "vconf_notify_key_changed error");
+ return SYSTEM_SETTINGS_ERROR_IO_ERROR;
+ }
+
+ LOGE("Leave [%s]", __FUNCTION__);
+ return SYSTEM_SETTINGS_ERROR_NONE;
+}
+
+int system_setting_vconf_unset_changed_multi_cb(const char *vconf_key)
+{
+ LOGE("Enter [%s]", __FUNCTION__);
+ if (vconf_ignore_key_changed(vconf_key, system_setting_vconf_event_multi_cb)) {
+ LOGE("[%s] INVALID_error , %s", __FUNCTION__, "vconf_ignore_key_changed error");
+ return SYSTEM_SETTINGS_ERROR_IO_ERROR;
+ }
+
+ LOGE("Leave [%s]", __FUNCTION__);
+ return SYSTEM_SETTINGS_ERROR_NONE;
+}