Add include stdlib.h for free()
[platform/core/api/system-settings.git] / src / sst_json.c
index 24ccd65..d4cdf46 100644 (file)
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#include <vconf.h>
+#include "sst_json.h"
 
+#include <json-glib/json-glib.h>
+#include <vconf.h>
 #include "sst.h"
-#include "sst_core.h"
-#include "sst_json.h"
 
-static void ss_json_ringtone_save(JsonNode *root)
+struct sst_json_s {
+       JsonParser *parser;
+       JsonNode *root;
+};
+
+static void _json_save_ringtone(JsonNode *root)
 {
-       // write here
        JsonGenerator *generator = json_generator_new();
        json_generator_set_root(generator, root);
-       json_generator_set_pretty(generator, TRUE);
-#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
+       gchar *data = json_generator_to_data(generator, NULL);
+       DBG("ringtone json : %s", data);
+
+       const char *key = VCONFKEY_SETAPPL_CALL_RINGTONE_USER_LIST;
+       if (vconf_set_str(key, data))
+               ERR("vconf_set_str(%s) Fail", key);
+       g_free(data);
        g_object_unref(generator);
 }
 
-JsonParser* ss_json_ringtone_open_file(char *path)
+sst_json_h* sst_json_load_ringtone()
 {
-       JsonParser *parser;
-       //JsonNode *root;
-       GError *error;
-
-       parser = json_parser_new();
+       GError *error = NULL;
+       sst_json_h *handle = calloc(1, sizeof(struct sst_json_s));
+       if (NULL == handle) {
+               ERR("calloc() Fail");
+               return NULL;
+       }
+       char *load_data = vconf_get_str(VCONFKEY_SETAPPL_CALL_RINGTONE_USER_LIST);
 
-       error = NULL;
-       json_parser_load_from_file(parser, path, &error);
+       handle->parser = json_parser_new();
+       json_parser_load_from_data(handle->parser, load_data, -1, &error);
+       free(load_data);
        if (error) {
-               SST_SECURE_TRACE("Unable to parse `%s': %s\n", path, error->message);
+               ERR("json_parser_load_from_data() Fail(%s)", error->message);
                g_error_free(error);
-               g_object_unref(parser);
+               g_object_unref(handle->parser);
+               free(handle);
                return NULL;
        }
+       handle->root = json_parser_get_root(handle->parser);
 
-       return parser;
+       return handle;
 }
 
-JsonParser* ss_json_ringtone_load_from_data()
+void sst_json_unref(sst_json_h *handle)
 {
-       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) {
-               SST_SECURE_TRACE("Unable to load data : %s \n", error->message);
-               g_error_free(error);
-               g_object_unref(parser);
-               return NULL;
-       }
-       return parser;
+       g_object_unref(handle->parser);
+       free(handle);
 }
 
-void ss_json_ringtone_add(JsonNode *root, char *filename, char *nameval, char *pathval)
+void sst_json_add_ringtone(sst_json_h *handle, const char *nameval, const char *pathval)
 {
+       JsonNode *root = handle->root;
        JsonNode *menu_item = json_node_new(JSON_NODE_OBJECT);
        JsonObject *object = json_object_new();
        json_node_take_object(menu_item, object);
@@ -86,83 +81,73 @@ void ss_json_ringtone_add(JsonNode *root, char *filename, char *nameval, char *p
        JsonArray *menu = json_node_get_array(root);
        json_array_add_element(menu, menu_item);
 
-       ss_json_ringtone_save(root);
+       _json_save_ringtone(root);
 }
 
-void ss_json_ringtone_print(JsonNode *root)
+void sst_json_get_ringtones(sst_json_h *handle, system_settings_iter_cb cb, void *user_data)
 {
-       JsonNode *node = root;
+       int i;
 
-       JsonGenerator *generator = json_generator_new();
-       json_generator_set_root(generator, node);
-       json_generator_set_pretty(generator, TRUE);
-       gchar *data = json_generator_to_data(generator, NULL);
-       //SETTING_TRACE("%s", (char * )data);
-       SST_SECURE_TRACE("-------------------------------------------------------\n");
-       SST_SECURE_TRACE("%s", data);
-       SST_SECURE_TRACE("-------------------------------------------------------\n");
+       RET_IF(NULL == cb);
+       RET_IF(NULL == handle);
 
-       SST_SECURE_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);
+       JsonArray *ringtone_list = json_node_get_array(handle->root);
+       int size = json_array_get_length(ringtone_list);
+       for (i = 0; i < size; i++) {
+               JsonObject *ringtone = json_array_get_object_element(ringtone_list, i);
+               //const char *name = json_object_get_string_member(ringtone, "name");
+               const char *path = json_object_get_string_member(ringtone, "path");
+               if (NULL == path)
+                       continue;
+
+               if (false == cb(i, path, user_data)) {
+                       ERR("callback return false");
+                       break;
+               }
+       }
 }
 
-void ss_json_ringtone_remove(JsonNode *root, char *filename, char *path_to_del)
+void sst_json_remove_ringtone(sst_json_h *handle, const char *path_to_del)
 {
-       int size = json_array_get_length(json_node_get_array(root));
+       int i;
 
-       SST_SECURE_TRACE("BBB size : (%d) \n", size);
-       int i = 0;
+       RET_IF(NULL == handle);
+       RET_IF(NULL == path_to_del);
+
+       JsonNode *root = handle->root;
+       int size = json_array_get_length(json_node_get_array(root));
+       DBG("size(%d)", size);
        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)) {
+               if (pathval && SST_EQUAL == strcmp(pathval, path_to_del)) {
                        json_array_remove_element(json_node_get_array(root), i);
-                       SST_SECURE_TRACE("remove BBB : (%s) --- (%s) \n", pathval, path_to_del);
+                       DBG("removed(%s)", pathval);
                }
        }
 
-       ss_json_ringtone_save(root);
+       _json_save_ringtone(root);
 }
 
-bool ss_json_ringtone_contain(JsonNode *root, char *newfile)
+bool sst_json_contain_ringtone(sst_json_h *handle, const char *ringtone_path)
 {
-       int size = json_array_get_length(json_node_get_array(root));
+       int i;
 
-       bool ret = false;
+       RETV_IF(NULL == handle, false);
+       RETV_IF(NULL == ringtone_path, false);
 
-       int i = 0;
+       JsonNode *root = handle->root;
+       int size = json_array_get_length(json_node_get_array(root));
        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;
-               }
+               if (pathval && SST_EQUAL == strcmp(pathval, ringtone_path))
+                       return true;
        }
 
-       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");
-               SST_SECURE_TRACE("(%s) --- (%s) \n", name, path);
-       }
+       return false;
 }