Revert PR #509, #510 (#513)
[platform/core/dotnet/launcher.git] / NativeLauncher / installer-plugin / prefer_dotnet_aot_plugin.cc
index 470468e..91928a7 100644 (file)
@@ -20,7 +20,8 @@
 
 #include <cstring>
 #include <vector>
-#include <sstream>
+
+#include <vconf.h>
 #include <glib.h>
 #include <pkgmgr_installer_info.h>
 
 #endif
 #define LOG_TAG "DOTNET_INSTALLER_PLUGIN"
 
-typedef struct Metadata {
-       const char *key;
-       const char *value;
-} Metadata;
+bool aotPluginInstalled = false;
+bool aotPluginFinished = false;
 
 extern "C" int PKGMGR_MDPARSER_PLUGIN_INSTALL(const char *pkgId, const char *appId, GList *list)
 {
-       GList *tag = NULL;
-       bool mdValue = false;
-       Metadata *mdInfo = NULL;
-       tag = g_list_first(list);
-       while (tag) {
-               mdInfo = (Metadata*)tag->data;
-               if (strcmp(mdInfo->key, AOT_METADATA_KEY) == 0 && strcmp(mdInfo->value, METADATA_VALUE) == 0) {
-                       _DBG("Prefer dotnet application AOT set TRUE");
-                       mdValue = true;
+       // Can be multiple apps in one package
+       if (aotPluginInstalled) {
+               _INFO("AOT plugin already installed");
+               return 0;
+       }
+       aotPluginInstalled = true;
+
+       int skipOpt = false;
+       if (!pkgmgr_installer_info_get_skip_optimization(&skipOpt)) {
+               if (skipOpt) {
+                       _DBG("Skip dotnet AOT");
+                       return 0;
                }
-               tag = g_list_next(tag);
        }
 
-       if (mdValue) {
-               NiCommonOption option = {std::string(), std::string(), std::string()};
-               if (initNICommon(&option) < 0) {
+       std::string metaValue = getMetadataValue(std::string(pkgId), AOT_METADATA_KEY);
+       if (metaValue.empty()) {
+               _ERR("Failed to get metadata from [%s]", pkgId);
+               return -1;
+       }
+
+       if (metaValue == METADATA_VALUE_TRUE) {
+               _DBG("Prefer dotnet application AOT set TRUE");
+
+               if (initNICommon() != NI_ERROR_NONE) {
                        _ERR("Fail to initialize NI Common");
                        return -1;
                }
 
-               if (createNiUnderPkgRoot(pkgId, false) != NI_ERROR_NONE) {
-                       _ERR("Failed to get root path from [%s]", pkgId);
+               NIOption* opt = getNIOption();
+               if (opt == nullptr) {
+                       _ERR("Fail to create option structure.");
                        return -1;
-               } else {
-                       _INFO("Complete make application to native image");
                }
 
-               std::string pkgRoot;
-               if (getRootPath(pkgId, pkgRoot) < 0) {
-                       _ERR("Failed to get root path from [%s]", pkgId);
-                       return 0;
+               if (createNIUnderPkgRoot(pkgId, opt) != NI_ERROR_NONE) {
+                       _ERR("Failed to generate application to native image [%s]", pkgId);
+                       return -1;
                }
 
-               std::string binDir = concatPath(pkgRoot, "bin");
-               std::string tacDir = concatPath(binDir, TAC_SYMLINK_SUB_DIR);
-               if (bf::exists(tacDir)) {
-                       uid_t uid = 0;
-                       if (pkgmgr_installer_info_get_target_uid(&uid) < 0) {
-                               _ERR("Failed to get UID");
-                               return 0;
-                       }
-                       for (auto& symlinkAssembly : bf::recursive_directory_iterator(tacDir)) {
-                               std::string symPath = symlinkAssembly.path().string();
-                               if (!isNativeImage(symPath)) {
-                                       std::string originPath = bf::read_symlink(symPath).string();
-                                       std::string originNiPath = originPath.substr(0, originPath.rfind(".dll")) + ".ni.dll";
-                                       if (!bf::exists(originNiPath)) {
-                                               if(createNiDll(originPath, false) != NI_ERROR_NONE) {
-                                                       _ERR("Failed to create NI file [%s]", originPath.c_str());
-                                                       return -1;
-                                               }
-                                       }
-                                       std::string setNiPath = symPath.substr(0, symPath.rfind(".dll")) + ".ni.dll";
-                                       if (!bf::exists(setNiPath)) {
-                                               bf::create_symlink(originNiPath, setNiPath);
-                                               _INFO("%s symbolic link file generated successfully.", setNiPath.c_str());
-                                               if (lchown(setNiPath.c_str(), uid, 0)) {
-                                                       _ERR("Failed to change owner of: %s", setNiPath.c_str());
-                                                       return -1;
-                                               }
-                                       }
-                               }
-                       }
-               }
+               _INFO("Complete make application to native image");
        }
        return 0;
 }
@@ -121,10 +97,26 @@ extern "C" int PKGMGR_MDPARSER_PLUGIN_REMOVED(const char *pkgId, const char *app
 
 extern "C" int PKGMGR_MDPARSER_PLUGIN_CLEAN(const char *pkgId, const char *appId, GList *list)
 {
+       // Can be multiple apps in one package
+       if (aotPluginFinished) {
+               _INFO("AOT plugin already finished(CLEAN)");
+               return 0;
+       }
+       aotPluginFinished = true;
+
+       finalizeNICommon();
        return 0;
 }
 
 extern "C" int PKGMGR_MDPARSER_PLUGIN_UNDO(const char *pkgId, const char *appId, GList *list)
 {
+       // Can be multiple apps in one package
+       if (aotPluginFinished) {
+               _INFO("AOT plugin already finished(UNDO)");
+               return 0;
+       }
+       aotPluginFinished = true;
+
+       finalizeNICommon();
        return 0;
 }