+
+
+/*////////////////////////////////////////////////////////////////////////////////////////////////// */
+// @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;
+}
+
+