Add Ringtone List API 77/100177/1 accepted/tizen/3.0/common/20161128.091448 accepted/tizen/3.0/ivi/20161128.083907 accepted/tizen/3.0/mobile/20161128.083709 accepted/tizen/3.0/tv/20161128.083747 accepted/tizen/3.0/wearable/20161128.083829 submit/tizen_3.0/20161125.080555
authorMyoungJune Park <mj2004.park@samsung.com>
Mon, 4 Jul 2016 04:26:52 +0000 (13:26 +0900)
committerMyoungJune Park <mj2004.park@samsung.com>
Fri, 25 Nov 2016 08:03:30 +0000 (17:03 +0900)
- add typedef system_settings_iterator and comments
- list -> rename 'list' 'foreach' and change the callback prototype by
  'bool'
- add
- del
- get path with app f/w
- add json files for ringtone manipulation
- add json on vconf
  - add code checkding duplicated input for ADD
- add doxygen comments

Change-Id: Iaf5a2faef1f1b04f896f26c9cbcd77399fb0b292
Signed-off-by: MyoungJune Park <mj2004.park@samsung.com>
CMakeLists.txt
include/system_settings.h
include/system_settings_json.h [new file with mode: 0644]
include/system_settings_private.h
include/system_settings_ringtones.h [new file with mode: 0644]
packaging/capi-system-system-settings.spec
src/system_setting_platform.c
src/system_settings.c
src/system_settings_json.c [new file with mode: 0644]
src/system_settings_ringtones.c [new file with mode: 0644]

index 7aa94cf..cff12d1 100755 (executable)
@@ -14,7 +14,7 @@ SET(LIBDIR "${CMAKE_LIBDIR}")
 SET(INC_DIR include)
 INCLUDE_DIRECTORIES(${INC_DIR})
 
-SET(requires "dlog vconf fontconfig libxml-2.0 pkgmgr pkgmgr-info alarm-service uuid")
+SET(requires "dlog vconf fontconfig libxml-2.0 pkgmgr pkgmgr-info alarm-service capi-media-metadata-extractor eina elementary aul json-glib-1.0")
 SET(pc_requires "capi-base-common")
 
 
@@ -31,8 +31,8 @@ FOREACH(flag ${${fw_name}_CFLAGS})
     SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
 ENDFOREACH(flag)
 
-#SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall -Werror")
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC")
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall -Werror-implicit-function-declaration")
+#SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC")
 SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
 
 IF("${ARCH}" STREQUAL "arm")
@@ -64,11 +64,37 @@ SET_TARGET_PROPERTIES(${fw_name}
      CLEAN_DIRECT_OUTPUT 1
 )
 
+# Test application - TC
+#ADD_EXECUTABLE(test TC/test.c)
+#TARGET_LINK_LIBRARIES(test ${fw_name})
+
+#SET_TARGET_PROPERTIES(test PROPERTIES OUTPUT_NAME test_system_settings)
+#INSTALL(TARGETS test DESTINATION /usr/local/bin)
+#---------------------------------------------------------------------
+
+# Test application - TC_gui
+#ADD_EXECUTABLE(test_gui TC_gui/main.c)
+#
+#INCLUDE(FindPkgConfig)
+#pkg_check_modules(test_gui REQUIRED "elementary appcore-efl ecore-imf eina ecore ecore-evas ecore-input")
+#FOREACH(flag ${test_gui_CFLAGS})
+#    SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+#ENDFOREACH(flag)
+#
+#TARGET_LINK_LIBRARIES(test_gui ${fw_name})
+#SET_TARGET_PROPERTIES(test_gui PROPERTIES OUTPUT_NAME test_system_settings_gui)
+#INSTALL(TARGETS test_gui DESTINATION /usr/local/bin)
+#---------------------------------------------------------------------
+
+
+
 INSTALL(TARGETS ${fw_name} DESTINATION ${LIBDIR})
 INSTALL(
         DIRECTORY ${INC_DIR}/ DESTINATION include/system
         FILES_MATCHING
         PATTERN "*_private.h" EXCLUDE
+        PATTERN "*_json.h" EXCLUDE
+        PATTERN "*_ringtones.h" EXCLUDE
         PATTERN "${INC_DIR}/*.h"
         )
 
