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 <JSWebAPIErrorFactory.h>
25 #include <SecurityExceptions.h>
26 #include <Commons/Exception.h>
27 #include <TimeTracer.h>
28 #include <ArgumentValidator.h>
31 #include "DataControlFactory.h"
32 #include "JSSQLDataControlConsumer.h"
33 #include "DataControlAsyncCallbackManager.h"
34 #include "DataControlListener.h"
35 #include "DataControlConverter.h"
36 #include "plugin_config.h"
38 using namespace WrtDeviceApis;
39 using namespace WrtDeviceApis::Commons;
41 using namespace WrtDeviceApis::CommonsJavaScript;
43 using namespace DeviceAPI::Common;
47 namespace DataControl {
49 JSClassRef JSSQLDataControlConsumer::m_jsClassRef = NULL;
51 JSClassDefinition JSSQLDataControlConsumer::m_classInfo =
54 kJSClassAttributeNone,
55 "DataControlConsumer",
72 JSStaticValue JSSQLDataControlConsumer::m_property[] = {
73 { "type", getProperty, NULL, kJSPropertyAttributeReadOnly },
74 { "providerId", getProperty, NULL, kJSPropertyAttributeReadOnly },
75 { "dataId", getProperty, NULL, kJSPropertyAttributeReadOnly },
79 JSStaticFunction JSSQLDataControlConsumer::m_function[] =
81 { "insert", JSSQLDataControlConsumer::insert, kJSPropertyAttributeNone },
82 { "update", JSSQLDataControlConsumer::update, kJSPropertyAttributeNone },
83 { "remove", JSSQLDataControlConsumer::remove, kJSPropertyAttributeNone },
84 { "select", JSSQLDataControlConsumer::select, kJSPropertyAttributeNone },
88 const JSClassRef JSSQLDataControlConsumer::getClassRef()
91 m_jsClassRef = JSClassCreate(&m_classInfo);
96 const JSClassDefinition* JSSQLDataControlConsumer::getClassInfo()
101 void JSSQLDataControlConsumer::initialize(JSContextRef context, JSObjectRef object)
104 void JSSQLDataControlConsumer::finalize(JSObjectRef object)
106 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(provId, dataId, type));
125 JSSQLDataControlConsumerPriv* priv = new JSSQLDataControlConsumerPriv( context, SqlDataControlConsumer);
126 return JSObjectMake(context, getClassRef(), priv);
129 JSValueRef JSSQLDataControlConsumer::getProperty(JSContextRef context,
131 JSStringRef propertyName,
132 JSValueRef* exception)
136 DataControlConverter converter(context);
137 JSSQLDataControlConsumerPriv *priv = static_cast<JSSQLDataControlConsumerPriv*>(JSObjectGetPrivate(object));
138 ISQLDataControlConsumerPtr dataControlConsumer(priv->getObject());
140 std::string propertyNameStr = converter.toString(propertyName);
141 if(propertyNameStr == "type")
143 return converter.toJSValueRef(dataControlConsumer->getType());
145 else if(propertyNameStr == "providerId")
147 return converter.toJSValueRef(dataControlConsumer->getProviderId());
149 else if(propertyNameStr == "dataId")
151 return converter.toJSValueRef(dataControlConsumer->getDataId());
154 Catch(WrtDeviceApis::Commons::Exception)
156 LoggerW("trying to get incorrect value");
159 return JSValueMakeUndefined(context);
162 JSValueRef JSSQLDataControlConsumer::insert(
163 JSContextRef context, JSObjectRef object,
164 JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[],
165 JSValueRef* exception)
168 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
170 AceSecurityStatus status = DATACONTROL_CHECK_ACCESS(DATACONTROL_FUNC_CONSUMER);
171 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
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 JSWebAPIErrorFactory::postException(context, exception, err);
189 DeviceAPI::Common::UnknownException err("");
190 return JSWebAPIErrorFactory::postException(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 JSWebAPIErrorFactory::postException(context, exception,
204 JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "type mismatch error");
207 JSCallbackManagerPtr cbm = JSCallbackManager::createObject(priv->getContext(), NULL, NULL);
212 for (index = 0; index < 4; index++)
214 if (index < argumentCount)
215 reserveArguments[index] = arguments[index];
217 reserveArguments[index] = JSValueMakeUndefined(context);
220 ISQLDataControlConsumerPtr dataControlConsumer(priv->getObject());
221 EventInsertPtr event(new EventInsert);
223 unsigned int reqId = converter.toULong(reserveArguments[0]);
224 RowData* rowData = converter.toRowDataPtr(reserveArguments[1]);
225 std::string dummyWhere = "";
229 converter.checkRowDataSize(rowData, dummyWhere);
231 catch (const WrtDeviceApis::Commons::Exception& ex)
233 return JSWebAPIErrorFactory::postException(context, exception,
234 JSWebAPIErrorFactory::INVALID_VALUES_ERROR, ex.GetMessage());
237 unsigned int colSize = rowData->m_Data.size();
238 successCallback = converter.toFunctionOrNull(reserveArguments[2]);
239 errorCallBack = converter.toFunctionOrNull(reserveArguments[3]);
241 cbm->setOnSuccess(successCallback);
242 cbm->setOnError(errorCallBack);
244 event->setPrivateData(DPL::StaticPointerCast<WrtDeviceApis::Commons::IEventPrivateData> (cbm));
245 DataControlListener& listener = DataControlListener::getInstance();
247 event->setReqId(reqId);
248 event->setRowData(rowData);
249 event->setColumnSize(colSize);
250 event->setForAsynchronousCall(&listener);
252 dataControlConsumer->insertData(event);
253 DataControlAsyncCallbackManagerSingleton::Instance().registerCallbackManager(cbm, priv->getContext());
256 Catch (WrtDeviceApis::Commons::ConversionException)
258 LoggerE("ConversionException");
259 return JSWebAPIErrorFactory::postException(context, exception,
260 JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "type mismatch error");
263 Catch (WrtDeviceApis::Commons::InvalidArgumentException)
265 LoggerE("InvalidArgumentException");
266 return JSWebAPIErrorFactory::postException(context, exception,
267 JSWebAPIErrorFactory::INVALID_VALUES_ERROR, "type mismatch error");
269 Catch(WrtDeviceApis::Commons::UnsupportedException)
271 LoggerE("UnsupportException");
272 return JSWebAPIErrorFactory::postException(context, exception,
273 JSWebAPIErrorFactory::NOT_SUPPORTED_ERROR, "Unsupport Exception");
275 Catch(WrtDeviceApis::Commons::Exception)
277 LoggerE("UnkownException");
278 return JSWebAPIErrorFactory::postException(context, exception,
279 JSWebAPIErrorFactory::UNKNOWN_ERROR, "Unkown error");
281 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
282 return JSValueMakeUndefined(context);
286 JSValueRef JSSQLDataControlConsumer::update(
287 JSContextRef context, JSObjectRef object,
288 JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[],
289 JSValueRef* exception)
292 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
294 AceSecurityStatus status = DATACONTROL_CHECK_ACCESS(DATACONTROL_FUNC_CONSUMER);
295 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
297 // argument validation with new validator
300 ArgumentValidator validator(context, argumentCount, arguments);
301 validator.toULong(0, false);
302 validator.toObject(1, false);
303 validator.toString(2, false);
304 validator.toFunction(3, true);
305 validator.toFunction(4, true);
307 catch (const BasePlatformException &err)
309 return JSWebAPIErrorFactory::postException(context, exception, err);
313 DeviceAPI::Common::UnknownException err("");
314 return JSWebAPIErrorFactory::postException(context, exception, err);
317 DataControlConverter converter(context);
318 JSSQLDataControlConsumerPriv *priv = static_cast<JSSQLDataControlConsumerPriv*>(JSObjectGetPrivate(thisObject));
319 JSValueRef successCallback = NULL;
320 JSValueRef errorCallBack = NULL;
322 JSValueRef reserveArguments[6];
326 return JSWebAPIErrorFactory::postException(context, exception,
327 JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "type mismatch error");
331 JSCallbackManagerPtr cbm = JSCallbackManager::createObject(priv->getContext(), NULL, NULL);
336 for (index = 0; index < 6; index++)
338 if (index < argumentCount)
339 reserveArguments[index] = arguments[index];
341 reserveArguments[index] = JSValueMakeUndefined(context);
344 ISQLDataControlConsumerPtr dataControlConsumer(priv->getObject());
345 EventUpdatePtr event(new EventUpdate);
347 unsigned int reqId = converter.toULong(reserveArguments[0]);
348 RowData* rowData = converter.toRowDataPtr(reserveArguments[1]);
349 unsigned int colSize = rowData->m_Data.size();
350 std::string where = converter.toString(reserveArguments[2]);
354 converter.checkRowDataSize(rowData, where);
356 catch (const WrtDeviceApis::Commons::Exception& ex)
358 return JSWebAPIErrorFactory::postException(context, exception,
359 JSWebAPIErrorFactory::INVALID_VALUES_ERROR, ex.GetMessage());
362 successCallback = converter.toFunctionOrNull(reserveArguments[3]);
363 errorCallBack = converter.toFunctionOrNull(reserveArguments[4]);
365 cbm->setOnSuccess(successCallback);
366 cbm->setOnError(errorCallBack);
368 event->setPrivateData(DPL::StaticPointerCast<WrtDeviceApis::Commons::IEventPrivateData > (cbm));
369 DataControlListener& listener = DataControlListener::getInstance();
372 event->setReqId(reqId);
373 event->setWhere(where);
374 event->setRowData(rowData);
375 event->setColumnSize(colSize);
376 event->setForAsynchronousCall(&listener);
378 dataControlConsumer->updateData(event);
379 DataControlAsyncCallbackManagerSingleton::Instance().registerCallbackManager(cbm, priv->getContext());
381 Catch (WrtDeviceApis::Commons::ConversionException)
383 LoggerE("ConversionException");
384 return JSWebAPIErrorFactory::postException(context, exception,
385 JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "type mismatch error");
388 Catch (WrtDeviceApis::Commons::InvalidArgumentException)
390 LoggerE("InvalidArgumentException");
391 return JSWebAPIErrorFactory::postException(context, exception,
392 JSWebAPIErrorFactory::INVALID_VALUES_ERROR, "type mismatch error");
394 Catch(WrtDeviceApis::Commons::UnsupportedException)
396 LoggerE("UnsupportException");
397 return JSWebAPIErrorFactory::postException(context, exception,
398 JSWebAPIErrorFactory::NOT_SUPPORTED_ERROR, "Unsupport Exception");
400 Catch(WrtDeviceApis::Commons::Exception)
402 LoggerE("UnkownException");
403 return JSWebAPIErrorFactory::postException(context, exception,
404 JSWebAPIErrorFactory::UNKNOWN_ERROR, "Unkown error");
406 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
407 return JSValueMakeUndefined(context);
411 JSValueRef JSSQLDataControlConsumer::select(
412 JSContextRef context, JSObjectRef object,
413 JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[],
414 JSValueRef* exception)
418 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
420 AceSecurityStatus status = DATACONTROL_CHECK_ACCESS(DATACONTROL_FUNC_CONSUMER);
421 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
423 // argument validation with new validator
426 ArgumentValidator validator(context, argumentCount, arguments);
427 validator.toULong(0, false);
428 validator.toArrayObject(1, false);
429 validator.toString(2, false);
430 validator.toFunction(3, false);
431 validator.toFunction(4, true);
432 validator.toULong(5, true);
433 validator.toULong(6, true);
435 catch (const BasePlatformException &err)
437 return JSWebAPIErrorFactory::postException(context, exception, err);
441 DeviceAPI::Common::UnknownException err("");
442 return JSWebAPIErrorFactory::postException(context, exception, err);
446 JSSQLDataControlConsumerPriv *priv = static_cast<JSSQLDataControlConsumerPriv*>(JSObjectGetPrivate(thisObject));
447 JSValueRef successCallback = NULL;
448 JSValueRef errorCallBack = NULL;
450 JSValueRef reserveArguments[7];
454 return JSWebAPIErrorFactory::postException(context, exception,
455 JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "type mismatch error");
458 JSContextRef globalContext = priv->getContext();
459 DataControlConverter converter(globalContext);
460 JSCallbackManagerPtr cbm = JSCallbackManager::createObject(priv->getContext(), NULL, NULL);
465 for (index = 0; index < 7; index++)
467 if (index < argumentCount)
468 reserveArguments[index] = arguments[index];
470 reserveArguments[index] = JSValueMakeUndefined(globalContext);
473 ISQLDataControlConsumerPtr dataControlConsumer(priv->getObject());
474 EventSelectPtr event(new EventSelect);
476 unsigned int reqId = converter.toULong(reserveArguments[0]);
477 unsigned long dataSize = 0;
481 std::vector<std::string> columns = converter.toVectorOfStrings(reserveArguments[1]);
483 if (columns.size() == 0)
484 Throw(WrtDeviceApis::Commons::ConversionException);
486 for (size_t index = 0; index < columns.size(); index++)
488 dataSize += columns[index].size();
491 std::string where = converter.toString(reserveArguments[2]);
492 dataSize += where.size();
494 if (dataSize > PROTOCOL_DATA_MAX)
496 return JSWebAPIErrorFactory::postException(context, exception,
497 JSWebAPIErrorFactory::INVALID_VALUES_ERROR, "Data is too big");
500 successCallback = converter.toFunctionOrNull(reserveArguments[3]);
501 errorCallBack = converter.toFunctionOrNull(reserveArguments[4]);
503 cbm->setOnSuccess(successCallback);
504 cbm->setOnError(errorCallBack);
506 event->setPrivateData(DPL::StaticPointerCast<WrtDeviceApis::Commons::IEventPrivateData > (cbm));
507 DataControlListener& listener = DataControlListener::getInstance();
509 if (JSValueIsUndefined(globalContext, reserveArguments[5]) == false)
511 std::string page = converter.toString(reserveArguments[5]);
512 event->setPage(page);
515 if (JSValueIsUndefined(globalContext,reserveArguments[6]) == false)
517 std::string number = converter.toString(reserveArguments[6]);
518 event->setNumberPerPage(number);
521 event->setReqId(reqId);
522 event->setWhere(where);
523 event->setForAsynchronousCall(&listener);
524 event->setColumns(columns);
525 dataControlConsumer->selectData(event);
526 DataControlAsyncCallbackManagerSingleton::Instance().registerCallbackManager(cbm, priv->getContext());
529 Catch (WrtDeviceApis::Commons::ConversionException)
531 LoggerE("ConversionException");
532 return JSWebAPIErrorFactory::postException(context, exception,
533 JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "type mismatch error");
536 Catch (WrtDeviceApis::Commons::InvalidArgumentException)
538 LoggerE("InvalidArgumentException");
539 return JSWebAPIErrorFactory::postException(context, exception,
540 JSWebAPIErrorFactory::INVALID_VALUES_ERROR, "type mismatch error");
542 Catch(WrtDeviceApis::Commons::UnsupportedException)
544 LoggerE("UnsupportException");
545 return JSWebAPIErrorFactory::postException(context, exception,
546 JSWebAPIErrorFactory::NOT_SUPPORTED_ERROR, "Unsupport Exception");
548 Catch(WrtDeviceApis::Commons::Exception)
550 LoggerE("UnkownException");
551 return JSWebAPIErrorFactory::postException(context, exception,
552 JSWebAPIErrorFactory::UNKNOWN_ERROR, "Unkown error");
554 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
555 return JSValueMakeUndefined(context);
558 JSValueRef JSSQLDataControlConsumer::remove(
559 JSContextRef context, JSObjectRef object,
560 JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[],
561 JSValueRef* exception)
564 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
566 AceSecurityStatus status = DATACONTROL_CHECK_ACCESS(DATACONTROL_FUNC_CONSUMER);
567 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
569 // argument validation with new validator
572 ArgumentValidator validator(context, argumentCount, arguments);
573 validator.toULong(0, false);
574 validator.toString(1, false);
575 validator.toFunction(2, true);
576 validator.toFunction(3, true);
578 catch (const BasePlatformException &err)
580 return JSWebAPIErrorFactory::postException(context, exception, err);
584 DeviceAPI::Common::UnknownException err("");
585 return JSWebAPIErrorFactory::postException(context, exception, err);
588 DataControlConverter converter(context);
589 JSSQLDataControlConsumerPriv *priv = static_cast<JSSQLDataControlConsumerPriv*>(JSObjectGetPrivate(thisObject));
590 JSValueRef successCallback = NULL;
591 JSValueRef errorCallBack = NULL;
593 JSValueRef reserveArguments[4];
597 return JSWebAPIErrorFactory::postException(context, exception,
598 JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "type mismatch error");
601 JSCallbackManagerPtr cbm = JSCallbackManager::createObject(priv->getContext(), NULL, NULL);
608 for (index = 0; index < 4; index++)
610 if (index < argumentCount)
611 reserveArguments[index] = arguments[index];
613 reserveArguments[index] = JSValueMakeUndefined(context);
616 ISQLDataControlConsumerPtr dataControlConsumer(priv->getObject());
617 EventDeletePtr event(new EventDelete);
619 unsigned int reqId = converter.toULong(reserveArguments[0]);
620 std::string where = converter.toString(reserveArguments[1]);
621 successCallback = converter.toFunctionOrNull(reserveArguments[2]);
622 errorCallBack = converter.toFunctionOrNull(reserveArguments[3]);
624 unsigned long dataSize = where.size();
626 if (dataSize > PROTOCOL_DATA_MAX)
628 return JSWebAPIErrorFactory::postException(context, exception,
629 JSWebAPIErrorFactory::INVALID_VALUES_ERROR, "Data is too big");
633 cbm->setOnSuccess(successCallback);
634 cbm->setOnError(errorCallBack);
636 event->setPrivateData(DPL::StaticPointerCast<WrtDeviceApis::Commons::IEventPrivateData > (cbm));
637 DataControlListener& listener = DataControlListener::getInstance();
640 event->setReqId(reqId);
641 event->setWhere(where);
642 event->setForAsynchronousCall(&listener);
644 dataControlConsumer->deleteData(event);
645 DataControlAsyncCallbackManagerSingleton::Instance().registerCallbackManager(cbm, priv->getContext());
649 Catch (WrtDeviceApis::Commons::ConversionException)
651 LoggerE("ConversionException");
652 return JSWebAPIErrorFactory::postException(context, exception,
653 JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "type mismatch error");
656 Catch (WrtDeviceApis::Commons::InvalidArgumentException)
658 LoggerE("InvalidArgumentException");
659 return JSWebAPIErrorFactory::postException(context, exception,
660 JSWebAPIErrorFactory::INVALID_VALUES_ERROR, "type mismatch error");
662 Catch(WrtDeviceApis::Commons::UnsupportedException)
664 LoggerE("UnsupportException");
665 return JSWebAPIErrorFactory::postException(context, exception,
666 JSWebAPIErrorFactory::NOT_SUPPORTED_ERROR, "Unsupport Exception");
668 Catch(WrtDeviceApis::Commons::Exception)
670 LoggerE("UnkownException");
671 return JSWebAPIErrorFactory::postException(context, exception,
672 JSWebAPIErrorFactory::UNKNOWN_ERROR, "Unkown error");
674 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
675 return JSValueMakeUndefined(context);