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>
35 #define EXPORT_API __attribute__((visibility("default")))
41 #define LOG_TAG "STICKER_PARSER"
43 #define STICKER_DIRECTORY tzplatform_mkpath(TZ_SYS_SHARE, "sticker-data")
44 #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)"
45 #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)"
46 #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)"
49 #define MAX_ERROR_BUFFER 256
51 static char error_buffer[MAX_ERROR_BUFFER];
52 static gboolean is_corrupted = FALSE;
54 typedef struct metadata {
59 static char* __get_string_from_object(JsonObject *object, const char *key)
61 if (json_object_has_member(object, key) == false)
64 const char *str = json_object_get_string_member(object, key);
71 static int __get_int_from_object(JsonObject *object, const char *key)
73 if (json_object_has_member(object, key) == false)
76 int type = json_object_get_int_member(object, key);
81 static int __change_ownership(const char *path, int user, int group)
84 uid_t uid = (uid_t)user;
85 gid_t gid = (gid_t)group;
87 ret = chown(path, uid, gid);
89 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
90 LOGE("chown() failed : %s", error_buffer);
96 static void __recover_db()
101 const char *db_path = tzplatform_mkpath(TZ_SYS_DB, ".sticker_info.db");
103 LOGD("Start to recover sticker db");
104 if (unlink(db_path) == -1)
105 LOGE("Failed to remove db file");
107 ret = sqlite3_open_v2(db_path, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
108 if (ret != SQLITE_OK) {
109 LOGE("Failed to open db : %s", sqlite3_errmsg(db));
110 if (unlink(db_path) == -1)
111 LOGE("Failed to remove db file");
115 ret = sqlite3_exec(db, STICKER_INFO_CREATE_TABLE, NULL, NULL, &err);
116 if (ret != SQLITE_OK) {
117 LOGE("Failed to create sticker_info table : %s" , err);
121 ret = sqlite3_exec(db, STICKER_KEYWORD_INFO_CREATE_TABLE, NULL, NULL, &err);
122 if (ret != SQLITE_OK) {
123 LOGE("Failed to create sticker_keyword_info table : %s", err);
127 ret = sqlite3_exec(db, STICKER_WHITELIST_INFO_CREATE_TABLE, NULL, NULL, &err);
128 if (ret != SQLITE_OK) {
129 LOGE("Failed to create sticker_whitelist_info table : %s", err);
133 is_corrupted = FALSE;
143 static int __integrity_check_cb(void *pid, int argc, char **argv, char **notUsed)
145 if (strcmp(argv[0], "ok") != 0) {
146 LOGE("DB integrity check failed : %s", argv[0]);
151 LOGD("Result integrity : %s", argv[0]);
155 static void __db_init()
160 const char *db_path = tzplatform_mkpath(TZ_SYS_DB, ".sticker_info.db");
162 ret = sqlite3_open_v2(db_path, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
163 if (ret != SQLITE_OK) {
164 LOGE("Failed to open db : %s", sqlite3_errmsg(db));
168 if (__change_ownership(db_path, UIFW_ID, UIFW_ID) != 0)
169 LOGE("failed to change ownership");
171 ret = sqlite3_exec(db, STICKER_INFO_CREATE_TABLE, NULL, NULL, &err);
172 if (ret != SQLITE_OK) {
173 LOGE("Failed to create sticker_info table : %s" , err);
177 ret = sqlite3_exec(db, STICKER_KEYWORD_INFO_CREATE_TABLE, NULL, NULL, &err);
178 if (ret != SQLITE_OK) {
179 LOGE("Failed to create sticker_keyword_info table : %s", err);
183 ret = sqlite3_exec(db, STICKER_WHITELIST_INFO_CREATE_TABLE, NULL, NULL, &err);
184 if (ret != SQLITE_OK) {
185 LOGE("Failed to create sticker_whitelist_info table : %s", err);
189 ret = sqlite3_exec(db, "PRAGMA journal_mode = WAL", NULL, NULL, &err);
190 if (ret != SQLITE_OK) {
191 LOGE("Failed to set journal_mode : %s", err);
195 ret = sqlite3_exec(db, "PRAGMA integrity_check", __integrity_check_cb, NULL, &err);
196 if (ret != SQLITE_OK)
197 LOGE("Failed to check integrity : %s", err);
206 if (ret == SQLITE_CORRUPT || ret == SQLITE_NOTADB || is_corrupted)
210 static sqlite3 *__db_open(const char *path)
216 ret = sqlite3_open(path, &db);
217 if (ret != SQLITE_OK) {
218 LOGE("Failed to open db : %s", sqlite3_errmsg(db));
222 ret = sqlite3_exec(db, "PRAGMA foreign_keys = ON", NULL, NULL, &err);
223 if (ret != SQLITE_OK) {
224 LOGE("Failed to turn on foreign keys : %s", err);
233 static int __remove_app_path(char *uri, const char *app_path)
237 for (int i = 0; uri[i] != '\0'; i++) {
238 if (uri[i] == app_path[n]) {
240 while (uri[i] == app_path[n]) {
241 if (app_path[++n] == '\0') {
242 for(; uri[k + n] != '\0'; k++) {
257 static int __mkdirs(const char *path, mode_t mode)
260 char prev_path[2048];
261 const char *tmp = path;
263 if (!path || strlen(path) > 2048)
266 memset(prev_path, '\0', 2048);
267 while ((tmp = strchr(tmp, '/')) != NULL) {
274 strncpy(prev_path, path, len);
275 prev_path[len] = 0x00;
277 if (mkdir(prev_path, mode) == -1) {
278 if (errno != EEXIST) {
279 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
280 LOGE("directory create error : %s", error_buffer);
284 if (__change_ownership(prev_path, UIFW_ID, UIFW_ID) != 0)
285 LOGE("failed to change ownership");
289 if (mkdir(prev_path, mode) == -1) {
290 if (errno != EEXIST) {
291 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
292 LOGE("directory create error : %s", error_buffer);
296 if (__change_ownership(prev_path, UIFW_ID, UIFW_ID) != 0)
297 LOGE("failed to change ownership");
302 static int __file_copy(const char *src, const char *dest)
305 int fd = -1, n_fd = -1;
310 memset(buf, '\0', 4096);
311 fd = open(src, O_RDONLY);
312 n_fd = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0755);
314 if (fd == -1 || n_fd == -1) {
320 while((size = read(fd, buf, 4096))) {
330 while(write(n_fd, buf, size) == -1) {
351 static char* __convert_sticker_uri(const char *uri, const char *appid, const char *app_path)
354 char *rel_path = strdup(uri);
356 __remove_app_path(rel_path, app_path);
357 int len = strlen(STICKER_DIRECTORY) + strlen(appid) + strlen(rel_path) + 2;
358 char *new_path = (char *)calloc(len, sizeof(char));
359 if (new_path == NULL) {
365 snprintf(new_path, len, "%s/%s%s",STICKER_DIRECTORY, appid, rel_path);
367 if (access(new_path, F_OK) == 0) {
368 LOGE("sticker file already exists");
373 ret = __mkdirs(new_path, 0755);
375 LOGE("directory create error");
379 if (__file_copy(uri, new_path) == -1) {
380 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
381 LOGE("failed to copy sticker file : %s", error_buffer);
388 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
389 LOGE("failed to remove sticker file : %s", error_buffer);
392 if (__change_ownership(new_path, UIFW_ID, UIFW_ID) != 0)
393 LOGE("failed to change ownership");
408 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)
412 sqlite3_stmt *stmt = NULL;
415 db_path = tzplatform_mkpath(TZ_SYS_DB, ".sticker_info.db");
416 db = __db_open(db_path);
420 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);
421 if (ret == SQLITE_OK) {
422 sqlite3_bind_text(stmt, 1, app_id, -1, SQLITE_TRANSIENT);
423 sqlite3_bind_int(stmt, 2, type);
424 sqlite3_bind_text(stmt, 3, uri, -1, SQLITE_TRANSIENT);
425 sqlite3_bind_text(stmt, 4, thumbnail, -1, SQLITE_TRANSIENT);
426 sqlite3_bind_text(stmt, 5, description, -1, SQLITE_TRANSIENT);
427 sqlite3_bind_text(stmt, 6, group, -1, SQLITE_TRANSIENT);
428 sqlite3_bind_int(stmt, 7, disp_type);
430 ret = sqlite3_step(stmt);
431 if (ret != SQLITE_OK && ret != SQLITE_DONE)
432 LOGE("sqlite3_step() failed : ret(%d)", ret);
434 if (sqlite3_changes(db) == 0)
435 LOGE("No changes to DB");
437 sqlite3_finalize(stmt);
440 LOGE("failed to insert sticker information : %s", sqlite3_errmsg(db));
441 sqlite3_finalize(stmt);
448 static void __insert_sticker_keyword_info(const char *keyword)
453 sqlite3_stmt *stmt = NULL;
456 db_path = tzplatform_mkpath(TZ_SYS_DB, ".sticker_info.db");
457 db = __db_open(db_path);
461 ret = sqlite3_prepare_v2(db, "SELECT sticker_info_id FROM sticker_info ORDER BY sticker_info_id DESC LIMIT 1", -1, &stmt, NULL);
462 if (ret == SQLITE_OK) {
463 ret = sqlite3_step(stmt);
464 if (ret == SQLITE_ERROR) {
465 LOGE("sqlite3_step() failed : ret(%d)", ret);
466 sqlite3_finalize(stmt);
469 record_id = sqlite3_column_int(stmt, 0);
471 sqlite3_finalize(stmt);
474 ret = sqlite3_prepare_v2(db, "INSERT INTO sticker_keyword_info (sticker_info_id, keyword) VALUES (?, ?)", -1, &stmt, NULL);
475 if (ret == SQLITE_OK) {
476 sqlite3_bind_int(stmt, 1, record_id);
477 sqlite3_bind_text(stmt, 2, keyword, -1, SQLITE_TRANSIENT);
479 ret = sqlite3_step(stmt);
480 if (ret != SQLITE_OK && ret != SQLITE_DONE)
481 LOGE("sqlite3_step() failed : ret(%d)", ret);
483 if (sqlite3_changes(db) == 0)
484 LOGE("No changes to DB");
486 sqlite3_finalize(stmt);
489 LOGE("fail to insert sticker keyword : %s", sqlite3_errmsg(db));
490 sqlite3_finalize(stmt);
495 LOGE("fail to insert sticker information : %s", sqlite3_errmsg(db));
496 sqlite3_finalize(stmt);
503 static void __insert_sticker_whitelist_info(const char *provider, const char *consumer) {
506 sqlite3_stmt *stmt = NULL;
509 db_path = tzplatform_mkpath(TZ_SYS_DB, ".sticker_info.db");
510 db = __db_open(db_path);
514 ret = sqlite3_prepare_v2(db, "INSERT INTO sticker_whitelist_info (provider_id, consumer_id) VALUES (?, ?)", -1, &stmt, NULL);
515 if (ret == SQLITE_OK) {
516 sqlite3_bind_text(stmt, 1, provider, -1, SQLITE_TRANSIENT);
517 sqlite3_bind_text(stmt, 2, consumer, -1, SQLITE_TRANSIENT);
519 ret = sqlite3_step(stmt);
520 if (ret != SQLITE_OK && ret != SQLITE_DONE)
521 LOGE("sqlite3_step() failed : ret(%d)", ret);
523 if (sqlite3_changes(db) == 0)
524 LOGE("No changes to DB");
526 sqlite3_finalize(stmt);
529 LOGE("fail to insert sticker whiltelist : %s", sqlite3_errmsg(db));
530 sqlite3_finalize(stmt);
537 static int __get_sticker_info_from_json(const char *appid, const char *file_path, const char *app_path)
541 JsonParser* parser = NULL;
542 GError* err_msg = NULL;
545 char *description = NULL;
546 char *thumbnail = NULL;
547 char *uri_path = NULL;
549 parser = json_parser_new();
550 json_parser_load_from_file(parser, file_path, &err_msg);
552 LOGE("failed to load json file. error message: %s", err_msg->message);
557 JsonNode *root = json_parser_get_root(parser);
559 LOGE("failed to get root");
564 JsonObject *root_obj = json_node_get_object(root);
565 if (root_obj == NULL) {
566 LOGE("failed to get object");
571 JsonArray *whitelist_arr = json_object_get_array_member(root_obj, "whitelist");
572 if (whitelist_arr != NULL) {
573 for (int i = 0; i < json_array_get_length(whitelist_arr); i++) {
574 __insert_sticker_whitelist_info(appid, json_array_get_string_element(whitelist_arr, i));
578 JsonArray *sticker_arr = json_object_get_array_member(root_obj, "sticker");
579 if (sticker_arr == NULL) {
580 LOGE("failed to get array member");
585 arr_len = json_array_get_length(sticker_arr);
586 for (int i = 0; i < arr_len; i++) {
587 JsonObject *info_object = json_array_get_object_element(sticker_arr, i);
588 if (info_object != NULL) {
589 int type = __get_int_from_object(info_object, "type");
593 uri = __get_string_from_object(info_object, "uri");
597 group = __get_string_from_object(info_object, "group");
601 thumbnail = __get_string_from_object(info_object, "thumbnail");
603 thumbnail = __convert_sticker_uri(thumbnail, appid, app_path);
605 description = __get_string_from_object(info_object, "description");
606 int disp_type = __get_int_from_object(info_object, "display_type");
608 JsonArray *keyword_arr = json_object_get_array_member(info_object, "keyword");
609 int keyword_arr_len = json_array_get_length(keyword_arr);
610 if (keyword_arr_len < 1)
614 if (access(uri, F_OK) == 0) {
615 char *new_uri = __convert_sticker_uri(uri, appid, app_path);
618 __insert_sticker_info(appid, type, new_uri, group, thumbnail, description, disp_type);
625 int path_len = strlen(app_path) + strlen(uri) + 2;
626 uri_path = (char *)calloc(path_len, sizeof(char));
628 LOGE("failed to alloc memory");
633 snprintf(uri_path, path_len, "%s%s",app_path, uri);
635 snprintf(uri_path, path_len, "%s%s%s",app_path, "/", uri);
637 if (access(uri_path, F_OK) == 0) {
638 char *new_uri = __convert_sticker_uri(uri_path, appid, app_path);
644 __insert_sticker_info(appid, type, new_uri, group, thumbnail, description, disp_type);
652 LOGE("%s does not exist", uri_path);
659 __insert_sticker_info(appid, type, uri, group, thumbnail, description, disp_type);
662 for (int j = 0; j < keyword_arr_len; j++) {
663 __insert_sticker_keyword_info(json_array_get_string_element(keyword_arr, j));
691 g_error_free(err_msg);
694 g_object_unref(parser);
699 static void __delete_sticker_whitelist(const char *db_path, const char *app_id)
703 sqlite3_stmt *stmt = NULL;
705 db = __db_open(db_path);
709 ret = sqlite3_prepare_v2(db, "DELETE FROM sticker_whitelist_info WHERE provider_id = ?", -1, &stmt, NULL);
710 if (ret != SQLITE_OK) {
711 LOGE("failed to delete sticker whitelist : %s", sqlite3_errmsg(db));
712 sqlite3_finalize(stmt);
717 sqlite3_bind_text(stmt, 1, app_id, -1, SQLITE_TRANSIENT);
719 ret = sqlite3_step(stmt);
720 if (ret != SQLITE_OK && ret != SQLITE_DONE) {
721 LOGE("sqlite3_step() failed : ret(%d)", ret);
725 if (sqlite3_changes(db) == 0) {
726 LOGE("No changes to DB");
730 sqlite3_finalize(stmt);
735 sqlite3_finalize(stmt);
740 static void __delete_sticker_info(const char *db_path, int record_id)
744 sqlite3_stmt *stmt = NULL;
746 db = __db_open(db_path);
750 ret = sqlite3_prepare_v2(db, "DELETE FROM sticker_info WHERE sticker_info_id = ?", -1, &stmt, NULL);
751 if (ret != SQLITE_OK) {
752 LOGE("failed to delete sticker information : %s", sqlite3_errmsg(db));
753 sqlite3_finalize(stmt);
758 sqlite3_bind_int(stmt, 1, record_id);
760 ret = sqlite3_step(stmt);
761 if (ret != SQLITE_OK && ret != SQLITE_DONE) {
762 LOGE("sqlite3_step() failed : ret(%d)", ret);
766 if (sqlite3_changes(db) == 0) {
767 LOGE("No changes to DB");
771 sqlite3_finalize(stmt);
776 sqlite3_finalize(stmt);
781 static int __remove_directory(const char *path, int is_error_stop)
784 struct dirent *file = NULL;
788 memset(filename, '\0', 1024);
790 if (__change_ownership(path, APPFW_ID, APPFW_ID) != 0)
791 LOGE("failed to change ownership");
793 dir_ptr = opendir(path);
797 while ((file = readdir(dir_ptr)) != NULL) {
798 if (strcmp(file->d_name, ".") == 0 || strcmp(file->d_name, "..") == 0)
801 snprintf(filename, strlen(path) + strlen(file->d_name) + 2, "%s/%s", path, file->d_name);
803 if (lstat(filename, &buf) == -1)
806 if (S_ISDIR(buf.st_mode)) {
807 if (__remove_directory(filename, is_error_stop) == -1 && is_error_stop) {
811 } else if (S_ISREG(buf.st_mode) || S_ISLNK(buf.st_mode)) {
812 if (unlink(filename) == -1 && is_error_stop) {
824 int PKGMGR_MDPARSER_PLUGIN_INSTALL(const char *pkgid, const char *appid, GList *list)
826 LOGD("METADATA INSTALL");
827 LOGD("pkgid: %s, appid: %s", pkgid, appid);
829 metadata *md = (metadata *)list->data;
830 package_info_h package_info = NULL;
831 char *app_path = NULL;
832 char *file_path = NULL;
837 ret = package_info_create(pkgid, &package_info);
838 if (ret != PACKAGE_MANAGER_ERROR_NONE || package_info == NULL) {
839 LOGE("failed to create package_info. ret: %d", ret);
843 ret = package_info_get_root_path(package_info, &app_path);
844 if (ret != PACKAGE_MANAGER_ERROR_NONE || app_path == NULL) {
845 LOGE("failed to create package_info. ret: %d", ret);
849 int path_len = strlen(app_path) + strlen((char *)md->value) + 2;
850 file_path = (char *)calloc(path_len, sizeof(char));
852 LOGE("failed to alloc memory");
856 if ((char)md->value[0] == '/')
857 snprintf(file_path, path_len, "%s%s",app_path, (char *)md->value);
859 snprintf(file_path, path_len, "%s%s%s",app_path, "/", (char *)md->value);
861 if (__get_sticker_info_from_json(appid, file_path, app_path) == 0)
862 LOGE("failed to get sticker information [path : %s]", file_path);
866 package_info_destroy(package_info);
882 int PKGMGR_MDPARSER_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList *list)
884 LOGD("METADATA UNINSTALL");
885 LOGD("pkgid: %s, appid: %s", pkgid, appid);
890 sqlite3_stmt *stmt = NULL;
892 GList *id_list = NULL;
894 db_path = tzplatform_mkpath(TZ_SYS_DB, ".sticker_info.db");
895 db = __db_open(db_path);
899 ret = sqlite3_prepare_v2(db, "SELECT sticker_info_id from sticker_info WHERE app_id = ?", -1, &stmt, NULL);
900 if (ret == SQLITE_OK) {
901 sqlite3_bind_text(stmt, 1, appid, -1, SQLITE_TRANSIENT);
902 while (sqlite3_step(stmt) == SQLITE_ROW) {
903 const unsigned char *record_id = sqlite3_column_text(stmt, 0);
905 id_list = g_list_append(id_list, strdup((const char *)record_id));
908 sqlite3_finalize(stmt);
911 for(GList *tmp = g_list_first(id_list); tmp != NULL; tmp = tmp->next) {
912 del_id = atoi((const char*)tmp->data);
913 __delete_sticker_info(db_path, del_id);
917 g_list_free_full(id_list, free);
919 LOGE("failed to get sticker id");
920 sqlite3_finalize(stmt);
924 __delete_sticker_whitelist(db_path, appid);
930 int PKGMGR_MDPARSER_PLUGIN_UPGRADE(const char *pkgid, const char *appid, GList *list)
932 LOGD("METADATA UPGRADE");
933 LOGD("pkgid: %s, appid: %s", pkgid, appid);
935 PKGMGR_MDPARSER_PLUGIN_UNINSTALL(pkgid, appid, list);
936 PKGMGR_MDPARSER_PLUGIN_INSTALL(pkgid, appid, list);
941 int PKGMGR_CATEGORY_PARSER_PLUGIN_INSTALL(const char *pkgid, const char *appid, GList *list)
943 LOGD("STICKER CATEGORY INSTALL");
944 LOGD("pkgid: %s, appid: %s", pkgid, appid);
946 int len = strlen(STICKER_DIRECTORY) + strlen(appid) + 2;
947 char *dir_path = (char *)calloc(len, sizeof(char));
949 if (dir_path != NULL) {
950 snprintf(dir_path, len, "%s%s%s", STICKER_DIRECTORY, "/", appid);
951 LOGD("directory path : %s", dir_path);
953 if (mkdir(dir_path, 0755) == -1 && errno != EEXIST) {
954 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
955 LOGE("directory create error : %s", error_buffer);
957 if (__change_ownership(dir_path, UIFW_ID, UIFW_ID) != 0)
958 LOGE("failed to change ownership");
969 int PKGMGR_CATEGORY_PARSER_PLUGIN_UNINSTALL(const char *pkgid, const char *appid, GList *list)
971 LOGD("STICKER CATEGORY UNINSTALL");
972 LOGD("pkgid: %s, appid: %s", pkgid, appid);
974 int len = strlen(STICKER_DIRECTORY) + strlen(appid) + 2;
975 char * dir_path = (char *)calloc(len, sizeof(char));
977 if (dir_path != NULL) {
978 snprintf(dir_path, len, "%s%s%s", STICKER_DIRECTORY, "/", appid);
979 LOGD("directory path : %s", dir_path);
981 if (__remove_directory(dir_path, 0) < 0) {
982 strerror_r(errno, error_buffer, MAX_ERROR_BUFFER);
983 LOGE("directory remove error : %s", error_buffer);
994 int PKGMGR_CATEGORY_PARSER_PLUGIN_UPGRADE(const char *pkgid, const char *appid, GList *list)
996 LOGD("STICKER CATEGORY UPGRADE");
997 LOGD("pkgid: %s, appid: %s", pkgid, appid);
999 PKGMGR_CATEGORY_PARSER_PLUGIN_UNINSTALL(pkgid, appid, list);
1000 PKGMGR_CATEGORY_PARSER_PLUGIN_INSTALL(pkgid, appid, list);