Merge "Modified src about get/set func for 64bit-arch." into tizen
[platform/core/api/system-settings.git] / src / system_setting_platform.c
index 4f60c56..8389847 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_TIME_SHARE_LOCAL_PATH  "/usr/share/locale"
 #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
@@ -232,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;
@@ -251,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 */
 
 
 /*////////////////////////////////////////////////////////////////////////////////////////////////// */
@@ -270,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)
 {