2 * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
23 #include <json-glib/json-glib.h>
24 #include <pkgmgr-info.h>
26 #include <tzplatform_config.h>
27 #include <package_manager.h>
29 #include <sys/types.h>
33 #include <linux/limits.h>
36 #define EXPORT_API __attribute__((visibility("default")))
42 #define LOG_TAG "STICKER_PARSER"
44 #define STICKER_DIRECTORY "/opt/usr/share/sticker-data"
45 #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)"
46 #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)"
47 #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)"
48 #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)"
49 #define STICKER_GROUP_INFO_CREATE_TABLE "CREATE TABLE IF NOT EXISTS sticker_group_info(group_id INTEGER PRIMARY KEY AUTOINCREMENT, app_id TEXT NOT NULL, group_name TEXT NOT NULL, type INTEGER NOT NULL, uri TEXT NOT NULL)"
52 #define MAX_ERROR_BUFFER 256
54 static char error_buffer[MAX_ERROR_BUFFER];
55 static gboolean is_corrupted = FALSE;
57 typedef struct metadata {
62 static char* __get_string_from_object(JsonObject *object, const char *key)
64 if (json_object_has_member(object, key) == false)
67 const char *str = json_object_get_string_member(object, key);
74 static int __get_int_from_object(JsonObject *object, const char *key)
76 if (json_object_has_member(object, key) == false)
79 int type = json_object_get_int_member(object, key);
84 static int __change_ownership(const char *path, int user, int group)
87 uid_t uid = (uid_t)user;
88 gid_t gid = (gid_t)group;
90 ret = chown(path, uid, gid);
92 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
93 LOGE("chown() failed : %s", error_buffer);
99 static void __recover_db()
104 const char *db_path = tzplatform_mkpath(TZ_SYS_DB, ".sticker_info.db");
106 LOGD("Start to recover sticker db");
107 if (unlink(db_path) == -1)
108 LOGE("Failed to remove db file");
110 ret = sqlite3_open_v2(db_path, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
111 if (ret != SQLITE_OK) {
112 LOGE("Failed to open db : %s", sqlite3_errmsg(db));
113 if (unlink(db_path) == -1)
114 LOGE("Failed to remove db file");
118 ret = sqlite3_exec(db, STICKER_INFO_CREATE_TABLE, NULL, NULL, &err);
119 if (ret != SQLITE_OK) {
120 LOGE("Failed to create sticker_info table : %s" , err);
124 ret = sqlite3_exec(db, STICKER_KEYWORD_INFO_CREATE_TABLE, NULL, NULL, &err);
125 if (ret != SQLITE_OK) {
126 LOGE("Failed to create sticker_keyword_info table : %s", err);
130 ret = sqlite3_exec(db, STICKER_WHITELIST_INFO_CREATE_TABLE, NULL, NULL, &err);
131 if (ret != SQLITE_OK) {
132 LOGE("Failed to create sticker_whitelist_info table : %s", err);
136 ret = sqlite3_exec(db, STICKER_RECENT_HISTORY_INFO_CREATE_TABLE, NULL, NULL, &err);
137 if (ret != SQLITE_OK) {
138 LOGE("Failed to create sticker_recent_history_info table : %s", err);
142 ret = sqlite3_exec(db, STICKER_GROUP_INFO_CREATE_TABLE, NULL, NULL, &err);
143 if (ret != SQLITE_OK) {
144 LOGE("Failed to create sticker_recent_history_info table : %s", err);
148 is_corrupted = FALSE;
158 static int __integrity_check_cb(void *pid, int argc, char **argv, char **notUsed)
160 if (strcmp(argv[0], "ok") != 0) {
161 LOGE("DB integrity check failed : %s", argv[0]);
166 LOGD("Result integrity : %s", argv[0]);
170 static void __db_init()
175 const char *db_path = tzplatform_mkpath(TZ_SYS_DB, ".sticker_info.db");
177 ret = sqlite3_open_v2(db_path, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
178 if (ret != SQLITE_OK) {
179 LOGE("Failed to open db : %s", sqlite3_errmsg(db));
183 if (__change_ownership(db_path, UIFW_ID, UIFW_ID) != 0)
184 LOGE("failed to change ownership");
186 ret = sqlite3_exec(db, STICKER_INFO_CREATE_TABLE, NULL, NULL, &err);
187 if (ret != SQLITE_OK) {
188 LOGE("Failed to create sticker_info table : %s" , err);
192 ret = sqlite3_exec(db, STICKER_KEYWORD_INFO_CREATE_TABLE, NULL, NULL, &err);
193 if (ret != SQLITE_OK) {
194 LOGE("Failed to create sticker_keyword_info table : %s", err);
198 ret = sqlite3_exec(db, STICKER_WHITELIST_INFO_CREATE_TABLE, NULL, NULL, &err);
199 if (ret != SQLITE_OK) {
200 LOGE("Failed to create sticker_whitelist_info table : %s", err);
204 ret = sqlite3_exec(db, STICKER_RECENT_HISTORY_INFO_CREATE_TABLE, NULL, NULL, &err);
205 if (ret != SQLITE_OK) {
206 LOGE("Failed to create sticker_recent_history_info table : %s", err);
210 ret = sqlite3_exec(db, STICKER_GROUP_INFO_CREATE_TABLE, NULL, NULL, &err);
211 if (ret != SQLITE_OK) {
212 LOGE("Failed to create sticker_recent_history_info table : %s", err);
216 ret = sqlite3_exec(db, "PRAGMA journal_mode = WAL", NULL, NULL, &err);
217 if (ret != SQLITE_OK) {
218 LOGE("Failed to set journal_mode : %s", err);
222 ret = sqlite3_exec(db, "PRAGMA integrity_check", __integrity_check_cb, NULL, &err);
223 if (ret != SQLITE_OK)
224 LOGE("Failed to check integrity : %s", err);
233 if (ret == SQLITE_CORRUPT || ret == SQLITE_NOTADB || is_corrupted)
237 static sqlite3 *__db_open(const char *path)
243 ret = sqlite3_open(path, &db);
244 if (ret != SQLITE_OK) {
245 LOGE("Failed to open db : %s", sqlite3_errmsg(db));
249 ret = sqlite3_exec(db, "PRAGMA foreign_keys = ON", NULL, NULL, &err);
250 if (ret != SQLITE_OK) {
251 LOGE("Failed to turn on foreign keys : %s", err);
260 static int __remove_app_path(char *uri, const char *app_path)
264 for (int i = 0; uri[i] != '\0'; i++) {
265 if (uri[i] == app_path[n]) {
267 while (uri[i] == app_path[n]) {
268 if (app_path[++n] == '\0') {
269 for(; uri[k + n] != '\0'; k++) {
284 static int __mkdirs(const char *path, mode_t mode)
287 char prev_path[2048];
288 const char *tmp = path;
290 if (!path || strlen(path) > 2048)
293 memset(prev_path, '\0', 2048);
294 while ((tmp = strchr(tmp, '/')) != NULL) {
301 strncpy(prev_path, path, len);
302 prev_path[len] = 0x00;
304 if (mkdir(prev_path, mode) == -1) {
305 if (errno != EEXIST) {
306 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
307 LOGE("directory create error : %s", error_buffer);
311 if (__change_ownership(prev_path, UIFW_ID, UIFW_ID) != 0)
312 LOGE("failed to change ownership");
316 if (mkdir(prev_path, mode) == -1) {
317 if (errno != EEXIST) {
318 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
319 LOGE("directory create error : %s", error_buffer);
323 if (__change_ownership(prev_path, UIFW_ID, UIFW_ID) != 0)
324 LOGE("failed to change ownership");
329 static int __file_copy(const char *src, const char *dest)
332 int fd = -1, n_fd = -1;
337 memset(buf, '\0', 4096);
338 fd = open(src, O_RDONLY);
339 n_fd = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0755);
341 if (fd == -1 || n_fd == -1) {
347 while((size = read(fd, buf, 4096))) {
357 while(write(n_fd, buf, size) == -1) {
358 if (errno == EINTR) {
378 static char* __convert_sticker_uri(char *uri, const char *appid, const char *app_path)
381 char *copy_uri = (char *)calloc(PATH_MAX, sizeof(char));
382 if (copy_uri == NULL) {
383 LOGE("failed to allocate memory");
387 strncpy(copy_uri, uri, PATH_MAX - 1);
388 __remove_app_path(uri, app_path);
389 int len = strlen(STICKER_DIRECTORY) + strlen(appid) + strlen(uri) + 2;
390 char *new_path = (char *)calloc(len, sizeof(char));
391 if (new_path == NULL) {
392 LOGE("failed to allocate memory");
397 snprintf(new_path, len, "%s/%s%s",STICKER_DIRECTORY, appid, uri);
399 if (access(new_path, F_OK) == 0) {
400 LOGE("sticker file already exists");
405 ret = __mkdirs(new_path, 0755);
407 LOGE("directory create error");
411 if (__file_copy(copy_uri, new_path) == -1) {
412 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
413 LOGE("failed to copy sticker file : %s", error_buffer);
418 ret = unlink(copy_uri);
420 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
421 LOGE("failed to remove sticker file : %s", error_buffer);
424 if (__change_ownership(new_path, UIFW_ID, UIFW_ID) != 0)
425 LOGE("failed to change ownership");
442 static void __insert_sticker_info(const char *app_id, int type, const char *uri, const char *group, const char *thumbnail, const char *description, int disp_type)
446 sqlite3_stmt *stmt = NULL;
449 db_path = tzplatform_mkpath(TZ_SYS_DB, ".sticker_info.db");
450 db = __db_open(db_path);
454 ret = sqlite3_prepare_v2(db, "INSERT INTO sticker_info (app_id, type, uri, thumbnail, description, group_name, date, display_type) VALUES (?, ?, ?, ?, ?, ?, DateTime('now','localtime'), ?)",-1, &stmt, NULL);
455 if (ret == SQLITE_OK) {
456 sqlite3_bind_text(stmt, 1, app_id, -1, SQLITE_TRANSIENT);
457 sqlite3_bind_int(stmt, 2, type);
458 sqlite3_bind_text(stmt, 3, uri, -1, SQLITE_TRANSIENT);
459 sqlite3_bind_text(stmt, 4, thumbnail, -1, SQLITE_TRANSIENT);
460 sqlite3_bind_text(stmt, 5, description, -1, SQLITE_TRANSIENT);
461 sqlite3_bind_text(stmt, 6, group, -1, SQLITE_TRANSIENT);
462 sqlite3_bind_int(stmt, 7, disp_type);
464 ret = sqlite3_step(stmt);
465 if (ret != SQLITE_OK && ret != SQLITE_DONE)
466 LOGE("sqlite3_step() failed : ret(%d)", ret);
468 if (sqlite3_changes(db) == 0)
469 LOGE("No changes to DB");
471 sqlite3_finalize(stmt);
474 LOGE("failed to insert sticker information : %s", sqlite3_errmsg(db));
475 sqlite3_finalize(stmt);
482 static void __insert_sticker_keyword_info(const char *keyword)
487 sqlite3_stmt *stmt = NULL;
490 db_path = tzplatform_mkpath(TZ_SYS_DB, ".sticker_info.db");
491 db = __db_open(db_path);
495 ret = sqlite3_prepare_v2(db, "SELECT sticker_info_id FROM sticker_info ORDER BY sticker_info_id DESC LIMIT 1", -1, &stmt, NULL);
496 if (ret == SQLITE_OK) {
497 ret = sqlite3_step(stmt);
498 if (ret == SQLITE_ERROR) {
499 LOGE("sqlite3_step() failed : ret(%d)", ret);
500 sqlite3_finalize(stmt);
503 record_id = sqlite3_column_int(stmt, 0);
505 sqlite3_finalize(stmt);
508 ret = sqlite3_prepare_v2(db, "INSERT INTO sticker_keyword_info (sticker_info_id, keyword) VALUES (?, ?)", -1, &stmt, NULL);
509 if (ret == SQLITE_OK) {
510 sqlite3_bind_int(stmt, 1, record_id);
511 sqlite3_bind_text(stmt, 2, keyword, -1, SQLITE_TRANSIENT);
513 ret = sqlite3_step(stmt);
514 if (ret != SQLITE_OK && ret != SQLITE_DONE)
515 LOGE("sqlite3_step() failed : ret(%d)", ret);
517 if (sqlite3_changes(db) == 0)
518 LOGE("No changes to DB");
520 sqlite3_finalize(stmt);
523 LOGE("fail to insert sticker keyword : %s", sqlite3_errmsg(db));
524 sqlite3_finalize(stmt);
529 LOGE("fail to insert sticker information : %s", sqlite3_errmsg(db));
530 sqlite3_finalize(stmt);
537 static void __insert_sticker_allowlist_info(const char *provider, const char *consumer) {
540 sqlite3_stmt *stmt = NULL;
543 db_path = tzplatform_mkpath(TZ_SYS_DB, ".sticker_info.db");
544 db = __db_open(db_path);
548 ret = sqlite3_prepare_v2(db, "INSERT INTO sticker_whitelist_info (provider_id, consumer_id) VALUES (?, ?)", -1, &stmt, NULL);
549 if (ret == SQLITE_OK) {
550 sqlite3_bind_text(stmt, 1, provider, -1, SQLITE_TRANSIENT);
551 sqlite3_bind_text(stmt, 2, consumer, -1, SQLITE_TRANSIENT);
553 ret = sqlite3_step(stmt);
554 if (ret != SQLITE_OK && ret != SQLITE_DONE)
555 LOGE("sqlite3_step() failed : ret(%d)", ret);
557 if (sqlite3_changes(db) == 0)
558 LOGE("No changes to DB");
560 sqlite3_finalize(stmt);
563 LOGE("fail to insert sticker allowlist : %s", sqlite3_errmsg(db));
564 sqlite3_finalize(stmt);
571 static int __get_sticker_info_from_json(const char *appid, const char *file_path, const char *app_path)
575 JsonParser* parser = NULL;
576 GError* err_msg = NULL;
579 char *description = NULL;
580 char *thumbnail_path = NULL;
581 char *uri_path = NULL;
582 char *rel_thumbnail = NULL;
583 JsonArray *keyword_arr = NULL;
584 JsonArray *allowlist_arr = NULL;
585 JsonArray *sticker_arr = NULL;
587 int keyword_arr_len = 0;
589 JsonNode *root = NULL;
590 JsonObject *root_obj = NULL;
592 parser = json_parser_new();
593 json_parser_load_from_file(parser, file_path, &err_msg);
595 LOGE("failed to load json file. error message: %s", err_msg->message);
600 root = json_parser_get_root(parser);
602 LOGE("failed to get root");
607 root_obj = json_node_get_object(root);
608 if (root_obj == NULL) {
609 LOGE("failed to get object");
614 allowlist_arr = json_object_get_array_member(root_obj, "whitelist");
615 if (allowlist_arr != NULL) {
616 for (int i = 0; i < json_array_get_length(allowlist_arr); i++) {
617 __insert_sticker_allowlist_info(appid, json_array_get_string_element(allowlist_arr, i));
621 sticker_arr = json_object_get_array_member(root_obj, "sticker");
622 if (sticker_arr == NULL) {
623 LOGE("failed to get array member");
628 arr_len = json_array_get_length(sticker_arr);
629 for (int i = 0; i < arr_len; i++) {
630 JsonObject *info_object = json_array_get_object_element(sticker_arr, i);
631 if (info_object != NULL) {
632 int type = __get_int_from_object(info_object, "type");
636 uri = __get_string_from_object(info_object, "uri");
640 group = __get_string_from_object(info_object, "group");
644 rel_thumbnail = __get_string_from_object(info_object, "thumbnail");
646 if (rel_thumbnail[0] != '\0') {
647 if (access(rel_thumbnail, F_OK) == 0) {
648 thumbnail_path = __convert_sticker_uri(rel_thumbnail, appid, app_path);
650 int len = strlen(app_path) + strlen(rel_thumbnail) + 2;
651 char *new_thumbnail_path = (char *)calloc(len, sizeof(char));
652 if (new_thumbnail_path) {
653 if (rel_thumbnail[0] == '/')
654 snprintf(new_thumbnail_path, len, "%s%s",app_path, rel_thumbnail);
656 snprintf(new_thumbnail_path, len, "%s%s%s",app_path, "/", rel_thumbnail);
658 if (access(new_thumbnail_path, F_OK) == 0)
659 thumbnail_path = __convert_sticker_uri(new_thumbnail_path, appid, app_path);
661 free(new_thumbnail_path);
662 new_thumbnail_path = NULL;
668 rel_thumbnail = NULL;
671 description = __get_string_from_object(info_object, "description");
672 disp_type = __get_int_from_object(info_object, "display_type");
674 keyword_arr = json_object_get_array_member(info_object, "keyword");
675 keyword_arr_len = json_array_get_length(keyword_arr);
676 if (keyword_arr_len < 1)
680 if (access(uri, F_OK) == 0) {
681 char *new_uri = __convert_sticker_uri(uri, appid, app_path);
684 __insert_sticker_info(appid, type, new_uri, group, thumbnail_path, description, disp_type);
691 int path_len = strlen(app_path) + strlen(uri) + 2;
692 uri_path = (char *)calloc(path_len, sizeof(char));
694 LOGE("failed to alloc memory");
699 snprintf(uri_path, path_len, "%s%s",app_path, uri);
701 snprintf(uri_path, path_len, "%s%s%s",app_path, "/", uri);
703 if (access(uri_path, F_OK) == 0) {
704 char *new_uri = __convert_sticker_uri(uri_path, appid, app_path);
710 __insert_sticker_info(appid, type, new_uri, group, thumbnail_path, description, disp_type);
718 LOGE("%s does not exist", uri_path);
725 __insert_sticker_info(appid, type, uri, group, thumbnail_path, description, disp_type);
728 for (int j = 0; j < keyword_arr_len; j++) {
729 __insert_sticker_keyword_info(json_array_get_string_element(keyword_arr, j));
743 if (thumbnail_path) {
744 free(thumbnail_path);
745 thumbnail_path = NULL;
757 g_error_free(err_msg);
760 g_object_unref(parser);
765 static void __delete_sticker_allowlist(const char *db_path, const char *app_id)
769 sqlite3_stmt *stmt = NULL;
771 db = __db_open(db_path);
775 ret = sqlite3_prepare_v2(db, "DELETE FROM sticker_whitelist_info WHERE provider_id = ?", -1, &stmt, NULL);
776 if (ret != SQLITE_OK) {
777 LOGE("failed to delete sticker allowlist : %s", sqlite3_errmsg(db));
781 sqlite3_bind_text(stmt, 1, app_id, -1, SQLITE_TRANSIENT);
783 ret = sqlite3_step(stmt);
784 if (ret != SQLITE_OK && ret != SQLITE_DONE) {
785 LOGE("sqlite3_step() failed : ret(%d)", ret);
789 if (sqlite3_changes(db) == 0) {
790 LOGE("No changes to DB");
794 sqlite3_finalize(stmt);
799 sqlite3_finalize(stmt);
804 static void __delete_sticker_info(const char *db_path, int record_id)
808 sqlite3_stmt *stmt = NULL;
810 db = __db_open(db_path);
814 ret = sqlite3_prepare_v2(db, "DELETE FROM sticker_info WHERE sticker_info_id = ?", -1, &stmt, NULL);
815 if (ret != SQLITE_OK) {
816 LOGE("failed to delete sticker information : %s", sqlite3_errmsg(db));
820 sqlite3_bind_int(stmt, 1, record_id);
822 ret = sqlite3_step(stmt);
823 if (ret != SQLITE_OK && ret != SQLITE_DONE) {
824 LOGE("sqlite3_step() failed : ret(%d)", ret);
828 if (sqlite3_changes(db) == 0) {
829 LOGE("No changes to DB");
833 sqlite3_finalize(stmt);
838 sqlite3_finalize(stmt);
843 static void __delete_group_info(const char *db_path, const char *app_id)
847 sqlite3_stmt *stmt = NULL;
849 db = __db_open(db_path);
853 ret = sqlite3_prepare_v2(db, "DELETE FROM sticker_group_info WHERE app_id = ?", -1, &stmt, NULL);
854 if (ret != SQLITE_OK) {
855 LOGE("failed to delete group information : %s", sqlite3_errmsg(db));
859 sqlite3_bind_text(stmt, 1, app_id, -1, SQLITE_TRANSIENT);
861 ret = sqlite3_step(stmt);
862 if (ret != SQLITE_OK && ret != SQLITE_DONE) {
863 LOGE("sqlite3_step() failed : ret(%d)", ret);
867 if (sqlite3_changes(db) == 0) {
868 LOGE("No changes to DB");
872 sqlite3_finalize(stmt);
877 sqlite3_finalize(stmt);
882 static int __remove_directory(const char *path, int is_error_stop)
885 struct dirent *file = NULL;
889 memset(filename, '\0', 1024);
891 if (__change_ownership(path, APPFW_ID, APPFW_ID) != 0)
892 LOGE("failed to change ownership");
894 dir_ptr = opendir(path);
898 while ((file = readdir(dir_ptr)) != NULL) {
899 if (strcmp(file->d_name, ".") == 0 || strcmp(file->d_name, "..") == 0)
902 snprintf(filename, strlen(path) + strlen(file->d_name) + 2, "%s/%s", path, file->d_name);
904 if (lstat(filename, &buf) == -1)
907 if (S_ISDIR(buf.st_mode)) {
908 if (__remove_directory(filename, is_error_stop) == -1 && is_error_stop) {
912 } else if (S_ISREG(buf.st_mode) || S_ISLNK(buf.st_mode)) {
913 if (unlink(filename) == -1 && is_error_stop) {
925 int PKGMGR_MDPARSER_PLUGIN_INSTALL(const char *pkgid, const char *appid, GList *list)
927 LOGD("METADATA INSTALL");
928 LOGD("pkgid: %s, appid: %s", pkgid, appid);
930 metadata *md = (metadata *)list->data;
931 package_info_h package_info = NULL;
932 char *app_path = NULL;
933 char *file_path = NULL;
939 ret = package_info_create(pkgid, &package_info);
940 if (ret != PACKAGE_MANAGER_ERROR_NONE || package_info == NULL) {
941 LOGE("failed to create package_info. ret: %d", ret);
945 ret = package_info_get_root_path(package_info, &app_path);
946 if (ret != PACKAGE_MANAGER_ERROR_NONE || app_path == NULL) {
947 LOGE("failed to create package_info. ret: %d", ret);
951 path_len = strlen(app_path) + strlen((char *)md->value) + 2;
952 file_path = (char *)calloc(path_len, sizeof(char));
954 LOGE("failed to alloc memory");
958 if ((char)md->value[0] == '/')
959 snprintf(file_path, path_len, "%s%s",app_path, (char *)md->value);
961 snprintf(file_path, path_len, "%s%s%s",app_path, "/", (char *)md->value);
963 if (__get_sticker_info_from_json(appid, file_path, app_path) == 0)
964 LOGE("failed to get sticker information [path : %s]", file_path);
968 package_info_destroy(package_info);
984 int PKGMGR_MDPARSER_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList *list)
986 LOGD("METADATA UNINSTALL");
987 LOGD("pkgid: %s, appid: %s", pkgid, appid);
992 sqlite3_stmt *stmt = NULL;
994 GList *id_list = NULL;
996 db_path = tzplatform_mkpath(TZ_SYS_DB, ".sticker_info.db");
997 db = __db_open(db_path);
1001 ret = sqlite3_prepare_v2(db, "SELECT sticker_info_id from sticker_info WHERE app_id = ?", -1, &stmt, NULL);
1002 if (ret == SQLITE_OK) {
1003 sqlite3_bind_text(stmt, 1, appid, -1, SQLITE_TRANSIENT);
1004 while (sqlite3_step(stmt) == SQLITE_ROW) {
1005 const unsigned char *record_id = sqlite3_column_text(stmt, 0);
1007 id_list = g_list_append(id_list, strdup((const char *)record_id));
1010 sqlite3_finalize(stmt);
1013 for(GList *tmp = g_list_first(id_list); tmp != NULL; tmp = tmp->next) {
1014 del_id = atoi((const char*)tmp->data);
1015 __delete_sticker_info(db_path, del_id);
1019 g_list_free_full(id_list, free);
1021 LOGE("failed to get sticker id");
1022 sqlite3_finalize(stmt);
1026 __delete_sticker_allowlist(db_path, appid);
1027 __delete_group_info(db_path, appid);
1033 int PKGMGR_MDPARSER_PLUGIN_UPGRADE(const char *pkgid, const char *appid, GList *list)
1035 LOGD("METADATA UPGRADE");
1036 LOGD("pkgid: %s, appid: %s", pkgid, appid);
1038 PKGMGR_MDPARSER_PLUGIN_UNINSTALL(pkgid, appid, list);
1039 PKGMGR_MDPARSER_PLUGIN_INSTALL(pkgid, appid, list);
1044 int PKGMGR_CATEGORY_PARSER_PLUGIN_INSTALL(const char *pkgid, const char *appid, GList *list)
1046 LOGD("STICKER CATEGORY INSTALL");
1047 LOGD("pkgid: %s, appid: %s", pkgid, appid);
1049 int len = strlen(STICKER_DIRECTORY) + strlen(appid) + 2;
1050 char *dir_path = (char *)calloc(len, sizeof(char));
1052 if (dir_path != NULL) {
1053 snprintf(dir_path, len, "%s%s%s", STICKER_DIRECTORY, "/", appid);
1054 LOGD("directory path : %s", dir_path);
1056 if (mkdir(dir_path, 0755) == -1 && errno != EEXIST) {
1057 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
1058 LOGE("directory create error : %s", error_buffer);
1060 if (__change_ownership(dir_path, UIFW_ID, UIFW_ID) != 0)
1061 LOGE("failed to change ownership");
1072 int PKGMGR_CATEGORY_PARSER_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList *list)
1074 LOGD("STICKER CATEGORY UNINSTALL");
1075 LOGD("pkgid: %s, appid: %s", pkgid, appid);
1077 int len = strlen(STICKER_DIRECTORY) + strlen(appid) + 2;
1078 char * dir_path = (char *)calloc(len, sizeof(char));
1080 if (dir_path != NULL) {
1081 snprintf(dir_path, len, "%s%s%s", STICKER_DIRECTORY, "/", appid);
1082 LOGD("directory path : %s", dir_path);
1084 if (__remove_directory(dir_path, 0) < 0) {
1085 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
1086 LOGE("directory remove error : %s", error_buffer);
1097 int PKGMGR_CATEGORY_PARSER_PLUGIN_UPGRADE(const char *pkgid, const char *appid, GList *list)
1099 LOGD("STICKER CATEGORY UPGRADE");
1100 LOGD("pkgid: %s, appid: %s", pkgid, appid);
1102 PKGMGR_CATEGORY_PARSER_PLUGIN_UNINSTALL(pkgid, appid, list);
1103 PKGMGR_CATEGORY_PARSER_PLUGIN_INSTALL(pkgid, appid, list);