2 * Copyright (c) 2016 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.
24 #include "plugin_manager.h"
27 static const char* __TIZEN_API_PATH_KEY = "db/dotnet/tizen_api_path";
30 #define __STR(x) __XSTR(x)
31 static const char* __DEVICE_API_DIR = __STR(DEVICE_API_DIR);
32 static const char* __RUNTIME_DIR = __STR(RUNTIME_DIR);
36 typedef struct DllPath {
37 std::string runtime_dir;
38 std::string tizenfx_dir;
39 std::string tizenfx_ref_dir;
40 std::vector <std::string>extra_dirs;
43 static DllPath* __dllPath = nullptr;
44 static std::string __tpa;
45 bool initializedPathManager = false;
47 // on success, return 0. otherwise return -1.
48 int initializePathManager(const std::string& runtimeDir, const std::string& tizenFXDir, const std::string& extraDir)
50 if (initializedPathManager) {
51 _INFO("Path manager already initialized");
55 __dllPath = new DllPath();
57 _ERR("fail to allocate memory for dll path structure\n");
61 if (!runtimeDir.empty()) {
62 __dllPath->runtime_dir = getAbsolutePath(runtimeDir);
64 __dllPath->runtime_dir = getAbsolutePath(__RUNTIME_DIR);
67 if (!tizenFXDir.empty()) {
68 __dllPath->tizenfx_dir = getAbsolutePath(tizenFXDir);
70 char* tmp = vconf_get_str(__TIZEN_API_PATH_KEY);
72 __dllPath->tizenfx_dir = std::string(tmp);
73 _DBG("Device API Directory is set by vconf : %s", tmp);
76 __dllPath->tizenfx_dir = getAbsolutePath(__DEVICE_API_DIR);
80 __dllPath->tizenfx_ref_dir = __dllPath->tizenfx_dir + "/ref";
82 // ":" seperated extra directories
83 if (!extraDir.empty()) {
84 splitPath(extraDir, __dllPath->extra_dirs);
86 char* extraPath = pluginGetDllPath();
88 splitPath(extraPath, __dllPath->extra_dirs);
92 _INFO("Path manager initialize success");
94 initializedPathManager = true;
98 void finalizePathManager()
105 initializedPathManager = false;
108 std::string getRuntimeDir()
110 return __dllPath->runtime_dir;
113 std::string getTizenFXDir()
115 return __dllPath->tizenfx_dir;
118 std::string getTizenFXRefDir()
120 return __dllPath->tizenfx_ref_dir;
123 std::vector <std::string> getExtraDirs()
125 return __dllPath->extra_dirs;
128 static std::string getPlatformTPA()
130 std::string platform_tpa;
132 if (isFile(PLATFORM_TPA_CACHE)) {
133 _INFO("platform tpa cache found.");
134 std::ifstream cacheFile;
135 cacheFile.open(PLATFORM_TPA_CACHE);
136 std::getline(cacheFile, platform_tpa);
139 std::vector<std::string> tpaDirs = { getRuntimeDir(), getTizenFXDir(), getTizenFXRefDir() };
140 addAssembliesFromDirectories(tpaDirs, platform_tpa);
146 static std::string getPluginTPA()
148 std::string plugin_tpa;
150 char* plugin_tpa_list = pluginGetTPA();
151 if (plugin_tpa_list) {
152 _INFO("plugin TPA list found. use TPA list for plugin");
153 plugin_tpa = plugin_tpa_list;
154 } else if (!__dllPath->extra_dirs.empty()) {
155 _INFO("plugin extra directory found. use plugin extra directroy for TPA");
156 addAssembliesFromDirectories(__dllPath->extra_dirs, plugin_tpa);
164 if (!__tpa.empty()) {
168 if (__dllPath == NULL) {
169 return std::string("");
172 return getPlatformTPA() + ":" + getPluginTPA();