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 ContactWrapper.cpp
19 * @author Lukasz Marek(l.marek@samsung.com)
20 * @author Yujie Zeng(yj.zengk@samsung.com)
27 #include <dpl/log/log.h>
28 #include <Commons/Exception.h>
29 #include <Commons/Regex.h>
30 #include "ContactWrapper.h"
31 #include "AddressBook.h"
33 #include "query-svc/query-service.h"
35 #define CONTACT_ATTRIBUTE_PHONETIC_FIRST_NAME "phoneticFirstName"
36 #define CONTACT_ATTRIBUTE_PHONETIC_LAST_NAME "phoneticLastName"
45 using namespace TizenApis::Api::Contact;
46 using namespace WrtDeviceApis::Commons;
49 ContactWrapper::ContactWrapper(IAddressBook::AddressBookType type) :
50 m_abstractContact(NULL),
51 m_platformContact(NULL),
52 m_platformContactOwnership(false)
54 //platform layer seems to not support different storage types yet
57 ContactWrapper::~ContactWrapper()
62 void ContactWrapper::freePlatformObject()
64 if (m_platformContact && m_platformContactOwnership)
66 contacts_svc_struct_free(m_platformContact);
67 m_platformContact = NULL;
68 m_platformContactOwnership = false;
72 void ContactWrapper::freeAbstractObject()
74 m_abstractContact = ContactPtr(NULL);
77 ContactPtr ContactWrapper::getAbstractContact() const
79 return m_abstractContact;
82 void ContactWrapper::setAbstractContact(const ContactPtr &contact, bool isConvertingVCard)
84 m_abstractContact = contact;
85 convertToPlatformObject(isConvertingVCard);
88 CTSstruct* ContactWrapper::getPlatformContact() const
90 return m_platformContact;
93 void ContactWrapper::setPlatformContact(CTSstruct* contact, bool isConvertingVCard)
98 m_platformContact = contact;
99 m_platformContactOwnership = false;
100 convertToAbstractObject(isConvertingVCard);
103 bool ContactWrapper::convertAbstractToPlatform(const ContactPtr &abstract, CTSstruct* platform, bool isConvertingVCard)
105 freePlatformObject();
106 freeAbstractObject();
108 m_abstractContact = abstract;
109 m_platformContact = platform;
110 m_platformContactOwnership = false;
112 return convertToPlatformObject(isConvertingVCard);
115 bool ContactWrapper::convertPlatformToAbstract(CTSstruct* platform, ContactPtr &abstract, bool isConvertingVCard)
117 freeAbstractObject();
118 freePlatformObject();
120 m_platformContact = platform;
121 m_platformContactOwnership = false;
122 m_abstractContact = abstract;
124 return convertToAbstractObject(isConvertingVCard);
127 bool ContactWrapper::convertToPlatformObject(bool isConvertingVCard)
131 freePlatformObject();
133 if (!m_abstractContact)
135 LogError("abstract object is not set");
139 //if abstrat object has id set then we have to read existing object and update it
140 if (m_abstractContact->getIdIsSet() && (isConvertingVCard == false))
142 LogDebug("reading existing contact");
144 stringstream(m_abstractContact->getId()) >> id;
145 contacts_svc_get_contact(id, &m_platformContact);
147 else // if no id is set then create new platform object
149 LogDebug("creating new contact");
150 m_platformContact = contacts_svc_struct_new(CTS_STRUCT_CONTACT);
151 m_platformContactOwnership = true;
154 if (!m_platformContact)
156 LogError("contact structure not created properly");
162 if (!convertToPlatformBaseData())
163 ThrowMsg(UnknownException, "error during converting base data");
165 if (!convertToPlatformAddressObject())
166 ThrowMsg(UnknownException, "error during converting address object");
168 if (!convertToPlatformEmailObject())
169 ThrowMsg(UnknownException, "error during converting email object");
171 if (!convertToPlatformPhoneObject())
172 ThrowMsg(UnknownException, "error during converting phone object");
174 if (!convertToPlatformNicknameObject())
175 ThrowMsg(UnknownException, "error during converting nickname object");
177 if (!convertToPlatformPhoneticnameObject())
178 ThrowMsg(UnknownException, "error during converting Phoneticname object");
180 if (!convertToPlatformGroupObject())
181 ThrowMsg(UnknownException, "error during converting group object");
183 if (!convertToPlatformUrlObject())
184 ThrowMsg(UnknownException, "error during converting url object");
186 if (!convertToPlatformOrganizationObject())
187 ThrowMsg(UnknownException, "error during converting organization object");
189 if (!convertToPlatformAnniversaryObject())
190 ThrowMsg(UnknownException, "error during converting anniversary object");
192 if (!convertToPlatformbirthdayObject())
193 ThrowMsg(UnknownException, "error during converting birthday object");
197 LogError("Error converting to platform object : " << _rethrown_exception.GetMessage());
199 freePlatformObject();
207 bool ContactWrapper::convertToAbstractObject(bool isConvertingVCard)
211 if (!m_platformContact)
214 CTSvalue *value = NULL;
216 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, &value))
219 if(m_abstractContact == NULL)
220 m_abstractContact = ContactPtr(new Contact());
222 if(!isConvertingVCard)
224 m_abstractContact->setId(contacts_svc_value_get_int(value, CTS_BASE_VAL_ID_INT));
225 //m_abstractContact->setAddressBookId(contacts_svc_value_get_int(value, CTS_BASE_VAL_ADDRESSBOOK_ID_INT));
226 m_abstractContact->setAddressBookId(0);
229 const char *charValue;
231 charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_IMG_PATH_STR);
233 m_abstractContact->setPhotoURI(convertPathToUri(charValue));
235 charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR);
237 m_abstractContact->setRingtoneURI(convertPathToUri(charValue));
239 charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_NOTE_STR);
241 m_abstractContact->setNote(charValue);
245 if (!convertToAbstractBaseData())
246 ThrowMsg(UnknownException, "error during converting base data");
248 if (!convertToAbstractAddressObject())
249 ThrowMsg(UnknownException, "error during converting address object");
251 if (!convertToAbstractEmailObject())
252 ThrowMsg(UnknownException, "error during converting email object");
254 if (!convertToAbstractPhoneObject())
255 ThrowMsg(UnknownException, "error during converting phone object");
257 if (!convertToAbstractNicknameObject())
258 ThrowMsg(UnknownException, "error during converting nickname object");
260 if (!convertToAbstractPhoneticnameObject())
261 ThrowMsg(UnknownException, "error during converting phoneticName object");
263 if (!convertToAbstractGroupObject())
264 ThrowMsg(UnknownException, "error during converting group object");
266 if (!convertToAbstractUrlObject())
267 ThrowMsg(UnknownException, "error during converting url object");
269 if (!convertToAbstractOrganizationObject())
270 ThrowMsg(UnknownException, "error during converting organization object");
272 if (!convertToAbstractAnniversaryObject())
273 ThrowMsg(UnknownException, "error during converting anniversary object");
275 if (!convertToAbstractBirthdayObject())
276 ThrowMsg(UnknownException, "error during converting birthday object");
280 LogError("Error converting to abstract object : " << _rethrown_exception.GetMessage());
281 freeAbstractObject();
289 bool ContactWrapper::convertToAbstractBaseData()
291 if (NULL == m_abstractContact)
293 LogError("you should create empty abstract contact object first");
297 if (NULL == m_platformContact)
299 LogError("you should provide platform contact object first");
303 CTSvalue *value = NULL;
306 errorCode = contacts_svc_struct_get_value(m_platformContact, CTS_CF_NAME_VALUE, &value);
307 if (CTS_SUCCESS == errorCode && value != NULL)
309 const char *charValue = NULL;
310 ContactNamePtr contactName(new ContactName);
312 charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_FIRST_STR);
314 contactName->setFirstName(charValue);
316 charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_ADDITION_STR);
318 contactName->setMiddleName(charValue);
320 charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_LAST_STR);
322 contactName->setLastName(charValue);
324 charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_DISPLAY_STR);
326 contactName->setDisplayName(charValue);
328 charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_PREFIX_STR);
330 contactName->setPrefix(charValue);
332 //charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_SUFFIX_STR);
334 // contactName->setPhoneticName(charValue);
336 m_abstractContact->setName(contactName);
338 else if (errorCode != CTS_ERR_NO_DATA || value == NULL)
343 // errorCode = contacts_svc_struct_get_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, &value);
344 // if (CTS_SUCCESS == errorCode && value != NULL)
346 // const char *charValue = NULL;
348 // charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_IMG_PATH_STR);
350 // m_abstractContact->setPhotoURI(convertPathToUri(charValue));
352 // charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR);
354 // m_abstractContact->setRingtoneURI(convertPathToUri(charValue));
356 // bool boolValue = contacts_svc_value_get_bool(value, CTS_BASE_VAL_FAVORITE_BOOL);
358 // m_abstractContact->setIsFavorite(boolValue);
360 // charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_NOTE_STR);
362 // m_abstractContact->addNote(charValue);
364 // else if (errorCode != CTS_ERR_NO_DATA || value == NULL)
372 bool ContactWrapper::convertToAbstractAddressObject()
374 if (NULL == m_abstractContact)
376 LogError("you should create empty abstract contact object first");
380 if (NULL == m_platformContact)
382 LogError("you should provide platform contact object first");
386 ContactAddressArrayPtr addresses = ContactAddressArrayPtr(new ContactAddressArray());
388 GSList *addressList = NULL;
389 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_POSTAL_ADDR_LIST, &addressList);
390 if (CTS_SUCCESS == errorCode)
392 for (; addressList; addressList = g_slist_next(addressList))
394 ContactAddressPtr address(new ContactAddress());
395 addresses->push_back(address);
397 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_TYPE_INT);
398 if(type & CTS_ADDR_TYPE_POSTAL) // TODO to be checked
399 address->addType(CONTACT_ADDRESS_TYPE_PREF);
400 if(type & CTS_ADDR_TYPE_HOME)
401 address->addType(CONTACT_ADDRESS_TYPE_HOME);
402 if(type & CTS_ADDR_TYPE_WORK)
403 address->addType(CONTACT_ADDRESS_TYPE_WORK);
405 const char *charValue = NULL;
407 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_COUNTRY_STR);
409 address->setCountry(charValue);
411 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_REGION_STR);
413 address->setRegion(charValue);
415 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_LOCALITY_STR);
417 address->setCity(charValue);
419 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_STREET_STR);
421 address->setStreetAddress(charValue);
423 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_POSTALCODE_STR);
425 address->setPostalCode(charValue);
427 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_EXTENDED_STR);
429 address->setAdditionalInformation(charValue);
433 else if (errorCode != CTS_ERR_NO_DATA)
438 m_abstractContact->setAddresses(addresses);
443 bool ContactWrapper::convertToAbstractUrlObject()
445 if (NULL == m_abstractContact)
447 LogError("you should create empty abstract contact object first");
451 if (NULL == m_platformContact)
453 LogError("you should provide platform contact object first");
457 ContactWebSiteArrayPtr urls = ContactWebSiteArrayPtr(new ContactWebSiteArray());
459 GSList *urlList = NULL;
460 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_WEB_ADDR_LIST, &urlList);
461 if (CTS_SUCCESS == errorCode)
463 for (; urlList; urlList = g_slist_next(urlList))
465 ContactWebSitePtr url(new ContactWebSite());
466 urls->push_back(url);
468 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(urlList->data), CTS_WEB_VAL_TYPE_INT);
471 case CTS_WEB_TYPE_NONE:
472 url->setType(WEBSITE_TYPE_HOMEPAGE);
474 case CTS_WEB_TYPE_HOME:
475 url->setType(WEBSITE_TYPE_HOMEPAGE);
477 case CTS_WEB_TYPE_WORK:
478 url->setType(WEBSITE_TYPE_BLOG);
481 LogError("invalid url type");
482 url->setType(WEBSITE_TYPE_HOMEPAGE);
486 const char *charValue = NULL;
488 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(urlList->data), CTS_WEB_VAL_ADDR_STR);
490 url->setUrl(charValue);
494 else if (errorCode != CTS_ERR_NO_DATA)
499 m_abstractContact->setUrls(urls);
504 bool ContactWrapper::convertToAbstractOrganizationObject()
506 if (NULL == m_abstractContact)
508 LogError("you should create empty abstract contact object first");
512 if (NULL == m_platformContact)
514 LogError("you should provide platform contact object first");
518 CTSvalue *value = NULL;
521 ContactOrganizationPtr organization(new ContactOrganization());
523 errorCode = contacts_svc_struct_get_value(m_platformContact, CTS_CF_COMPANY_VALUE, &value);
524 if (CTS_SUCCESS == errorCode)
526 const char *charValue = NULL;
528 charValue = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_NAME_STR);
530 organization->setName(charValue);
532 charValue = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_DEPARTMENT_STR);
534 organization->setDepartment(charValue);
536 charValue = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_JOB_TITLE_STR);
538 organization->setTitle(charValue);
540 charValue = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_ROLE_STR);
542 organization->setRole(charValue);
545 else if (errorCode != CTS_ERR_NO_DATA)
550 m_abstractContact->setOrganization(organization);
555 bool ContactWrapper::convertToAbstractAnniversaryObject()
557 if (NULL == m_abstractContact)
559 LogError("you should create empty abstract contact object first");
563 if (NULL == m_platformContact)
565 LogError("you should provide platform contact object first");
569 ContactAnniversaryArrayPtr anniversaries(new ContactAnniversaryArray());
571 GSList *eventList = NULL;
572 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_EVENT_LIST, &eventList);
573 if (CTS_SUCCESS == errorCode)
575 for (; eventList; eventList = g_slist_next(eventList))
577 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(eventList->data), CTS_EVENT_VAL_TYPE_INT);
578 int db_date = contacts_svc_value_get_int(static_cast<CTSvalue*>(eventList->data), CTS_EVENT_VAL_DATE_INT);
580 if (type == CTS_EVENT_TYPE_ANNIVERSARY)
582 ContactAnniversaryPtr anniversary = ContactAnniversaryPtr(new ContactAnniversary());
586 tm_date.tm_year = (db_date / 10000) - 1900;
587 tm_date.tm_mon = ((db_date - ((tm_date.tm_year + 1900) * 10000)) / 100) - 1;
588 tm_date.tm_mday = (db_date - ((tm_date.tm_year + 1900) * 10000) - tm_date.tm_mon * 100);
590 anniversary->setDate(tm_date);
593 // anniv->setLabel(string("ANNIVERSARY"));
595 anniversaries->push_back(anniversary);
599 else if (errorCode != CTS_ERR_NO_DATA)
604 m_abstractContact->setAnniversaries(anniversaries);
609 bool ContactWrapper::convertToAbstractBirthdayObject()
611 if (NULL == m_abstractContact)
613 LogError("you should create empty abstract contact object first");
617 if (NULL == m_platformContact)
619 LogError("you should provide platform contact object first");
623 GSList *eventList = NULL;
624 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_EVENT_LIST, &eventList);
625 if (CTS_SUCCESS == errorCode)
627 for (; eventList; eventList = g_slist_next(eventList))
629 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(eventList->data), CTS_EVENT_VAL_TYPE_INT);
630 int db_date = contacts_svc_value_get_int(static_cast<CTSvalue*>(eventList->data), CTS_EVENT_VAL_DATE_INT);
632 if (type == CTS_EVENT_TYPE_BIRTH)
636 tm_date.tm_year = (db_date / 10000) - 1900;
637 tm_date.tm_mon = ((db_date - ((tm_date.tm_year + 1900) * 10000)) / 100) - 1;
638 tm_date.tm_mday = (db_date - ((tm_date.tm_year + 1900) * 10000) - tm_date.tm_mon * 100);
640 m_abstractContact->setBirthday(tm_date);
645 else if (errorCode != CTS_ERR_NO_DATA)
653 bool ContactWrapper::convertToAbstractEmailObject()
655 if (NULL == m_abstractContact)
657 LogError("you should create empty abstract contact object first");
661 if (NULL == m_platformContact)
663 LogError("you should provide platform contact object first");
667 ContactEmailAddressArrayPtr emailAddresses(new ContactEmailAddressArray());
669 GSList *emailList = NULL;
670 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_EMAIL_LIST, &emailList);
671 if (CTS_SUCCESS == errorCode)
673 for (; emailList; emailList = g_slist_next(emailList))
675 ContactEmailAddressPtr email(new ContactEmailAddress());
677 emailAddresses->push_back(email);
679 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(emailList->data), CTS_EMAIL_VAL_TYPE_INT);
681 if(type | CTS_EMAIL_TYPE_NONE)
682 email->addType(CONTACT_EMAIL_TYPE_PREF);
683 if(type | CTS_EMAIL_TYPE_HOME)
684 email->addType(CONTACT_EMAIL_TYPE_HOME);
685 if(type | CTS_EMAIL_TYPE_WORK)
686 email->addType(CONTACT_EMAIL_TYPE_WORK);
688 const char *charValue = NULL;
690 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(emailList->data), CTS_EMAIL_VAL_ADDR_STR);
692 email->setEmail(charValue);
695 else if (errorCode != CTS_ERR_NO_DATA)
700 m_abstractContact->setEmails(emailAddresses);
705 bool ContactWrapper::convertToAbstractPhoneObject()
707 if (NULL == m_abstractContact)
709 LogError("you should create empty abstract contact object first");
713 if (NULL == m_platformContact)
715 LogError("you should provide platform contact object first");
719 ContactPhoneNumberArrayPtr phoneNumbers(new ContactPhoneNumberArray());
721 GSList *phoneList = NULL;
722 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_NUMBER_LIST, &phoneList);
723 if (CTS_SUCCESS == errorCode)
725 for (; phoneList; phoneList = g_slist_next(phoneList))
727 ContactPhoneNumberPtr phoneNumber(new ContactPhoneNumber());
728 phoneNumbers->push_back(phoneNumber);
730 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(phoneList->data), CTS_NUM_VAL_TYPE_INT);
731 if(type & CTS_NUM_TYPE_WORK)
732 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_WORK);
733 if(type & CTS_NUM_TYPE_NONE)
734 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_PREF);
735 if(type & CTS_NUM_TYPE_HOME)
736 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_HOME);
737 if(type & CTS_NUM_TYPE_FAX)
738 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_FAX);
739 if(type & CTS_NUM_TYPE_CELL)
740 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_CELL);
741 if(type & CTS_NUM_TYPE_PAGER)
742 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_PAGER);
743 if(type & CTS_NUM_TYPE_CAR)
744 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_CAR);
745 if(type & CTS_NUM_TYPE_VOICE)
746 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_VOICE);
747 if(type & CTS_NUM_TYPE_MSG)
748 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_MSG);
749 if(type & CTS_NUM_TYPE_BBS)
750 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_BBS);
751 if(type & CTS_NUM_TYPE_ISDN)
752 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_ISDN);
753 if(type & CTS_NUM_TYPE_VIDEO)
754 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_VIDEO);
755 if(type & CTS_NUM_TYPE_PCS)
756 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_PCS);
757 if(type & CTS_NUM_TYPE_WORK)
758 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_WORK);
759 if(type & CTS_NUM_TYPE_WORK)
760 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_WORK);
762 const char *charValue = NULL;
764 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(phoneList->data), CTS_NUM_VAL_NUMBER_STR);
766 phoneNumber->setNumber(charValue);
769 else if (errorCode != CTS_ERR_NO_DATA)
774 m_abstractContact->setPhoneNumbers(phoneNumbers);
779 bool ContactWrapper::convertToAbstractNicknameObject()
781 if (NULL == m_abstractContact)
783 LogError("you should create empty abstract contact object first");
787 if (NULL == m_platformContact)
789 LogError("you should provide platform contact object first");
793 StringArrayPtr nickNames(new StringArray());
795 GSList *nicknNameList = NULL;
796 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_NICKNAME_LIST, &nicknNameList);
797 if (CTS_SUCCESS == errorCode)
799 for (; nicknNameList; nicknNameList = g_slist_next(nicknNameList))
801 const char *charValue = NULL;
802 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(nicknNameList->data), CTS_NICKNAME_VAL_NAME_STR);
804 nickNames->push_back(charValue);
807 else if (errorCode != CTS_ERR_NO_DATA)
812 m_abstractContact->getName()->setNicknames(nickNames);
817 bool ContactWrapper::convertToAbstractPhoneticnameObject()
819 if (NULL == m_abstractContact)
821 LogError("you should create empty abstract contact object first");
825 if (NULL == m_platformContact)
827 LogError("you should provide platform contact object first");
831 int structFieldType = 0;
832 structFieldType = getCustomTypeInContactsSvc(CONTACT_ATTRIBUTE_PHONETIC_FIRST_NAME);
833 if (structFieldType < CTS_SUCCESS)
835 LogError("Phonetic first name struct type is not found!!");
839 CTSvalue *value = NULL;
841 errorCode = contacts_svc_struct_get_value(m_platformContact, static_cast<cts_struct_field>(structFieldType), &value);
842 if (CTS_SUCCESS == errorCode)
846 const char *charValue = NULL;
847 charValue = contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA2_STR);
849 m_abstractContact->getName()->setPhoneticFirstName(charValue);
856 else if (errorCode != CTS_ERR_NO_DATA)
861 structFieldType = getCustomTypeInContactsSvc(CONTACT_ATTRIBUTE_PHONETIC_LAST_NAME);
862 if (structFieldType < CTS_SUCCESS)
864 LogError("Phonetic name struct type is not found!!");
869 errorCode = contacts_svc_struct_get_value(m_platformContact, static_cast<cts_struct_field>(structFieldType), &value);
870 if (CTS_SUCCESS == errorCode)
874 const char *charValue = NULL;
875 charValue = contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA3_STR);
877 m_abstractContact->getName()->setPhoneticLastName(charValue);
884 else if (errorCode != CTS_ERR_NO_DATA)
892 bool ContactWrapper::convertToAbstractGroupObject()
894 if (NULL == m_abstractContact)
896 LogError("you should create empty abstract contact object first");
900 if (NULL == m_platformContact)
902 LogError("you should provide platform contact object first");
906 StringArrayPtr categories(new StringArray());
908 GSList *groupList = NULL;
909 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_GROUPREL_LIST, &groupList);
910 if (CTS_SUCCESS == errorCode)
912 for (; groupList; groupList = g_slist_next(groupList))
914 const char *charValue = NULL;
915 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(groupList->data), CTS_GROUPREL_VAL_NAME_STR);
917 categories->push_back(charValue);
920 else if (errorCode != CTS_ERR_NO_DATA)
925 m_abstractContact->setCategories(categories);
930 bool ContactWrapper::convertToPlatformNicknameObject()
932 if (NULL == m_abstractContact)
934 LogError("you should create empty abstract contact object first");
938 if (NULL == m_platformContact)
940 LogError("you should provide platform contact object first");
944 StringArrayPtr nicknames = m_abstractContact->getName()->getNicknames();
946 bool properlyCreated = true;
948 GSList *nicknameList = NULL;
949 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_NICKNAME_LIST, &nicknameList))
951 GSList *nicknameListSave = nicknameList;
952 for (; nicknameList; nicknameList = g_slist_next(nicknameList))
954 CTSvalue* nickname = static_cast<CTSvalue*>(nicknameList->data);
955 contacts_svc_value_set_bool(nickname, CTS_NICKNAME_VAL_DELETE_BOOL, true);
957 nicknameList = nicknameListSave;
960 if (nicknames->size() == 0 && nicknameList == NULL)
964 for (size_t i = 0; i < nicknames->size(); ++i)
966 CTSvalue *nickname = NULL;
967 nickname = contacts_svc_value_new(CTS_VALUE_NICKNAME);
970 if (CTS_SUCCESS == contacts_svc_value_set_str(nickname, CTS_NICKNAME_VAL_NAME_STR, nicknames->at(i).c_str()))
972 nicknameList = g_slist_append(nicknameList, nickname);
976 contacts_svc_value_free(nickname);
977 properlyCreated = false;
983 properlyCreated = false;
990 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_NICKNAME_LIST, nicknameList))
992 properlyCreated = false;
996 return properlyCreated;
999 bool ContactWrapper::convertToPlatformPhoneticnameObject()
1001 if (NULL == m_abstractContact)
1003 LogError("you should create empty abstract contact object first");
1007 if (NULL == m_platformContact)
1009 LogError("you should provide platform contact object first");
1013 int structFieldType = 0;
1014 structFieldType = getCustomTypeInContactsSvc(CONTACT_ATTRIBUTE_PHONETIC_FIRST_NAME);
1015 if (structFieldType < CTS_SUCCESS)
1017 LogError("Phonetic first name struct type is not found!!");
1022 *If phonetic name information is not existed, add phonetic name information
1023 *If phonetic name information is existed,update phonetic name information
1025 CTSvalue *value = NULL;
1026 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, static_cast<cts_struct_field>(structFieldType), &value))
1028 value = contacts_svc_value_new(CTS_VALUE_EXTEND);
1034 if (CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_EXTEND_VAL_DATA2_STR, m_abstractContact->getName()->getPhoneticFirstName().c_str())
1035 || CTS_SUCCESS != contacts_svc_struct_store_value(m_platformContact, static_cast<cts_struct_field>(structFieldType), value))
1037 contacts_svc_value_free(value);
1041 structFieldType = getCustomTypeInContactsSvc(CONTACT_ATTRIBUTE_PHONETIC_LAST_NAME);
1042 if (structFieldType < CTS_SUCCESS)
1044 LogError("Phonetic last name struct type is not found!!");
1049 *If phonetic name information is not existed, add phonetic name information
1050 *If phonetic name information is existed,update phonetic name information
1053 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, static_cast<cts_struct_field>(structFieldType), &value))
1055 value = contacts_svc_value_new(CTS_VALUE_EXTEND);
1061 if (CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_EXTEND_VAL_DATA3_STR, m_abstractContact->getName()->getPhoneticLastName().c_str())
1062 || CTS_SUCCESS != contacts_svc_struct_store_value(m_platformContact, static_cast<cts_struct_field>(structFieldType), value))
1064 contacts_svc_value_free(value);
1069 contacts_svc_value_free(value);
1071 // LogDebug("RETURN TRUE!!!");
1075 bool ContactWrapper::convertToPlatformGroupObject()
1077 // LogDebug("entered");
1078 if (NULL == m_abstractContact)
1080 LogError("you should create empty abstract contact object first");
1084 if (NULL == m_platformContact)
1086 LogError("you should provide platform contact object first");
1090 StringArrayPtr groups = m_abstractContact->getCategories();
1091 CTSvalue *group = NULL;
1092 bool properlyCreated = true;
1093 GSList *groupList = NULL;
1094 //mark existing items to delete them.
1095 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_GROUPREL_LIST, &groupList))
1097 GSList *groupListSave = groupList;
1098 for (; groupList; groupList = g_slist_next(groupList))
1100 // LogDebug("clearing group list");
1101 CTSvalue* delgroup = static_cast<CTSvalue*>(groupList->data);
1102 contacts_svc_value_set_bool(delgroup, CTS_GROUPREL_VAL_DELETE_BOOL, true);
1104 groupList = groupListSave;
1106 if (groups->size() == 0 && groupList == NULL
1111 query_error error_code = QUERY_SUCCESS;
1112 GSList *groups_list = NULL;
1116 string accountIdStr = m_abstractContact->getAccountId();
1117 stringstream ss(accountIdStr);
1120 LogError("Wrong account id");
1124 int addressBookId = find_addressbook_id(accountId, &error_code);
1125 if (error_code != QUERY_SUCCESS)
1128 CTSiter* group_iter;
1129 bool is_new_group = true;
1131 for (size_t i = 0; i < groups->size(); ++i)
1133 if (CTS_SUCCESS == contacts_svc_get_list(CTS_LIST_ALL_GROUP, &group_iter))
1135 while (CTS_SUCCESS == contacts_svc_iter_next(group_iter))
1137 CTSvalue *findgroup = contacts_svc_iter_get_info(group_iter);
1140 group_info_t* group_info = g_new0(group_info_t, 1);
1142 group_info->group_name = g_strdup(contacts_svc_value_get_str(findgroup, CTS_LIST_GROUP_NAME_STR));
1143 group_info->addressbook_id = contacts_svc_value_get_int(findgroup, CTS_GROUP_VAL_ADDRESSBOOK_ID_INT);
1144 group_info->group_id = contacts_svc_value_get_int(findgroup, CTS_GROUP_VAL_ID_INT);
1145 groups_list = g_slist_append(groups_list, group_info);
1150 group = contacts_svc_value_new(CTS_VALUE_GROUP_RELATION);
1154 //groupId = AddressBook::getGroupId(groups[i]);
1156 is_new_group = true;
1157 GSList* tmp_list = groups_list;
1160 group_info_t* info = (group_info_t*) tmp_list->data;
1162 if ((info->group_name != NULL) && (groups->at(i).compare(info->group_name) == 0)
1163 && (info->addressbook_id == addressBookId))
1165 is_new_group = false;
1166 groupId = info->group_id;
1168 if (info->group_name)
1169 free(info->group_name);
1171 tmp_list = g_slist_next(tmp_list);
1173 g_slist_free(groups_list);
1178 CTSvalue *new_group;
1179 new_group = contacts_svc_value_new(CTS_VALUE_GROUP);
1181 contacts_svc_value_set_str(new_group, CTS_GROUP_VAL_NAME_STR, (const char*) (groups->at(i).c_str()));
1182 contacts_svc_value_set_int(new_group, CTS_GROUP_VAL_ADDRESSBOOK_ID_INT, addressBookId);
1183 groupId = contacts_svc_insert_group(addressBookId, new_group);
1186 contacts_svc_value_free(new_group);
1188 // LogDebug("group id " << groupId);
1191 if (CTS_SUCCESS == contacts_svc_value_set_int(group, CTS_GROUPREL_VAL_ID_INT, groupId))
1193 groupList = g_slist_append(groupList, group);
1197 contacts_svc_value_free(group);
1198 properlyCreated = false;
1204 contacts_svc_value_free(group);
1205 properlyCreated = false;
1211 properlyCreated = false;
1215 if (properlyCreated)
1217 // LogDebug("storing group list");
1218 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_GROUPREL_LIST, groupList))
1220 properlyCreated = false;
1223 for (; groupList; groupList = g_slist_next(groupList))
1225 contacts_svc_value_free(static_cast<CTSvalue*>(groupList->data));
1227 g_slist_free(groupList);
1228 return properlyCreated;
1231 bool ContactWrapper::convertToPlatformUrlObject()
1233 // LogDebug("entered");
1234 if (NULL == m_abstractContact)
1236 LogError("you should create empty abstract contact object first");
1240 if (NULL == m_platformContact)
1242 LogError("you should provide platform contact object first");
1247 ContactWebSiteArrayPtr urls = m_abstractContact->getUrls();
1248 CTSvalue *url = NULL;
1249 bool properlyCreated = true;
1250 GSList *urlList = NULL;
1251 //mark existing items to delete them.
1252 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_WEB_ADDR_LIST, &urlList))
1254 GSList *urlListSave = urlList;
1255 for (; urlList; urlList = g_slist_next(urlList))
1257 // LogDebug("clearing url list");
1258 CTSvalue* tmp_email = static_cast<CTSvalue*>(urlList->data);
1259 contacts_svc_value_set_bool(tmp_email, CTS_WEB_VAL_DELETE_BOOL, true);
1261 urlList = urlListSave;
1263 if (urls->size() == 0 && urlList == NULL
1268 for (size_t i = 0; i < urls->size(); ++i)
1270 ContactWebSiteType types = urls->at(i)->getType();
1271 url = contacts_svc_value_new(CTS_VALUE_WEB);
1276 case WEBSITE_TYPE_HOMEPAGE:
1277 type = CTS_WEB_TYPE_HOME;
1279 case WEBSITE_TYPE_BLOG:
1280 type = CTS_WEB_TYPE_WORK;
1283 LogError("invalid phone type");
1284 type = CTS_WEB_TYPE_NONE;
1287 if (CTS_SUCCESS == contacts_svc_value_set_int(url, CTS_WEB_VAL_TYPE_INT, type)
1288 && CTS_SUCCESS == contacts_svc_value_set_str(url, CTS_WEB_VAL_ADDR_STR, urls->at(i)->getUrl().c_str()))
1290 urlList = g_slist_append(urlList, url);
1294 contacts_svc_value_free(url);
1295 properlyCreated = false;
1301 properlyCreated = false;
1305 if (!properlyCreated)
1311 if (properlyCreated)
1313 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_WEB_ADDR_LIST, urlList))
1315 properlyCreated = false;
1318 for (; urlList; urlList = g_slist_next(urlList))
1320 contacts_svc_value_free(static_cast<CTSvalue*>(urlList->data));
1322 g_slist_free(urlList);
1323 return properlyCreated;
1326 bool ContactWrapper::convertToPlatformOrganizationObject()
1328 // LogDebug("entered");
1329 if (NULL == m_abstractContact)
1331 LogError("you should create empty abstract contact object first");
1335 if (NULL == m_platformContact)
1337 LogError("you should provide platform contact object first");
1341 ContactOrganizationPtr org = m_abstractContact->getOrganization();
1342 bool isNewValue = false;
1343 CTSvalue *value = NULL;
1345 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, CTS_CF_COMPANY_VALUE, &value))
1347 value = contacts_svc_value_new(CTS_VALUE_COMPANY);
1354 if (CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_COMPANY_VAL_NAME_STR, org->getName().c_str())
1355 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_COMPANY_VAL_DEPARTMENT_STR, org->getDepartment().c_str())
1356 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_COMPANY_VAL_JOB_TITLE_STR, org->getTitle().c_str())
1357 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_COMPANY_VAL_ROLE_STR, org->getRole().c_str()) )
1359 contacts_svc_value_free(value);
1364 && org->getName().empty()
1365 && org->getDepartment().empty()
1366 && org->getTitle().empty()
1367 && org->getRole().empty() )
1369 LogDebug("Nothing to store for ContactOrganization");
1373 if ( CTS_SUCCESS != contacts_svc_struct_store_value(m_platformContact, CTS_CF_COMPANY_VALUE, value) )
1375 contacts_svc_value_free(value);
1380 contacts_svc_value_free(value);
1385 bool ContactWrapper::convertToPlatformAnniversaryObject()
1387 // LogDebug("entered");
1388 if (NULL == m_abstractContact)
1390 LogError("you should create empty abstract contact object first");
1394 if (NULL == m_platformContact)
1396 LogError("you should provide platform contact object first");
1400 ContactAnniversaryArrayPtr anniversaries = m_abstractContact->getAnniversaries();
1401 CTSvalue *anniversary = NULL;
1402 bool properlyCreated = true;
1403 GSList *anniversaryList = NULL;
1405 //mark existing items to delete them.
1406 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_EVENT_LIST, &anniversaryList))
1408 GSList *anniversaryListSave = anniversaryList;
1409 for (; anniversaryList; anniversaryList = g_slist_next(anniversaryList))
1411 // LogDebug("clearing anniversary list");
1412 CTSvalue* tmp_anniversary = static_cast<CTSvalue*>(anniversaryList->data);
1413 contacts_svc_value_set_bool(tmp_anniversary, CTS_EVENT_VAL_DELETE_BOOL, true);
1415 anniversaryList = anniversaryListSave;
1417 if (anniversaries->size() == 0 && anniversaryList == NULL
1423 for (size_t i = 0; i < anniversaries->size(); ++i)
1426 std::tm abstract_date = anniversaries->at(i)->getDate();
1428 date = (abstract_date.tm_year + 1900) * 10000 + (abstract_date.tm_mon+1) * 100 + abstract_date.tm_mday;
1429 anniversary = contacts_svc_value_new(CTS_VALUE_EVENT);
1432 if (CTS_SUCCESS == contacts_svc_value_set_int(anniversary, CTS_EVENT_VAL_TYPE_INT, CTS_EVENT_TYPE_ANNIVERSARY)
1433 && CTS_SUCCESS == contacts_svc_value_set_int(anniversary, CTS_EVENT_VAL_DATE_INT, date))
1435 anniversaryList = g_slist_append(anniversaryList, anniversary);
1439 contacts_svc_value_free(anniversary);
1440 properlyCreated = false;
1446 properlyCreated = false;
1450 if (!properlyCreated)
1456 if (properlyCreated)
1458 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_EVENT_LIST, anniversaryList))
1460 properlyCreated = false;
1463 for (; anniversaryList; anniversaryList = g_slist_next(anniversaryList))
1465 contacts_svc_value_free(static_cast<CTSvalue*>(anniversaryList->data));
1467 g_slist_free(anniversaryList);
1468 return properlyCreated;
1471 bool ContactWrapper::convertToPlatformbirthdayObject()
1473 // LogDebug("entered");
1474 if (NULL == m_abstractContact)
1476 LogError("you should create empty abstract contact object first");
1480 if (NULL == m_platformContact)
1482 LogError("you should provide platform contact object first");
1486 tm birth_date = m_abstractContact->getBirthday();
1488 CTSvalue *birthday = NULL;
1489 bool properlyCreated = true;
1490 GSList *anniversaryList = NULL;
1492 //mark existing items to delete them.
1493 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_EVENT_LIST, &anniversaryList))
1495 GSList *anniversaryListSave = anniversaryList;
1496 for (; anniversaryList; anniversaryList = g_slist_next(anniversaryList))
1498 // LogDebug("clearing anniversary list");
1499 CTSvalue* tmp_anniversary = static_cast<CTSvalue*>(anniversaryList->data);
1500 int type = contacts_svc_value_get_int(tmp_anniversary, CTS_EVENT_VAL_TYPE_INT);
1501 if (type == CTS_EVENT_TYPE_BIRTH)
1502 contacts_svc_value_set_bool(tmp_anniversary, CTS_EVENT_VAL_DELETE_BOOL, true);
1504 anniversaryList = anniversaryListSave;
1506 if (birth_date.tm_year == 0 && birth_date.tm_mon == 0 && birth_date.tm_mday == 0 && anniversaryList == NULL
1512 date = (birth_date.tm_year + 1900) * 10000 + (birth_date.tm_mon+1) * 100 + birth_date.tm_mday;
1513 // for (size_t i = 0; i < anniversaries->size(); ++i) {
1514 birthday = contacts_svc_value_new(CTS_VALUE_EVENT);
1518 if (CTS_SUCCESS == contacts_svc_value_set_int(birthday, CTS_EVENT_VAL_TYPE_INT, CTS_EVENT_TYPE_BIRTH)
1519 && CTS_SUCCESS == contacts_svc_value_set_int(birthday, CTS_EVENT_VAL_DATE_INT, date))
1521 anniversaryList = g_slist_append(anniversaryList, birthday);
1525 contacts_svc_value_free(birthday);
1526 properlyCreated = false;
1532 properlyCreated = false;
1536 // if (!properlyCreated) {
1541 if (properlyCreated)
1543 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_EVENT_LIST, anniversaryList))
1545 properlyCreated = false;
1548 for (; anniversaryList; anniversaryList = g_slist_next(anniversaryList))
1550 contacts_svc_value_free(static_cast<CTSvalue*>(anniversaryList->data));
1552 g_slist_free(anniversaryList);
1553 return properlyCreated;
1556 bool ContactWrapper::convertToPlatformPhoneObject()
1558 // LogDebug("entered");
1559 if (NULL == m_abstractContact)
1561 LogError("you should create empty abstract contact object first");
1565 if (NULL == m_platformContact)
1567 LogError("you should provide platform contact object first");
1572 ContactPhoneNumberArrayPtr phoneNumbers = m_abstractContact->getPhoneNumbers();
1573 bool properlyCreated = true;
1574 CTSvalue *number = NULL;
1575 GSList *numberList = NULL;
1576 //mark existing items to delete them.
1577 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_NUMBER_LIST, &numberList))
1579 GSList *numberListSave = numberList;
1580 for (; numberList; numberList = g_slist_next(numberList))
1582 // LogDebug("clearing phone list");
1583 CTSvalue* number = static_cast<CTSvalue*>(numberList->data);
1584 contacts_svc_value_set_bool(number, CTS_NUM_VAL_DELETE_BOOL, true);
1586 numberList = numberListSave;
1588 if (phoneNumbers->size() == 0 && numberList == NULL )
1592 for (size_t i = 0; i < phoneNumbers->size(); ++i)
1594 ContactPhoneNumberTypeArrayPtr types = phoneNumbers->at(i)->getTypes();
1595 number = contacts_svc_value_new(CTS_VALUE_NUMBER);
1599 for (size_t j = 0; j < types->size(); ++j)
1601 if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_WORK)
1602 type = type | CTS_NUM_TYPE_WORK;
1603 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_PREF)
1604 type = type | CTS_NUM_TYPE_NONE;
1605 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_HOME)
1606 type = type | CTS_NUM_TYPE_HOME;
1607 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_FAX)
1608 type = type | CTS_NUM_TYPE_FAX;
1609 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_CELL)
1610 type = type | CTS_NUM_TYPE_CELL;
1611 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_PAGER)
1612 type = type | CTS_NUM_TYPE_PAGER;
1613 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_CAR)
1614 type = type | CTS_NUM_TYPE_CAR;
1615 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_BBS)
1616 type = type | CTS_NUM_TYPE_BBS;
1617 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_MODEM)
1618 type = type | CTS_NUM_TYPE_MODEM;
1619 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_ISDN)
1620 type = type | CTS_NUM_TYPE_ISDN;
1621 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_VIDEO)
1622 type = type | CTS_NUM_TYPE_VIDEO;
1623 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_VOICE)
1624 type = type | CTS_NUM_TYPE_VOICE;
1625 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_MSG)
1626 type = type | CTS_NUM_TYPE_MSG;
1629 LogError("invalid phone type");
1630 type = CTS_NUM_TYPE_NONE;
1633 if (CTS_SUCCESS == contacts_svc_value_set_str(number, CTS_NUM_VAL_NUMBER_STR, phoneNumbers->at(i)->getNumber().c_str())
1634 && CTS_SUCCESS == contacts_svc_value_set_bool(number, CTS_NUM_VAL_DEFAULT_BOOL, type == CTS_NUM_TYPE_NONE)
1635 && CTS_SUCCESS == contacts_svc_value_set_int(number, CTS_NUM_VAL_TYPE_INT, type))
1637 numberList = g_slist_append(numberList, number);
1641 contacts_svc_value_free(number);
1642 properlyCreated = false;
1648 properlyCreated = false;
1651 if (!properlyCreated)
1656 if (properlyCreated)
1658 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_NUMBER_LIST, numberList))
1660 properlyCreated = false;
1663 for (; numberList; numberList = g_slist_next(numberList))
1665 contacts_svc_value_free(static_cast<CTSvalue*>(numberList->data));
1667 g_slist_free(numberList);
1668 return properlyCreated;
1671 bool ContactWrapper::convertToPlatformEmailObject()
1673 // LogDebug("entered");
1674 if (NULL == m_abstractContact)
1676 LogError("you should create empty abstract contact object first");
1680 if (NULL == m_platformContact)
1682 LogError("you should provide platform contact object first");
1687 ContactEmailAddressArrayPtr emails = m_abstractContact->getEmails();
1688 CTSvalue *email = NULL;
1689 bool properlyCreated = true;
1690 GSList *emailList = NULL;
1691 //mark existing items to delete them.
1692 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_EMAIL_LIST, &emailList))
1694 GSList *emailListSave = emailList;
1695 for (; emailList; emailList = g_slist_next(emailList))
1697 // LogDebug("clearing email list");
1698 CTSvalue* email = static_cast<CTSvalue*>(emailList->data);
1699 contacts_svc_value_set_bool(email, CTS_EMAIL_VAL_DELETE_BOOL, true);
1701 emailList = emailListSave;
1703 if (emails->size() == 0 && emailList == NULL)
1707 for (size_t i = 0; i < emails->size(); ++i)
1709 ContactEmailAddressTypeArrayPtr types = emails->at(i)->getTypes();
1710 email = contacts_svc_value_new(CTS_VALUE_EMAIL);
1714 for (size_t j = 0; j < types->size(); ++j)
1716 switch (types->at(j))
1718 case CONTACT_EMAIL_TYPE_HOME:
1719 type = type | CTS_EMAIL_TYPE_HOME;
1721 case CONTACT_EMAIL_TYPE_WORK:
1722 type = type | CTS_EMAIL_TYPE_WORK;
1724 case CONTACT_EMAIL_TYPE_PREF:
1725 type = type | CTS_EMAIL_TYPE_NONE;
1728 LogError("invalid phone type");
1729 type = CTS_EMAIL_TYPE_NONE;
1733 if (CTS_SUCCESS == contacts_svc_value_set_int(email, CTS_EMAIL_VAL_TYPE_INT, type)
1734 && CTS_SUCCESS == contacts_svc_value_set_str(email, CTS_EMAIL_VAL_ADDR_STR, emails->at(i)->getEmail().c_str()))
1736 emailList = g_slist_append(emailList, email);
1740 contacts_svc_value_free(email);
1741 properlyCreated = false;
1747 properlyCreated = false;
1751 if (!properlyCreated)
1756 if (properlyCreated)
1758 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_EMAIL_LIST, emailList))
1760 properlyCreated = false;
1763 for (; emailList; emailList = g_slist_next(emailList))
1765 contacts_svc_value_free(static_cast<CTSvalue*>(emailList->data));
1767 g_slist_free(emailList);
1768 return properlyCreated;
1771 bool ContactWrapper::convertToPlatformAddressObject()
1773 // LogDebug("entered");
1774 if (NULL == m_abstractContact)
1776 LogError("you should create empty abstract contact object first");
1780 if (NULL == m_platformContact)
1782 LogError("you should provide platform contact object first");
1787 ContactAddressArrayPtr addresses = m_abstractContact->getAddresses();
1788 bool properlyCreated = true;
1790 GSList *addressList = NULL;
1791 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_POSTAL_ADDR_LIST, &addressList))
1793 GSList *addressListSave = addressList;
1794 for (; addressList; addressList = g_slist_next(addressList))
1796 // LogDebug("clearing address list");
1797 CTSvalue* address = static_cast<CTSvalue*>(addressList->data);
1798 contacts_svc_value_set_bool(address, CTS_POSTAL_VAL_DELETE_BOOL, true);
1800 addressList = addressListSave;
1802 if (addresses->size() == 0 && addressList == NULL)
1806 for (size_t i = 0; i < addresses->size(); ++i)
1808 ContactAddressPtr contactAddress = addresses->at(i);
1809 ContactAddressTypeArrayPtr types = contactAddress->getTypes();
1811 CTSvalue *address = NULL;
1812 address = contacts_svc_value_new(CTS_VALUE_POSTAL);
1816 for (size_t j = 0; j < types->size(); ++j)
1818 switch (types->at(j))
1820 case CONTACT_ADDRESS_TYPE_PREF:
1821 type |= CTS_ADDR_TYPE_POSTAL; // TODO To be checked
1823 case CONTACT_ADDRESS_TYPE_WORK:
1824 type |= CTS_ADDR_TYPE_WORK;
1826 case CONTACT_ADDRESS_TYPE_HOME:
1827 type |= CTS_ADDR_TYPE_HOME;
1830 LogError("invalid address type");
1831 type |= CTS_EMAIL_TYPE_NONE;
1835 if (CTS_SUCCESS == contacts_svc_value_set_int(address, CTS_POSTAL_VAL_TYPE_INT, type)
1836 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_COUNTRY_STR, contactAddress->getCountry().c_str())
1837 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_REGION_STR, contactAddress->getRegion().c_str())
1838 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_LOCALITY_STR, contactAddress->getCity().c_str())
1839 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_STREET_STR, contactAddress->getStreetAddress().c_str())
1840 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_POBOX_STR, contactAddress->getAdditionalInformation().c_str())
1841 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_POSTALCODE_STR, contactAddress->getPostalCode().c_str())
1842 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_EXTENDED_STR, contactAddress->getAdditionalInformation().c_str()))
1844 addressList = g_slist_append(addressList, address);
1848 contacts_svc_value_free(address);
1849 properlyCreated = false;
1855 properlyCreated = false;
1859 if (!properlyCreated)
1865 if (properlyCreated)
1867 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_POSTAL_ADDR_LIST, addressList))
1869 properlyCreated = false;
1872 for (; addressList; addressList = g_slist_next(addressList))
1874 contacts_svc_value_free(static_cast<CTSvalue*>(addressList->data));
1877 g_slist_free(addressList);
1879 return properlyCreated;
1882 bool ContactWrapper::convertToPlatformBaseData()
1884 if (NULL == m_abstractContact)
1886 LogError("you should create empty abstract contact object first");
1890 if (NULL == m_platformContact)
1892 LogError("you should provide platform contact object first");
1897 *If name information is not existed, add name information
1898 * If name information is existed,update name information
1900 ContactNamePtr contactName = m_abstractContact->getName();
1901 bool isValueNew = false;
1902 CTSvalue *value = NULL;
1904 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, CTS_CF_NAME_VALUE, &value))
1906 value = contacts_svc_value_new(CTS_VALUE_NAME);
1913 if (CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_FIRST_STR, contactName->getFirstName().c_str())
1914 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_LAST_STR, contactName->getLastName().c_str())
1915 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_ADDITION_STR, contactName->getMiddleName().c_str())
1916 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_DISPLAY_STR, contactName->getDisplayName().c_str())
1917 // || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_SUFFIX_STR, contactName->getPhoneticName().c_str())
1918 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_PREFIX_STR, contactName->getPrefix().c_str()) )
1920 contacts_svc_value_free(value);
1925 && contactName->getFirstName().empty()
1926 && contactName->getLastName().empty()
1927 && contactName->getMiddleName().empty()
1928 && contactName->getDisplayName().empty()
1929 // && contactName->getPhoneticName().empty()
1930 && contactName->getPrefix().empty() )
1932 LogDebug("Nothing to store for ContactName");
1936 if(CTS_SUCCESS != contacts_svc_struct_store_value(m_platformContact, CTS_CF_NAME_VALUE, value))
1938 contacts_svc_value_free(value);
1942 contacts_svc_value_free(value);
1945 *If photo and ringtone uri information is not existed, add the information
1946 * If photo and ringtone uri is existed,update the information
1948 CTSvalue *baseinfo = NULL;
1949 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, &baseinfo))
1952 baseinfo = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO);
1955 if (m_abstractContact->getPhotoURIIsSet())
1957 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_IMG_PATH_STR, convertUriToPath(m_abstractContact->getPhotoURI()).c_str()))
1959 contacts_svc_value_free(baseinfo);
1964 if (m_abstractContact->getRingtoneURIIsSet())
1966 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_RINGTONE_PATH_STR, convertUriToPath(m_abstractContact->getRingtoneURI()).c_str()))
1968 contacts_svc_value_free(baseinfo);
1973 if (CTS_SUCCESS != contacts_svc_value_set_bool(baseinfo, CTS_BASE_VAL_FAVORITE_BOOL, m_abstractContact->getIsFavorite()))
1975 contacts_svc_value_free(baseinfo);
1979 if(m_abstractContact->getNoteIsSet())
1981 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_NOTE_STR, m_abstractContact->getNote().c_str()))
1983 contacts_svc_value_free(baseinfo);
1988 contacts_svc_struct_store_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, baseinfo);
1989 contacts_svc_value_free(baseinfo);
1998 const char * oldimgpath = NULL;
1999 oldimgpath = contacts_svc_value_get_str(baseinfo, CTS_BASE_VAL_IMG_PATH_STR);
2001 string strOldImagePath = "";
2002 if (NULL != oldimgpath)
2004 strOldImagePath = static_cast<string>(oldimgpath);
2007 string strNewImagePath = convertUriToPath(m_abstractContact->getPhotoURI());
2008 if (strOldImagePath != strNewImagePath)
2010 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_IMG_PATH_STR, strNewImagePath.c_str()))
2012 contacts_svc_value_free(baseinfo);
2017 const char * oldringtonepath = NULL;
2018 oldringtonepath = contacts_svc_value_get_str(baseinfo, CTS_BASE_VAL_IMG_PATH_STR);
2020 string strOldRingtonePath = "";
2021 if (NULL != oldringtonepath)
2023 strOldRingtonePath = static_cast<string>(oldringtonepath);
2026 string strNewRingtonePath = convertUriToPath(m_abstractContact->getRingtoneURI());
2027 if (strOldRingtonePath != strNewRingtonePath)
2029 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_RINGTONE_PATH_STR, strNewRingtonePath.c_str()))
2031 contacts_svc_value_free(baseinfo);
2036 if(m_abstractContact->getNoteIsSet())
2038 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_NOTE_STR, m_abstractContact->getNote().c_str()))
2040 contacts_svc_value_free(baseinfo);
2046 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_NOTE_STR, ""))
2048 contacts_svc_value_free(baseinfo);
2053 contacts_svc_struct_store_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, baseinfo);
2054 contacts_svc_value_free(baseinfo);
2057 //save company information
2058 CTSvalue *company = NULL;
2059 company = contacts_svc_value_new(CTS_VALUE_COMPANY);
2061 if (m_abstractContact->getOrganizations()->size() > 0) {
2063 contacts_svc_value_set_str(company, CTS_COMPANY_VAL_NAME_STR,
2064 m_abstractContact->getOrganizations()->at(0)->getName().c_str())
2067 contacts_svc_struct_store_value(m_platformContact,
2068 CTS_CF_COMPANY_VALUE, company))
2070 contacts_svc_value_free(company);
2074 contacts_svc_value_free(value);
2082 int ContactWrapper::getCustomTypeInContactsSvc(const string &typeName) const
2084 int structFieldType = -1;
2085 structFieldType = contacts_svc_find_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, const_cast<char*>(typeName.c_str()));
2086 if ( CTS_ERR_DB_RECORD_NOT_FOUND == structFieldType)
2088 LogDebug("CTS_ERR_DB_RECORD_NOT_FOUND!!");
2090 structFieldType = contacts_svc_insert_custom_type( CTS_TYPE_CLASS_EXTEND_DATA, const_cast<char*>(typeName.c_str()));
2091 if (CTS_SUCCESS > structFieldType)
2093 LogDebug("Create fail");
2096 else if (CTS_SUCCESS > structFieldType)
2098 LogDebug("contacts_svc_find_custom_type is fail");
2101 return structFieldType;
2104 void ContactWrapper::printPlatformObject()
2108 void ContactWrapper::printAbstractObject()
2112 string ContactWrapper::convertUriToPath(string str) const
2116 if(validate("^file\\:///[a-zA-Z]{2,3}(/\\S*)?$", str, VALIDATE_MATCH_CASELESS))
2117 result = str.substr(string("file://").size());
2118 else if(validate("^/[a-zA-Z]{2,3}(/\\S*)?$", str, VALIDATE_MATCH_CASELESS))
2124 string ContactWrapper::convertPathToUri(string str) const
2128 if(validate("^/[a-zA-Z]{2,3}(/\\S*)?$", str, VALIDATE_MATCH_CASELESS))
2129 result = "file://" + str;
2130 else if(validate("^file\\:///[a-zA-Z]{2,3}(/\\S*)?$", str, VALIDATE_MATCH_CASELESS))