1 // Copyright 2014 Samsung Electronics Co, Ltd. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "extension_manager.h"
9 #include <dpl/log/secure_log.h>
14 #include "runtime_variable_provider.h"
22 const char kExtensionDir[] = "/usr/lib/tizen-extensions-crosswalk";
23 const char kExtensionPrefix[] = "lib";
24 const char kExtensionSuffix[] = ".so";
25 const char kExtensionMetadataSuffix[] = ".json";
29 ExtensionManager::ExtensionManager() {
32 ExtensionManager::~ExtensionManager() {
35 ExtensionManager* ExtensionManager::GetInstance() {
36 static ExtensionManager self;
40 void ExtensionManager::RegisterExtensionsByMetadata(
41 RuntimeVariableProvider* provider, const std::string& metafile_path) {
42 _D("path : [%s]", metafile_path.c_str());
43 std::ifstream metafile(metafile_path.c_str());
44 if (!metafile.is_open()) {
45 LOGE("Can't open plugin metadata file");
49 picojson::value metadata;
51 if (metadata.is<picojson::array>()) {
52 auto& plugins = metadata.get<picojson::array>();
53 for (auto plugin = plugins.begin(); plugin != plugins.end(); ++plugin) {
54 if (!plugin->is<picojson::object>())
57 std::string name = plugin->get("name").to_str();
58 std::string lib = plugin->get("lib").to_str();
59 if (lib.at(0) != '/') {
60 lib = std::string(kExtensionDir) + "/" + lib;
62 std::vector<std::string> entries;
63 auto& entry_points_value = plugin->get("entry_points");
64 if (entry_points_value.is<picojson::array>()) {
65 auto& entry_points = entry_points_value.get<picojson::array>();
66 for (auto entry = entry_points.begin(); entry != entry_points.end();
68 entries.push_back(entry->to_str());
71 LOGE("there is no entry points");
73 Extension* extension = new Extension(lib, name, entries, provider);
74 RegisterExtension(extension);
77 LOGE("Not plugin metadata");
78 _E("%s is not plugin metadata", metafile_path.c_str());
83 void ExtensionManager::RegisterExtensionsByMetadata(
84 RuntimeVariableProvider* provider) {
85 std::string extension_path(kExtensionDir);
86 extension_path.append("/");
87 extension_path.append("*");
88 extension_path.append(kExtensionMetadataSuffix);
90 LOGD("Register Extension directory");
91 _D("path : [%s]", extension_path.c_str());
94 glob(extension_path.c_str(), GLOB_TILDE, NULL, &glob_result);
95 for (unsigned int i = 0; i < glob_result.gl_pathc; ++i) {
96 RegisterExtensionsByMetadata(provider, glob_result.gl_pathv[i]);
98 if (glob_result.gl_pathc == 0) {
99 RegisterExtensionsInDirectory(provider);
104 void ExtensionManager::RegisterExtensionsInDirectory(RuntimeVariableProvider* provider) {
105 std::string extension_path(kExtensionDir);
106 extension_path.append("/");
107 extension_path.append(kExtensionPrefix);
108 extension_path.append("*");
109 extension_path.append(kExtensionSuffix);
111 LOGD("Register Extension directory");
112 _D("path : [%s]", extension_path.c_str());
115 glob(extension_path.c_str(), GLOB_TILDE, NULL, &glob_result);
116 for (unsigned int i = 0; i < glob_result.gl_pathc; ++i) {
117 Extension* extension = new Extension(glob_result.gl_pathv[i], provider);
118 if (extension->Initialize()) {
119 RegisterExtension(extension);
124 bool ExtensionManager::RegisterExtension(Extension* extension) {
125 LOGD("========== << RegisterExtension >> ENTER ==========");
129 std::string name = extension->name();
131 LOGD("Register Extension name : [%s]", name.c_str());
132 if (extension_symbols_.find(name) != extension_symbols_.end()) {
133 LOGW("Ignoring extension with name already registred. '%s'", name.c_str());
137 std::vector<std::string>& entry_points = extension->entry_points();
138 std::vector<std::string>::iterator iter;
139 for (iter = entry_points.begin(); iter != entry_points.end(); ++iter) {
140 if (extension_symbols_.find(*iter) != extension_symbols_.end()) {
141 LOGW("Ignoring extension with entry_point already registred. '%s'", (*iter).c_str());
146 for (iter = entry_points.begin(); iter != entry_points.end(); ++iter) {
147 extension_symbols_.insert(*iter);
150 extension_symbols_.insert(name);
151 extensions_[name] = extension;
153 LOGD("========== << RegisterExtension >> END ==========");