Fix build error in sticker-receiver
[platform/core/uifw/capi-ui-sticker.git] / sticker-parser / sticker-parser.c
index d5a3bd4..71b7a0d 100644 (file)
@@ -30,6 +30,7 @@
 #include <errno.h>
 #include <dirent.h>
 #include <fcntl.h>
+#include <linux/limits.h>
 
 #ifndef EXPORT_API
 #define EXPORT_API __attribute__((visibility("default")))
 #endif
 #define LOG_TAG "STICKER_PARSER"
 
-#define STICKER_DIRECTORY tzplatform_mkpath(TZ_SYS_SHARE, "sticker-data")
+#define STICKER_DIRECTORY "/opt/usr/share/sticker-data"
 #define STICKER_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_info(sticker_info_id INTEGER PRIMARY KEY AUTOINCREMENT, app_id TEXT NOT NULL, type INTEGER NOT NULL, uri TEXT NOT NULL, thumbnail TEXT, description TEXT, group_name TEXT NOT NULL, date TEXT NOT NULL, display_type INTEGER)"
 #define STICKER_KEYWORD_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_keyword_info(keyword_id INTEGER PRIMARY KEY AUTOINCREMENT, sticker_info_id INTEGER, keyword TEXT NOT NULL, FOREIGN KEY (sticker_info_id) REFERENCES sticker_info(sticker_info_id) ON DELETE CASCADE)"
 #define STICKER_WHITELIST_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_whitelist_info(whitelist_id INTEGER PRIMARY KEY AUTOINCREMENT, provider_id TEXT NOT NULL, consumer_id TEXT NOT NULL)"
+#define STICKER_RECENT_HISTORY_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_recent_history_info(history_id INTEGER PRIMARY KEY AUTOINCREMENT, sticker_info_id INTEGER, count INTEGER NOT NULL, timestamp TEXT NOT NULL, FOREIGN KEY (sticker_info_id) REFERENCES sticker_info(sticker_info_id) ON DELETE CASCADE)"
 #define UIFW_ID           502
 #define APPFW_ID          301
 #define MAX_ERROR_BUFFER  256
@@ -130,6 +132,12 @@ static void __recover_db()
         goto cleanup;
     }
 
+    ret = sqlite3_exec(db, STICKER_RECENT_HISTORY_INFO_CREATE_TABLE, NULL, NULL, &err);
+    if (ret != SQLITE_OK) {
+        LOGE("Failed to create sticker_recent_history_info table : %s", err);
+        goto cleanup;
+    }
+
     is_corrupted = FALSE;
 
 cleanup:
@@ -186,6 +194,12 @@ static void __db_init()
         goto cleanup;
     }
 
+    ret = sqlite3_exec(db, STICKER_RECENT_HISTORY_INFO_CREATE_TABLE, NULL, NULL, &err);
+    if (ret != SQLITE_OK) {
+        LOGE("Failed to create sticker_recent_history_info table : %s", err);
+        goto cleanup;
+    }
+
     ret = sqlite3_exec(db, "PRAGMA journal_mode = WAL", NULL, NULL, &err);
     if (ret != SQLITE_OK) {
         LOGE("Failed to set journal_mode : %s", err);
@@ -348,21 +362,26 @@ cleanup:
     return ret;
 }
 
