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 <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 <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 <Tizen/Common/JSTizenExceptionFactory.h>
38 #include <Tizen/Common/JSTizenException.h>
39 #include <Tizen/Common/SecurityExceptions.h>
40 #include <Tizen/Tizen/FilterConverter.h>
41 #include "plugin_config.h"
42 #include "JSAddressBook.h"
43 #include "JSContact.h"
44 #include "ContactConverter.h"
45 #include "AddressBookController.h"
46 #include "JSAddressBookChangeCallbackManager.h"
50 #define TIZEN_ADDRESS_BOOK_ID "id"
51 #define TIZEN_ADDRESS_BOOK_NAME "name"
52 #define TIZEN_ADDRESS_BOOK_READ_ONLY "readOnly"
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 JSClassRef JSAddressBook::m_jsClassRef = NULL;
69 JSClassDefinition JSAddressBook::m_classInfo = {
71 kJSClassAttributeNone,
81 NULL, //DeleteProperty,
82 NULL, //GetPropertyNames,
83 NULL, //CallAsFunction,
84 NULL, //CallAsConstructor,
86 NULL, //ConvertToType,
89 JSStaticValue JSAddressBook::m_property[] = {
90 { TIZEN_ADDRESS_BOOK_ID, getId, NULL, kJSPropertyAttributeReadOnly },
91 { TIZEN_ADDRESS_BOOK_NAME, getName, NULL, kJSPropertyAttributeReadOnly },
92 { TIZEN_ADDRESS_BOOK_READ_ONLY, getReadOnly, NULL, kJSPropertyAttributeReadOnly },
96 JSStaticFunction JSAddressBook::m_function[] = {
97 { "get", get, kJSPropertyAttributeNone },
98 { "add", add, kJSPropertyAttributeNone },
99 { "addBatch", addBatch, kJSPropertyAttributeNone },
100 { "update", update, kJSPropertyAttributeNone },
101 { "updateBatch", updateBatch, kJSPropertyAttributeNone },
102 { "remove", remove, kJSPropertyAttributeNone },
103 { "removeBatch", removeBatch, kJSPropertyAttributeNone },
104 { "find", find, kJSPropertyAttributeNone },
105 { "addChangeListener", addChangeListener, kJSPropertyAttributeNone },
106 { "removeChangeListener", removeChangeListener, kJSPropertyAttributeNone },
110 const JSClassDefinition* JSAddressBook::getClassInfo()
115 const JSClassRef JSAddressBook::getClassRef()
119 m_jsClassRef = JSClassCreate(&m_classInfo);
124 void JSAddressBook::Initialize(JSContextRef context,
127 // AddressBookController *priv =
128 // static_cast<AddressBookController*>(JSObjectGetPrivate(object));
131 void JSAddressBook::Finalize(JSObjectRef object)
135 bool JSAddressBook::isObjectOfClass(JSContextRef context, JSValueRef value)
137 return JSValueIsObjectOfClass(context, value, getClassRef());
140 AddressBookPtr JSAddressBook::getAddressBook(JSContextRef context, JSValueRef value)
142 if (!isObjectOfClass(context, value)) {
143 Throw(InvalidArgumentException);
145 JSObjectRef object = JSValueToObject(context, value, NULL);
147 Throw(InvalidArgumentException);
149 AddressBookController *priv = static_cast<AddressBookController*>(JSObjectGetPrivate(object));
151 Throw(NullPointerException);
153 return priv->getObject();
156 AddressBookPtr JSAddressBook::getPrivData(JSObjectRef object)
158 AddressBookController *priv =
159 static_cast<AddressBookController*>(JSObjectGetPrivate(object));
161 return priv->getObject();
163 Throw(NullPointerException);
166 JSValueRef JSAddressBook::getId(JSContextRef context,
168 JSStringRef propertyName,
169 JSValueRef* exception)
173 ContactConverterFactory::ConverterType converter =
174 ContactConverterFactory::getConverter(context);
175 AddressBookPtr addressBook = getPrivData(object);
176 return converter->toJSValueRef(addressBook->getId());
178 Catch(WrtDeviceApis::Commons::Exception)
180 LogWarning("trying to get incorrect value");
182 return JSValueMakeUndefined(context);
185 JSValueRef JSAddressBook::getName(JSContextRef context,
187 JSStringRef propertyName,
188 JSValueRef* exception)
192 ContactConverterFactory::ConverterType converter =
193 ContactConverterFactory::getConverter(context);
194 AddressBookPtr addressBook = getPrivData(object);
195 return converter->toJSValueRef(addressBook->getName());
197 Catch(WrtDeviceApis::Commons::Exception)
199 LogWarning("trying to get incorrect value");
202 return JSValueMakeUndefined(context);
205 JSValueRef JSAddressBook::getReadOnly(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->getReadOnly());
217 Catch(WrtDeviceApis::Commons::Exception)
219 LogWarning("trying to get incorrect value");
222 return JSValueMakeUndefined(context);
225 JSValueRef JSAddressBook::get(JSContextRef context,
227 JSObjectRef thisObject,
228 size_t argumentCount,
229 const JSValueRef arguments[],
230 JSValueRef* exception)
233 AddressBookPtr addressBook;
234 JSContextRef gContext;
235 AddressBookController *controller;
238 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
240 ThrowMsg(InvalidArgumentException, "No private object.");
242 addressBook = controller->getObject();
243 gContext = controller->getContext();
245 LogError("No private object");
246 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
249 AceSecurityStatus status = CONTACT_CHECK_ACCESS(
250 CONTACT_FUNCTION_API_CONVERT_TO_STRING);
251 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
253 //BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
255 if (argumentCount < 1) {
256 /* 1st Argument must be string. */
257 LogError("1st argument must not be undefined.");
258 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_FOUND_ERROR, "No Contact id 'undefined'");
263 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
265 id = converter->toString(arguments[0]);
267 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
268 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments");
271 EventAddressBookGetPtr dplEvent(new EventAddressBookGet());
274 dplEvent->setForSynchronousCall();
277 addressBook->get(dplEvent);
279 LogError("Error on platform : " << _rethrown_exception.GetMessage());
280 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
283 if (!dplEvent->getResult() || !dplEvent->getContactIsSet())
285 std::stringstream oss;
286 switch (dplEvent->getExceptionCode())
288 case ExceptionCodes::NotFoundException:
289 case ExceptionCodes::InvalidArgumentException:
290 LogError("Not Found error : " << id);
291 oss << "No Contact id '" << id << "'";
292 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_FOUND_ERROR, oss.str());
294 case ExceptionCodes::PlatformException:
295 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
298 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
303 ContactPtr contact = dplEvent->getContact();
307 result = converter->toJSValueRef(contact);
309 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
310 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
316 JSValueRef JSAddressBook::add(JSContextRef context,
318 JSObjectRef thisObject,
319 size_t argumentCount,
320 const JSValueRef arguments[],
321 JSValueRef* exception)
324 AddressBookPtr addressBook;
325 JSContextRef gContext;
326 AddressBookController *controller;
329 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
331 ThrowMsg(InvalidArgumentException, "No private object.");
333 addressBook = controller->getObject();
334 gContext = controller->getContext();
336 LogError("No private object");
337 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
340 AceSecurityStatus status = CONTACT_CHECK_ACCESS(
341 CONTACT_FUNCTION_API_ADD);
342 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
344 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
346 if (argumentCount < 1)
347 ThrowMsg(InvalidArgumentException, "1st argument is an 'undefined'.");
349 if (!JSContact::isObjectOfClass(context, arguments[0]))
350 ThrowMsg(InvalidArgumentException, "1st argument is not a 'Contact object'.");
352 } Catch(Exception ) {
353 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
354 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "1st argument must be a 'Contact object'");
357 ContactPtr contact(NULL);
359 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
361 contact = converter->toContact(arguments[0]);
363 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
364 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "1st argument must be a 'Contact object'");
367 EventAddressBookAddPtr dplEvent(new EventAddressBookAdd());
369 dplEvent->setContact(contact);
370 dplEvent->setForSynchronousCall();
373 addressBook->add(dplEvent);
375 LogError("Error on platform : " << _rethrown_exception.GetMessage());
376 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
379 if (!dplEvent->getResult())
381 switch (dplEvent->getExceptionCode())
383 case ExceptionCodes::PlatformException:
384 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
387 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
392 return JSValueMakeUndefined(context);
395 JSValueRef JSAddressBook::addBatch(JSContextRef context,
397 JSObjectRef thisObject,
398 size_t argumentCount,
399 const JSValueRef arguments[],
400 JSValueRef* exception)
403 AddressBookPtr addressBook;
404 JSContextRef gContext;
405 AddressBookController *controller;
407 bool js2ndParamIsFunction = false;
408 bool js3rdParamIsFunction = false;
411 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
413 ThrowMsg(InvalidArgumentException, "No private object.");
415 addressBook = controller->getObject();
416 gContext = controller->getContext();
418 LogError("No private object");
419 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
422 AceSecurityStatus status = CONTACT_CHECK_ACCESS(
423 CONTACT_FUNCTION_API_ADD_BATCH);
424 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
426 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
428 // check 1st argument
429 if (argumentCount < 1)
430 ThrowMsg(InvalidArgumentException, "1st argument must be an array of 'Contact object'");
432 if (!JSValueIsObject(context, arguments[0]))
433 ThrowMsg(InvalidArgumentException, "1st argument must be an array of 'Contact object'");
435 // check 2nd argument
436 if(argumentCount >= 2)
438 if(validator->isCallback(arguments[1]))
439 js2ndParamIsFunction = true;
441 if (!js2ndParamIsFunction &&
442 !JSValueIsNull(context, arguments[1]) &&
443 !JSValueIsUndefined(context, arguments[1]))
444 ThrowMsg(InvalidArgumentException, "2nd argument must be a 'function' or a 'null'");
447 // check 3rd argument
448 if(argumentCount >= 3)
450 if(validator->isCallback(arguments[2]))
451 js3rdParamIsFunction = true;
453 if (!js3rdParamIsFunction &&
454 !JSValueIsNull(context, arguments[2]) &&
455 !JSValueIsUndefined(context, arguments[2]))
456 ThrowMsg(InvalidArgumentException, "3rd argument must be a 'function' or a 'null'");
459 } Catch(Exception ) {
460 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
461 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, _rethrown_exception.GetMessage());
464 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
466 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
468 if(js2ndParamIsFunction)
469 callbackManager->setOnSuccess(arguments[1]);
471 if(js3rdParamIsFunction)
472 callbackManager->setOnError(arguments[2]);
474 EventAddressBookAddBatchPtr dplEvent(new EventAddressBookAddBatch());
476 dplEvent->setContacts(converter->toContactArray(arguments[0]));
477 } Catch(ConversionException) {
478 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
479 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "1st argument must be an array of 'Contact object'");
482 // set event handler's data
483 dplEvent->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
484 dplEvent->setForAsynchronousCall(controller);
486 // DPL::SharedPtr<IEventController> eventContr = DPL::StaticPointerCast< IEventController>(dplEvent);
487 // IJSPendingOperationPrivateObject *gcPendingOperation = new IJSPendingOperationPrivateObject(eventContr);
490 addressBook->addBatch(dplEvent);
492 LogError("Error on platform : " << _rethrown_exception.GetMessage());
493 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
496 JSValueProtect(gContext, thisObject);
498 // return JSObjectMake(gContext, JSPendingOperation::getClassRef(), gcPendingOperation);
499 return JSValueMakeUndefined(context);
502 JSValueRef JSAddressBook::update(JSContextRef context,
504 JSObjectRef thisObject,
505 size_t argumentCount,
506 const JSValueRef arguments[],
507 JSValueRef* exception)
510 AddressBookPtr addressBook;
511 JSContextRef gContext;
512 AddressBookController *controller;
515 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
517 ThrowMsg(InvalidArgumentException, "No private object.");
519 addressBook = controller->getObject();
520 gContext = controller->getContext();
522 LogError("No private object");
523 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
526 AceSecurityStatus status = CONTACT_CHECK_ACCESS(
527 CONTACT_FUNCTION_API_UPDATE);
528 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
530 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
532 if (argumentCount < 1)
533 ThrowMsg(InvalidArgumentException, "1st argument is an 'undefined'.");
535 if (!JSContact::isObjectOfClass(context, arguments[0]))
536 ThrowMsg(InvalidArgumentException, "1st argument is not a 'Contact object'.");
538 } Catch(Exception ) {
539 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
540 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "1st argument must be a 'Contact object'");
543 ContactPtr contact(NULL);
545 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
547 contact = converter->toContact(arguments[0]);
549 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
550 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "1st argument is not a 'Contact object'");
553 EventAddressBookUpdatePtr dplEvent(new EventAddressBookUpdate());
555 dplEvent->setContact(contact);
556 dplEvent->setForSynchronousCall();
559 addressBook->update(dplEvent);
561 LogError("Error on platform : " << _rethrown_exception.GetMessage());
562 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
565 if (!dplEvent->getResult())
567 std::stringstream oss;
568 switch (dplEvent->getExceptionCode())
570 case ExceptionCodes::NotFoundException:
571 case ExceptionCodes::InvalidArgumentException:
572 oss << "No Contact id '" << contact->getId() << "'";
573 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_FOUND_ERROR, oss.str());
575 case ExceptionCodes::PlatformException:
576 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
579 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
584 return JSValueMakeUndefined(context);
587 JSValueRef JSAddressBook::updateBatch(JSContextRef context,
589 JSObjectRef thisObject,
590 size_t argumentCount,
591 const JSValueRef arguments[],
592 JSValueRef* exception)
595 AddressBookPtr addressBook;
596 JSContextRef gContext;
597 AddressBookController *controller;
599 bool js2ndParamIsFunction = false;
600 bool js3rdParamIsFunction = false;
603 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
605 ThrowMsg(InvalidArgumentException, "No private object.");
607 addressBook = controller->getObject();
608 gContext = controller->getContext();
610 LogError("No private object");
611 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
614 AceSecurityStatus status = CONTACT_CHECK_ACCESS(
615 CONTACT_FUNCTION_API_UPDATE_BATCH);
616 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
618 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
620 // check 1st argument
621 if (argumentCount < 1)
622 ThrowMsg(InvalidArgumentException, "1st argument must be an array of 'Contact object'");
624 if (!JSValueIsObject(context, arguments[0]))
625 ThrowMsg(InvalidArgumentException, "1st argument must be an array of 'Contact object'");
627 // check 2nd argument
628 if(argumentCount >= 2)
630 if(validator->isCallback(arguments[1]))
631 js2ndParamIsFunction = true;
633 if (!js2ndParamIsFunction &&
634 !JSValueIsNull(context, arguments[1]) &&
635 !JSValueIsUndefined(context, arguments[1]))
636 ThrowMsg(InvalidArgumentException, "2nd argument must be a 'function' or a 'null'");
639 // check 3rd argument
640 if(argumentCount >= 3)
642 if(validator->isCallback(arguments[2]))
643 js3rdParamIsFunction = true;
645 if (!js3rdParamIsFunction &&
646 !JSValueIsNull(context, arguments[2]) &&
647 !JSValueIsUndefined(context, arguments[2]))
648 ThrowMsg(InvalidArgumentException, "3rd argument must be a 'function' or a 'null'");
651 } Catch(Exception ) {
652 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
653 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, _rethrown_exception.GetMessage());
656 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
658 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
660 if(js2ndParamIsFunction)
661 callbackManager->setOnSuccess(arguments[1]);
663 if(js3rdParamIsFunction)
664 callbackManager->setOnError(arguments[2]);
666 EventAddressBookUpdateBatchPtr dplEvent(new EventAddressBookUpdateBatch());
668 dplEvent->setContacts(converter->toContactArray(arguments[0]));
669 } Catch(ConversionException) {
670 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
671 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "3rd argument must be an array of 'Contact object'");
674 // set event handler's data
675 dplEvent->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
676 dplEvent->setForAsynchronousCall(controller);
678 // DPL::SharedPtr<IEventController> eventContr = DPL::StaticPointerCast< IEventController>(dplEvent);
679 // IJSPendingOperationPrivateObject *gcPendingOperation = new IJSPendingOperationPrivateObject(eventContr);
682 addressBook->updateBatch(dplEvent);
684 LogError("Error on platform : " << _rethrown_exception.GetMessage());
685 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
688 JSValueProtect(gContext, thisObject);
690 // return JSObjectMake(gContext, JSPendingOperation::getClassRef(), gcPendingOperation);
691 return JSValueMakeUndefined(context);
694 JSValueRef JSAddressBook::remove(JSContextRef context,
696 JSObjectRef thisObject,
697 size_t argumentCount,
698 const JSValueRef arguments[],
699 JSValueRef* exception)
702 AddressBookPtr 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(
719 CONTACT_FUNCTION_API_REMOVE);
720 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
722 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
723 if (argumentCount < 1) {
724 /* 1st Argument must be string. */
725 LogError("1st argument must not be undefined.");
726 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_FOUND_ERROR, "No Contact id 'undefined'");
731 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
733 contactId = converter->toString(arguments[0]);
736 LogError("Error on conversion " << _rethrown_exception.GetMessage());
737 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong arguments.");
740 EventAddressBookRemovePtr dplEvent(new EventAddressBookRemove());
742 dplEvent->setContactId(contactId);
743 dplEvent->setForSynchronousCall();
746 addressBook->remove(dplEvent);
748 LogError("Error on platform : " << _rethrown_exception.GetMessage());
749 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
752 if (!dplEvent->getResult())
754 std::stringstream oss;
755 switch (dplEvent->getExceptionCode())
757 case ExceptionCodes::NotFoundException:
758 case ExceptionCodes::InvalidArgumentException:
759 LogError("Not Found error : " << contactId);
760 oss << "No Contact id '" << contactId << "'";
761 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_FOUND_ERROR, oss.str());
763 case ExceptionCodes::PlatformException:
764 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
767 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
772 return JSValueMakeUndefined(context);
775 JSValueRef JSAddressBook::removeBatch(JSContextRef context,
777 JSObjectRef thisObject,
778 size_t argumentCount,
779 const JSValueRef arguments[],
780 JSValueRef* exception)
783 AddressBookPtr addressBook;
784 JSContextRef gContext;
785 AddressBookController *controller;
787 bool js2ndParamIsFunction = false;
788 bool js3rdParamIsFunction = false;
791 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
793 ThrowMsg(InvalidArgumentException, "No private object.");
795 addressBook = controller->getObject();
796 gContext = controller->getContext();
798 LogError("No private object");
799 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
802 AceSecurityStatus status = CONTACT_CHECK_ACCESS(
803 CONTACT_FUNCTION_API_REMOVE_BATCH);
804 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
806 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
808 // check 1st argument
809 if (argumentCount < 1)
810 ThrowMsg(InvalidArgumentException, "1st argument must be an array of 'Contact id'");
812 if (!JSValueIsObject(context, arguments[0]))
813 ThrowMsg(InvalidArgumentException, "1st argument must be an array of 'Contact id'");
815 // check 2nd argument
816 if(argumentCount >= 2)
818 if(validator->isCallback(arguments[1]))
819 js2ndParamIsFunction = true;
821 if (!js2ndParamIsFunction &&
822 !JSValueIsNull(context, arguments[1]) &&
823 !JSValueIsUndefined(context, arguments[1]))
824 ThrowMsg(InvalidArgumentException, "2nd argument must be a 'function' or a 'null'");
827 // check 3rd argument
828 if(argumentCount >= 3)
830 if(validator->isCallback(arguments[2]))
831 js3rdParamIsFunction = true;
833 if (!js3rdParamIsFunction &&
834 !JSValueIsNull(context, arguments[2]) &&
835 !JSValueIsUndefined(context, arguments[2]))
836 ThrowMsg(InvalidArgumentException, "3rd argument must be a 'function' or a 'null'");
839 } Catch(Exception ) {
840 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
841 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, _rethrown_exception.GetMessage());
844 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
846 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
848 if(js2ndParamIsFunction)
849 callbackManager->setOnSuccess(arguments[1]);
851 if(js3rdParamIsFunction)
852 callbackManager->setOnError(arguments[2]);
854 EventAddressBookRemoveBatchPtr dplEvent(new EventAddressBookRemoveBatch());
856 dplEvent->setContactIds(converter->toStringArray(arguments[0]));
857 } Catch(ConversionException) {
858 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
859 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "3rd argument must be an array of 'Contact id'");
862 // set event handler's data
863 dplEvent->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
864 dplEvent->setForAsynchronousCall(controller);
866 // DPL::SharedPtr<IEventController> eventContr = DPL::StaticPointerCast< IEventController>(dplEvent);
867 // IJSPendingOperationPrivateObject *gcPendingOperation = new IJSPendingOperationPrivateObject(eventContr);
870 addressBook->removeBatch(dplEvent);
872 LogError("Error on platform : " << _rethrown_exception.GetMessage());
873 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
876 JSValueProtect(gContext, thisObject);
878 // return JSObjectMake(gContext, JSPendingOperation::getClassRef(), gcPendingOperation);
879 return JSValueMakeUndefined(context);
882 JSValueRef JSAddressBook::find(JSContextRef context,
884 JSObjectRef thisObject,
885 size_t argumentCount,
886 const JSValueRef arguments[],
887 JSValueRef* exception)
890 AddressBookPtr addressBook;
891 JSContextRef gContext;
892 AddressBookController *controller;
894 bool js2ndParamIsFunction = false;
895 bool js3rdParamIsObject = false;
896 bool js4thParamIsObject = false;
899 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
901 ThrowMsg(InvalidArgumentException, "No private object.");
903 addressBook = controller->getObject();
904 gContext = controller->getContext();
906 LogError("No private object");
907 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
910 AceSecurityStatus status = CONTACT_CHECK_ACCESS(
911 CONTACT_FUNCTION_API_FIND);
912 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
914 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
916 if (argumentCount < 1)
917 ThrowMsg(InvalidArgumentException, "1st argument must be a 'function'");
919 if (!validator->isCallback(arguments[0]))
920 ThrowMsg(InvalidArgumentException, "1st argument must be a 'function'");
922 if (argumentCount >= 2)
924 if(validator->isCallback(arguments[1]))
925 js2ndParamIsFunction = true;
927 if (!js2ndParamIsFunction &&
928 !JSValueIsNull(context, arguments[1]) &&
929 !JSValueIsUndefined(context, arguments[1]))
930 ThrowMsg(InvalidArgumentException, "1st argument must be a 'function' or a 'null'");
933 if (argumentCount >= 3)
935 if(JSValueIsObject(context, arguments[2]))
936 js3rdParamIsObject = true;
938 if (!js3rdParamIsObject &&
939 !JSValueIsNull(context, arguments[2]) &&
940 !JSValueIsUndefined(context, arguments[2]))
941 ThrowMsg(InvalidArgumentException, "3rd argument must be an 'Filter object' or 'null'");
944 if (argumentCount >= 4)
946 if(JSValueIsObject(context, arguments[3]))
947 js4thParamIsObject = true;
949 if (!js4thParamIsObject &&
950 !JSValueIsNull(context, arguments[3]) &&
951 !JSValueIsUndefined(context, arguments[3]))
952 ThrowMsg(InvalidArgumentException, "4th argument must be an 'SortMode object' or 'null'");
954 } Catch(Exception ) {
955 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
956 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, _rethrown_exception.GetMessage());
959 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
961 callbackManager->setOnSuccess(arguments[0]);
963 if (js2ndParamIsFunction)
964 callbackManager->setOnError(arguments[1]);
966 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
967 FilterConverterFactory::ConverterType filterConverter = FilterConverterFactory::getConverter(context);
969 EventAddressBookFindPtr dplEvent(new EventAddressBookFind());
971 if (js3rdParamIsObject)
972 dplEvent->setFilter(filterConverter->toFilter(arguments[2]));
974 LogError("Error on 3rd parameter conversion : " << _rethrown_exception.GetMessage());
975 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "3rd argument must be an 'Filter object' or 'null'");
979 if (js4thParamIsObject)
980 dplEvent->setSortMode(filterConverter->toSortMode(arguments[3]));
982 LogError("Error on 4th parameter conversion : " << _rethrown_exception.GetMessage());
983 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "4th argument must be an 'SortMode object' or 'null'");
986 // set event handler's data
987 dplEvent->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
988 dplEvent->setForAsynchronousCall(controller);
990 // DPL::SharedPtr<IEventController> eventContr = DPL::StaticPointerCast< IEventController>(dplEvent);
991 // IJSPendingOperationPrivateObject *gcPendingOperation = new IJSPendingOperationPrivateObject(eventContr);
994 addressBook->find(dplEvent);
996 LogError("Error on platform : " << _rethrown_exception.GetMessage());
997 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
1000 JSValueProtect(gContext, thisObject);
1002 // return JSObjectMake(gContext, JSPendingOperation::getClassRef(), gcPendingOperation);
1003 return JSValueMakeUndefined(context);
1006 JSValueRef JSAddressBook::addChangeListener(JSContextRef context,
1008 JSObjectRef thisObject,
1009 size_t argumentCount,
1010 const JSValueRef arguments[],
1011 JSValueRef* exception)
1013 LogDebug("entered");
1014 AddressBookPtr addressBook;
1015 JSContextRef gContext;
1016 AddressBookController *controller;
1018 bool js2ndParamIsFunction = false;
1021 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
1023 ThrowMsg(InvalidArgumentException, "No private object.");
1025 addressBook = controller->getObject();
1026 gContext = controller->getContext();
1027 } Catch(Exception) {
1028 LogError("No private object");
1029 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
1032 AceSecurityStatus status = CONTACT_CHECK_ACCESS(
1033 CONTACT_FUNCTION_API_ADD_CHANGE_LISTENER);
1034 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
1036 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
1038 if (argumentCount < 1)
1039 ThrowMsg(InvalidArgumentException, "1st argument must be a 'AddressBookChangeCallback object'");
1041 if (!JSValueIsObject(context, arguments[0]))
1042 ThrowMsg(InvalidArgumentException, "1st argument must be a 'AddressBookChangeCallback object'");
1044 if (argumentCount >= 2)
1046 if(validator->isCallback(arguments[1]))
1047 js2ndParamIsFunction = true;
1049 if (!js2ndParamIsFunction &&
1050 !JSValueIsNull(context, arguments[1]) &&
1051 !JSValueIsUndefined(context, arguments[1]))
1052 ThrowMsg(InvalidArgumentException, "2nd argument must be a 'function' or a 'null'");
1055 } Catch(Exception ) {
1056 LogError("Argument type mismatch : " << _rethrown_exception.GetMessage());
1057 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, _rethrown_exception.GetMessage());
1060 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
1062 JSValueRef oncontactsadded;
1063 JSValueRef oncontactsupdated;
1064 JSValueRef oncontactsdeleted;
1066 JSObjectRef callbackObject = converter->toJSObjectRef(arguments[0]);
1068 oncontactsadded = JSUtils::getJSPropertyOrUndefined(context, callbackObject, "oncontactsadded");
1069 if (validator->isNullOrUndefined(oncontactsadded))
1070 oncontactsadded = NULL;
1071 else if (!validator->isCallback(oncontactsadded)) {
1072 ThrowMsg(ConversionException, "2nd argument's oncontactsadded attribute is not a 'function'");
1075 oncontactsupdated = JSUtils::getJSPropertyOrUndefined(context, callbackObject, "oncontactsupdated");
1076 if (validator->isNullOrUndefined(oncontactsupdated))
1077 oncontactsupdated = NULL;
1078 else if (!validator->isCallback(oncontactsupdated)) {
1079 ThrowMsg(ConversionException, "2nd argument's oncontactsupdated attribute is not a 'function'");
1082 oncontactsdeleted = JSUtils::getJSPropertyOrUndefined(context, callbackObject, "oncontactsremoved");
1083 if (validator->isNullOrUndefined(oncontactsdeleted))
1084 oncontactsdeleted = NULL;
1085 else if (!validator->isCallback(oncontactsdeleted)) {
1086 ThrowMsg(ConversionException, "2nd argument's oncontactsremoved attribute is not a 'function'");
1089 if (oncontactsadded == NULL && oncontactsupdated == NULL && oncontactsdeleted == NULL)
1090 ThrowMsg(ConversionException, "2nd argument must have at least one function");
1092 } Catch(ConversionException) {
1093 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
1094 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, _rethrown_exception.GetMessage());
1097 JSAddressBookChangeCallbackManagerPtr callbackManager = JSAddressBookChangeCallbackManager::createObject(gContext);
1099 callbackManager->setOnContactsAdded(oncontactsadded);
1100 callbackManager->setOnContactsUpdated(oncontactsupdated);
1101 callbackManager->setOnContactsDeleted(oncontactsdeleted);
1102 if(js2ndParamIsFunction)
1103 callbackManager->setOnError(arguments[1]);
1105 EventAddressBookChangeListenerEmitterPtr emitter(new EventAddressBookChangeListenerEmitter());
1107 emitter->setEventPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
1108 emitter->setListener(controller);
1110 EventAddressBookAddChangeListenerPtr dplEvent(new EventAddressBookAddChangeListener());
1112 dplEvent->setEmitter(emitter);
1113 dplEvent->setForSynchronousCall();
1116 addressBook->addChangeListener(dplEvent);
1117 } Catch(Exception) {
1118 LogError("Error on platform : " << _rethrown_exception.GetMessage());
1119 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
1122 if (!dplEvent->getResult() || !dplEvent->getIdIsSet())
1124 switch (dplEvent->getExceptionCode())
1126 case ExceptionCodes::InvalidArgumentException:
1127 case ExceptionCodes::PlatformException:
1128 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
1131 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
1136 long watchId = dplEvent->getId();
1140 result = converter->toJSValueRefLong(watchId);
1141 } Catch(Exception) {
1142 LogError("Error on conversion : " << _rethrown_exception.GetMessage());
1143 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
1146 JSValueProtect(gContext, thisObject);
1151 JSValueRef JSAddressBook::removeChangeListener(JSContextRef context,
1153 JSObjectRef thisObject,
1154 size_t argumentCount,
1155 const JSValueRef arguments[],
1156 JSValueRef* exception)
1158 LogDebug("entered");
1159 AddressBookPtr addressBook;
1160 JSContextRef gContext;
1161 AddressBookController *controller;
1164 controller = static_cast<AddressBookController*>(JSObjectGetPrivate(thisObject));
1166 ThrowMsg(InvalidArgumentException, "No private object.");
1168 addressBook = controller->getObject();
1169 gContext = controller->getContext();
1170 } Catch(Exception) {
1171 LogError("No private object");
1172 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong object");
1175 AceSecurityStatus status = CONTACT_CHECK_ACCESS(
1176 CONTACT_FUNCTION_API_REMOVE_CHANGE_LISTENER);
1177 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
1179 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
1180 if (argumentCount < 1)
1182 LogError("1st argument must not be undefined.");
1183 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_FOUND_ERROR, "No watch id 'undefined'");
1186 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
1190 watchId = static_cast<long>(converter->toLong(arguments[0]));
1193 ThrowMsg(PlatformException, "watchId is wrong (" << watchId << ")");
1194 } Catch(Exception) {
1195 LogError("Exception: " << _rethrown_exception.GetMessage());
1196 JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
1199 EventAddressBookRemoveChangeListenerPtr dplEvent(new EventAddressBookRemoveChangeListener());
1201 dplEvent->setId(watchId);
1202 dplEvent->setForSynchronousCall();
1205 addressBook->removeChangeListener(dplEvent);
1206 } Catch(Exception) {
1207 LogError("Error on platform : " << _rethrown_exception.GetMessage());
1208 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
1211 if (!dplEvent->getResult())
1213 switch (dplEvent->getExceptionCode())
1215 case ExceptionCodes::InvalidArgumentException:
1216 case ExceptionCodes::NotFoundException:
1217 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_FOUND_ERROR, "Contact not found");
1220 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Internal error");
1225 return JSValueMakeUndefined(context);