fix callback port number & betweeny bug
[platform/core/api/system-settings.git] / src / system_setting_platform.c
index dec5e84..e0fd469 100644 (file)
@@ -25,6 +25,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#include <aul.h>
 
 #include <regex.h>
 
 
 #include <fontconfig/fontconfig.h>
 
-#include <alarm.h>
-
 #include <pkgmgr-info.h>
 
 #include <system_settings.h>
 #include <system_settings_private.h>
+#include <system_settings_ringtones.h>
+#include <system_settings_json.h>
+
 
 #include <tzplatform_config.h>
+#include <alarm.h>
 
 #ifdef USE_EFL_ASSIST
 #include <efl_assist.h>
 #endif
 
+
+
 #define SETTING_FONT_CONF_FILE _TZ_SYS_ETC"/fonts/conf.avail/99-tizen.conf"
 #define SETTING_DEFAULT_FONT_CONF_FILE _TZ_SYS_ETC"/fonts/conf.avail/99-tizen.conf"
 
 #define SETTING_TZONE_SYMLINK_PATH             "/opt/etc/localtime"
 
 
+#define __FREE(del, arg) do { \
+               if (arg) { \
+                       del((void *)(arg)); /*cast any argument to (void*) to avoid build warring*/\
+                       arg = NULL; \
+               } \
+       } while (0);
+#define FREE(arg) __FREE(free, arg)
+
+#ifdef SETTING_ARCH_64
+#define SETTING_UTILS_SO_FILE_PATH "/usr/lib64/libsystem-settings-util.so.0.1.0"
+#else
+#define SETTING_UTILS_SO_FILE_PATH "/usr/lib/libsystem-settings-util.so.0.1.0"
+#endif
+
 int _is_file_accessible(const char *path);
 
 static bool dl_is_supported_image_type_load(char *path);
