Code cleanup (#251)
[platform/core/dotnet/launcher.git] / NativeLauncher / installer-plugin / prefer_dotnet_aot_plugin.cc
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 #include "ni_common.h"
18 #include "log.h"
19 #include "utils.h"
20
21 #include <cstring>
22 #include <vector>
23 #include <sstream>
24 #include <glib.h>
25 #include <pkgmgr_installer_info.h>
26
27 #ifdef  LOG_TAG
28 #undef  LOG_TAG
29 #endif
30 #define LOG_TAG "DOTNET_INSTALLER_PLUGIN"
31
32 bool aotPluginInstalled = false;
33
34 extern "C" int PKGMGR_MDPARSER_PLUGIN_INSTALL(const char *pkgId, const char *appId, GList *list)
35 {
36         // Can be multiple apps in one package
37         if (aotPluginInstalled) {
38                 _INFO("AOT plugin already installed");
39                 return 0;
40         }
41         aotPluginInstalled = true;
42
43         int skipOpt = false;
44         if (!pkgmgr_installer_info_get_skip_optimization(&skipOpt)) {
45                 if (skipOpt) {
46                         _DBG("Skip dotnet AOT");
47                         return 0;
48                 }
49         }
50
51         std::string metaValue = getMetadataValue(std::string(pkgId), AOT_METADATA_KEY);
52         if (metaValue.empty()) {
53                 _ERR("Failed to get metadata from [%s]", pkgId);
54                 return 0;
55         }
56
57         if (metaValue == METADATA_VALUE) {
58                 _DBG("Prefer dotnet application AOT set TRUE");
59
60                 NICommonOption option = {std::string(), std::string(), std::string()};
61                 if (initNICommon(&option) < 0) {
62                         _ERR("Fail to initialize NI Common");
63                         return -1;
64                 }
65
66                 if (createNIUnderPkgRoot(pkgId, 0) != NI_ERROR_NONE) {
67                         _ERR("Failed to get root path from [%s]", pkgId);
68                         return -1;
69                 } else {
70                         _INFO("Complete make application to native image");
71                 }
72
73                 std::string rootPath = getRootPath(std::string(pkgId));
74                 if (rootPath.empty()) {
75                         _ERR("Failed to get root path from [%s]", pkgId);
76                         return -1;
77                 }
78
79                 std::string binDir = concatPath(rootPath, "bin");
80                 std::string tacDir = concatPath(binDir, TAC_SYMLINK_SUB_DIR);
81                 if (bf::exists(tacDir)) {
82                         uid_t g_uid = 0;
83                         gid_t g_gid = 0;
84                         if (pkgmgr_installer_info_get_target_uid(&g_uid) < 0) {
85                                 _ERR("Failed to get UID");
86                                 return -1;
87                         }
88                         try {
89                                 for (auto& symlinkAssembly : bf::recursive_directory_iterator(tacDir)) {
90                                         std::string symPath = symlinkAssembly.path().string();
91                                         if (!isNativeImage(symPath)) {
92                                                 std::string originPath = bf::read_symlink(symPath).string();
93                                                 std::string originNIPath = originPath.substr(0, originPath.rfind(".dll")) + ".ni.dll";
94                                                 if (!bf::exists(originNIPath)) {
95                                                         if (createNIDllUnderPkgRoot(pkgId, originPath, 0) != NI_ERROR_NONE) {
96                                                                 _ERR("Failed to create NI file [%s]", originPath.c_str());
97                                                                 return -1;
98                                                         }
99                                                 }
100                                                 std::string setNIPath = symPath.substr(0, symPath.rfind(".dll")) + ".ni.dll";
101                                                 if (!bf::exists(setNIPath)) {
102                                                         bf::create_symlink(originNIPath, setNIPath);
103                                                         _INFO("%s symbolic link file generated successfully.", setNIPath.c_str());
104                                                         if (lchown(setNIPath.c_str(), g_uid, g_gid)) {
105                                                                 _ERR("Failed to change owner of: %s", setNIPath.c_str());
106                                                                 return -1;
107                                                         }
108                                                 }
109                                         }
110                                 }
111                         } catch (const bf::filesystem_error& error) {
112                                 _ERR("File system error while interating files: %s", error.what());
113                                 return -1;
114                         }
115                 }
116         }
117         return 0;
118 }
119
120 extern "C" int PKGMGR_MDPARSER_PLUGIN_UPGRADE(const char *pkgId, const char *appId, GList *list)
121 {
122         return PKGMGR_MDPARSER_PLUGIN_INSTALL(pkgId, appId, list);
123 }
124
125 extern "C" int PKGMGR_MDPARSER_PLUGIN_UNINSTALL(const char *pkgId, const char *appId, GList *list)
126 {
127         return 0;
128 }
129
130 extern "C" int PKGMGR_MDPARSER_PLUGIN_REMOVED(const char *pkgId, const char *appId, GList *list)
131 {
132         return PKGMGR_MDPARSER_PLUGIN_UPGRADE(pkgId, appId, list);
133 }
134
135 extern "C" int PKGMGR_MDPARSER_PLUGIN_CLEAN(const char *pkgId, const char *appId, GList *list)
136 {
137         return 0;
138 }
139
140 extern "C" int PKGMGR_MDPARSER_PLUGIN_UNDO(const char *pkgId, const char *appId, GList *list)
141 {
142         return 0;
143 }