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 JSContactName.cpp
20 * @author Kisub Song (kisubs.song@samsung.com)
22 * @brief Implementation of the JSContactName class
25 #include <dpl/shared_ptr.h>
26 #include <CommonsJavaScript/Validator.h>
27 #include <JSWebAPIErrorFactory.h>
28 #include "ContactConverter.h"
29 #include "JSContactName.h"
33 #define CONTACT_CLASS_NAME "ContactName"
34 #define CONTACT_PROP_ATTR_PREFIX "prefix"
35 #define CONTACT_PROP_ATTR_SUFFIX "suffix"
36 #define CONTACT_PROP_ATTR_FIRST_NAME "firstName"
37 #define CONTACT_PROP_ATTR_MIDDLE_NAME "middleName"
38 #define CONTACT_PROP_ATTR_LAST_NAME "lastName"
39 #define CONTACT_PROP_ATTR_NICKNAMES "nicknames"
40 #define CONTACT_PROP_ATTR_PHONETIC_NAME "phoneticName"
41 #define CONTACT_PROP_ATTR_PHONETIC_FIRST_NAME "phoneticFirstName"
42 #define CONTACT_PROP_ATTR_PHONETIC_MIDDLE_NAME "phoneticMiddleName"
43 #define CONTACT_PROP_ATTR_PHONETIC_LAST_NAME "phoneticLastName"
44 #define CONTACT_PROP_ATTR_DISPLAY_NAME "displayName"
49 using namespace DeviceAPI::Common;
50 using namespace WrtDeviceApis::Commons;
51 using namespace WrtDeviceApis::CommonsJavaScript;
53 JSClassDefinition JSContactName::m_classInfo =
56 kJSClassAttributeNone,
66 NULL, //DeleteProperty,
67 NULL, //getPropertyNames,
68 NULL, //CallAsFunction,
69 constructor, //CallAsConstructor,
70 hasInstance, //HasInstance,
71 NULL, //ConvertToType,
74 JSStaticValue JSContactName::m_property[] = {
75 { CONTACT_PROP_ATTR_PREFIX, getPrefix, setPrefix, kJSPropertyAttributeNone },
76 { CONTACT_PROP_ATTR_SUFFIX, getSuffix, setSuffix, kJSPropertyAttributeNone },
77 { CONTACT_PROP_ATTR_FIRST_NAME, getFirstName, setFirstName, kJSPropertyAttributeNone },
78 { CONTACT_PROP_ATTR_MIDDLE_NAME, getMiddleName, setMiddleName, kJSPropertyAttributeNone },
79 { CONTACT_PROP_ATTR_LAST_NAME, getLastName, setLastName, kJSPropertyAttributeNone },
80 { CONTACT_PROP_ATTR_NICKNAMES, getNicknames, setNicknames, kJSPropertyAttributeNone },
81 { CONTACT_PROP_ATTR_PHONETIC_NAME, getPhoneticName, setPhoneticName, kJSPropertyAttributeNone },
82 { CONTACT_PROP_ATTR_PHONETIC_FIRST_NAME, getPhoneticFirstName, setPhoneticFirstName, kJSPropertyAttributeNone },
83 { CONTACT_PROP_ATTR_PHONETIC_MIDDLE_NAME, getPhoneticMiddleName, setPhoneticMiddleName, kJSPropertyAttributeNone },
84 { CONTACT_PROP_ATTR_PHONETIC_LAST_NAME, getPhoneticLastName, setPhoneticLastName, kJSPropertyAttributeNone },
85 { CONTACT_PROP_ATTR_DISPLAY_NAME, getDisplayName, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
89 JSStaticFunction JSContactName::m_functions[] =
94 JSClassRef JSContactName::m_classRef = JSClassCreate(&m_classInfo);
96 JSClassRef DLL_EXPORT JSContactName::getClassRef()
99 m_classRef = JSClassCreate(&m_classInfo);
104 bool JSContactName::isObjectOfClass(JSContextRef context, JSValueRef value)
106 return JSValueIsObjectOfClass(context, value, getClassRef());
109 ContactNamePtr JSContactName::getContactName(JSContextRef context, JSValueRef value)
111 if (!isObjectOfClass(context, value)) {
112 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
115 JSObjectRef object = JSValueToObject(context, value, NULL);
117 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
120 JSContactNamePriv *priv = static_cast<JSContactNamePriv*>(JSObjectGetPrivate(object));
122 Throw(WrtDeviceApis::Commons::NullPointerException);
125 return priv->getObject();
128 void JSContactName::Initialize(JSContextRef context, JSObjectRef object)
130 if (!JSObjectGetPrivate(object))
132 ContactNamePtr name(new ContactName());
133 JSContactNamePriv *priv = new JSContactNamePriv(context, ContactNamePtr(name));
134 if (!JSObjectSetPrivate(object, priv)) {
140 void JSContactName::Finalize(JSObjectRef object)
142 JSContactNamePriv *priv = static_cast<JSContactNamePriv*>(JSObjectGetPrivate(object));
148 JSObjectRef JSContactName::createJSObject(JSContextRef context, ContactNamePtr contactName)
150 JSContactNamePriv *priv = new JSContactNamePriv(context, contactName);
151 JSObjectRef jsObjectRef = JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
152 if (NULL == jsObjectRef)
154 LoggerE("object creation error");
160 ContactNamePtr JSContactName::getPrivData(JSObjectRef object)
162 JSContactNamePriv *priv = static_cast<JSContactNamePriv*>(JSObjectGetPrivate(object));
164 ThrowMsg(WrtDeviceApis::Commons::NullPointerException, "Private object is null");
167 ContactNamePtr result = priv->getObject();
169 ThrowMsg(WrtDeviceApis::Commons::NullPointerException, "Private object is null");
175 JSObjectRef JSContactName::constructor(JSContextRef context,
176 JSObjectRef constructor,
177 size_t argumentCount,
178 const JSValueRef arguments[],
179 JSValueRef* exception)
181 bool js1stParamIsObject = false;
183 JSContactNamePriv *priv = static_cast<JSContactNamePriv*>(JSObjectGetPrivate(constructor));
185 ThrowMsg(WrtDeviceApis::Commons::NullPointerException, "Private object is null");
187 JSContextRef gContext = priv->getContext();
189 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
191 if (argumentCount >= 1)
193 if (JSValueIsObject(gContext, arguments[0]))
194 js1stParamIsObject = true;
196 if (!js1stParamIsObject &&
197 !JSValueIsNull(gContext, arguments[0]) &&
198 !JSValueIsUndefined(gContext, arguments[0]))
199 ThrowMsg(InvalidArgumentException, "1st argument must be 'object'");
202 } Catch(Exception ) {
203 LoggerE("Argument type mismatch : " << _rethrown_exception.GetMessage());
204 *exception = JSWebAPIErrorFactory::makeErrorObject(context, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "1st argument must be 'object'");
208 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
210 ContactNamePtr contactName(NULL);
212 if(js1stParamIsObject)
213 contactName = converter->toContactNameFromInit(arguments[0]);
215 contactName = ContactNamePtr(new ContactName());
218 LoggerE("Argument type mismatch : " << _rethrown_exception.GetMessage());
219 *exception = JSWebAPIErrorFactory::makeErrorObject(context, JSWebAPIErrorFactory::UNKNOWN_ERROR, "Internal error");
223 JSObjectRef jsobject;
226 jsobject = createJSObject(gContext, contactName);
228 LoggerE("Argument type mismatch : " << _rethrown_exception.GetMessage());
229 *exception = JSWebAPIErrorFactory::makeErrorObject(context, JSWebAPIErrorFactory::UNKNOWN_ERROR, "Internal error");
236 bool JSContactName::hasInstance(JSContextRef context,
237 JSObjectRef constructor,
238 JSValueRef possibleInstance,
239 JSValueRef* exception)
241 return JSValueIsObjectOfClass(context, possibleInstance, getClassRef());
244 JSValueRef JSContactName::getPrefix(JSContextRef context,
246 JSStringRef propertyName,
247 JSValueRef* exception)
251 ContactConverterFactory::ConverterType converter =
252 ContactConverterFactory::getConverter(context);
253 ContactNamePtr contactName = getPrivData(object);
254 if(!contactName->getPrefixIsSet())
255 return JSValueMakeNull(context);
257 return converter->toJSValueRef(contactName->getPrefix());
259 Catch(WrtDeviceApis::Commons::Exception)
261 LoggerW("trying to get incorrect value");
264 return JSValueMakeUndefined(context);
267 bool JSContactName::setPrefix(JSContextRef context,
269 JSStringRef propertyName,
271 JSValueRef* exception)
275 ContactNamePtr contactName = getPrivData(object);
276 ContactConverterFactory::ConverterType converter =
277 ContactConverterFactory::getConverter(context);
278 BasicValidator validator =
279 BasicValidatorFactory::getValidator(context, exception);
280 if(validator->isNullOrUndefined(value))
281 contactName->unsetPrefix();
283 contactName->setPrefix(converter->toString(value));
285 Catch(WrtDeviceApis::Commons::Exception)
287 LoggerW("trying to set incorrect value");
288 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
293 JSValueRef JSContactName::getSuffix(JSContextRef context,
295 JSStringRef propertyName,
296 JSValueRef* exception)
300 ContactConverterFactory::ConverterType converter =
301 ContactConverterFactory::getConverter(context);
302 ContactNamePtr contactName = getPrivData(object);
303 if(!contactName->getSuffixIsSet())
304 return JSValueMakeNull(context);
306 return converter->toJSValueRef(contactName->getSuffix());
308 Catch(WrtDeviceApis::Commons::Exception)
310 LoggerW("trying to get incorrect value");
313 return JSValueMakeUndefined(context);
316 bool JSContactName::setSuffix(JSContextRef context,
318 JSStringRef propertyName,
320 JSValueRef* exception)
324 ContactNamePtr contactName = getPrivData(object);
325 ContactConverterFactory::ConverterType converter =
326 ContactConverterFactory::getConverter(context);
327 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
328 if(validator->isNullOrUndefined(value))
329 contactName->unsetSuffix();
331 contactName->setSuffix(converter->toString(value));
333 Catch(WrtDeviceApis::Commons::Exception)
335 LoggerW("trying to set incorrect value");
336 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
341 JSValueRef JSContactName::getFirstName(JSContextRef context,
343 JSStringRef propertyName,
344 JSValueRef* exception)
348 ContactConverterFactory::ConverterType converter =
349 ContactConverterFactory::getConverter(context);
350 ContactNamePtr contactName = getPrivData(object);
351 if(!contactName->getFirstNameIsSet())
352 return JSValueMakeNull(context);
354 return converter->toJSValueRef(contactName->getFirstName());
356 Catch(WrtDeviceApis::Commons::Exception)
358 LoggerW("trying to get incorrect value");
361 return JSValueMakeUndefined(context);
364 bool JSContactName::setFirstName(JSContextRef context,
366 JSStringRef propertyName,
368 JSValueRef* exception)
372 ContactNamePtr contactName = getPrivData(object);
373 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
374 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
375 if(validator->isNullOrUndefined(value))
376 contactName->unsetFirstName();
378 contactName->setFirstName(converter->toString(value));
380 Catch(WrtDeviceApis::Commons::Exception)
382 LoggerW("trying to set incorrect value");
383 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
389 JSValueRef JSContactName::getMiddleName(JSContextRef context,
391 JSStringRef propertyName,
392 JSValueRef* exception)
396 ContactConverterFactory::ConverterType converter =
397 ContactConverterFactory::getConverter(context);
398 ContactNamePtr contactName = getPrivData(object);
399 if(!contactName->getMiddleNameIsSet())
400 return JSValueMakeNull(context);
402 return converter->toJSValueRef(contactName->getMiddleName());
404 Catch(WrtDeviceApis::Commons::Exception)
406 LoggerW("trying to get incorrect value");
409 return JSValueMakeUndefined(context);
412 bool JSContactName::setMiddleName(JSContextRef context,
414 JSStringRef propertyName,
416 JSValueRef* exception)
420 ContactNamePtr contactName = getPrivData(object);
421 ContactConverterFactory::ConverterType converter =
422 ContactConverterFactory::getConverter(context);
423 BasicValidator validator =
424 BasicValidatorFactory::getValidator(context, exception);
425 if(validator->isNullOrUndefined(value))
426 contactName->unsetMiddleName();
428 contactName->setMiddleName(converter->toString(value));
430 Catch(WrtDeviceApis::Commons::Exception)
432 LoggerW("trying to set incorrect value");
433 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
439 JSValueRef JSContactName::getLastName(JSContextRef context,
441 JSStringRef propertyName,
442 JSValueRef* exception)
446 ContactConverterFactory::ConverterType converter =
447 ContactConverterFactory::getConverter(context);
448 ContactNamePtr contactName = getPrivData(object);
449 if(!contactName->getLastNameIsSet())
450 return JSValueMakeNull(context);
452 return converter->toJSValueRef(contactName->getLastName());
454 Catch(WrtDeviceApis::Commons::Exception)
456 LoggerW("trying to get incorrect value");
459 return JSValueMakeUndefined(context);
462 bool JSContactName::setLastName(JSContextRef context,
464 JSStringRef propertyName,
466 JSValueRef* exception)
470 ContactNamePtr contactName = getPrivData(object);
471 ContactConverterFactory::ConverterType converter =
472 ContactConverterFactory::getConverter(context);
473 BasicValidator validator =
474 BasicValidatorFactory::getValidator(context, exception);
475 if(validator->isNullOrUndefined(value))
476 contactName->unsetLastName();
478 contactName->setLastName(converter->toString(value));
480 Catch(WrtDeviceApis::Commons::Exception)
482 LoggerW("trying to set incorrect value");
483 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
489 JSValueRef JSContactName::getNicknames(JSContextRef context,
491 JSStringRef propertyName,
492 JSValueRef* exception)
496 JSContactNamePriv *priv = static_cast<JSContactNamePriv*>(JSObjectGetPrivate(object));
498 ThrowMsg(WrtDeviceApis::Commons::NullPointerException, "Private object is null");
500 JSContextRef gContext = priv->getContext();
502 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
503 ContactNamePtr contactName = getPrivData(object);
505 if(contactName->IsTypesSetJSArray()){
506 return contactName->getTypesJSObj();
508 JSValueRef tempJSValue = contactName->getTypesJSArray();
509 tempJSValue = converter->toJSValueRef(contactName->getNicknames());
511 JSObjectRef convertedJSObject = contactName->getTypesJSObj();
512 convertedJSObject = JSValueToObject( gContext, tempJSValue, NULL );
513 contactName->setTypesJSArray(true, convertedJSObject);
515 JSValueProtect(gContext, convertedJSObject);
516 contactName->setContext(gContext);
520 Catch(WrtDeviceApis::Commons::Exception)
522 LoggerW("trying to get incorrect value");
525 return JSValueMakeUndefined(context);
528 bool JSContactName::setNicknames(JSContextRef context,
530 JSStringRef propertyName,
532 JSValueRef* exception)
536 ContactNamePtr contactName = getPrivData(object);
537 ContactConverterFactory::ConverterType converter =
538 ContactConverterFactory::getConverter(context);
539 contactName->setNicknames(converter->toStringArray(value));
540 contactName->resetTypesJSObj();
542 Catch(WrtDeviceApis::Commons::Exception)
544 LoggerW("trying to set incorrect value");
545 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
551 JSValueRef JSContactName::getPhoneticName(JSContextRef context,
553 JSStringRef propertyName,
554 JSValueRef* exception)
556 // NOTE: Deprecated field.
557 return JSValueMakeNull(context);
560 bool JSContactName::setPhoneticName(JSContextRef context,
562 JSStringRef propertyName,
564 JSValueRef* exception)
566 // NOTE: Deprecated field.
570 JSValueRef JSContactName::getPhoneticFirstName(JSContextRef context,
572 JSStringRef propertyName,
573 JSValueRef* exception)
577 ContactConverterFactory::ConverterType converter =
578 ContactConverterFactory::getConverter(context);
579 ContactNamePtr contactName = getPrivData(object);
580 if(!contactName->getPhoneticFirstNameIsSet())
581 return JSValueMakeNull(context);
583 return converter->toJSValueRef(contactName->getPhoneticFirstName());
585 Catch(WrtDeviceApis::Commons::Exception)
587 LoggerW("trying to get incorrect value");
590 return JSValueMakeUndefined(context);
593 bool JSContactName::setPhoneticFirstName(JSContextRef context,
595 JSStringRef propertyName,
597 JSValueRef* exception)
601 ContactNamePtr contactName = getPrivData(object);
602 ContactConverterFactory::ConverterType converter =
603 ContactConverterFactory::getConverter(context);
604 BasicValidator validator =
605 BasicValidatorFactory::getValidator(context, exception);
606 if(validator->isNullOrUndefined(value))
607 contactName->unsetPhoneticFirstName();
609 contactName->setPhoneticFirstName(converter->toString(value));
611 Catch(WrtDeviceApis::Commons::Exception)
613 LoggerW("trying to set incorrect value");
614 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
619 JSValueRef JSContactName::getPhoneticMiddleName(JSContextRef context,
621 JSStringRef propertyName,
622 JSValueRef* exception)
626 ContactConverterFactory::ConverterType converter =
627 ContactConverterFactory::getConverter(context);
628 ContactNamePtr contactName = getPrivData(object);
630 if(!contactName->getPhoneticMiddleNameIsSet())
631 return JSValueMakeNull(context);
633 return converter->toJSValueRef(contactName->getPhoneticMiddleName());
635 Catch(WrtDeviceApis::Commons::Exception)
637 LoggerW("trying to get incorrect value");
640 return JSValueMakeUndefined(context);
643 bool JSContactName::setPhoneticMiddleName(JSContextRef context,
645 JSStringRef propertyName,
647 JSValueRef* exception)
651 ContactNamePtr contactName = getPrivData(object);
652 ContactConverterFactory::ConverterType converter =
653 ContactConverterFactory::getConverter(context);
654 BasicValidator validator =
655 BasicValidatorFactory::getValidator(context, exception);
656 if(validator->isNullOrUndefined(value))
657 contactName->unsetPhoneticMiddleName();
659 contactName->setPhoneticMiddleName(converter->toString(value));
661 Catch(WrtDeviceApis::Commons::Exception)
663 LoggerW("trying to set incorrect value");
664 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
670 JSValueRef JSContactName::getPhoneticLastName(JSContextRef context,
672 JSStringRef propertyName,
673 JSValueRef* exception)
677 ContactConverterFactory::ConverterType converter =
678 ContactConverterFactory::getConverter(context);
679 ContactNamePtr contactName = getPrivData(object);
680 if(!contactName->getPhoneticLastNameIsSet())
681 return JSValueMakeNull(context);
683 return converter->toJSValueRef(contactName->getPhoneticLastName());
685 Catch(WrtDeviceApis::Commons::Exception)
687 LoggerW("trying to get incorrect value");
690 return JSValueMakeUndefined(context);
693 bool JSContactName::setPhoneticLastName(JSContextRef context,
695 JSStringRef propertyName,
697 JSValueRef* exception)
701 ContactNamePtr contactName = getPrivData(object);
702 ContactConverterFactory::ConverterType converter =
703 ContactConverterFactory::getConverter(context);
704 BasicValidator validator =
705 BasicValidatorFactory::getValidator(context, exception);
706 if(validator->isNullOrUndefined(value))
707 contactName->unsetPhoneticLastName();
709 contactName->setPhoneticLastName(converter->toString(value));
711 Catch(WrtDeviceApis::Commons::Exception)
713 LoggerW("trying to set incorrect value");
714 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
720 JSValueRef JSContactName::getDisplayName(JSContextRef context,
722 JSStringRef propertyName,
723 JSValueRef* exception)
727 ContactConverterFactory::ConverterType converter =
728 ContactConverterFactory::getConverter(context);
729 ContactNamePtr contactName = getPrivData(object);
730 if(!contactName->getDisplayNameIsSet())
731 return JSValueMakeNull(context);
733 return converter->toJSValueRef(contactName->getDisplayName());
735 Catch(WrtDeviceApis::Commons::Exception)
737 LoggerW("trying to get incorrect value");
740 return JSValueMakeUndefined(context);