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 = m_abstractContact->getName();
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);
315 else if (errorCode != CTS_ERR_NO_DATA || value == NULL)
320 // errorCode = contacts_svc_struct_get_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, &value);
321 // if (CTS_SUCCESS == errorCode && value != NULL)
323 // const char *charValue = NULL;
325 // charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_IMG_PATH_STR);
327 // m_abstractContact->setPhotoURI(convertPathToUri(charValue));
329 // charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR);
331 // m_abstractContact->setRingtoneURI(convertPathToUri(charValue));
333 // bool boolValue = contacts_svc_value_get_bool(value, CTS_BASE_VAL_FAVORITE_BOOL);
335 // m_abstractContact->setIsFavorite(boolValue);
337 // charValue = contacts_svc_value_get_str(value, CTS_BASE_VAL_NOTE_STR);
339 // m_abstractContact->addNote(charValue);
341 // else if (errorCode != CTS_ERR_NO_DATA || value == NULL)
349 bool ContactWrapper::convertToAbstractAddressObject()
351 if (NULL == m_abstractContact)
353 LogError("you should create empty abstract contact object first");
357 if (NULL == m_platformContact)
359 LogError("you should provide platform contact object first");
363 ContactAddressArrayPtr addresses = ContactAddressArrayPtr(new ContactAddressArray());
365 GSList *addressList = NULL;
366 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_POSTAL_ADDR_LIST, &addressList);
367 if (CTS_SUCCESS == errorCode)
369 for (; addressList; addressList = g_slist_next(addressList))
371 ContactAddressPtr address(new ContactAddress());
372 addresses->push_back(address);
374 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_TYPE_INT);
375 if(type & CTS_ADDR_TYPE_POSTAL) // TODO to be checked
376 address->addType(CONTACT_ADDRESS_TYPE_PREF);
377 if(type & CTS_ADDR_TYPE_HOME)
378 address->addType(CONTACT_ADDRESS_TYPE_HOME);
379 if(type & CTS_ADDR_TYPE_WORK)
380 address->addType(CONTACT_ADDRESS_TYPE_WORK);
382 const char *charValue = NULL;
384 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_COUNTRY_STR);
386 address->setCountry(charValue);
388 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_REGION_STR);
390 address->setRegion(charValue);
392 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_LOCALITY_STR);
394 address->setCity(charValue);
396 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_STREET_STR);
398 address->setStreetAddress(charValue);
400 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_POSTALCODE_STR);
402 address->setPostalCode(charValue);
404 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(addressList->data), CTS_POSTAL_VAL_EXTENDED_STR);
406 address->setAdditionalInformation(charValue);
410 else if (errorCode != CTS_ERR_NO_DATA)
415 m_abstractContact->setAddresses(addresses);
420 bool ContactWrapper::convertToAbstractUrlObject()
422 if (NULL == m_abstractContact)
424 LogError("you should create empty abstract contact object first");
428 if (NULL == m_platformContact)
430 LogError("you should provide platform contact object first");
434 ContactWebSiteArrayPtr urls = ContactWebSiteArrayPtr(new ContactWebSiteArray());
436 GSList *urlList = NULL;
437 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_WEB_ADDR_LIST, &urlList);
438 if (CTS_SUCCESS == errorCode)
440 for (; urlList; urlList = g_slist_next(urlList))
442 ContactWebSitePtr url(new ContactWebSite());
443 urls->push_back(url);
445 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(urlList->data), CTS_WEB_VAL_TYPE_INT);
448 case CTS_WEB_TYPE_NONE:
449 url->setType(WEBSITE_TYPE_HOMEPAGE);
451 case CTS_WEB_TYPE_HOME:
452 url->setType(WEBSITE_TYPE_HOMEPAGE);
454 case CTS_WEB_TYPE_WORK:
455 url->setType(WEBSITE_TYPE_BLOG);
458 LogError("invalid url type");
459 url->setType(WEBSITE_TYPE_HOMEPAGE);
463 const char *charValue = NULL;
465 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(urlList->data), CTS_WEB_VAL_ADDR_STR);
467 url->setUrl(charValue);
471 else if (errorCode != CTS_ERR_NO_DATA)
476 m_abstractContact->setUrls(urls);
481 bool ContactWrapper::convertToAbstractOrganizationObject()
483 if (NULL == m_abstractContact)
485 LogError("you should create empty abstract contact object first");
489 if (NULL == m_platformContact)
491 LogError("you should provide platform contact object first");
495 CTSvalue *value = NULL;
498 ContactOrganizationPtr organization(new ContactOrganization());
500 errorCode = contacts_svc_struct_get_value(m_platformContact, CTS_CF_COMPANY_VALUE, &value);
501 if (CTS_SUCCESS == errorCode)
503 const char *charValue = NULL;
505 charValue = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_NAME_STR);
507 organization->setName(charValue);
509 charValue = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_DEPARTMENT_STR);
511 organization->setDepartment(charValue);
513 charValue = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_JOB_TITLE_STR);
515 organization->setTitle(charValue);
517 charValue = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_ROLE_STR);
519 organization->setRole(charValue);
522 else if (errorCode != CTS_ERR_NO_DATA)
527 m_abstractContact->setOrganization(organization);
532 bool ContactWrapper::convertToAbstractAnniversaryObject()
534 if (NULL == m_abstractContact)
536 LogError("you should create empty abstract contact object first");
540 if (NULL == m_platformContact)
542 LogError("you should provide platform contact object first");
546 ContactAnniversaryArrayPtr anniversaries(new ContactAnniversaryArray());
548 GSList *eventList = NULL;
549 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_EVENT_LIST, &eventList);
550 if (CTS_SUCCESS == errorCode)
552 for (; eventList; eventList = g_slist_next(eventList))
554 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(eventList->data), CTS_EVENT_VAL_TYPE_INT);
555 int db_date = contacts_svc_value_get_int(static_cast<CTSvalue*>(eventList->data), CTS_EVENT_VAL_DATE_INT);
557 if (type == CTS_EVENT_TYPE_ANNIVERSARY)
559 ContactAnniversaryPtr anniversary = ContactAnniversaryPtr(new ContactAnniversary());
563 tm_date.tm_year = (db_date / 10000) - 1900;
564 tm_date.tm_mon = ((db_date - ((tm_date.tm_year + 1900) * 10000)) / 100) - 1;
565 tm_date.tm_mday = (db_date - ((tm_date.tm_year + 1900) * 10000) - tm_date.tm_mon * 100);
567 anniversary->setDate(tm_date);
570 // anniv->setLabel(string("ANNIVERSARY"));
572 anniversaries->push_back(anniversary);
576 else if (errorCode != CTS_ERR_NO_DATA)
581 m_abstractContact->setAnniversaries(anniversaries);
586 bool ContactWrapper::convertToAbstractBirthdayObject()
588 if (NULL == m_abstractContact)
590 LogError("you should create empty abstract contact object first");
594 if (NULL == m_platformContact)
596 LogError("you should provide platform contact object first");
600 GSList *eventList = NULL;
601 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_EVENT_LIST, &eventList);
602 if (CTS_SUCCESS == errorCode)
604 for (; eventList; eventList = g_slist_next(eventList))
606 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(eventList->data), CTS_EVENT_VAL_TYPE_INT);
607 int db_date = contacts_svc_value_get_int(static_cast<CTSvalue*>(eventList->data), CTS_EVENT_VAL_DATE_INT);
609 if (type == CTS_EVENT_TYPE_BIRTH)
613 tm_date.tm_year = (db_date / 10000) - 1900;
614 tm_date.tm_mon = ((db_date - ((tm_date.tm_year + 1900) * 10000)) / 100) - 1;
615 tm_date.tm_mday = (db_date - ((tm_date.tm_year + 1900) * 10000) - tm_date.tm_mon * 100);
617 m_abstractContact->setBirthday(tm_date);
622 else if (errorCode != CTS_ERR_NO_DATA)
630 bool ContactWrapper::convertToAbstractEmailObject()
632 if (NULL == m_abstractContact)
634 LogError("you should create empty abstract contact object first");
638 if (NULL == m_platformContact)
640 LogError("you should provide platform contact object first");
644 ContactEmailAddressArrayPtr emailAddresses(new ContactEmailAddressArray());
646 GSList *emailList = NULL;
647 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_EMAIL_LIST, &emailList);
648 if (CTS_SUCCESS == errorCode)
650 for (; emailList; emailList = g_slist_next(emailList))
652 ContactEmailAddressPtr email(new ContactEmailAddress());
654 emailAddresses->push_back(email);
656 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(emailList->data), CTS_EMAIL_VAL_TYPE_INT);
658 if(type | CTS_EMAIL_TYPE_NONE)
659 email->addType(CONTACT_EMAIL_TYPE_PREF);
660 if(type | CTS_EMAIL_TYPE_HOME)
661 email->addType(CONTACT_EMAIL_TYPE_HOME);
662 if(type | CTS_EMAIL_TYPE_WORK)
663 email->addType(CONTACT_EMAIL_TYPE_WORK);
665 const char *charValue = NULL;
667 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(emailList->data), CTS_EMAIL_VAL_ADDR_STR);
669 email->setEmail(charValue);
672 else if (errorCode != CTS_ERR_NO_DATA)
677 m_abstractContact->setEmails(emailAddresses);
682 bool ContactWrapper::convertToAbstractPhoneObject()
684 if (NULL == m_abstractContact)
686 LogError("you should create empty abstract contact object first");
690 if (NULL == m_platformContact)
692 LogError("you should provide platform contact object first");
696 ContactPhoneNumberArrayPtr phoneNumbers(new ContactPhoneNumberArray());
698 GSList *phoneList = NULL;
699 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_NUMBER_LIST, &phoneList);
700 if (CTS_SUCCESS == errorCode)
702 for (; phoneList; phoneList = g_slist_next(phoneList))
704 ContactPhoneNumberPtr phoneNumber(new ContactPhoneNumber());
705 phoneNumbers->push_back(phoneNumber);
707 int type = contacts_svc_value_get_int(static_cast<CTSvalue*>(phoneList->data), CTS_NUM_VAL_TYPE_INT);
708 if(type & CTS_NUM_TYPE_WORK)
709 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_WORK);
710 if(type & CTS_NUM_TYPE_NONE)
711 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_PREF);
712 if(type & CTS_NUM_TYPE_HOME)
713 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_HOME);
714 if(type & CTS_NUM_TYPE_FAX)
715 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_FAX);
716 if(type & CTS_NUM_TYPE_CELL)
717 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_CELL);
718 if(type & CTS_NUM_TYPE_PAGER)
719 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_PAGER);
720 if(type & CTS_NUM_TYPE_CAR)
721 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_CAR);
722 if(type & CTS_NUM_TYPE_VOICE)
723 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_VOICE);
724 if(type & CTS_NUM_TYPE_MSG)
725 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_MSG);
726 if(type & CTS_NUM_TYPE_BBS)
727 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_BBS);
728 if(type & CTS_NUM_TYPE_ISDN)
729 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_ISDN);
730 if(type & CTS_NUM_TYPE_VIDEO)
731 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_VIDEO);
732 if(type & CTS_NUM_TYPE_PCS)
733 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_PCS);
734 if(type & CTS_NUM_TYPE_WORK)
735 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_WORK);
736 if(type & CTS_NUM_TYPE_WORK)
737 phoneNumber->addType(CONTACT_PHONE_NUMBER_TYPE_WORK);
739 const char *charValue = NULL;
741 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(phoneList->data), CTS_NUM_VAL_NUMBER_STR);
743 phoneNumber->setNumber(charValue);
746 else if (errorCode != CTS_ERR_NO_DATA)
751 m_abstractContact->setPhoneNumbers(phoneNumbers);
756 bool ContactWrapper::convertToAbstractNicknameObject()
758 if (NULL == m_abstractContact)
760 LogError("you should create empty abstract contact object first");
764 if (NULL == m_platformContact)
766 LogError("you should provide platform contact object first");
770 StringArrayPtr nickNames(new StringArray());
772 GSList *nicknNameList = NULL;
773 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_NICKNAME_LIST, &nicknNameList);
774 if (CTS_SUCCESS == errorCode)
776 for (; nicknNameList; nicknNameList = g_slist_next(nicknNameList))
778 const char *charValue = NULL;
779 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(nicknNameList->data), CTS_NICKNAME_VAL_NAME_STR);
781 nickNames->push_back(charValue);
784 else if (errorCode != CTS_ERR_NO_DATA)
789 m_abstractContact->getName()->setNicknames(nickNames);
794 bool ContactWrapper::convertToAbstractPhoneticnameObject()
796 if (NULL == m_abstractContact)
798 LogError("you should create empty abstract contact object first");
802 if (NULL == m_platformContact)
804 LogError("you should provide platform contact object first");
808 int structFieldType = 0;
809 structFieldType = getCustomTypeInContactsSvc(CONTACT_ATTRIBUTE_PHONETIC_NAME);
810 if (structFieldType < CTS_SUCCESS)
812 LogError("Phonetic name struct type is not found!!");
816 CTSvalue *value = NULL;
818 errorCode = contacts_svc_struct_get_value(m_platformContact, static_cast<cts_struct_field>(structFieldType), &value);
819 if (CTS_SUCCESS == errorCode)
823 const char *charValue = NULL;
824 charValue = contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA2_STR);
826 m_abstractContact->getName()->setPhoneticName(charValue);
833 else if (errorCode != CTS_ERR_NO_DATA)
841 bool ContactWrapper::convertToAbstractGroupObject()
843 if (NULL == m_abstractContact)
845 LogError("you should create empty abstract contact object first");
849 if (NULL == m_platformContact)
851 LogError("you should provide platform contact object first");
855 StringArrayPtr categories(new StringArray());
857 GSList *groupList = NULL;
858 int errorCode = contacts_svc_struct_get_list(m_platformContact, CTS_CF_GROUPREL_LIST, &groupList);
859 if (CTS_SUCCESS == errorCode)
861 for (; groupList; groupList = g_slist_next(groupList))
863 const char *charValue = NULL;
864 charValue = contacts_svc_value_get_str(static_cast<CTSvalue*>(groupList->data), CTS_GROUPREL_VAL_NAME_STR);
866 categories->push_back(charValue);
869 else if (errorCode != CTS_ERR_NO_DATA)
874 m_abstractContact->setCategories(categories);
879 bool ContactWrapper::convertToPlatformNicknameObject()
881 if (NULL == m_abstractContact)
883 LogError("you should create empty abstract contact object first");
887 if (NULL == m_platformContact)
889 LogError("you should provide platform contact object first");
893 StringArrayPtr nicknames = m_abstractContact->getName()->getNicknames();
895 bool properlyCreated = true;
897 GSList *nicknameList = NULL;
898 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_NICKNAME_LIST, &nicknameList))
900 GSList *nicknameListSave = nicknameList;
901 for (; nicknameList; nicknameList = g_slist_next(nicknameList))
903 CTSvalue* nickname = static_cast<CTSvalue*>(nicknameList->data);
904 contacts_svc_value_set_bool(nickname, CTS_NICKNAME_VAL_DELETE_BOOL, true);
906 nicknameList = nicknameListSave;
909 if (nicknames->size() == 0 && nicknameList == NULL)
913 for (size_t i = 0; i < nicknames->size(); ++i)
915 CTSvalue *nickname = NULL;
916 nickname = contacts_svc_value_new(CTS_VALUE_NICKNAME);
919 if (CTS_SUCCESS == contacts_svc_value_set_str(nickname, CTS_NICKNAME_VAL_NAME_STR, nicknames->at(i).c_str()))
921 nicknameList = g_slist_append(nicknameList, nickname);
925 contacts_svc_value_free(nickname);
926 properlyCreated = false;
932 properlyCreated = false;
939 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_NICKNAME_LIST, nicknameList))
941 properlyCreated = false;
945 return properlyCreated;
948 bool ContactWrapper::convertToPlatformPhoneticnameObject()
950 if (NULL == m_abstractContact)
952 LogError("you should create empty abstract contact object first");
956 if (NULL == m_platformContact)
958 LogError("you should provide platform contact object first");
962 int structFieldType = 0;
963 structFieldType = getCustomTypeInContactsSvc(CONTACT_ATTRIBUTE_PHONETIC_NAME);
964 if (structFieldType < CTS_SUCCESS)
966 LogError("Phonetic name struct type is not found!!");
971 *If phonetic name information is not existed, add phonetic name information
972 *If phonetic name information is existed,update phonetic name information
974 CTSvalue *value = NULL;
975 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, static_cast<cts_struct_field>(structFieldType), &value))
977 value = contacts_svc_value_new(CTS_VALUE_EXTEND);
983 if (CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_EXTEND_VAL_DATA2_STR, m_abstractContact->getName()->getPhoneticName().c_str())
984 || CTS_SUCCESS != contacts_svc_struct_store_value(m_platformContact, static_cast<cts_struct_field>(structFieldType), value))
986 contacts_svc_value_free(value);
990 contacts_svc_value_free(value);
992 // LogDebug("RETURN TRUE!!!");
996 bool ContactWrapper::convertToPlatformGroupObject()
998 // LogDebug("entered");
999 if (NULL == m_abstractContact)
1001 LogError("you should create empty abstract contact object first");
1005 if (NULL == m_platformContact)
1007 LogError("you should provide platform contact object first");
1011 StringArrayPtr groups = m_abstractContact->getCategories();
1012 CTSvalue *group = NULL;
1013 bool properlyCreated = true;
1014 GSList *groupList = NULL;
1015 //mark existing items to delete them.
1016 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_GROUPREL_LIST, &groupList))
1018 GSList *groupListSave = groupList;
1019 for (; groupList; groupList = g_slist_next(groupList))
1021 // LogDebug("clearing group list");
1022 CTSvalue* delgroup = static_cast<CTSvalue*>(groupList->data);
1023 contacts_svc_value_set_bool(delgroup, CTS_GROUPREL_VAL_DELETE_BOOL, true);
1025 groupList = groupListSave;
1027 if (groups->size() == 0 && groupList == NULL
1032 query_error error_code = QUERY_SUCCESS;
1033 GSList *groups_list = NULL;
1037 string accountIdStr = m_abstractContact->getAccount()->getAccountServiceId();
1038 stringstream ss(accountIdStr);
1041 LogError("Wrong account id");
1045 int addressBookId = find_addressbook_id(accountId, &error_code);
1046 if (error_code != QUERY_SUCCESS)
1049 CTSiter* group_iter;
1050 bool is_new_group = true;
1052 for (size_t i = 0; i < groups->size(); ++i)
1054 if (CTS_SUCCESS == contacts_svc_get_list(CTS_LIST_ALL_GROUP, &group_iter))
1056 while (CTS_SUCCESS == contacts_svc_iter_next(group_iter))
1058 CTSvalue *findgroup = contacts_svc_iter_get_info(group_iter);
1061 group_info_t* group_info = g_new0(group_info_t, 1);
1063 group_info->group_name = g_strdup(contacts_svc_value_get_str(findgroup, CTS_LIST_GROUP_NAME_STR));
1064 group_info->addressbook_id = contacts_svc_value_get_int(findgroup, CTS_GROUP_VAL_ADDRESSBOOK_ID_INT);
1065 group_info->group_id = contacts_svc_value_get_int(findgroup, CTS_GROUP_VAL_ID_INT);
1066 groups_list = g_slist_append(groups_list, group_info);
1071 group = contacts_svc_value_new(CTS_VALUE_GROUP_RELATION);
1075 //groupId = AddressBook::getGroupId(groups[i]);
1077 is_new_group = true;
1078 GSList* tmp_list = groups_list;
1081 group_info_t* info = (group_info_t*) tmp_list->data;
1083 if ((info->group_name != NULL) && (groups->at(i).compare(info->group_name) == 0)
1084 && (info->addressbook_id == addressBookId))
1086 is_new_group = false;
1087 groupId = info->group_id;
1089 if (info->group_name)
1090 free(info->group_name);
1092 tmp_list = g_slist_next(tmp_list);
1094 g_slist_free(groups_list);
1099 CTSvalue *new_group;
1100 new_group = contacts_svc_value_new(CTS_VALUE_GROUP);
1102 contacts_svc_value_set_str(new_group, CTS_GROUP_VAL_NAME_STR, (const char*) (groups->at(i).c_str()));
1103 contacts_svc_value_set_int(new_group, CTS_GROUP_VAL_ADDRESSBOOK_ID_INT, addressBookId);
1104 groupId = contacts_svc_insert_group(addressBookId, new_group);
1107 contacts_svc_value_free(new_group);
1109 // LogDebug("group id " << groupId);
1112 if (CTS_SUCCESS == contacts_svc_value_set_int(group, CTS_GROUPREL_VAL_ID_INT, groupId))
1114 groupList = g_slist_append(groupList, group);
1118 contacts_svc_value_free(group);
1119 properlyCreated = false;
1125 contacts_svc_value_free(group);
1126 properlyCreated = false;
1132 properlyCreated = false;
1136 if (properlyCreated)
1138 // LogDebug("storing group list");
1139 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_GROUPREL_LIST, groupList))
1141 properlyCreated = false;
1144 for (; groupList; groupList = g_slist_next(groupList))
1146 contacts_svc_value_free(static_cast<CTSvalue*>(groupList->data));
1148 g_slist_free(groupList);
1149 return properlyCreated;
1152 bool ContactWrapper::convertToPlatformUrlObject()
1154 // LogDebug("entered");
1155 if (NULL == m_abstractContact)
1157 LogError("you should create empty abstract contact object first");
1161 if (NULL == m_platformContact)
1163 LogError("you should provide platform contact object first");
1168 ContactWebSiteArrayPtr urls = m_abstractContact->getUrls();
1169 CTSvalue *url = NULL;
1170 bool properlyCreated = true;
1171 GSList *urlList = NULL;
1172 //mark existing items to delete them.
1173 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_WEB_ADDR_LIST, &urlList))
1175 GSList *urlListSave = urlList;
1176 for (; urlList; urlList = g_slist_next(urlList))
1178 // LogDebug("clearing url list");
1179 CTSvalue* tmp_email = static_cast<CTSvalue*>(urlList->data);
1180 contacts_svc_value_set_bool(tmp_email, CTS_WEB_VAL_DELETE_BOOL, true);
1182 urlList = urlListSave;
1184 if (urls->size() == 0 && urlList == NULL
1189 for (size_t i = 0; i < urls->size(); ++i)
1191 ContactWebSiteType types = urls->at(i)->getType();
1192 url = contacts_svc_value_new(CTS_VALUE_WEB);
1197 case WEBSITE_TYPE_HOMEPAGE:
1198 type = CTS_WEB_TYPE_HOME;
1200 case WEBSITE_TYPE_BLOG:
1201 type = CTS_WEB_TYPE_WORK;
1204 LogError("invalid phone type");
1205 type = CTS_WEB_TYPE_NONE;
1208 if (CTS_SUCCESS == contacts_svc_value_set_int(url, CTS_WEB_VAL_TYPE_INT, type)
1209 && CTS_SUCCESS == contacts_svc_value_set_str(url, CTS_WEB_VAL_ADDR_STR, urls->at(i)->getUrl().c_str()))
1211 urlList = g_slist_append(urlList, url);
1215 contacts_svc_value_free(url);
1216 properlyCreated = false;
1222 properlyCreated = false;
1226 if (!properlyCreated)
1232 if (properlyCreated)
1234 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_WEB_ADDR_LIST, urlList))
1236 properlyCreated = false;
1239 for (; urlList; urlList = g_slist_next(urlList))
1241 contacts_svc_value_free(static_cast<CTSvalue*>(urlList->data));
1243 g_slist_free(urlList);
1244 return properlyCreated;
1247 bool ContactWrapper::convertToPlatformOrganizationObject()
1249 // LogDebug("entered");
1250 if (NULL == m_abstractContact)
1252 LogError("you should create empty abstract contact object first");
1256 if (NULL == m_platformContact)
1258 LogError("you should provide platform contact object first");
1262 ContactOrganizationPtr org = m_abstractContact->getOrganization();
1263 CTSvalue *organization = NULL;
1265 //mark existing items to delete them.
1266 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, CTS_CF_COMPANY_VALUE, &organization))
1268 CTSvalue *value = contacts_svc_value_new(CTS_VALUE_COMPANY);
1271 if (CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_COMPANY_VAL_NAME_STR, org->getName().c_str())
1272 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_COMPANY_VAL_DEPARTMENT_STR, org->getDepartment().c_str())
1273 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_COMPANY_VAL_JOB_TITLE_STR, org->getTitle().c_str())
1274 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_COMPANY_VAL_ROLE_STR, org->getRole().c_str())
1275 || CTS_SUCCESS != contacts_svc_struct_store_value(m_platformContact, CTS_CF_COMPANY_VALUE, value))
1277 contacts_svc_value_free(value);
1280 contacts_svc_value_free(value);
1289 contacts_svc_value_set_str(organization, CTS_COMPANY_VAL_NAME_STR, org->getName().c_str());
1290 contacts_svc_value_set_str(organization, CTS_COMPANY_VAL_DEPARTMENT_STR, org->getDepartment().c_str());
1291 contacts_svc_value_set_str(organization, CTS_COMPANY_VAL_JOB_TITLE_STR, org->getTitle().c_str());
1292 contacts_svc_value_set_str(organization, CTS_COMPANY_VAL_ROLE_STR, org->getRole().c_str());
1293 contacts_svc_struct_store_value(m_platformContact, CTS_CF_COMPANY_VALUE, organization);
1294 contacts_svc_value_free(organization);
1300 bool ContactWrapper::convertToPlatformAnniversaryObject()
1302 // LogDebug("entered");
1303 if (NULL == m_abstractContact)
1305 LogError("you should create empty abstract contact object first");
1309 if (NULL == m_platformContact)
1311 LogError("you should provide platform contact object first");
1315 ContactAnniversaryArrayPtr anniversaries = m_abstractContact->getAnniversaries();
1316 CTSvalue *anniversary = NULL;
1317 bool properlyCreated = true;
1318 GSList *anniversaryList = NULL;
1320 //mark existing items to delete them.
1321 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_EVENT_LIST, &anniversaryList))
1323 GSList *anniversaryListSave = anniversaryList;
1324 for (; anniversaryList; anniversaryList = g_slist_next(anniversaryList))
1326 // LogDebug("clearing anniversary list");
1327 CTSvalue* tmp_anniversary = static_cast<CTSvalue*>(anniversaryList->data);
1328 contacts_svc_value_set_bool(tmp_anniversary, CTS_EVENT_VAL_DELETE_BOOL, true);
1330 anniversaryList = anniversaryListSave;
1332 if (anniversaries->size() == 0 && anniversaryList == NULL
1338 for (size_t i = 0; i < anniversaries->size(); ++i)
1341 std::tm abstract_date = anniversaries->at(i)->getDate();
1343 date = (abstract_date.tm_year + 1900) * 10000 + (abstract_date.tm_mon+1) * 100 + abstract_date.tm_mday;
1344 anniversary = contacts_svc_value_new(CTS_VALUE_EVENT);
1347 if (CTS_SUCCESS == contacts_svc_value_set_int(anniversary, CTS_EVENT_VAL_TYPE_INT, CTS_EVENT_TYPE_ANNIVERSARY)
1348 && CTS_SUCCESS == contacts_svc_value_set_int(anniversary, CTS_EVENT_VAL_DATE_INT, date))
1350 anniversaryList = g_slist_append(anniversaryList, anniversary);
1354 contacts_svc_value_free(anniversary);
1355 properlyCreated = false;
1361 properlyCreated = false;
1365 if (!properlyCreated)
1371 if (properlyCreated)
1373 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_EVENT_LIST, anniversaryList))
1375 properlyCreated = false;
1378 for (; anniversaryList; anniversaryList = g_slist_next(anniversaryList))
1380 contacts_svc_value_free(static_cast<CTSvalue*>(anniversaryList->data));
1382 g_slist_free(anniversaryList);
1383 return properlyCreated;
1386 bool ContactWrapper::convertToPlatformbirthdayObject()
1388 // LogDebug("entered");
1389 if (NULL == m_abstractContact)
1391 LogError("you should create empty abstract contact object first");
1395 if (NULL == m_platformContact)
1397 LogError("you should provide platform contact object first");
1401 tm birth_date = m_abstractContact->getBirthday();
1403 CTSvalue *birthday = NULL;
1404 bool properlyCreated = true;
1405 GSList *anniversaryList = NULL;
1407 //mark existing items to delete them.
1408 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_EVENT_LIST, &anniversaryList))
1410 GSList *anniversaryListSave = anniversaryList;
1411 for (; anniversaryList; anniversaryList = g_slist_next(anniversaryList))
1413 // LogDebug("clearing anniversary list");
1414 CTSvalue* tmp_anniversary = static_cast<CTSvalue*>(anniversaryList->data);
1415 int type = contacts_svc_value_get_int(tmp_anniversary, CTS_EVENT_VAL_TYPE_INT);
1416 if (type == CTS_EVENT_TYPE_BIRTH)
1417 contacts_svc_value_set_bool(tmp_anniversary, CTS_EVENT_VAL_DELETE_BOOL, true);
1419 anniversaryList = anniversaryListSave;
1421 if (birth_date.tm_year == 0 && birth_date.tm_mon == 0 && birth_date.tm_mday == 0 && anniversaryList == NULL
1427 date = (birth_date.tm_year + 1900) * 10000 + (birth_date.tm_mon+1) * 100 + birth_date.tm_mday;
1428 // for (size_t i = 0; i < anniversaries->size(); ++i) {
1429 birthday = contacts_svc_value_new(CTS_VALUE_EVENT);
1433 if (CTS_SUCCESS == contacts_svc_value_set_int(birthday, CTS_EVENT_VAL_TYPE_INT, CTS_EVENT_TYPE_BIRTH)
1434 && CTS_SUCCESS == contacts_svc_value_set_int(birthday, CTS_EVENT_VAL_DATE_INT, date))
1436 anniversaryList = g_slist_append(anniversaryList, birthday);
1440 contacts_svc_value_free(birthday);
1441 properlyCreated = false;
1447 properlyCreated = false;
1451 // if (!properlyCreated) {
1456 if (properlyCreated)
1458 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_EVENT_LIST, anniversaryList))
1460 properlyCreated = false;
1463 for (; anniversaryList; anniversaryList = g_slist_next(anniversaryList))
1465 contacts_svc_value_free(static_cast<CTSvalue*>(anniversaryList->data));
1467 g_slist_free(anniversaryList);
1468 return properlyCreated;
1471 bool ContactWrapper::convertToPlatformPhoneObject()
1473 // LogDebug("entered");
1474 if (NULL == m_abstractContact)
1476 LogError("you should create empty abstract contact object first");
1480 if (NULL == m_platformContact)
1482 LogError("you should provide platform contact object first");
1487 ContactPhoneNumberArrayPtr phoneNumbers = m_abstractContact->getPhoneNumbers();
1488 bool properlyCreated = true;
1489 CTSvalue *number = NULL;
1490 GSList *numberList = NULL;
1491 //mark existing items to delete them.
1492 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_NUMBER_LIST, &numberList))
1494 GSList *numberListSave = numberList;
1495 for (; numberList; numberList = g_slist_next(numberList))
1497 // LogDebug("clearing phone list");
1498 CTSvalue* number = static_cast<CTSvalue*>(numberList->data);
1499 contacts_svc_value_set_bool(number, CTS_NUM_VAL_DELETE_BOOL, true);
1501 numberList = numberListSave;
1503 if (phoneNumbers->size() == 0 && numberList == NULL )
1507 for (size_t i = 0; i < phoneNumbers->size(); ++i)
1509 ContactPhoneNumberTypeArrayPtr types = phoneNumbers->at(i)->getTypes();
1510 number = contacts_svc_value_new(CTS_VALUE_NUMBER);
1514 for (size_t j = 0; j < types->size(); ++j)
1516 if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_WORK)
1517 type = type | CTS_NUM_TYPE_WORK;
1518 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_PREF)
1519 type = type | CTS_NUM_TYPE_NONE;
1520 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_HOME)
1521 type = type | CTS_NUM_TYPE_HOME;
1522 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_FAX)
1523 type = type | CTS_NUM_TYPE_FAX;
1524 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_CELL)
1525 type = type | CTS_NUM_TYPE_CELL;
1526 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_PAGER)
1527 type = type | CTS_NUM_TYPE_PAGER;
1528 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_CAR)
1529 type = type | CTS_NUM_TYPE_CAR;
1530 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_BBS)
1531 type = type | CTS_NUM_TYPE_BBS;
1532 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_MODEM)
1533 type = type | CTS_NUM_TYPE_MODEM;
1534 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_ISDN)
1535 type = type | CTS_NUM_TYPE_ISDN;
1536 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_VIDEO)
1537 type = type | CTS_NUM_TYPE_VIDEO;
1538 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_VOICE)
1539 type = type | CTS_NUM_TYPE_VOICE;
1540 else if (types->at(j) == CONTACT_PHONE_NUMBER_TYPE_MSG)
1541 type = type | CTS_NUM_TYPE_MSG;
1544 LogError("invalid phone type");
1545 type = CTS_NUM_TYPE_NONE;
1548 if (CTS_SUCCESS == contacts_svc_value_set_str(number, CTS_NUM_VAL_NUMBER_STR, phoneNumbers->at(i)->getNumber().c_str())
1549 && CTS_SUCCESS == contacts_svc_value_set_bool(number, CTS_NUM_VAL_DEFAULT_BOOL, type == CTS_NUM_TYPE_NONE)
1550 && CTS_SUCCESS == contacts_svc_value_set_int(number, CTS_NUM_VAL_TYPE_INT, type))
1552 numberList = g_slist_append(numberList, number);
1556 contacts_svc_value_free(number);
1557 properlyCreated = false;
1563 properlyCreated = false;
1566 if (!properlyCreated)
1571 if (properlyCreated)
1573 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_NUMBER_LIST, numberList))
1575 properlyCreated = false;
1578 for (; numberList; numberList = g_slist_next(numberList))
1580 contacts_svc_value_free(static_cast<CTSvalue*>(numberList->data));
1582 g_slist_free(numberList);
1583 return properlyCreated;
1586 bool ContactWrapper::convertToPlatformEmailObject()
1588 // LogDebug("entered");
1589 if (NULL == m_abstractContact)
1591 LogError("you should create empty abstract contact object first");
1595 if (NULL == m_platformContact)
1597 LogError("you should provide platform contact object first");
1602 ContactEmailAddressArrayPtr emails = m_abstractContact->getEmails();
1603 CTSvalue *email = NULL;
1604 bool properlyCreated = true;
1605 GSList *emailList = NULL;
1606 //mark existing items to delete them.
1607 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_EMAIL_LIST, &emailList))
1609 GSList *emailListSave = emailList;
1610 for (; emailList; emailList = g_slist_next(emailList))
1612 // LogDebug("clearing email list");
1613 CTSvalue* email = static_cast<CTSvalue*>(emailList->data);
1614 contacts_svc_value_set_bool(email, CTS_EMAIL_VAL_DELETE_BOOL, true);
1616 emailList = emailListSave;
1618 if (emails->size() == 0 && emailList == NULL)
1622 for (size_t i = 0; i < emails->size(); ++i)
1624 ContactEmailAddressTypeArrayPtr types = emails->at(i)->getTypes();
1625 email = contacts_svc_value_new(CTS_VALUE_EMAIL);
1629 for (size_t j = 0; j < types->size(); ++j)
1631 switch (types->at(j))
1633 case CONTACT_EMAIL_TYPE_HOME:
1634 type = type | CTS_EMAIL_TYPE_HOME;
1636 case CONTACT_EMAIL_TYPE_WORK:
1637 type = type | CTS_EMAIL_TYPE_WORK;
1639 case CONTACT_EMAIL_TYPE_PREF:
1640 type = type | CTS_EMAIL_TYPE_NONE;
1643 LogError("invalid phone type");
1644 type = CTS_EMAIL_TYPE_NONE;
1648 if (CTS_SUCCESS == contacts_svc_value_set_int(email, CTS_EMAIL_VAL_TYPE_INT, type)
1649 && CTS_SUCCESS == contacts_svc_value_set_str(email, CTS_EMAIL_VAL_ADDR_STR, emails->at(i)->getEmail().c_str()))
1651 emailList = g_slist_append(emailList, email);
1655 contacts_svc_value_free(email);
1656 properlyCreated = false;
1662 properlyCreated = false;
1666 if (!properlyCreated)
1671 if (properlyCreated)
1673 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_EMAIL_LIST, emailList))
1675 properlyCreated = false;
1678 for (; emailList; emailList = g_slist_next(emailList))
1680 contacts_svc_value_free(static_cast<CTSvalue*>(emailList->data));
1682 g_slist_free(emailList);
1683 return properlyCreated;
1686 bool ContactWrapper::convertToPlatformAddressObject()
1688 // LogDebug("entered");
1689 if (NULL == m_abstractContact)
1691 LogError("you should create empty abstract contact object first");
1695 if (NULL == m_platformContact)
1697 LogError("you should provide platform contact object first");
1702 ContactAddressArrayPtr addresses = m_abstractContact->getAddresses();
1703 bool properlyCreated = true;
1705 GSList *addressList = NULL;
1706 if (CTS_SUCCESS == contacts_svc_struct_get_list(m_platformContact, CTS_CF_POSTAL_ADDR_LIST, &addressList))
1708 GSList *addressListSave = addressList;
1709 for (; addressList; addressList = g_slist_next(addressList))
1711 // LogDebug("clearing address list");
1712 CTSvalue* address = static_cast<CTSvalue*>(addressList->data);
1713 contacts_svc_value_set_bool(address, CTS_POSTAL_VAL_DELETE_BOOL, true);
1715 addressList = addressListSave;
1717 if (addresses->size() == 0 && addressList == NULL)
1721 for (size_t i = 0; i < addresses->size(); ++i)
1723 ContactAddressTypeArrayPtr types = addresses->at(i)->getTypes();
1725 CTSvalue *address = NULL;
1726 address = contacts_svc_value_new(CTS_VALUE_POSTAL);
1730 for (size_t j = 0; j < types->size(); ++j)
1732 switch (types->at(j))
1734 case CONTACT_ADDRESS_TYPE_PREF:
1735 type |= CTS_ADDR_TYPE_POSTAL; // TODO To be checked
1737 case CONTACT_ADDRESS_TYPE_WORK:
1738 type |= CTS_ADDR_TYPE_WORK;
1740 case CONTACT_ADDRESS_TYPE_HOME:
1741 type |= CTS_ADDR_TYPE_HOME;
1744 LogError("invalid address type");
1745 type |= CTS_EMAIL_TYPE_NONE;
1749 if (CTS_SUCCESS == contacts_svc_value_set_int(address, CTS_POSTAL_VAL_TYPE_INT, type)
1750 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_COUNTRY_STR, addresses->at(i)->getCountry().c_str())
1751 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_REGION_STR, addresses->at(i)->getRegion().c_str())
1752 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_LOCALITY_STR, addresses->at(i)->getCity().c_str())
1753 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_STREET_STR, addresses->at(i)->getStreetAddress().c_str())
1754 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_POBOX_STR, addresses->at(i)->getAdditionalInformation().c_str())
1755 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_POSTALCODE_STR, addresses->at(i)->getPostalCode().c_str())
1756 && CTS_SUCCESS == contacts_svc_value_set_str(address, CTS_POSTAL_VAL_EXTENDED_STR, addresses->at(i)->getAdditionalInformation().c_str()))
1758 addressList = g_slist_append(addressList, address);
1762 contacts_svc_value_free(address);
1763 properlyCreated = false;
1769 properlyCreated = false;
1773 if (!properlyCreated)
1779 if (properlyCreated)
1781 if (CTS_SUCCESS != contacts_svc_struct_store_list(m_platformContact, CTS_CF_POSTAL_ADDR_LIST, addressList))
1783 properlyCreated = false;
1786 for (; addressList; addressList = g_slist_next(addressList))
1788 contacts_svc_value_free(static_cast<CTSvalue*>(addressList->data));
1791 g_slist_free(addressList);
1793 return properlyCreated;
1796 bool ContactWrapper::convertToPlatformBaseData()
1798 if (NULL == m_abstractContact)
1800 LogError("you should create empty abstract contact object first");
1804 if (NULL == m_platformContact)
1806 LogError("you should provide platform contact object first");
1811 *If name information is not existed, add name information
1812 * If name information is existed,update name information
1814 CTSvalue *value = NULL;
1816 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, CTS_CF_NAME_VALUE, &value))
1818 CTSvalue *value = contacts_svc_value_new(CTS_VALUE_NAME);
1821 ContactNamePtr contactName = m_abstractContact->getName();
1822 if (CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_FIRST_STR, contactName->getFirstName().c_str())
1823 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_LAST_STR, contactName->getLastName().c_str())
1824 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_ADDITION_STR, contactName->getMiddleName().c_str())
1825 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_DISPLAY_STR, contactName->getDisplayName().c_str())
1826 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_PREFIX_STR, contactName->getPrefix().c_str())
1827 // || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_SUFFIX_STR, contactName->getPhoneticName().c_str())
1828 || CTS_SUCCESS != contacts_svc_struct_store_value(m_platformContact, CTS_CF_NAME_VALUE, value))
1830 contacts_svc_value_free(value);
1833 contacts_svc_value_free(value);
1842 ContactNamePtr contactName = m_abstractContact->getName();
1843 if (CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_FIRST_STR, contactName->getFirstName().c_str())
1844 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_LAST_STR, contactName->getLastName().c_str())
1845 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_ADDITION_STR, contactName->getMiddleName().c_str())
1846 || CTS_SUCCESS != contacts_svc_value_set_str(value, CTS_NAME_VAL_DISPLAY_STR, contactName->getDisplayName().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_value_set_str(value, CTS_NAME_VAL_PREFIX_STR, contactName->getPrefix().c_str()))
1850 contacts_svc_value_free(value);
1853 contacts_svc_value_free(value);
1857 *If photo and ringtone uri information is not existed, add the information
1858 * If photo and ringtone uri is existed,update the information
1860 CTSvalue *baseinfo = NULL;
1861 if (CTS_SUCCESS != contacts_svc_struct_get_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, &baseinfo))
1864 baseinfo = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO);
1867 if (m_abstractContact->getPhotoURIIsSet())
1869 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_IMG_PATH_STR, convertUriToPath(m_abstractContact->getPhotoURI()).c_str()))
1871 contacts_svc_value_free(baseinfo);
1876 if (m_abstractContact->getRingtoneURIIsSet())
1878 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_RINGTONE_PATH_STR, convertUriToPath(m_abstractContact->getRingtoneURI()).c_str()))
1880 contacts_svc_value_free(baseinfo);
1885 if (CTS_SUCCESS != contacts_svc_value_set_bool(baseinfo, CTS_BASE_VAL_FAVORITE_BOOL, m_abstractContact->getIsFavorite()))
1887 contacts_svc_value_free(baseinfo);
1891 if(m_abstractContact->getNotesNum() > 0)
1893 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_NOTE_STR, m_abstractContact->getNotes()->at(0).c_str()))
1895 contacts_svc_value_free(baseinfo);
1900 contacts_svc_struct_store_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, baseinfo);
1901 contacts_svc_value_free(baseinfo);
1910 const char * oldimgpath = NULL;
1911 oldimgpath = contacts_svc_value_get_str(baseinfo, CTS_BASE_VAL_IMG_PATH_STR);
1913 string strOldImagePath = "";
1914 if (NULL != oldimgpath)
1916 strOldImagePath = static_cast<string>(oldimgpath);
1919 string strNewImagePath = convertUriToPath(m_abstractContact->getPhotoURI());
1920 if (strOldImagePath != strNewImagePath)
1922 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_IMG_PATH_STR, strNewImagePath.c_str()))
1924 contacts_svc_value_free(baseinfo);
1929 const char * oldringtonepath = NULL;
1930 oldringtonepath = contacts_svc_value_get_str(baseinfo, CTS_BASE_VAL_IMG_PATH_STR);
1932 string strOldRingtonePath = "";
1933 if (NULL != oldringtonepath)
1935 strOldRingtonePath = static_cast<string>(oldringtonepath);
1938 string strNewRingtonePath = convertUriToPath(m_abstractContact->getRingtoneURI());
1939 if (strOldRingtonePath != strNewRingtonePath)
1941 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_RINGTONE_PATH_STR, strNewRingtonePath.c_str()))
1943 contacts_svc_value_free(baseinfo);
1948 if(m_abstractContact->getNotesNum() > 0)
1950 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_NOTE_STR, m_abstractContact->getNotes()->at(0).c_str()))
1952 contacts_svc_value_free(baseinfo);
1958 if (CTS_SUCCESS != contacts_svc_value_set_str(baseinfo, CTS_BASE_VAL_NOTE_STR, ""))
1960 contacts_svc_value_free(baseinfo);
1965 contacts_svc_struct_store_value(m_platformContact, CTS_CF_BASE_INFO_VALUE, baseinfo);
1966 contacts_svc_value_free(baseinfo);
1969 //save company information
1970 CTSvalue *company = NULL;
1971 company = contacts_svc_value_new(CTS_VALUE_COMPANY);
1973 if (m_abstractContact->getOrganizations()->size() > 0) {
1975 contacts_svc_value_set_str(company, CTS_COMPANY_VAL_NAME_STR,
1976 m_abstractContact->getOrganizations()->at(0)->getName().c_str())
1979 contacts_svc_struct_store_value(m_platformContact,
1980 CTS_CF_COMPANY_VALUE, company))
1982 contacts_svc_value_free(company);
1986 contacts_svc_value_free(value);
1994 int ContactWrapper::getCustomTypeInContactsSvc(const string &typeName) const
1996 int structFieldType = -1;
1997 structFieldType = contacts_svc_find_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, const_cast<char*>(typeName.c_str()));
1998 if ( CTS_ERR_DB_RECORD_NOT_FOUND == structFieldType)
2000 LogDebug("CTS_ERR_DB_RECORD_NOT_FOUND!!");
2002 structFieldType = contacts_svc_insert_custom_type( CTS_TYPE_CLASS_EXTEND_DATA, const_cast<char*>(typeName.c_str()));
2003 if (CTS_SUCCESS > structFieldType)
2005 LogDebug("Create fail");
2008 else if (CTS_SUCCESS > structFieldType)
2010 LogDebug("contacts_svc_find_custom_type is fail");
2013 return structFieldType;
2016 void ContactWrapper::printPlatformObject()
2020 void ContactWrapper::printAbstractObject()
2024 string ContactWrapper::convertUriToPath(string str) const
2028 if(validate("^file\\:///[a-zA-Z]{2,3}(/\\S*)?$", str, VALIDATE_MATCH_CASELESS))
2029 result = str.substr(string("file://").size());
2030 else if(validate("^/[a-zA-Z]{2,3}(/\\S*)?$", str, VALIDATE_MATCH_CASELESS))
2036 string ContactWrapper::convertPathToUri(string str) const
2040 if(validate("^/[a-zA-Z]{2,3}(/\\S*)?$", str, VALIDATE_MATCH_CASELESS))
2041 result = "file://" + str;
2042 else if(validate("^file\\:///[a-zA-Z]{2,3}(/\\S*)?$", str, VALIDATE_MATCH_CASELESS))