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.
19 #include <CommonsJavaScript/Converter.h>
20 #include <CommonsJavaScript/Validator.h>
21 #include <CommonsJavaScript/JSUtils.h>
22 #include <CommonsJavaScript/JSCallbackManager.h>
23 #include <CommonsJavaScript/Utils.h>
24 #include <JSTizenExceptionFactory.h>
25 #include <JSTizenException.h>
26 #include <SecurityExceptions.h>
27 #include <Commons/Exception.h>
28 #include <TimeTracer.h>
29 #include <ArgumentValidator.h>
30 #include <JSWebAPIError.h>
31 #include <JSWebAPIException.h>
33 #include "DataControlFactory.h"
34 #include "JSSQLDataControlConsumer.h"
35 #include "DataControlAsyncCallbackManager.h"
36 #include "DataControlListener.h"
37 #include "DataControlConverter.h"
38 #include "plugin_config.h"
40 using namespace WrtDeviceApis;
41 using namespace WrtDeviceApis::Commons;
43 using namespace WrtDeviceApis::CommonsJavaScript;
45 using namespace DeviceAPI::Common;
49 namespace DataControl {
51 JSClassRef JSSQLDataControlConsumer::m_jsClassRef = NULL;
53 JSClassDefinition JSSQLDataControlConsumer::m_classInfo =
56 kJSClassAttributeNone,
57 "DataControlConsumer",
74 JSStaticValue JSSQLDataControlConsumer::m_property[] = {
75 { "type", getProperty, NULL, kJSPropertyAttributeReadOnly },
76 { "providerId", getProperty, NULL, kJSPropertyAttributeReadOnly },
77 { "dataId", getProperty, NULL, kJSPropertyAttributeReadOnly },
81 JSStaticFunction JSSQLDataControlConsumer::m_function[] =
83 { "insert", JSSQLDataControlConsumer::insert, kJSPropertyAttributeNone },
84 { "update", JSSQLDataControlConsumer::update, kJSPropertyAttributeNone },
85 { "remove", JSSQLDataControlConsumer::remove, kJSPropertyAttributeNone },
86 { "select", JSSQLDataControlConsumer::select, kJSPropertyAttributeNone },
90 const JSClassRef JSSQLDataControlConsumer::getClassRef()
93 m_jsClassRef = JSClassCreate(&m_classInfo);
98 const JSClassDefinition* JSSQLDataControlConsumer::getClassInfo()
103 void JSSQLDataControlConsumer::initialize(JSContextRef context, JSObjectRef object)
106 void JSSQLDataControlConsumer::finalize(JSObjectRef object)
108 JSSQLDataControlConsumerPriv *priv = static_cast<JSSQLDataControlConsumerPriv*>(JSObjectGetPrivate(object));
110 LoggerE("Private object is null");
116 bool JSSQLDataControlConsumer::hasInstance(JSContextRef context, JSObjectRef constructor, JSValueRef possibleInstance, JSValueRef* exception)
118 return JSValueIsObjectOfClass(context, possibleInstance, getClassRef());
122 JSObjectRef JSSQLDataControlConsumer::createJSObject(JSContextRef context, std::string provId, std::string dataId, std::string type)
124 ISQLDataControlConsumerPtr SqlDataControlConsumer(DataControlFactory::getInstance().getSQLDataControlConsumer());
125 SqlDataControlConsumer->setDataId(dataId);
126 SqlDataControlConsumer->setProviderId(provId);
127 SqlDataControlConsumer->setType(type);
128 JSSQLDataControlConsumerPriv* priv = new JSSQLDataControlConsumerPriv( context, SqlDataControlConsumer);
130 return JSObjectMake(context, getClassRef(), priv);
133 JSValueRef JSSQLDataControlConsumer::getProperty(JSContextRef context,
135 JSStringRef propertyName,
136 JSValueRef* exception)
140 DataControlConverter converter(context);
141 JSSQLDataControlConsumerPriv *priv = static_cast<JSSQLDataControlConsumerPriv*>(JSObjectGetPrivate(object));
142 ISQLDataControlConsumerPtr dataControlConsumer(priv->getObject());
144 std::string propertyNameStr = converter.toString(propertyName);
145 if(propertyNameStr == "type")
147 return converter.toJSValueRef(dataControlConsumer->getType());
149 else if(propertyNameStr == "providerId")
151 return converter.toJSValueRef(dataControlConsumer->getProviderId());
153 else if(propertyNameStr == "dataId")
155 return converter.toJSValueRef(dataControlConsumer->getDataId());
158 Catch(WrtDeviceApis::Commons::Exception)
160 LoggerW("trying to get incorrect value");
163 return JSValueMakeUndefined(context);
166 JSValueRef JSSQLDataControlConsumer::insert(
167 JSContextRef context, JSObjectRef object,
168 JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[],
169 JSValueRef* exception)
172 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
174 // argument validation with new validator
177 ArgumentValidator validator(context, argumentCount, arguments);
178 validator.toULong(0, false);
179 validator.toObject(1, false);
180 validator.toFunction(2, true);
181 validator.toFunction(3, true);
183 catch (const BasePlatformException &err)
185 return JSWebAPIException::throwException(context, exception, err);
189 DeviceAPI::Common::UnknownException err("");
190 return JSWebAPIException::throwException(context, exception, err);
194 DataControlConverter converter(context);
195 JSSQLDataControlConsumerPriv *priv = static_cast<JSSQLDataControlConsumerPriv*>(JSObjectGetPrivate(thisObject));
196 JSValueRef successCallback = NULL;
197 JSValueRef errorCallBack = NULL;
199 JSValueRef reserveArguments[5];
203 return JSTizenExceptionFactory::postException(context, exception,
204 JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error");
207 JSCallbackManagerPtr cbm = JSCallbackManager::createObject(priv->getContext(), NULL, NULL);
212 AceSecurityStatus status = DATACONTROL_CHECK_ACCESS(DATACONTROL_FUNC_CONSUMER);
213 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
215 for (index = 0; index < 4; index++)
217 if (index < argumentCount)
218 reserveArguments[index] = arguments[index];
220 reserveArguments[index] = JSValueMakeUndefined(context);
223 ISQLDataControlConsumerPtr dataControlConsumer(priv->getObject());
224 EventInsertPtr event(new EventInsert);
226 unsigned int reqId = converter.toULong(reserveArguments[0]);
227 RowDataPtr rowData = converter.toRowDataPtr(reserveArguments[1]);
228 successCallback = converter.toFunctionOrNull(reserveArguments[2]);
229 errorCallBack = converter.toFunctionOrNull(reserveArguments[3]);
231 cbm->setOnSuccess(successCallback);
232 cbm->setOnError(errorCallBack);
234 event->setPrivateData(DPL::StaticPointerCast<WrtDeviceApis::Commons::IEventPrivateData> (cbm));
235 DataControlListener& listener = DataControlListener::getInstance();
237 event->setReqId(reqId);
238 event->setRowData(rowData);
239 event->setForAsynchronousCall(&listener);
241 dataControlConsumer->insertData(event);
242 DataControlAsyncCallbackManagerSingleton::Instance().registerCallbackManager(cbm, priv->getContext());
245 Catch (WrtDeviceApis::Commons::ConversionException)
247 LoggerE("ConversionException");
248 return JSTizenExceptionFactory::postException(context, exception,
249 JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error");
252 Catch (WrtDeviceApis::Commons::InvalidArgumentException)
254 LoggerE("InvalidArgumentException");
255 return JSTizenExceptionFactory::postException(context, exception,
256 JSTizenException::INVALID_VALUES_ERROR, "type mismatch error");
258 Catch(WrtDeviceApis::Commons::UnsupportedException)
260 LoggerE("UnsupportException");
261 return JSTizenExceptionFactory::postException(context, exception,
262 JSTizenException::NOT_SUPPORTED_ERROR, "Unsupport Exception");
264 Catch(WrtDeviceApis::Commons::Exception)
266 LoggerE("UnkownException");
267 return JSTizenExceptionFactory::postException(context, exception,
268 JSTizenException::UNKNOWN_ERROR, "Unkown error");
270 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
271 return JSValueMakeUndefined(context);
275 JSValueRef JSSQLDataControlConsumer::update(
276 JSContextRef context, JSObjectRef object,
277 JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[],
278 JSValueRef* exception)
281 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
283 // argument validation with new validator
286 ArgumentValidator validator(context, argumentCount, arguments);
287 validator.toULong(0, false);
288 validator.toObject(1, false);
289 validator.toString(2, false);
290 validator.toFunction(3, true);
291 validator.toFunction(4, true);
293 catch (const BasePlatformException &err)
295 return JSWebAPIException::throwException(context, exception, err);
299 DeviceAPI::Common::UnknownException err("");
300 return JSWebAPIException::throwException(context, exception, err);
303 DataControlConverter converter(context);
304 JSSQLDataControlConsumerPriv *priv = static_cast<JSSQLDataControlConsumerPriv*>(JSObjectGetPrivate(thisObject));
305 JSValueRef successCallback = NULL;
306 JSValueRef errorCallBack = NULL;
308 JSValueRef reserveArguments[6];
312 return JSTizenExceptionFactory::postException(context, exception,
313 JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error");
317 JSCallbackManagerPtr cbm = JSCallbackManager::createObject(priv->getContext(), NULL, NULL);
322 AceSecurityStatus status = DATACONTROL_CHECK_ACCESS(DATACONTROL_FUNC_CONSUMER);
323 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
325 for (index = 0; index < 6; index++)
327 if (index < argumentCount)
328 reserveArguments[index] = arguments[index];
330 reserveArguments[index] = JSValueMakeUndefined(context);
333 ISQLDataControlConsumerPtr dataControlConsumer(priv->getObject());
334 EventUpdatePtr event(new EventUpdate);
336 unsigned int reqId = converter.toULong(reserveArguments[0]);
337 RowDataPtr rowData = converter.toRowDataPtr(reserveArguments[1]);
338 std::string where = converter.toString(reserveArguments[2]);
339 successCallback = converter.toFunctionOrNull(reserveArguments[3]);
340 errorCallBack = converter.toFunctionOrNull(reserveArguments[4]);
342 cbm->setOnSuccess(successCallback);
343 cbm->setOnError(errorCallBack);
345 event->setPrivateData(DPL::StaticPointerCast<WrtDeviceApis::Commons::IEventPrivateData > (cbm));
346 DataControlListener& listener = DataControlListener::getInstance();
349 event->setReqId(reqId);
350 event->setWhere(where);
351 event->setRowData(rowData);
352 event->setForAsynchronousCall(&listener);
354 dataControlConsumer->updateData(event);
355 DataControlAsyncCallbackManagerSingleton::Instance().registerCallbackManager(cbm, priv->getContext());
357 Catch (WrtDeviceApis::Commons::ConversionException)
359 LoggerE("ConversionException");
360 return JSTizenExceptionFactory::postException(context, exception,
361 JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error");
364 Catch (WrtDeviceApis::Commons::InvalidArgumentException)
366 LoggerE("InvalidArgumentException");
367 return JSTizenExceptionFactory::postException(context, exception,
368 JSTizenException::INVALID_VALUES_ERROR, "type mismatch error");
370 Catch(WrtDeviceApis::Commons::UnsupportedException)
372 LoggerE("UnsupportException");
373 return JSTizenExceptionFactory::postException(context, exception,
374 JSTizenException::NOT_SUPPORTED_ERROR, "Unsupport Exception");
376 Catch(WrtDeviceApis::Commons::Exception)
378 LoggerE("UnkownException");
379 return JSTizenExceptionFactory::postException(context, exception,
380 JSTizenException::UNKNOWN_ERROR, "Unkown error");
382 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
383 return JSValueMakeUndefined(context);
387 JSValueRef JSSQLDataControlConsumer::select(
388 JSContextRef context, JSObjectRef object,
389 JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[],
390 JSValueRef* exception)
394 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
396 // argument validation with new validator
399 ArgumentValidator validator(context, argumentCount, arguments);
400 validator.toULong(0, false);
401 validator.toArrayObject(1, false);
402 validator.toString(2, false);
403 validator.toFunction(3, false);
404 validator.toFunction(4, true);
405 validator.toULong(5, true);
406 validator.toULong(6, true);
408 catch (const BasePlatformException &err)
410 return JSWebAPIException::throwException(context, exception, err);
414 DeviceAPI::Common::UnknownException err("");
415 return JSWebAPIException::throwException(context, exception, err);
419 JSSQLDataControlConsumerPriv *priv = static_cast<JSSQLDataControlConsumerPriv*>(JSObjectGetPrivate(thisObject));
420 JSValueRef successCallback = NULL;
421 JSValueRef errorCallBack = NULL;
423 JSValueRef reserveArguments[7];
427 return JSTizenExceptionFactory::postException(context, exception,
428 JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error");
431 JSContextRef globalContext = priv->getContext();
432 DataControlConverter converter(globalContext);
433 JSCallbackManagerPtr cbm = JSCallbackManager::createObject(priv->getContext(), NULL, NULL);
438 AceSecurityStatus status = DATACONTROL_CHECK_ACCESS(DATACONTROL_FUNC_CONSUMER);
439 TIZEN_SYNC_ACCESS_HANDLER(status, globalContext, exception);
441 for (index = 0; index < 7; index++)
443 if (index < argumentCount)
444 reserveArguments[index] = arguments[index];
446 reserveArguments[index] = JSValueMakeUndefined(globalContext);
449 ISQLDataControlConsumerPtr dataControlConsumer(priv->getObject());
450 EventSelectPtr event(new EventSelect);
452 unsigned int reqId = converter.toULong(reserveArguments[0]);
456 std::vector<std::string> columns = converter.toVectorOfStrings(reserveArguments[1]);
458 if (columns.size() == 0)
459 Throw(WrtDeviceApis::Commons::ConversionException);
462 std::string where = converter.toString(reserveArguments[2]);
467 successCallback = converter.toFunctionOrNull(reserveArguments[3]);
468 errorCallBack = converter.toFunctionOrNull(reserveArguments[4]);
470 cbm->setOnSuccess(successCallback);
471 cbm->setOnError(errorCallBack);
473 event->setPrivateData(DPL::StaticPointerCast<WrtDeviceApis::Commons::IEventPrivateData > (cbm));
474 DataControlListener& listener = DataControlListener::getInstance();
476 if (JSValueIsUndefined(globalContext, reserveArguments[5]) == false)
478 std::string page = converter.toString(reserveArguments[5]);
479 event->setPage(page);
482 if (JSValueIsUndefined(globalContext,reserveArguments[6]) == false)
484 std::string number = converter.toString(reserveArguments[6]);
485 event->setNumberPerPage(number);
488 event->setReqId(reqId);
489 event->setWhere(where);
490 event->setForAsynchronousCall(&listener);
491 event->setColumns(columns);
492 dataControlConsumer->selectData(event);
493 DataControlAsyncCallbackManagerSingleton::Instance().registerCallbackManager(cbm, priv->getContext());
496 Catch (WrtDeviceApis::Commons::ConversionException)
498 LoggerE("ConversionException");
499 return JSTizenExceptionFactory::postException(context, exception,
500 JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error");
503 Catch (WrtDeviceApis::Commons::InvalidArgumentException)
505 LoggerE("InvalidArgumentException");
506 return JSTizenExceptionFactory::postException(context, exception,
507 JSTizenException::INVALID_VALUES_ERROR, "type mismatch error");
509 Catch(WrtDeviceApis::Commons::UnsupportedException)
511 LoggerE("UnsupportException");
512 return JSTizenExceptionFactory::postException(context, exception,
513 JSTizenException::NOT_SUPPORTED_ERROR, "Unsupport Exception");
515 Catch(WrtDeviceApis::Commons::Exception)
517 LoggerE("UnkownException");
518 return JSTizenExceptionFactory::postException(context, exception,
519 JSTizenException::UNKNOWN_ERROR, "Unkown error");
521 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
522 return JSValueMakeUndefined(context);
525 JSValueRef JSSQLDataControlConsumer::remove(
526 JSContextRef context, JSObjectRef object,
527 JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[],
528 JSValueRef* exception)
531 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
533 // argument validation with new validator
536 ArgumentValidator validator(context, argumentCount, arguments);
537 validator.toULong(0, false);
538 validator.toString(1, false);
539 validator.toFunction(2, true);
540 validator.toFunction(3, true);
542 catch (const BasePlatformException &err)
544 return JSWebAPIException::throwException(context, exception, err);
548 DeviceAPI::Common::UnknownException err("");
549 return JSWebAPIException::throwException(context, exception, err);
552 DataControlConverter converter(context);
553 JSSQLDataControlConsumerPriv *priv = static_cast<JSSQLDataControlConsumerPriv*>(JSObjectGetPrivate(thisObject));
554 JSValueRef successCallback = NULL;
555 JSValueRef errorCallBack = NULL;
557 JSValueRef reserveArguments[4];
561 return JSTizenExceptionFactory::postException(context, exception,
562 JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error");
565 JSCallbackManagerPtr cbm = JSCallbackManager::createObject(priv->getContext(), NULL, NULL);
570 AceSecurityStatus status = DATACONTROL_CHECK_ACCESS(DATACONTROL_FUNC_CONSUMER);
571 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
573 for (index = 0; index < 4; index++)
575 if (index < argumentCount)
576 reserveArguments[index] = arguments[index];
578 reserveArguments[index] = JSValueMakeUndefined(context);
581 ISQLDataControlConsumerPtr dataControlConsumer(priv->getObject());
582 EventDeletePtr event(new EventDelete);
584 unsigned int reqId = converter.toULong(reserveArguments[0]);
585 std::string where = converter.toString(reserveArguments[1]);
586 successCallback = converter.toFunctionOrNull(reserveArguments[2]);
587 errorCallBack = converter.toFunctionOrNull(reserveArguments[3]);
589 cbm->setOnSuccess(successCallback);
590 cbm->setOnError(errorCallBack);
592 event->setPrivateData(DPL::StaticPointerCast<WrtDeviceApis::Commons::IEventPrivateData > (cbm));
593 DataControlListener& listener = DataControlListener::getInstance();
596 event->setReqId(reqId);
597 event->setWhere(where);
598 event->setForAsynchronousCall(&listener);
600 dataControlConsumer->deleteData(event);
601 DataControlAsyncCallbackManagerSingleton::Instance().registerCallbackManager(cbm, priv->getContext());
605 Catch (WrtDeviceApis::Commons::ConversionException)
607 LoggerE("ConversionException");
608 return JSTizenExceptionFactory::postException(context, exception,
609 JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error");
612 Catch (WrtDeviceApis::Commons::InvalidArgumentException)
614 LoggerE("InvalidArgumentException");
615 return JSTizenExceptionFactory::postException(context, exception,
616 JSTizenException::INVALID_VALUES_ERROR, "type mismatch error");
618 Catch(WrtDeviceApis::Commons::UnsupportedException)
620 LoggerE("UnsupportException");
621 return JSTizenExceptionFactory::postException(context, exception,
622 JSTizenException::NOT_SUPPORTED_ERROR, "Unsupport Exception");
624 Catch(WrtDeviceApis::Commons::Exception)
626 LoggerE("UnkownException");
627 return JSTizenExceptionFactory::postException(context, exception,
628 JSTizenException::UNKNOWN_ERROR, "Unkown error");
630 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
631 return JSValueMakeUndefined(context);