@@ -84,6 +110,7 @@ CONFIGURE_FILE(
 )
 INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc DESTINATION ${LIBDIR}/pkgconfig)
 
+# INSTALL (TARGETS test DESTINATION bin)
 
 IF(UNIX)
 
@@ -109,8 +136,10 @@ ADD_CUSTOM_COMMAND(
         -name install_manifest.txt -or
         -name *.pc -or
         -name *~ \)
+        | grep -v TC | xargs rm -rf
         TARGET  distclean
         VERBATIM
 )
 
 ENDIF(UNIX)
+
index 4fee4a2..634b34e 100644 (file)
@@ -43,7 +43,7 @@ typedef enum {
        SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */
        SYSTEM_SETTINGS_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */
        SYSTEM_SETTINGS_ERROR_IO_ERROR =  TIZEN_ERROR_IO_ERROR, /**< Internal I/O error */
-       SYSTEM_SETTINGS_ERROR_PERMISSION_DENIED =  TIZEN_ERROR_PERMISSION_DENIED, /**< Permition denied */
+       SYSTEM_SETTINGS_ERROR_PERMISSION_DENIED =  TIZEN_ERROR_PERMISSION_DENIED, /**< Permission denied */
        SYSTEM_SETTINGS_ERROR_NOT_SUPPORTED =  TIZEN_ERROR_NOT_SUPPORTED, /**< Not supported @if MOBILE (Since 2.3.1) @endif */
        SYSTEM_SETTINGS_ERROR_CALL_UNSUPPORTED_API = TIZEN_ERROR_NOT_SUPPORTED, /**< Not supported @if MOBILE (Since 2.3.1) @endif */
 
@@ -256,6 +256,66 @@ int system_settings_unset_changed_cb(system_settings_key_e key);
 
 
 /**
+ * @platform
+ * @brief Called to get each string value from string typed list.
+ * @since_tizen 3.0
+ * @param[in] index zero based number indicating index of node in a list
+ * @param[in] value value returned from the list
+ * @param[in] cb_data  The user data passed from the foreach function
+ * @return @c true to continue with the next iteration of the loop, otherwise false to break out of the loop
+ */
+typedef bool (*system_settings_iter_cb)(int index, const char* value, void *cb_data);
+
+/**
+ * @platform
+ * @brief Iterate the system settings value associated with the given key as a string type.
+ * @since_tizen 3.0
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/systemsettings.admin
+ * @param[in] key The key name of the system settings
+ * @param[in] callback The callback-function name for iteration
+ * @param[in] user_data  The user data passed from caller-side
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval     #SYSTEM_SETTINGS_ERROR_NONE Successful
+ * @retval     #SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval     #SYSTEM_SETTINGS_ERROR_IO_ERROR Internal I/O error
+ * @retval     #SYSTEM_SETTINGS_ERROR_PERMISSION_DENIED Permission violation error
+ */
+int system_settings_foreach_value_string(system_settings_key_e key, system_settings_iter_cb callback, void *user_value);
+
+/**
+ * @platform
+ * @brief Adds the system settings value associated with the given key as a string type if it supports List iteration.
+ * @since_tizen 3.0
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/systemsettings.admin
+ * @param[in] key The key name of the system settings
+ * @param[in] value string typed value to be appended
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval     #SYSTEM_SETTINGS_ERROR_NONE Successful
+ * @retval     #SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval     #SYSTEM_SETTINGS_ERROR_IO_ERROR Internal I/O error
+ * @retval     #SYSTEM_SETTINGS_ERROR_PERMISSION_DENIED Permission violation error
+ */
+int system_settings_add_value_string(system_settings_key_e key, const char *value);
+
+/**
+ * @platform
+ * @brief Delete the system settings value associated with the given key as an string type if it supports List iteration.
+ * @since_tizen 3.0
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/systemsettings.admin
+ * @param[in] key The key name of the system settings
+ * @param[in] value string typed value to be removed
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval     #SYSTEM_SETTINGS_ERROR_NONE Successful
+ * @retval     #SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval     #SYSTEM_SETTINGS_ERROR_IO_ERROR Internal I/O error
+ * @retval     #SYSTEM_SETTINGS_ERROR_PERMISSION_DENIED Permission violation error
+ */
+int system_settings_delete_value_string(system_settings_key_e key, const char *value);
+
+/**
  * @}
  */
 
diff --git a/include/system_settings_json.h b/include/system_settings_json.h
new file mode 100644 (file)
index 0000000..a95227f
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __TIZEN_SYSTEM_SETTING_JSON_H__
+#define __TIZEN_SYSTEM_SETTING_JSON_H__
+
+#include <stdlib.h>
+#include <string.h>
+#include <glib-object.h>
+#include <json-glib/json-glib.h>
+
+//#define USE_JSONFILE
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+JsonParser* ss_json_ringtone_open_file(char* path);
+JsonParser* ss_json_ringtone_load_from_data();
+
+void ss_json_ringtone_add(JsonNode *root, char* filename, char* nameval, char* pathval);
+
+void ss_json_ringtone_print(JsonNode *root);
+
+void ss_json_ringtone_remove(JsonNode *root,  char* filename, char* path_to_del);
+
+bool ss_json_ringtone_contain(JsonNode *root, char* newfile);
+
+void ss_json_ringtone_list(JsonNode *root);
+
+/*// */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TIZEN_SYSTEM_SETTING_JSON_H__ */
+
+
+
index 1972e91..e7765e3 100644 (file)
@@ -24,6 +24,7 @@ extern "C"
 #endif
 
 #include <dlog.h>
+#include <system_settings.h>
 
 #ifdef LOG_TAG
 #undef LOG_TAG
@@ -101,6 +102,10 @@ typedef int (*system_setting_get_value_cb)(system_settings_key_e key, system_set
  */
 typedef int (*system_setting_set_value_cb)(system_settings_key_e key, system_setting_data_type_e data_type, void *value);
 
+typedef int (*system_setting_add_value_cb)(system_settings_key_e key, system_setting_data_type_e data_type, void *value);
+typedef int (*system_setting_del_value_cb)(system_settings_key_e key, system_setting_data_type_e data_type, void *value);
+typedef int (*system_setting_list_value_cb)(system_settings_key_e key, system_setting_data_type_e data_type, system_settings_iter_cb callback, void *user_data);
+
 /**
  * @internal
  * @since_tizen 2.3
@@ -140,8 +145,12 @@ typedef struct {
 
        system_setting_set_changed_callback_cb set_changed_cb;                  /**< function pointer to register for notification callback */
        system_setting_unset_changed_callback_cb unset_changed_cb ;             /**< function pointer to un-register for notification callback */
-
        system_settings_changed_cb changed_cb;                                                  /* registered by user application */
+
+       system_setting_add_value_cb add_value_cb;
+       system_setting_del_value_cb del_value_cb;
+       system_setting_list_value_cb list_value_cb;
+
        void *user_data;                                                                                                /* user_data */
 
 } system_setting_s;
@@ -333,6 +342,24 @@ int system_setting_get_incoming_call_ringtone(system_settings_key_e key, system_
  */
 int system_setting_set_incoming_call_ringtone(system_settings_key_e key, system_setting_data_type_e data_type, void *value);
 
+
+/**
+ * @todo add comment here
+ */
+int system_setting_add_incoming_call_ringtone(system_settings_key_e key, system_setting_data_type_e data_type, void *value);
+
+
+/**
+ * @todo add comment here
+ */
+int system_setting_del_incoming_call_ringtone(system_settings_key_e key, system_setting_data_type_e data_type, void *value);
+
+
+/**
+ * @todo add comment here
+ */
+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);
+
 /**
  * @internal
  * @since_tizen 2.3
diff --git a/include/system_settings_ringtones.h b/include/system_settings_ringtones.h
new file mode 100644 (file)
index 0000000..6a22aca
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef __SYSTEM_SETTINGS_RINGTONES_H__
+#define __SYSTEM_SETTINGS_RINGTONES_H__
+
+#include <sys/types.h>
+#include <dirent.h>
+#include <metadata_extractor.h>
+#include <Elementary.h>
+
+typedef struct _ugFsNodeInfo fileNodeInfo;
+struct _ugFsNodeInfo {
+       char *path;
+       char *name;
+       char *media_name;
+};
+
+int get_filelist_from_dir_path(char *path, Eina_List **file_list);
+char *get_filename_from_fullname(const char *fullname);
+inline char *strlower(char *str);
+
+#if 0
+void ringtone_play_sound(const char *sound_file, player_h **mp_handle);
+void ringtone_stop_sound(void *data);
+#endif
+
+#endif /* __SYSTEM_SETTINGS_RINGTONES_H__ */
index 3de6801..af04e4f 100755 (executable)
@@ -10,6 +10,8 @@ BuildRequires:  pkgconfig(dlog)
 BuildRequires:  pkgconfig(vconf)
 BuildRequires:  pkgconfig(elementary)
 BuildRequires:  pkgconfig(ecore)
+BuildRequires:  pkgconfig(eina)
+BuildRequires:  pkgconfig(aul)
 BuildRequires:  pkgconfig(fontconfig)
 BuildRequires:  pkgconfig(libxml-2.0)
 BuildRequires:  pkgconfig(pkgmgr)
@@ -17,6 +19,12 @@ BuildRequires:  pkgconfig(pkgmgr-info)
 BuildRequires:  pkgconfig(libtzplatform-config)
 BuildRequires:  pkgconfig(alarm-service)
 BuildRequires:  pkgconfig(uuid)
+BuildRequires:  pkgconfig(capi-media-metadata-extractor)
+
+BuildRequires:  pkgconfig(json-glib-1.0)
+BuildRequires:  pkgconfig(glib-2.0)
+
+
 
 Requires(post): /sbin/ldconfig  
 Requires(postun): /sbin/ldconfig
index dec5e84..4219bbb 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)
+
+
 int _is_file_accessible(const char *path);
 
 static bool dl_is_supported_image_type_load(char *path);
