2 // Tizen Web Device API
3 // Copyright (c) 2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
18 #include "MultiCallbackUserData.h"
19 #include "GlobalContextManager.h"
20 #include "PlatformException.h"
21 #include "WebKitProxy.h"
30 MultiCallbackUserData::MultiCallbackUserData(JSContextRef global_ctx) :
31 m_context(global_ctx),
36 MultiCallbackUserData::MultiCallbackUserData(JSContextRef global_ctx,
38 m_context(global_ctx),
42 JSValueProtect(m_context, m_object);
46 MultiCallbackUserData::~MultiCallbackUserData()
48 if(!GlobalContextManager::getInstance()->isAliveGlobalContext(m_context)) {
49 //Remove Callback functions in Native Map
50 CallbackMapT::iterator itr;
51 for(itr = m_callbacks.begin(); itr != m_callbacks.end(); ++itr) {
53 JSValueUnprotect(m_context, itr->second);
57 //Remove Callback Object
59 JSValueUnprotect(m_context, m_object);
64 void MultiCallbackUserData::setCallback(const string &key, JSObjectRef callback)
66 // Callback Object Case
68 JSUtil::setProperty(m_context, m_object, key.c_str(), callback,
69 kJSPropertyAttributeNone);
73 // Callback function Case
74 CallbackMapT::iterator itr = m_callbacks.find(key);
75 if(itr != m_callbacks.end() && itr->second) {
76 JSValueUnprotect(m_context, itr->second);
80 JSValueProtect(m_context, callback);
83 m_callbacks[key] = callback;
87 void MultiCallbackUserData::invokeCallback(const std::string &key, int count,
90 if(!GlobalContextManager::getInstance()->isAliveGlobalContext(m_context)) {
91 LOGE("context was closed");
95 // Callback Object case
98 // Getting callback value
99 JSValueRef callbackValue = JSUtil::getProperty(m_context, m_object,
103 if(JSValueIsUndefined(m_context, callbackValue)) {
104 LOGE("There is no such callback: [%s]", key.c_str());
108 JSObjectRef callbackObject = JSUtil::JSValueToObject(m_context, callbackValue);
110 // Testing type validation
111 if(!JSObjectIsFunction(m_context, callbackObject)) {
112 LOGE("[%s] is not function", key.c_str());
116 JSValueRef exception = NULL;
117 JSObjectCallAsFunction(m_context, callbackObject, NULL, count, obj,
121 WebKitProxy::reportException(m_context, exception);
123 // check Exception in function call
124 if(exception != NULL) {
125 throw UnknownException(m_context, exception);
127 } catch(const BasePlatformException& err) {
128 LOGE("Error in Callback invoke - %s:%s", err.getName().c_str(),
129 err.getMessage().c_str());
134 // Callback function case
135 CallbackMapT::iterator itr = m_callbacks.find(key);
136 if(itr == m_callbacks.end()) {
137 LOGE("There is no such callback: [%s]", key.c_str());
142 JSValueRef exception = NULL;
143 JSObjectCallAsFunction(m_context, itr->second , NULL, count, obj, &exception);
145 WebKitProxy::reportException(m_context, exception);
148 LOGE("The callback: [%s] is NULL", key.c_str());
152 void MultiCallbackUserData::invokeCallback(const std::string &key, JSValueRef obj)
154 JSValueRef args[1] = {obj};
155 invokeCallback(key, 1, args);
158 void MultiCallbackUserData::invokeCallback(const std::string &key)
160 invokeCallback(key, 0, NULL);
163 JSContextRef MultiCallbackUserData::getContext() const