1 // Copyright 2015 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/extension_adapter.h"
9 #include "common/logger.h"
13 ExtensionAdapter::ExtensionAdapter()
14 : next_xw_extension_(1),
15 next_xw_instance_(1) {
18 ExtensionAdapter::~ExtensionAdapter() {
21 ExtensionAdapter* ExtensionAdapter::GetInstance() {
22 static ExtensionAdapter self;
26 XW_Extension ExtensionAdapter::GetNextXWExtension() {
27 return next_xw_extension_++;
30 XW_Instance ExtensionAdapter::GetNextXWInstance() {
31 return next_xw_instance_++;
34 void ExtensionAdapter::RegisterExtension(Extension* extension) {
35 XW_Extension xw_extension = extension->xw_extension_;
36 if (!(xw_extension > 0 && xw_extension < next_xw_extension_)) {
37 LOGGER(WARN) << "xw_extension (" << xw_extension << ") is invalid.";
40 if (extension_map_.find(xw_extension) == extension_map_.end())
41 extension_map_[xw_extension] = extension;
44 void ExtensionAdapter::UnregisterExtension(Extension* extension) {
45 XW_Extension xw_extension = extension->xw_extension_;
46 if (!(xw_extension > 0 && xw_extension < next_xw_extension_)) {
47 LOGGER(WARN) << "xw_extension (" << xw_extension << ") is invalid.";
50 if (extension_map_.find(xw_extension) != extension_map_.end())
51 extension_map_.erase(xw_extension);
54 void ExtensionAdapter::RegisterInstance(ExtensionInstance* instance) {
55 XW_Instance xw_instance = instance->xw_instance_;
56 if (!(xw_instance > 0 && xw_instance < next_xw_instance_)) {
57 LOGGER(WARN) << "xw_instance (" << xw_instance << ") is invalid.";
60 if (instance_map_.find(xw_instance) == instance_map_.end())
61 instance_map_[xw_instance] = instance;
64 void ExtensionAdapter::UnregisterInstance(ExtensionInstance* instance) {
65 XW_Instance xw_instance = instance->xw_instance_;
66 if (!(xw_instance > 0 && xw_instance < next_xw_instance_)) {
67 LOGGER(WARN) << "xw_instance (" << xw_instance << ") is invalid.";
70 if (instance_map_.find(xw_instance) != instance_map_.end())
71 instance_map_.erase(xw_instance);
74 const void* ExtensionAdapter::GetInterface(const char* name) {
75 if (!strcmp(name, XW_CORE_INTERFACE_1)) {
76 static const XW_CoreInterface_1 coreInterface1 = {
79 CoreRegisterInstanceCallbacks,
80 CoreRegisterShutdownCallback,
84 return &coreInterface1;
87 if (!strcmp(name, XW_MESSAGING_INTERFACE_1)) {
88 static const XW_MessagingInterface_1 messagingInterface1 = {
92 return &messagingInterface1;
95 if (!strcmp(name, XW_INTERNAL_SYNC_MESSAGING_INTERFACE_1)) {
96 static const XW_Internal_SyncMessagingInterface_1
97 syncMessagingInterface1 = {
98 SyncMessagingRegister,
99 SyncMessagingSetSyncReply
101 return &syncMessagingInterface1;
104 if (!strcmp(name, XW_INTERNAL_ENTRY_POINTS_INTERFACE_1)) {
105 static const XW_Internal_EntryPointsInterface_1 entryPointsInterface1 = {
106 EntryPointsSetExtraJSEntryPoints
108 return &entryPointsInterface1;
111 if (!strcmp(name, XW_INTERNAL_RUNTIME_INTERFACE_1)) {
112 static const XW_Internal_RuntimeInterface_1 runtimeInterface1 = {
113 RuntimeGetStringVariable
115 return &runtimeInterface1;
118 if (!strcmp(name, XW_INTERNAL_PERMISSIONS_INTERFACE_1)) {
119 static const XW_Internal_PermissionsInterface_1 permissionsInterface1 = {
120 PermissionsCheckAPIAccessControl,
121 PermissionsRegisterPermissions
123 return &permissionsInterface1;
126 LOGGER(WARN) << "Interface '" << name << "' is not supported.";
130 Extension* ExtensionAdapter::GetExtension(XW_Extension xw_extension) {
131 ExtensionAdapter* adapter = ExtensionAdapter::GetInstance();
132 ExtensionMap::iterator it = adapter->extension_map_.find(xw_extension);
133 if (it == adapter->extension_map_.end())
138 ExtensionInstance* ExtensionAdapter::GetExtensionInstance(
139 XW_Instance xw_instance) {
140 ExtensionAdapter* adapter = ExtensionAdapter::GetInstance();
141 InstanceMap::iterator it = adapter->instance_map_.find(xw_instance);
142 if (it == adapter->instance_map_.end())
147 #define CHECK(x, xw) \
149 LOGGER(WARN) << "Ignoring call. Invalid " << #xw << " = " << xw; \
153 #define RETURN_IF_INITIALIZED(x) \
154 if (x->initialized_) \
157 void ExtensionAdapter::CoreSetExtensionName(XW_Extension xw_extension,
159 Extension* extension = GetExtension(xw_extension);
160 CHECK(extension, xw_extension);
161 RETURN_IF_INITIALIZED(extension);
162 extension->name_ = name;
165 void ExtensionAdapter::CoreSetJavaScriptAPI(XW_Extension xw_extension,
166 const char* javascript_api) {
167 Extension* extension = GetExtension(xw_extension);
168 CHECK(extension, xw_extension);
169 RETURN_IF_INITIALIZED(extension);
170 extension->javascript_api_ = javascript_api;
173 void ExtensionAdapter::CoreRegisterInstanceCallbacks(XW_Extension xw_extension,
174 XW_CreatedInstanceCallback created,
175 XW_DestroyedInstanceCallback destroyed) {
176 Extension* extension = GetExtension(xw_extension);
177 CHECK(extension, xw_extension);
178 RETURN_IF_INITIALIZED(extension);
179 extension->created_instance_callback_ = created;
180 extension->destroyed_instance_callback_ = destroyed;
183 void ExtensionAdapter::CoreRegisterShutdownCallback(XW_Extension xw_extension,
184 XW_ShutdownCallback shutdown) {
185 Extension* extension = GetExtension(xw_extension);
186 CHECK(extension, xw_extension);
187 RETURN_IF_INITIALIZED(extension);
188 extension->shutdown_callback_ = shutdown;
191 void ExtensionAdapter::CoreSetInstanceData(XW_Instance xw_instance,
193 ExtensionInstance* instance = GetExtensionInstance(xw_instance);
194 CHECK(instance, xw_instance);
195 instance->instance_data_ = data;
198 void* ExtensionAdapter::CoreGetInstanceData(XW_Instance xw_instance) {
199 ExtensionInstance* instance = GetExtensionInstance(xw_instance);
201 return instance->instance_data_;
206 void ExtensionAdapter::MessagingRegister(XW_Extension xw_extension,
207 XW_HandleMessageCallback handle_message) {
208 Extension* extension = GetExtension(xw_extension);
209 CHECK(extension, xw_extension);
210 RETURN_IF_INITIALIZED(extension);
211 extension->handle_msg_callback_ = handle_message;
214 void ExtensionAdapter::MessagingPostMessage(XW_Instance xw_instance,
215 const char* message) {
216 ExtensionInstance* instance = GetExtensionInstance(xw_instance);
217 CHECK(instance, xw_instance);
218 instance->PostMessageToJS(message);
221 void ExtensionAdapter::SyncMessagingRegister(XW_Extension xw_extension,
222 XW_HandleSyncMessageCallback handle_sync_message) {
223 Extension* extension = GetExtension(xw_extension);
224 CHECK(extension, xw_extension);
225 RETURN_IF_INITIALIZED(extension);
226 extension->handle_sync_msg_callback_ = handle_sync_message;
229 void ExtensionAdapter::SyncMessagingSetSyncReply(XW_Instance xw_instance,
231 ExtensionInstance* instance = GetExtensionInstance(xw_instance);
232 CHECK(instance, xw_instance);
233 instance->SyncReplyToJS(reply);
236 void ExtensionAdapter::EntryPointsSetExtraJSEntryPoints(
237 XW_Extension xw_extension, const char** entry_points) {
238 Extension* extension = GetExtension(xw_extension);
239 CHECK(extension, xw_extension);
240 RETURN_IF_INITIALIZED(extension);
242 for (int i=0; entry_points[i]; ++i) {
243 extension->entry_points_.push_back(std::string(entry_points[i]));
247 void ExtensionAdapter::RuntimeGetStringVariable(XW_Extension xw_extension,
250 unsigned int value_len) {
251 Extension* extension = GetExtension(xw_extension);
252 CHECK(extension, xw_extension);
253 extension->GetRuntimeVariable(key, value, value_len);
256 int ExtensionAdapter::PermissionsCheckAPIAccessControl(
257 XW_Extension xw_extension, const char* api_name) {
258 Extension* extension = GetExtension(xw_extension);
260 return extension->CheckAPIAccessControl(api_name);
265 int ExtensionAdapter::PermissionsRegisterPermissions(XW_Extension xw_extension,
266 const char* perm_table) {
267 Extension* extension = GetExtension(xw_extension);
269 return extension->RegisterPermissions(perm_table);
275 #undef RETURN_IF_INITIALIZED