2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * @file JSAddressBook.cpp
19 * @author Kisub Song (kisubs.song@samsung.com)
21 * @brief Implementation of the JSAddressBook class
24 #include <dpl/log/log.h>
25 #include <dpl/assert.h>
26 #include <CommonsJavaScript/Validator.h>
27 #include <CommonsJavaScript/Converter.h>
28 #include <CommonsJavaScript/JSCallbackManager.h>
29 #include <CommonsJavaScript/JSUtils.h>
30 #include <API/Contact/ContactFactory.h>
31 #include <API/Contact/EventAddressBookAddBatch.h>
32 #include <API/Contact/EventAddressBookUpdateBatch.h>
33 #include <API/Contact/EventAddressBookRemoveBatch.h>
34 #include <API/Contact/EventAddressBookFind.h>
35 #include <API/Contact/EventAddressBookChangeListener.h>
36 #include <API/Contact/EventAddressBookRemoveBatch.h>
37 #include <CommonsJavaScript/JSPendingOperation.h>
38 #include <Tizen/Common/JSTizenExceptionFactory.h>
39 #include <Tizen/Common/JSTizenException.h>
40 #include <Tizen/Common/SecurityExceptions.h>
41 #include <Tizen/Tizen/FilterConverter.h>
42 #include "plugin_config.h"
43 #include "JSAddressBook.h"
44 #include "JSContact.h"
45 #include "ContactConverter.h"
46 #include "AddressBookController.h"
47 #include "JSAddressBookChangeCallbackManager.h"
51 #define TIZEN_ADDRESS_BOOK_TYPE "type"
52 #define TIZEN_ADDRESS_BOOK_NAME "name"
54 #define TIZEN_ADDRESS_BOOK "AddressBook"
60 using namespace TizenApis::Commons;
61 using namespace TizenApis::Api::Contact;
62 using namespace TizenApis::Api::Tizen;
63 using namespace TizenApis::Tizen1_0::Tizen;
64 using namespace WrtDeviceApis::Commons;
65 using namespace WrtDeviceApis::CommonsJavaScript;
67 using TizenApis::Api::Contact::Contact;
69 JSClassRef JSAddressBook::m_jsClassRef = NULL;
71 JSClassDefinition JSAddressBook::m_classInfo = {
73 kJSClassAttributeNone,
83 NULL, //DeleteProperty,
84 NULL, //GetPropertyNames,
85 NULL, //CallAsFunction,
86 NULL, //CallAsConstructor,
88 NULL, //ConvertToType,
91 JSStaticValue JSAddressBook::m_property[] = {
92 { TIZEN_ADDRESS_BOOK_TYPE, getProperty, NULL, kJSPropertyAttributeReadOnly },
93 { TIZEN_ADDRESS_BOOK_NAME, getProperty, NULL, kJSPropertyAttributeReadOnly },
97 JSStaticFunction JSAddressBook::m_function[] = {
98 { "convertFromString", convertFromString, kJSPropertyAttributeNone },
99 { "convertToString", convertToString, kJSPropertyAttributeNone },
100 { "add", add, kJSPropertyAttributeNone },
101 { "addBatch", addBatch, kJSPropertyAttributeNone },
102 { "update", update, kJSPropertyAttributeNone },
103 { "updateBatch", updateBatch, kJSPropertyAttributeNone },
104 { "remove", remove, kJSPropertyAttributeNone },
105 { "removeBatch", removeBatch, kJSPropertyAttributeNone },
106 { "find", find, kJSPropertyAttributeNone },
107 { "addChangeListener", addChangeListener, kJSPropertyAttributeNone },
108 { "removeChangeListener", removeChangeListener, kJSPropertyAttributeNone },
112 const JSClassDefinition* JSAddressBook::getClassInfo()
117 const JSClassRef JSAddressBook::getClassRef()
121 m_jsClassRef = JSClassCreate(&m_classInfo);
126 void JSAddressBook::Initialize(JSContextRef context,
129 ////LogDebug("entered");
130 AddressBookController *priv =
131 static_cast<AddressBookController*>(JSObjectGetPrivate(object));
132 Assert(priv && "Private object not set.");
135 void JSAddressBook::Finalize(JSObjectRef object)
137 //LogDebug("entered");
140 bool JSAddressBook::isObjectOfClass(JSContextRef context, JSValueRef value)
142 return JSValueIsObjectOfClass(context, value, getClassRef());
145 IAddressBookPtr JSAddressBook::getAddressBook(JSContextRef context, JSValueRef value)
147 if (!isObjectOfClass(context, value)) {
148 Throw(InvalidArgumentException);
150 JSObjectRef object = JSValueToObject(context, value, NULL);
152 Throw(InvalidArgumentException);
154 AddressBookController *priv = static_cast<AddressBookController*>(JSObjectGetPrivate(object));
156 Throw(NullPointerException);
158 return priv->getObject();
161 IAddressBookPtr JSAddressBook::getPrivData(JSObjectRef object)
163 AddressBookController *priv =
164 static_cast<AddressBookController*>(JSObjectGetPrivate(object));
166 return priv->getObject();
168 Throw(NullPointerException);
171 JSValueRef JSAddressBook::convertFromString(JSContextRef context,
173 JSObjectRef thisObject,
174 size_t argumentCount,
175 const JSValueRef arguments[],
176 JSValueRef* exception)
179 IAddressBookPtr addressBook;
180 JSContextRef gContext;
181 AddressBookController *controller;
184 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
186 ThrowMsg(InvalidArgumentException, "No private object.");
188 addressBook = controller->getObject();
189 gContext = controller->getContext();
191 LogError("No private object");
192 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
195 AceSecurityStatus status = CONTACT_CHECK_ACCESS(controller->getContext(), CONTACT_FUNCTION_API_CONVERT_FROM_STRING);
196 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
198 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
200 if (argumentCount != 2)
201 ThrowMsg(InvalidArgumentException, "Wrong arguments count.");
203 if (!JSValueIsString(context, arguments[0]))
204 ThrowMsg(InvalidArgumentException, "1st argument is not string.");
206 if (!JSValueIsString(context, arguments[1]))
207 ThrowMsg(InvalidArgumentException, "2nd argument is not string.");
208 } Catch(Exception ) {
209 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
210 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
216 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
219 vCardStr = converter->toString(arguments[0]);
220 format = converter->toString(arguments[1]);
223 LogError("Error on conversion " << _rethrown_exception.GetMessage());
224 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
227 ContactPropertiesPtr contactProperties;
229 contactProperties = addressBook->convertFromString(vCardStr, format);
230 } Catch(UnsupportedException) {
231 LogError("Error on platform : " << _rethrown_exception.GetMessage());
232 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_SUPPORTED_ERROR, "Unsupported format");
234 LogError("Error on platform : " << _rethrown_exception.GetMessage());
235 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
240 result = converter->toJSValueRef(contactProperties);
242 LogError("Error on conversion");
243 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
249 JSValueRef JSAddressBook::convertToString(JSContextRef context,
251 JSObjectRef thisObject,
252 size_t argumentCount,
253 const JSValueRef arguments[],
254 JSValueRef* exception)
257 IAddressBookPtr addressBook;
258 JSContextRef gContext;
259 AddressBookController *controller;
262 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
264 ThrowMsg(InvalidArgumentException, "No private object.");
266 addressBook = controller->getObject();
267 gContext = controller->getContext();
269 LogError("No private object");
270 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
273 AceSecurityStatus status = CONTACT_CHECK_ACCESS(controller->getContext(), CONTACT_FUNCTION_API_CONVERT_TO_STRING);
274 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
276 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
278 if (argumentCount != 2)
279 ThrowMsg(InvalidArgumentException, "Wrong arguments count.");
281 if (!JSContact::isObjectOfClass(context, arguments[0]))
282 ThrowMsg(InvalidArgumentException, "1st argument is not contact object.");
284 if (!JSValueIsString(context, arguments[1]))
285 ThrowMsg(InvalidArgumentException, "2nd argument is not string.");
286 } Catch(Exception ) {
287 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
288 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
294 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
296 contact = converter->toContact(arguments[0]);
297 format = converter->toString(arguments[1]);
299 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
300 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
305 vCard = addressBook->convertToString(contact, format);
306 } Catch(UnsupportedException) {
307 LogError("Error on platform : " << _rethrown_exception.GetMessage());
308 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_SUPPORTED_ERROR, "Unsupported format");
310 LogError("Error on platform : " << _rethrown_exception.GetMessage());
311 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
316 result = converter->toJSValueRef(vCard);
318 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
319 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
325 JSValueRef JSAddressBook::add(JSContextRef context,
327 JSObjectRef thisObject,
328 size_t argumentCount,
329 const JSValueRef arguments[],
330 JSValueRef* exception)
333 IAddressBookPtr addressBook;
334 JSContextRef gContext;
335 AddressBookController *controller;
338 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
340 ThrowMsg(InvalidArgumentException, "No private object.");
342 addressBook = controller->getObject();
343 gContext = controller->getContext();
345 LogError("No private object");
346 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
349 AceSecurityStatus status = CONTACT_CHECK_ACCESS(controller->getContext(), CONTACT_FUNCTION_API_ADD);
350 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
352 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
354 if (argumentCount != 1)
355 ThrowMsg(InvalidArgumentException, "Wrong arguments count.");
357 if (!JSValueIsObject(context, arguments[0]))
358 ThrowMsg(InvalidArgumentException, "1st argument is not object.");
360 } Catch(Exception ) {
361 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
362 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
365 ContactPropertiesPtr contactProperties;
367 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
369 contactProperties = converter->toContactProperties(arguments[0]);
371 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
372 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
375 ContactPtr contact(NULL);
377 contact = addressBook->add(contactProperties);
379 LogError("Error on platform : " << _rethrown_exception.GetMessage());
380 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
385 result = converter->toJSValueRef(contact);
387 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
388 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
394 JSValueRef JSAddressBook::addBatch(JSContextRef context,
396 JSObjectRef thisObject,
397 size_t argumentCount,
398 const JSValueRef arguments[],
399 JSValueRef* exception)
402 IAddressBookPtr addressBook;
403 JSContextRef gContext;
404 AddressBookController *controller;
407 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
409 ThrowMsg(InvalidArgumentException, "No private object.");
411 addressBook = controller->getObject();
412 gContext = controller->getContext();
414 LogError("No private object");
415 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
418 AceSecurityStatus status = CONTACT_CHECK_ACCESS(controller->getContext(), CONTACT_FUNCTION_API_ADD_BATCH);
419 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
421 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
423 if (argumentCount < 1 || argumentCount > 3)
424 ThrowMsg(InvalidArgumentException, "Wrong arguments count.");
426 if (!JSIsArrayValue(context, arguments[0]))
427 ThrowMsg(InvalidArgumentException, "1st argument is not array.");
429 if (argumentCount >= 2)
431 if (!validator->isCallback(arguments[1]))
432 ThrowMsg(InvalidArgumentException, "2nd argument is not function.");
435 if (argumentCount >= 3)
437 if (!validator->isCallback(arguments[2]))
438 ThrowMsg(InvalidArgumentException, "3rd argument is not function.");
441 } Catch(Exception ) {
442 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
443 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
446 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
448 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
450 if(argumentCount >= 2)
451 callbackManager->setOnSuccess(arguments[1]);
453 if(argumentCount >= 3)
454 callbackManager->setOnError(arguments[2]);
456 EventAddressBookAddBatchPtr dplEvent(new EventAddressBookAddBatch());
458 dplEvent->setContactProperties(converter->toContactPropertiesArray(arguments[0]));
459 } Catch(ConversionException) {
460 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
461 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
464 // set event handler's data
465 dplEvent->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
466 dplEvent->setForAsynchronousCall(controller);
468 //DPL::SharedPtr<IEventController> eventContr = DPL::StaticPointerCast< IEventController>(dplEvent);
469 //AddressBookAddBatchPendingOperation *gcPendingOperation = new AddressBookAddBatchPendingOperation(eventContr);
472 addressBook->addBatch(dplEvent);
474 LogError("Error on platform : " << _rethrown_exception.GetMessage());
475 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
478 //return JSObjectMake(gContext, JSPendingOperation::getClassRef(), gcPendingOperation);
479 return JSValueMakeUndefined(context);
482 JSValueRef JSAddressBook::update(JSContextRef context,
484 JSObjectRef thisObject,
485 size_t argumentCount,
486 const JSValueRef arguments[],
487 JSValueRef* exception)
490 IAddressBookPtr addressBook;
491 JSContextRef gContext;
492 AddressBookController *controller;
495 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
497 ThrowMsg(InvalidArgumentException, "No private object.");
499 addressBook = controller->getObject();
500 gContext = controller->getContext();
502 LogError("No private object");
503 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
506 AceSecurityStatus status = CONTACT_CHECK_ACCESS(controller->getContext(), CONTACT_FUNCTION_API_UPDATE);
507 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
509 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
511 if (argumentCount != 1)
512 ThrowMsg(InvalidArgumentException, "Wrong arguments count.");
514 if (!JSContact::isObjectOfClass(context, arguments[0]))
515 ThrowMsg(InvalidArgumentException, "1st argument is wrong object.");
516 } Catch(Exception ) {
517 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
518 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
523 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
525 contact = converter->toContact(arguments[0]);
527 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
528 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
532 addressBook->update(contact);
534 LogError("Error on platform : " << _rethrown_exception.GetMessage());
535 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
538 JSValueRef result = JSValueMakeUndefined(context);
543 JSValueRef JSAddressBook::updateBatch(JSContextRef context,
545 JSObjectRef thisObject,
546 size_t argumentCount,
547 const JSValueRef arguments[],
548 JSValueRef* exception)
551 IAddressBookPtr addressBook;
552 JSContextRef gContext;
553 AddressBookController *controller;
556 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
558 ThrowMsg(InvalidArgumentException, "No private object.");
560 addressBook = controller->getObject();
561 gContext = controller->getContext();
563 LogError("No private object");
564 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
567 AceSecurityStatus status = CONTACT_CHECK_ACCESS(controller->getContext(), CONTACT_FUNCTION_API_UPDATE_BATCH);
568 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
570 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
572 if (argumentCount < 1 || argumentCount > 3)
573 ThrowMsg(InvalidArgumentException, "Wrong arguments count.");
575 if (!JSIsArrayValue(context, arguments[0]))
576 ThrowMsg(InvalidArgumentException, "1st argument is not array.");
578 if (argumentCount >= 2)
580 if (!validator->isCallback(arguments[1]))
581 ThrowMsg(InvalidArgumentException, "2nd argument is not function.");
584 if (argumentCount >= 3)
586 if (!validator->isCallback(arguments[2]))
587 ThrowMsg(InvalidArgumentException, "3rd argument is not function.");
589 } Catch(Exception ) {
590 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
591 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
594 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
596 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
598 if(argumentCount >= 2)
599 callbackManager->setOnSuccess(arguments[1]);
601 if(argumentCount >= 3)
602 callbackManager->setOnError(arguments[2]);
604 EventAddressBookUpdateBatchPtr dplEvent(new EventAddressBookUpdateBatch());
606 dplEvent->setContacts(converter->toContactArray(arguments[0]));
607 } Catch(ConversionException) {
608 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
609 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
612 // set event handler's data
613 dplEvent->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
614 dplEvent->setForAsynchronousCall(controller);
616 //DPL::SharedPtr<IEventController> eventContr = DPL::StaticPointerCast< IEventController>(dplEvent);
617 //AddressBookUpdateBatchPendingOperation *gcPendingOperation = new AddressBookUpdateBatchPendingOperation(eventContr);
620 addressBook->updateBatch(dplEvent);
622 LogError("Error on platform : " << _rethrown_exception.GetMessage());
623 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
626 //return JSObjectMake(gContext, JSPendingOperation::getClassRef(), gcPendingOperation);
627 return JSValueMakeUndefined(context);
630 JSValueRef JSAddressBook::remove(JSContextRef context,
632 JSObjectRef thisObject,
633 size_t argumentCount,
634 const JSValueRef arguments[],
635 JSValueRef* exception)
638 IAddressBookPtr addressBook;
639 JSContextRef gContext;
640 AddressBookController *controller;
643 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
645 ThrowMsg(InvalidArgumentException, "No private object.");
647 addressBook = controller->getObject();
648 gContext = controller->getContext();
650 LogError("No private object");
651 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
654 AceSecurityStatus status = CONTACT_CHECK_ACCESS(controller->getContext(), CONTACT_FUNCTION_API_REMOVE);
655 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
657 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
659 if (argumentCount != 1)
660 ThrowMsg(InvalidArgumentException, "Wrong arguments count.");
662 if (!JSValueIsString(context, arguments[0]))
663 ThrowMsg(InvalidArgumentException, "1st argument is wrong object.");
664 } Catch(Exception ) {
665 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
666 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
671 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
673 contactId = converter->toString(arguments[0]);
675 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
676 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
680 addressBook->remove(contactId);
681 } Catch(NotFoundException) {
682 LogError("Error on platform : " << _rethrown_exception.GetMessage());
683 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_FOUND_ERROR, "Contact id not found");
685 LogError("Error on platform : " << _rethrown_exception.GetMessage());
686 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
689 JSValueRef result = JSValueMakeUndefined(context);
694 JSValueRef JSAddressBook::removeBatch(JSContextRef context,
696 JSObjectRef thisObject,
697 size_t argumentCount,
698 const JSValueRef arguments[],
699 JSValueRef* exception)
702 IAddressBookPtr addressBook;
703 JSContextRef gContext;
704 AddressBookController *controller;
707 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
709 ThrowMsg(InvalidArgumentException, "No private object.");
711 addressBook = controller->getObject();
712 gContext = controller->getContext();
714 LogError("No private object");
715 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
718 AceSecurityStatus status = CONTACT_CHECK_ACCESS(controller->getContext(), CONTACT_FUNCTION_API_REMOVE_BATCH);
719 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
721 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
723 if (argumentCount < 1 || argumentCount > 3)
724 ThrowMsg(InvalidArgumentException, "Wrong arguments count.");
726 if (!JSIsArrayValue(context, arguments[0]))
727 ThrowMsg(InvalidArgumentException, "1st argument is not array.");
729 if (argumentCount >= 2)
731 if (!validator->isCallback(arguments[1]))
732 ThrowMsg(InvalidArgumentException, "2nd argument is not function.");
735 if (argumentCount >= 3)
737 if (!validator->isCallback(arguments[2]))
738 ThrowMsg(InvalidArgumentException, "3rd argument is not function.");
740 } Catch(Exception ) {
741 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
742 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
745 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
747 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
749 if(argumentCount >= 2)
750 callbackManager->setOnSuccess(arguments[1]);
752 if(argumentCount >= 3)
753 callbackManager->setOnError(arguments[2]);
755 EventAddressBookRemoveBatchPtr dplEvent(new EventAddressBookRemoveBatch());
757 dplEvent->setContactIds(converter->toStringArray(arguments[0]));
758 } Catch(ConversionException) {
759 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
760 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
763 // set event handler's data
764 dplEvent->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
765 dplEvent->setForAsynchronousCall(controller);
767 //DPL::SharedPtr<IEventController> eventContr = DPL::StaticPointerCast< IEventController>(dplEvent);
768 //AddressBookRemoveBatchPendingOperation *gcPendingOperation = new AddressBookRemoveBatchPendingOperation(eventContr);
771 addressBook->removeBatch(dplEvent);
773 LogError("Error on platform : " << _rethrown_exception.GetMessage());
774 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
777 //return JSObjectMake(gContext, JSPendingOperation::getClassRef(), gcPendingOperation);
778 return JSValueMakeUndefined(context);
781 JSValueRef JSAddressBook::find(JSContextRef context,
783 JSObjectRef thisObject,
784 size_t argumentCount,
785 const JSValueRef arguments[],
786 JSValueRef* exception)
789 IAddressBookPtr addressBook;
790 JSContextRef gContext;
791 AddressBookController *controller;
794 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
796 ThrowMsg(InvalidArgumentException, "No private object.");
798 addressBook = controller->getObject();
799 gContext = controller->getContext();
801 LogError("No private object");
802 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
805 AceSecurityStatus status = CONTACT_CHECK_ACCESS(controller->getContext(), CONTACT_FUNCTION_API_FIND);
806 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
808 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
810 if (argumentCount < 1 || argumentCount > 4)
811 ThrowMsg(InvalidArgumentException, "Wrong arguments count.");
813 if (!validator->isCallback(arguments[0]))
814 ThrowMsg(InvalidArgumentException, "1st argument is not function.");
816 if (argumentCount >= 2)
818 if (!validator->isCallback(arguments[1]))
819 ThrowMsg(InvalidArgumentException, "2nd argument is not function.");
822 if (argumentCount >= 3)
824 if (!JSValueIsObject(context, arguments[2]) && !JSValueIsNull(context, arguments[2]))
825 ThrowMsg(InvalidArgumentException, "3rd argument is not object nor null.");
828 if (argumentCount >= 4)
830 if (!JSValueIsObject(context, arguments[3]) && !JSValueIsNull(context, arguments[3]))
831 ThrowMsg(InvalidArgumentException, "4th argument is not object nor null.");
833 } Catch(Exception ) {
834 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
835 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
838 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
840 callbackManager->setOnSuccess(arguments[0]);
841 if (argumentCount >= 2)
842 callbackManager->setOnError(arguments[1]);
844 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
845 FilterConverterFactory::ConverterType filterConverter = FilterConverterFactory::getConverter(context);
847 EventAddressBookFindPtr dplEvent(new EventAddressBookFind());
849 if (argumentCount >= 3 && !JSValueIsNull(context, arguments[2]))
850 dplEvent->setFilter(filterConverter->toFilter(arguments[2]));
852 if (argumentCount >= 4 && !JSValueIsNull(context, arguments[3]))
853 dplEvent->setSortModes(filterConverter->toSortModeArray(arguments[3]));
855 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
856 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
859 // set event handler's data
860 dplEvent->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
861 dplEvent->setForAsynchronousCall(controller);
863 //DPL::SharedPtr<IEventController> eventContr = DPL::StaticPointerCast< IEventController>(dplEvent);
864 //AddressBookFindPendingOperation *gcPendingOperation = new AddressBookFindPendingOperation(eventContr);
867 addressBook->find(dplEvent);
869 LogError("Error on platform : " << _rethrown_exception.GetMessage());
870 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
873 //return JSObjectMake(gContext, JSPendingOperation::getClassRef(), gcPendingOperation);
874 return JSValueMakeUndefined(context);
877 JSValueRef JSAddressBook::addChangeListener(JSContextRef context,
879 JSObjectRef thisObject,
880 size_t argumentCount,
881 const JSValueRef arguments[],
882 JSValueRef* exception)
885 IAddressBookPtr addressBook;
886 JSContextRef gContext;
887 AddressBookController *controller;
890 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
892 ThrowMsg(InvalidArgumentException, "No private object.");
894 addressBook = controller->getObject();
895 gContext = controller->getContext();
897 LogError("No private object");
898 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::INVALID_VALUES_ERROR, "Wrong object");
901 AceSecurityStatus status = CONTACT_CHECK_ACCESS(controller->getContext(), CONTACT_FUNCTION_API_ADD_CHANGE_LISTENER);
902 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
904 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
906 if (argumentCount < 1 || argumentCount > 2)
907 ThrowMsg(InvalidArgumentException, "Wrong arguments count.");
909 if (!JSValueIsObject(context, arguments[0]))
910 ThrowMsg(InvalidArgumentException, "1st argument is not object.");
912 if (argumentCount >= 2)
914 if (!validator->isCallback(arguments[1]))
915 ThrowMsg(InvalidArgumentException, "2nd argument is not function.");
917 } Catch(Exception ) {
918 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
919 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
922 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
924 JSValueRef oncontactsadded;
925 JSValueRef oncontactsupdated;
926 JSValueRef oncontactsdeleted;
927 JSValueRef onaddressbookreset;
929 JSObjectRef callbackObject = converter->toJSObjectRef(arguments[0]);
931 oncontactsadded = JSUtils::getJSPropertyOrUndefined(context, callbackObject, "onContactsAdded");
932 if (validator->isNullOrUndefined(oncontactsadded))
933 oncontactsadded = NULL;
934 else if (!validator->isCallback(oncontactsadded)) {
935 ThrowMsg(ConversionException, "Not a valid callback (onContactsAdded)");
938 oncontactsupdated = JSUtils::getJSPropertyOrUndefined(context, callbackObject, "onContactsUpdated");
939 if (validator->isNullOrUndefined(oncontactsupdated))
940 oncontactsupdated = NULL;
941 else if (!validator->isCallback(oncontactsupdated)) {
942 ThrowMsg(ConversionException, "Not a valid callback (onContactsUpdated)");
945 oncontactsdeleted = JSUtils::getJSPropertyOrUndefined(context, callbackObject, "onContactsRemoved");
946 if (validator->isNullOrUndefined(oncontactsdeleted))
947 oncontactsdeleted = NULL;
948 else if (!validator->isCallback(oncontactsdeleted)) {
949 ThrowMsg(ConversionException, "Not a valid callback (onContactsRemoved)");
952 onaddressbookreset = JSUtils::getJSPropertyOrUndefined(context, callbackObject, "onAddressBookReset");
953 if (validator->isNullOrUndefined(onaddressbookreset))
954 onaddressbookreset = NULL;
955 else if (!validator->isCallback(onaddressbookreset)) {
956 ThrowMsg(ConversionException, "Not a valid callback (onAddressBookReset)");
958 } Catch(ConversionException) {
959 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
960 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
963 JSAddressBookChangeCallbackManagerPtr callbackManager = JSAddressBookChangeCallbackManager::createObject(gContext);
965 callbackManager->setOnContactsAdded(oncontactsadded);
966 callbackManager->setOnContactsUpdated(oncontactsupdated);
967 callbackManager->setOnContactsDeleted(oncontactsdeleted);
968 callbackManager->setOnAddressBookReset(onaddressbookreset);
969 if(argumentCount >= 2)
970 callbackManager->setOnError(arguments[1]);
972 EventAddressBookChangeListenerEmitterPtr emitter(new EventAddressBookChangeListenerEmitter());
974 emitter->setEventPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
975 emitter->setListener(controller);
979 watchId = addressBook->addChangeListener(emitter);
981 LogError("Error on platform : " << _rethrown_exception.GetMessage());
982 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
985 return converter->toJSValueRefLong(watchId);
988 JSValueRef JSAddressBook::removeChangeListener(JSContextRef context,
990 JSObjectRef thisObject,
991 size_t argumentCount,
992 const JSValueRef arguments[],
993 JSValueRef* exception)
996 IAddressBookPtr addressBook;
997 JSContextRef gContext;
998 AddressBookController *controller;
1001 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
1003 ThrowMsg(InvalidArgumentException, "No private object.");
1005 addressBook = controller->getObject();
1006 gContext = controller->getContext();
1007 } Catch(Exception) {
1008 LogError("No private object");
1009 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::INVALID_VALUES_ERROR, "Wrong object");
1012 AceSecurityStatus status = CONTACT_CHECK_ACCESS(controller->getContext(), CONTACT_FUNCTION_API_REMOVE_CHANGE_LISTENER);
1013 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
1015 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
1017 if (argumentCount != 1)
1018 ThrowMsg(InvalidArgumentException, "Wrong arguments count.");
1020 if (!JSValueIsNumber(context, arguments[0]))
1021 ThrowMsg(InvalidArgumentException, "1st argument is not object.");
1022 } Catch(Exception ) {
1023 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
1024 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
1027 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
1031 watchId = static_cast<long>(converter->toLong(arguments[0]));
1034 ThrowMsg(PlatformException, "watchId is wrong (" << watchId << ")");
1036 addressBook->removeChangeListener(watchId);
1037 } Catch(Exception) {
1038 LogError("Exception: " << _rethrown_exception.GetMessage());
1039 JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
1042 return JSValueMakeUndefined(context);
1045 JSValueRef JSAddressBook::getProperty(JSContextRef context,
1047 JSStringRef jsPropertyName,
1048 JSValueRef* exception)
1050 //LogDebug("entered");
1051 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
1054 std::string propertyName = converter->toString(jsPropertyName);
1055 IAddressBookPtr addressBook = getPrivData(object);
1056 if (propertyName == TIZEN_ADDRESS_BOOK_TYPE) {
1057 if (IAddressBook::SIMBook == addressBook->getType()) {
1058 return converter->toJSValueRef(0);
1060 return converter->toJSValueRef(1);
1062 } else if (propertyName == TIZEN_ADDRESS_BOOK_NAME) {
1063 return converter->toJSValueRef(addressBook->getName());
1068 LogError("error during getting property");
1070 return JSValueMakeUndefined(context);