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 AceSecurityStatus status = DATACONTROL_CHECK_ACCESS(DATACONTROL_FUNC_CONSUMER);
175 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
178 // argument validation with new validator
181 ArgumentValidator validator(context, argumentCount, arguments);
182 validator.toULong(0, false);
183 validator.toObject(1, false);
184 validator.toFunction(2, true);
185 validator.toFunction(3, true);
187 catch (const BasePlatformException &err)
189 return JSWebAPIException::throwException(context, exception, err);
193 DeviceAPI::Common::UnknownException err("");
194 return JSWebAPIException::throwException(context, exception, err);
198 DataControlConverter converter(context);
199 JSSQLDataControlConsumerPriv *priv = static_cast<JSSQLDataControlConsumerPriv*>(JSObjectGetPrivate(thisObject));
200 JSValueRef successCallback = NULL;
201 JSValueRef errorCallBack = NULL;
203 JSValueRef reserveArguments[5];
207 return JSTizenExceptionFactory::postException(context, exception,
208 JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error");
211 JSCallbackManagerPtr cbm = JSCallbackManager::createObject(priv->getContext(), NULL, NULL);
216 for (index = 0; index < 4; index++)
218 if (index < argumentCount)
219 reserveArguments[index] = arguments[index];
221 reserveArguments[index] = JSValueMakeUndefined(context);
224 ISQLDataControlConsumerPtr dataControlConsumer(priv->getObject());
225 EventInsertPtr event(new EventInsert);
227 unsigned int reqId = converter.toULong(reserveArguments[0]);
228 RowDataPtr rowData = converter.toRowDataPtr(reserveArguments[1]);
229 successCallback = converter.toFunctionOrNull(reserveArguments[2]);
230 errorCallBack = converter.toFunctionOrNull(reserveArguments[3]);
232 cbm->setOnSuccess(successCallback);
233 cbm->setOnError(errorCallBack);
235 event->setPrivateData(DPL::StaticPointerCast<WrtDeviceApis::Commons::IEventPrivateData> (cbm));
236 DataControlListener& listener = DataControlListener::getInstance();
238 event->setReqId(reqId);
239 event->setRowData(rowData);
240 event->setForAsynchronousCall(&listener);
242 dataControlConsumer->insertData(event);
243 DataControlAsyncCallbackManagerSingleton::Instance().registerCallbackManager(cbm, priv->getContext());
246 Catch (WrtDeviceApis::Commons::ConversionException)
248 LoggerE("ConversionException");
249 return JSTizenExceptionFactory::postException(context, exception,
250 JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error");
253 Catch (WrtDeviceApis::Commons::InvalidArgumentException)
255 LoggerE("InvalidArgumentException");
256 return JSTizenExceptionFactory::postException(context, exception,
257 JSTizenException::INVALID_VALUES_ERROR, "type mismatch error");
259 Catch(WrtDeviceApis::Commons::UnsupportedException)
261 LoggerE("UnsupportException");
262 return JSTizenExceptionFactory::postException(context, exception,
263 JSTizenException::NOT_SUPPORTED_ERROR, "Unsupport Exception");
265 Catch(WrtDeviceApis::Commons::Exception)
267 LoggerE("UnkownException");
268 return JSTizenExceptionFactory::postException(context, exception,
269 JSTizenException::UNKNOWN_ERROR, "Unkown error");
271 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
272 return JSValueMakeUndefined(context);
276 JSValueRef JSSQLDataControlConsumer::update(
277 JSContextRef context, JSObjectRef object,
278 JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[],
279 JSValueRef* exception)
282 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
284 AceSecurityStatus status = DATACONTROL_CHECK_ACCESS(DATACONTROL_FUNC_CONSUMER);
285 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
287 // argument validation with new validator
290 ArgumentValidator validator(context, argumentCount, arguments);
291 validator.toULong(0, false);
292 validator.toObject(1, false);
293 validator.toString(2, false);
294 validator.toFunction(3, true);
295 validator.toFunction(4, true);
297 catch (const BasePlatformException &err)
299 return JSWebAPIException::throwException(context, exception, err);
303 DeviceAPI::Common::UnknownException err("");
304 return JSWebAPIException::throwException(context, exception, err);
307 DataControlConverter converter(context);
308 JSSQLDataControlConsumerPriv *priv = static_cast<JSSQLDataControlConsumerPriv*>(JSObjectGetPrivate(thisObject));
309 JSValueRef successCallback = NULL;
310 JSValueRef errorCallBack = NULL;
312 JSValueRef reserveArguments[6];
316 return JSTizenExceptionFactory::postException(context, exception,
317 JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error");
321 JSCallbackManagerPtr cbm = JSCallbackManager::createObject(priv->getContext(), NULL, NULL);
326 for (index = 0; index < 6; index++)
328 if (index < argumentCount)
329 reserveArguments[index] = arguments[index];
331 reserveArguments[index] = JSValueMakeUndefined(context);
334 ISQLDataControlConsumerPtr dataControlConsumer(priv->getObject());
335 EventUpdatePtr event(new EventUpdate);
337 unsigned int reqId = converter.toULong(reserveArguments[0]);
338 RowDataPtr rowData = converter.toRowDataPtr(reserveArguments[1]);
339 std::string where = converter.toString(reserveArguments[2]);
340 successCallback = converter.toFunctionOrNull(reserveArguments[3]);
341 errorCallBack = converter.toFunctionOrNull(reserveArguments[4]);
343 cbm->setOnSuccess(successCallback);
344 cbm->setOnError(errorCallBack);
346 event->setPrivateData(DPL::StaticPointerCast<WrtDeviceApis::Commons::IEventPrivateData > (cbm));
347 DataControlListener& listener = DataControlListener::getInstance();
350 event->setReqId(reqId);
351 event->setWhere(where);
352 event->setRowData(rowData);
353 event->setForAsynchronousCall(&listener);
355 dataControlConsumer->updateData(event);
356 DataControlAsyncCallbackManagerSingleton::Instance().registerCallbackManager(cbm, priv->getContext());
358 Catch (WrtDeviceApis::Commons::ConversionException)
360 LoggerE("ConversionException");
361 return JSTizenExceptionFactory::postException(context, exception,
362 JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error");
365 Catch (WrtDeviceApis::Commons::InvalidArgumentException)
367 LoggerE("InvalidArgumentException");
368 return JSTizenExceptionFactory::postException(context, exception,
369 JSTizenException::INVALID_VALUES_ERROR, "type mismatch error");
371 Catch(WrtDeviceApis::Commons::UnsupportedException)
373 LoggerE("UnsupportException");
374 return JSTizenExceptionFactory::postException(context, exception,
375 JSTizenException::NOT_SUPPORTED_ERROR, "Unsupport Exception");
377 Catch(WrtDeviceApis::Commons::Exception)
379 LoggerE("UnkownException");
380 return JSTizenExceptionFactory::postException(context, exception,
381 JSTizenException::UNKNOWN_ERROR, "Unkown error");
383 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
384 return JSValueMakeUndefined(context);
388 JSValueRef JSSQLDataControlConsumer::select(
389 JSContextRef context, JSObjectRef object,
390 JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[],
391 JSValueRef* exception)
395 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
397 AceSecurityStatus status = DATACONTROL_CHECK_ACCESS(DATACONTROL_FUNC_CONSUMER);
398 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
400 // argument validation with new validator
403 ArgumentValidator validator(context, argumentCount, arguments);
404 validator.toULong(0, false);
405 validator.toArrayObject(1, false);
406 validator.toString(2, false);
407 validator.toFunction(3, false);
408 validator.toFunction(4, true);
409 validator.toULong(5, true);
410 validator.toULong(6, true);
412 catch (const BasePlatformException &err)
414 return JSWebAPIException::throwException(context, exception, err);
418 DeviceAPI::Common::UnknownException err("");
419 return JSWebAPIException::throwException(context, exception, err);
423 JSSQLDataControlConsumerPriv *priv = static_cast<JSSQLDataControlConsumerPriv*>(JSObjectGetPrivate(thisObject));
424 JSValueRef successCallback = NULL;
425 JSValueRef errorCallBack = NULL;
427 JSValueRef reserveArguments[7];
431 return JSTizenExceptionFactory::postException(context, exception,
432 JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error");
435 JSContextRef globalContext = priv->getContext();
436 DataControlConverter converter(globalContext);
437 JSCallbackManagerPtr cbm = JSCallbackManager::createObject(priv->getContext(), NULL, NULL);
442 for (index = 0; index < 7; index++)
444 if (index < argumentCount)
445 reserveArguments[index] = arguments[index];
447 reserveArguments[index] = JSValueMakeUndefined(globalContext);
450 ISQLDataControlConsumerPtr dataControlConsumer(priv->getObject());
451 EventSelectPtr event(new EventSelect);
453 unsigned int reqId = converter.toULong(reserveArguments[0]);
457 std::vector<std::string> columns = converter.toVectorOfStrings(reserveArguments[1]);
459 if (columns.size() == 0)
460 Throw(WrtDeviceApis::Commons::ConversionException);
463 std::string where = converter.toString(reserveArguments[2]);
468 successCallback = converter.toFunctionOrNull(reserveArguments[3]);
469 errorCallBack = converter.toFunctionOrNull(reserveArguments[4]);
471 cbm->setOnSuccess(successCallback);
472 cbm->setOnError(errorCallBack);
474 event->setPrivateData(DPL::StaticPointerCast<WrtDeviceApis::Commons::IEventPrivateData > (cbm));
475 DataControlListener& listener = DataControlListener::getInstance();
477 if (JSValueIsUndefined(globalContext, reserveArguments[5]) == false)
479 std::string page = converter.toString(reserveArguments[5]);
480 event->setPage(page);
483 if (JSValueIsUndefined(globalContext,reserveArguments[6]) == false)
485 std::string number = converter.toString(reserveArguments[6]);
486 event->setNumberPerPage(number);
489 event->setReqId(reqId);
490 event->setWhere(where);
491 event->setForAsynchronousCall(&listener);
492 event->setColumns(columns);
493 dataControlConsumer->selectData(event);
494 DataControlAsyncCallbackManagerSingleton::Instance().registerCallbackManager(cbm, priv->getContext());
497 Catch (WrtDeviceApis::Commons::ConversionException)
499 LoggerE("ConversionException");
500 return JSTizenExceptionFactory::postException(context, exception,
501 JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error");
504 Catch (WrtDeviceApis::Commons::InvalidArgumentException)
506 LoggerE("InvalidArgumentException");
507 return JSTizenExceptionFactory::postException(context, exception,
508 JSTizenException::INVALID_VALUES_ERROR, "type mismatch error");
510 Catch(WrtDeviceApis::Commons::UnsupportedException)
512 LoggerE("UnsupportException");
513 return JSTizenExceptionFactory::postException(context, exception,
514 JSTizenException::NOT_SUPPORTED_ERROR, "Unsupport Exception");
516 Catch(WrtDeviceApis::Commons::Exception)
518 LoggerE("UnkownException");
519 return JSTizenExceptionFactory::postException(context, exception,
520 JSTizenException::UNKNOWN_ERROR, "Unkown error");
522 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
523 return JSValueMakeUndefined(context);
526 JSValueRef JSSQLDataControlConsumer::remove(
527 JSContextRef context, JSObjectRef object,
528 JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[],
529 JSValueRef* exception)
532 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
534 AceSecurityStatus status = DATACONTROL_CHECK_ACCESS(DATACONTROL_FUNC_CONSUMER);
535 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
537 // argument validation with new validator
540 ArgumentValidator validator(context, argumentCount, arguments);
541 validator.toULong(0, false);
542 validator.toString(1, false);
543 validator.toFunction(2, true);
544 validator.toFunction(3, true);
546 catch (const BasePlatformException &err)
548 return JSWebAPIException::throwException(context, exception, err);
552 DeviceAPI::Common::UnknownException err("");
553 return JSWebAPIException::throwException(context, exception, err);
556 DataControlConverter converter(context);
557 JSSQLDataControlConsumerPriv *priv = static_cast<JSSQLDataControlConsumerPriv*>(JSObjectGetPrivate(thisObject));
558 JSValueRef successCallback = NULL;
559 JSValueRef errorCallBack = NULL;
561 JSValueRef reserveArguments[4];
565 return JSTizenExceptionFactory::postException(context, exception,
566 JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error");
569 JSCallbackManagerPtr cbm = JSCallbackManager::createObject(priv->getContext(), NULL, NULL);
576 for (index = 0; index < 4; index++)
578 if (index < argumentCount)
579 reserveArguments[index] = arguments[index];
581 reserveArguments[index] = JSValueMakeUndefined(context);
584 ISQLDataControlConsumerPtr dataControlConsumer(priv->getObject());
585 EventDeletePtr event(new EventDelete);
587 unsigned int reqId = converter.toULong(reserveArguments[0]);
588 std::string where = converter.toString(reserveArguments[1]);
589 successCallback = converter.toFunctionOrNull(reserveArguments[2]);
590 errorCallBack = converter.toFunctionOrNull(reserveArguments[3]);
592 cbm->setOnSuccess(successCallback);
593 cbm->setOnError(errorCallBack);
595 event->setPrivateData(DPL::StaticPointerCast<WrtDeviceApis::Commons::IEventPrivateData > (cbm));
596 DataControlListener& listener = DataControlListener::getInstance();
599 event->setReqId(reqId);
600 event->setWhere(where);
601 event->setForAsynchronousCall(&listener);
603 dataControlConsumer->deleteData(event);
604 DataControlAsyncCallbackManagerSingleton::Instance().registerCallbackManager(cbm, priv->getContext());
608 Catch (WrtDeviceApis::Commons::ConversionException)
610 LoggerE("ConversionException");
611 return JSTizenExceptionFactory::postException(context, exception,
612 JSTizenException::TYPE_MISMATCH_ERROR, "type mismatch error");
615 Catch (WrtDeviceApis::Commons::InvalidArgumentException)
617 LoggerE("InvalidArgumentException");
618 return JSTizenExceptionFactory::postException(context, exception,
619 JSTizenException::INVALID_VALUES_ERROR, "type mismatch error");
621 Catch(WrtDeviceApis::Commons::UnsupportedException)
623 LoggerE("UnsupportException");
624 return JSTizenExceptionFactory::postException(context, exception,
625 JSTizenException::NOT_SUPPORTED_ERROR, "Unsupport Exception");
627 Catch(WrtDeviceApis::Commons::Exception)
629 LoggerE("UnkownException");
630 return JSTizenExceptionFactory::postException(context, exception,
631 JSTizenException::UNKNOWN_ERROR, "Unkown error");
633 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
634 return JSValueMakeUndefined(context);