2 // Tizen Web Device API
3 // Copyright (c) 2012 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 <JavaScriptCore/JavaScript.h>
19 #include <dpl/shared_ptr.h>
20 #include <CommonsJavaScript/PrivateObject.h>
21 #include <CommonsJavaScript/JSCallbackManager.h>
22 #include <Commons/IEvent.h>
23 #include <CommonsJavaScript/Utils.h>
24 #include "DataControlListener.h"
25 #include "DataControlConverter.h"
26 #include "DataControlAsyncCallbackManager.h"
27 #include "JSSelectObjectArrayValues.h"
28 #include <CommonsJavaScript/JSUtils.h>
29 #include <JSTizenExceptionFactory.h>
30 #include <JSTizenException.h>
33 using namespace DeviceAPI::Common;
34 using namespace WrtDeviceApis::Commons;
35 using namespace WrtDeviceApis::CommonsJavaScript;
38 namespace DataControl {
40 DataControlListener::DataControlListener() :
41 EventInsertAnswerReceiver(ThreadEnum::NULL_THREAD),
42 EventDeleteAnswerReceiver(ThreadEnum::NULL_THREAD),
43 EventSelectAnswerReceiver(ThreadEnum::NULL_THREAD),
44 EventUpdateAnswerReceiver(ThreadEnum::NULL_THREAD),
45 EventAddValueAnswerReceiver(ThreadEnum::NULL_THREAD),
46 EventRemoveValueAnswerReceiver(ThreadEnum::NULL_THREAD),
47 EventGetValueAnswerReceiver(ThreadEnum::NULL_THREAD),
48 EventUpdateValueAnswerReceiver(ThreadEnum::NULL_THREAD)
51 // EventGetIndexedRowAnswerReceiver(ThreadEnum::NULL_THREAD)
58 DataControlListener::~DataControlListener()
64 DataControlListener& DataControlListener::getInstance()
66 static DataControlListener instance;
70 void DataControlListener::MakeErrorJSCallBack(JSCallbackManagerPtr cbm, JSContextRef globalContext,
71 unsigned int error, unsigned int reqid, std::string errorMsg)
75 DataControlConverter converter(globalContext);
79 case ExceptionCodes::SecurityException:
80 if (errorMsg.size() == 0)
81 errorMsg = "permission denied error";
83 err[0] = converter.toJSValueRef(reqid);
84 err[1] = JSTizenExceptionFactory::makeErrorObject(globalContext,
85 JSTizenException::PERMISSION_DENIED_ERROR, errorMsg);
88 case ExceptionCodes::UnsupportedException:
89 if (errorMsg.size() == 0)
90 errorMsg = "unsupport error";
92 err[0] = converter.toJSValueRef(reqid);
93 err[1] = JSTizenExceptionFactory::makeErrorObject(globalContext,
94 JSTizenException::NOT_SUPPORTED_ERROR, errorMsg);
97 case ExceptionCodes::NotFoundException:
98 if (errorMsg.size() == 0)
99 errorMsg = "not found error";
101 err[0] = converter.toJSValueRef(reqid);
102 err[1] = JSTizenExceptionFactory::makeErrorObject(globalContext,
103 JSTizenException::NOT_FOUND_ERROR, errorMsg);
106 case ExceptionCodes::AlreadyInUseException:
107 if (errorMsg.size() == 0)
108 errorMsg = "service not available";
110 err[0] = converter.toJSValueRef(reqid);
111 err[1] = JSTizenExceptionFactory::makeErrorObject(globalContext,
112 JSTizenException::SERVICE_NOT_AVAILABLE, errorMsg);
115 case ExceptionCodes::EventCancelledException:
117 LoggerD("Enter - Event was cancled, callback will be silently discarded");
119 case ExceptionCodes::UnknownException:
121 if (errorMsg.size() == 0)
122 errorMsg = "unknown error";
124 err[0] = converter.toJSValueRef(reqid);
125 err[1] = JSTizenExceptionFactory::makeErrorObject(globalContext,
126 JSTizenException::UNKNOWN_ERROR, errorMsg);
130 cbm->callOnError(err, 2);
134 void DataControlListener::OnAnswerReceived(const EventInsertPtr& event)
136 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
137 JSContextRef globalContext = callbackManager->getContext();
138 DataControlConverter converter(globalContext);
139 DataControlAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
141 if (event->getExceptionCode() == ExceptionCodes::None)
143 JSValueRef successArray[2];
144 int insertRowId = event->getInsertRowId();
145 LoggerD(event->getInsertRowId());
146 successArray[0] = converter.toJSValueRef(event->getReqId());
147 successArray[1] = converter.toJSValueRef(insertRowId);
149 callbackManager->callOnSuccess(successArray, 2);
153 MakeErrorJSCallBack(callbackManager, globalContext, (unsigned int)event->getExceptionCode(), event->getReqId(), event->getErrorMsg());
156 void DataControlListener::OnAnswerReceived(const EventDeletePtr& event)
158 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
159 JSContextRef globalContext = callbackManager->getContext();
160 DataControlConverter converter(globalContext);
161 DataControlAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
163 if (event->getExceptionCode() == ExceptionCodes::None)
165 JSValueRef reqid = converter.toJSValueRef(event->getReqId());
166 callbackManager->callOnSuccess(reqid);
170 MakeErrorJSCallBack(callbackManager, globalContext, (unsigned int)event->getExceptionCode(), event->getReqId(), event->getErrorMsg());
174 void DataControlListener::OnAnswerReceived(const EventSelectPtr& event)
176 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
177 JSContextRef globalContext = callbackManager->getContext();
178 DataControlConverter converter(globalContext);
179 DataControlAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
181 if (event->getExceptionCode() == ExceptionCodes::None)
183 std::string path = event->getResultSetPath();
185 JSValueRef successArray[2];
186 successArray[0] = JSSelectObjectArrayValues::createJSObject(globalContext, path);
187 successArray[1] = converter.toJSValueRef(event->getReqId());
188 LoggerD(event->getReqId());
189 callbackManager->callOnSuccess(successArray, 2);
193 MakeErrorJSCallBack(callbackManager, globalContext, (unsigned int)event->getExceptionCode(), event->getReqId(), event->getErrorMsg());
197 void DataControlListener::OnAnswerReceived(const EventUpdatePtr& event)
199 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
200 JSContextRef globalContext = callbackManager->getContext();
201 DataControlConverter converter(globalContext);
202 DataControlAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
204 if (event->getExceptionCode() == ExceptionCodes::None)
206 JSValueRef reqid = converter.toJSValueRef(event->getReqId());
207 callbackManager->callOnSuccess(reqid);
211 MakeErrorJSCallBack(callbackManager, globalContext, (unsigned int)event->getExceptionCode(), event->getReqId(), event->getErrorMsg());
216 void DataControlListener::OnAnswerReceived(const EventAddValuePtr& event)
218 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
219 JSContextRef globalContext = callbackManager->getContext();
220 DataControlConverter converter(globalContext);
221 DataControlAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
223 if (event->getExceptionCode() == ExceptionCodes::None)
225 JSValueRef reqid = converter.toJSValueRef(event->getReqId());
226 callbackManager->callOnSuccess(reqid);
230 MakeErrorJSCallBack(callbackManager, globalContext, (unsigned int)event->getExceptionCode(), event->getReqId(), event->getErrorMsg());
235 void DataControlListener::OnAnswerReceived(const EventRemoveValuePtr& event)
237 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
238 JSContextRef globalContext = callbackManager->getContext();
239 DataControlConverter converter(globalContext);
240 DataControlAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
242 if (event->getExceptionCode() == ExceptionCodes::None)
244 JSValueRef reqid = converter.toJSValueRef(event->getReqId());
245 callbackManager->callOnSuccess(reqid);
249 MakeErrorJSCallBack(callbackManager, globalContext, (unsigned int)event->getExceptionCode(), event->getReqId(), event->getErrorMsg());
254 void DataControlListener::OnAnswerReceived(const EventGetValuePtr& event)
256 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
257 JSContextRef globalContext = callbackManager->getContext();
258 DataControlConverter converter(globalContext);
259 DataControlAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
261 if (event->getExceptionCode() == ExceptionCodes::None)
263 std::vector<std::string> result = event->getResultValues();
265 JSValueRef successArray[2];
266 successArray[0] = converter.toJSValueRef(result);
267 successArray[1] = converter.toJSValueRef(event->getReqId());
268 LoggerD(event->getReqId());
269 callbackManager->callOnSuccess(successArray, 2);
273 MakeErrorJSCallBack(callbackManager, globalContext, (unsigned int)event->getExceptionCode(), event->getReqId(), event->getErrorMsg());
278 void DataControlListener::OnAnswerReceived(const EventUpdateValuePtr& event)
280 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
281 JSContextRef globalContext = callbackManager->getContext();
282 DataControlConverter converter(globalContext);
283 DataControlAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
285 if (event->getExceptionCode() == ExceptionCodes::None)
287 JSValueRef reqid = converter.toJSValueRef(event->getReqId());
288 callbackManager->callOnSuccess(reqid);
292 MakeErrorJSCallBack(callbackManager, globalContext, (unsigned int)event->getExceptionCode(), event->getReqId(), event->getErrorMsg());
299 void DataControlListener::OnAnswerReceived(const EventGetIndexedRowPtr& event)
301 JSCallbackManagerPtr callbackManager = DPL::StaticPointerCast<JSCallbackManager > (event->getPrivateData());
302 JSContextRef globalContext = callbackManager->getContext();
304 if (event->getExceptionCode() == ExceptionCodes::None)
310 MakeErrorJSCallBack(callbackManager, globalContext, event->getExceptionCode(), event->getReqId(), event->getErrorMsg());