From 033959ea298b08fa3e7c5615a3caa2799bd34a9b Mon Sep 17 00:00:00 2001 From: MyoungJune Park Date: Mon, 4 Jul 2016 13:26:52 +0900 Subject: [PATCH] Add Ringtone List API - 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 --- CMakeLists.txt | 35 +++- include/system_settings.h | 62 +++++++- include/system_settings_json.h | 54 +++++++ include/system_settings_private.h | 29 +++- include/system_settings_ringtones.h | 25 +++ packaging/capi-system-system-settings.spec | 8 + src/system_setting_platform.c | 212 ++++++++++++++++++++++++- src/system_settings.c | 247 +++++++++++++++++++++++++++++ src/system_settings_json.c | 162 +++++++++++++++++++ src/system_settings_ringtones.c | 135 ++++++++++++++++ 10 files changed, 960 insertions(+), 9 deletions(-) create mode 100644 include/system_settings_json.h create mode 100644 include/system_settings_ringtones.h create mode 100644 src/system_settings_json.c create mode 100644 src/system_settings_ringtones.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 7aa94cf..cff12d1 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) + diff --git a/include/system_settings.h b/include/system_settings.h index 4fee4a2..634b34e 100644 --- a/include/system_settings.h +++ b/include/system_settings.h @@ -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 index 0000000..a95227f --- /dev/null +++ b/include/system_settings_json.h @@ -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 +#include +#include +#include + +//#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__ */ + + + diff --git a/include/system_settings_private.h b/include/system_settings_private.h index 1972e91..e7765e3 100644 --- a/include/system_settings_private.h +++ b/include/system_settings_private.h @@ -24,6 +24,7 @@ extern "C" #endif #include +#include #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 index 0000000..6a22aca --- /dev/null +++ b/include/system_settings_ringtones.h @@ -0,0 +1,25 @@ +#ifndef __SYSTEM_SETTINGS_RINGTONES_H__ +#define __SYSTEM_SETTINGS_RINGTONES_H__ + +#include +#include +#include +#include + +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__ */ diff --git a/packaging/capi-system-system-settings.spec b/packaging/capi-system-system-settings.spec index 3de6801..af04e4f 100755 --- a/packaging/capi-system-system-settings.spec +++ b/packaging/capi-system-system-settings.spec @@ -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 diff --git a/src/system_setting_platform.c b/src/system_setting_platform.c index dec5e84..4219bbb 100644 --- a/src/system_setting_platform.c +++ b/src/system_setting_platform.c @@ -25,6 +25,7 @@ #include #include #include +#include #include @@ -37,19 +38,23 @@ #include -#include - #include #include #include +#include +#include + #include +#include #ifdef USE_EFL_ASSIST #include #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" @@ -58,6 +63,15 @@ #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) { diff --git a/src/system_settings.c b/src/system_settings.c index 4130032..b917542 100644 --- a/src/system_settings.c +++ b/src/system_settings.c @@ -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 index 0000000..4ed88a5 --- /dev/null +++ b/src/system_settings_json.c @@ -0,0 +1,162 @@ + +#include +#include +#include + +#include + +//#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 index 0000000..dc3693c --- /dev/null +++ b/src/system_settings_ringtones.c @@ -0,0 +1,135 @@ +/* + * system_settings_ringtones.c + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. + * + * Contact: MyoungJune Park + * + * 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 +#include +#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; +} + -- 2.7.4