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 = absolutePath(runtimeDir);
64 __dllPath->runtime_dir = absolutePath(__RUNTIME_DIR);
67 if (!tizenFXDir.empty()) {
68 __dllPath->tizenfx_dir = absolutePath(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);
75 __dllPath->tizenfx_dir = absolutePath(__DEVICE_API_DIR);
79 __dllPath->tizenfx_ref_dir = __dllPath->tizenfx_dir + "/ref";
81 // ":" seperated extra directories
82 if (!extraDir.empty()) {
83 splitPath(extraDir, __dllPath->extra_dirs);
85 char* extraPath = pluginGetDllPath();
87 splitPath(extraPath, __dllPath->extra_dirs);
91 _INFO("Path manager initialize success");
93 initializedPathManager = true;
97 void finalizePathManager()
104 initializedPathManager = false;
107 std::string getRuntimeDir()
109 return __dllPath->runtime_dir;
112 std::string getTizenFXDir()
114 return __dllPath->tizenfx_dir;
117 std::string getTizenFXRefDir()
119 return __dllPath->tizenfx_ref_dir;
122 std::vector <std::string> getExtraDirs()
124 return __dllPath->extra_dirs;
127 static std::string getPlatformTPA()
129 std::string platform_tpa;
131 if (isFileExist(PLATFORM_TPA_CACHE)) {
132 _INFO("platform tpa cache found.");
133 std::ifstream cacheFile;
134 cacheFile.open(PLATFORM_TPA_CACHE);
135 std::getline(cacheFile, platform_tpa);
138 std::vector<std::string> tpaDir;
139 tpaDir.push_back(getRuntimeDir());
140 tpaDir.push_back(getTizenFXDir());
141 tpaDir.push_back(getTizenFXRefDir());
142 assembliesInDirectory(tpaDir, platform_tpa);
148 static std::string getPluginTPA()
150 std::string plugin_tpa;
152 char* plugin_tpa_list = pluginGetTPA();
153 if (plugin_tpa_list) {
154 _INFO("plugin TPA list found. use TPA list for plugin");
155 plugin_tpa = plugin_tpa_list;
156 } else if (!__dllPath->extra_dirs.empty()){
157 _INFO("plugin extra directory found. use plugin extra directroy for TPA");
158 assembliesInDirectory(__dllPath->extra_dirs, plugin_tpa);
166 if (!__tpa.empty()) {
170 if (__dllPath == NULL) {
171 return std::string("");
174 return getPlatformTPA() + ":" + getPluginTPA();