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_NAME "phoneticName"
44 using namespace TizenApis::Api::Contact;
45 using namespace WrtDeviceApis::Commons;
48 ContactWrapper::ContactWrapper(IAddressBook::AddressBookType type) :
49 m_abstractContact(NULL),
50 m_platformContact(NULL),
51 m_platformContactOwnership(false)
53 //platform layer seems to not support different storage types yet
56 ContactWrapper::~ContactWrapper()
61 void ContactWrapper::freePlatformObject()
63 if (m_platformContact && m_platformContactOwnership)
65 contacts_svc_struct_free(m_platformContact);
66 m_platformContact = NULL;
67 m_platformContactOwnership = false;
71 void ContactWrapper::freeAbstractObject()
73 m_abstractContact = ContactPtr(NULL);
76 ContactPtr ContactWrapper::getAbstractContact() const
78 return m_abstractContact;
81 void ContactWrapper::setAbstractContact(const ContactPtr &contact, bool isConvertingVCard)
83 m_abstractContact = contact;
84 convertToPlatformObject(isConvertingVCard);
87 CTSstruct* ContactWrapper::getPlatformContact() const
89 return m_platformContact;
92 void ContactWrapper::setPlatformContact(CTSstruct* contact, bool isConvertingVCard)
97 m_platformContact = contact;
98 m_platformContactOwnership = false;
99 convertToAbstractObject(isConvertingVCard);
102 bool ContactWrapper::convertAbstractToPlatform(const ContactPtr &abstract, CTSstruct* platform, bool isConvertingVCard)
104 freePlatformObject();
105 freeAbstractObject();
107 m_abstractContact = abstract;
108 m_platformContact = platform;
109 m_platformContactOwnership = false;
111 return convertToPlatformObject(isConvertingVCard);
114 bool ContactWrapper::convertPlatformToAbstract(CTSstruct* platform, ContactPtr &abstract, bool isConvertingVCard)
116 freeAbstractObject();
117 freePlatformObject();
119 m_platformContact = platform;
120 m_platformContactOwnership = false;
121 m_abstractContact = abstract;
123 return convertToAbstractObject(isConvertingVCard);
126 bool ContactWrapper::convertToPlatformObject(bool isConvertingVCard)
130 freePlatformObject();
132 if (!m_abstractContact)
134 LogError("abstract object is not set");
138 //if abstrat object has id set then we have to read existing object and update it
139 if (m_abstractContact->getIdIsSet() && (isConvertingVCard == false))
141 LogDebug("reading existing contact");
142 contacts_svc_get_contact(atoi(m_abstractContact->getId().c_str()), &m_platformContact);
144 else // if no id is set then create new platform object
146 LogDebug("creating new contact");
147 m_platformContact = contacts_svc_struct_new(CTS_STRUCT_CONTACT);
148 m_platformContactOwnership = true;
151 if (!m_platformContact)
153 LogError("contact structure not created properly");
159 if (!convertToPlatformBaseData())
160 ThrowMsg(UnknownException, "error during converting base data");
162 if (!convertToPlatformAddressObject())
163 ThrowMsg(UnknownException, "error during converting address object");
165 if (!convertToPlatformEmailObject())
166 ThrowMsg(UnknownException, "error during converting email object");
168 if (!convertToPlatformPhoneObject())
169 ThrowMsg(UnknownException, "error during converting phone object");
171 if (!convertToPlatformNicknameObject())
172 ThrowMsg(UnknownException, "error during converting nickname object");
174 if (!convertToPlatformPhoneticnameObject())
175 ThrowMsg(UnknownException, "error during converting Phoneticname object");
177 if (!convertToPlatformGroupObject())
178 ThrowMsg(UnknownException, "error during converting group object");
180 if (!convertToPlatformUrlObject())
181 ThrowMsg(UnknownException, "error during converting url object");
183 if (!convertToPlatformOrganizationObject())
184 ThrowMsg(UnknownException, "error during converting organization object");
186 if (!convertToPlatformAnniversaryObject())
187 ThrowMsg(UnknownException, "error during converting anniversary object");
189 if (!convertToPlatformbirthdayObject())
190 ThrowMsg(UnknownException, "error during converting birthday object");
194 LogError("Error converting to platform object : " << _rethrown_exception.GetMessage());
196 freePlatformObject();
204 bool ContactWrapper::convertToAbstractObject(bool isConvertingVCard)
208 if (!m_platformContact)
211 CTSvalue *value = NULL;
213 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, &value))
216 if(m_abstractContact == NULL)
217 m_abstractContact = ContactPtr(new Contact());
219 if(!isConvertingVCard)
220 m_abstractContact->setId(contacts_svc_value_get_int(value, CTS_BASE_VAL_ID_INT));
222 const char *charValue;
224 charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_IMG_PATH_STR);
226 m_abstractContact->setPhotoURI(convertPathToUri(charValue));
228 charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR);
230 m_abstractContact->setRingtoneURI(convertPathToUri(charValue));
232 charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_NOTE_STR);
235 StringArrayPtr notes(new StringArray());
236 notes->push_back(charValue);
237 m_abstractContact->setNotes(notes);
242 if (!convertToAbstractBaseData())
243 ThrowMsg(UnknownException, "error during converting base data");
245 if (!convertToAbstractAddressObject())
246 ThrowMsg(UnknownException, "error during converting address object");
248 if (!convertToAbstractEmailObject())
249 ThrowMsg(UnknownException, "error during converting email object");
251 if (!convertToAbstractPhoneObject())
252 ThrowMsg(UnknownException, "error during converting phone object");
254 if (!convertToAbstractNicknameObject())
255 ThrowMsg(UnknownException, "error during converting nickname object");
257 if (!convertToAbstractPhoneticnameObject())
258 ThrowMsg(UnknownException, "error during converting phoneticName object");
260 if (!convertToAbstractGroupObject())
261 ThrowMsg(UnknownException, "error during converting group object");
263 if (!convertToAbstractUrlObject())
264 ThrowMsg(UnknownException, "error during converting url object");
266 if (!convertToAbstractOrganizationObject())
267 ThrowMsg(UnknownException, "error during converting organization object");
269 if (!convertToAbstractAnniversaryObject())
270 ThrowMsg(UnknownException, "error during converting anniversary object");
272 if (!convertToAbstractBirthdayObject())
273 ThrowMsg(UnknownException, "error during converting birthday object");
277 LogError("Error converting to abstract object : " << _rethrown_exception.GetMessage());
278 freeAbstractObject();
286 bool ContactWrapper::convertToAbstractBaseData()
288 if (NULL == m_abstractContact)
290 LogError("you should create empty abstract contact object first");
294 if (NULL == m_platformContact)
296 LogError("you should provide platform contact object first");
300 CTSvalue *value = NULL;
303 errorCode = contacts_svc_struct_get_value(m_platformContact, CTS_CF_NAME_VALUE, &value);
304 if (CTS_SUCCESS == errorCode && value != NULL)
306 const char *charValue = NULL;
307 ContactNamePtr contactName(new ContactName);
309 charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_FIRST_STR);
311 contactName->setFirstName(charValue);
313 charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_ADDITION_STR);
315 contactName->setMiddleName(charValue);
317 charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_LAST_STR);
319 contactName->setLastName(charValue);
321 charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_DISPLAY_STR);
323 contactName->setDisplayName(charValue);
325 charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_PREFIX_STR);
327 contactName->setPrefix(charValue);
329 //charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_SUFFIX_STR);
331 // contactName->setPhoneticName(charValue);
333 m_abstractContact->setName(contactName);
335 else if (errorCode != CTS_ERR_NO_DATA || value == NULL)
340 // errorCode = contacts_svc_struct_get_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, &value);
341 // if (CTS_SUCCESS == errorCode && value != NULL)
343 // const char *charValue = NULL;
345 // charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_IMG_PATH_STR);
347 // m_abstractContact->setPhotoURI(convertPathToUri(charValue));
349 // charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR);
351 // m_abstractContact->setRingtoneURI(convertPathToUri(charValue));
353 // bool boolValue = contacts_svc_value_get_bool(value, CTS_BASE_VAL_FAVORITE_BOOL);
355 // m_abstractContact->setIsFavorite(boolValue);
357 // charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_NOTE_STR);
359 // m_abstractContact->addNote(charValue);
361 // else if (errorCode != CTS_ERR_NO_DATA || value == NULL)
369 bool ContactWrapper::convertToAbstractAddressObject()
371 if (NULL == m_abstractContact)
373 LogError("you should create empty abstract contact object first");
377 if (NULL == m_platformContact)
379 LogError("you should provide platform contact object first");
383 ContactAddressArrayPtr addresses = ContactAddressArrayPtr(new ContactAddressArray());
385 GSList *addressList = NULL;
386 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_POSTAL_ADDR_LIST, &addressList);
387 if (CTS_SUCCESS == errorCode)
389 for (; addressList; addressList = g_slist_next(addressList))
391 ContactAddressPtr address(new ContactAddress());
392 addresses->push_back(address);
394 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_TYPE_INT);
395 if(type & CTS_ADDR_TYPE_POSTAL) // TODO to be checked
396 address->addType(CONTACT_ADDRESS_TYPE_PREF);
397 if(type & CTS_ADDR_TYPE_HOME)
398 address->addType(CONTACT_ADDRESS_TYPE_HOME);
399 if(type & CTS_ADDR_TYPE_WORK)
400 address->addType(CONTACT_ADDRESS_TYPE_WORK);
402 const char *charValue = NULL;
404 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_COUNTRY_STR);
406 address->setCountry(charValue);
408 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_REGION_STR);
410 address->setRegion(charValue);
412 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_LOCALITY_STR);
414 address->setCity(charValue);
416 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_STREET_STR);
418 address->setStreetAddress(charValue);
420 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_POSTALCODE_STR);
422 address->setPostalCode(charValue);
424 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_EXTENDED_STR);
426 address->setAdditionalInformation(charValue);
430 else if (errorCode != CTS_ERR_NO_DATA)
435 m_abstractContact->setAddresses(addresses);
440 bool ContactWrapper::convertToAbstractUrlObject()
442 if (NULL == m_abstractContact)
444 LogError("you should create empty abstract contact object first");
448 if (NULL == m_platformContact)
450 LogError("you should provide platform contact object first");
454 ContactWebSiteArrayPtr urls = ContactWebSiteArrayPtr(new ContactWebSiteArray());
456 GSList *urlList = NULL;
457 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_WEB_ADDR_LIST, &urlList);
458 if (CTS_SUCCESS == errorCode)
460 for (; urlList; urlList = g_slist_next(urlList))
462 ContactWebSitePtr url(new ContactWebSite());
463 urls->push_back(url);
465 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(urlList->data), CTS_WEB_VAL_TYPE_INT);
468 case CTS_WEB_TYPE_NONE:
469 url->setType(WEBSITE_TYPE_HOMEPAGE);
471 case CTS_WEB_TYPE_HOME:
472 url->setType(WEBSITE_TYPE_HOMEPAGE);
474 case CTS_WEB_TYPE_WORK:
475 url->setType(WEBSITE_TYPE_BLOG);
478 LogError("invalid url type");
479 url->setType(WEBSITE_TYPE_HOMEPAGE);
483 const char *charValue = NULL;
485 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(urlList->data), CTS_WEB_VAL_ADDR_STR);
487 url->setUrl(charValue);
491 else if (errorCode != CTS_ERR_NO_DATA)
496 m_abstractContact->setUrls(urls);
501 bool ContactWrapper::convertToAbstractOrganizationObject()
503 if (NULL == m_abstractContact)
505 LogError("you should create empty abstract contact object first");
509 if (NULL == m_platformContact)
511 LogError("you should provide platform contact object first");
515 CTSvalue *value = NULL;
518 ContactOrganizationPtr organization(new ContactOrganization());
520 errorCode = contacts_svc_struct_get_value(m_platformContact, CTS_CF_COMPANY_VALUE, &value);
521 if (CTS_SUCCESS == errorCode)
523 const char *charValue = NULL;
525 charValue = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_NAME_STR);
527 organization->setName(charValue);
529 charValue = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_DEPARTMENT_STR);
531 organization->setDepartment(charValue);
533 charValue = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_JOB_TITLE_STR);
535 organization->setTitle(charValue);
537 charValue = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_ROLE_STR);
539 organization->setRole(charValue);
542 else if (errorCode != CTS_ERR_NO_DATA)
547 m_abstractContact->setOrganization(organization);
552 bool ContactWrapper::convertToAbstractAnniversaryObject()
554 if (NULL == m_abstractContact)
556 LogError("you should create empty abstract contact object first");
560 if (NULL == m_platformContact)
562 LogError("you should provide platform contact object first");
566 ContactAnniversaryArrayPtr anniversaries(new ContactAnniversaryArray());
568 GSList *eventList = NULL;
569 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_EVENT_LIST, &eventList);
570 if (CTS_SUCCESS == errorCode)
572 for (; eventList; eventList = g_slist_next(eventList))
574 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(eventList->data), CTS_EVENT_VAL_TYPE_INT);
575 int db_date = contacts_svc_value_get_int(static_cast<CTSvalue*>(eventList->data), CTS_EVENT_VAL_DATE_INT);
577 if (type == CTS_EVENT_TYPE_ANNIVERSARY)
579 ContactAnniversaryPtr anniversary = ContactAnniversaryPtr(new ContactAnniversary());
583 tm_date.tm_year = (db_date / 10000) - 1900;
584 tm_date.tm_mon = ((db_date - ((tm_date.tm_year + 1900) * 10000)) / 100) - 1;
585 tm_date.tm_mday = (db_date - ((tm_date.tm_year + 1900) * 10000) - tm_date.tm_mon * 100);
587 anniversary->setDate(tm_date);
590 // anniv->setLabel(string("ANNIVERSARY"));
592 anniversaries->push_back(anniversary);
596 else if (errorCode != CTS_ERR_NO_DATA)
601 m_abstractContact->setAnniversaries(anniversaries);
606 bool ContactWrapper::convertToAbstractBirthdayObject()
608 if (NULL == m_abstractContact)
610 LogError("you should create empty abstract contact object first");
614 if (NULL == m_platformContact)
616 LogError("you should provide platform contact object first");
620 GSList *eventList = NULL;
621 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_EVENT_LIST, &eventList);
622 if (CTS_SUCCESS == errorCode)
624 for (; eventList; eventList = g_slist_next(eventList))
626 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(eventList->data), CTS_EVENT_VAL_TYPE_INT);
627 int db_date = contacts_svc_value_get_int(static_cast<CTSvalue*>(eventList->data), CTS_EVENT_VAL_DATE_INT);
629 if (type == CTS_EVENT_TYPE_BIRTH)
633 tm_date.tm_year = (db_date / 10000) - 1900;
634 tm_date.tm_mon = ((db_date - ((tm_date.tm_year + 1900) * 10000)) / 100) - 1;
635 tm_date.tm_mday = (db_date - ((tm_date.tm_year + 1900) * 10000) - tm_date.tm_mon * 100);
637 m_abstractContact->setBirthday(tm_date);
642 else if (errorCode != CTS_ERR_NO_DATA)
650 bool ContactWrapper::convertToAbstractEmailObject()
652 if (NULL == m_abstractContact)
654 LogError("you should create empty abstract contact object first");
658 if (NULL == m_platformContact)
660 LogError("you should provide platform contact object first");
664 ContactEmailAddressArrayPtr emailAddresses(new ContactEmailAddressArray());
666 GSList *emailList = NULL;
667 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_EMAIL_LIST, &emailList);
668 if (CTS_SUCCESS == errorCode)
670 for (; emailList; emailList = g_slist_next(emailList))
672 ContactEmailAddressPtr email(new ContactEmailAddress());
674 emailAddresses->push_back(email);
676 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(emailList->data), CTS_EMAIL_VAL_TYPE_INT);
678 if(type | CTS_EMAIL_TYPE_NONE)
679 email->addType(CONTACT_EMAIL_TYPE_PREF);
680 if(type | CTS_EMAIL_TYPE_HOME)
681 email->addType(CONTACT_EMAIL_TYPE_HOME);
682 if(type | CTS_EMAIL_TYPE_WORK)
683 email->addType(CONTACT_EMAIL_TYPE_WORK);
685 const char *charValue = NULL;
687 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(emailList->data), CTS_EMAIL_VAL_ADDR_STR);
689 email->setEmail(charValue);
692 else if (errorCode != CTS_ERR_NO_DATA)
697 m_abstractContact->setEmails(emailAddresses);
702 bool ContactWrapper::convertToAbstractPhoneObject()
704 if (NULL == m_abstractContact)
706 LogError("you should create empty abstract contact object first");
710 if (NULL == m_platformContact)
712 LogError("you should provide platform contact object first");
716 ContactPhoneNumberArrayPtr phoneNumbers(new ContactPhoneNumberArray());
718 GSList *phoneList = NULL;
719 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_NUMBER_LIST, &phoneList);
720 if (CTS_SUCCESS == errorCode)
722 for (; phoneList; phoneList = g_slist_next(phoneList))
724 ContactPhoneNumberPtr phoneNumber(new ContactPhoneNumber());
725 phoneNumbers->push_back(phoneNumber);
727 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(phoneList->data), CTS_NUM_VAL_TYPE_INT);
728 if(type & CTS_NUM_TYPE_WORK)
729 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_WORK);
730 if(type & CTS_NUM_TYPE_NONE)
731 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_PREF);
732 if(type & CTS_NUM_TYPE_HOME)
733 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_HOME);
734 if(type & CTS_NUM_TYPE_FAX)
735 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_FAX);
736 if(type & CTS_NUM_TYPE_CELL)
737 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_CELL);
738 if(type & CTS_NUM_TYPE_PAGER)
739 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_PAGER);
740 if(type & CTS_NUM_TYPE_CAR)
741 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_CAR);
742 if(type & CTS_NUM_TYPE_VOICE)
743 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_VOICE);
744 if(type & CTS_NUM_TYPE_MSG)
745 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_MSG);
746 if(type & CTS_NUM_TYPE_BBS)
747 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_BBS);
748 if(type & CTS_NUM_TYPE_ISDN)
749 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_ISDN);
750 if(type & CTS_NUM_TYPE_VIDEO)
751 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_VIDEO);
752 if(type & CTS_NUM_TYPE_PCS)
753 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_PCS);
754 if(type & CTS_NUM_TYPE_WORK)
755 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_WORK);
756 if(type & CTS_NUM_TYPE_WORK)
757 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_WORK);
759 const char *charValue = NULL;
761 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(phoneList->data), CTS_NUM_VAL_NUMBER_STR);
763 phoneNumber->setNumber(charValue);
766 else if (errorCode != CTS_ERR_NO_DATA)
771 m_abstractContact->setPhoneNumbers(phoneNumbers);
776 bool ContactWrapper::convertToAbstractNicknameObject()
778 if (NULL == m_abstractContact)
780 LogError("you should create empty abstract contact object first");
784 if (NULL == m_platformContact)
786 LogError("you should provide platform contact object first");
790 StringArrayPtr nickNames(new StringArray());
792 GSList *nicknNameList = NULL;
793 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_NICKNAME_LIST, &nicknNameList);
794 if (CTS_SUCCESS == errorCode)
796 for (; nicknNameList; nicknNameList = g_slist_next(nicknNameList))
798 const char *charValue = NULL;
799 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(nicknNameList->data), CTS_NICKNAME_VAL_NAME_STR);
801 nickNames->push_back(charValue);
804 else if (errorCode != CTS_ERR_NO_DATA)
809 m_abstractContact->getName()->setNicknames(nickNames);
814 bool ContactWrapper::convertToAbstractPhoneticnameObject()
816 if (NULL == m_abstractContact)
818 LogError("you should create empty abstract contact object first");
822 if (NULL == m_platformContact)
824 LogError("you should provide platform contact object first");
828 int structFieldType = 0;
829 structFieldType = getCustomTypeInContactsSvc(CONTACT_ATTRIBUTE_PHONETIC_NAME);
830 if (structFieldType < CTS_SUCCESS)
832 LogError("Phonetic name struct type is not found!!");
836 CTSvalue *value = NULL;
838 errorCode = contacts_svc_struct_get_value(m_platformContact, static_cast<cts_struct_field>(structFieldType), &value);
839 if (CTS_SUCCESS == errorCode)
843 const char *charValue = NULL;
844 charValue = contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA2_STR);
846 m_abstractContact->getName()->setPhoneticName(charValue);
853 else if (errorCode != CTS_ERR_NO_DATA)
861 bool ContactWrapper::convertToAbstractGroupObject()
863 if (NULL == m_abstractContact)
865 LogError("you should create empty abstract contact object first");
869 if (NULL == m_platformContact)
871 LogError("you should provide platform contact object first");
875 StringArrayPtr categories(new StringArray());
877 GSList *groupList = NULL;
878 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_GROUPREL_LIST, &groupList);
879 if (CTS_SUCCESS == errorCode)
881 for (; groupList; groupList = g_slist_next(groupList))
883 const char *charValue = NULL;
884 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(groupList->data), CTS_GROUPREL_VAL_NAME_STR);
886 categories->push_back(charValue);
889 else if (errorCode != CTS_ERR_NO_DATA)
894 m_abstractContact->setCategories(categories);
899 bool ContactWrapper::convertToPlatformNicknameObject()
901 if (NULL == m_abstractContact)
903 LogError("you should create empty abstract contact object first");
907 if (NULL == m_platformContact)
909 LogError("you should provide platform contact object first");
913 StringArrayPtr nicknames = m_abstractContact->getName()->getNicknames();
915 bool properlyCreated = true;
917 GSList *nicknameList = NULL;
918 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_NICKNAME_LIST, &nicknameList))
920 GSList *nicknameListSave = nicknameList;
921 for (; nicknameList; nicknameList = g_slist_next(nicknameList))
923 CTSvalue* nickname = static_cast<CTSvalue*>(nicknameList->data);
924 contacts_svc_value_set_bool(nickname, CTS_NICKNAME_VAL_DELETE_BOOL, true);
926 nicknameList = nicknameListSave;
929 if (nicknames->size() == 0 && nicknameList == NULL)
933 for (size_t i = 0; i < nicknames->size(); ++i)
935 CTSvalue *nickname = NULL;
936 nickname = contacts_svc_value_new(CTS_VALUE_NICKNAME);
939 if (CTS_SUCCESS == contacts_svc_value_set_str(nickname, CTS_NICKNAME_VAL_NAME_STR, nicknames->at(i).c_str()))
941 nicknameList = g_slist_append(nicknameList, nickname);
945 contacts_svc_value_free(nickname);
946 properlyCreated = false;
952 properlyCreated = false;
959 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_NICKNAME_LIST, nicknameList))
961 properlyCreated = false;
965 return properlyCreated;
968 bool ContactWrapper::convertToPlatformPhoneticnameObject()
970 if (NULL == m_abstractContact)
972 LogError("you should create empty abstract contact object first");
976 if (NULL == m_platformContact)
978 LogError("you should provide platform contact object first");
982 int structFieldType = 0;
983 structFieldType = getCustomTypeInContactsSvc(CONTACT_ATTRIBUTE_PHONETIC_NAME);
984 if (structFieldType < CTS_SUCCESS)
986 LogError("Phonetic name struct type is not found!!");
991 *If phonetic name information is not existed, add phonetic name information
992 *If phonetic name information is existed,update phonetic name information
994 CTSvalue *value = NULL;
995 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, static_cast<cts_struct_field>(structFieldType), &value))
997 value = contacts_svc_value_new(CTS_VALUE_EXTEND);
1003 if (CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_EXTEND_VAL_DATA2_STR, m_abstractContact->getName()->getPhoneticName().c_str())
1004 || CTS_SUCCESS != contacts_svc_struct_store_value(m_platformContact, static_cast<cts_struct_field>(structFieldType), value))
1006 contacts_svc_value_free(value);
1010 contacts_svc_value_free(value);
1012 // LogDebug("RETURN TRUE!!!");
1016 bool ContactWrapper::convertToPlatformGroupObject()
1018 // LogDebug("entered");
1019 if (NULL == m_abstractContact)
1021 LogError("you should create empty abstract contact object first");
1025 if (NULL == m_platformContact)
1027 LogError("you should provide platform contact object first");
1031 StringArrayPtr groups = m_abstractContact->getCategories();
1032 CTSvalue *group = NULL;
1033 bool properlyCreated = true;
1034 GSList *groupList = NULL;
1035 //mark existing items to delete them.
1036 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_GROUPREL_LIST, &groupList))
1038 GSList *groupListSave = groupList;
1039 for (; groupList; groupList = g_slist_next(groupList))
1041 // LogDebug("clearing group list");
1042 CTSvalue* delgroup = static_cast<CTSvalue*>(groupList->data);
1043 contacts_svc_value_set_bool(delgroup, CTS_GROUPREL_VAL_DELETE_BOOL, true);
1045 groupList = groupListSave;
1047 if (groups->size() == 0 && groupList == NULL
1052 query_error error_code = QUERY_SUCCESS;
1053 GSList *groups_list = NULL;
1057 string accountIdStr = m_abstractContact->getAccount()->getAccountServiceId();
1058 stringstream ss(accountIdStr);
1061 LogError("Wrong account id");
1065 int addressBookId = find_addressbook_id(accountId, &error_code);
1066 if (error_code != QUERY_SUCCESS)
1069 CTSiter* group_iter;
1070 bool is_new_group = true;
1072 for (size_t i = 0; i < groups->size(); ++i)
1074 if (CTS_SUCCESS == contacts_svc_get_list(CTS_LIST_ALL_GROUP, &group_iter))
1076 while (CTS_SUCCESS == contacts_svc_iter_next(group_iter))
1078 CTSvalue *findgroup = contacts_svc_iter_get_info(group_iter);
1081 group_info_t* group_info = g_new0(group_info_t, 1);
1083 group_info->group_name = g_strdup(contacts_svc_value_get_str(findgroup, CTS_LIST_GROUP_NAME_STR));
1084 group_info->addressbook_id = contacts_svc_value_get_int(findgroup, CTS_GROUP_VAL_ADDRESSBOOK_ID_INT);
1085 group_info->group_id = contacts_svc_value_get_int(findgroup, CTS_GROUP_VAL_ID_INT);
1086 groups_list = g_slist_append(groups_list, group_info);
1091 group = contacts_svc_value_new(CTS_VALUE_GROUP_RELATION);
1095 //groupId = AddressBook::getGroupId(groups[i]);
1097 is_new_group = true;
1098 GSList* tmp_list = groups_list;
1101 group_info_t* info = (group_info_t*) tmp_list->data;
1103 if ((info->group_name != NULL) && (groups->at(i).compare(info->group_name) == 0)
1104 && (info->addressbook_id == addressBookId))
1106 is_new_group = false;
1107 groupId = info->group_id;
1109 if (info->group_name)
1110 free(info->group_name);
1112 tmp_list = g_slist_next(tmp_list);
1114 g_slist_free(groups_list);
1119 CTSvalue *new_group;
1120 new_group = contacts_svc_value_new(CTS_VALUE_GROUP);
1122 contacts_svc_value_set_str(new_group, CTS_GROUP_VAL_NAME_STR, (const char*) (groups->at(i).c_str()));
1123 contacts_svc_value_set_int(new_group, CTS_GROUP_VAL_ADDRESSBOOK_ID_INT, addressBookId);
1124 groupId = contacts_svc_insert_group(addressBookId, new_group);
1127 contacts_svc_value_free(new_group);
1129 // LogDebug("group id " << groupId);
1132 if (CTS_SUCCESS == contacts_svc_value_set_int(group, CTS_GROUPREL_VAL_ID_INT, groupId))
1134 groupList = g_slist_append(groupList, group);
1138 contacts_svc_value_free(group);
1139 properlyCreated = false;
1145 contacts_svc_value_free(group);
1146 properlyCreated = false;
1152 properlyCreated = false;
1156 if (properlyCreated)
1158 // LogDebug("storing group list");
1159 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_GROUPREL_LIST, groupList))
1161 properlyCreated = false;
1164 for (; groupList; groupList = g_slist_next(groupList))
1166 contacts_svc_value_free(static_cast<CTSvalue*>(groupList->data));
1168 g_slist_free(groupList);
1169 return properlyCreated;
1172 bool ContactWrapper::convertToPlatformUrlObject()
1174 // LogDebug("entered");
1175 if (NULL == m_abstractContact)
1177 LogError("you should create empty abstract contact object first");
1181 if (NULL == m_platformContact)
1183 LogError("you should provide platform contact object first");
1188 ContactWebSiteArrayPtr urls = m_abstractContact->getUrls();
1189 CTSvalue *url = NULL;
1190 bool properlyCreated = true;
1191 GSList *urlList = NULL;
1192 //mark existing items to delete them.
1193 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_WEB_ADDR_LIST, &urlList))
1195 GSList *urlListSave = urlList;
1196 for (; urlList; urlList = g_slist_next(urlList))
1198 // LogDebug("clearing url list");
1199 CTSvalue* tmp_email = static_cast<CTSvalue*>(urlList->data);
1200 contacts_svc_value_set_bool(tmp_email, CTS_WEB_VAL_DELETE_BOOL, true);
1202 urlList = urlListSave;
1204 if (urls->size() == 0 && urlList == NULL
1209 for (size_t i = 0; i < urls->size(); ++i)
1211 ContactWebSiteType types = urls->at(i)->getType();
1212 url = contacts_svc_value_new(CTS_VALUE_WEB);
1217 case WEBSITE_TYPE_HOMEPAGE:
1218 type = CTS_WEB_TYPE_HOME;
1220 case WEBSITE_TYPE_BLOG:
1221 type = CTS_WEB_TYPE_WORK;
1224 LogError("invalid phone type");
1225 type = CTS_WEB_TYPE_NONE;
1228 if (CTS_SUCCESS == contacts_svc_value_set_int(url, CTS_WEB_VAL_TYPE_INT, type)
1229 && CTS_SUCCESS == contacts_svc_value_set_str(url, CTS_WEB_VAL_ADDR_STR, urls->at(i)->getUrl().c_str()))
1231 urlList = g_slist_append(urlList, url);
1235 contacts_svc_value_free(url);
1236 properlyCreated = false;
1242 properlyCreated = false;
1246 if (!properlyCreated)
1252 if (properlyCreated)
1254 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_WEB_ADDR_LIST, urlList))
1256 properlyCreated = false;
1259 for (; urlList; urlList = g_slist_next(urlList))
1261 contacts_svc_value_free(static_cast<CTSvalue*>(urlList->data));
1263 g_slist_free(urlList);
1264 return properlyCreated;
1267 bool ContactWrapper::convertToPlatformOrganizationObject()
1269 // LogDebug("entered");
1270 if (NULL == m_abstractContact)
1272 LogError("you should create empty abstract contact object first");
1276 if (NULL == m_platformContact)
1278 LogError("you should provide platform contact object first");
1282 ContactOrganizationPtr org = m_abstractContact->getOrganization();
1283 CTSvalue *organization = NULL;
1285 //mark existing items to delete them.
1286 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, CTS_CF_COMPANY_VALUE, &organization))
1288 CTSvalue *value = contacts_svc_value_new(CTS_VALUE_COMPANY);
1291 if (CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_COMPANY_VAL_NAME_STR, org->getName().c_str())
1292 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_COMPANY_VAL_DEPARTMENT_STR, org->getDepartment().c_str())
1293 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_COMPANY_VAL_JOB_TITLE_STR, org->getTitle().c_str())
1294 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_COMPANY_VAL_ROLE_STR, org->getRole().c_str())
1295 || CTS_SUCCESS != contacts_svc_struct_store_value(m_platformContact, CTS_CF_COMPANY_VALUE, value))
1297 contacts_svc_value_free(value);
1300 contacts_svc_value_free(value);
1309 contacts_svc_value_set_str(organization, CTS_COMPANY_VAL_NAME_STR, org->getName().c_str());
1310 contacts_svc_value_set_str(organization, CTS_COMPANY_VAL_DEPARTMENT_STR, org->getDepartment().c_str());
1311 contacts_svc_value_set_str(organization, CTS_COMPANY_VAL_JOB_TITLE_STR, org->getTitle().c_str());
1312 contacts_svc_value_set_str(organization, CTS_COMPANY_VAL_ROLE_STR, org->getRole().c_str());
1313 contacts_svc_struct_store_value(m_platformContact, CTS_CF_COMPANY_VALUE, organization);
1314 contacts_svc_value_free(organization);
1320 bool ContactWrapper::convertToPlatformAnniversaryObject()
1322 // LogDebug("entered");
1323 if (NULL == m_abstractContact)
1325 LogError("you should create empty abstract contact object first");
1329 if (NULL == m_platformContact)
1331 LogError("you should provide platform contact object first");
1335 ContactAnniversaryArrayPtr anniversaries = m_abstractContact->getAnniversaries();
1336 CTSvalue *anniversary = NULL;
1337 bool properlyCreated = true;
1338 GSList *anniversaryList = NULL;
1340 //mark existing items to delete them.
1341 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_EVENT_LIST, &anniversaryList))
1343 GSList *anniversaryListSave = anniversaryList;
1344 for (; anniversaryList; anniversaryList = g_slist_next(anniversaryList))
1346 // LogDebug("clearing anniversary list");
1347 CTSvalue* tmp_anniversary = static_cast<CTSvalue*>(anniversaryList->data);
1348 contacts_svc_value_set_bool(tmp_anniversary, CTS_EVENT_VAL_DELETE_BOOL, true);
1350 anniversaryList = anniversaryListSave;
1352 if (anniversaries->size() == 0 && anniversaryList == NULL
1358 for (size_t i = 0; i < anniversaries->size(); ++i)
1361 std::tm abstract_date = anniversaries->at(i)->getDate();
1363 date = (abstract_date.tm_year + 1900) * 10000 + (abstract_date.tm_mon+1) * 100 + abstract_date.tm_mday;
1364 anniversary = contacts_svc_value_new(CTS_VALUE_EVENT);
1367 if (CTS_SUCCESS == contacts_svc_value_set_int(anniversary, CTS_EVENT_VAL_TYPE_INT, CTS_EVENT_TYPE_ANNIVERSARY)
1368 && CTS_SUCCESS == contacts_svc_value_set_int(anniversary, CTS_EVENT_VAL_DATE_INT, date))
1370 anniversaryList = g_slist_append(anniversaryList, anniversary);
1374 contacts_svc_value_free(anniversary);
1375 properlyCreated = false;
1381 properlyCreated = false;
1385 if (!properlyCreated)
1391 if (properlyCreated)
1393 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_EVENT_LIST, anniversaryList))
1395 properlyCreated = false;
1398 for (; anniversaryList; anniversaryList = g_slist_next(anniversaryList))
1400 contacts_svc_value_free(static_cast<CTSvalue*>(anniversaryList->data));
1402 g_slist_free(anniversaryList);
1403 return properlyCreated;
1406 bool ContactWrapper::convertToPlatformbirthdayObject()
1408 // LogDebug("entered");
1409 if (NULL == m_abstractContact)
1411 LogError("you should create empty abstract contact object first");
1415 if (NULL == m_platformContact)
1417 LogError("you should provide platform contact object first");
1421 tm birth_date = m_abstractContact->getBirthday();
1423 CTSvalue *birthday = NULL;
1424 bool properlyCreated = true;
1425 GSList *anniversaryList = NULL;
1427 //mark existing items to delete them.
1428 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_EVENT_LIST, &anniversaryList))
1430 GSList *anniversaryListSave = anniversaryList;
1431 for (; anniversaryList; anniversaryList = g_slist_next(anniversaryList))
1433 // LogDebug("clearing anniversary list");
1434 CTSvalue* tmp_anniversary = static_cast<CTSvalue*>(anniversaryList->data);
1435 int type = contacts_svc_value_get_int(tmp_anniversary, CTS_EVENT_VAL_TYPE_INT);
1436 if (type == CTS_EVENT_TYPE_BIRTH)
1437 contacts_svc_value_set_bool(tmp_anniversary, CTS_EVENT_VAL_DELETE_BOOL, true);
1439 anniversaryList = anniversaryListSave;
1441 if (birth_date.tm_year == 0 && birth_date.tm_mon == 0 && birth_date.tm_mday == 0 && anniversaryList == NULL
1447 date = (birth_date.tm_year + 1900) * 10000 + (birth_date.tm_mon+1) * 100 + birth_date.tm_mday;
1448 // for (size_t i = 0; i < anniversaries->size(); ++i) {
1449 birthday = contacts_svc_value_new(CTS_VALUE_EVENT);
1453 if (CTS_SUCCESS == contacts_svc_value_set_int(birthday, CTS_EVENT_VAL_TYPE_INT, CTS_EVENT_TYPE_BIRTH)
1454 && CTS_SUCCESS == contacts_svc_value_set_int(birthday, CTS_EVENT_VAL_DATE_INT, date))
1456 anniversaryList = g_slist_append(anniversaryList, birthday);
1460 contacts_svc_value_free(birthday);
1461 properlyCreated = false;
1467 properlyCreated = false;
1471 // if (!properlyCreated) {
1476 if (properlyCreated)
1478 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_EVENT_LIST, anniversaryList))
1480 properlyCreated = false;
1483 for (; anniversaryList; anniversaryList = g_slist_next(anniversaryList))
1485 contacts_svc_value_free(static_cast<CTSvalue*>(anniversaryList->data));
1487 g_slist_free(anniversaryList);
1488 return properlyCreated;
1491 bool ContactWrapper::convertToPlatformPhoneObject()
1493 // LogDebug("entered");
1494 if (NULL == m_abstractContact)
1496 LogError("you should create empty abstract contact object first");
1500 if (NULL == m_platformContact)
1502 LogError("you should provide platform contact object first");
1507 ContactPhoneNumberArrayPtr phoneNumbers = m_abstractContact->getPhoneNumbers();
1508 bool properlyCreated = true;
1509 CTSvalue *number = NULL;
1510 GSList *numberList = NULL;
1511 //mark existing items to delete them.
1512 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_NUMBER_LIST, &numberList))
1514 GSList *numberListSave = numberList;
1515 for (; numberList; numberList = g_slist_next(numberList))
1517 // LogDebug("clearing phone list");
1518 CTSvalue* number = static_cast<CTSvalue*>(numberList->data);
1519 contacts_svc_value_set_bool(number, CTS_NUM_VAL_DELETE_BOOL, true);
1521 numberList = numberListSave;
1523 if (phoneNumbers->size() == 0 && numberList == NULL )
1527 for (size_t i = 0; i < phoneNumbers->size(); ++i)
1529 ContactPhoneNumberTypeArrayPtr types = phoneNumbers->at(i)->getTypes();
1530 number = contacts_svc_value_new(CTS_VALUE_NUMBER);
1534 for (size_t j = 0; j < types->size(); ++j)
1536 if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_WORK)
1537 type = type | CTS_NUM_TYPE_WORK;
1538 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_PREF)
1539 type = type | CTS_NUM_TYPE_NONE;
1540 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_HOME)
1541 type = type | CTS_NUM_TYPE_HOME;
1542 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_FAX)
1543 type = type | CTS_NUM_TYPE_FAX;
1544 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_CELL)
1545 type = type | CTS_NUM_TYPE_CELL;
1546 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_PAGER)
1547 type = type | CTS_NUM_TYPE_PAGER;
1548 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_CAR)
1549 type = type | CTS_NUM_TYPE_CAR;
1550 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_BBS)
1551 type = type | CTS_NUM_TYPE_BBS;
1552 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_MODEM)
1553 type = type | CTS_NUM_TYPE_MODEM;
1554 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_ISDN)
1555 type = type | CTS_NUM_TYPE_ISDN;
1556 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_VIDEO)
1557 type = type | CTS_NUM_TYPE_VIDEO;
1558 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_VOICE)
1559 type = type | CTS_NUM_TYPE_VOICE;
1560 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_MSG)
1561 type = type | CTS_NUM_TYPE_MSG;
1564 LogError("invalid phone type");
1565 type = CTS_NUM_TYPE_NONE;
1568 if (CTS_SUCCESS == contacts_svc_value_set_str(number, CTS_NUM_VAL_NUMBER_STR, phoneNumbers->at(i)->getNumber().c_str())
1569 && CTS_SUCCESS == contacts_svc_value_set_bool(number, CTS_NUM_VAL_DEFAULT_BOOL, type == CTS_NUM_TYPE_NONE)
1570 && CTS_SUCCESS == contacts_svc_value_set_int(number, CTS_NUM_VAL_TYPE_INT, type))
1572 numberList = g_slist_append(numberList, number);
1576 contacts_svc_value_free(number);
1577 properlyCreated = false;
1583 properlyCreated = false;
1586 if (!properlyCreated)
1591 if (properlyCreated)
1593 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_NUMBER_LIST, numberList))
1595 properlyCreated = false;
1598 for (; numberList; numberList = g_slist_next(numberList))
1600 contacts_svc_value_free(static_cast<CTSvalue*>(numberList->data));
1602 g_slist_free(numberList);
1603 return properlyCreated;
1606 bool ContactWrapper::convertToPlatformEmailObject()
1608 // LogDebug("entered");
1609 if (NULL == m_abstractContact)
1611 LogError("you should create empty abstract contact object first");
1615 if (NULL == m_platformContact)
1617 LogError("you should provide platform contact object first");
1622 ContactEmailAddressArrayPtr emails = m_abstractContact->getEmails();
1623 CTSvalue *email = NULL;
1624 bool properlyCreated = true;
1625 GSList *emailList = NULL;
1626 //mark existing items to delete them.
1627 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_EMAIL_LIST, &emailList))
1629 GSList *emailListSave = emailList;
1630 for (; emailList; emailList = g_slist_next(emailList))
1632 // LogDebug("clearing email list");
1633 CTSvalue* email = static_cast<CTSvalue*>(emailList->data);
1634 contacts_svc_value_set_bool(email, CTS_EMAIL_VAL_DELETE_BOOL, true);
1636 emailList = emailListSave;
1638 if (emails->size() == 0 && emailList == NULL)
1642 for (size_t i = 0; i < emails->size(); ++i)
1644 ContactEmailAddressTypeArrayPtr types = emails->at(i)->getTypes();
1645 email = contacts_svc_value_new(CTS_VALUE_EMAIL);
1649 for (size_t j = 0; j < types->size(); ++j)
1651 switch (types->at(j))
1653 case CONTACT_EMAIL_TYPE_HOME:
1654 type = type | CTS_EMAIL_TYPE_HOME;
1656 case CONTACT_EMAIL_TYPE_WORK:
1657 type = type | CTS_EMAIL_TYPE_WORK;
1659 case CONTACT_EMAIL_TYPE_PREF:
1660 type = type | CTS_EMAIL_TYPE_NONE;
1663 LogError("invalid phone type");
1664 type = CTS_EMAIL_TYPE_NONE;
1668 if (CTS_SUCCESS == contacts_svc_value_set_int(email, CTS_EMAIL_VAL_TYPE_INT, type)
1669 && CTS_SUCCESS == contacts_svc_value_set_str(email, CTS_EMAIL_VAL_ADDR_STR, emails->at(i)->getEmail().c_str()))
1671 emailList = g_slist_append(emailList, email);
1675 contacts_svc_value_free(email);
1676 properlyCreated = false;
1682 properlyCreated = false;
1686 if (!properlyCreated)
1691 if (properlyCreated)
1693 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_EMAIL_LIST, emailList))
1695 properlyCreated = false;
1698 for (; emailList; emailList = g_slist_next(emailList))
1700 contacts_svc_value_free(static_cast<CTSvalue*>(emailList->data));
1702 g_slist_free(emailList);
1703 return properlyCreated;
1706 bool ContactWrapper::convertToPlatformAddressObject()
1708 // LogDebug("entered");
1709 if (NULL == m_abstractContact)
1711 LogError("you should create empty abstract contact object first");
1715 if (NULL == m_platformContact)
1717 LogError("you should provide platform contact object first");
1722 ContactAddressArrayPtr addresses = m_abstractContact->getAddresses();
1723 bool properlyCreated = true;
1725 GSList *addressList = NULL;
1726 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_POSTAL_ADDR_LIST, &addressList))
1728 GSList *addressListSave = addressList;
1729 for (; addressList; addressList = g_slist_next(addressList))
1731 // LogDebug("clearing address list");
1732 CTSvalue* address = static_cast<CTSvalue*>(addressList->data);
1733 contacts_svc_value_set_bool(address, CTS_POSTAL_VAL_DELETE_BOOL, true);
1735 addressList = addressListSave;
1737 if (addresses->size() == 0 && addressList == NULL)
1741 for (size_t i = 0; i < addresses->size(); ++i)
1743 ContactAddressTypeArrayPtr types = addresses->at(i)->getTypes();
1745 CTSvalue *address = NULL;
1746 address = contacts_svc_value_new(CTS_VALUE_POSTAL);
1750 for (size_t j = 0; j < types->size(); ++j)
1752 switch (types->at(j))
1754 case CONTACT_ADDRESS_TYPE_PREF:
1755 type |= CTS_ADDR_TYPE_POSTAL; // TODO To be checked
1757 case CONTACT_ADDRESS_TYPE_WORK:
1758 type |= CTS_ADDR_TYPE_WORK;
1760 case CONTACT_ADDRESS_TYPE_HOME:
1761 type |= CTS_ADDR_TYPE_HOME;
1764 LogError("invalid address type");
1765 type |= CTS_EMAIL_TYPE_NONE;
1769 if (CTS_SUCCESS == contacts_svc_value_set_int(address, CTS_POSTAL_VAL_TYPE_INT, type)
1770 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_COUNTRY_STR, addresses->at(i)->getCountry().c_str())
1771 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_REGION_STR, addresses->at(i)->getRegion().c_str())
1772 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_LOCALITY_STR, addresses->at(i)->getCity().c_str())
1773 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_STREET_STR, addresses->at(i)->getStreetAddress().c_str())
1774 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_POBOX_STR, addresses->at(i)->getAdditionalInformation().c_str())
1775 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_POSTALCODE_STR, addresses->at(i)->getPostalCode().c_str())
1776 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_EXTENDED_STR, addresses->at(i)->getAdditionalInformation().c_str()))
1778 addressList = g_slist_append(addressList, address);
1782 contacts_svc_value_free(address);
1783 properlyCreated = false;
1789 properlyCreated = false;
1793 if (!properlyCreated)
1799 if (properlyCreated)
1801 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_POSTAL_ADDR_LIST, addressList))
1803 properlyCreated = false;
1806 for (; addressList; addressList = g_slist_next(addressList))
1808 contacts_svc_value_free(static_cast<CTSvalue*>(addressList->data));
1811 g_slist_free(addressList);
1813 return properlyCreated;
1816 bool ContactWrapper::convertToPlatformBaseData()
1818 if (NULL == m_abstractContact)
1820 LogError("you should create empty abstract contact object first");
1824 if (NULL == m_platformContact)
1826 LogError("you should provide platform contact object first");
1831 *If name information is not existed, add name information
1832 * If name information is existed,update name information
1834 CTSvalue *value = NULL;
1836 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, CTS_CF_NAME_VALUE, &value))
1838 CTSvalue *value = contacts_svc_value_new(CTS_VALUE_NAME);
1841 ContactNamePtr contactName = m_abstractContact->getName();
1842 if (CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_FIRST_STR, contactName->getFirstName().c_str())
1843 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_LAST_STR, contactName->getLastName().c_str())
1844 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_ADDITION_STR, contactName->getMiddleName().c_str())
1845 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_DISPLAY_STR, contactName->getDisplayName().c_str())
1846 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_PREFIX_STR, contactName->getPrefix().c_str())
1847 // || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_SUFFIX_STR, contactName->getPhoneticName().c_str())
1848 || CTS_SUCCESS != contacts_svc_struct_store_value(m_platformContact, CTS_CF_NAME_VALUE, value))
1850 contacts_svc_value_free(value);
1853 contacts_svc_value_free(value);
1862 ContactNamePtr contactName = m_abstractContact->getName();
1863 if (CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_FIRST_STR, contactName->getFirstName().c_str())
1864 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_LAST_STR, contactName->getLastName().c_str())
1865 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_ADDITION_STR, contactName->getMiddleName().c_str())
1866 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_DISPLAY_STR, contactName->getDisplayName().c_str())
1867 // || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_SUFFIX_STR, contactName->getPhoneticName().c_str())
1868 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_PREFIX_STR, contactName->getPrefix().c_str()))
1870 contacts_svc_value_free(value);
1873 contacts_svc_value_free(value);
1877 *If photo and ringtone uri information is not existed, add the information
1878 * If photo and ringtone uri is existed,update the information
1880 CTSvalue *baseinfo = NULL;
1881 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, &baseinfo))
1884 baseinfo = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO);
1887 if (m_abstractContact->getPhotoURIIsSet())
1889 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_IMG_PATH_STR, convertUriToPath(m_abstractContact->getPhotoURI()).c_str()))
1891 contacts_svc_value_free(baseinfo);
1896 if (m_abstractContact->getRingtoneURIIsSet())
1898 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_RINGTONE_PATH_STR, convertUriToPath(m_abstractContact->getRingtoneURI()).c_str()))
1900 contacts_svc_value_free(baseinfo);
1905 if (CTS_SUCCESS != contacts_svc_value_set_bool(baseinfo, CTS_BASE_VAL_FAVORITE_BOOL, m_abstractContact->getIsFavorite()))
1907 contacts_svc_value_free(baseinfo);
1911 if(m_abstractContact->getNotesNum() > 0)
1913 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_NOTE_STR, m_abstractContact->getNotes()->at(0).c_str()))
1915 contacts_svc_value_free(baseinfo);
1920 contacts_svc_struct_store_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, baseinfo);
1921 contacts_svc_value_free(baseinfo);
1930 const char * oldimgpath = NULL;
1931 oldimgpath = contacts_svc_value_get_str(baseinfo, CTS_BASE_VAL_IMG_PATH_STR);
1933 string strOldImagePath = "";
1934 if (NULL != oldimgpath)
1936 strOldImagePath = static_cast<string>(oldimgpath);
1939 string strNewImagePath = convertUriToPath(m_abstractContact->getPhotoURI());
1940 if (strOldImagePath != strNewImagePath)
1942 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_IMG_PATH_STR, strNewImagePath.c_str()))
1944 contacts_svc_value_free(baseinfo);
1949 const char * oldringtonepath = NULL;
1950 oldringtonepath = contacts_svc_value_get_str(baseinfo, CTS_BASE_VAL_IMG_PATH_STR);
1952 string strOldRingtonePath = "";
1953 if (NULL != oldringtonepath)
1955 strOldRingtonePath = static_cast<string>(oldringtonepath);
1958 string strNewRingtonePath = convertUriToPath(m_abstractContact->getRingtoneURI());
1959 if (strOldRingtonePath != strNewRingtonePath)
1961 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_RINGTONE_PATH_STR, strNewRingtonePath.c_str()))
1963 contacts_svc_value_free(baseinfo);
1968 if(m_abstractContact->getNotesNum() > 0)
1970 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_NOTE_STR, m_abstractContact->getNotes()->at(0).c_str()))
1972 contacts_svc_value_free(baseinfo);
1978 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_NOTE_STR, ""))
1980 contacts_svc_value_free(baseinfo);
1985 contacts_svc_struct_store_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, baseinfo);
1986 contacts_svc_value_free(baseinfo);
1989 //save company information
1990 CTSvalue *company = NULL;
1991 company = contacts_svc_value_new(CTS_VALUE_COMPANY);
1993 if (m_abstractContact->getOrganizations()->size() > 0) {
1995 contacts_svc_value_set_str(company, CTS_COMPANY_VAL_NAME_STR,
1996 m_abstractContact->getOrganizations()->at(0)->getName().c_str())
1999 contacts_svc_struct_store_value(m_platformContact,
2000 CTS_CF_COMPANY_VALUE, company))
2002 contacts_svc_value_free(company);
2006 contacts_svc_value_free(value);
2014 int ContactWrapper::getCustomTypeInContactsSvc(const string &typeName) const
2016 int structFieldType = -1;
2017 structFieldType = contacts_svc_find_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, const_cast<char*>(typeName.c_str()));
2018 if ( CTS_ERR_DB_RECORD_NOT_FOUND == structFieldType)
2020 LogDebug("CTS_ERR_DB_RECORD_NOT_FOUND!!");
2022 structFieldType = contacts_svc_insert_custom_type( CTS_TYPE_CLASS_EXTEND_DATA, const_cast<char*>(typeName.c_str()));
2023 if (CTS_SUCCESS > structFieldType)
2025 LogDebug("Create fail");
2028 else if (CTS_SUCCESS > structFieldType)
2030 LogDebug("contacts_svc_find_custom_type is fail");
2033 return structFieldType;
2036 void ContactWrapper::printPlatformObject()
2040 void ContactWrapper::printAbstractObject()
2044 string ContactWrapper::convertUriToPath(string str) const
2048 if(validate("^file\\:///[a-zA-Z]{2,3}(/\\S*)?$", str, VALIDATE_MATCH_CASELESS))
2049 result = str.substr(string("file://").size());
2050 else if(validate("^/[a-zA-Z]{2,3}(/\\S*)?$", str, VALIDATE_MATCH_CASELESS))
2056 string ContactWrapper::convertPathToUri(string str) const
2060 if(validate("^/[a-zA-Z]{2,3}(/\\S*)?$", str, VALIDATE_MATCH_CASELESS))
2061 result = "file://" + str;
2062 else if(validate("^file\\:///[a-zA-Z]{2,3}(/\\S*)?$", str, VALIDATE_MATCH_CASELESS))