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)
52 //platform layer seems to not support different storage types yet
54 if ( type == IAddressBook::PhoneBook )
57 else if ( type == IAddressBook::SIMBook )
62 LogError("invalid storage type");
67 ContactWrapper::~ContactWrapper()
72 void ContactWrapper::freePlatformObject()
74 if (m_platformContact)
76 contacts_svc_struct_free(m_platformContact);
77 m_platformContact = NULL;
81 void ContactWrapper::freeAbstractObject()
83 m_abstractContact = ContactPtr(NULL);
86 ContactPtr ContactWrapper::getAbstractContact() const
88 return m_abstractContact;
91 void ContactWrapper::setAbstractContact(const ContactPtr &contact, bool isConvertingVCard)
93 m_abstractContact = contact;
94 convertToPlatformObject(isConvertingVCard);
97 CTSstruct* ContactWrapper::getPlatformContact() const
99 return m_platformContact;
102 void ContactWrapper::setPlatformContact(CTSstruct* contact)
104 freePlatformObject();
105 m_platformContact = contact;
106 convertToAbstractObject();
109 bool ContactWrapper::convertToPlatformObject(bool isConvertingVCard)
113 freePlatformObject();
115 if (!m_abstractContact)
117 LogError("abstract object is not set");
121 //if abstrat object has id set then we have to read existing object and update it
122 if (m_abstractContact->getIdIsSet() && (isConvertingVCard == false))
124 LogDebug("reading existing contact");
125 contacts_svc_get_contact(atoi(m_abstractContact->getId().c_str()), &m_platformContact);
127 else // if no id is set then create new platform object
129 LogDebug("creating new contact");
130 m_platformContact = contacts_svc_struct_new(CTS_STRUCT_CONTACT);
133 if (!m_platformContact)
135 LogError("contact structure not created properly");
141 if (!convertToPlatformBaseData())
142 ThrowMsg(UnknownException, "error during converting base data");
144 if (!convertToPlatformAddressObject())
145 ThrowMsg(UnknownException, "error during converting address object");
147 if (!convertToPlatformEmailObject())
148 ThrowMsg(UnknownException, "error during converting email object");
150 if (!convertToPlatformPhoneObject())
151 ThrowMsg(UnknownException, "error during converting phone object");
153 if (!convertToPlatformNicknameObject())
154 ThrowMsg(UnknownException, "error during converting nickname object");
156 if (!convertToPlatformPhoneticnameObject())
157 ThrowMsg(UnknownException, "error during converting Phoneticname object");
159 if (!convertToPlatformGroupObject())
160 ThrowMsg(UnknownException, "error during converting group object");
162 if (!convertToPlatformUrlObject())
163 ThrowMsg(UnknownException, "error during converting url object");
165 if (!convertToPlatformOrganizationObject())
166 ThrowMsg(UnknownException, "error during converting organization object");
168 if (!convertToPlatformAnniversaryObject())
169 ThrowMsg(UnknownException, "error during converting anniversary object");
171 if (!convertToPlatformbirthdayObject())
172 ThrowMsg(UnknownException, "error during converting birthday object");
176 LogError("Error converting to platform object : " << _rethrown_exception.GetMessage());
178 freePlatformObject();
186 bool ContactWrapper::convertToAbstractObject()
190 freeAbstractObject();
192 if (!m_platformContact)
195 CTSvalue *value = NULL;
197 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, &value))
200 m_abstractContact = ContactPtr(new Contact());
201 m_abstractContact->setId(contacts_svc_value_get_int(value, CTS_BASE_VAL_ID_INT));
203 const char *charValue;
205 charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_IMG_PATH_STR);
207 m_abstractContact->setPhotoURI(convertPathToUri(charValue));
209 charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR);
211 m_abstractContact->setRingtoneURI(convertPathToUri(charValue));
213 charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_NOTE_STR);
216 StringArrayPtr notes(new StringArray());
217 notes->push_back(charValue);
218 m_abstractContact->setNotes(notes);
223 if (!convertToAbstractBaseData())
224 ThrowMsg(UnknownException, "error during converting base data");
226 if (!convertToAbstractAddressObject())
227 ThrowMsg(UnknownException, "error during converting address object");
229 if (!convertToAbstractEmailObject())
230 ThrowMsg(UnknownException, "error during converting email object");
232 if (!convertToAbstractPhoneObject())
233 ThrowMsg(UnknownException, "error during converting phone object");
235 if (!convertToAbstractNicknameObject())
236 ThrowMsg(UnknownException, "error during converting nickname object");
238 if (!convertToAbstractPhoneticnameObject())
239 ThrowMsg(UnknownException, "error during converting phoneticName object");
241 if (!convertToAbstractGroupObject())
242 ThrowMsg(UnknownException, "error during converting group object");
244 if (!convertToAbstractUrlObject())
245 ThrowMsg(UnknownException, "error during converting url object");
247 if (!convertToAbstractOrganizationObject())
248 ThrowMsg(UnknownException, "error during converting organization object");
250 if (!convertToAbstractAnniversaryObject())
251 ThrowMsg(UnknownException, "error during converting anniversary object");
253 if (!convertToAbstractBirthdayObject())
254 ThrowMsg(UnknownException, "error during converting birthday object");
258 LogError("Error converting to abstract object : " << _rethrown_exception.GetMessage());
259 freeAbstractObject();
267 bool ContactWrapper::convertToAbstractBaseData()
269 if (NULL == m_abstractContact)
271 LogError("you should create empty abstract contact object first");
275 if (NULL == m_platformContact)
277 LogError("you should provide platform contact object first");
281 CTSvalue *value = NULL;
284 errorCode = contacts_svc_struct_get_value(m_platformContact, CTS_CF_NAME_VALUE, &value);
285 if (CTS_SUCCESS == errorCode && value != NULL)
287 const char *charValue = NULL;
288 ContactNamePtr contactName(new ContactName);
290 charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_FIRST_STR);
292 contactName->setFirstName(charValue);
294 charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_ADDITION_STR);
296 contactName->setMiddleName(charValue);
298 charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_LAST_STR);
300 contactName->setLastName(charValue);
302 charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_DISPLAY_STR);
304 contactName->setDisplayName(charValue);
306 charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_PREFIX_STR);
308 contactName->setPrefix(charValue);
310 //charValue = contacts_svc_value_get_str(value, CTS_NAME_VAL_SUFFIX_STR);
312 // contactName->setPhoneticName(charValue);
314 m_abstractContact->setName(contactName);
316 else if (errorCode != CTS_ERR_NO_DATA || value == NULL)
321 // errorCode = contacts_svc_struct_get_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, &value);
322 // if (CTS_SUCCESS == errorCode && value != NULL)
324 // const char *charValue = NULL;
326 // charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_IMG_PATH_STR);
328 // m_abstractContact->setPhotoURI(convertPathToUri(charValue));
330 // charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR);
332 // m_abstractContact->setRingtoneURI(convertPathToUri(charValue));
334 // bool boolValue = contacts_svc_value_get_bool(value, CTS_BASE_VAL_FAVORITE_BOOL);
336 // m_abstractContact->setIsFavorite(boolValue);
338 // charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_NOTE_STR);
340 // m_abstractContact->addNote(charValue);
342 // else if (errorCode != CTS_ERR_NO_DATA || value == NULL)
350 bool ContactWrapper::convertToAbstractAddressObject()
352 if (NULL == m_abstractContact)
354 LogError("you should create empty abstract contact object first");
358 if (NULL == m_platformContact)
360 LogError("you should provide platform contact object first");
364 ContactAddressArrayPtr addresses = ContactAddressArrayPtr(new ContactAddressArray());
366 GSList *addressList = NULL;
367 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_POSTAL_ADDR_LIST, &addressList);
368 if (CTS_SUCCESS == errorCode)
370 for (; addressList; addressList = g_slist_next(addressList))
372 ContactAddressPtr address(new ContactAddress());
373 addresses->push_back(address);
375 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_TYPE_INT);
376 if(type & CTS_ADDR_TYPE_POSTAL) // TODO to be checked
377 address->addType(CONTACT_ADDRESS_TYPE_PREF);
378 if(type & CTS_ADDR_TYPE_HOME)
379 address->addType(CONTACT_ADDRESS_TYPE_HOME);
380 if(type & CTS_ADDR_TYPE_WORK)
381 address->addType(CONTACT_ADDRESS_TYPE_WORK);
383 const char *charValue = NULL;
385 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_COUNTRY_STR);
387 address->setCountry(charValue);
389 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_REGION_STR);
391 address->setRegion(charValue);
393 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_LOCALITY_STR);
395 address->setCity(charValue);
397 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_STREET_STR);
399 address->setStreetAddress(charValue);
401 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_POSTALCODE_STR);
403 address->setPostalCode(charValue);
405 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_EXTENDED_STR);
407 address->setAdditionalInformation(charValue);
411 else if (errorCode != CTS_ERR_NO_DATA)
416 m_abstractContact->setAddresses(addresses);
421 bool ContactWrapper::convertToAbstractUrlObject()
423 if (NULL == m_abstractContact)
425 LogError("you should create empty abstract contact object first");
429 if (NULL == m_platformContact)
431 LogError("you should provide platform contact object first");
435 ContactWebSiteArrayPtr urls = ContactWebSiteArrayPtr(new ContactWebSiteArray());
437 GSList *urlList = NULL;
438 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_WEB_ADDR_LIST, &urlList);
439 if (CTS_SUCCESS == errorCode)
441 for (; urlList; urlList = g_slist_next(urlList))
443 ContactWebSitePtr url(new ContactWebSite());
444 urls->push_back(url);
446 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(urlList->data), CTS_WEB_VAL_TYPE_INT);
449 case CTS_WEB_TYPE_NONE:
450 url->setType(WEBSITE_TYPE_HOMEPAGE);
452 case CTS_WEB_TYPE_HOME:
453 url->setType(WEBSITE_TYPE_HOMEPAGE);
455 case CTS_WEB_TYPE_WORK:
456 url->setType(WEBSITE_TYPE_BLOG);
459 LogError("invalid url type");
460 url->setType(WEBSITE_TYPE_HOMEPAGE);
464 const char *charValue = NULL;
466 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(urlList->data), CTS_WEB_VAL_ADDR_STR);
468 url->setUrl(charValue);
472 else if (errorCode != CTS_ERR_NO_DATA)
477 m_abstractContact->setUrls(urls);
482 bool ContactWrapper::convertToAbstractOrganizationObject()
484 if (NULL == m_abstractContact)
486 LogError("you should create empty abstract contact object first");
490 if (NULL == m_platformContact)
492 LogError("you should provide platform contact object first");
496 CTSvalue *value = NULL;
499 ContactOrganizationPtr organization(new ContactOrganization());
501 errorCode = contacts_svc_struct_get_value(m_platformContact, CTS_CF_COMPANY_VALUE, &value);
502 if (CTS_SUCCESS == errorCode)
504 const char *charValue = NULL;
506 charValue = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_NAME_STR);
508 organization->setName(charValue);
510 charValue = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_DEPARTMENT_STR);
512 organization->setDepartment(charValue);
514 charValue = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_JOB_TITLE_STR);
516 organization->setTitle(charValue);
518 charValue = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_ROLE_STR);
520 organization->setRole(charValue);
523 else if (errorCode != CTS_ERR_NO_DATA)
528 m_abstractContact->setOrganization(organization);
533 bool ContactWrapper::convertToAbstractAnniversaryObject()
535 if (NULL == m_abstractContact)
537 LogError("you should create empty abstract contact object first");
541 if (NULL == m_platformContact)
543 LogError("you should provide platform contact object first");
547 ContactAnniversaryArrayPtr anniversaries(new ContactAnniversaryArray());
549 GSList *eventList = NULL;
550 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_EVENT_LIST, &eventList);
551 if (CTS_SUCCESS == errorCode)
553 for (; eventList; eventList = g_slist_next(eventList))
555 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(eventList->data), CTS_EVENT_VAL_TYPE_INT);
556 int db_date = contacts_svc_value_get_int(static_cast<CTSvalue*>(eventList->data), CTS_EVENT_VAL_DATE_INT);
558 if (type == CTS_EVENT_TYPE_ANNIVERSARY)
560 ContactAnniversaryPtr anniversary = ContactAnniversaryPtr(new ContactAnniversary());
564 tm_date.tm_year = (db_date / 10000) - 1900;
565 tm_date.tm_mon = ((db_date - ((tm_date.tm_year + 1900) * 10000)) / 100) - 1;
566 tm_date.tm_mday = (db_date - ((tm_date.tm_year + 1900) * 10000) - tm_date.tm_mon * 100);
568 anniversary->setDate(tm_date);
571 // anniv->setLabel(string("ANNIVERSARY"));
573 anniversaries->push_back(anniversary);
577 else if (errorCode != CTS_ERR_NO_DATA)
582 m_abstractContact->setAnniversaries(anniversaries);
587 bool ContactWrapper::convertToAbstractBirthdayObject()
589 if (NULL == m_abstractContact)
591 LogError("you should create empty abstract contact object first");
595 if (NULL == m_platformContact)
597 LogError("you should provide platform contact object first");
601 GSList *eventList = NULL;
602 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_EVENT_LIST, &eventList);
603 if (CTS_SUCCESS == errorCode)
605 for (; eventList; eventList = g_slist_next(eventList))
607 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(eventList->data), CTS_EVENT_VAL_TYPE_INT);
608 int db_date = contacts_svc_value_get_int(static_cast<CTSvalue*>(eventList->data), CTS_EVENT_VAL_DATE_INT);
610 if (type == CTS_EVENT_TYPE_BIRTH)
614 tm_date.tm_year = (db_date / 10000) - 1900;
615 tm_date.tm_mon = ((db_date - ((tm_date.tm_year + 1900) * 10000)) / 100) - 1;
616 tm_date.tm_mday = (db_date - ((tm_date.tm_year + 1900) * 10000) - tm_date.tm_mon * 100);
618 m_abstractContact->setBirthday(tm_date);
623 else if (errorCode != CTS_ERR_NO_DATA)
631 bool ContactWrapper::convertToAbstractEmailObject()
633 if (NULL == m_abstractContact)
635 LogError("you should create empty abstract contact object first");
639 if (NULL == m_platformContact)
641 LogError("you should provide platform contact object first");
645 ContactEmailAddressArrayPtr emailAddresses(new ContactEmailAddressArray());
647 GSList *emailList = NULL;
648 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_EMAIL_LIST, &emailList);
649 if (CTS_SUCCESS == errorCode)
651 for (; emailList; emailList = g_slist_next(emailList))
653 ContactEmailAddressPtr email(new ContactEmailAddress());
655 emailAddresses->push_back(email);
657 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(emailList->data), CTS_EMAIL_VAL_TYPE_INT);
659 if(type | CTS_EMAIL_TYPE_NONE)
660 email->addType(CONTACT_EMAIL_TYPE_PREF);
661 if(type | CTS_EMAIL_TYPE_HOME)
662 email->addType(CONTACT_EMAIL_TYPE_HOME);
663 if(type | CTS_EMAIL_TYPE_WORK)
664 email->addType(CONTACT_EMAIL_TYPE_WORK);
666 const char *charValue = NULL;
668 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(emailList->data), CTS_EMAIL_VAL_ADDR_STR);
670 email->setEmail(charValue);
673 else if (errorCode != CTS_ERR_NO_DATA)
678 m_abstractContact->setEmails(emailAddresses);
683 bool ContactWrapper::convertToAbstractPhoneObject()
685 if (NULL == m_abstractContact)
687 LogError("you should create empty abstract contact object first");
691 if (NULL == m_platformContact)
693 LogError("you should provide platform contact object first");
697 ContactPhoneNumberArrayPtr phoneNumbers(new ContactPhoneNumberArray());
699 GSList *phoneList = NULL;
700 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_NUMBER_LIST, &phoneList);
701 if (CTS_SUCCESS == errorCode)
703 for (; phoneList; phoneList = g_slist_next(phoneList))
705 ContactPhoneNumberPtr phoneNumber(new ContactPhoneNumber());
706 phoneNumbers->push_back(phoneNumber);
708 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(phoneList->data), CTS_NUM_VAL_TYPE_INT);
709 if(type & CTS_NUM_TYPE_WORK)
710 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_WORK);
711 if(type & CTS_NUM_TYPE_NONE)
712 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_PREF);
713 if(type & CTS_NUM_TYPE_HOME)
714 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_HOME);
715 if(type & CTS_NUM_TYPE_FAX)
716 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_FAX);
717 if(type & CTS_NUM_TYPE_CELL)
718 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_CELL);
719 if(type & CTS_NUM_TYPE_PAGER)
720 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_PAGER);
721 if(type & CTS_NUM_TYPE_CAR)
722 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_CAR);
723 if(type & CTS_NUM_TYPE_VOICE)
724 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_VOICE);
725 if(type & CTS_NUM_TYPE_MSG)
726 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_MSG);
727 if(type & CTS_NUM_TYPE_BBS)
728 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_BBS);
729 if(type & CTS_NUM_TYPE_ISDN)
730 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_ISDN);
731 if(type & CTS_NUM_TYPE_VIDEO)
732 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_VIDEO);
733 if(type & CTS_NUM_TYPE_PCS)
734 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_PCS);
735 if(type & CTS_NUM_TYPE_WORK)
736 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_WORK);
737 if(type & CTS_NUM_TYPE_WORK)
738 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_WORK);
740 const char *charValue = NULL;
742 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(phoneList->data), CTS_NUM_VAL_NUMBER_STR);
744 phoneNumber->setNumber(charValue);
747 else if (errorCode != CTS_ERR_NO_DATA)
752 m_abstractContact->setPhoneNumbers(phoneNumbers);
757 bool ContactWrapper::convertToAbstractNicknameObject()
759 if (NULL == m_abstractContact)
761 LogError("you should create empty abstract contact object first");
765 if (NULL == m_platformContact)
767 LogError("you should provide platform contact object first");
771 StringArrayPtr nickNames(new StringArray());
773 GSList *nicknNameList = NULL;
774 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_NICKNAME_LIST, &nicknNameList);
775 if (CTS_SUCCESS == errorCode)
777 for (; nicknNameList; nicknNameList = g_slist_next(nicknNameList))
779 const char *charValue = NULL;
780 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(nicknNameList->data), CTS_NICKNAME_VAL_NAME_STR);
782 nickNames->push_back(charValue);
785 else if (errorCode != CTS_ERR_NO_DATA)
790 m_abstractContact->getName()->setNicknames(nickNames);
795 bool ContactWrapper::convertToAbstractPhoneticnameObject()
797 if (NULL == m_abstractContact)
799 LogError("you should create empty abstract contact object first");
803 if (NULL == m_platformContact)
805 LogError("you should provide platform contact object first");
809 int structFieldType = 0;
810 structFieldType = getCustomTypeInContactsSvc(CONTACT_ATTRIBUTE_PHONETIC_NAME);
811 if (structFieldType < CTS_SUCCESS)
813 LogError("Phonetic name struct type is not found!!");
817 CTSvalue *value = NULL;
819 errorCode = contacts_svc_struct_get_value(m_platformContact, static_cast<cts_struct_field>(structFieldType), &value);
820 if (CTS_SUCCESS == errorCode)
824 const char *charValue = NULL;
825 charValue = contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA2_STR);
827 m_abstractContact->getName()->setPhoneticName(charValue);
834 else if (errorCode != CTS_ERR_NO_DATA)
842 bool ContactWrapper::convertToAbstractGroupObject()
844 if (NULL == m_abstractContact)
846 LogError("you should create empty abstract contact object first");
850 if (NULL == m_platformContact)
852 LogError("you should provide platform contact object first");
856 StringArrayPtr categories(new StringArray());
858 GSList *groupList = NULL;
859 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_GROUPREL_LIST, &groupList);
860 if (CTS_SUCCESS == errorCode)
862 for (; groupList; groupList = g_slist_next(groupList))
864 const char *charValue = NULL;
865 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(groupList->data), CTS_GROUPREL_VAL_NAME_STR);
867 categories->push_back(charValue);
870 else if (errorCode != CTS_ERR_NO_DATA)
875 m_abstractContact->setCategories(categories);
880 bool ContactWrapper::convertToPlatformNicknameObject()
882 if (NULL == m_abstractContact)
884 LogError("you should create empty abstract contact object first");
888 if (NULL == m_platformContact)
890 LogError("you should provide platform contact object first");
894 StringArrayPtr nicknames = m_abstractContact->getName()->getNicknames();
896 bool properlyCreated = true;
898 GSList *nicknameList = NULL;
899 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_NICKNAME_LIST, &nicknameList))
901 GSList *nicknameListSave = nicknameList;
902 for (; nicknameList; nicknameList = g_slist_next(nicknameList))
904 CTSvalue* nickname = static_cast<CTSvalue*>(nicknameList->data);
905 contacts_svc_value_set_bool(nickname, CTS_NICKNAME_VAL_DELETE_BOOL, true);
907 nicknameList = nicknameListSave;
910 if (nicknames->size() == 0 && nicknameList == NULL)
914 for (size_t i = 0; i < nicknames->size(); ++i)
916 CTSvalue *nickname = NULL;
917 nickname = contacts_svc_value_new(CTS_VALUE_NICKNAME);
920 if (CTS_SUCCESS == contacts_svc_value_set_str(nickname, CTS_NICKNAME_VAL_NAME_STR, nicknames->at(i).c_str()))
922 nicknameList = g_slist_append(nicknameList, nickname);
926 contacts_svc_value_free(nickname);
927 properlyCreated = false;
933 properlyCreated = false;
940 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_NICKNAME_LIST, nicknameList))
942 properlyCreated = false;
946 return properlyCreated;
949 bool ContactWrapper::convertToPlatformPhoneticnameObject()
951 if (NULL == m_abstractContact)
953 LogError("you should create empty abstract contact object first");
957 if (NULL == m_platformContact)
959 LogError("you should provide platform contact object first");
963 int structFieldType = 0;
964 structFieldType = getCustomTypeInContactsSvc(CONTACT_ATTRIBUTE_PHONETIC_NAME);
965 if (structFieldType < CTS_SUCCESS)
967 LogError("Phonetic name struct type is not found!!");
972 *If phonetic name information is not existed, add phonetic name information
973 *If phonetic name information is existed,update phonetic name information
975 CTSvalue *value = NULL;
976 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, static_cast<cts_struct_field>(structFieldType), &value))
978 value = contacts_svc_value_new(CTS_VALUE_EXTEND);
984 if (CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_EXTEND_VAL_DATA2_STR, m_abstractContact->getName()->getPhoneticName().c_str())
985 || CTS_SUCCESS != contacts_svc_struct_store_value(m_platformContact, static_cast<cts_struct_field>(structFieldType), value))
987 contacts_svc_value_free(value);
991 contacts_svc_value_free(value);
993 // LogDebug("RETURN TRUE!!!");
997 bool ContactWrapper::convertToPlatformGroupObject()
999 // LogDebug("entered");
1000 if (NULL == m_abstractContact)
1002 LogError("you should create empty abstract contact object first");
1006 if (NULL == m_platformContact)
1008 LogError("you should provide platform contact object first");
1012 StringArrayPtr groups = m_abstractContact->getCategories();
1013 CTSvalue *group = NULL;
1014 bool properlyCreated = true;
1015 GSList *groupList = NULL;
1016 //mark existing items to delete them.
1017 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_GROUPREL_LIST, &groupList))
1019 GSList *groupListSave = groupList;
1020 for (; groupList; groupList = g_slist_next(groupList))
1022 // LogDebug("clearing group list");
1023 CTSvalue* delgroup = static_cast<CTSvalue*>(groupList->data);
1024 contacts_svc_value_set_bool(delgroup, CTS_GROUPREL_VAL_DELETE_BOOL, true);
1026 groupList = groupListSave;
1028 if (groups->size() == 0 && groupList == NULL
1033 query_error error_code = QUERY_SUCCESS;
1034 GSList *groups_list = NULL;
1038 string accountIdStr = m_abstractContact->getAccount()->getAccountServiceId();
1039 stringstream ss(accountIdStr);
1042 LogError("Wrong account id");
1046 int addressBookId = find_addressbook_id(accountId, &error_code);
1047 if (error_code != QUERY_SUCCESS)
1050 CTSiter* group_iter;
1051 bool is_new_group = true;
1053 for (size_t i = 0; i < groups->size(); ++i)
1055 if (CTS_SUCCESS == contacts_svc_get_list(CTS_LIST_ALL_GROUP, &group_iter))
1057 while (CTS_SUCCESS == contacts_svc_iter_next(group_iter))
1059 CTSvalue *findgroup = contacts_svc_iter_get_info(group_iter);
1062 group_info_t* group_info = g_new0(group_info_t, 1);
1064 group_info->group_name = g_strdup(contacts_svc_value_get_str(findgroup, CTS_LIST_GROUP_NAME_STR));
1065 group_info->addressbook_id = contacts_svc_value_get_int(findgroup, CTS_GROUP_VAL_ADDRESSBOOK_ID_INT);
1066 group_info->group_id = contacts_svc_value_get_int(findgroup, CTS_GROUP_VAL_ID_INT);
1067 groups_list = g_slist_append(groups_list, group_info);
1072 group = contacts_svc_value_new(CTS_VALUE_GROUP_RELATION);
1076 //groupId = AddressBook::getGroupId(groups[i]);
1078 is_new_group = true;
1079 GSList* tmp_list = groups_list;
1082 group_info_t* info = (group_info_t*) tmp_list->data;
1084 if ((info->group_name != NULL) && (groups->at(i).compare(info->group_name) == 0)
1085 && (info->addressbook_id == addressBookId))
1087 is_new_group = false;
1088 groupId = info->group_id;
1090 if (info->group_name)
1091 free(info->group_name);
1093 tmp_list = g_slist_next(tmp_list);
1095 g_slist_free(groups_list);
1100 CTSvalue *new_group;
1101 new_group = contacts_svc_value_new(CTS_VALUE_GROUP);
1103 contacts_svc_value_set_str(new_group, CTS_GROUP_VAL_NAME_STR, (const char*) (groups->at(i).c_str()));
1104 contacts_svc_value_set_int(new_group, CTS_GROUP_VAL_ADDRESSBOOK_ID_INT, addressBookId);
1105 groupId = contacts_svc_insert_group(addressBookId, new_group);
1108 contacts_svc_value_free(new_group);
1110 // LogDebug("group id " << groupId);
1113 if (CTS_SUCCESS == contacts_svc_value_set_int(group, CTS_GROUPREL_VAL_ID_INT, groupId))
1115 groupList = g_slist_append(groupList, group);
1119 contacts_svc_value_free(group);
1120 properlyCreated = false;
1126 contacts_svc_value_free(group);
1127 properlyCreated = false;
1133 properlyCreated = false;
1137 if (properlyCreated)
1139 // LogDebug("storing group list");
1140 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_GROUPREL_LIST, groupList))
1142 properlyCreated = false;
1145 for (; groupList; groupList = g_slist_next(groupList))
1147 contacts_svc_value_free(static_cast<CTSvalue*>(groupList->data));
1149 g_slist_free(groupList);
1150 return properlyCreated;
1153 bool ContactWrapper::convertToPlatformUrlObject()
1155 // LogDebug("entered");
1156 if (NULL == m_abstractContact)
1158 LogError("you should create empty abstract contact object first");
1162 if (NULL == m_platformContact)
1164 LogError("you should provide platform contact object first");
1169 ContactWebSiteArrayPtr urls = m_abstractContact->getUrls();
1170 CTSvalue *url = NULL;
1171 bool properlyCreated = true;
1172 GSList *urlList = NULL;
1173 //mark existing items to delete them.
1174 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_WEB_ADDR_LIST, &urlList))
1176 GSList *urlListSave = urlList;
1177 for (; urlList; urlList = g_slist_next(urlList))
1179 // LogDebug("clearing url list");
1180 CTSvalue* tmp_email = static_cast<CTSvalue*>(urlList->data);
1181 contacts_svc_value_set_bool(tmp_email, CTS_WEB_VAL_DELETE_BOOL, true);
1183 urlList = urlListSave;
1185 if (urls->size() == 0 && urlList == NULL
1190 for (size_t i = 0; i < urls->size(); ++i)
1192 ContactWebSiteType types = urls->at(i)->getType();
1193 url = contacts_svc_value_new(CTS_VALUE_WEB);
1198 case WEBSITE_TYPE_HOMEPAGE:
1199 type = CTS_WEB_TYPE_HOME;
1201 case WEBSITE_TYPE_BLOG:
1202 type = CTS_WEB_TYPE_WORK;
1205 LogError("invalid phone type");
1206 type = CTS_WEB_TYPE_NONE;
1209 if (CTS_SUCCESS == contacts_svc_value_set_int(url, CTS_WEB_VAL_TYPE_INT, type)
1210 && CTS_SUCCESS == contacts_svc_value_set_str(url, CTS_WEB_VAL_ADDR_STR, urls->at(i)->getUrl().c_str()))
1212 urlList = g_slist_append(urlList, url);
1216 contacts_svc_value_free(url);
1217 properlyCreated = false;
1223 properlyCreated = false;
1227 if (!properlyCreated)
1233 if (properlyCreated)
1235 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_WEB_ADDR_LIST, urlList))
1237 properlyCreated = false;
1240 for (; urlList; urlList = g_slist_next(urlList))
1242 contacts_svc_value_free(static_cast<CTSvalue*>(urlList->data));
1244 g_slist_free(urlList);
1245 return properlyCreated;
1248 bool ContactWrapper::convertToPlatformOrganizationObject()
1250 // LogDebug("entered");
1251 if (NULL == m_abstractContact)
1253 LogError("you should create empty abstract contact object first");
1257 if (NULL == m_platformContact)
1259 LogError("you should provide platform contact object first");
1263 ContactOrganizationPtr org = m_abstractContact->getOrganization();
1264 CTSvalue *organization = NULL;
1266 //mark existing items to delete them.
1267 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, CTS_CF_COMPANY_VALUE, &organization))
1269 CTSvalue *value = contacts_svc_value_new(CTS_VALUE_COMPANY);
1272 if (CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_COMPANY_VAL_NAME_STR, org->getName().c_str())
1273 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_COMPANY_VAL_DEPARTMENT_STR, org->getDepartment().c_str())
1274 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_COMPANY_VAL_JOB_TITLE_STR, org->getTitle().c_str())
1275 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_COMPANY_VAL_ROLE_STR, org->getRole().c_str())
1276 || CTS_SUCCESS != contacts_svc_struct_store_value(m_platformContact, CTS_CF_COMPANY_VALUE, value))
1278 contacts_svc_value_free(value);
1281 contacts_svc_value_free(value);
1290 contacts_svc_value_set_str(organization, CTS_COMPANY_VAL_NAME_STR, org->getName().c_str());
1291 contacts_svc_value_set_str(organization, CTS_COMPANY_VAL_DEPARTMENT_STR, org->getDepartment().c_str());
1292 contacts_svc_value_set_str(organization, CTS_COMPANY_VAL_JOB_TITLE_STR, org->getTitle().c_str());
1293 contacts_svc_value_set_str(organization, CTS_COMPANY_VAL_ROLE_STR, org->getRole().c_str());
1294 contacts_svc_struct_store_value(m_platformContact, CTS_CF_COMPANY_VALUE, organization);
1295 contacts_svc_value_free(organization);
1301 bool ContactWrapper::convertToPlatformAnniversaryObject()
1303 // LogDebug("entered");
1304 if (NULL == m_abstractContact)
1306 LogError("you should create empty abstract contact object first");
1310 if (NULL == m_platformContact)
1312 LogError("you should provide platform contact object first");
1316 ContactAnniversaryArrayPtr anniversaries = m_abstractContact->getAnniversaries();
1317 CTSvalue *anniversary = NULL;
1318 bool properlyCreated = true;
1319 GSList *anniversaryList = NULL;
1321 //mark existing items to delete them.
1322 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_EVENT_LIST, &anniversaryList))
1324 GSList *anniversaryListSave = anniversaryList;
1325 for (; anniversaryList; anniversaryList = g_slist_next(anniversaryList))
1327 // LogDebug("clearing anniversary list");
1328 CTSvalue* tmp_anniversary = static_cast<CTSvalue*>(anniversaryList->data);
1329 contacts_svc_value_set_bool(tmp_anniversary, CTS_EVENT_VAL_DELETE_BOOL, true);
1331 anniversaryList = anniversaryListSave;
1333 if (anniversaries->size() == 0 && anniversaryList == NULL
1339 for (size_t i = 0; i < anniversaries->size(); ++i)
1342 std::tm abstract_date = anniversaries->at(i)->getDate();
1344 date = (abstract_date.tm_year + 1900) * 10000 + (abstract_date.tm_mon+1) * 100 + abstract_date.tm_mday;
1345 anniversary = contacts_svc_value_new(CTS_VALUE_EVENT);
1348 if (CTS_SUCCESS == contacts_svc_value_set_int(anniversary, CTS_EVENT_VAL_TYPE_INT, CTS_EVENT_TYPE_ANNIVERSARY)
1349 && CTS_SUCCESS == contacts_svc_value_set_int(anniversary, CTS_EVENT_VAL_DATE_INT, date))
1351 anniversaryList = g_slist_append(anniversaryList, anniversary);
1355 contacts_svc_value_free(anniversary);
1356 properlyCreated = false;
1362 properlyCreated = false;
1366 if (!properlyCreated)
1372 if (properlyCreated)
1374 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_EVENT_LIST, anniversaryList))
1376 properlyCreated = false;
1379 for (; anniversaryList; anniversaryList = g_slist_next(anniversaryList))
1381 contacts_svc_value_free(static_cast<CTSvalue*>(anniversaryList->data));
1383 g_slist_free(anniversaryList);
1384 return properlyCreated;
1387 bool ContactWrapper::convertToPlatformbirthdayObject()
1389 // LogDebug("entered");
1390 if (NULL == m_abstractContact)
1392 LogError("you should create empty abstract contact object first");
1396 if (NULL == m_platformContact)
1398 LogError("you should provide platform contact object first");
1402 tm birth_date = m_abstractContact->getBirthday();
1404 CTSvalue *birthday = NULL;
1405 bool properlyCreated = true;
1406 GSList *anniversaryList = NULL;
1408 //mark existing items to delete them.
1409 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_EVENT_LIST, &anniversaryList))
1411 GSList *anniversaryListSave = anniversaryList;
1412 for (; anniversaryList; anniversaryList = g_slist_next(anniversaryList))
1414 // LogDebug("clearing anniversary list");
1415 CTSvalue* tmp_anniversary = static_cast<CTSvalue*>(anniversaryList->data);
1416 int type = contacts_svc_value_get_int(tmp_anniversary, CTS_EVENT_VAL_TYPE_INT);
1417 if (type == CTS_EVENT_TYPE_BIRTH)
1418 contacts_svc_value_set_bool(tmp_anniversary, CTS_EVENT_VAL_DELETE_BOOL, true);
1420 anniversaryList = anniversaryListSave;
1422 if (birth_date.tm_year == 0 && birth_date.tm_mon == 0 && birth_date.tm_mday == 0 && anniversaryList == NULL
1428 date = (birth_date.tm_year + 1900) * 10000 + (birth_date.tm_mon+1) * 100 + birth_date.tm_mday;
1429 // for (size_t i = 0; i < anniversaries->size(); ++i) {
1430 birthday = contacts_svc_value_new(CTS_VALUE_EVENT);
1434 if (CTS_SUCCESS == contacts_svc_value_set_int(birthday, CTS_EVENT_VAL_TYPE_INT, CTS_EVENT_TYPE_BIRTH)
1435 && CTS_SUCCESS == contacts_svc_value_set_int(birthday, CTS_EVENT_VAL_DATE_INT, date))
1437 anniversaryList = g_slist_append(anniversaryList, birthday);
1441 contacts_svc_value_free(birthday);
1442 properlyCreated = false;
1448 properlyCreated = false;
1452 // if (!properlyCreated) {
1457 if (properlyCreated)
1459 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_EVENT_LIST, anniversaryList))
1461 properlyCreated = false;
1464 for (; anniversaryList; anniversaryList = g_slist_next(anniversaryList))
1466 contacts_svc_value_free(static_cast<CTSvalue*>(anniversaryList->data));
1468 g_slist_free(anniversaryList);
1469 return properlyCreated;
1472 bool ContactWrapper::convertToPlatformPhoneObject()
1474 // LogDebug("entered");
1475 if (NULL == m_abstractContact)
1477 LogError("you should create empty abstract contact object first");
1481 if (NULL == m_platformContact)
1483 LogError("you should provide platform contact object first");
1488 ContactPhoneNumberArrayPtr phoneNumbers = m_abstractContact->getPhoneNumbers();
1489 bool properlyCreated = true;
1490 CTSvalue *number = NULL;
1491 GSList *numberList = NULL;
1492 //mark existing items to delete them.
1493 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_NUMBER_LIST, &numberList))
1495 GSList *numberListSave = numberList;
1496 for (; numberList; numberList = g_slist_next(numberList))
1498 // LogDebug("clearing phone list");
1499 CTSvalue* number = static_cast<CTSvalue*>(numberList->data);
1500 contacts_svc_value_set_bool(number, CTS_NUM_VAL_DELETE_BOOL, true);
1502 numberList = numberListSave;
1504 if (phoneNumbers->size() == 0 && numberList == NULL )
1508 for (size_t i = 0; i < phoneNumbers->size(); ++i)
1510 ContactPhoneNumberTypeArrayPtr types = phoneNumbers->at(i)->getTypes();
1511 number = contacts_svc_value_new(CTS_VALUE_NUMBER);
1515 for (size_t j = 0; j < types->size(); ++j)
1517 if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_WORK)
1518 type = type | CTS_NUM_TYPE_WORK;
1519 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_PREF)
1520 type = type | CTS_NUM_TYPE_NONE;
1521 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_HOME)
1522 type = type | CTS_NUM_TYPE_HOME;
1523 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_FAX)
1524 type = type | CTS_NUM_TYPE_FAX;
1525 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_CELL)
1526 type = type | CTS_NUM_TYPE_CELL;
1527 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_PAGER)
1528 type = type | CTS_NUM_TYPE_PAGER;
1529 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_CAR)
1530 type = type | CTS_NUM_TYPE_CAR;
1531 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_BBS)
1532 type = type | CTS_NUM_TYPE_BBS;
1533 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_MODEM)
1534 type = type | CTS_NUM_TYPE_MODEM;
1535 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_ISDN)
1536 type = type | CTS_NUM_TYPE_ISDN;
1537 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_VIDEO)
1538 type = type | CTS_NUM_TYPE_VIDEO;
1539 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_VOICE)
1540 type = type | CTS_NUM_TYPE_VOICE;
1541 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_MSG)
1542 type = type | CTS_NUM_TYPE_MSG;
1545 LogError("invalid phone type");
1546 type = CTS_NUM_TYPE_NONE;
1549 if (CTS_SUCCESS == contacts_svc_value_set_str(number, CTS_NUM_VAL_NUMBER_STR, phoneNumbers->at(i)->getNumber().c_str())
1550 && CTS_SUCCESS == contacts_svc_value_set_bool(number, CTS_NUM_VAL_DEFAULT_BOOL, type == CTS_NUM_TYPE_NONE)
1551 && CTS_SUCCESS == contacts_svc_value_set_int(number, CTS_NUM_VAL_TYPE_INT, type))
1553 numberList = g_slist_append(numberList, number);
1557 contacts_svc_value_free(number);
1558 properlyCreated = false;
1564 properlyCreated = false;
1567 if (!properlyCreated)
1572 if (properlyCreated)
1574 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_NUMBER_LIST, numberList))
1576 properlyCreated = false;
1579 for (; numberList; numberList = g_slist_next(numberList))
1581 contacts_svc_value_free(static_cast<CTSvalue*>(numberList->data));
1583 g_slist_free(numberList);
1584 return properlyCreated;
1587 bool ContactWrapper::convertToPlatformEmailObject()
1589 // LogDebug("entered");
1590 if (NULL == m_abstractContact)
1592 LogError("you should create empty abstract contact object first");
1596 if (NULL == m_platformContact)
1598 LogError("you should provide platform contact object first");
1603 ContactEmailAddressArrayPtr emails = m_abstractContact->getEmails();
1604 CTSvalue *email = NULL;
1605 bool properlyCreated = true;
1606 GSList *emailList = NULL;
1607 //mark existing items to delete them.
1608 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_EMAIL_LIST, &emailList))
1610 GSList *emailListSave = emailList;
1611 for (; emailList; emailList = g_slist_next(emailList))
1613 // LogDebug("clearing email list");
1614 CTSvalue* email = static_cast<CTSvalue*>(emailList->data);
1615 contacts_svc_value_set_bool(email, CTS_EMAIL_VAL_DELETE_BOOL, true);
1617 emailList = emailListSave;
1619 if (emails->size() == 0 && emailList == NULL)
1623 for (size_t i = 0; i < emails->size(); ++i)
1625 ContactEmailAddressTypeArrayPtr types = emails->at(i)->getTypes();
1626 email = contacts_svc_value_new(CTS_VALUE_EMAIL);
1630 for (size_t j = 0; j < types->size(); ++j)
1632 switch (types->at(j))
1634 case CONTACT_EMAIL_TYPE_HOME:
1635 type = type | CTS_EMAIL_TYPE_HOME;
1637 case CONTACT_EMAIL_TYPE_WORK:
1638 type = type | CTS_EMAIL_TYPE_WORK;
1640 case CONTACT_EMAIL_TYPE_PREF:
1641 type = type | CTS_EMAIL_TYPE_NONE;
1644 LogError("invalid phone type");
1645 type = CTS_EMAIL_TYPE_NONE;
1649 if (CTS_SUCCESS == contacts_svc_value_set_int(email, CTS_EMAIL_VAL_TYPE_INT, type)
1650 && CTS_SUCCESS == contacts_svc_value_set_str(email, CTS_EMAIL_VAL_ADDR_STR, emails->at(i)->getEmail().c_str()))
1652 emailList = g_slist_append(emailList, email);
1656 contacts_svc_value_free(email);
1657 properlyCreated = false;
1663 properlyCreated = false;
1667 if (!properlyCreated)
1672 if (properlyCreated)
1674 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_EMAIL_LIST, emailList))
1676 properlyCreated = false;
1679 for (; emailList; emailList = g_slist_next(emailList))
1681 contacts_svc_value_free(static_cast<CTSvalue*>(emailList->data));
1683 g_slist_free(emailList);
1684 return properlyCreated;
1687 bool ContactWrapper::convertToPlatformAddressObject()
1689 // LogDebug("entered");
1690 if (NULL == m_abstractContact)
1692 LogError("you should create empty abstract contact object first");
1696 if (NULL == m_platformContact)
1698 LogError("you should provide platform contact object first");
1703 ContactAddressArrayPtr addresses = m_abstractContact->getAddresses();
1704 bool properlyCreated = true;
1706 GSList *addressList = NULL;
1707 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_POSTAL_ADDR_LIST, &addressList))
1709 GSList *addressListSave = addressList;
1710 for (; addressList; addressList = g_slist_next(addressList))
1712 // LogDebug("clearing address list");
1713 CTSvalue* address = static_cast<CTSvalue*>(addressList->data);
1714 contacts_svc_value_set_bool(address, CTS_POSTAL_VAL_DELETE_BOOL, true);
1716 addressList = addressListSave;
1718 if (addresses->size() == 0 && addressList == NULL)
1722 for (size_t i = 0; i < addresses->size(); ++i)
1724 ContactAddressTypeArrayPtr types = addresses->at(i)->getTypes();
1726 CTSvalue *address = NULL;
1727 address = contacts_svc_value_new(CTS_VALUE_POSTAL);
1731 for (size_t j = 0; j < types->size(); ++j)
1733 switch (types->at(j))
1735 case CONTACT_ADDRESS_TYPE_PREF:
1736 type |= CTS_ADDR_TYPE_POSTAL; // TODO To be checked
1738 case CONTACT_ADDRESS_TYPE_WORK:
1739 type |= CTS_ADDR_TYPE_WORK;
1741 case CONTACT_ADDRESS_TYPE_HOME:
1742 type |= CTS_ADDR_TYPE_HOME;
1745 LogError("invalid address type");
1746 type |= CTS_EMAIL_TYPE_NONE;
1750 if (CTS_SUCCESS == contacts_svc_value_set_int(address, CTS_POSTAL_VAL_TYPE_INT, type)
1751 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_COUNTRY_STR, addresses->at(i)->getCountry().c_str())
1752 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_REGION_STR, addresses->at(i)->getRegion().c_str())
1753 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_LOCALITY_STR, addresses->at(i)->getCity().c_str())
1754 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_STREET_STR, addresses->at(i)->getStreetAddress().c_str())
1755 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_POBOX_STR, addresses->at(i)->getAdditionalInformation().c_str())
1756 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_POSTALCODE_STR, addresses->at(i)->getPostalCode().c_str())
1757 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_EXTENDED_STR, addresses->at(i)->getAdditionalInformation().c_str()))
1759 addressList = g_slist_append(addressList, address);
1763 contacts_svc_value_free(address);
1764 properlyCreated = false;
1770 properlyCreated = false;
1774 if (!properlyCreated)
1780 if (properlyCreated)
1782 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_POSTAL_ADDR_LIST, addressList))
1784 properlyCreated = false;
1787 for (; addressList; addressList = g_slist_next(addressList))
1789 contacts_svc_value_free(static_cast<CTSvalue*>(addressList->data));
1792 g_slist_free(addressList);
1794 return properlyCreated;
1797 bool ContactWrapper::convertToPlatformBaseData()
1799 if (NULL == m_abstractContact)
1801 LogError("you should create empty abstract contact object first");
1805 if (NULL == m_platformContact)
1807 LogError("you should provide platform contact object first");
1812 *If name information is not existed, add name information
1813 * If name information is existed,update name information
1815 CTSvalue *value = NULL;
1817 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, CTS_CF_NAME_VALUE, &value))
1819 CTSvalue *value = contacts_svc_value_new(CTS_VALUE_NAME);
1822 ContactNamePtr contactName = m_abstractContact->getName();
1823 if (CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_FIRST_STR, contactName->getFirstName().c_str())
1824 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_LAST_STR, contactName->getLastName().c_str())
1825 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_ADDITION_STR, contactName->getMiddleName().c_str())
1826 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_DISPLAY_STR, contactName->getDisplayName().c_str())
1827 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_PREFIX_STR, contactName->getPrefix().c_str())
1828 // || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_SUFFIX_STR, contactName->getPhoneticName().c_str())
1829 || CTS_SUCCESS != contacts_svc_struct_store_value(m_platformContact, CTS_CF_NAME_VALUE, value))
1831 contacts_svc_value_free(value);
1834 contacts_svc_value_free(value);
1843 ContactNamePtr contactName = m_abstractContact->getName();
1844 if (CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_FIRST_STR, contactName->getFirstName().c_str())
1845 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_LAST_STR, contactName->getLastName().c_str())
1846 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_ADDITION_STR, contactName->getMiddleName().c_str())
1847 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_DISPLAY_STR, contactName->getDisplayName().c_str())
1848 // || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_SUFFIX_STR, contactName->getPhoneticName().c_str())
1849 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_PREFIX_STR, contactName->getPrefix().c_str()))
1851 contacts_svc_value_free(value);
1854 contacts_svc_value_free(value);
1858 *If photo and ringtone uri information is not existed, add the information
1859 * If photo and ringtone uri is existed,update the information
1861 CTSvalue *baseinfo = NULL;
1862 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, &baseinfo))
1865 baseinfo = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO);
1868 if (m_abstractContact->getPhotoURIIsSet())
1870 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_IMG_PATH_STR, convertUriToPath(m_abstractContact->getPhotoURI()).c_str()))
1872 contacts_svc_value_free(baseinfo);
1877 if (m_abstractContact->getRingtoneURIIsSet())
1879 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_RINGTONE_PATH_STR, convertUriToPath(m_abstractContact->getRingtoneURI()).c_str()))
1881 contacts_svc_value_free(baseinfo);
1886 if (CTS_SUCCESS != contacts_svc_value_set_bool(baseinfo, CTS_BASE_VAL_FAVORITE_BOOL, m_abstractContact->getIsFavorite()))
1888 contacts_svc_value_free(baseinfo);
1892 if(m_abstractContact->getNotesNum() > 0)
1894 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_NOTE_STR, m_abstractContact->getNotes()->at(0).c_str()))
1896 contacts_svc_value_free(baseinfo);
1901 contacts_svc_struct_store_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, baseinfo);
1902 contacts_svc_value_free(baseinfo);
1911 const char * oldimgpath = NULL;
1912 oldimgpath = contacts_svc_value_get_str(baseinfo, CTS_BASE_VAL_IMG_PATH_STR);
1914 string strOldImagePath = "";
1915 if (NULL != oldimgpath)
1917 strOldImagePath = static_cast<string>(oldimgpath);
1920 string strNewImagePath = convertUriToPath(m_abstractContact->getPhotoURI());
1921 if (strOldImagePath != strNewImagePath)
1923 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_IMG_PATH_STR, strNewImagePath.c_str()))
1925 contacts_svc_value_free(baseinfo);
1930 const char * oldringtonepath = NULL;
1931 oldringtonepath = contacts_svc_value_get_str(baseinfo, CTS_BASE_VAL_IMG_PATH_STR);
1933 string strOldRingtonePath = "";
1934 if (NULL != oldringtonepath)
1936 strOldRingtonePath = static_cast<string>(oldringtonepath);
1939 string strNewRingtonePath = convertUriToPath(m_abstractContact->getRingtoneURI());
1940 if (strOldRingtonePath != strNewRingtonePath)
1942 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_RINGTONE_PATH_STR, strNewRingtonePath.c_str()))
1944 contacts_svc_value_free(baseinfo);
1949 if(m_abstractContact->getNotesNum() > 0)
1951 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_NOTE_STR, m_abstractContact->getNotes()->at(0).c_str()))
1953 contacts_svc_value_free(baseinfo);
1959 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_NOTE_STR, ""))
1961 contacts_svc_value_free(baseinfo);
1966 contacts_svc_struct_store_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, baseinfo);
1967 contacts_svc_value_free(baseinfo);
1970 //save company information
1971 CTSvalue *company = NULL;
1972 company = contacts_svc_value_new(CTS_VALUE_COMPANY);
1974 if (m_abstractContact->getOrganizations()->size() > 0) {
1976 contacts_svc_value_set_str(company, CTS_COMPANY_VAL_NAME_STR,
1977 m_abstractContact->getOrganizations()->at(0)->getName().c_str())
1980 contacts_svc_struct_store_value(m_platformContact,
1981 CTS_CF_COMPANY_VALUE, company))
1983 contacts_svc_value_free(company);
1987 contacts_svc_value_free(value);
1995 int ContactWrapper::getCustomTypeInContactsSvc(const string &typeName) const
1997 int structFieldType = -1;
1998 structFieldType = contacts_svc_find_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, const_cast<char*>(typeName.c_str()));
1999 if ( CTS_ERR_DB_RECORD_NOT_FOUND == structFieldType)
2001 LogDebug("CTS_ERR_DB_RECORD_NOT_FOUND!!");
2003 structFieldType = contacts_svc_insert_custom_type( CTS_TYPE_CLASS_EXTEND_DATA, const_cast<char*>(typeName.c_str()));
2004 if (CTS_SUCCESS > structFieldType)
2006 LogDebug("Create fail");
2009 else if (CTS_SUCCESS > structFieldType)
2011 LogDebug("contacts_svc_find_custom_type is fail");
2014 return structFieldType;
2017 void ContactWrapper::printPlatformObject()
2021 void ContactWrapper::printAbstractObject()
2025 string ContactWrapper::convertUriToPath(string str) const
2029 if(validate("^file\\:///[a-zA-Z]{2,3}(/\\S*)?$", str, VALIDATE_MATCH_CASELESS))
2030 result = str.substr(string("file://").size());
2031 else if(validate("^/[a-zA-Z]{2,3}(/\\S*)?$", str, VALIDATE_MATCH_CASELESS))
2037 string ContactWrapper::convertPathToUri(string str) const
2041 if(validate("^/[a-zA-Z]{2,3}(/\\S*)?$", str, VALIDATE_MATCH_CASELESS))
2042 result = "file://" + str;
2043 else if(validate("^file\\:///[a-zA-Z]{2,3}(/\\S*)?$", str, VALIDATE_MATCH_CASELESS))