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 ContactConverter.cpp
19 * @author Kisub Song (kisubs.song@samsung.com)
25 #include <dpl/log/log.h>
26 #include <CommonsJavaScript/Validator.h>
27 #include <CommonsJavaScript/ScopedJSStringRef.h>
28 #include <CommonsJavaScript/JSUtils.h>
29 #include <Commons/RegexUtils.h>
30 #include <API/Contact/ContactFactory.h>
32 #include "ContactConverter.h"
33 #include "AddressBookController.h"
34 #include "JSAddressBook.h"
35 #include "JSAddressBookArray.h"
36 //#include "JSAttributesOfInterestArray.h"
37 #include "JSContact.h"
38 #include "JSContactRef.h"
39 #include "JSContactArray.h"
40 #include "JSContactName.h"
41 #include "JSContactAccount.h"
42 #include "JSContactAnniversary.h"
43 #include "JSContactAnniversaryArray.h"
44 #include "JSContactAddress.h"
45 #include "JSContactAddressArray.h"
46 #include "JSContactAddressTypeArray.h"
47 #include "JSContactManager.h"
48 #include "JSContactPhoneNumber.h"
49 #include "JSContactPhoneNumberArray.h"
50 #include "JSContactPhoneNumberTypeArray.h"
51 #include "JSContactEmailAddress.h"
52 #include "JSContactEmailAddressArray.h"
53 #include "JSContactEmailAddressTypeArray.h"
54 #include "JSContactOrganization.h"
55 #include "JSContactOrganizationArray.h"
56 #include "JSContactWebSite.h"
57 #include "JSContactWebSiteArray.h"
58 #include "JSStringArray.h"
60 #define CONTACT_ATTRIBUTE_ACCOUNT "account"
61 #define CONTACT_ATTRIBUTE_ACCOUNT_SERVICE_ID "accountServiceId"
62 #define CONTACT_ATTRIBUTE_ADDITIONAL_INFORMATION "additionalInformation"
63 #define CONTACT_ATTRIBUTE_ADDRESSES "addresses"
64 #define CONTACT_ATTRIBUTE_ANNIVERSARIES "anniversaries"
65 //#define CONTACT_ATTRIBUTE_ATTRIBUTES_OF_INTEREST "attributesOfInterest"
66 #define CONTACT_ATTRIBUTE_BIRTHDAY "birthday"
67 #define CONTACT_ATTRIBUTE_CATEGORIES "categories"
68 #define CONTACT_ATTRIBUTE_CITY "city"
69 #define CONTACT_ATTRIBUTE_CONTACT_ID "contactId"
70 #define CONTACT_ATTRIBUTE_CONTACT_URI "contactURI"
71 #define CONTACT_ATTRIBUTE_COUNTRY "country"
72 #define CONTACT_ATTRIBUTE_COUNTY "county"
73 #define CONTACT_ATTRIBUTE_DATE "date"
74 #define CONTACT_ATTRIBUTE_DEPARTMENT "department"
75 #define CONTACT_ATTRIBUTE_DISPLAY_NAME "displayName"
76 #define CONTACT_ATTRIBUTE_EMAIL "email"
77 #define CONTACT_ATTRIBUTE_EMAILS "emails"
78 #define CONTACT_ATTRIBUTE_FIRST_NAME "firstName"
79 #define CONTACT_ATTRIBUTE_ID "id"
80 #define CONTACT_ATTRIBUTE_IS_FAVORITE "isFavorite"
81 #define CONTACT_ATTRIBUTE_LABEL "label"
82 #define CONTACT_ATTRIBUTE_LAST_NAME "lastName"
83 #define CONTACT_ATTRIBUTE_LAST_UPDATED "lastUpdated"
84 #define CONTACT_ATTRIBUTE_LOGO_URI "logoURI"
85 #define CONTACT_ATTRIBUTE_MIDDLE_NAME "middleName"
86 #define CONTACT_ATTRIBUTE_NAME "name"
87 #define CONTACT_ATTRIBUTE_NICKNAMES "nicknames"
88 #define CONTACT_ATTRIBUTE_NOTES "notes"
89 #define CONTACT_ATTRIBUTE_NUMBER "number"
90 #define CONTACT_ATTRIBUTE_OFFICE "office"
91 #define CONTACT_ATTRIBUTE_ORGANIZATION "organization"
92 #define CONTACT_ATTRIBUTE_PHONE_NUMBERS "phoneNumbers"
93 #define CONTACT_ATTRIBUTE_PHONETIC_NAME "phoneticName"
94 #define CONTACT_ATTRIBUTE_PHOTO_URI "photoURI"
95 #define CONTACT_ATTRIBUTE_POSITION "position"
96 #define CONTACT_ATTRIBUTE_POSTAL_CODE "postalCode"
97 #define CONTACT_ATTRIBUTE_PREFIX "prefix"
98 #define CONTACT_ATTRIBUTE_READ_ONLY "readOnly"
99 #define CONTACT_ATTRIBUTE_REGION "region"
100 #define CONTACT_ATTRIBUTE_RINGTONE_URI "ringtoneURI"
101 #define CONTACT_ATTRIBUTE_ROLE "role"
102 #define CONTACT_ATTRIBUTE_STREET_ADDRESS "streetAddress"
103 #define CONTACT_ATTRIBUTE_TITLE "title"
104 #define CONTACT_ATTRIBUTE_TYPE "type"
105 #define CONTACT_ATTRIBUTE_TYPES "types"
106 #define CONTACT_ATTRIBUTE_URL "url"
107 #define CONTACT_ATTRIBUTE_URLS "urls"
109 #define STR_CONTACT_EMAIL_TYPE_WORK "WORK"
110 #define STR_CONTACT_EMAIL_TYPE_PREF "PREF"
111 #define STR_CONTACT_EMAIL_TYPE_HOME "HOME"
113 #define STR_CONTACT_PHONE_NUMBER_TYPE_WORK "WORK"
114 #define STR_CONTACT_PHONE_NUMBER_TYPE_PREF "PREF"
115 #define STR_CONTACT_PHONE_NUMBER_TYPE_HOME "HOME"
116 #define STR_CONTACT_PHONE_NUMBER_TYPE_VOICE "VOICE"
117 #define STR_CONTACT_PHONE_NUMBER_TYPE_FAX "FAX"
118 #define STR_CONTACT_PHONE_NUMBER_TYPE_MSG "MSG"
119 #define STR_CONTACT_PHONE_NUMBER_TYPE_CELL "CELL"
120 #define STR_CONTACT_PHONE_NUMBER_TYPE_PAGER "PAGER"
121 #define STR_CONTACT_PHONE_NUMBER_TYPE_BBS "BBS"
122 #define STR_CONTACT_PHONE_NUMBER_TYPE_MODEM "MODEM"
123 #define STR_CONTACT_PHONE_NUMBER_TYPE_CAR "CAR"
124 #define STR_CONTACT_PHONE_NUMBER_TYPE_ISDN "ISDN"
125 #define STR_CONTACT_PHONE_NUMBER_TYPE_VIDEO "VIDEO"
126 #define STR_CONTACT_PHONE_NUMBER_TYPE_PCS "PCS"
128 #define STR_CONTACT_ADDRESS_TYPE_WORK "WORK"
129 #define STR_CONTACT_ADDRESS_TYPE_PREF "PREF"
130 #define STR_CONTACT_ADDRESS_TYPE_HOME "HOME"
132 #define STR_WEBSITE_TYPE_HOMEPAGE "HOMEPAGE"
133 #define STR_WEBSITE_TYPE_BLOG "BLOG"
135 namespace TizenApis {
139 using namespace TizenApis::Api::Contact;
140 using namespace WrtDeviceApis::Commons;
141 using namespace WrtDeviceApis::CommonsJavaScript;
143 std::vector<std::string> ContactConverter::m_allowedContactInit;
144 std::vector<std::string> ContactConverter::m_allowedContactNameInit;
145 std::vector<std::string> ContactConverter::m_allowedContactOrganizationInit;
146 std::vector<std::string> ContactConverter::m_allowedContactAddressInit;
148 ContactConverter::ContactConverter(JSContextRef context) : Converter(context)
150 static bool init = initializeAllowedProperties();
154 ContactConverter::~ContactConverter()
158 JSValueRef ContactConverter::toJSValueRef(const AddressBookPtr &arg)
161 AddressBookController *priv = new AddressBookController(m_context, arg);
162 return JSObjectMake(m_context, JSAddressBook::getClassRef(), priv);
165 AddressBookPtr ContactConverter::toAddressBook(const JSValueRef &jsValue)
167 if(!JSAddressBook::isObjectOfClass(m_context, jsValue))
168 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
170 return JSAddressBook::getAddressBook(m_context, jsValue);
173 JSValueRef ContactConverter::toJSValueRef(const AddressBookArrayPtr &arg)
175 // TODO Check it is right? not a platform object right?
176 int size = arg->size();
178 JSObjectRef resultObject = JSCreateArrayObject(m_context, 0, NULL);
180 ThrowMsg(ConversionException, "Can not create array object.");
182 for(int i = 0; i < size; i++)
184 JSValueRef jsvalue = toJSValueRef(arg->at(i));
185 if (!JSSetArrayElement(m_context, resultObject, i, jsvalue))
186 ThrowMsg(ConversionException, "Can not fill address book array.");
189 return static_cast<JSValueRef>(resultObject);
192 AddressBookArrayPtr ContactConverter::toAddressBookArray(const JSValueRef &jsValue)
194 if(JSAddressBookArray::isObjectOfClass(m_context, jsValue))
195 return JSAddressBookArray::getAddressBookArray(m_context, jsValue);
197 if(!JSIsArrayValue(m_context, jsValue))
198 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "AddressBookArray is not array.");
200 AddressBookArrayPtr result(new AddressBookArray());
202 JSObjectRef jsObject = toJSObjectRef(jsValue);
203 for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
204 JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
205 result->push_back(toAddressBook(element));
210 JSValueRef ContactConverter::toJSValueRef(const ContactPtr &arg)
212 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContact::getClassRef(), arg);
215 ContactPtr ContactConverter::toContact(const JSValueRef &jsValue)
217 if(!JSContact::isObjectOfClass(m_context, jsValue))
219 LogError("Not a Contact object");
220 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
223 return JSContact::getContact(m_context, jsValue);
226 ContactPtr ContactConverter::toContactFromInit(const JSValueRef &jsValue)
228 // from ContactInit to Contact
229 Validator validator(m_context);
230 if (validator.isNullOrUndefined(jsValue)) {
231 LogError("ContactInit object is null");
232 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
235 if (!JSValueIsObject(m_context, jsValue) || JSIsArrayValue(m_context, jsValue)) {
236 LogError("ContactInit object is not object");
237 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
240 // if (!validator.checkArrayKeys(m_allowedContactInit, jsValue)) {
241 // LogError("invalid properties in ContactInit object");
242 // ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
245 const ScopedJSStringRef nameStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_NAME));
246 const ScopedJSStringRef accountStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_ACCOUNT));
247 const ScopedJSStringRef addressesStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_ADDRESSES));
248 const ScopedJSStringRef photoURIStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_PHOTO_URI));
249 const ScopedJSStringRef phoneNumbersStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_PHONE_NUMBERS));
250 const ScopedJSStringRef emailsStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_EMAILS));
251 const ScopedJSStringRef birthdayStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_BIRTHDAY));
252 const ScopedJSStringRef anniversariesStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_ANNIVERSARIES));
253 const ScopedJSStringRef organizationStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_ORGANIZATION));
254 const ScopedJSStringRef notesStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_NOTES));
255 const ScopedJSStringRef urlsStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_URLS));
256 const ScopedJSStringRef isFavoriteStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_IS_FAVORITE));
257 const ScopedJSStringRef ringtoneURIStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_RINGTONE_URI));
258 const ScopedJSStringRef categoriesStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_CATEGORIES));
260 JSObjectRef jsObject = toJSObjectRef(jsValue);
262 JSValueRef nameData = JSObjectGetProperty(m_context, jsObject, nameStr.get(), NULL);
263 JSValueRef accountData = JSObjectGetProperty(m_context, jsObject, accountStr.get(), NULL);
264 JSValueRef addressesData = JSObjectGetProperty(m_context, jsObject, addressesStr.get(), NULL);
265 JSValueRef photoURIData = JSObjectGetProperty(m_context, jsObject, photoURIStr.get(), NULL);
266 JSValueRef phoneNumbersData = JSObjectGetProperty(m_context, jsObject, phoneNumbersStr.get(), NULL);
267 JSValueRef emailsData = JSObjectGetProperty(m_context, jsObject, emailsStr.get(), NULL);
268 JSValueRef birthdayData = JSObjectGetProperty(m_context, jsObject, birthdayStr.get(), NULL);
269 JSValueRef anniversariesData = JSObjectGetProperty(m_context, jsObject, anniversariesStr.get(), NULL);
270 JSValueRef organizationData = JSObjectGetProperty(m_context, jsObject, organizationStr.get(), NULL);
271 JSValueRef notesData = JSObjectGetProperty(m_context, jsObject, notesStr.get(), NULL);
272 JSValueRef urlsData = JSObjectGetProperty(m_context, jsObject, urlsStr.get(), NULL);
273 JSValueRef isFavoriteData = JSObjectGetProperty(m_context, jsObject, isFavoriteStr.get(), NULL);
274 JSValueRef ringtoneURIData = JSObjectGetProperty(m_context, jsObject, ringtoneURIStr.get(), NULL);
275 JSValueRef categoriesData = JSObjectGetProperty(m_context, jsObject, categoriesStr.get(), NULL);
278 ContactAccountPtr account;
279 ContactAddressArrayPtr addresses;
280 std::string photoURI;
281 ContactPhoneNumberArrayPtr phoneNumbers;
282 ContactEmailAddressArrayPtr emails;
284 ContactAnniversaryArrayPtr anniversaries;
285 ContactOrganizationPtr organization;
286 StringArrayPtr notes;
287 ContactWebSiteArrayPtr urls;
289 std::string ringtoneURI;
290 StringArrayPtr categories;
292 ContactPtr result = ContactFactory::getInstance().createContact();
294 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Cannot create Contact object");
297 if (!validator.isNullOrUndefined(nameData)) {
298 name = toContactName(nameData);
299 result->setName(name);
302 if (!validator.isNullOrUndefined(accountData)) {
303 account = toContactAccount(accountData);
304 result->setAccount(account);
307 if (!validator.isNullOrUndefined(addressesData)) {
308 addresses = toContactAddressArray(addressesData);
309 result->setAddresses(addresses);
312 if (!validator.isNullOrUndefined(photoURIData)) {
313 if(!JSValueIsString(m_context, photoURIData))
314 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "photoURI is not string");
315 photoURI = toString(photoURIData);
316 result->setPhotoURI(photoURI);
319 if (!validator.isNullOrUndefined(phoneNumbersData)) {
320 phoneNumbers = toContactPhoneNumberArray(phoneNumbersData);
321 result->setPhoneNumbers(phoneNumbers);
324 if (!validator.isNullOrUndefined(emailsData)) {
325 emails = toContactEmailAddressArray(emailsData);
326 result->setEmails(emails);
329 if (!validator.isNullOrUndefined(birthdayData)) {
330 if(!validator.isDate(birthdayData))
331 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "birthday is not Date");
332 birthday = toDateTm(birthdayData);
333 result->setBirthday(birthday);
336 if (!validator.isNullOrUndefined(anniversariesData)) {
337 anniversaries = toContactAnniversaryArray(anniversariesData);
338 result->setAnniversaries(anniversaries);
341 if (!validator.isNullOrUndefined(organizationData)) {
342 organization = toContactOrganization(organizationData);
343 result->setOrganization(organization);
346 if (!validator.isNullOrUndefined(notesData)) {
347 notes = toStringArray(notesData);
348 result->setNotes(notes);
351 if (!validator.isNullOrUndefined(urlsData)) {
352 urls = toContactWebSiteArray(urlsData);
353 result->setUrls(urls);
356 if (!validator.isNullOrUndefined(isFavoriteData)) {
357 if(!JSValueIsBoolean(m_context, isFavoriteData))
358 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "isFavorite is not boolean");
359 isFavorite = toBool(isFavoriteData);
360 result->setIsFavorite(isFavorite);
363 if (!validator.isNullOrUndefined(ringtoneURIData)) {
364 if(!JSValueIsString(m_context, ringtoneURIData))
365 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "ringtoneURI is not string");
366 ringtoneURI = toString(ringtoneURIData);
367 result->setRingtoneURI(ringtoneURI);
370 if (!validator.isNullOrUndefined(categoriesData)) {
371 categories = toStringArray(categoriesData);
372 result->setCategories(categories);
378 JSValueRef ContactConverter::toJSValueRef(const ContactArrayPtr &arg)
380 // TODO Check it is right? not a platform object right?
381 int size = arg->size();
383 JSObjectRef resultObject = JSCreateArrayObject(m_context, 0, NULL);
385 ThrowMsg(ConversionException, "Can not create array object.");
387 for(int i = 0; i < size; i++)
389 JSValueRef jsvalue = toJSValueRef(arg->at(i));
390 if (!JSSetArrayElement(m_context, resultObject, i, jsvalue))
391 ThrowMsg(ConversionException, "Can not fill contact array.");
394 return static_cast<JSValueRef>(resultObject);
397 ContactArrayPtr ContactConverter::toContactArray(const JSValueRef &jsValue)
399 // // toJSValueRef(ContactArrayPtr) creates user object.
400 // if(JSContactArray::isObjectOfClass(m_context, jsValue))
401 // return JSContactArray::getContactArray(m_context, jsValue);
403 if(!JSIsArrayValue(m_context, jsValue))
404 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "ContactArray is not array.");
406 ContactArrayPtr result = ContactArrayPtr(new ContactArray());
408 JSObjectRef jsObject = toJSObjectRef(jsValue);
409 for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
410 JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
411 result->push_back(toContact(element));
416 JSValueRef ContactConverter::toJSValueRef(const ContactRefPtr &arg)
418 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactRef::getClassRef(), arg);
421 ContactRefPtr ContactConverter::toContactRef(const JSValueRef &jsValue)
423 if(!JSContactRef::isObjectOfClass(m_context, jsValue))
425 LogError("Not a ContactRef object");
426 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
429 return JSContactRef::getContactRef(m_context, jsValue);
432 JSValueRef ContactConverter::toJSValueRef(const ContactNamePtr &arg)
434 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactName::getClassRef(), arg);
437 ContactNamePtr ContactConverter::toContactName(const JSValueRef &jsValue)
439 if(!JSContactName::isObjectOfClass(m_context, jsValue))
441 LogError("Not a ContactName object");
442 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
445 return JSContactName::getContactName(m_context, jsValue);
448 ContactNamePtr ContactConverter::toContactNameFromInit(const JSValueRef &jsValue)
450 // from ContactNameInit to ContactName
451 Validator validator(m_context);
452 if (validator.isNullOrUndefined(jsValue)) {
453 LogError("ContactNameInit object is null");
454 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
457 if (!JSValueIsObject(m_context, jsValue) || JSIsArrayValue(m_context, jsValue)) {
458 LogError("ContactNameInit object is not object");
459 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
462 // if (!validator.checkArrayKeys(m_allowedContactNameInit, jsValue)) {
463 // LogError("invalid properties in ContactNameInit object");
464 // ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
467 const ScopedJSStringRef prefixStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_PREFIX));
468 const ScopedJSStringRef firstNameStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_FIRST_NAME));
469 const ScopedJSStringRef middleNameStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_MIDDLE_NAME));
470 const ScopedJSStringRef lastNameStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_LAST_NAME));
471 const ScopedJSStringRef nicknamesStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_NICKNAMES));
472 const ScopedJSStringRef phoneticNameStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_PHONETIC_NAME));
473 const ScopedJSStringRef displayNameStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_DISPLAY_NAME));
475 JSObjectRef jsObject = toJSObjectRef(jsValue);
477 JSValueRef prefixData = JSObjectGetProperty(m_context, jsObject, prefixStr.get(), NULL);
478 JSValueRef firstNameData = JSObjectGetProperty(m_context, jsObject, firstNameStr.get(), NULL);
479 JSValueRef middleNameData = JSObjectGetProperty(m_context, jsObject, middleNameStr.get(), NULL);
480 JSValueRef lastNameData = JSObjectGetProperty(m_context, jsObject, lastNameStr.get(), NULL);
481 JSValueRef nicknamesData = JSObjectGetProperty(m_context, jsObject, nicknamesStr.get(), NULL);
482 JSValueRef phoneticNameData = JSObjectGetProperty(m_context, jsObject, phoneticNameStr.get(), NULL);
483 JSValueRef displayNameData = JSObjectGetProperty(m_context, jsObject, displayNameStr.get(), NULL);
486 std::string firstName;
487 std::string middleName;
488 std::string lastName;
489 StringArrayPtr nicknames;
490 std::string phoneticName;
491 std::string displayName;
493 ContactNamePtr result = ContactNamePtr(new ContactName());
495 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Cannot create ContactName object");
498 if (!validator.isNullOrUndefined(prefixData)) {
499 if(!JSValueIsString(m_context, prefixData))
500 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "prefix is not string");
501 prefix = toString(prefixData);
502 result->setPrefix(prefix);
505 if (!validator.isNullOrUndefined(firstNameData)) {
506 if(!JSValueIsString(m_context, firstNameData))
507 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "firstName is not string");
508 firstName = toString(firstNameData);
509 result->setFirstName(firstName);
512 if (!validator.isNullOrUndefined(middleNameData)) {
513 if(!JSValueIsString(m_context, middleNameData))
514 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "middleName is not string");
515 middleName = toString(middleNameData);
516 result->setMiddleName(middleName);
519 if (!validator.isNullOrUndefined(lastNameData)) {
520 if(!JSValueIsString(m_context, lastNameData))
521 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "lastName is not string");
522 lastName = toString(lastNameData);
523 result->setLastName(lastName);
526 if (!validator.isNullOrUndefined(nicknamesData)) {
527 nicknames = toStringArray(nicknamesData);
528 result->setNicknames(nicknames);
531 if (!validator.isNullOrUndefined(phoneticNameData)) {
532 if(!JSValueIsString(m_context, phoneticNameData))
533 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "phoneticName is not string");
534 phoneticName = toString(phoneticNameData);
535 result->setPhoneticName(phoneticName);
538 if (!validator.isNullOrUndefined(displayNameData)) {
539 if(!JSValueIsString(m_context, displayNameData))
540 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "displayName is not string");
541 displayName = toString(displayNameData);
542 result->setDisplayName(displayName);
548 JSValueRef ContactConverter::toJSValueRef(const ContactOrganizationPtr &arg)
550 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactOrganization::getClassRef(), arg);
553 ContactOrganizationPtr ContactConverter::toContactOrganization(const JSValueRef &jsValue)
555 if(!JSContactOrganization::isObjectOfClass(m_context, jsValue))
557 LogError("Not a ContactOrganization object");
558 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
561 return JSContactOrganization::getContactOrganization(m_context, jsValue);
564 ContactOrganizationPtr ContactConverter::toContactOrganizationFromInit(const JSValueRef &jsValue)
566 // from ContactOrganizationInit to ContactOrganization
567 Validator validator(m_context);
568 if (validator.isNullOrUndefined(jsValue)) {
569 LogError("ContactOrganizationInit object is null");
570 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
573 if (!JSValueIsObject(m_context, jsValue) || JSIsArrayValue(m_context, jsValue)) {
574 LogError("ContactOrganizationInit object is not object");
575 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
578 // if (!validator.checkArrayKeys(m_allowedContactOrganizationInit, jsValue)) {
579 // LogError("invalid properties in ContactOrganizationInit object");
580 // ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
583 // NOTE: Currently not support office and logoURI fields
584 const ScopedJSStringRef nameStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_NAME));
585 const ScopedJSStringRef departmentStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_DEPARTMENT));
586 const ScopedJSStringRef titleStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_TITLE));
587 const ScopedJSStringRef roleStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_ROLE));
589 JSObjectRef jsObject = toJSObjectRef(jsValue);
591 JSValueRef nameData = JSObjectGetProperty(m_context, jsObject, nameStr.get(), NULL);
592 JSValueRef departmentData = JSObjectGetProperty(m_context, jsObject, departmentStr.get(), NULL);
593 JSValueRef titleData = JSObjectGetProperty(m_context, jsObject, titleStr.get(), NULL);
594 JSValueRef roleData = JSObjectGetProperty(m_context, jsObject, roleStr.get(), NULL);
597 std::string department;
601 ContactOrganizationPtr result(new ContactOrganization());
603 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Cannot create ContactOrganization object");
606 if (!validator.isNullOrUndefined(nameData)) {
607 if(!JSValueIsString(m_context, nameData))
608 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "name is not string");
609 name = toString(nameData);
610 result->setName(name);
613 if (!validator.isNullOrUndefined(departmentData)) {
614 if(!JSValueIsString(m_context, departmentData))
615 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "department is not string");
616 department = toString(departmentData);
617 result->setDepartment(department);
620 if (!validator.isNullOrUndefined(titleData)) {
621 if(!JSValueIsString(m_context, titleData))
622 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "title is not string");
623 title = toString(titleData);
624 result->setTitle(title);
627 if (!validator.isNullOrUndefined(roleData)) {
628 if(!JSValueIsString(m_context, roleData))
629 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "role is not string");
630 role = toString(roleData);
631 result->setRole(role);
637 JSValueRef ContactConverter::toJSValueRef(const ContactOrganizationArrayPtr &arg)
639 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactOrganizationArray::getClassRef(), arg);
642 ContactOrganizationArrayPtr ContactConverter::toContactOrganizationArray(const JSValueRef &jsValue)
644 if(JSContactOrganizationArray::isObjectOfClass(m_context, jsValue))
645 return JSContactOrganizationArray::getContactOrganizationArray(m_context, jsValue);
647 ContactOrganizationArrayPtr result(new ContactOrganizationArray());
649 if(!JSIsArrayValue(m_context, jsValue))
650 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "ContactOrganizationArray is not array.");
652 JSObjectRef jsObject = toJSObjectRef(jsValue);
653 for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
654 JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
655 result->push_back(toContactOrganization(element));
660 JSValueRef ContactConverter::toJSValueRef(const ContactWebSitePtr &arg)
662 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactWebSite::getClassRef(), arg);
665 ContactWebSitePtr ContactConverter::toContactWebSite(const JSValueRef &jsValue)
667 if(!JSContactWebSite::isObjectOfClass(m_context, jsValue))
669 LogError("Not a ContactWebSite object");
670 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
673 return JSContactWebSite::getContactWebSite(m_context, jsValue);
676 JSValueRef ContactConverter::toJSValueRef(const ContactWebSiteArrayPtr &arg)
678 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactWebSiteArray::getClassRef(), arg);
681 ContactWebSiteArrayPtr ContactConverter::toContactWebSiteArray(const JSValueRef &jsValue)
683 if(JSContactWebSiteArray::isObjectOfClass(m_context, jsValue))
684 return JSContactWebSiteArray::getContactWebSiteArray(m_context, jsValue);
686 if(!JSIsArrayValue(m_context, jsValue))
687 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "ContactWebSiteArray is not array.");
689 ContactWebSiteArrayPtr result(new ContactWebSiteArray());
691 JSObjectRef jsObject = toJSObjectRef(jsValue);
692 for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
693 JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
694 result->push_back(toContactWebSite(element));
699 JSValueRef ContactConverter::toJSValueRef(const ContactAnniversaryPtr &arg)
701 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactAnniversary::getClassRef(), arg);
704 ContactAnniversaryPtr ContactConverter::toContactAnniversary(const JSValueRef &jsValue)
706 if(!JSContactAnniversary::isObjectOfClass(m_context, jsValue))
708 LogError("Not a ContactAnniversary object");
709 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
712 return JSContactAnniversary::getContactAnniversary(m_context, jsValue);
715 JSValueRef ContactConverter::toJSValueRef(const ContactAnniversaryArrayPtr &arg)
717 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactAnniversaryArray::getClassRef(), arg);
720 ContactAnniversaryArrayPtr ContactConverter::toContactAnniversaryArray(const JSValueRef &jsValue)
722 if(JSContactAnniversaryArray::isObjectOfClass(m_context, jsValue))
723 return JSContactAnniversaryArray::getContactAnniversaryArray(m_context, jsValue);
725 if(!JSIsArrayValue(m_context, jsValue))
726 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "ContactAnniversaryArray is not array.");
728 ContactAnniversaryArrayPtr result(new ContactAnniversaryArray());
730 JSObjectRef jsObject = toJSObjectRef(jsValue);
731 for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
732 JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
733 result->push_back(toContactAnniversary(element));
738 JSValueRef ContactConverter::toJSValueRef(const ContactAccountPtr &arg)
740 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactAccount::getClassRef(), arg);
743 ContactAccountPtr ContactConverter::toContactAccount(const JSValueRef &jsValue)
745 if(!JSContactAccount::isObjectOfClass(m_context, jsValue))
747 LogError("Not a ContactAccount object");
748 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
751 return JSContactAccount::getContactAccount(m_context, jsValue);
754 JSValueRef ContactConverter::toJSValueRef(const ContactAddressPtr &arg)
756 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactAddress::getClassRef(), arg);
759 ContactAddressPtr ContactConverter::toContactAddress(const JSValueRef &jsValue)
761 if(!JSContactAddress::isObjectOfClass(m_context, jsValue))
763 LogError("Not a ContactAddress object");
764 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
767 return JSContactAddress::getContactAddress(m_context, jsValue);
770 ContactAddressPtr ContactConverter::toContactAddressFromInit(const JSValueRef &jsValue)
772 // from ContactAddressInit to ContactAddress
773 Validator validator(m_context);
774 if (validator.isNullOrUndefined(jsValue)) {
775 LogError("ContactAddressInit object is null");
776 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
779 if (!JSValueIsObject(m_context, jsValue) || JSIsArrayValue(m_context, jsValue)) {
780 LogError("ContactAddressInit object is not object");
781 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
784 // if (!validator.checkArrayKeys(m_allowedContactAddressInit, jsValue)) {
785 // LogError("invalid properties in ContactAddressInit object");
786 // ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
789 const ScopedJSStringRef countryStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_COUNTRY));
790 const ScopedJSStringRef regionStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_REGION));
791 const ScopedJSStringRef cityStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_CITY));
792 const ScopedJSStringRef streetAddressStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_STREET_ADDRESS));
793 const ScopedJSStringRef additionalInformationStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_ADDITIONAL_INFORMATION));
794 const ScopedJSStringRef postalCodeStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_POSTAL_CODE));
795 const ScopedJSStringRef typesStr(JSStringCreateWithUTF8CString(CONTACT_ATTRIBUTE_TYPES));
797 JSObjectRef jsObject = toJSObjectRef(jsValue);
799 JSValueRef countryData = JSObjectGetProperty(m_context, jsObject, countryStr.get(), NULL);
800 JSValueRef regionData = JSObjectGetProperty(m_context, jsObject, regionStr.get(), NULL);
801 JSValueRef cityData = JSObjectGetProperty(m_context, jsObject, cityStr.get(), NULL);
802 JSValueRef streetAddressData = JSObjectGetProperty(m_context, jsObject, streetAddressStr.get(), NULL);
803 JSValueRef additionalInformationData = JSObjectGetProperty(m_context, jsObject, additionalInformationStr.get(), NULL);
804 JSValueRef postalCodeData = JSObjectGetProperty(m_context, jsObject, postalCodeStr.get(), NULL);
805 JSValueRef typesData = JSObjectGetProperty(m_context, jsObject, typesStr.get(), NULL);
810 std::string streetAddress;
811 std::string additionalInformation;
812 std::string postalCode;
813 ContactAddressTypeArrayPtr types;
815 ContactAddressPtr result(new ContactAddress());
817 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Cannot make ContactAddress");
820 if (!validator.isNullOrUndefined(countryData)) {
821 if(!JSValueIsString(m_context, countryData))
822 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "country is not string");
823 country = toString(countryData);
824 result->setCountry(country);
827 if (!validator.isNullOrUndefined(regionData)) {
828 if(!JSValueIsString(m_context, regionData))
829 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "region is not string");
830 region = toString(regionData);
831 result->setRegion(region);
834 if (!validator.isNullOrUndefined(cityData)) {
835 if(!JSValueIsString(m_context, cityData))
836 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "city is not string");
837 city = toString(cityData);
838 result->setCity(city);
841 if (!validator.isNullOrUndefined(streetAddressData)) {
842 if(!JSValueIsString(m_context, streetAddressData))
843 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "streetAddress is not string");
844 streetAddress = toString(streetAddressData);
845 result->setStreetAddress(streetAddress);
848 if (!validator.isNullOrUndefined(additionalInformationData)) {
849 if(!JSValueIsString(m_context, additionalInformationData))
850 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "additionalInformation is not string");
851 additionalInformation = toString(additionalInformationData);
852 result->setAdditionalInformation(additionalInformation);
855 if (!validator.isNullOrUndefined(postalCodeData)) {
856 if(!JSValueIsString(m_context, postalCodeData))
857 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "postalCode is not string");
858 postalCode = toString(postalCodeData);
859 result->setPostalCode(postalCode);
862 if (!validator.isNullOrUndefined(typesData)) {
863 types = toContactAddressTypeArray(typesData);
864 result->setTypes(types);
870 JSValueRef ContactConverter::toJSValueRef(const ContactAddressArrayPtr &arg)
872 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactAddressArray::getClassRef(), arg);
875 ContactAddressArrayPtr ContactConverter::toContactAddressArray(const JSValueRef &jsValue)
877 if(JSContactAddressArray::isObjectOfClass(m_context, jsValue))
878 return JSContactAddressArray::getContactAddressArray(m_context, jsValue);
880 if(!JSIsArrayValue(m_context, jsValue))
881 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "ContactAddressArray is not array.");
883 ContactAddressArrayPtr result(new ContactAddressArray());
885 JSObjectRef jsObject = toJSObjectRef(jsValue);
886 for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
887 JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
888 result->push_back(toContactAddress(element));
893 JSValueRef ContactConverter::toJSValueRef(const ContactPhoneNumberPtr &arg)
895 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactPhoneNumber::getClassRef(), arg);
898 ContactPhoneNumberPtr ContactConverter::toContactPhoneNumber(const JSValueRef &jsValue)
900 if(!JSContactPhoneNumber::isObjectOfClass(m_context, jsValue))
902 LogError("Not a ContactPhoneNumber object");
903 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
906 return JSContactPhoneNumber::getContactPhoneNumber(m_context, jsValue);
909 JSValueRef ContactConverter::toJSValueRef(const ContactPhoneNumberArrayPtr &arg)
911 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactPhoneNumberArray::getClassRef(), arg);
914 ContactPhoneNumberArrayPtr ContactConverter::toContactPhoneNumberArray(const JSValueRef &jsValue)
916 if(JSContactPhoneNumberArray::isObjectOfClass(m_context, jsValue))
917 return JSContactPhoneNumberArray::getContactPhoneNumberArray(m_context, jsValue);
919 if(!JSIsArrayValue(m_context, jsValue))
920 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "ContactPhoneNumberArray is not array.");
922 ContactPhoneNumberArrayPtr result(new ContactPhoneNumberArray());
924 JSObjectRef jsObject = toJSObjectRef(jsValue);
925 for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
926 JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
927 result->push_back(toContactPhoneNumber(element));
932 JSValueRef ContactConverter::toJSValueRef(const ContactEmailAddressPtr &arg)
934 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactEmailAddress::getClassRef(), arg);
937 ContactEmailAddressPtr ContactConverter::toContactEmailAddress(const JSValueRef &jsValue)
939 if(!JSContactEmailAddress::isObjectOfClass(m_context, jsValue))
941 LogError("Not a ContactEmailAddress object");
942 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Wrong attribute");
945 return JSContactEmailAddress::getContactEmailAddress(m_context, jsValue);
948 JSValueRef ContactConverter::toJSValueRef(const ContactEmailAddressArrayPtr &arg)
950 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactEmailAddressArray::getClassRef(), arg);
953 ContactEmailAddressArrayPtr ContactConverter::toContactEmailAddressArray(const JSValueRef &jsValue)
955 if(JSContactEmailAddressArray::isObjectOfClass(m_context, jsValue))
956 return JSContactEmailAddressArray::getContactEmailAddressArray(m_context, jsValue);
958 if(!JSIsArrayValue(m_context, jsValue))
959 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "ContactEmailAddressArray is not array.");
961 ContactEmailAddressArrayPtr result(new ContactEmailAddressArray());
963 JSObjectRef jsObject = toJSObjectRef(jsValue);
964 for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
965 JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
966 result->push_back(toContactEmailAddress(element));
971 ContactWebSiteType ContactConverter::toContactWebSiteType(const std::string &arg)
973 std::string argUpper;
974 std::transform(arg.begin(), arg.end(), std::back_inserter(argUpper), ::toupper);
976 if (argUpper == STR_WEBSITE_TYPE_HOMEPAGE) {
977 return WEBSITE_TYPE_HOMEPAGE;
978 } else if (argUpper == STR_WEBSITE_TYPE_BLOG) {
979 return WEBSITE_TYPE_BLOG;
981 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Invalid ContactWebSiteType : " << arg);
983 return WEBSITE_TYPE_HOMEPAGE;
986 std::string ContactConverter::toContactWebSiteTypeStr(ContactWebSiteType arg)
988 if (arg == WEBSITE_TYPE_HOMEPAGE) {
989 return STR_WEBSITE_TYPE_HOMEPAGE;
990 } else if (arg == WEBSITE_TYPE_BLOG) {
991 return STR_WEBSITE_TYPE_BLOG;
993 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Invalid ContactWebSiteType : " << arg);
995 return STR_WEBSITE_TYPE_HOMEPAGE;
998 ContactWebSiteType ContactConverter::toContactWebSiteType(const JSValueRef &value)
1000 if(!JSValueIsString(m_context, value))
1001 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "ContactWebSiteType is not string.");
1003 return toContactWebSiteType(toString(value));
1006 JSValueRef ContactConverter::toJSValueRef(ContactWebSiteType arg)
1008 return toJSValueRef(toContactWebSiteTypeStr(arg));
1011 ContactAddressType ContactConverter::toContactAddressType(const std::string &arg)
1013 std::string argUpper;
1014 std::transform(arg.begin(), arg.end(), std::back_inserter(argUpper), ::toupper);
1016 if (argUpper == STR_CONTACT_ADDRESS_TYPE_WORK) {
1017 return CONTACT_ADDRESS_TYPE_WORK;
1018 } else if (argUpper == STR_CONTACT_ADDRESS_TYPE_PREF) {
1019 return CONTACT_ADDRESS_TYPE_PREF;
1020 } else if (argUpper == STR_CONTACT_ADDRESS_TYPE_HOME) {
1021 return CONTACT_ADDRESS_TYPE_HOME;
1023 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Invalid ContactAddressType : " << arg);
1025 return CONTACT_ADDRESS_TYPE_PREF;
1027 std::string ContactConverter::toContactAddressTypeStr(ContactAddressType arg)
1029 if (arg == CONTACT_ADDRESS_TYPE_WORK) {
1030 return STR_CONTACT_ADDRESS_TYPE_WORK;
1031 } else if (arg == CONTACT_ADDRESS_TYPE_PREF) {
1032 return STR_CONTACT_ADDRESS_TYPE_PREF;
1033 } else if (arg == CONTACT_ADDRESS_TYPE_HOME) {
1034 return STR_CONTACT_ADDRESS_TYPE_HOME;
1036 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Invalid ContactAddressType : " << arg);
1038 return STR_CONTACT_ADDRESS_TYPE_PREF;
1041 ContactAddressType ContactConverter::toContactAddressType(const JSValueRef &value)
1043 if(!JSValueIsString(m_context, value))
1044 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "ContactAddressType is not string.");
1046 return toContactAddressType(toString(value));
1049 JSValueRef ContactConverter::toJSValueRef(ContactAddressType arg)
1051 return toJSValueRef(toContactAddressTypeStr(arg));
1054 JSValueRef ContactConverter::toJSValueRef(const ContactAddressTypeArrayPtr &arg)
1056 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactAddressTypeArray::getClassRef(), arg);
1059 ContactAddressTypeArrayPtr ContactConverter::toContactAddressTypeArray(const JSValueRef &jsValue)
1061 if(JSContactAddressTypeArray::isObjectOfClass(m_context, jsValue))
1062 return JSContactAddressTypeArray::getContactAddressTypeArray(m_context, jsValue);
1064 if(!JSIsArrayValue(m_context, jsValue))
1065 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "ContactAddressTypeArray is not array.");
1067 ContactAddressTypeArrayPtr result(new ContactAddressTypeArray());
1069 JSObjectRef jsObject = toJSObjectRef(jsValue);
1070 for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
1071 JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
1072 result->push_back(toContactAddressType(element));
1077 ContactPhoneNumberType ContactConverter::toContactPhoneNumberType(const std::string &arg)
1079 std::string argUpper;
1080 std::transform(arg.begin(), arg.end(), std::back_inserter(argUpper), ::toupper);
1082 if (argUpper == STR_CONTACT_PHONE_NUMBER_TYPE_WORK) {
1083 return CONTACT_PHONE_NUMBER_TYPE_WORK;
1084 } else if (argUpper == STR_CONTACT_PHONE_NUMBER_TYPE_PREF) {
1085 return CONTACT_PHONE_NUMBER_TYPE_PREF;
1086 } else if (argUpper == STR_CONTACT_PHONE_NUMBER_TYPE_HOME) {
1087 return CONTACT_PHONE_NUMBER_TYPE_HOME;
1088 } else if (argUpper == STR_CONTACT_PHONE_NUMBER_TYPE_VOICE) {
1089 return CONTACT_PHONE_NUMBER_TYPE_VOICE;
1090 } else if (argUpper == STR_CONTACT_PHONE_NUMBER_TYPE_FAX) {
1091 return CONTACT_PHONE_NUMBER_TYPE_FAX;
1092 } else if (argUpper == STR_CONTACT_PHONE_NUMBER_TYPE_MSG) {
1093 return CONTACT_PHONE_NUMBER_TYPE_MSG;
1094 } else if (argUpper == STR_CONTACT_PHONE_NUMBER_TYPE_CELL) {
1095 return CONTACT_PHONE_NUMBER_TYPE_CELL;
1096 } else if (argUpper == STR_CONTACT_PHONE_NUMBER_TYPE_PAGER) {
1097 return CONTACT_PHONE_NUMBER_TYPE_PAGER;
1098 } else if (argUpper == STR_CONTACT_PHONE_NUMBER_TYPE_BBS) {
1099 return CONTACT_PHONE_NUMBER_TYPE_BBS;
1100 } else if (argUpper == STR_CONTACT_PHONE_NUMBER_TYPE_MODEM) {
1101 return CONTACT_PHONE_NUMBER_TYPE_MODEM;
1102 } else if (argUpper == STR_CONTACT_PHONE_NUMBER_TYPE_CAR) {
1103 return CONTACT_PHONE_NUMBER_TYPE_CAR;
1104 } else if (argUpper == STR_CONTACT_PHONE_NUMBER_TYPE_ISDN) {
1105 return CONTACT_PHONE_NUMBER_TYPE_ISDN;
1106 } else if (argUpper == STR_CONTACT_PHONE_NUMBER_TYPE_VIDEO) {
1107 return CONTACT_PHONE_NUMBER_TYPE_VIDEO;
1108 } else if (argUpper == STR_CONTACT_PHONE_NUMBER_TYPE_PCS) {
1109 return CONTACT_PHONE_NUMBER_TYPE_PCS;
1111 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Invalid ContactPhoneNumverType : " << arg);
1113 return CONTACT_PHONE_NUMBER_TYPE_WORK;
1116 std::string ContactConverter::toContactPhoneNumberTypeStr(ContactPhoneNumberType arg)
1118 if (arg == CONTACT_PHONE_NUMBER_TYPE_WORK) {
1119 return STR_CONTACT_PHONE_NUMBER_TYPE_WORK;
1120 } else if (arg == CONTACT_PHONE_NUMBER_TYPE_PREF) {
1121 return STR_CONTACT_PHONE_NUMBER_TYPE_PREF;
1122 } else if (arg == CONTACT_PHONE_NUMBER_TYPE_HOME) {
1123 return STR_CONTACT_PHONE_NUMBER_TYPE_HOME;
1124 } else if (arg == CONTACT_PHONE_NUMBER_TYPE_VOICE) {
1125 return STR_CONTACT_PHONE_NUMBER_TYPE_VOICE;
1126 } else if (arg == CONTACT_PHONE_NUMBER_TYPE_FAX) {
1127 return STR_CONTACT_PHONE_NUMBER_TYPE_FAX;
1128 } else if (arg == CONTACT_PHONE_NUMBER_TYPE_MSG) {
1129 return STR_CONTACT_PHONE_NUMBER_TYPE_MSG;
1130 } else if (arg == CONTACT_PHONE_NUMBER_TYPE_CELL) {
1131 return STR_CONTACT_PHONE_NUMBER_TYPE_CELL;
1132 } else if (arg == CONTACT_PHONE_NUMBER_TYPE_PAGER) {
1133 return STR_CONTACT_PHONE_NUMBER_TYPE_PAGER;
1134 } else if (arg == CONTACT_PHONE_NUMBER_TYPE_BBS) {
1135 return STR_CONTACT_PHONE_NUMBER_TYPE_BBS;
1136 } else if (arg == CONTACT_PHONE_NUMBER_TYPE_MODEM) {
1137 return STR_CONTACT_PHONE_NUMBER_TYPE_MODEM;
1138 } else if (arg == CONTACT_PHONE_NUMBER_TYPE_CAR) {
1139 return STR_CONTACT_PHONE_NUMBER_TYPE_CAR;
1140 } else if (arg == CONTACT_PHONE_NUMBER_TYPE_ISDN) {
1141 return STR_CONTACT_PHONE_NUMBER_TYPE_ISDN;
1142 } else if (arg == CONTACT_PHONE_NUMBER_TYPE_VIDEO) {
1143 return STR_CONTACT_PHONE_NUMBER_TYPE_VIDEO;
1144 } else if (arg == CONTACT_PHONE_NUMBER_TYPE_PCS) {
1145 return STR_CONTACT_PHONE_NUMBER_TYPE_PCS;
1147 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Invalid ContactPhoneNumverType : " << arg);
1149 return STR_CONTACT_PHONE_NUMBER_TYPE_WORK;
1152 ContactPhoneNumberType ContactConverter::toContactPhoneNumberType(const JSValueRef &value)
1154 if(!JSValueIsString(m_context, value))
1155 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "ContactPhoneNumberType is not string.");
1157 return toContactPhoneNumberType(toString(value));
1160 JSValueRef ContactConverter::toJSValueRef(ContactPhoneNumberType arg)
1162 return toJSValueRef(toContactPhoneNumberTypeStr(arg));
1165 JSValueRef ContactConverter::toJSValueRef(const ContactPhoneNumberTypeArrayPtr &arg)
1167 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactPhoneNumberTypeArray::getClassRef(), arg);
1170 ContactPhoneNumberTypeArrayPtr ContactConverter::toContactPhoneNumberTypeArray(const JSValueRef &jsValue)
1172 if(JSContactPhoneNumberTypeArray::isObjectOfClass(m_context, jsValue))
1173 return JSContactPhoneNumberTypeArray::getContactPhoneNumberTypeArray(m_context, jsValue);
1175 if(!JSIsArrayValue(m_context, jsValue))
1176 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "ContactEmailAddressTypeArray is not array.");
1178 ContactPhoneNumberTypeArrayPtr result(new ContactPhoneNumberTypeArray());
1180 JSObjectRef jsObject = toJSObjectRef(jsValue);
1181 for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
1182 JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
1184 result->push_back(toContactPhoneNumberType(element));
1185 } Catch (Exception) {
1192 ContactEmailAddressType ContactConverter::toContactEmailAddressType(const std::string &arg)
1194 std::string argUpper;
1195 std::transform(arg.begin(), arg.end(), std::back_inserter(argUpper), ::toupper);
1197 if (argUpper == STR_CONTACT_EMAIL_TYPE_WORK) {
1198 return CONTACT_EMAIL_TYPE_WORK;
1199 } else if (argUpper == STR_CONTACT_EMAIL_TYPE_PREF) {
1200 return CONTACT_EMAIL_TYPE_PREF;
1201 } else if (argUpper == STR_CONTACT_EMAIL_TYPE_HOME) {
1202 return CONTACT_EMAIL_TYPE_HOME;
1204 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Invalid ContactEmailAddressType : " << arg);
1206 return CONTACT_EMAIL_TYPE_PREF;
1209 std::string ContactConverter::toContactEmailAddressTypeStr(ContactEmailAddressType arg)
1211 if (arg == CONTACT_EMAIL_TYPE_WORK) {
1212 return STR_CONTACT_EMAIL_TYPE_WORK;
1213 } else if (arg == CONTACT_EMAIL_TYPE_PREF) {
1214 return STR_CONTACT_EMAIL_TYPE_PREF;
1215 } else if (arg == CONTACT_EMAIL_TYPE_HOME) {
1216 return STR_CONTACT_EMAIL_TYPE_HOME;
1218 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "Invalid ContactEmailAddressType : " << arg);
1220 return STR_CONTACT_EMAIL_TYPE_PREF;
1223 ContactEmailAddressType ContactConverter::toContactEmailAddressType(const JSValueRef &value)
1225 if(!JSValueIsString(m_context, value))
1226 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "ContactEmailAddressType is not string.");
1228 return toContactEmailAddressType(toString(value));
1231 JSValueRef ContactConverter::toJSValueRef(ContactEmailAddressType arg)
1233 return toJSValueRef(toContactEmailAddressTypeStr(arg));
1236 JSValueRef ContactConverter::toJSValueRef(const ContactEmailAddressTypeArrayPtr &arg)
1238 return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSContactEmailAddressTypeArray::getClassRef(), arg);
1241 ContactEmailAddressTypeArrayPtr ContactConverter::toContactEmailAddressTypeArray(const JSValueRef &jsValue)
1243 if(JSContactEmailAddressTypeArray::isObjectOfClass(m_context, jsValue))
1244 return JSContactEmailAddressTypeArray::getContactEmailAddressTypeArray(m_context, jsValue);
1246 if(!JSIsArrayValue(m_context, jsValue))
1247 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "ContactEmailAddressTypeArray is not array.");
1249 ContactEmailAddressTypeArrayPtr result(new ContactEmailAddressTypeArray());
1251 JSObjectRef jsObject = toJSObjectRef(jsValue);
1252 for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
1253 JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
1255 result->push_back(toContactEmailAddressType(element));
1256 } Catch (Exception) {
1263 StringArrayPtr ContactConverter::toStringArray(const JSValueRef &jsValue)
1265 if(JSStringArray::isObjectOfClass(m_context, jsValue))
1266 return JSStringArray::getStringArray(m_context, jsValue);
1268 if(!JSIsArrayValue(m_context, jsValue))
1269 ThrowMsg(WrtDeviceApis::Commons::ConversionException, "StringArray is not array.");
1271 StringArrayPtr result = StringArrayPtr(new StringArray());
1272 JSObjectRef jsObject = toJSObjectRef(jsValue);
1273 for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
1274 JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
1275 result->push_back(toString(element));
1280 JSValueRef ContactConverter::toJSValueRef(const StringArrayPtr &arg)
1282 return JSStringArray::createArray(m_context, arg);
1285 //std::string ContactConverter::toAttributesOfInterest(const JSValueRef &value)
1287 // // need validator
1288 // return toString(value);
1291 //JSValueRef ContactConverter::toJSValueRefAttributesOfInterestArray(const AttributesOfInterestArrayPtr &arg)
1293 // return WrtDeviceApis::CommonsJavaScript::JSUtils::makeObject(m_context, JSAttributesOfInterestArray::getClassRef(), arg);
1296 //AttributesOfInterestArrayPtr ContactConverter::toAttributesOfInterestArray(const JSValueRef &jsValue)
1298 // if(JSAttributesOfInterestArray::isObjectOfClass(m_context, jsValue))
1299 // return JSAttributesOfInterestArray::getAttributesOfInterestArray(m_context, jsValue);
1301 // if(!JSIsArrayValue(m_context, jsValue))
1302 // ThrowMsg(WrtDeviceApis::Commons::ConversionException, "AttributesOfInterestArray is not array.");
1304 // AttributesOfInterestArrayPtr result(new AttributesOfInterestArray());
1306 // JSObjectRef jsObject = toJSObjectRef(jsValue);
1307 // for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
1308 // JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
1309 // result->push_back(toAttributesOfInterest(element));
1314 bool ContactConverter::initializeAllowedProperties()
1316 m_allowedContactInit.push_back(CONTACT_ATTRIBUTE_NAME);
1317 m_allowedContactInit.push_back(CONTACT_ATTRIBUTE_ACCOUNT);
1318 m_allowedContactInit.push_back(CONTACT_ATTRIBUTE_ADDRESSES);
1319 m_allowedContactInit.push_back(CONTACT_ATTRIBUTE_PHOTO_URI );
1320 m_allowedContactInit.push_back(CONTACT_ATTRIBUTE_PHONE_NUMBERS);
1321 m_allowedContactInit.push_back(CONTACT_ATTRIBUTE_EMAILS);
1322 m_allowedContactInit.push_back(CONTACT_ATTRIBUTE_BIRTHDAY);
1323 m_allowedContactInit.push_back(CONTACT_ATTRIBUTE_ANNIVERSARIES);
1324 m_allowedContactInit.push_back(CONTACT_ATTRIBUTE_ORGANIZATION);
1325 m_allowedContactInit.push_back(CONTACT_ATTRIBUTE_NOTES);
1326 m_allowedContactInit.push_back(CONTACT_ATTRIBUTE_URLS);
1327 m_allowedContactInit.push_back(CONTACT_ATTRIBUTE_IS_FAVORITE);
1328 m_allowedContactInit.push_back(CONTACT_ATTRIBUTE_RINGTONE_URI);
1329 m_allowedContactInit.push_back(CONTACT_ATTRIBUTE_CATEGORIES);
1331 m_allowedContactNameInit.push_back(CONTACT_ATTRIBUTE_PREFIX);
1332 m_allowedContactNameInit.push_back(CONTACT_ATTRIBUTE_FIRST_NAME);
1333 m_allowedContactNameInit.push_back(CONTACT_ATTRIBUTE_MIDDLE_NAME);
1334 m_allowedContactNameInit.push_back(CONTACT_ATTRIBUTE_LAST_NAME);
1335 m_allowedContactNameInit.push_back(CONTACT_ATTRIBUTE_NICKNAMES);
1336 m_allowedContactNameInit.push_back(CONTACT_ATTRIBUTE_PHONETIC_NAME);
1337 m_allowedContactNameInit.push_back(CONTACT_ATTRIBUTE_DISPLAY_NAME);
1339 m_allowedContactOrganizationInit.push_back(CONTACT_ATTRIBUTE_NAME);
1340 m_allowedContactOrganizationInit.push_back(CONTACT_ATTRIBUTE_DEPARTMENT);
1341 m_allowedContactOrganizationInit.push_back(CONTACT_ATTRIBUTE_OFFICE);
1342 m_allowedContactOrganizationInit.push_back(CONTACT_ATTRIBUTE_TITLE);
1343 m_allowedContactOrganizationInit.push_back(CONTACT_ATTRIBUTE_ROLE);
1344 m_allowedContactOrganizationInit.push_back(CONTACT_ATTRIBUTE_LOGO_URI);
1346 m_allowedContactAddressInit.push_back(CONTACT_ATTRIBUTE_COUNTRY);
1347 m_allowedContactAddressInit.push_back(CONTACT_ATTRIBUTE_REGION);
1348 m_allowedContactAddressInit.push_back(CONTACT_ATTRIBUTE_CITY);
1349 m_allowedContactAddressInit.push_back(CONTACT_ATTRIBUTE_STREET_ADDRESS);
1350 m_allowedContactAddressInit.push_back(CONTACT_ATTRIBUTE_ADDITIONAL_INFORMATION);
1351 m_allowedContactAddressInit.push_back(CONTACT_ATTRIBUTE_POSTAL_CODE);
1352 m_allowedContactAddressInit.push_back(CONTACT_ATTRIBUTE_TYPES);