#include <cstring>
#include <vector>
-#include <sstream>
#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;
- }
- tag = g_list_next(tag);
+ // Can be multiple apps in one package
+ if (aotPluginInstalled) {
+ _INFO("AOT plugin already installed");
+ return 0;
}
+ aotPluginInstalled = true;
- if (mdValue) {
- NiCommonOption option = {std::string(), std::string(), std::string()};
- if (initNICommon(&option) < 0) {
- _ERR("Fail to initialize NI Common");
- return -1;
+ int skipOpt = false;
+ if (!pkgmgr_installer_info_get_skip_optimization(&skipOpt)) {
+ if (skipOpt) {
+ _DBG("Skip dotnet AOT");
+ return 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) {
+ _DBG("Prefer dotnet application AOT set TRUE");
- if (createNiUnderPkgRoot(pkgId, false) != 0) {
- _ERR("Failed to get root path from [%s]", pkgId);
+ if (initNICommon() != NI_ERROR_NONE) {
+ _ERR("Fail to initialize NI Common");
return -1;
- } else {
- _INFO("Complete make application to native image");
}
- std::string pkgRoot;
- if (getRootPath(pkgId, pkgRoot) < 0) {
- fprintf(stderr, "Failed to get root path from [%s]\n", pkgId);
+ if (createNIUnderPkgRoot(pkgId, 0) != 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 -1;
- }
- for (auto& symlinkAssembly : bf::recursive_directory_iterator(bf::path(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]\n", 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);
- fprintf(stderr, "%s symbolic link file generated successfully.\n", 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;
}
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;
}