@@ -226,7 +240,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 +258,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 +276,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)
 {
index 4130032..b917542 100644 (file)
@@ -47,6 +47,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_incoming_call_ringtone,
                system_setting_unset_changed_callback_incoming_call_ringtone,
                NULL,
+               system_setting_add_incoming_call_ringtone,      /* ADD */
+               system_setting_del_incoming_call_ringtone,      /* DEL */
+               system_setting_list_incoming_call_ringtone,     /* LIST */
                NULL            /* user data */
        },
 
@@ -58,6 +61,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_wallpaper_home_screen,
                system_setting_unset_changed_callback_wallpaper_home_screen,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
 
@@ -69,6 +75,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_wallpaper_lock_screen,
                system_setting_unset_changed_callback_wallpaper_lock_screen,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
 
@@ -80,6 +89,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_font_size,
                system_setting_unset_changed_callback_font_size,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
 
@@ -91,6 +103,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_font_type,
                system_setting_unset_changed_callback_font_type,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
 
@@ -102,6 +117,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_motion_activation,
                system_setting_unset_changed_callback_motion_activation,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
 
@@ -113,6 +131,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_email_alert_ringtone,
                system_setting_unset_changed_callback_email_alert_ringtone,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -123,6 +144,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_usb_debugging_option,
                system_setting_unset_changed_callback_usb_debugging_option,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -133,6 +157,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_3g_data_network,
                system_setting_unset_changed_callback_3g_data_network,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -143,6 +170,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_lockscreen_app,
                system_setting_unset_changed_callback_lockscreen_app,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -153,6 +183,9 @@ system_setting_s system_setting_table[] = {
                NULL,
                NULL,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -163,6 +196,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_locale_country,
                system_setting_unset_changed_callback_locale_country,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -173,6 +209,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_locale_language,
                system_setting_unset_changed_callback_locale_language,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -183,6 +222,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_locale_timeformat_24hour,
                system_setting_unset_changed_callback_locale_timeformat_24hour,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -193,6 +235,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_locale_timezone,
                system_setting_unset_changed_callback_locale_timezone,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -203,6 +248,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_time_changed,
                system_setting_unset_changed_callback_time_changed,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -213,6 +261,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_sound_lock,
                system_setting_unset_changed_callback_sound_lock,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -223,6 +274,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_sound_silent_mode,
                system_setting_unset_changed_callback_sound_silent_mode,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -233,6 +287,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_sound_touch,
                system_setting_unset_changed_callback_sound_touch,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -243,6 +300,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_auto_rotation_mode,
                system_setting_unset_changed_callback_auto_rotation_mode,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -253,6 +313,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_screen_backlight_time,
                system_setting_unset_changed_callback_screen_backlight_time,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -263,6 +326,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_sound_notification,
                system_setting_unset_changed_callback_sound_notification,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -273,6 +339,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_notification_repetition_period,
                system_setting_unset_changed_callback_notification_repetition_period,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -283,6 +352,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_device_name,
                system_setting_unset_changed_callback_device_name,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -293,6 +365,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_motion_activation,
                system_setting_unset_changed_callback_motion_activation,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -303,6 +378,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_network_flight_mode,
                system_setting_unset_changed_callback_network_flight_mode,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -313,6 +391,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_network_wifi_notification,
                system_setting_unset_changed_callback_network_wifi_notification,
                NULL,
+               NULL,           /* ADD */
+               NULL,           /* DEL */
+               NULL,           /* LIST */
                NULL            /* user data */
        },
        {
@@ -323,6 +404,9 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_lock_state,
                system_setting_unset_changed_callback_lock_state,
                NULL,
+               NULL,           /* add */
+               NULL,           /* del */
+               NULL,           /* list */
                NULL            /* user data */
        },
        {
@@ -333,8 +417,12 @@ system_setting_s system_setting_table[] = {
                system_setting_set_changed_callback_ads_id,
                system_setting_unset_changed_callback_ads_id,
                NULL,
+               NULL,           /* add */
+               NULL,           /* del */
+               NULL,           /* list */
                NULL            /* user data */
        },
+
        {
                SYSTEM_SETTINGS_MAX, -1, NULL, NULL, NULL, NULL, NULL, NULL
        }
@@ -481,6 +569,122 @@ int system_settings_set_value(system_settings_key_e key, system_setting_data_typ
 }
 /*  LCOV_EXCL_STOP */
 
+
+
+int system_settings_add_value(system_settings_key_e key, system_setting_data_type_e data_type, void *value)
+{
+       LOGE("Enter [%s]", __FUNCTION__);
+       if (!(key >= 0 && SYSTEM_SETTINGS_KEY_MAX > key) || value == NULL) {
+               return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
+       }
+
+
+       system_setting_h system_setting_item;
+       system_setting_add_value_cb     system_setting_adder;
+
+       int ret = system_settings_get_item(key, &system_setting_item);
+
+       if (0 != ret) {
+               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
+               return SYSTEM_SETTINGS_ERROR_NOT_SUPPORTED;
+       }
+
+       /* type check */
+       if (system_setting_item->data_type != data_type) {
+               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid data type", __FUNCTION__, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
+               return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
+       }
+
+       system_setting_adder = system_setting_item->add_value_cb;
+
+       if (system_setting_adder == NULL) {
+               LOGE("[%s] IO_ERROR(0x%08x) : failed to call setter for the system settings", __FUNCTION__, SYSTEM_SETTINGS_ERROR_NOT_SUPPORTED);
+               return SYSTEM_SETTINGS_ERROR_NOT_SUPPORTED;
+       }
+
+       return system_setting_adder(key, system_setting_item->data_type, value);
+}
+
+
+int system_settings_del_value(system_settings_key_e key, system_setting_data_type_e data_type, void *value)
+{
+       LOGE("Enter [%s]", __FUNCTION__);
+       if (!(key >= 0 && SYSTEM_SETTINGS_KEY_MAX > key) || value == NULL) {
+               return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
+       }
+
+
+       system_setting_h system_setting_item;
+       system_setting_del_value_cb     system_setting_deler;
+
+       int ret = system_settings_get_item(key, &system_setting_item);
+
+       if (0 != ret) {
+               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
+               return SYSTEM_SETTINGS_ERROR_NOT_SUPPORTED;
+       }
+
+       /* type check */
+       if (system_setting_item->data_type != data_type) {
+               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid data type", __FUNCTION__, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
+               return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
+       }
+
+       system_setting_deler = system_setting_item->del_value_cb;
+
+       if (system_setting_deler == NULL) {
+               LOGE("[%s] IO_ERROR(0x%08x) : failed to call setter for the system settings", __FUNCTION__, SYSTEM_SETTINGS_ERROR_NOT_SUPPORTED);
+               return SYSTEM_SETTINGS_ERROR_NOT_SUPPORTED;
+       }
+
+       return system_setting_deler(key, system_setting_item->data_type, value);
+}
+
+
+
+
+
+//system_setting_list_value_cb list_changed_cb;
+int system_settings_list_value(system_settings_key_e key, system_setting_data_type_e data_type, bool (*system_setting_data_iterator)(int, void *, void *), void *value)
+{
+       LOGE("Enter [%s]", __FUNCTION__);
+       if (!(key >= 0 && SYSTEM_SETTINGS_KEY_MAX > key) || value == NULL) {
+               return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
+       }
+
+
+       system_setting_h system_setting_item;
+       system_setting_list_value_cb    system_setting_lister;
+
+       int ret = system_settings_get_item(key, &system_setting_item);
+
+       if (0 != ret) {
+               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid key", __FUNCTION__, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
+               return SYSTEM_SETTINGS_ERROR_NOT_SUPPORTED;
+       }
+
+       /* type check */
+       if (system_setting_item->data_type != data_type) {
+               LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid data type", __FUNCTION__, SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER);
+               return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
+       }
+
+       //system_setting_list_value_cb list_changed_cb;
+       system_setting_lister = system_setting_item->list_value_cb;
+
+       if (system_setting_lister == NULL) {
+               LOGE("[%s] IO_ERROR(0x%08x) : failed to call setter for the system settings", __FUNCTION__, SYSTEM_SETTINGS_ERROR_NOT_SUPPORTED);
+               return SYSTEM_SETTINGS_ERROR_NOT_SUPPORTED;
+       }
+
+       return system_setting_lister(key, system_setting_item->data_type, system_setting_data_iterator, value);
+}
+
+
+
+
+
+
 /*  LCOV_EXCL_START */
 int system_settings_set_value_int(system_settings_key_e key, int value)
 {
@@ -644,3 +848,46 @@ int system_settings_unset_changed_cb(system_settings_key_e key)
        return system_setting_unset_changed_cb(key);
 }
 
+//////////////////////////////////////////////////////////////////////////////////////////////////
+// list
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+int system_settings_foreach_value_string(system_settings_key_e key, system_settings_iter_cb callback, void *value)
+{
+       LOGE("Enter [%s]", __FUNCTION__);
+       if (!(key >= 0 && SYSTEM_SETTINGS_KEY_MAX > key)) {
+               return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
+       }
+
+       return system_settings_list_value(key, SYSTEM_SETTING_DATA_TYPE_STRING, callback, (void *)value);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+// add
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+int system_settings_add_value_string(system_settings_key_e key, const char* value)
+{
+       LOGE("Enter [%s]", __FUNCTION__);
+       if (!(key >= 0 && SYSTEM_SETTINGS_KEY_MAX > key)) {
+               return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
+       }
+
+       return system_settings_add_value(key, SYSTEM_SETTING_DATA_TYPE_STRING, (void *)value);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+// del
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+int system_settings_delete_value_string(system_settings_key_e key, const char* value)
+{
+       LOGE("Enter [%s]", __FUNCTION__);
+       if (!(key >= 0 && SYSTEM_SETTINGS_KEY_MAX > key)) {
+               return SYSTEM_SETTINGS_ERROR_INVALID_PARAMETER;
+       }
+
+       return system_settings_del_value(key, SYSTEM_SETTING_DATA_TYPE_STRING, (void *)value);
+}
+
+
diff --git a/src/system_settings_json.c b/src/system_settings_json.c
new file mode 100644 (file)
index 0000000..4ed88a5
--- /dev/null
@@ -0,0 +1,162 @@
+
+#include <system_settings.h>
+#include <system_settings_private.h>
+#include <system_settings_json.h>
+
+#include <vconf.h>
+
+//#define VCONFKEY_SETAPPL_CALL_RINGTONE_USER_LIST
+
+static void ss_json_ringtone_save(JsonNode *root)
+{
+       // write here
+       JsonGenerator *generator = json_generator_new();
+       json_generator_set_root(generator, root);
+       g_object_set(generator, "pretty", TRUE, NULL);
+#ifdef USE_JSONFILE
+       GError *error = NULL;
+       gboolean ret = json_generator_to_file(generator, filename, &error);
+#else
+       gchar* result = json_generator_to_data(generator, NULL);
+       vconf_set_str(VCONFKEY_SETAPPL_CALL_RINGTONE_USER_LIST, (char*)result);
+#endif
+       g_object_unref(generator);
+}
+
+
+JsonParser* ss_json_ringtone_open_file(char* path)
+{
+       JsonParser *parser;
+       //JsonNode *root;
+       GError *error;
+
+       parser = json_parser_new();
+
+       error = NULL;
+       json_parser_load_from_file(parser, path, &error);
+       if (error) {
+               SETTING_TRACE("Unable to parse `%s': %s\n", path, error->message);
+               g_error_free(error);
+               g_object_unref(parser);
+               return NULL;
+       }
+
+       return parser;
+}
+
+JsonParser* ss_json_ringtone_load_from_data()
+{
+       JsonParser *parser;
+       //JsonNode *root;
+       GError *error;
+
+       parser = json_parser_new();
+
+       error = NULL;
+       char* load_data = vconf_get_str(VCONFKEY_SETAPPL_CALL_RINGTONE_USER_LIST);
+       json_parser_load_from_data(parser, load_data, -1, &error);
+       if (error) {
+               SETTING_TRACE("Unable to load data : %s \n", error->message);
+               g_error_free(error);
+               g_object_unref(parser);
+               return NULL;
+       }
+       return parser;
+}
+
+void ss_json_ringtone_add(JsonNode *root, char* filename, char* nameval, char* pathval)
+{
+       SETTING_TRACE_BEGIN;
+
+       JsonNode* menu_item = json_node_new(JSON_NODE_OBJECT);
+       JsonObject *object = json_object_new();
+       json_node_take_object(menu_item, object);
+       json_object_set_string_member(object, "name", nameval);
+       json_object_set_string_member(object, "path", pathval);
+
+       JsonArray* menu = json_node_get_array(root);
+       json_array_add_element(menu, menu_item);
+
+       ss_json_ringtone_save(root);
+}
+
+void ss_json_ringtone_print(JsonNode *root)
+{
+       JsonNode *node = root;
+
+       JsonGenerator *generator = json_generator_new();
+       g_object_set(generator, "pretty", TRUE, NULL);
+       json_generator_set_root(generator, node);
+       gchar *data = json_generator_to_data(generator, NULL);
+       //SETTING_TRACE("%s", (char * )data);
+       SETTING_TRACE("-------------------------------------------------------\n");
+       SETTING_TRACE("%s", data);
+       SETTING_TRACE("-------------------------------------------------------\n");
+
+       SETTING_TRACE("VCONFKEY_SETAPPL_CALL_RINGTONE_USER_LIST SET !!!!\n");
+       vconf_set_str(VCONFKEY_SETAPPL_CALL_RINGTONE_USER_LIST, (char*)data);
+       g_free(data);
+       g_object_unref(generator);
+}
+
+void ss_json_ringtone_remove(JsonNode *root,  char* filename, char* path_to_del)
+{
+       int size = json_array_get_length(json_node_get_array(root));
+
+       SETTING_TRACE("BBB size : (%d) \n", size);
+       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");
+
+               if (pathval && !strcmp(pathval, path_to_del)) {
+                       json_array_remove_element(json_node_get_array(root), i);
+                       SETTING_TRACE("remove BBB : (%s) --- (%s) \n", pathval, path_to_del);
+               }
+       }
+
+       ss_json_ringtone_save(root);
+}
+
+bool ss_json_ringtone_contain(JsonNode *root, char* newfile)
+{
+       int size = json_array_get_length(json_node_get_array(root));
+
+       bool ret = false;
+
+       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", name, path);
+
+
+               if (pathval && !strcmp(pathval, newfile)) {
+                       //SETTING_TRACE("FOUND\n");
+                       ret = true;
+                       break;
+               } else {
+                       //SETTING_TRACE("*NOT* FOUND\n");
+                       ret = false;
+               }
+       }
+
+       return ret;
+}
+
+void ss_json_ringtone_list(JsonNode *root)
+{
+       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 *name = (char *)json_object_get_string_member(ringtone, "name");
+               char *path = (char *)json_object_get_string_member(ringtone, "path");
+               SETTING_TRACE("(%s) --- (%s) \n", name, path);
+       }
+}
+
+
diff --git a/src/system_settings_ringtones.c b/src/system_settings_ringtones.c
new file mode 100644 (file)
index 0000000..dc3693c
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * system_settings_ringtones.c
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Contact: MyoungJune Park <mj2004.park@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <system_settings.h>
+#include <system_settings_private.h>
+#include "system_settings_ringtones.h"
+#include "system_settings_json.h"
+
+inline char *strlower(char *str)
+{
+       if (!str) return NULL;
+       char *orig = str;
+       for (; *str != '\0'; str++)
+               *str = tolower(*str);
+       return orig;
+};
+
+/*remove ext name */
+char *get_filename_from_fullname(const char *fullname)
+{
+       //retvm_if(fullname == NULL, NULL, "fullname == NULL");
+       if (fullname == NULL) return NULL;
+
+       char tmp[512];
+       snprintf(tmp, sizeof(tmp), "%s", fullname);
+
+       char *name = strrchr(tmp, '.');
+       if (name != NULL)
+               *name = '\0';
+
+       return strdup((char*)tmp);
+}
+
+char *get_media_basename(const char *dir_path, const char *name)
+{
+       //retv_if(isEmptyStr(dir_path) || isEmptyStr(name), NULL);
+       if (dir_path == NULL) return NULL;
+
+       char path[512] = {0, };
+       snprintf(path, sizeof(path), "%s/%s", dir_path, name);
+
+       metadata_extractor_h metadata = NULL;
+       char *title = NULL;
+       int ret = metadata_extractor_create(&metadata);
+       if (ret == METADATA_EXTRACTOR_ERROR_NONE && metadata) {
+               ret = metadata_extractor_set_path(metadata, path);
+               if (ret == METADATA_EXTRACTOR_ERROR_NONE) {
+                       ret = metadata_extractor_get_metadata(
+                                       metadata, METADATA_TITLE, &title);
+                       metadata_extractor_destroy(metadata);
+                       if (title)
+                               /*return (char *)g_strdup(title);*/
+                               return (char *)title;
+                       else
+                               return strdup(name);
+               } else {
+                       metadata_extractor_destroy(metadata);
+                       return strdup(name);
+               }
+       } else {
+               return strdup(name);
+       }
+}
+
+int get_filelist_from_dir_path(char *path, Eina_List **file_list)
+{
+       SETTING_TRACE_BEGIN;
+       DIR *pDir = NULL;
+       struct dirent ent, *result;
+
+       if (path == NULL) {
+               SETTING_TRACE("dir path is null");
+               return -1;
+       }
+
+       if (file_list == NULL) {
+               SETTING_TRACE("file_list is null");
+               return -1;
+       }
+
+       pDir = opendir(path);
+
+       if (pDir == NULL)
+               return -2;
+
+       while (readdir_r(pDir, &ent, &result) == 0) {
+               if (result == NULL)
+                       break;
+
+               fileNodeInfo *pNode = NULL;
+
+               if (strncmp(ent.d_name, ".", 1) == 0
+                               || strcmp(ent.d_name, "..") == 0)
+                       continue;
+
+               if ((ent.d_type & DT_REG) == 0)
+                       continue;
+
+               pNode = (fileNodeInfo *) malloc(sizeof(fileNodeInfo));
+               if (pNode == NULL)
+                       continue;
+
+               memset(pNode, 0, sizeof(fileNodeInfo));
+
+               pNode->path = strdup(path);
+               pNode->name = strdup(ent.d_name);
+               pNode->media_name = get_media_basename(
+                               pNode->path, pNode->name);
+
+               *file_list = eina_list_append(*file_list, pNode);
+       }
+       closedir(pDir);
+       //SETTING_TRACE_END;
+
+       return 0;
+}
+