@@ -147,11 +166,12 @@ int system_setting_get_font_size(system_settings_key_e key, system_setting_data_
 {
        SETTING_TRACE_BEGIN;
        int vconf_value;
+       int ** val = (int**)value;
 
        if (system_setting_vconf_get_value_int(VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, &vconf_value)) {
                return SYSTEM_SETTINGS_ERROR_IO_ERROR;
        }
-       *value = (void *)vconf_value;
+       **val = vconf_value;
 
        return SYSTEM_SETTINGS_ERROR_NONE;
 }
@@ -226,7 +246,6 @@ int system_setting_get_3g_data_network(system_settings_key_e key, system_setting
  *
  * @return SYSTEM_SETTINGS_ERROR_LOCKSCREEN_APP_PASSWORD_MODE raise exception if current lock type is 'password'
  */
-/*  LCOV_EXCL_START */
 int system_setting_get_lockscreen_app(system_settings_key_e key, system_setting_data_type_e data_type, void **value)
 {
        SETTING_TRACE_BEGIN;
@@ -245,7 +264,6 @@ int system_setting_get_lockscreen_app(system_settings_key_e key, system_setting_
        *value = pkg_name;
        return SYSTEM_SETTINGS_ERROR_NONE;
 }
-/*  LCOV_EXCL_STOP */
 
 
 /*////////////////////////////////////////////////////////////////////////////////////////////////// */
@@ -264,6 +282,198 @@ int _is_file_accessible(const char *path)
        }
 }
 
+
+
+/*////////////////////////////////////////////////////////////////////////////////////////////////// */
+// @todo move to CMake
+#define DEF_RINGTONE_FILE_PATH "/opt/share/settings/Ringtones"
+#define USR_RINGTONE_FILE_PATH "/home/owner/content/Sounds/Ringtones"
+#define JSONFILE "/opt/home/owner/apps_rw/org.tizen.setting/data/.user-ringtones.json"
+
+#if 0
+static char* _get_json_file_path()
+{
+       // for testing
+       return JSONFILE;
+}
+#endif
+
+int system_setting_add_incoming_call_ringtone(system_settings_key_e key, system_setting_data_type_e data_type, void *value)
+{
+       SETTING_TRACE_BEGIN;
+       char* pathval = (char*)value;
+
+#ifdef USE_JSONFILE
+       // NOT IN USE
+       JsonParser *parser = ss_json_ringtone_open_file(JSONFILE);
+#else
+       JsonParser *parser = ss_json_ringtone_load_from_data();
+#endif
+
+       JsonNode *root = json_parser_get_root(parser);
+
+       // dirname
+       // basename
+       int ret = SYSTEM_SETTINGS_ERROR_NONE;
+       if (false == ss_json_ringtone_contain(root, pathval)) {
+               SETTING_TRACE("---> dirname is : %s ", dirname(strdup(pathval)));
+               SETTING_TRACE("---> basename is : %s ", basename(strdup(pathval)));
+               // @todo : MAKE SURE THE ACTUAL FILE IS THERE ON PATHVAL(SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER)
+               ss_json_ringtone_add(root, JSONFILE, pathval, pathval);
+               SETTING_TRACE("pathval is : %s -- OK", pathval);
+       } else {
+               SETTING_TRACE("pathval is duplicated : %s", pathval);
+               SETTING_TRACE("---> dirname is : %s ", dirname(strdup(pathval)));
+               SETTING_TRACE("---> basename is : %s ", basename(strdup(pathval)));
+               ret = SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
+       }
+
+       if (parser) {
+               g_object_unref(parser);
+               parser = NULL;
+       }
+
+       return ret;
+}
+
+int system_setting_del_incoming_call_ringtone(system_settings_key_e key, system_setting_data_type_e data_type, void *value)
+{
+       SETTING_TRACE_BEGIN;
+       char* pathval = (char*)value;
+#ifdef USE_JSONFILE
+       // NOT IN USE
+       JsonParser* parser = ss_json_ringtone_open_file(JSONFILE);
+#else
+       JsonParser* parser = ss_json_ringtone_load_from_data();
+#endif
+       JsonNode *root = json_parser_get_root(parser);
+
+       ss_json_ringtone_remove(root, JSONFILE, pathval);
+       //void ss_json_ringtone_remove(JsonNode *root,  char* filename, char* path_to_del)
+
+       ss_json_ringtone_print(root);
+       if (parser) {
+               g_object_unref(parser);
+               parser = NULL;
+       }
+
+       return SYSTEM_SETTINGS_ERROR_NONE;
+}
+
+
+static int _compare_cb(const void *d1, const void *d2)
+{
+       fileNodeInfo *pNode1 = (fileNodeInfo *)d1;
+       fileNodeInfo *pNode2 = (fileNodeInfo *)d2;
+
+       return strcmp(pNode1->media_name, pNode2->media_name);
+}
+
+/*
+ * get the RINGTONE list
+ */
+static void _get_default_ringtones(system_settings_key_e key, system_setting_data_type_e data_type,  system_settings_iter_cb callback, void *data)
+{
+       SETTING_TRACE_BEGIN;
+       /*Get file list */
+       Eina_List *filelist = NULL;
+       Eina_List *l = NULL;
+       fileNodeInfo *node = NULL;
+       int idx = 0;
+
+       //-----------------------------------------------------------------------------------------------------------------
+       // 1. get the default ringtone list
+       //-----------------------------------------------------------------------------------------------------------------
+       int ret = get_filelist_from_dir_path(DEF_RINGTONE_FILE_PATH, &filelist);
+       if (ret != 0) {
+               SETTING_TRACE("Failed to get filelist, ret = %d %s", ret, DEF_RINGTONE_FILE_PATH);
+       }
+       filelist = eina_list_sort(filelist, eina_list_count(filelist), _compare_cb);
+
+       EINA_LIST_FOREACH(filelist, l, node)
+       {
+               SETTING_TRACE("file path = (%d) : name:%s path:%s [%s]", ret, node->name, node->path, node->media_name);
+               // @todo assert NULL check
+               if (callback) {
+                       char temp[1024];
+                       snprintf(temp, 1024, "%s/%s", node->path, node->name);
+                       char* path = strdup(temp);
+                       bool ret = callback(idx, (void *)(path), data);
+                       if (path) {
+                               free(path);
+                               path = NULL;
+                       }
+                       if (ret == false) {
+                               SETTING_TRACE("quit the iteration by return value == false : %d", ret);
+                               break;
+                       }
+
+               } else {
+                       SETTING_TRACE("--> system_setting_data_iterator is NULL");
+               }
+       }
+
+       l = NULL;
+       node = NULL;
+       EINA_LIST_FOREACH(filelist, l, node)
+       {
+               FREE(node->path);
+               FREE(node->name);
+               FREE(node->media_name);
+               FREE(node);
+       }
+       eina_list_free(filelist);
+       filelist = NULL;
+
+}
+
+static void _get_user_ringtones(system_settings_key_e key, system_setting_data_type_e data_type, system_settings_iter_cb callback, void *data)
+{
+       SETTING_TRACE_BEGIN;
+
+#ifdef USE_JSONFILE
+       // NOT IN USE
+       JsonParser* parser = ss_json_ringtone_open_file(JSONFILE);
+#else
+       JsonParser* parser = ss_json_ringtone_load_from_data();
+#endif
+
+       JsonNode *root = json_parser_get_root(parser);
+       int size = json_array_get_length(json_node_get_array(root));
+
+       int i = 0;
+       for (i = 0; i < size ; i++) {
+               JsonObject *ringtone = json_array_get_object_element(json_node_get_array(root), i);
+               char *nameval = (char *)json_object_get_string_member(ringtone, "name");
+               char *pathval = (char *)json_object_get_string_member(ringtone, "path");
+               SETTING_TRACE("(%s) --- (%s) \n", nameval, pathval);
+               if (callback) {
+                       char* path = strdup(pathval);
+                       bool ret = callback(i, (void *)(path), data);
+                       if (ret == false) {
+                               SETTING_TRACE("quit the iteration by return value == false : %d", ret);
+                               break;
+                       }
+               } else {
+                       SETTING_TRACE("--> callback is NULL");
+               }
+       }
+}
+
+int system_setting_list_incoming_call_ringtone(system_settings_key_e key, system_setting_data_type_e data_type, system_settings_iter_cb callback, void *data)
+{
+       SETTING_TRACE_BEGIN;
+
+       _get_default_ringtones(key, data_type, callback, data);
+       //-----------------------------------------------------------------------------------------------------------------
+       // 2. get the USER ringtone list
+       //-----------------------------------------------------------------------------------------------------------------
+       _get_user_ringtones(key, data_type, callback, data);
+
+       return SYSTEM_SETTINGS_ERROR_NONE;
+}
+
+
 /*  LCOV_EXCL_START */
 int system_setting_set_incoming_call_ringtone(system_settings_key_e key, system_setting_data_type_e data_type, void *value)
 {
@@ -316,7 +526,7 @@ static bool dl_is_supported_image_type_load(char *path)
        bool ret = false;
        bool (*image_type_check)(char *path);
 
-       handle = dlopen("/usr/lib/libsystem-settings-util.so.0.1.0",  RTLD_LAZY);
+       handle = dlopen(SETTING_UTILS_SO_FILE_PATH,  RTLD_LAZY);
        if (!handle) {
                SETTING_TRACE("ERROR!! canNOT find libsystem-settings-util.so.0.1.0");
                return false;
@@ -344,7 +554,7 @@ static int dl_is_available_font(char *str)
        int ret = false;
        int (*check_available_font)(char *font_name);
 
-       handle = dlopen("/usr/lib/libsystem-settings-util.so.0.1.0",  RTLD_LAZY);
+       handle = dlopen(SETTING_UTILS_SO_FILE_PATH,  RTLD_LAZY);
        if (!handle) {
                SETTING_TRACE("ERROR!! canNOT find libsystem-settings-util.so.0.1.0");
                return false;
@@ -371,7 +581,7 @@ static void dl_font_size_set()
        char *error;
        void (*set_font_size)();
 
-       handle = dlopen("/usr/lib/libsystem-settings-util.so.0.1.0",  RTLD_LAZY);
+       handle = dlopen(SETTING_UTILS_SO_FILE_PATH,  RTLD_LAZY);
        if (!handle) {
                SETTING_TRACE("ERROR!! canNOT find libsystem-settings-util.so.0.1.0");
                return;
@@ -398,7 +608,7 @@ static void dl_font_config_set_notification()
        char *error;
        void (*set_font_nodification)();
 
-       handle = dlopen("/usr/lib/libsystem-settings-util.so.0.1.0",  RTLD_LAZY);
+       handle = dlopen(SETTING_UTILS_SO_FILE_PATH,  RTLD_LAZY);
        if (!handle) {
                SETTING_TRACE("ERROR!! canNOT find libsystem-settings-util.so.0.1.0");
                return;
@@ -426,7 +636,7 @@ static bool dl_font_config_set(char *font_name)
        bool ret = false;
        bool (*check_font_type)(char *font_name);
 
-       handle = dlopen("/usr/lib/libsystem-settings-util.so.0.1.0",  RTLD_LAZY);
+       handle = dlopen(SETTING_UTILS_SO_FILE_PATH,  RTLD_LAZY);
        if (!handle) {
                SETTING_TRACE("ERROR!! canNOT find libsystem-settings-util.so.0.1.0");
                return false;
@@ -454,7 +664,7 @@ static char *dl_get_font_info(char *str)
        char *ret = NULL;
        char *(*get_font_info)();
 
-       handle = dlopen("/usr/lib/libsystem-settings-util.so.0.1.0",  RTLD_LAZY);
+       handle = dlopen(SETTING_UTILS_SO_FILE_PATH,  RTLD_LAZY);
        if (!handle) {
                SETTING_TRACE("ERROR!! canNOT find libsystem-settings-util.so.0.1.0");
                return false;
@@ -765,7 +975,7 @@ int system_setting_set_font_size(system_settings_key_e key, system_setting_data_
 {
        SETTING_TRACE_BEGIN;
        int *vconf_value;
-       vconf_value = (int *)value;
+       vconf_value = *(int **)value;
 
        if (*vconf_value < 0 || *vconf_value > SYSTEM_SETTINGS_FONT_SIZE_GIANT) {
                return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
@@ -1403,8 +1613,9 @@ int system_setting_get_time_changed(system_settings_key_e key, system_setting_da
 {
        SETTING_TRACE_BEGIN;
        time_t cur_tick;
+       int ** val = (int**)value;
        cur_tick = time(NULL);
-       *value = (void *)cur_tick;
+       **val = cur_tick;
        /* struct tm * localtime = time (cur_tick); */
        /* printf("%s\n", ctime(&cur_tick); */
        return SYSTEM_SETTINGS_ERROR_NONE;
@@ -1620,11 +1831,12 @@ int system_setting_get_screen_backlight_time(system_settings_key_e key, system_s
 {
        SETTING_TRACE_BEGIN;
        int vconf_value;
+       int ** val = (int**)value;
 
        if (system_setting_vconf_get_value_int(VCONFKEY_SETAPPL_LCD_TIMEOUT_NORMAL, &vconf_value)) {
                return SYSTEM_SETTINGS_ERROR_IO_ERROR;
        }
-       *value = (void *)vconf_value;
+       **val = vconf_value;
 
        return SYSTEM_SETTINGS_ERROR_NONE;
 }
@@ -1635,9 +1847,9 @@ int system_setting_set_screen_backlight_time(system_settings_key_e key, system_s
 {
        SETTING_TRACE_BEGIN;
        int *vconf_value;
-       vconf_value = (int *)value;
+       vconf_value = *(int **)value;
 
-       if (!(*vconf_value > 0 && *vconf_value < 600)) {
+       if (!(*vconf_value > 0 && *vconf_value <= 600)) {
                SETTING_TRACE(" ERR Betweeny here  0 ~ 600");
                return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
        }
@@ -1653,7 +1865,7 @@ int system_setting_set_screen_backlight_time(system_settings_key_e key, system_s
 int system_setting_set_changed_callback_screen_backlight_time(system_settings_key_e key, system_settings_changed_cb callback, void *user_data)
 {
        SETTING_TRACE_BEGIN;
-       return system_setting_vconf_set_changed_cb(VCONFKEY_SETAPPL_LCD_TIMEOUT_NORMAL, SYSTEM_SETTINGS_KEY_DISPLAY_SCREEN_ROTATION_AUTO, 2, user_data);
+       return system_setting_vconf_set_changed_cb(VCONFKEY_SETAPPL_LCD_TIMEOUT_NORMAL, SYSTEM_SETTINGS_KEY_SCREEN_BACKLIGHT_TIME, 2, user_data);
 }
 
 int system_setting_unset_changed_callback_screen_backlight_time(system_settings_key_e key)
@@ -1683,10 +1895,13 @@ int system_setting_set_sound_notification(system_settings_key_e key, system_sett
 
        int is_load = _is_file_accessible(vconf_value);
        if (is_load == 0) {
+               //SETTING_TRACE(" system_setting_vconf_set_value_string(VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR, %s) TRY", vconf_value);
                if (system_setting_vconf_set_value_string(VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR, vconf_value)) {
+                       //SETTING_TRACE(" system_setting_vconf_set_value_string(VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR, %s) FAIL", vconf_value);
                        return SYSTEM_SETTINGS_ERROR_IO_ERROR;
                }
        } else {
+               //SETTING_TRACE(" is_file_accessibile FAILED - system_setting_vconf_set_value_string(VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR, %s) FAIL", vconf_value);
                return SYSTEM_SETTINGS_ERROR_IO_ERROR;
        }
 
@@ -1697,7 +1912,7 @@ int system_setting_set_sound_notification(system_settings_key_e key, system_sett
 int system_setting_set_changed_callback_sound_notification(system_settings_key_e key, system_settings_changed_cb callback, void *user_data)
 {
        SETTING_TRACE_BEGIN;
-       return system_setting_vconf_set_changed_cb(VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR, SYSTEM_SETTINGS_KEY_INCOMING_CALL_RINGTONE, 0, user_data);
+       return system_setting_vconf_set_changed_cb(VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR, SYSTEM_SETTINGS_KEY_SOUND_NOTIFICATION, 0, user_data);
 }
 
 int system_setting_unset_changed_callback_sound_notification(system_settings_key_e key)
@@ -1709,12 +1924,13 @@ int system_setting_unset_changed_callback_sound_notification(system_settings_key
 int system_setting_get_notification_repetition_period(system_settings_key_e key, system_setting_data_type_e data_type, void **value)
 {
        SETTING_TRACE_BEGIN;
+       int ** val = (int**)value;
        int vconf_value;
 
        if (system_setting_vconf_get_value_int(VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT, &vconf_value)) {
                return SYSTEM_SETTINGS_ERROR_IO_ERROR;
        }
-       *value = (void *)vconf_value;
+       **val = vconf_value;
 
        return SYSTEM_SETTINGS_ERROR_NONE;
 }
@@ -1724,7 +1940,7 @@ int system_setting_set_notification_repetition_period(system_settings_key_e key,
 {
        SETTING_TRACE_BEGIN;
        int *vconf_value;
-       vconf_value = (int *)value;
+       vconf_value = *(int **)value;
 
        if (system_setting_vconf_set_value_int(VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT, *vconf_value)) {
                return SYSTEM_SETTINGS_ERROR_IO_ERROR;
@@ -1840,11 +2056,12 @@ int system_setting_unset_changed_callback_network_wifi_notification(system_setti
 int system_setting_get_lock_state(system_settings_key_e key, system_setting_data_type_e data_type, void **value)
 {
        int vconf_value;
+       int ** val = (int**)value;
 
        if (system_setting_vconf_get_value_int(VCONFKEY_IDLE_LOCK_STATE_READ_ONLY, &vconf_value)) {
                return SYSTEM_SETTINGS_ERROR_IO_ERROR;
        }
-       *value = (void *)vconf_value;
+       **val = vconf_value;
 
        return SYSTEM_SETTINGS_ERROR_NONE;
 }
@@ -1855,7 +2072,7 @@ int system_setting_set_lock_state(system_settings_key_e key, system_setting_data
 {
        SETTING_TRACE_BEGIN;
        int *vconf_value;
-       vconf_value = (int *)value;
+       vconf_value = *(int **)value;
 
        if (system_setting_vconf_set_value_int(VCONFKEY_IDLE_LOCK_STATE_READ_ONLY, *vconf_value)) {
                return SYSTEM_SETTINGS_ERROR_IO_ERROR;