X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=NativeLauncher%2Finstaller-plugin%2Fprefer_nuget_cache_plugin.cc;h=ab93bceafbcfea8c74db545d5b42b76d40d2ade0;hb=refs%2Fheads%2Ftizen;hp=9e6c06b63a2bbcba1d520411208f8dd4c72bdd9c;hpb=3963a69d829677406aa1bd731b947f810bd75868;p=platform%2Fcore%2Fdotnet%2Flauncher.git diff --git a/NativeLauncher/installer-plugin/prefer_nuget_cache_plugin.cc b/NativeLauncher/installer-plugin/prefer_nuget_cache_plugin.cc index 9e6c06b..ab93bce 100644 --- a/NativeLauncher/installer-plugin/prefer_nuget_cache_plugin.cc +++ b/NativeLauncher/installer-plugin/prefer_nuget_cache_plugin.cc @@ -14,685 +14,60 @@ * limitations under the License. */ -#include "log.h" -#include "utils.h" -#include "db_manager.h" -#include "path_manager.h" -#include "plugin_manager.h" -#include "tac_common.h" +#include "tac_installer.h" -#include -#include -#include -#include -#include #include -#include -#include -#include -#include +#include #ifdef LOG_TAG #undef LOG_TAG #endif #define LOG_TAG "DOTNET_INSTALLER_PLUGIN" -#define __XSTR(x) #x -#define __STR(x) __XSTR(x) -static const char* __TAC_DIR = __STR(TAC_DIR); -#undef __STR -#undef __XSTR - -typedef struct Metadata { - const char *key; - const char *value; -} Metadata; - -std::vector nugetPackagesAssembliesSha; -std::vector tacDB; -std::vector createDirectories; -std::vector updateTac; -std::string status = ""; -std::string rootPath; -std::string execName; -std::string binPath; -static sqlite3 *tac_db = NULL; - -bool metadataCheck(GList *list) -{ - GList *tag = NULL; - Metadata *mdInfo = NULL; - tag = g_list_first(list); - mdInfo = (Metadata*)tag->data; - if (strcmp(mdInfo->key, TAC_METADATA_KEY) == 0 && strcmp(mdInfo->value, METADATA_VALUE) == 0) { - _DBG("Prefer nuget cache set TRUE"); - if (initializePluginManager("normal")) { - _ERR("Fail to initialize PluginManager"); - return false; - } - if (initializePathManager(std::string(), std::string(), std::string())) { - _ERR("Fail to initialize PathManger"); - return false; - } - return true; - } - return false; -} - -bool appTypeCheck(std::string pkgId) -{ - uid_t uid = 0; - if (pkgmgr_installer_info_get_target_uid(&uid) < 0) { - _ERR("Failed to get UID"); - return false; - } - - pkgmgrinfo_pkginfo_h handle; - int ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgId.c_str(), uid, &handle); - if (ret != PMINFO_R_OK) { - _ERR("Failed to get pkg info"); - return false; - } - - bool isDotnetAppType = false; - auto dotnetAppCounter = [] (pkgmgrinfo_appinfo_h handle, void *userData) -> int { - char* type = nullptr; - bool* dotnet = static_cast(userData); - if (pkgmgrinfo_appinfo_get_apptype(handle, &type) != PMINFO_R_OK) { - _ERR("Failed to get app type : %s", type); - return -1; - } - if (strcmp(type, "dotnet") == 0) { - *dotnet = true; - } - return 0; - }; - - if (pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_ALL_APP, dotnetAppCounter, &isDotnetAppType, uid) != PMINFO_R_OK) { - _ERR("Failed to get list of app in pkg : %s", pkgId.c_str()); - pkgmgrinfo_pkginfo_destroy_pkginfo(handle); - return false; - } - - pkgmgrinfo_pkginfo_destroy_pkginfo(handle); - return isDotnetAppType; -} - -void SHA256(std::string path, char outputBuffer[65]) -{ - FILE *file = fopen(path.c_str(), "rb"); - if (!file) { - return; - } - - unsigned char hash[SHA256_DIGEST_LENGTH]; - SHA256_CTX sha256; - SHA256_Init(&sha256); - int bytesRead = 0; - const int bufSize = 32768; - char *buffer = (char*)malloc(bufSize); - if (!buffer) { - fclose(file); - return; - } - - while ((bytesRead = fread(buffer, 1, bufSize, file))) { - SHA256_Update(&sha256, buffer, bytesRead); - } - SHA256_Final(hash, &sha256); - for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) { - snprintf(outputBuffer + (i * 2), 3, "%02x", hash[i]); - } - outputBuffer[64] = 0; - - fclose(file); - free(buffer); -} - -int copyNCreateSymlink(std::string tac_version_dir, std::string np, bool is_create_tac_dir) -{ - uid_t uid = 0; - if (pkgmgr_installer_info_get_target_uid(&uid) < 0) { - _ERR("Failed to get UID"); - return -1; - } - - std::string tac_dir = concatPath(binPath, TAC_SYMLINK_SUB_DIR); - if (!createDir(tac_dir)) { - _ERR("Cannot create directory: %s", tac_dir.c_str()); - return -1; - } - - for (auto& npAssemblySha : nugetPackagesAssembliesSha) { - std::string nuget_package_assembly = npAssemblySha.substr(0, npAssemblySha.rfind(':')); - std::string nuget_package = nuget_package_assembly.substr(0, nuget_package_assembly.rfind(':')); - std::string assembly = nuget_package_assembly.substr(nuget_package_assembly.rfind(':') + 1); - if (!strcmp(nuget_package.c_str(), np.c_str())) { - if (bf::exists(concatPath(binPath, assembly))) { - if (is_create_tac_dir) { - if (!copyFile(concatPath(binPath, assembly), concatPath(tac_version_dir, assembly))) { - _ERR("Failed to copy of %s", assembly.c_str()); - return -1; - } - } - bf::create_symlink(concatPath(tac_version_dir, assembly), concatPath(tac_dir, assembly)); - if (lchown(concatPath(tac_dir, assembly).c_str(), uid, 0)) { - _ERR("Failed to change owner of: %s", concatPath(tac_dir, assembly).c_str()); - return -1; - } - if (!removeFile(concatPath(binPath, assembly))) { - _ERR("Failed to remove of %s", assembly.c_str()); - return -1; - } - } - } - } - return 0; -} - -void depsJsonCheck() { - for (auto& npAssembly : depsJsonParser(rootPath, execName, getTPA())) { - std::string nugetPackage = npAssembly.substr(0, npAssembly.rfind(':')); - std::string assemblyName = npAssembly.substr(npAssembly.rfind(':') + 1); - tacDB.push_back(nugetPackage); - char buffer[65] = {0}; - SHA256(concatPath(binPath, assemblyName), buffer); - nugetPackagesAssembliesSha.push_back(nugetPackage + ":" + assemblyName + ":" + buffer); - _INFO("Assembly : [%s] / SHA256 : [%s]", assemblyName.c_str(), buffer); - } - std::sort(tacDB.begin(), tacDB.end()); - tacDB.erase(unique(tacDB.begin(), tacDB.end()), tacDB.end()); -} - extern "C" int PKGMGR_MDPARSER_PLUGIN_INSTALL(const char *pkgId, const char *appId, GList *list) { - _DBG("[===== PKGMGR_MDPARSER_PLUGIN_INSTALL =====]"); - _INFO("PackageID : %s", pkgId); - - if (!appTypeCheck(std::string(pkgId))) { - _INFO("App type is not dotnet"); - return 0; - } - if (getExecName(std::string(pkgId), execName) < 0) { - return 0; - } - if (getRootPath(std::string(pkgId), rootPath) < 0) { + if (pkgId == NULL || appId == NULL) { return 0; - } else { - binPath = concatPath(rootPath, "bin"); - } - if (metadataCheck(list)) { - depsJsonCheck(); } - - status = "install"; - tac_db = dbCreate(TAC_APP_LIST_DB); - if (!tac_db) { - _ERR("Sqlite create error"); - return 0; - } - - if (tacDB.empty()) { - _INFO("Not exist .deps.json file"); - return 0; - } - - for (auto& np : tacDB) { - std::string tac_name = np.substr(0, np.find('/')); - std::string tac_version = np.substr(np.rfind('/') + 1); - _INFO("TAC name : %s", tac_name.c_str()); - _INFO("TAC version : %s", tac_version.c_str()); - - std::string tac_version_dir = concatPath(__TAC_DIR, np); - std::string sha256_info = concatPath(tac_version_dir, TAC_SHA_256_INFO); - if (!bf::exists(tac_version_dir)) { - _INFO("Create tac_version_dir [%s]", tac_version_dir.c_str()); - if (!createDir(tac_version_dir)) { - _ERR("Cannot create directory: %s", tac_version_dir.c_str()); - return 0; - } - createDirectories.push_back(tac_version_dir); - std::ofstream ofs(sha256_info, std::ios::app); - int assembly_count = 0; - for (auto& npAssemblySha : nugetPackagesAssembliesSha) { - std::string nuget_package_assembly = npAssemblySha.substr(0, npAssemblySha.rfind(':')); - std::string nuget_package = nuget_package_assembly.substr(0, nuget_package_assembly.rfind(':')); - std::string assembly = nuget_package_assembly.substr(nuget_package_assembly.rfind(':') + 1); - std::string sha = npAssemblySha.substr(npAssemblySha.rfind(':') + 1); - if (!strcmp(nuget_package.c_str(), np.c_str())) { - ofs << assembly << ":" << sha << std::endl; - assembly_count++; - } - } - ofs << assembly_count << std::endl; - ofs.close(); - - if (copyNCreateSymlink(tac_version_dir, np, true) < 0) { - _ERR("Failed to create symlink"); - return -1; - } - std::string sql = "INSERT INTO TAC (PKGID, NUGET, NAME, VERSION) " \ - "VALUES ('" + std::string(pkgId) + "', '" + np + "', '" + tac_name + "', '" + tac_version + "');"; - dbInsert(tac_db, TAC_APP_LIST_DB, sql); - } else { - _INFO("Exists tac_version_dir [%s]", tac_version_dir.c_str()); - int compare_count = 0; - int assembly_count = 0; - std::string sha256_count = "0"; - for (auto& npAssemblySha : nugetPackagesAssembliesSha) { - std::string nuget_package_assembly = npAssemblySha.substr(0, npAssemblySha.rfind(':')); - std::string nuget_package = nuget_package_assembly.substr(0, nuget_package_assembly.rfind(':')); - std::string assembly = nuget_package_assembly.substr(nuget_package_assembly.rfind(':') + 1); - std::string sha = npAssemblySha.substr(npAssemblySha.rfind(':') + 1); - if (!strcmp(nuget_package.c_str(), np.c_str())) { - assembly_count++; - std::ifstream ifs(sha256_info); - std::string get_str; - if (ifs.is_open()) { - while (getline(ifs, get_str)) { - if (!strcmp(get_str.c_str(), (assembly + ":" + sha).c_str())) { - compare_count++; - } - sha256_count = get_str; - } - ifs.close(); - } - } - } - if (!strcmp(std::to_string(assembly_count).c_str(), std::to_string(compare_count).c_str()) && - !strcmp(std::to_string(assembly_count).c_str(), sha256_count.c_str())) { - _INFO("Same nuget : %s", np.c_str()); - if (copyNCreateSymlink(tac_version_dir, np, false) < 0) { - _ERR("Failed to create symlink"); - return -1; - } - std::string sql = "INSERT INTO TAC (PKGID, NUGET, NAME, VERSION) " \ - "VALUES ('" + std::string(pkgId) + "', '" + np + "', '" + tac_name + "', '" + tac_version + "');"; - dbInsert(tac_db, TAC_APP_LIST_DB, sql); - } else { - _INFO("Different nuget : %s", np.c_str()); - } - } - if (!bf::exists(sha256_info)) { - if(!removeAll(tac_version_dir)) { - _ERR("Failed to remove of %s", tac_version_dir.c_str()); - } - } - } - return 0; -} - -static int sqliteCb(void *count, int argc, char **argv, char **colName) { - int *c = (int*)count; - *c = atoi(argv[0]); - return 0; -} - -int updateTacDB(const char *pkgId) -{ - for (auto& unp : updateTac) { - int count = -1; - std::string sql = "SELECT COUNT(NUGET) FROM TAC WHERE NUGET = '" + unp + "';"; - int ret = sqlite3_exec(tac_db, sql.c_str(), sqliteCb, &count, NULL); - if (ret != SQLITE_OK) { - _ERR("Sqlite select error"); - return -1; - } - if (count == 0) { - std::string tac_version_dir_prev = concatPath(__TAC_DIR, unp); - std::string tac_version_dir_backup = tac_version_dir_prev + ".bck"; - if (!copyDir(tac_version_dir_prev, tac_version_dir_backup)) { - _ERR("Failed to copy of %s to %s", tac_version_dir_prev.c_str(), tac_version_dir_backup.c_str()); - return -1; - } - if (!removeAll(tac_version_dir_prev)) { - _ERR("Failed to remove of %s", tac_version_dir_prev.c_str()); - return -1; - } - } - } - return 0; + return tacInstall(std::string(pkgId), TAC_STATE_INSTALL); } extern "C" int PKGMGR_MDPARSER_PLUGIN_UPGRADE(const char *pkgId, const char *appId, GList *list) { - _DBG("[===== PKGMGR_MDPARSER_PLUGIN_UPGRADE =====]"); - _INFO("PackageID : %s", pkgId); - - if (!appTypeCheck(std::string(pkgId))) { - _INFO("App type is not dotnet"); + if (pkgId == NULL || appId == NULL) { return 0; } - if (getExecName(std::string(pkgId), execName) < 0) { - return 0; - } - if (getRootPath(std::string(pkgId), rootPath) < 0) { - return 0; - } else { - binPath = concatPath(rootPath, "bin"); - } - if (!strcmp("removed", status.c_str())) { - _INFO("Skipped to parse of deps.json"); - } else { - if (metadataCheck(list)) { - depsJsonCheck(); - } - } - - status = "update"; - tac_db = dbCreate(TAC_APP_LIST_DB); - if (!tac_db) { - _ERR("Sqlite open error"); - return 0; - } - - if (tacDB.empty()) { - std::string sql = "DELETE FROM TAC WHERE PKGID = '" + std::string(pkgId) + "';"; - dbDelete(tac_db, TAC_APP_LIST_DB, sql); - if (updateTacDB(pkgId) < 0) { - return -1; - } - } else { - std::string sql = "SELECT * FROM TAC WHERE PKGID = '" + std::string(pkgId) + "';"; - updateTac = dbSelect(tac_db, TAC_APP_LIST_DB, sql); - - for (auto& np : tacDB) { - std::string tac_name = np.substr(0, np.find('/')); - std::string tac_version = np.substr(np.rfind('/') + 1); - _INFO("TAC name : %s", tac_name.c_str()); - _INFO("TAC version : %s", tac_version.c_str()); - - std::string tac_version_dir = concatPath(__TAC_DIR, np); - std::string sha256_info = concatPath(tac_version_dir, TAC_SHA_256_INFO); - if (!bf::exists(tac_version_dir)) { - _INFO("Create tac_version_dir [%s]", tac_version_dir.c_str()); - if (!createDir(tac_version_dir)) { - _ERR("Cannot create directory: %s", tac_version_dir.c_str()); - return 0; - } - createDirectories.push_back(tac_version_dir); - std::ofstream ofs(sha256_info, std::ios::app); - int assembly_count = 0; - for (auto& npAssemblySha : nugetPackagesAssembliesSha) { - std::string nuget_package_assembly = npAssemblySha.substr(0, npAssemblySha.rfind(':')); - std::string nuget_package = nuget_package_assembly.substr(0, nuget_package_assembly.rfind(':')); - std::string assembly = nuget_package_assembly.substr(nuget_package_assembly.rfind(':') + 1); - std::string sha = npAssemblySha.substr(npAssemblySha.rfind(':') + 1); - if (!strcmp(nuget_package.c_str(), np.c_str())) { - ofs << assembly << ":" << sha << std::endl; - assembly_count++; - } - } - ofs << assembly_count << std::endl; - ofs.close(); - if (copyNCreateSymlink(tac_version_dir, np, true) < 0) { - _ERR("Failed to create symlink"); - return -1; - } - - int count = -1; - sql = "SELECT COUNT(NUGET) FROM TAC WHERE PKGID = '" + std::string(pkgId) + "' AND NAME = '" + tac_name + "';"; - int ret = sqlite3_exec(tac_db, sql.c_str(), sqliteCb, &count, NULL); - if (ret != SQLITE_OK) { - _ERR("Sqlite select error"); - return -1; - } - if (count == 1) { - sql = "UPDATE TAC SET NAME = '" + tac_name + "', VERSION = '" + tac_version + "', NUGET = '" + np + "' WHERE PKGID = '" + std::string(pkgId) + "' AND NAME = '" + tac_name + "';"; - dbUpdate(tac_db, TAC_APP_LIST_DB, sql); - } else if (count == 0) { - sql = "INSERT INTO TAC (PKGID, NUGET, NAME, VERSION) " \ - "VALUES ('" + std::string(pkgId) + "', '" + np + "', '" + tac_name + "', '" + tac_version + "');"; - dbInsert(tac_db, TAC_APP_LIST_DB, sql); - } - } else { - _INFO("Exists tac_version_dir [%s]", tac_version_dir.c_str()); - int compare_count = 0; - int assembly_count = 0; - std::string sha256_count = "0"; - for (auto& npAssemblySha : nugetPackagesAssembliesSha) { - std::string nuget_package_assembly = npAssemblySha.substr(0, npAssemblySha.rfind(':')); - std::string nuget_package = nuget_package_assembly.substr(0, nuget_package_assembly.rfind(':')); - std::string assembly = nuget_package_assembly.substr(nuget_package_assembly.rfind(':') + 1); - std::string sha = npAssemblySha.substr(npAssemblySha.rfind(':') + 1); - if (!strcmp(nuget_package.c_str(), np.c_str())) { - assembly_count++; - std::ifstream ifs(sha256_info); - std::string get_str; - if (ifs.is_open()) { - while (getline(ifs, get_str)) { - if (!strcmp(get_str.c_str(), (assembly + ":" + sha).c_str())) { - compare_count++; - } - sha256_count = get_str; - } - ifs.close(); - } - } - } - - if (!strcmp(std::to_string(assembly_count).c_str(), std::to_string(compare_count).c_str()) && - !strcmp(std::to_string(assembly_count).c_str(), sha256_count.c_str())) { - _INFO("Same nuget : %s", np.c_str()); - if (copyNCreateSymlink(tac_version_dir, np, false) < 0) { - _ERR("Failed to create symlink"); - return -1; - } - - int count = -1; - std::string sql = "SELECT COUNT(NUGET) FROM TAC WHERE PKGID = '" + std::string(pkgId) + "' AND NAME = '" + tac_name + "';"; - int ret = sqlite3_exec(tac_db, sql.c_str(), sqliteCb, &count, NULL); - if (ret != SQLITE_OK) { - _ERR("Sqlite select error"); - return -1; - } - if (count == 1) { - sql = "UPDATE TAC SET NAME = '" + tac_name + "', VERSION = '" + tac_version + "', NUGET = '" + np + "' WHERE PKGID = '" + std::string(pkgId) + "' AND NAME = '" + tac_name + "';"; - dbUpdate(tac_db, TAC_APP_LIST_DB, sql); - } else if (count == 0) { - sql = "INSERT INTO TAC (PKGID, NUGET, NAME, VERSION) " \ - "VALUES ('" + std::string(pkgId) + "', '" + np + "', '" + tac_name + "', '" + tac_version + "');"; - dbInsert(tac_db, TAC_APP_LIST_DB, sql); - } - } else { - _INFO("Different nuget : %s", np.c_str()); - } - } - if (!bf::exists(sha256_info)) { - if(!removeAll(tac_version_dir)) { - _ERR("Failed to remove of %s", tac_version_dir.c_str()); - } - } - } - for (auto& unp : updateTac) { - bool isExits = false; - for (auto& np : tacDB) { - if (!strcmp(unp.c_str(), np.c_str())) { - isExits = true; - break; - } - } - if (!isExits) { - std::string sql = "DELETE FROM TAC WHERE PKGID = '" + std::string(pkgId) + "' AND NUGET = '" + unp + "';"; - dbDelete(tac_db, TAC_APP_LIST_DB, sql); - } - } - if (updateTacDB(pkgId) < 0) { - return -1; - } - } - return 0; + return tacUpgrade(std::string(pkgId), TAC_STATE_UPGRADE); } extern "C" int PKGMGR_MDPARSER_PLUGIN_UNINSTALL(const char *pkgId, const char *appId, GList *list) { - _DBG("[===== PKGMGR_MDPARSER_PLUGIN_UNINSTALL =====]"); - _INFO("PackageID : %s", pkgId); - - status = "uninstall"; - tac_db = dbOpen(TAC_APP_LIST_DB); - if (!tac_db) { - _ERR("Sqlite open error"); + if (pkgId == NULL || appId == NULL) { return 0; } - - std::string sql = "SELECT * FROM TAC WHERE PKGID = '" + std::string(pkgId) + "';"; - updateTac = dbSelect(tac_db, TAC_APP_LIST_DB, sql); - - sql = "DELETE FROM TAC WHERE PKGID = '" + std::string(pkgId) + "';"; - dbDelete(tac_db, TAC_APP_LIST_DB, sql); - - if (updateTacDB(pkgId) < 0) { - return -1; - } - return 0; + return tacUninstall(std::string(pkgId), TAC_STATE_UNINSTALL); } extern "C" int PKGMGR_MDPARSER_PLUGIN_REMOVED(const char *pkgId, const char *appId, GList *list) { - _DBG("[===== PKGMGR_MDPARSER_PLUGIN_REMOVED =====]"); - _INFO("PackageID : %s", pkgId); - - status = "removed"; - - return PKGMGR_MDPARSER_PLUGIN_UPGRADE(pkgId, appId, list); -} - -void cleanStep(std::string tac) -{ - std::string current_tac = concatPath(__TAC_DIR, tac.substr(0, tac.find('/'))); - try { - for (auto& bck : bf::recursive_directory_iterator(current_tac)) { - std::string bck_path = bck.path().string(); - if (bf::is_directory(bck_path) && strstr(bck_path.c_str(), ".bck") != NULL) { - if (!removeAll(bck_path)) { - _ERR("Failed to remove of %s", bck_path.c_str()); - } - break; - } - } - - bool isExist = false; - for (auto& bck : bf::recursive_directory_iterator(current_tac)) { - std::string bck_path = bck.path().string(); - if (bf::exists(bck_path) && bf::is_directory(bck_path) && strstr(bck_path.c_str(), ".bck") == NULL) { - isExist = true; - break; - } - } - if (!isExist) { - if (!removeAll(current_tac)) { - _ERR("Failed to remove of %s", current_tac.c_str()); - } - } - } catch (const bf::filesystem_error& error) { - _ERR("Failed to recursive directory: %s", error.what()); - return; - } -} - -void install_Clean() -{ - return; -} - -void unInstall_Clean() -{ - for (auto& unp : updateTac) { - cleanStep(unp); + if (pkgId == NULL || appId == NULL) { + return 0; } + return tacRemoved(std::string(pkgId)); } -void update_Clean() +extern "C" int PKGMGR_MDPARSER_PLUGIN_UNDO(const char *pkgId, const char *appId, GList *list) { - if (!tacDB.empty()) { - for (auto& np : tacDB) { - cleanStep(np); - } + if (pkgId == NULL || appId == NULL) { + return 0; } - unInstall_Clean(); + return tacUndo(std::string(pkgId)); } extern "C" int PKGMGR_MDPARSER_PLUGIN_CLEAN(const char *pkgId, const char *appId, GList *list) { - _DBG("[===== PKGMGR_MDPARSER_PLUGIN_CLEAN =====]"); - _INFO("PackageID : %s", pkgId); - - if (tac_db) { - dbClose(tac_db); - tac_db = NULL; - } - if (!strcmp("install", status.c_str())) { - install_Clean(); - } else if (!strcmp("update", status.c_str())) { - update_Clean(); - } else if (!strcmp("uninstall", status.c_str())) { - unInstall_Clean(); - } - return 0; -} - -void undoStep(std::string tac) -{ - std::string current_tac = concatPath(__TAC_DIR, tac.substr(0, tac.find('/'))); - try { - for (auto& bck : bf::recursive_directory_iterator(current_tac)) { - std::string bck_path = bck.path().string(); - if (bf::is_directory(bck_path) && strstr(bck_path.c_str(), ".bck") != NULL) { - if (!moveFile(bck_path, bck_path.substr(0, bck_path.rfind(".bck")))) { - _ERR("Failed to move %s", bck_path.c_str()); - } - break; - } - } - } catch (const bf::filesystem_error& error) { - _ERR("Failed to recursive directory: %s", error.what()); - return; - } -} - -void install_Undo() -{ - for (auto& cd : createDirectories) { - if (!removeAll(cd)) { - _ERR("Failed to remove of %s", cd.c_str()); - } - } -} - -void unInstall_Undo() -{ - for (auto& unp : updateTac) { - undoStep(unp); - } -} - -void update_Undo() -{ - install_Undo(); - if (!tacDB.empty()) { - for (auto& np : tacDB) { - undoStep(np); - } - } - unInstall_Undo(); -} - -extern "C" int PKGMGR_MDPARSER_PLUGIN_UNDO(const char *pkgId, const char *appId, GList *list) -{ - _DBG("[===== PKGMGR_MDPARSER_PLUGIN_UNDO =====]"); - _INFO("PackageID : %s", pkgId); - - if (tac_db) { - dbRollback(tac_db); - tac_db = NULL; - } - if (!strcmp("install", status.c_str())) { - install_Undo(); - } else if (!strcmp("update", status.c_str())) { - update_Undo(); - } else if (!strcmp("uninstall", status.c_str())) { - unInstall_Undo(); + if (pkgId == NULL || appId == NULL) { + return 0; } - return 0; + return tacClean(std::string(pkgId)); }