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 * @file JSAddressBook.cpp
20 * @author Kisub Song (kisubs.song@samsung.com)
22 * @brief Implementation of the JSAddressBook class
25 #include <CommonsJavaScript/Validator.h>
26 #include <CommonsJavaScript/Converter.h>
27 #include <CommonsJavaScript/JSCallbackManager.h>
28 #include <CommonsJavaScript/JSUtils.h>
29 #include <CommonsJavaScript/JSPendingOperation.h>
30 #include <JSTizenExceptionFactory.h>
31 #include <JSTizenException.h>
32 #include <SecurityExceptions.h>
33 #include <FilterConverter.h>
34 #include "ContactFactory.h"
35 #include "EventAddressBookAddBatch.h"
36 #include "EventAddressBookUpdateBatch.h"
37 #include "EventAddressBookRemoveBatch.h"
38 #include "EventAddressBookFind.h"
39 #include "EventAddressBookChangeListener.h"
40 #include "EventAddressBookRemoveBatch.h"
41 #include "plugin_config.h"
42 #include "JSAddressBook.h"
43 #include "JSContact.h"
44 #include "JSContactGroup.h"
45 #include "ContactConverter.h"
46 #include "AddressBookController.h"
47 #include "JSAddressBookChangeCallbackManager.h"
48 #include "ContactAsyncCallbackManager.h"
49 #include "ContactListenerManager.h"
50 #include "ContactFilterConverter.h"
51 #include <ArgumentValidator.h>
52 #include <JSWebAPIError.h>
54 #include <TimeTracer.h>
59 #define TIZEN_ADDRESS_BOOK_ID "id"
60 #define TIZEN_ADDRESS_BOOK_NAME "name"
61 #define TIZEN_ADDRESS_BOOK_READ_ONLY "readOnly"
62 #define TIZEN_ADDRESS_BOOK_ACCOUNT_ID "accountId"
64 #define TIZEN_ADDRESS_BOOK "AddressBook"
69 using namespace DeviceAPI::Common;
70 using namespace DeviceAPI::Tizen;
\rusing namespace WrtDeviceApis::Commons;
71 using namespace WrtDeviceApis::CommonsJavaScript;
73 JSClassRef JSAddressBook::m_jsClassRef = NULL;
75 JSClassDefinition JSAddressBook::m_classInfo = {
77 kJSClassAttributeNone,
87 NULL, //DeleteProperty,
88 NULL, //GetPropertyNames,
89 NULL, //CallAsFunction,
90 NULL, //CallAsConstructor,
92 NULL, //ConvertToType,
95 JSStaticValue JSAddressBook::m_property[] = {
96 { TIZEN_ADDRESS_BOOK_ID, getId, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
97 { TIZEN_ADDRESS_BOOK_NAME, getName, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
98 { TIZEN_ADDRESS_BOOK_READ_ONLY, getReadOnly, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
99 // { TIZEN_ADDRESS_BOOK_ACCOUNT_ID, getAccountId, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
103 JSStaticFunction JSAddressBook::m_function[] = {
104 { "get", get, kJSPropertyAttributeNone },
105 { "add", add, kJSPropertyAttributeNone },
106 { "addBatch", addBatch, kJSPropertyAttributeNone },
107 { "update", update, kJSPropertyAttributeNone },
108 { "updateBatch", updateBatch, kJSPropertyAttributeNone },
109 { "remove", remove, kJSPropertyAttributeNone },
110 { "removeBatch", removeBatch, kJSPropertyAttributeNone },
111 { "find", find, kJSPropertyAttributeNone },
112 { "addChangeListener", addChangeListener, kJSPropertyAttributeNone },
113 { "removeChangeListener", removeChangeListener, kJSPropertyAttributeNone },
114 { "getGroup", getGroup, kJSPropertyAttributeNone },
115 { "addGroup", addGroup, kJSPropertyAttributeNone },
116 { "updateGroup", updateGroup, kJSPropertyAttributeNone },
117 { "removeGroup", removeGroup, kJSPropertyAttributeNone },
118 { "getGroups", getGroups, kJSPropertyAttributeNone },
122 const JSClassDefinition* JSAddressBook::getClassInfo()
127 const JSClassRef JSAddressBook::getClassRef()
131 m_jsClassRef = JSClassCreate(&m_classInfo);
136 void JSAddressBook::Initialize(JSContextRef context,
139 // AddressBookController *priv =
140 // static_cast<AddressBookController*>(JSObjectGetPrivate(object));
143 void JSAddressBook::Finalize(JSObjectRef object)
145 AddressBookController *priv =
146 static_cast<AddressBookController*>(JSObjectGetPrivate(object));
151 bool JSAddressBook::isObjectOfClass(JSContextRef context, JSValueRef value)
153 return JSValueIsObjectOfClass(context, value, getClassRef());
156 AddressBookPtr JSAddressBook::getAddressBook(JSContextRef context, JSValueRef value)
158 if (!isObjectOfClass(context, value)) {
159 Throw(InvalidArgumentException);
161 JSObjectRef object = JSValueToObject(context, value, NULL);
163 Throw(InvalidArgumentException);
165 AddressBookController *priv = static_cast<AddressBookController*>(JSObjectGetPrivate(object));
167 Throw(NullPointerException);
169 return priv->getObject();
172 AddressBookPtr JSAddressBook::getPrivData(JSObjectRef object)
174 AddressBookController *priv =
175 static_cast<AddressBookController*>(JSObjectGetPrivate(object));
177 return priv->getObject();
179 Throw(NullPointerException);
182 JSValueRef JSAddressBook::getId(JSContextRef context,
184 JSStringRef propertyName,
185 JSValueRef* exception)
189 ContactConverterFactory::ConverterType converter =
190 ContactConverterFactory::getConverter(context);
191 AddressBookPtr addressBook = getPrivData(object);
192 string id = addressBook->getId();
194 return converter->toJSValueRef(id);
196 return JSValueMakeNull(context);
198 Catch(WrtDeviceApis::Commons::Exception)
200 LoggerW("trying to get incorrect value");
202 return JSValueMakeUndefined(context);
205 JSValueRef JSAddressBook::getName(JSContextRef context,
207 JSStringRef propertyName,
208 JSValueRef* exception)
212 ContactConverterFactory::ConverterType converter =
213 ContactConverterFactory::getConverter(context);
214 AddressBookPtr addressBook = getPrivData(object);
215 return converter->toJSValueRef(addressBook->getName());
217 Catch(WrtDeviceApis::Commons::Exception)
219 LoggerW("trying to get incorrect value");
222 return JSValueMakeUndefined(context);
225 JSValueRef JSAddressBook::getReadOnly(JSContextRef context,
227 JSStringRef propertyName,
228 JSValueRef* exception)
232 ContactConverterFactory::ConverterType converter =
233 ContactConverterFactory::getConverter(context);
234 AddressBookPtr addressBook = getPrivData(object);
235 return converter->toJSValueRef(addressBook->getReadOnly());
237 Catch(WrtDeviceApis::Commons::Exception)
239 LoggerW("trying to get incorrect value");
242 return JSValueMakeUndefined(context);
245 JSValueRef JSAddressBook::getAccountId(JSContextRef context,
247 JSStringRef propertyName,
248 JSValueRef* exception)
252 ContactConverterFactory::ConverterType converter =
253 ContactConverterFactory::getConverter(context);
254 AddressBookPtr addressBook = getPrivData(object);
255 string accountId = addressBook->getAccountId();
257 return converter->toJSValueRef(accountId);
259 return JSValueMakeNull(context);
261 Catch(WrtDeviceApis::Commons::Exception)
263 LoggerW("trying to get incorrect value");
265 return JSValueMakeUndefined(context);
268 JSValueRef JSAddressBook::get(JSContextRef context,
270 JSObjectRef thisObject,
271 size_t argumentCount,
272 const JSValueRef arguments[],
273 JSValueRef* exception)
276 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
277 AddressBookPtr addressBook;
278 AddressBookController *controller;
279 JSContextRef gContext;
282 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
284 ThrowMsg(InvalidArgumentException, "No private object.");
286 addressBook = controller->getObject();
287 gContext = controller->getContext();
290 LoggerE("No private object");
291 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
294 AceSecurityStatus status = CONTACT_CHECK_ACCESS(CONTACT_FUNCTION_API_ADDRESS_BOOK_GET);
295 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
300 ArgumentValidator validator(context, argumentCount, arguments);
301 id = validator.toString(0, false);
302 } catch (const TypeMismatchException& err ) {
303 return JSWebAPIError::throwException(context, exception, err);
304 } catch(const BasePlatformException& err) {
305 return JSWebAPIError::throwException(context, exception, err);
306 } catch(const ConversionException& err) {
307 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
308 } catch(const NullPointerException& err) {
309 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
312 EventAddressBookGetPtr dplEvent(new EventAddressBookGet());
315 dplEvent->setForSynchronousCall();
318 addressBook->get(dplEvent);
320 LoggerE("Error on platform : " << _rethrown_exception.GetMessage());
321 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
324 if (!dplEvent->getResult() || !dplEvent->getContactIsSet())
326 std::stringstream oss;
327 switch (dplEvent->getExceptionCode())
329 case ExceptionCodes::NotFoundException:
330 case ExceptionCodes::InvalidArgumentException:
331 LoggerE("Not Found error : " << id);
332 oss << "No Contact id '" << id << "'";
333 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_FOUND_ERROR, oss.str());
335 case ExceptionCodes::PlatformException:
336 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
339 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
344 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
346 ContactPtr contact = dplEvent->getContact();
349 result = converter->toJSValueRef(contact);
351 LoggerE("Error on conversion : " << _rethrown_exception.GetMessage());
352 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
355 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
359 JSValueRef JSAddressBook::add(JSContextRef context,
361 JSObjectRef thisObject,
362 size_t argumentCount,
363 const JSValueRef arguments[],
364 JSValueRef* exception)
367 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
368 AddressBookPtr addressBook;
369 AddressBookController *controller;
370 JSContextRef gContext;
373 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
375 ThrowMsg(InvalidArgumentException, "No private object.");
377 addressBook = controller->getObject();
378 gContext = controller->getContext();
380 LoggerE("No private object");
381 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
384 AceSecurityStatus status = CONTACT_CHECK_ACCESS(CONTACT_FUNCTION_API_ADDRESS_BOOK_ADD);
385 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
388 ArgumentValidator validator(context, argumentCount, arguments);
389 validator.toObject(0, false);
390 } catch (const TypeMismatchException& err ) {
391 return JSWebAPIError::throwException(context, exception, err);
392 } catch(const BasePlatformException& err) {
393 return JSWebAPIError::throwException(context, exception, err);
394 } catch(const ConversionException& err) {
395 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
396 } catch(const NullPointerException& err) {
397 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
400 ContactPtr contact(NULL);
402 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
404 if (!JSContact::isObjectOfClass(context, arguments[0]))
405 ThrowMsg(InvalidArgumentException, "1st argument is not a 'Contact object'.");
406 contact = converter->toContact(arguments[0]);
408 LoggerE("Error on conversion : " << _rethrown_exception.GetMessage());
409 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "1st argument must be a 'Contact object'");
412 EventAddressBookAddPtr dplEvent(new EventAddressBookAdd());
414 dplEvent->setContact(contact);
415 dplEvent->setForSynchronousCall();
418 addressBook->add(dplEvent);
420 LoggerE("Error on platform : " << _rethrown_exception.GetMessage());
421 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
424 if (!dplEvent->getResult())
426 switch (dplEvent->getExceptionCode())
428 case ExceptionCodes::PlatformException:
429 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
431 case ExceptionCodes::InvalidArgumentException:
432 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::INVALID_VALUES_ERROR, "There is Invalid input value");
435 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
440 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
441 return JSValueMakeUndefined(context);
444 JSValueRef JSAddressBook::addBatch(JSContextRef context,
446 JSObjectRef thisObject,
447 size_t argumentCount,
448 const JSValueRef arguments[],
449 JSValueRef* exception)
452 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
453 AddressBookPtr addressBook;
454 JSContextRef gContext;
455 AddressBookController *controller;
457 bool js2ndParamIsFunction = false;
458 bool js3rdParamIsFunction = false;
461 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
463 ThrowMsg(InvalidArgumentException, "No private object.");
465 addressBook = controller->getObject();
466 gContext = controller->getContext();
468 LoggerE("No private object");
469 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
472 AceSecurityStatus status = CONTACT_CHECK_ACCESS(CONTACT_FUNCTION_API_ADDRESS_BOOK_ADD_BATCH);
473 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
476 ArgumentValidator validator(context, argumentCount, arguments);
478 validator.toObject(0, false);
479 JSObjectRef successObj = validator.toFunction(1, true);
481 js2ndParamIsFunction = true;
483 JSObjectRef errorObj = validator.toFunction(2, true);
485 js3rdParamIsFunction = true;
487 } catch (const TypeMismatchException& err ) {
488 return JSWebAPIError::throwException(context, exception, err);
489 } catch(const BasePlatformException& err) {
490 return JSWebAPIError::throwException(context, exception, err);
491 } catch(const ConversionException& err) {
492 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
493 } catch(const NullPointerException& err) {
494 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
497 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
499 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
501 if(js2ndParamIsFunction)
502 callbackManager->setOnSuccess(arguments[1]);
504 if(js3rdParamIsFunction)
505 callbackManager->setOnError(arguments[2]);
507 callbackManager->setObject(thisObject);
509 EventAddressBookAddBatchPtr dplEvent(new EventAddressBookAddBatch());
511 dplEvent->setContacts(converter->toContactArray(arguments[0]));
512 } Catch(ConversionException) {
513 LoggerE("Error on conversion : " << _rethrown_exception.GetMessage());
514 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "1st argument must be an array of 'Contact object'");
517 // set event handler's data
518 dplEvent->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
519 dplEvent->setForAsynchronousCall(controller);
521 // DPL::SharedPtr<IEventController> eventContr = DPL::StaticPointerCast< IEventController>(dplEvent);
522 // IJSPendingOperationPrivateObject *gcPendingOperation = new IJSPendingOperationPrivateObject(eventContr);
525 addressBook->addBatch(dplEvent);
526 ContactAsyncCallbackManagerSingleton::Instance().registerCallbackManager(callbackManager, gContext);
528 LoggerE("Error on platform : " << _rethrown_exception.GetMessage());
529 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
532 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
533 // return JSObjectMake(gContext, JSPendingOperation::getClassRef(), gcPendingOperation);
534 return JSValueMakeUndefined(context);
537 JSValueRef JSAddressBook::update(JSContextRef context,
539 JSObjectRef thisObject,
540 size_t argumentCount,
541 const JSValueRef arguments[],
542 JSValueRef* exception)
545 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
546 AddressBookPtr addressBook;
547 AddressBookController *controller;
548 JSContextRef gContext;
551 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
553 ThrowMsg(InvalidArgumentException, "No private object.");
555 addressBook = controller->getObject();
556 gContext = controller->getContext();
558 LoggerE("No private object");
559 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
562 AceSecurityStatus status = CONTACT_CHECK_ACCESS(CONTACT_FUNCTION_API_ADDRESS_BOOK_UPDATE);
563 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
566 ArgumentValidator validator(context, argumentCount, arguments);
567 validator.toObject(0, false);
569 } catch (const TypeMismatchException& err ) {
570 return JSWebAPIError::throwException(context, exception, err);
571 } catch(const BasePlatformException& err) {
572 return JSWebAPIError::throwException(context, exception, err);
573 } catch(const ConversionException& err) {
574 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
575 } catch(const NullPointerException& err) {
576 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
579 ContactPtr contact(NULL);
581 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
583 if (!JSContact::isObjectOfClass(context, arguments[0]))
584 ThrowMsg(InvalidArgumentException, "1st argument is not a 'Contact object'.");
585 contact = converter->toContact(arguments[0]);
587 LoggerE("Error on conversion : " << _rethrown_exception.GetMessage());
588 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "1st argument is not a 'Contact object'");
591 EventAddressBookUpdatePtr dplEvent(new EventAddressBookUpdate());
593 dplEvent->setContact(contact);
594 dplEvent->setForSynchronousCall();
597 addressBook->update(dplEvent);
599 LoggerE("Error on platform : " << _rethrown_exception.GetMessage());
600 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
603 if (!dplEvent->getResult())
605 std::stringstream oss;
606 switch (dplEvent->getExceptionCode())
608 case ExceptionCodes::NotFoundException:
609 case ExceptionCodes::InvalidArgumentException:
610 oss << "No Contact id '" << contact->getId() << "'";
611 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_FOUND_ERROR, oss.str());
613 case ExceptionCodes::PlatformException:
614 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
617 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
622 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
623 return JSValueMakeUndefined(context);
626 JSValueRef JSAddressBook::updateBatch(JSContextRef context,
628 JSObjectRef thisObject,
629 size_t argumentCount,
630 const JSValueRef arguments[],
631 JSValueRef* exception)
634 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
635 AddressBookPtr addressBook;
636 JSContextRef gContext;
637 AddressBookController *controller;
639 bool js2ndParamIsFunction = false;
640 bool js3rdParamIsFunction = false;
643 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
645 ThrowMsg(InvalidArgumentException, "No private object.");
647 addressBook = controller->getObject();
648 gContext = controller->getContext();
650 LoggerE("No private object");
651 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
654 AceSecurityStatus status = CONTACT_CHECK_ACCESS(CONTACT_FUNCTION_API_ADDRESS_BOOK_UPDATE_BATCH);
655 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
658 ArgumentValidator validator(context, argumentCount, arguments);
660 validator.toObject(0, false);
662 JSObjectRef successObj = validator.toFunction(1, true);
664 js2ndParamIsFunction = true;
666 JSObjectRef errorObj = validator.toFunction(2, true);
668 js3rdParamIsFunction = true;
670 } catch (const TypeMismatchException& err ) {
671 return JSWebAPIError::throwException(context, exception, err);
672 } catch(const BasePlatformException& err) {
673 return JSWebAPIError::throwException(context, exception, err);
674 } catch(const ConversionException& err) {
675 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
676 } catch(const NullPointerException& err) {
677 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
680 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
682 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
684 if(js2ndParamIsFunction)
685 callbackManager->setOnSuccess(arguments[1]);
687 if(js3rdParamIsFunction)
688 callbackManager->setOnError(arguments[2]);
690 callbackManager->setObject(thisObject);
692 EventAddressBookUpdateBatchPtr dplEvent(new EventAddressBookUpdateBatch());
694 dplEvent->setContacts(converter->toContactArray(arguments[0]));
695 } Catch(ConversionException) {
696 LoggerE("Error on conversion : " << _rethrown_exception.GetMessage());
697 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "3rd argument must be an array of 'Contact object'");
700 // set event handler's data
701 dplEvent->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
702 dplEvent->setForAsynchronousCall(controller);
704 // DPL::SharedPtr<IEventController> eventContr = DPL::StaticPointerCast< IEventController>(dplEvent);
705 // IJSPendingOperationPrivateObject *gcPendingOperation = new IJSPendingOperationPrivateObject(eventContr);
708 addressBook->updateBatch(dplEvent);
709 ContactAsyncCallbackManagerSingleton::Instance().registerCallbackManager(callbackManager, gContext);
711 LoggerE("Error on platform : " << _rethrown_exception.GetMessage());
712 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
715 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
716 // return JSObjectMake(gContext, JSPendingOperation::getClassRef(), gcPendingOperation);
717 return JSValueMakeUndefined(context);
720 JSValueRef JSAddressBook::remove(JSContextRef context,
722 JSObjectRef thisObject,
723 size_t argumentCount,
724 const JSValueRef arguments[],
725 JSValueRef* exception)
728 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
729 AddressBookPtr addressBook;
730 AddressBookController *controller;
733 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
735 ThrowMsg(InvalidArgumentException, "No private object.");
737 addressBook = controller->getObject();
739 LoggerE("No private object");
740 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
743 AceSecurityStatus status = CONTACT_CHECK_ACCESS(CONTACT_FUNCTION_API_ADDRESS_BOOK_REMOVE);
744 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
746 ArgumentValidator validator(context, argumentCount, arguments);
749 contactId = validator.toString(0, false);
750 } catch (const TypeMismatchException& err ) {
751 return JSWebAPIError::throwException(context, exception, err);
752 } catch(const BasePlatformException& err) {
753 return JSWebAPIError::throwException(context, exception, err);
754 } catch(const ConversionException& err) {
755 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
756 } catch(const NullPointerException& err) {
757 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
760 EventAddressBookRemovePtr dplEvent(new EventAddressBookRemove());
762 dplEvent->setContactId(contactId);
763 dplEvent->setForSynchronousCall();
766 addressBook->remove(dplEvent);
768 LoggerE("Error on platform : " << _rethrown_exception.GetMessage());
769 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
772 if (!dplEvent->getResult())
774 std::stringstream oss;
775 switch (dplEvent->getExceptionCode())
777 case ExceptionCodes::NotFoundException:
778 case ExceptionCodes::InvalidArgumentException:
779 LoggerE("Not Found error : " << contactId);
780 oss << "No Contact id '" << contactId << "'";
781 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_FOUND_ERROR, oss.str());
783 case ExceptionCodes::PlatformException:
784 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
787 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
791 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
792 return JSValueMakeUndefined(context);
795 JSValueRef JSAddressBook::removeBatch(JSContextRef context,
797 JSObjectRef thisObject,
798 size_t argumentCount,
799 const JSValueRef arguments[],
800 JSValueRef* exception)
803 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
804 AddressBookPtr addressBook;
805 JSContextRef gContext;
806 AddressBookController *controller;
808 bool js2ndParamIsFunction = false;
809 bool js3rdParamIsFunction = false;
812 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
814 ThrowMsg(InvalidArgumentException, "No private object.");
816 addressBook = controller->getObject();
817 gContext = controller->getContext();
819 LoggerE("No private object");
820 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
823 AceSecurityStatus status = CONTACT_CHECK_ACCESS(CONTACT_FUNCTION_API_ADDRESS_BOOK_REMOVE_BATCH);
824 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
827 ArgumentValidator validator(context, argumentCount, arguments);
829 validator.toObject(0, false);
830 JSObjectRef successObj = validator.toFunction(1, true);
832 js2ndParamIsFunction = true;
834 JSObjectRef errorObj = validator.toFunction(2, true);
836 js3rdParamIsFunction = true;
838 } catch (const TypeMismatchException& err ) {
839 return JSWebAPIError::throwException(context, exception, err);
840 } catch(const BasePlatformException& err) {
841 return JSWebAPIError::throwException(context, exception, err);
842 } catch(const ConversionException& err) {
843 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
844 } catch(const NullPointerException& err) {
845 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
848 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
850 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
852 if(js2ndParamIsFunction)
853 callbackManager->setOnSuccess(arguments[1]);
855 if(js3rdParamIsFunction)
856 callbackManager->setOnError(arguments[2]);
858 callbackManager->setObject(thisObject);
860 EventAddressBookRemoveBatchPtr dplEvent(new EventAddressBookRemoveBatch());
862 dplEvent->setContactIds(converter->toStringArray(arguments[0]));
863 } Catch(ConversionException) {
864 LoggerE("Error on conversion : " << _rethrown_exception.GetMessage());
865 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "3rd argument must be an array of 'Contact id'");
868 // set event handler's data
869 dplEvent->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
870 dplEvent->setForAsynchronousCall(controller);
872 // DPL::SharedPtr<IEventController> eventContr = DPL::StaticPointerCast< IEventController>(dplEvent);
873 // IJSPendingOperationPrivateObject *gcPendingOperation = new IJSPendingOperationPrivateObject(eventContr);
876 addressBook->removeBatch(dplEvent);
877 ContactAsyncCallbackManagerSingleton::Instance().registerCallbackManager(callbackManager, gContext);
879 LoggerE("Error on platform : " << _rethrown_exception.GetMessage());
880 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
883 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
884 // return JSObjectMake(gContext, JSPendingOperation::getClassRef(), gcPendingOperation);
885 return JSValueMakeUndefined(context);
888 JSValueRef JSAddressBook::find(JSContextRef context,
890 JSObjectRef thisObject,
891 size_t argumentCount,
892 const JSValueRef arguments[],
893 JSValueRef* exception)
896 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
897 AddressBookPtr addressBook;
898 JSContextRef gContext;
899 AddressBookController *controller;
901 bool js2ndParamIsFunction = false;
902 bool js3rdParamIsObject = false;
903 bool js4thParamIsObject = false;
906 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
908 ThrowMsg(InvalidArgumentException, "No private object.");
910 addressBook = controller->getObject();
911 gContext = controller->getContext();
913 LoggerE("No private object");
914 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
917 AceSecurityStatus status = CONTACT_CHECK_ACCESS(CONTACT_FUNCTION_API_ADDRESS_BOOK_FIND);
918 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
921 ArgumentValidator validator(context, argumentCount, arguments);
923 validator.toFunction(0, false);
924 JSObjectRef errorObj = validator.toFunction(1, true);
926 js2ndParamIsFunction = true;
928 JSObjectRef filterObj = validator.toObject(2, true);
930 js3rdParamIsObject = true;
932 JSObjectRef sortObj = validator.toObject(3, true);
934 js4thParamIsObject = true;
936 } catch (const TypeMismatchException& err ) {
937 return JSWebAPIError::throwException(context, exception, err);
938 } catch(const BasePlatformException& err) {
939 return JSWebAPIError::throwException(context, exception, err);
940 } catch(const ConversionException& err) {
941 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
942 } catch(const NullPointerException& err) {
943 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
946 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
948 callbackManager->setOnSuccess(arguments[0]);
950 if (js2ndParamIsFunction)
951 callbackManager->setOnError(arguments[1]);
953 callbackManager->setObject(thisObject);
955 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
956 ContactFilterConverterFactory::ConverterType filterConverter = ContactFilterConverterFactory::getConverter(context);
958 EventAddressBookFindPtr dplEvent(new EventAddressBookFind());
960 if (js3rdParamIsObject)
961 dplEvent->setFilter(filterConverter->toFilter(arguments[2]));
963 LoggerE("Error on 3rd parameter conversion : " << _rethrown_exception.GetMessage());
964 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "3rd argument must be an 'Filter object' or 'null'");
968 if (js4thParamIsObject)
969 dplEvent->setSortMode(filterConverter->toSortMode(arguments[3]));
971 LoggerE("Error on 4th parameter conversion : " << _rethrown_exception.GetMessage());
972 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "4th argument must be an 'SortMode object' or 'null'");
975 // set event handler's data
976 dplEvent->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
977 dplEvent->setForAsynchronousCall(controller);
979 // DPL::SharedPtr<IEventController> eventContr = DPL::StaticPointerCast< IEventController>(dplEvent);
980 // IJSPendingOperationPrivateObject *gcPendingOperation = new IJSPendingOperationPrivateObject(eventContr);
983 addressBook->find(dplEvent);
984 ContactAsyncCallbackManagerSingleton::Instance().registerCallbackManager(callbackManager, gContext);
986 LoggerE("Error on platform : " << _rethrown_exception.GetMessage());
987 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
990 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
991 // return JSObjectMake(gContext, JSPendingOperation::getClassRef(), gcPendingOperation);
992 return JSValueMakeUndefined(context);
995 JSValueRef JSAddressBook::addChangeListener(JSContextRef context,
997 JSObjectRef thisObject,
998 size_t argumentCount,
999 const JSValueRef arguments[],
1000 JSValueRef* exception)
1003 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
1004 AddressBookPtr addressBook;
1005 JSContextRef gContext;
1006 AddressBookController *controller;
1008 bool js2ndParamIsFunction = false;
1011 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
1013 ThrowMsg(InvalidArgumentException, "No private object.");
1015 addressBook = controller->getObject();
1016 gContext = controller->getContext();
1017 } Catch(Exception) {
1018 LoggerE("No private object");
1019 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
1022 AceSecurityStatus status = CONTACT_CHECK_ACCESS(CONTACT_FUNCTION_API_ADDRESS_BOOK_ADD_CHANGE_LISTENER);
1023 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
1025 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
1027 ArgumentValidator Argvalidator(context, argumentCount, arguments);
1028 Argvalidator.toObject(0, false);
1029 JSObjectRef errorObj = Argvalidator.toFunction(1, true);
1031 js2ndParamIsFunction = true;
1032 } catch (const TypeMismatchException& err ) {
1033 return JSWebAPIError::throwException(context, exception, err);
1034 } catch(const BasePlatformException& err) {
1035 return JSWebAPIError::throwException(context, exception, err);
1036 } catch(const ConversionException& err) {
1037 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
1038 } catch(const NullPointerException& err) {
1039 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
1042 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
1044 JSValueRef oncontactsadded;
1045 JSValueRef oncontactsupdated;
1046 JSValueRef oncontactsdeleted;
1048 JSObjectRef callbackObject = converter->toJSObjectRef(arguments[0]);
1050 oncontactsadded = JSUtils::getJSPropertyOrUndefined(context, callbackObject, "oncontactsadded");
1051 if (validator->isNullOrUndefined(oncontactsadded))
1052 oncontactsadded = NULL;
1053 else if (!validator->isCallback(oncontactsadded)) {
1054 ThrowMsg(ConversionException, "2nd argument's oncontactsadded attribute is not a 'function'");
1057 oncontactsupdated = JSUtils::getJSPropertyOrUndefined(context, callbackObject, "oncontactsupdated");
1058 if (validator->isNullOrUndefined(oncontactsupdated))
1059 oncontactsupdated = NULL;
1060 else if (!validator->isCallback(oncontactsupdated)) {
1061 ThrowMsg(ConversionException, "2nd argument's oncontactsupdated attribute is not a 'function'");
1064 oncontactsdeleted = JSUtils::getJSPropertyOrUndefined(context, callbackObject, "oncontactsremoved");
1065 if (validator->isNullOrUndefined(oncontactsdeleted))
1066 oncontactsdeleted = NULL;
1067 else if (!validator->isCallback(oncontactsdeleted)) {
1068 ThrowMsg(ConversionException, "2nd argument's oncontactsremoved attribute is not a 'function'");
1071 if (oncontactsadded == NULL && oncontactsupdated == NULL && oncontactsdeleted == NULL)
1072 ThrowMsg(ConversionException, "2nd argument must have at least one function");
1074 } Catch(ConversionException) {
1075 LoggerE("Error on conversion : " << _rethrown_exception.GetMessage());
1076 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, _rethrown_exception.GetMessage());
1079 JSAddressBookChangeCallbackManagerPtr callbackManager = JSAddressBookChangeCallbackManager::createObject(gContext);
1081 callbackManager->setOnContactsAdded(oncontactsadded);
1082 callbackManager->setOnContactsUpdated(oncontactsupdated);
1083 callbackManager->setOnContactsDeleted(oncontactsdeleted);
1084 if(js2ndParamIsFunction)
1085 callbackManager->setOnError(arguments[1]);
1087 EventAddressBookChangeListenerEmitterPtr emitter(new EventAddressBookChangeListenerEmitter());
1089 emitter->setEventPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
1090 emitter->setListener(controller);
1092 EventAddressBookAddChangeListenerPtr dplEvent(new EventAddressBookAddChangeListener());
1094 dplEvent->setEmitter(emitter);
1095 dplEvent->setForSynchronousCall();
1098 addressBook->addChangeListener(dplEvent);
1099 } Catch(Exception) {
1100 LoggerE("Error on platform : " << _rethrown_exception.GetMessage());
1101 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
1104 if (!dplEvent->getResult() || !dplEvent->getIdIsSet())
1106 switch (dplEvent->getExceptionCode())
1108 case ExceptionCodes::InvalidArgumentException:
1109 case ExceptionCodes::PlatformException:
1110 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
1113 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
1118 long watchId = dplEvent->getId();
1120 ContactsChangeListenerCancellerPtr canceller = ContactsChangeListenerCancellerPtr(new ContactsChangeListenerCanceller(gContext, thisObject, watchId));
1121 DeviceAPI::Common::IListenerItemPtr listenerItem = DPL::StaticPointerCast<DeviceAPI::Common::IListenerItem>(canceller);
1122 ContactListenerManagerSingleton::Instance().registerListener(listenerItem, gContext);
1126 result = JSUtil::toJSValueRef(context, watchId);
1127 // result = converter->toJSValueRefLong(watchId);
1128 } Catch(Exception) {
1129 LoggerE("Error on conversion : " << _rethrown_exception.GetMessage());
1130 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
1132 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
1136 JSValueRef JSAddressBook::removeChangeListener(JSContextRef context,
1138 JSObjectRef thisObject,
1139 size_t argumentCount,
1140 const JSValueRef arguments[],
1141 JSValueRef* exception)
1144 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
1145 AddressBookPtr addressBook;
1146 JSContextRef gContext;
1147 AddressBookController *controller;
1150 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
1152 ThrowMsg(InvalidArgumentException, "No private object.");
1154 addressBook = controller->getObject();
1155 gContext = controller->getContext();
1156 } Catch(Exception) {
1157 LoggerE("No private object");
1158 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
1161 AceSecurityStatus status = CONTACT_CHECK_ACCESS(CONTACT_FUNCTION_API_ADDRESS_BOOK_REMOVE_CHANGE_LISTENER);
1162 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
1167 ArgumentValidator validator(context, argumentCount, arguments);
1168 watchId = validator.toLong(0, false);
1169 } catch (const TypeMismatchException& err ) {
1170 return JSWebAPIError::throwException(context, exception, err);
1171 } catch(const BasePlatformException& err) {
1172 return JSWebAPIError::throwException(context, exception, err);
1173 } catch(const ConversionException& err) {
1174 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
1175 } catch(const NullPointerException& err) {
1176 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
1179 EventAddressBookRemoveChangeListenerPtr dplEvent(new EventAddressBookRemoveChangeListener());
1181 dplEvent->setId(watchId);
1182 dplEvent->setForSynchronousCall();
1185 addressBook->removeChangeListener(dplEvent);
1186 } Catch(Exception) {
1187 LoggerE("Error on platform : " << _rethrown_exception.GetMessage());
1188 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
1191 ContactsChangeListenerCancellerPtr canceller = ContactsChangeListenerCancellerPtr(new ContactsChangeListenerCanceller(gContext, thisObject, watchId));
1192 DeviceAPI::Common::IListenerItemPtr listenerItem = DPL::StaticPointerCast<DeviceAPI::Common::IListenerItem>(canceller);
1193 ContactListenerManagerSingleton::Instance().unregisterListener(listenerItem);
1195 if (!dplEvent->getResult())
1197 switch (dplEvent->getExceptionCode())
1199 case ExceptionCodes::InvalidArgumentException:
1200 case ExceptionCodes::NotFoundException:
1201 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_FOUND_ERROR, "Watch id not found");
1204 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
1208 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
1209 return JSValueMakeUndefined(context);
1212 JSValueRef JSAddressBook::getGroup(JSContextRef context,
1214 JSObjectRef thisObject,
1215 size_t argumentCount,
1216 const JSValueRef arguments[],
1217 JSValueRef* exception)
1220 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
1221 AddressBookPtr addressBook;
1222 AddressBookController *controller;
1223 JSContextRef gContext;
1226 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
1228 ThrowMsg(InvalidArgumentException, "No private object.");
1230 addressBook = controller->getObject();
1231 gContext = controller->getContext();
1232 } Catch(Exception) {
1233 LoggerE("No private object");
1234 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
1237 AceSecurityStatus status = CONTACT_CHECK_ACCESS(CONTACT_FUNCTION_API_ADDRESS_BOOK_GET_GROUP);
1238 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
1242 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
1244 ArgumentValidator validator(context, argumentCount, arguments);
1245 id = validator.toString(0, false);
1246 } catch (const TypeMismatchException& err ) {
1247 return JSWebAPIError::throwException(context, exception, err);
1248 } catch(const BasePlatformException& err) {
1249 return JSWebAPIError::throwException(context, exception, err);
1250 } catch(const ConversionException& err) {
1251 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
1252 } catch(const NullPointerException& err) {
1253 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
1256 EventAddressBookGetGroupPtr dplEvent(new EventAddressBookGetGroup());
1258 dplEvent->setId(id);
1259 dplEvent->setForSynchronousCall();
1262 addressBook->getGroup(dplEvent);
1263 } Catch(Exception) {
1264 LoggerE("Error on platform : " << _rethrown_exception.GetMessage());
1265 return JSTizenExceptionFactory::postException(context, exception,
1266 JSTizenException::UNKNOWN_ERROR, "Internal error");
1269 if (!dplEvent->getResult() || !dplEvent->getContactGroupIsSet())
1271 std::stringstream oss;
1272 switch (dplEvent->getExceptionCode())
1274 case ExceptionCodes::NotFoundException:
1275 case ExceptionCodes::InvalidArgumentException:
1276 LoggerE("Not Found error : " << id);
1277 oss << "No Contact id '" << id << "'";
1278 return JSTizenExceptionFactory::postException(context, exception,
1279 JSTizenException::NOT_FOUND_ERROR, oss.str());
1281 case ExceptionCodes::PlatformException:
1282 return JSTizenExceptionFactory::postException(context, exception,
1283 JSTizenException::UNKNOWN_ERROR, "Internal error");
1286 return JSTizenExceptionFactory::postException(context, exception,
1287 JSTizenException::UNKNOWN_ERROR, "Internal error");
1292 ContactGroupPtr group = dplEvent->getContactGroup();
1296 result = converter->toJSValueRef(group);
1297 } Catch(Exception) {
1298 LoggerE("Error on conversion : " << _rethrown_exception.GetMessage());
1299 return JSTizenExceptionFactory::postException(context, exception,
1300 JSTizenException::UNKNOWN_ERROR, "Internal error");
1302 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
1306 JSValueRef JSAddressBook::addGroup(JSContextRef context,
1308 JSObjectRef thisObject,
1309 size_t argumentCount,
1310 const JSValueRef arguments[],
1311 JSValueRef* exception)
1314 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
1315 AddressBookPtr addressBook;
1316 AddressBookController *controller;
1317 JSContextRef gContext;
1320 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
1322 ThrowMsg(InvalidArgumentException, "No private object.");
1324 addressBook = controller->getObject();
1325 gContext = controller->getContext();
1326 } Catch(Exception) {
1327 LoggerE("No private object");
1328 return JSTizenExceptionFactory::postException(context, exception,
1329 JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
1332 AceSecurityStatus status = CONTACT_CHECK_ACCESS(CONTACT_FUNCTION_API_ADDRESS_BOOK_ADD_GROUP);
1333 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
1336 ArgumentValidator validator(context, argumentCount, arguments);
1337 validator.toObject(0, false);
1339 } catch (const TypeMismatchException& err ) {
1340 return JSWebAPIError::throwException(context, exception, err);
1341 } catch(const BasePlatformException& err) {
1342 return JSWebAPIError::throwException(context, exception, err);
1343 } catch(const ConversionException& err) {
1344 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
1345 } catch(const NullPointerException& err) {
1346 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
1349 ContactGroupPtr group(NULL);
1351 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
1353 if (!JSContactGroup::isObjectOfClass(context, arguments[0]))
1354 ThrowMsg(InvalidArgumentException, "1st argument is not a 'ContactGroup object'.");
1356 group = converter->toContactGroup(arguments[0]);
1357 } Catch(Exception) {
1358 LoggerE("Error on conversion : " << _rethrown_exception.GetMessage());
1359 return JSTizenExceptionFactory::postException(context, exception,
1360 JSTizenException::TYPE_MISMATCH_ERROR, "1st argument must be a 'ContactGroup object'");
1363 EventAddressBookAddGroupPtr dplEvent(new EventAddressBookAddGroup());
1365 dplEvent->setContactGroup(group);
1366 dplEvent->setForSynchronousCall();
1369 addressBook->addGroup(dplEvent);
1370 } Catch(Exception) {
1371 LoggerE("Error on platform : " << _rethrown_exception.GetMessage());
1372 return JSTizenExceptionFactory::postException(context, exception,
1373 JSTizenException::UNKNOWN_ERROR, "Internal error");
1376 if (!dplEvent->getResult())
1378 switch (dplEvent->getExceptionCode())
1380 case ExceptionCodes::PlatformException:
1381 return JSTizenExceptionFactory::postException(context, exception,
1382 JSTizenException::UNKNOWN_ERROR, "Internal error");
1385 return JSTizenExceptionFactory::postException(context, exception,
1386 JSTizenException::UNKNOWN_ERROR, "Internal error");
1390 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
1391 return JSValueMakeUndefined(context);
1394 JSValueRef JSAddressBook::updateGroup(JSContextRef context,
1396 JSObjectRef thisObject,
1397 size_t argumentCount,
1398 const JSValueRef arguments[],
1399 JSValueRef* exception)
1402 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
1403 AddressBookPtr addressBook;
1404 AddressBookController *controller;
1405 JSContextRef gContext;
1408 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
1410 ThrowMsg(InvalidArgumentException, "No private object.");
1412 addressBook = controller->getObject();
1413 gContext = controller->getContext();
1414 } Catch(Exception) {
1415 LoggerE("No private object");
1416 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
1419 AceSecurityStatus status = CONTACT_CHECK_ACCESS(CONTACT_FUNCTION_API_ADDRESS_BOOK_UPDATE_GROUP);
1420 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
1423 ArgumentValidator validator(context, argumentCount, arguments);
1424 validator.toObject(0, false);
1426 } catch (const TypeMismatchException& err ) {
1427 return JSWebAPIError::throwException(context, exception, err);
1428 } catch(const BasePlatformException& err) {
1429 return JSWebAPIError::throwException(context, exception, err);
1430 } catch(const ConversionException& err) {
1431 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
1432 } catch(const NullPointerException& err) {
1433 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
1436 ContactGroupPtr contact(NULL);
1438 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
1440 if (!JSContactGroup::isObjectOfClass(context, arguments[0]))
1441 ThrowMsg(InvalidArgumentException, "1st argument is not a 'ContactGroup object'.");
1442 contact = converter->toContactGroup(arguments[0]);
1443 } Catch(Exception) {
1444 LoggerE("Error on conversion : " << _rethrown_exception.GetMessage());
1445 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "1st argument is not a 'ContactGroup object'");
1448 EventAddressBookUpdateGroupPtr dplEvent(new EventAddressBookUpdateGroup());
1450 dplEvent->setContactGroup(contact);
1451 dplEvent->setForSynchronousCall();
1454 addressBook->updateGroup(dplEvent);
1455 } Catch(Exception) {
1456 LoggerE("Error on platform : " << _rethrown_exception.GetMessage());
1457 return JSTizenExceptionFactory::postException(context, exception,
1458 JSTizenException::UNKNOWN_ERROR, "Internal error");
1461 if (!dplEvent->getResult())
1463 std::stringstream oss;
1464 switch (dplEvent->getExceptionCode())
1466 case ExceptionCodes::NotFoundException:
1467 case ExceptionCodes::InvalidArgumentException:
1468 oss << "No Contact id '" << contact->getId() << "'";
1469 return JSTizenExceptionFactory::postException(context, exception,
1470 JSTizenException::NOT_FOUND_ERROR, oss.str());
1472 case ExceptionCodes::PlatformException:
1473 return JSTizenExceptionFactory::postException(context, exception,
1474 JSTizenException::UNKNOWN_ERROR, "Internal error");
1477 return JSTizenExceptionFactory::postException(context, exception,
1478 JSTizenException::UNKNOWN_ERROR, "Internal error");
1482 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
1483 return JSValueMakeUndefined(context);
1486 JSValueRef JSAddressBook::removeGroup(JSContextRef context,
1488 JSObjectRef thisObject,
1489 size_t argumentCount,
1490 const JSValueRef arguments[],
1491 JSValueRef* exception)
1494 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
1495 AddressBookPtr addressBook;
1496 AddressBookController *controller;
1499 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
1501 ThrowMsg(InvalidArgumentException, "No private object.");
1503 addressBook = controller->getObject();
1504 } Catch(Exception) {
1505 LoggerE("No private object");
1506 return JSTizenExceptionFactory::postException(context, exception,
1507 JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
1510 AceSecurityStatus status = CONTACT_CHECK_ACCESS(CONTACT_FUNCTION_API_ADDRESS_BOOK_REMOVE_GROUP);
1511 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
1516 ArgumentValidator validator(context, argumentCount, arguments);
1517 groupId = validator.toString(0, false);
1518 } catch (const TypeMismatchException& err ) {
1519 return JSWebAPIError::throwException(context, exception, err);
1520 } catch(const BasePlatformException& err) {
1521 return JSWebAPIError::throwException(context, exception, err);
1522 } catch(const ConversionException& err) {
1523 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
1524 } catch(const NullPointerException& err) {
1525 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "");
1528 EventAddressBookRemoveGroupPtr dplEvent(new EventAddressBookRemoveGroup());
1530 dplEvent->setContactGroupId(groupId);
1531 dplEvent->setForSynchronousCall();
1534 addressBook->removeGroup(dplEvent);
1535 } Catch(Exception) {
1536 LoggerE("Error on platform : " << _rethrown_exception.GetMessage());
1537 return JSTizenExceptionFactory::postException(context, exception,
1538 JSTizenException::UNKNOWN_ERROR, "Internal error");
1541 if (!dplEvent->getResult())
1543 std::stringstream oss;
1544 switch (dplEvent->getExceptionCode())
1546 case ExceptionCodes::NotFoundException:
1547 case ExceptionCodes::InvalidArgumentException:
1548 LoggerE("Not Found error : " << groupId);
1549 oss << "No Contact id '" << groupId << "'";
1550 return JSTizenExceptionFactory::postException(context, exception,
1551 JSTizenException::NOT_FOUND_ERROR, oss.str());
1553 case ExceptionCodes::PlatformException:
1554 return JSTizenExceptionFactory::postException(context, exception,
1555 JSTizenException::UNKNOWN_ERROR, "Internal error");
1558 return JSTizenExceptionFactory::postException(context, exception,
1559 JSTizenException::UNKNOWN_ERROR, "Internal error");
1563 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
1564 return JSValueMakeUndefined(context);
1567 JSValueRef JSAddressBook::getGroups(JSContextRef context,
1569 JSObjectRef thisObject,
1570 size_t argumentCount,
1571 const JSValueRef arguments[],
1572 JSValueRef* exception)
1575 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
1576 AddressBookPtr addressBook;
1577 AddressBookController *controller;
1578 JSContextRef gContext;
1581 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
1583 ThrowMsg(InvalidArgumentException, "No private object.");
1585 addressBook = controller->getObject();
1586 gContext = controller->getContext();
1587 } Catch(Exception) {
1588 LoggerE("No private object");
1589 return JSTizenExceptionFactory::postException(context, exception,
1590 JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
1593 AceSecurityStatus status = CONTACT_CHECK_ACCESS(CONTACT_FUNCTION_API_ADDRESS_BOOK_GET_GROUPS);
1594 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
1598 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
1600 EventAddressBookGetGroupsPtr dplEvent(new EventAddressBookGetGroups());
1602 dplEvent->setForSynchronousCall();
1605 addressBook->getGroups(dplEvent);
1606 } Catch(Exception) {
1607 LoggerE("Error on platform : " << _rethrown_exception.GetMessage());
1608 return JSTizenExceptionFactory::postException(context, exception,
1609 JSTizenException::UNKNOWN_ERROR, "Internal error");
1612 if (!dplEvent->getResult() || !dplEvent->getContactGroupsIsSet())
1614 std::stringstream oss;
1615 switch (dplEvent->getExceptionCode())
1617 case ExceptionCodes::NotFoundException:
1618 case ExceptionCodes::InvalidArgumentException:
1619 LoggerE("Not Found error : " << id);
1620 oss << "No Contact id '" << id << "'";
1621 return JSTizenExceptionFactory::postException(context, exception,
1622 JSTizenException::NOT_FOUND_ERROR, oss.str());
1624 case ExceptionCodes::PlatformException:
1625 return JSTizenExceptionFactory::postException(context, exception,
1626 JSTizenException::UNKNOWN_ERROR, "Internal error");
1629 return JSTizenExceptionFactory::postException(context, exception,
1630 JSTizenException::UNKNOWN_ERROR, "Internal error");
1635 ContactGroupArrayPtr groups = dplEvent->getContactGroups();
1639 result = converter->toJSValueRef(groups);
1640 } Catch(Exception) {
1641 LoggerE("Error on conversion : " << _rethrown_exception.GetMessage());
1642 return JSTizenExceptionFactory::postException(context, exception,
1643 JSTizenException::UNKNOWN_ERROR, "Internal error");
1645 TIME_TRACER_ITEM_END(__FUNCTION__, 0);