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_LAST_NAME "phoneticLastName"
43 #define CONTACT_PROP_ATTR_DISPLAY_NAME "displayName"
48 using namespace DeviceAPI::Common;
49 using namespace WrtDeviceApis::Commons;
50 using namespace WrtDeviceApis::CommonsJavaScript;
52 JSClassDefinition JSContactName::m_classInfo =
55 kJSClassAttributeNone,
65 NULL, //DeleteProperty,
66 NULL, //getPropertyNames,
67 NULL, //CallAsFunction,
68 constructor, //CallAsConstructor,
69 hasInstance, //HasInstance,
70 NULL, //ConvertToType,
73 JSStaticValue JSContactName::m_property[] = {
74 { CONTACT_PROP_ATTR_PREFIX, getPrefix, setPrefix, kJSPropertyAttributeNone },
75 { CONTACT_PROP_ATTR_SUFFIX, getSuffix, setSuffix, kJSPropertyAttributeNone },
76 { CONTACT_PROP_ATTR_FIRST_NAME, getFirstName, setFirstName, kJSPropertyAttributeNone },
77 { CONTACT_PROP_ATTR_MIDDLE_NAME, getMiddleName, setMiddleName, kJSPropertyAttributeNone },
78 { CONTACT_PROP_ATTR_LAST_NAME, getLastName, setLastName, kJSPropertyAttributeNone },
79 { CONTACT_PROP_ATTR_NICKNAMES, getNicknames, setNicknames, kJSPropertyAttributeNone },
80 { CONTACT_PROP_ATTR_PHONETIC_NAME, getPhoneticName, setPhoneticName, kJSPropertyAttributeNone },
81 { CONTACT_PROP_ATTR_PHONETIC_FIRST_NAME, getPhoneticFirstName, setPhoneticFirstName, kJSPropertyAttributeNone },
82 { CONTACT_PROP_ATTR_PHONETIC_LAST_NAME, getPhoneticLastName, setPhoneticLastName, kJSPropertyAttributeNone },
83 { CONTACT_PROP_ATTR_DISPLAY_NAME, getDisplayName, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
87 JSStaticFunction JSContactName::m_functions[] =
92 JSClassRef JSContactName::m_classRef = JSClassCreate(&m_classInfo);
94 JSClassRef DLL_EXPORT JSContactName::getClassRef()
97 m_classRef = JSClassCreate(&m_classInfo);
102 bool JSContactName::isObjectOfClass(JSContextRef context, JSValueRef value)
104 return JSValueIsObjectOfClass(context, value, getClassRef());
107 ContactNamePtr JSContactName::getContactName(JSContextRef context, JSValueRef value)
109 if (!isObjectOfClass(context, value)) {
110 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
113 JSObjectRef object = JSValueToObject(context, value, NULL);
115 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
118 JSContactNamePriv *priv = static_cast<JSContactNamePriv*>(JSObjectGetPrivate(object));
120 Throw(WrtDeviceApis::Commons::NullPointerException);
123 return priv->getObject();
126 void JSContactName::Initialize(JSContextRef context, JSObjectRef object)
128 if (!JSObjectGetPrivate(object))
130 ContactNamePtr name(new ContactName());
131 JSContactNamePriv *priv = new JSContactNamePriv(context, ContactNamePtr(name));
132 if (!JSObjectSetPrivate(object, priv)) {
138 void JSContactName::Finalize(JSObjectRef object)
140 JSContactNamePriv *priv = static_cast<JSContactNamePriv*>(JSObjectGetPrivate(object));
146 JSObjectRef JSContactName::createJSObject(JSContextRef context, ContactNamePtr contactName)
148 JSContactNamePriv *priv = new JSContactNamePriv(context, contactName);
149 JSObjectRef jsObjectRef = JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
150 if (NULL == jsObjectRef)
152 LoggerE("object creation error");
158 ContactNamePtr JSContactName::getPrivData(JSObjectRef object)
160 JSContactNamePriv *priv = static_cast<JSContactNamePriv*>(JSObjectGetPrivate(object));
162 ThrowMsg(WrtDeviceApis::Commons::NullPointerException, "Private object is null");
165 ContactNamePtr result = priv->getObject();
167 ThrowMsg(WrtDeviceApis::Commons::NullPointerException, "Private object is null");
173 JSObjectRef JSContactName::constructor(JSContextRef context,
174 JSObjectRef constructor,
175 size_t argumentCount,
176 const JSValueRef arguments[],
177 JSValueRef* exception)
179 bool js1stParamIsObject = false;
181 JSContactNamePriv *priv = static_cast<JSContactNamePriv*>(JSObjectGetPrivate(constructor));
183 ThrowMsg(WrtDeviceApis::Commons::NullPointerException, "Private object is null");
185 JSContextRef gContext = priv->getContext();
187 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
189 if (argumentCount >= 1)
191 if (JSValueIsObject(gContext, arguments[0]))
192 js1stParamIsObject = true;
194 if (!js1stParamIsObject &&
195 !JSValueIsNull(gContext, arguments[0]) &&
196 !JSValueIsUndefined(gContext, arguments[0]))
197 ThrowMsg(InvalidArgumentException, "1st argument must be 'object'");
200 } Catch(Exception ) {
201 LoggerE("Argument type mismatch : " << _rethrown_exception.GetMessage());
202 *exception = JSWebAPIErrorFactory::makeErrorObject(context, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "1st argument must be 'object'");
206 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
208 ContactNamePtr contactName(NULL);
210 if(js1stParamIsObject)
211 contactName = converter->toContactNameFromInit(arguments[0]);
213 contactName = ContactNamePtr(new ContactName());
216 LoggerE("Argument type mismatch : " << _rethrown_exception.GetMessage());
217 *exception = JSWebAPIErrorFactory::makeErrorObject(context, JSWebAPIErrorFactory::UNKNOWN_ERROR, "Internal error");
221 JSObjectRef jsobject;
224 jsobject = createJSObject(gContext, contactName);
226 LoggerE("Argument type mismatch : " << _rethrown_exception.GetMessage());
227 *exception = JSWebAPIErrorFactory::makeErrorObject(context, JSWebAPIErrorFactory::UNKNOWN_ERROR, "Internal error");
234 bool JSContactName::hasInstance(JSContextRef context,
235 JSObjectRef constructor,
236 JSValueRef possibleInstance,
237 JSValueRef* exception)
239 return JSValueIsObjectOfClass(context, possibleInstance, getClassRef());
242 JSValueRef JSContactName::getPrefix(JSContextRef context,
244 JSStringRef propertyName,
245 JSValueRef* exception)
249 ContactConverterFactory::ConverterType converter =
250 ContactConverterFactory::getConverter(context);
251 ContactNamePtr contactName = getPrivData(object);
252 if(!contactName->getPrefixIsSet())
253 return JSValueMakeNull(context);
255 return converter->toJSValueRef(contactName->getPrefix());
257 Catch(WrtDeviceApis::Commons::Exception)
259 LoggerW("trying to get incorrect value");
262 return JSValueMakeUndefined(context);
265 bool JSContactName::setPrefix(JSContextRef context,
267 JSStringRef propertyName,
269 JSValueRef* exception)
273 ContactNamePtr contactName = getPrivData(object);
274 ContactConverterFactory::ConverterType converter =
275 ContactConverterFactory::getConverter(context);
276 BasicValidator validator =
277 BasicValidatorFactory::getValidator(context, exception);
278 if(validator->isNullOrUndefined(value))
279 contactName->unsetPrefix();
281 contactName->setPrefix(converter->toString(value));
283 Catch(WrtDeviceApis::Commons::Exception)
285 LoggerW("trying to set incorrect value");
286 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
291 JSValueRef JSContactName::getSuffix(JSContextRef context,
293 JSStringRef propertyName,
294 JSValueRef* exception)
298 ContactConverterFactory::ConverterType converter =
299 ContactConverterFactory::getConverter(context);
300 ContactNamePtr contactName = getPrivData(object);
301 if(!contactName->getSuffixIsSet())
302 return JSValueMakeNull(context);
304 return converter->toJSValueRef(contactName->getSuffix());
306 Catch(WrtDeviceApis::Commons::Exception)
308 LoggerW("trying to get incorrect value");
311 return JSValueMakeUndefined(context);
314 bool JSContactName::setSuffix(JSContextRef context,
316 JSStringRef propertyName,
318 JSValueRef* exception)
322 ContactNamePtr contactName = getPrivData(object);
323 ContactConverterFactory::ConverterType converter =
324 ContactConverterFactory::getConverter(context);
325 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
326 if(validator->isNullOrUndefined(value))
327 contactName->unsetSuffix();
329 contactName->setSuffix(converter->toString(value));
331 Catch(WrtDeviceApis::Commons::Exception)
333 LoggerW("trying to set incorrect value");
334 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
339 JSValueRef JSContactName::getFirstName(JSContextRef context,
341 JSStringRef propertyName,
342 JSValueRef* exception)
346 ContactConverterFactory::ConverterType converter =
347 ContactConverterFactory::getConverter(context);
348 ContactNamePtr contactName = getPrivData(object);
349 if(!contactName->getFirstNameIsSet())
350 return JSValueMakeNull(context);
352 return converter->toJSValueRef(contactName->getFirstName());
354 Catch(WrtDeviceApis::Commons::Exception)
356 LoggerW("trying to get incorrect value");
359 return JSValueMakeUndefined(context);
362 bool JSContactName::setFirstName(JSContextRef context,
364 JSStringRef propertyName,
366 JSValueRef* exception)
370 ContactNamePtr contactName = getPrivData(object);
371 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(context);
372 BasicValidator validator = BasicValidatorFactory::getValidator(context, exception);
373 if(validator->isNullOrUndefined(value))
374 contactName->unsetFirstName();
376 contactName->setFirstName(converter->toString(value));
378 Catch(WrtDeviceApis::Commons::Exception)
380 LoggerW("trying to set incorrect value");
381 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
387 JSValueRef JSContactName::getMiddleName(JSContextRef context,
389 JSStringRef propertyName,
390 JSValueRef* exception)
394 ContactConverterFactory::ConverterType converter =
395 ContactConverterFactory::getConverter(context);
396 ContactNamePtr contactName = getPrivData(object);
397 if(!contactName->getMiddleNameIsSet())
398 return JSValueMakeNull(context);
400 return converter->toJSValueRef(contactName->getMiddleName());
402 Catch(WrtDeviceApis::Commons::Exception)
404 LoggerW("trying to get incorrect value");
407 return JSValueMakeUndefined(context);
410 bool JSContactName::setMiddleName(JSContextRef context,
412 JSStringRef propertyName,
414 JSValueRef* exception)
418 ContactNamePtr contactName = getPrivData(object);
419 ContactConverterFactory::ConverterType converter =
420 ContactConverterFactory::getConverter(context);
421 BasicValidator validator =
422 BasicValidatorFactory::getValidator(context, exception);
423 if(validator->isNullOrUndefined(value))
424 contactName->unsetMiddleName();
426 contactName->setMiddleName(converter->toString(value));
428 Catch(WrtDeviceApis::Commons::Exception)
430 LoggerW("trying to set incorrect value");
431 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
437 JSValueRef JSContactName::getLastName(JSContextRef context,
439 JSStringRef propertyName,
440 JSValueRef* exception)
444 ContactConverterFactory::ConverterType converter =
445 ContactConverterFactory::getConverter(context);
446 ContactNamePtr contactName = getPrivData(object);
447 if(!contactName->getLastNameIsSet())
448 return JSValueMakeNull(context);
450 return converter->toJSValueRef(contactName->getLastName());
452 Catch(WrtDeviceApis::Commons::Exception)
454 LoggerW("trying to get incorrect value");
457 return JSValueMakeUndefined(context);
460 bool JSContactName::setLastName(JSContextRef context,
462 JSStringRef propertyName,
464 JSValueRef* exception)
468 ContactNamePtr contactName = getPrivData(object);
469 ContactConverterFactory::ConverterType converter =
470 ContactConverterFactory::getConverter(context);
471 BasicValidator validator =
472 BasicValidatorFactory::getValidator(context, exception);
473 if(validator->isNullOrUndefined(value))
474 contactName->unsetLastName();
476 contactName->setLastName(converter->toString(value));
478 Catch(WrtDeviceApis::Commons::Exception)
480 LoggerW("trying to set incorrect value");
481 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
487 JSValueRef JSContactName::getNicknames(JSContextRef context,
489 JSStringRef propertyName,
490 JSValueRef* exception)
494 JSContactNamePriv *priv = static_cast<JSContactNamePriv*>(JSObjectGetPrivate(object));
496 ThrowMsg(WrtDeviceApis::Commons::NullPointerException, "Private object is null");
498 JSContextRef gContext = priv->getContext();
500 ContactConverterFactory::ConverterType converter = ContactConverterFactory::getConverter(gContext);
501 ContactNamePtr contactName = getPrivData(object);
503 if(contactName->IsTypesSetJSArray()){
504 return contactName->getTypesJSObj();
506 JSValueRef tempJSValue = contactName->getTypesJSArray();
507 tempJSValue = converter->toJSValueRef(contactName->getNicknames());
509 JSObjectRef convertedJSObject = contactName->getTypesJSObj();
510 convertedJSObject = JSValueToObject( gContext, tempJSValue, NULL );
511 contactName->setTypesJSArray(true, convertedJSObject);
513 JSValueProtect(gContext, convertedJSObject);
514 contactName->setContext(gContext);
518 Catch(WrtDeviceApis::Commons::Exception)
520 LoggerW("trying to get incorrect value");
523 return JSValueMakeUndefined(context);
526 bool JSContactName::setNicknames(JSContextRef context,
528 JSStringRef propertyName,
530 JSValueRef* exception)
534 ContactNamePtr contactName = getPrivData(object);
535 ContactConverterFactory::ConverterType converter =
536 ContactConverterFactory::getConverter(context);
537 contactName->setNicknames(converter->toStringArray(value));
538 contactName->resetTypesJSObj();
540 Catch(WrtDeviceApis::Commons::Exception)
542 LoggerW("trying to set incorrect value");
543 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
549 JSValueRef JSContactName::getPhoneticName(JSContextRef context,
551 JSStringRef propertyName,
552 JSValueRef* exception)
554 // NOTE: Deprecated field.
555 return JSValueMakeNull(context);
558 bool JSContactName::setPhoneticName(JSContextRef context,
560 JSStringRef propertyName,
562 JSValueRef* exception)
564 // NOTE: Deprecated field.
568 JSValueRef JSContactName::getPhoneticFirstName(JSContextRef context,
570 JSStringRef propertyName,
571 JSValueRef* exception)
575 ContactConverterFactory::ConverterType converter =
576 ContactConverterFactory::getConverter(context);
577 ContactNamePtr contactName = getPrivData(object);
578 if(!contactName->getPhoneticFirstNameIsSet())
579 return JSValueMakeNull(context);
581 return converter->toJSValueRef(contactName->getPhoneticFirstName());
583 Catch(WrtDeviceApis::Commons::Exception)
585 LoggerW("trying to get incorrect value");
588 return JSValueMakeUndefined(context);
591 bool JSContactName::setPhoneticFirstName(JSContextRef context,
593 JSStringRef propertyName,
595 JSValueRef* exception)
599 ContactNamePtr contactName = getPrivData(object);
600 ContactConverterFactory::ConverterType converter =
601 ContactConverterFactory::getConverter(context);
602 BasicValidator validator =
603 BasicValidatorFactory::getValidator(context, exception);
604 if(validator->isNullOrUndefined(value))
605 contactName->unsetPhoneticFirstName();
607 contactName->setPhoneticFirstName(converter->toString(value));
609 Catch(WrtDeviceApis::Commons::Exception)
611 LoggerW("trying to set incorrect value");
612 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
618 JSValueRef JSContactName::getPhoneticLastName(JSContextRef context,
620 JSStringRef propertyName,
621 JSValueRef* exception)
625 ContactConverterFactory::ConverterType converter =
626 ContactConverterFactory::getConverter(context);
627 ContactNamePtr contactName = getPrivData(object);
628 if(!contactName->getPhoneticLastNameIsSet())
629 return JSValueMakeNull(context);
631 return converter->toJSValueRef(contactName->getPhoneticLastName());
633 Catch(WrtDeviceApis::Commons::Exception)
635 LoggerW("trying to get incorrect value");
638 return JSValueMakeUndefined(context);
641 bool JSContactName::setPhoneticLastName(JSContextRef context,
643 JSStringRef propertyName,
645 JSValueRef* exception)
649 ContactNamePtr contactName = getPrivData(object);
650 ContactConverterFactory::ConverterType converter =
651 ContactConverterFactory::getConverter(context);
652 BasicValidator validator =
653 BasicValidatorFactory::getValidator(context, exception);
654 if(validator->isNullOrUndefined(value))
655 contactName->unsetPhoneticLastName();
657 contactName->setPhoneticLastName(converter->toString(value));
659 Catch(WrtDeviceApis::Commons::Exception)
661 LoggerW("trying to set incorrect value");
662 JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mismatch");
668 JSValueRef JSContactName::getDisplayName(JSContextRef context,
670 JSStringRef propertyName,
671 JSValueRef* exception)
675 ContactConverterFactory::ConverterType converter =
676 ContactConverterFactory::getConverter(context);
677 ContactNamePtr contactName = getPrivData(object);
678 if(!contactName->getDisplayNameIsSet())
679 return JSValueMakeNull(context);
681 return converter->toJSValueRef(contactName->getDisplayName());
683 Catch(WrtDeviceApis::Commons::Exception)
685 LoggerW("trying to get incorrect value");
688 return JSValueMakeUndefined(context);