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 <JSTizenExceptionFactory.h>
28 #include <JSTizenException.h>
29 #include "ContactConverter.h"
30 #include "JSContactName.h"
34 #define CONTACT_CLASS_NAME "ContactName"
35 #define CONTACT_PROP_ATTR_PREFIX "prefix"
36 #define CONTACT_PROP_ATTR_SUFFIX "suffix"
37 #define CONTACT_PROP_ATTR_FIRST_NAME "firstName"
38 #define CONTACT_PROP_ATTR_MIDDLE_NAME "middleName"
39 #define CONTACT_PROP_ATTR_LAST_NAME "lastName"
40 #define CONTACT_PROP_ATTR_NICKNAMES "nicknames"
41 #define CONTACT_PROP_ATTR_PHONETIC_NAME "phoneticName"
42 #define CONTACT_PROP_ATTR_PHONETIC_FIRST_NAME "phoneticFirstName"
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_LAST_NAME, getPhoneticLastName, setPhoneticLastName, kJSPropertyAttributeNone },
84 { CONTACT_PROP_ATTR_DISPLAY_NAME, getDisplayName, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
88 JSStaticFunction JSContactName::m_functions[] =
93 JSClassRef JSContactName::m_classRef = JSClassCreate(&m_classInfo);
95 JSClassRef DLL_EXPORT JSContactName::getClassRef()
98 m_classRef = JSClassCreate(&m_classInfo);
103 bool JSContactName::isObjectOfClass(JSContextRef context, JSValueRef value)
105 return JSValueIsObjectOfClass(context, value, getClassRef());
108 ContactNamePtr JSContactName::getContactName(JSContextRef context, JSValueRef value)
110 if (!isObjectOfClass(context, value)) {
111 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
114 JSObjectRef object = JSValueToObject(context, value, NULL);
116 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
119 JSContactNamePriv *priv = static_cast<JSContactNamePriv*>(JSObjectGetPrivate(object));
121 Throw(WrtDeviceApis::Commons::NullPointerException);
124 return priv->getObject();
127 void JSContactName::Initialize(JSContextRef context, JSObjectRef object)
129 if (!JSObjectGetPrivate(object))
131 ContactNamePtr name(new ContactName());
132 JSContactNamePriv *priv = new JSContactNamePriv(context, ContactNamePtr(name));
133 if (!JSObjectSetPrivate(object, priv)) {
139 void JSContactName::Finalize(JSObjectRef object)
141 JSContactNamePriv *priv = static_cast<JSContactNamePriv*>(JSObjectGetPrivate(object));
147 JSObjectRef JSContactName::createJSObject(JSContextRef context, ContactNamePtr contactName)
149 JSContactNamePriv *priv = new JSContactNamePriv(context, contactName);
150 JSObjectRef jsObjectRef = JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
151 if (NULL == jsObjectRef)
153 LoggerE("object creation error");
159 ContactNamePtr JSContactName::getPrivData(JSObjectRef object)
161 JSContactNamePriv *priv = static_cast<JSContactNamePriv*>(JSObjectGetPrivate(object));
163 ThrowMsg(WrtDeviceApis::Commons::NullPointerException, "Private object is null");
166 ContactNamePtr result = priv->getObject();
168 ThrowMsg(WrtDeviceApis::Commons::NullPointerException, "Private object is null");
174 JSObjectRef JSContactName::constructor(JSContextRef context,
175 JSObjectRef constructor,
176 size_t argumentCount,
177 const JSValueRef arguments[],
178 JSValueRef* exception)
180 bool js1stParamIsObject = false;
182 JSContactNamePriv *priv = static_cast<JSContactNamePriv*>(JSObjectGetPrivate(constructor));
184 ThrowMsg(WrtDeviceApis::Commons::NullPointerException, "Private object is null");
186 JSContextRef gContext = priv->getContext();
188 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
190 if (argumentCount >= 1)
192 if (JSValueIsObject(gContext, arguments[0]))
193 js1stParamIsObject = true;
195 if (!js1stParamIsObject &&
196 !JSValueIsNull(gContext, arguments[0]) &&
197 !JSValueIsUndefined(gContext, arguments[0]))
198 ThrowMsg(InvalidArgumentException, "1st argument must be 'object'");
201 } Catch(Exception ) {
202 LoggerE("Argument type mismatch : " << _rethrown_exception.GetMessage());
203 *exception = JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::TYPE_MISMATCH_ERROR, "1st argument must be 'object'");
207 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
209 ContactNamePtr contactName(NULL);
211 if(js1stParamIsObject)
212 contactName = converter->toContactNameFromInit(arguments[0]);
214 contactName = ContactNamePtr(new ContactName());
217 LoggerE("Argument type mismatch : " << _rethrown_exception.GetMessage());
218 *exception = JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::UNKNOWN_ERROR, "Internal error");
222 JSObjectRef jsobject;
225 jsobject = createJSObject(gContext, contactName);
227 LoggerE("Argument type mismatch : " << _rethrown_exception.GetMessage());
228 *exception = JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::UNKNOWN_ERROR, "Internal error");
235 bool JSContactName::hasInstance(JSContextRef context,
236 JSObjectRef constructor,
237 JSValueRef possibleInstance,
238 JSValueRef* exception)
240 return JSValueIsObjectOfClass(context, possibleInstance, getClassRef());
243 JSValueRef JSContactName::getPrefix(JSContextRef context,
245 JSStringRef propertyName,
246 JSValueRef* exception)
250 ContactConverterFactory::ConverterType converter =
251 ContactConverterFactory::getConverter(context);
252 ContactNamePtr contactName = getPrivData(object);
253 if(!contactName->getPrefixIsSet())
254 return JSValueMakeNull(context);
256 return converter->toJSValueRef(contactName->getPrefix());
258 Catch(WrtDeviceApis::Commons::Exception)
260 LoggerW("trying to get incorrect value");
263 return JSValueMakeUndefined(context);
266 bool JSContactName::setPrefix(JSContextRef context,
268 JSStringRef propertyName,
270 JSValueRef* exception)
274 ContactNamePtr contactName = getPrivData(object);
275 ContactConverterFactory::ConverterType converter =
276 ContactConverterFactory::getConverter(context);
277 BasicValidator validator =
278 BasicValidatorFactory::getValidator(context, exception);
279 if(validator->isNullOrUndefined(value))
280 contactName->unsetPrefix();
282 contactName->setPrefix(converter->toString(value));
284 Catch(WrtDeviceApis::Commons::Exception)
286 LoggerW("trying to set incorrect value");
287 JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type mismatch");
292 JSValueRef JSContactName::getSuffix(JSContextRef context,
294 JSStringRef propertyName,
295 JSValueRef* exception)
299 ContactConverterFactory::ConverterType converter =
300 ContactConverterFactory::getConverter(context);
301 ContactNamePtr contactName = getPrivData(object);
302 if(!contactName->getSuffixIsSet())
303 return JSValueMakeNull(context);
305 return converter->toJSValueRef(contactName->getSuffix());
307 Catch(WrtDeviceApis::Commons::Exception)
309 LoggerW("trying to get incorrect value");
312 return JSValueMakeUndefined(context);
315 bool JSContactName::setSuffix(JSContextRef context,
317 JSStringRef propertyName,
319 JSValueRef* exception)
323 ContactNamePtr contactName = getPrivData(object);
324 ContactConverterFactory::ConverterType converter =
325 ContactConverterFactory::getConverter(context);
326 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
327 if(validator->isNullOrUndefined(value))
328 contactName->unsetSuffix();
330 contactName->setSuffix(converter->toString(value));
332 Catch(WrtDeviceApis::Commons::Exception)
334 LoggerW("trying to set incorrect value");
335 JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type mismatch");
340 JSValueRef JSContactName::getFirstName(JSContextRef context,
342 JSStringRef propertyName,
343 JSValueRef* exception)
347 ContactConverterFactory::ConverterType converter =
348 ContactConverterFactory::getConverter(context);
349 ContactNamePtr contactName = getPrivData(object);
350 if(!contactName->getFirstNameIsSet())
351 return JSValueMakeNull(context);
353 return converter->toJSValueRef(contactName->getFirstName());
355 Catch(WrtDeviceApis::Commons::Exception)
357 LoggerW("trying to get incorrect value");
360 return JSValueMakeUndefined(context);
363 bool JSContactName::setFirstName(JSContextRef context,
365 JSStringRef propertyName,
367 JSValueRef* exception)
371 ContactNamePtr contactName = getPrivData(object);
372 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
373 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
374 if(validator->isNullOrUndefined(value))
375 contactName->unsetFirstName();
377 contactName->setFirstName(converter->toString(value));
379 Catch(WrtDeviceApis::Commons::Exception)
381 LoggerW("trying to set incorrect value");
382 JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type mismatch");
388 JSValueRef JSContactName::getMiddleName(JSContextRef context,
390 JSStringRef propertyName,
391 JSValueRef* exception)
395 ContactConverterFactory::ConverterType converter =
396 ContactConverterFactory::getConverter(context);
397 ContactNamePtr contactName = getPrivData(object);
398 if(!contactName->getMiddleNameIsSet())
399 return JSValueMakeNull(context);
401 return converter->toJSValueRef(contactName->getMiddleName());
403 Catch(WrtDeviceApis::Commons::Exception)
405 LoggerW("trying to get incorrect value");
408 return JSValueMakeUndefined(context);
411 bool JSContactName::setMiddleName(JSContextRef context,
413 JSStringRef propertyName,
415 JSValueRef* exception)
419 ContactNamePtr contactName = getPrivData(object);
420 ContactConverterFactory::ConverterType converter =
421 ContactConverterFactory::getConverter(context);
422 BasicValidator validator =
423 BasicValidatorFactory::getValidator(context, exception);
424 if(validator->isNullOrUndefined(value))
425 contactName->unsetMiddleName();
427 contactName->setMiddleName(converter->toString(value));
429 Catch(WrtDeviceApis::Commons::Exception)
431 LoggerW("trying to set incorrect value");
432 JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type mismatch");
438 JSValueRef JSContactName::getLastName(JSContextRef context,
440 JSStringRef propertyName,
441 JSValueRef* exception)
445 ContactConverterFactory::ConverterType converter =
446 ContactConverterFactory::getConverter(context);
447 ContactNamePtr contactName = getPrivData(object);
448 if(!contactName->getLastNameIsSet())
449 return JSValueMakeNull(context);
451 return converter->toJSValueRef(contactName->getLastName());
453 Catch(WrtDeviceApis::Commons::Exception)
455 LoggerW("trying to get incorrect value");
458 return JSValueMakeUndefined(context);
461 bool JSContactName::setLastName(JSContextRef context,
463 JSStringRef propertyName,
465 JSValueRef* exception)
469 ContactNamePtr contactName = getPrivData(object);
470 ContactConverterFactory::ConverterType converter =
471 ContactConverterFactory::getConverter(context);
472 BasicValidator validator =
473 BasicValidatorFactory::getValidator(context, exception);
474 if(validator->isNullOrUndefined(value))
475 contactName->unsetLastName();
477 contactName->setLastName(converter->toString(value));
479 Catch(WrtDeviceApis::Commons::Exception)
481 LoggerW("trying to set incorrect value");
482 JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type mismatch");
488 JSValueRef JSContactName::getNicknames(JSContextRef context,
490 JSStringRef propertyName,
491 JSValueRef* exception)
495 JSContactNamePriv *priv = static_cast<JSContactNamePriv*>(JSObjectGetPrivate(object));
497 ThrowMsg(WrtDeviceApis::Commons::NullPointerException, "Private object is null");
499 JSContextRef gContext = priv->getContext();
501 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
502 ContactNamePtr contactName = getPrivData(object);
504 if(contactName->IsTypesSetJSArray()){
505 return contactName->getTypesJSObj();
507 JSValueRef tempJSValue = contactName->getTypesJSArray();
508 tempJSValue = converter->toJSValueRef(contactName->getNicknames());
510 JSObjectRef convertedJSObject = contactName->getTypesJSObj();
511 convertedJSObject = JSValueToObject( gContext, tempJSValue, NULL );
512 contactName->setTypesJSArray(true, convertedJSObject);
514 JSValueProtect(gContext, convertedJSObject);
515 contactName->setContext(gContext);
519 Catch(WrtDeviceApis::Commons::Exception)
521 LoggerW("trying to get incorrect value");
524 return JSValueMakeUndefined(context);
527 bool JSContactName::setNicknames(JSContextRef context,
529 JSStringRef propertyName,
531 JSValueRef* exception)
535 ContactNamePtr contactName = getPrivData(object);
536 ContactConverterFactory::ConverterType converter =
537 ContactConverterFactory::getConverter(context);
538 contactName->setNicknames(converter->toStringArray(value));
539 contactName->resetTypesJSObj();
541 Catch(WrtDeviceApis::Commons::Exception)
543 LoggerW("trying to set incorrect value");
544 JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type mismatch");
550 JSValueRef JSContactName::getPhoneticName(JSContextRef context,
552 JSStringRef propertyName,
553 JSValueRef* exception)
555 // NOTE: Deprecated field.
556 return JSValueMakeNull(context);
559 bool JSContactName::setPhoneticName(JSContextRef context,
561 JSStringRef propertyName,
563 JSValueRef* exception)
565 // NOTE: Deprecated field.
569 JSValueRef JSContactName::getPhoneticFirstName(JSContextRef context,
571 JSStringRef propertyName,
572 JSValueRef* exception)
576 ContactConverterFactory::ConverterType converter =
577 ContactConverterFactory::getConverter(context);
578 ContactNamePtr contactName = getPrivData(object);
579 if(!contactName->getPhoneticFirstNameIsSet())
580 return JSValueMakeNull(context);
582 return converter->toJSValueRef(contactName->getPhoneticFirstName());
584 Catch(WrtDeviceApis::Commons::Exception)
586 LoggerW("trying to get incorrect value");
589 return JSValueMakeUndefined(context);
592 bool JSContactName::setPhoneticFirstName(JSContextRef context,
594 JSStringRef propertyName,
596 JSValueRef* exception)
600 ContactNamePtr contactName = getPrivData(object);
601 ContactConverterFactory::ConverterType converter =
602 ContactConverterFactory::getConverter(context);
603 BasicValidator validator =
604 BasicValidatorFactory::getValidator(context, exception);
605 if(validator->isNullOrUndefined(value))
606 contactName->unsetPhoneticFirstName();
608 contactName->setPhoneticFirstName(converter->toString(value));
610 Catch(WrtDeviceApis::Commons::Exception)
612 LoggerW("trying to set incorrect value");
613 JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type mismatch");
619 JSValueRef JSContactName::getPhoneticLastName(JSContextRef context,
621 JSStringRef propertyName,
622 JSValueRef* exception)
626 ContactConverterFactory::ConverterType converter =
627 ContactConverterFactory::getConverter(context);
628 ContactNamePtr contactName = getPrivData(object);
629 if(!contactName->getPhoneticLastNameIsSet())
630 return JSValueMakeNull(context);
632 return converter->toJSValueRef(contactName->getPhoneticLastName());
634 Catch(WrtDeviceApis::Commons::Exception)
636 LoggerW("trying to get incorrect value");
639 return JSValueMakeUndefined(context);
642 bool JSContactName::setPhoneticLastName(JSContextRef context,
644 JSStringRef propertyName,
646 JSValueRef* exception)
650 ContactNamePtr contactName = getPrivData(object);
651 ContactConverterFactory::ConverterType converter =
652 ContactConverterFactory::getConverter(context);
653 BasicValidator validator =
654 BasicValidatorFactory::getValidator(context, exception);
655 if(validator->isNullOrUndefined(value))
656 contactName->unsetPhoneticLastName();
658 contactName->setPhoneticLastName(converter->toString(value));
660 Catch(WrtDeviceApis::Commons::Exception)
662 LoggerW("trying to set incorrect value");
663 JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type mismatch");
669 JSValueRef JSContactName::getDisplayName(JSContextRef context,
671 JSStringRef propertyName,
672 JSValueRef* exception)
676 ContactConverterFactory::ConverterType converter =
677 ContactConverterFactory::getConverter(context);
678 ContactNamePtr contactName = getPrivData(object);
679 if(!contactName->getDisplayNameIsSet())
680 return JSValueMakeNull(context);
682 return converter->toJSValueRef(contactName->getDisplayName());
684 Catch(WrtDeviceApis::Commons::Exception)
686 LoggerW("trying to get incorrect value");
689 return JSValueMakeUndefined(context);