-static char* __convert_sticker_uri(const char *uri, const char *appid, const char *app_path)
+static char* __convert_sticker_uri(char *uri, const char *appid, const char *app_path)
 {
     int ret;
-    char *rel_path = strdup(uri);
+    char *copy_uri = (char *)calloc(PATH_MAX, sizeof(char));
+    if (copy_uri == NULL) {
+        LOGE("failed to allocate memory");
+        return NULL;
+    }
 
-    __remove_app_path(rel_path, app_path);
-    int len = strlen(STICKER_DIRECTORY) + strlen(appid) + strlen(rel_path) + 2;
+    strncpy(copy_uri, uri, PATH_MAX - 1);
+    __remove_app_path(uri, app_path);
+    int len = strlen(STICKER_DIRECTORY) + strlen(appid) + strlen(uri) + 2;
     char *new_path = (char *)calloc(len, sizeof(char));
     if (new_path == NULL) {
-        free(rel_path);
-        rel_path = NULL;
-        return NULL;
+        LOGE("failed to allocate memory");
+        ret = -1;
+        goto cleanup;
     }
 
-    snprintf(new_path, len, "%s/%s%s",STICKER_DIRECTORY, appid, rel_path);
+    snprintf(new_path, len, "%s/%s%s",STICKER_DIRECTORY, appid, uri);
 
     if (access(new_path, F_OK) == 0) {
         LOGE("sticker file already exists");
@@ -376,14 +395,14 @@ static char* __convert_sticker_uri(const char *uri, const char *appid, const cha
         goto cleanup;
     }
 
-    if (__file_copy(uri, new_path) == -1) {
+    if (__file_copy(copy_uri, new_path) == -1) {
         strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
         LOGE("failed to copy sticker file : %s", error_buffer);
         ret = -1;
         goto cleanup;
     }
 
-    ret = unlink(uri);
+    ret = unlink(copy_uri);
     if (ret != 0) {
         strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
         LOGE("failed to remove sticker file : %s", error_buffer);
@@ -393,14 +412,16 @@ static char* __convert_sticker_uri(const char *uri, const char *appid, const cha
         LOGE("failed to change ownership");
 
 cleanup:
-    free(rel_path);
-    rel_path = NULL;
+    free(copy_uri);
+    copy_uri = NULL;
 
     if (ret == 0) {
         return new_path;
     } else {
-        free(new_path);
-        new_path = NULL;
+        if (new_path) {
+            free(new_path);
+            new_path = NULL;
+        }
         return NULL;
     }
 }
@@ -500,7 +521,7 @@ static void __insert_sticker_keyword_info(const char *keyword)
     return;
 }
 
-static void __insert_sticker_whitelist_info(const char *provider, const char *consumer) {
+static void __insert_sticker_allowlist_info(const char *provider, const char *consumer) {
     int ret;
     sqlite3 *db = NULL;
     sqlite3_stmt *stmt = NULL;
@@ -526,7 +547,7 @@ static void __insert_sticker_whitelist_info(const char *provider, const char *co
         sqlite3_finalize(stmt);
         sqlite3_close(db);
     } else {
-        LOGE("fail to insert sticker whiltelist : %s", sqlite3_errmsg(db));
+        LOGE("fail to insert sticker allowlist : %s", sqlite3_errmsg(db));
         sqlite3_finalize(stmt);
         sqlite3_close(db);
     }
@@ -543,7 +564,7 @@ static int __get_sticker_info_from_json(const char *appid, const char *file_path
     char *uri = NULL;
     char *group = NULL;
     char *description = NULL;
-    char *thumbnail = NULL;
+    char *thumbnail_path = NULL;
     char *uri_path = NULL;
 
     parser = json_parser_new();
@@ -568,10 +589,10 @@ static int __get_sticker_info_from_json(const char *appid, const char *file_path
         goto cleanup;
     }
 
-    JsonArray *whitelist_arr = json_object_get_array_member(root_obj, "whitelist");
-    if (whitelist_arr != NULL) {
-        for (int i = 0; i < json_array_get_length(whitelist_arr); i++) {
-            __insert_sticker_whitelist_info(appid, json_array_get_string_element(whitelist_arr, i));
+    JsonArray *allowlist_arr = json_object_get_array_member(root_obj, "whitelist");
+    if (allowlist_arr != NULL) {
+        for (int i = 0; i < json_array_get_length(allowlist_arr); i++) {
+            __insert_sticker_allowlist_info(appid, json_array_get_string_element(allowlist_arr, i));
         }
     }
 
@@ -598,9 +619,32 @@ static int __get_sticker_info_from_json(const char *appid, const char *file_path
             if (!group)
                 goto free_memory;
 
-            thumbnail = __get_string_from_object(info_object, "thumbnail");
-            if (thumbnail)
-                thumbnail = __convert_sticker_uri(thumbnail, appid, app_path);
+            char *rel_thumbnail = __get_string_from_object(info_object, "thumbnail");
+            if (rel_thumbnail) {
+                if (rel_thumbnail[0] != '\0') {
+                    if (access(rel_thumbnail, F_OK) == 0) {
+                        thumbnail_path = __convert_sticker_uri(rel_thumbnail, appid, app_path);
+                    } else {
+                        int len = strlen(app_path) + strlen(rel_thumbnail) + 2;
+                        char *new_thumbnail_path = (char *)calloc(len, sizeof(char));
+                        if (new_thumbnail_path) {
+                            if (rel_thumbnail[0] == '/')
+                                snprintf(new_thumbnail_path, len, "%s%s",app_path, rel_thumbnail);
+                            else
+                                snprintf(new_thumbnail_path, len, "%s%s%s",app_path, "/", rel_thumbnail);
+
+                            if (access(new_thumbnail_path, F_OK) == 0)
+                                thumbnail_path = __convert_sticker_uri(new_thumbnail_path, appid, app_path);
+
+                            free(new_thumbnail_path);
+                            new_thumbnail_path = NULL;
+                        }
+                    }
+                }
+
+                free(rel_thumbnail);
+                rel_thumbnail = NULL;
+            }
 
             description = __get_string_from_object(info_object, "description");
             int disp_type = __get_int_from_object(info_object, "display_type");
@@ -615,7 +659,7 @@ static int __get_sticker_info_from_json(const char *appid, const char *file_path
                     char *new_uri = __convert_sticker_uri(uri, appid, app_path);
                     if (!new_uri)
                         goto free_memory;
-                    __insert_sticker_info(appid, type, new_uri, group, thumbnail, description, disp_type);
+                    __insert_sticker_info(appid, type, new_uri, group, thumbnail_path, description, disp_type);
 
                     if (new_uri) {
                         free(new_uri);
@@ -641,7 +685,7 @@ static int __get_sticker_info_from_json(const char *appid, const char *file_path
                             uri_path = NULL;
                             goto free_memory;
                         }
-                        __insert_sticker_info(appid, type, new_uri, group, thumbnail, description, disp_type);
+                        __insert_sticker_info(appid, type, new_uri, group, thumbnail_path, description, disp_type);
 
                         free(new_uri);
                         new_uri = NULL;
@@ -656,7 +700,7 @@ static int __get_sticker_info_from_json(const char *appid, const char *file_path
                     }
                 }
             } else {
-                __insert_sticker_info(appid, type, uri, group, thumbnail, description, disp_type);
+                __insert_sticker_info(appid, type, uri, group, thumbnail_path, description, disp_type);
             }
 
             for (int j = 0; j < keyword_arr_len; j++) {
@@ -674,9 +718,9 @@ free_memory:
                 group = NULL;
             }
 
-            if (thumbnail) {
-                free(thumbnail);
-                thumbnail = NULL;
+            if (thumbnail_path) {
+                free(thumbnail_path);
+                thumbnail_path = NULL;
             }
 
             if (description) {
@@ -696,7 +740,7 @@ cleanup:
     return ret;
 }
 
-static void __delete_sticker_whitelist(const char *db_path, const char *app_id)
+static void __delete_sticker_allowlist(const char *db_path, const char *app_id)
 {
     int ret;
     sqlite3 *db = NULL;
@@ -708,7 +752,7 @@ static void __delete_sticker_whitelist(const char *db_path, const char *app_id)
 
     ret = sqlite3_prepare_v2(db, "DELETE FROM sticker_whitelist_info WHERE provider_id = ?", -1, &stmt, NULL);
     if (ret != SQLITE_OK) {
-        LOGE("failed to delete sticker whitelist : %s", sqlite3_errmsg(db));
+        LOGE("failed to delete sticker allowlist : %s", sqlite3_errmsg(db));
         sqlite3_finalize(stmt);
         sqlite3_close(db);
         goto cleanup;
@@ -921,7 +965,7 @@ int PKGMGR_MDPARSER_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList
         sqlite3_close(db);
     }
 
-    __delete_sticker_whitelist(db_path, appid);
+    __delete_sticker_allowlist(db_path, appid);
 
     return 0;
 }