2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file ContactSearchEngine.cpp
20 * @author Kisub Song (kisubs.song@samsung.com)
25 #include "ContactSearchEngine.h"
32 #include <Commons/Exception.h>
34 #include "ContactObjectP2AConverter.h"
35 #include "ContactUtility.h"
38 #define _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter) \
40 if((errorCode = contacts_query_create(view_uri, &query)) != CONTACTS_ERROR_NONE) \
41 ThrowMsg(PlatformException, "contacts_query_create error : " << errorCode << " (" << __FUNCTION__ << ")"); \
42 if((errorCode = contacts_filter_create(view_uri, &filter)) != CONTACTS_ERROR_NONE) \
43 ThrowMsg(PlatformException, "contacts_filter_create error : " << errorCode << " (" << __FUNCTION__ << ")"); \
46 #define _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result) \
48 if((errorCode = contacts_query_set_filter(query, filter)) != CONTACTS_ERROR_NONE) \
49 ThrowMsg(PlatformException, "contacts_query_set_filter error : " << errorCode << " (" << __FUNCTION__ << ")"); \
50 if((errorCode = contacts_db_get_records_with_query(query, 0, 0, &list)) != CONTACTS_ERROR_NONE) \
51 ThrowMsg(PlatformException, "contacts_db_get_records_with_query error : " << errorCode << " (" << __FUNCTION__ << ")"); \
52 unsigned int record_count = 0; \
53 if((errorCode = contacts_list_get_count(list, &record_count)) != CONTACTS_ERROR_NONE) \
54 ThrowMsg(PlatformException, "contacts_list_get_count error : " << errorCode << " (" << __FUNCTION__ << ")"); \
55 contacts_list_first(list); \
56 for(unsigned int i=0; i<record_count; i++) { \
57 contacts_record_h record; \
58 if((errorCode = contacts_list_get_current_record_p(list, &record)) != CONTACTS_ERROR_NONE) \
59 ThrowMsg(PlatformException, "contacts_list_get_current_record_p error : " << errorCode << " (" << __FUNCTION__ << ")"); \
61 if((errorCode = contacts_record_get_int(record, property_contact_id, &value)) != CONTACTS_ERROR_NONE) \
62 ThrowMsg(PlatformException, "contacts_record_get_int error : " << errorCode << " (" << __FUNCTION__ << ")"); \
63 result->insert(value); \
64 contacts_list_next(list); \
67 contacts_list_destroy(list, true); \
69 contacts_filter_destroy(filter); \
71 contacts_query_destroy(query); \
78 using namespace WrtDeviceApis::Commons;
79 using namespace DeviceAPI::Tizen;
82 ContactSearchEngine::AttributePropertiesMap ContactSearchEngine::attributePropertiesMap = {
83 {"id", { _contacts_simple_contact._uri, _contacts_simple_contact.id, _contacts_simple_contact.id, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_String } },
84 {"personId", { _contacts_simple_contact._uri, _contacts_simple_contact.id, _contacts_simple_contact.person_id, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_String } },
85 {"addressBookId", { _contacts_simple_contact._uri, _contacts_simple_contact.id, _contacts_simple_contact.address_book_id, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_String } },
86 {"lastUpdated", { _contacts_simple_contact._uri, _contacts_simple_contact.id, _contacts_simple_contact.changed_time, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_Time } },
87 {"isFavorite", { _contacts_simple_contact._uri, _contacts_simple_contact.id, _contacts_simple_contact.is_favorite, ContactSearchEngine::ContactSvcPrimitiveType_Boolean, PrimitiveType_Boolean } },
88 {"name.prefix", { _contacts_name._uri, _contacts_name.contact_id, _contacts_name.prefix, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
89 {"name.suffix", { _contacts_name._uri, _contacts_name.contact_id, _contacts_name.suffix, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
90 {"name.firstName", { _contacts_name._uri, _contacts_name.contact_id, _contacts_name.first, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
91 {"name.middleName", { _contacts_name._uri, _contacts_name.contact_id, _contacts_name.addition, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
92 {"name.lastName", { _contacts_name._uri, _contacts_name.contact_id, _contacts_name.last, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
93 {"name.nicknames", { _contacts_nickname._uri, _contacts_nickname.contact_id, _contacts_nickname.name, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
94 {"name.phoneticFirstName", { _contacts_name._uri, _contacts_name.contact_id, _contacts_name.phonetic_first, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
95 {"name.phoneticLastName", { _contacts_name._uri, _contacts_name.contact_id, _contacts_name.phonetic_last, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
96 {"name.displayName", { _contacts_simple_contact._uri, _contacts_simple_contact.id, _contacts_simple_contact.display_name, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
97 {"addresses.country", { _contacts_address._uri, _contacts_address.contact_id, _contacts_address.country, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
98 {"addresses.region", { _contacts_address._uri, _contacts_address.contact_id, _contacts_address.region, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
99 {"addresses.city", { _contacts_address._uri, _contacts_address.contact_id, _contacts_address.locality, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
100 {"addresses.streetAddress", { _contacts_address._uri, _contacts_address.contact_id, _contacts_address.street, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
101 {"addresses.additionalInformation", { _contacts_address._uri, _contacts_address.contact_id, _contacts_address.extended, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
102 {"addresses.postalCode", { _contacts_address._uri, _contacts_address.contact_id, _contacts_address.postal_code, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
103 {"addresses.isDefault", { _contacts_address._uri, _contacts_address.contact_id, _contacts_address.is_default, ContactSearchEngine::ContactSvcPrimitiveType_Boolean, PrimitiveType_Boolean } },
104 {"addresses.types", { _contacts_address._uri, _contacts_address.contact_id, _contacts_address.type, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_Long } },
105 {"photoURI", { _contacts_simple_contact._uri, _contacts_simple_contact.id, _contacts_simple_contact.image_thumbnail_path, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
106 {"phoneNumbers.number", { _contacts_number._uri, _contacts_number.contact_id, _contacts_number.number, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
107 {"phoneNumbers.isDefault", { _contacts_number._uri, _contacts_number.contact_id, _contacts_number.is_default, ContactSearchEngine::ContactSvcPrimitiveType_Boolean, PrimitiveType_Boolean } },
108 {"phoneNumbers.types", { _contacts_number._uri, _contacts_number.contact_id, _contacts_number.type, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_Long } },
109 {"emails.email", { _contacts_email._uri, _contacts_email.contact_id, _contacts_email.email, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
110 {"emails.isDefault", { _contacts_email._uri, _contacts_email.contact_id, _contacts_email.is_default, ContactSearchEngine::ContactSvcPrimitiveType_Boolean, PrimitiveType_Boolean } },
111 {"emails.types", { _contacts_email._uri, _contacts_email.contact_id, _contacts_email.type, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_Long } },
112 {"birthday", { _contacts_event._uri, _contacts_event.contact_id, _contacts_event.date, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_Long } },
113 {"anniversaries.date", { _contacts_event._uri, _contacts_event.contact_id, _contacts_event.date, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
114 {"anniversaries.label", { _contacts_event._uri, _contacts_event.contact_id, _contacts_event.label, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
115 {"organizations.name", { _contacts_company._uri, _contacts_company.contact_id, _contacts_company.name, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
116 {"organizations.department",{ _contacts_company._uri, _contacts_company.contact_id, _contacts_company.department, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
117 {"organizations.title", { _contacts_company._uri, _contacts_company.contact_id, _contacts_company.job_title, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
118 {"organizations.role", { _contacts_company._uri, _contacts_company.contact_id, _contacts_company.role, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
119 {"organizations.logoURI", { _contacts_company._uri, _contacts_company.contact_id, _contacts_company.logo, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
120 {"notes", { _contacts_note._uri, _contacts_note.contact_id, _contacts_note.note, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
121 {"urls.url", { _contacts_url._uri, _contacts_url.contact_id, _contacts_url.url, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
122 {"urls.type", { _contacts_url._uri, _contacts_url.contact_id, _contacts_url.type, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_Long } },
123 {"ringtoneURI", { _contacts_simple_contact._uri, _contacts_simple_contact.id, _contacts_simple_contact.ringtone_path, ContactSearchEngine::ContactSvcPrimitiveType_String, PrimitiveType_String } },
124 {"groupIds", { _contacts_group_relation._uri, _contacts_group_relation.contact_id, _contacts_group_relation.group_id, ContactSearchEngine::ContactSvcPrimitiveType_Int, PrimitiveType_Long } }
127 ContactSearchEngine::ContactSearchEngine() :
129 m_isAddressBookIdSet(false),
130 m_isFilterSet(false),
131 m_isSortModeSet(false),
132 m_sortOrder(ASCENDING_SORT_ORDER)
136 ContactSearchEngine::~ContactSearchEngine()
140 void ContactSearchEngine::setAddressBookId(int id)
142 m_addressBookId = id;
143 m_isAddressBookIdSet = true;
146 void ContactSearchEngine::setCondition(FilterPtr filter)
151 IFilterVisitorPtr filterQuery = DPL::StaticPointerCast<IFilterVisitor>(SharedFromThis());
152 filter->travel(filterQuery);
154 if(m_filteredContactIds != NULL)
155 m_isFilterSet = true;
158 void ContactSearchEngine::setSortMode(SortModePtr attr)
163 m_sortOrder = attr->getOrder();
164 m_attributeNameForSort = attr->getAttributeName();
166 AttributePropertiesMap::iterator iter =
167 attributePropertiesMap.find(m_attributeNameForSort);
168 if(iter == attributePropertiesMap.end())
169 ThrowMsg(NotFoundException, "There is no attribute name for sorting : " << m_attributeNameForSort);
171 m_isSortModeSet = true;
174 ContactArrayPtr ContactSearchEngine::getContactSearchResult()
176 ContactArrayPtr result(NULL);
177 unsigned int length = 0;
184 ContactIdArrayPtr ids = ContactIdArrayPtr(new ContactIdArray());
186 AttributePropertiesMap::iterator iter =
187 attributePropertiesMap.find(m_attributeNameForSort);
188 AttributeProperties &property = iter->second;
190 length = m_filteredContactIds->size();
191 LoggerD("length : " << length);
195 if(m_sortOrder == ASCENDING_SORT_ORDER)
196 sortContacts(property, ids, true, m_filteredContactIds);
198 sortContacts(property, ids, false, m_filteredContactIds);
200 result = getContacts(ids);
202 ContactArrayPtr contacts(new ContactArray());
208 length = m_filteredContactIds->size();
209 LoggerD("length : " << length);
212 result = getContacts(m_filteredContactIds);
214 ContactArrayPtr contacts(new ContactArray());
223 AttributePropertiesMap::iterator iter =
224 attributePropertiesMap.find(m_attributeNameForSort);
225 AttributeProperties &property = iter->second;
227 if(m_sortOrder == ASCENDING_SORT_ORDER)
228 result = getAllContactsSorted(property, true);
230 result = getAllContactsSorted(property, false);
234 result = getAllContacts();
242 void ContactSearchEngine::visitPreComposite(FilterType& type, int depth)
244 ContactIdSetArrayPtr idSets = ContactIdSetArrayPtr(new ContactIdSetArray());
246 m_contactIdSetArrayStack.push(idSets);
249 void ContactSearchEngine::visitInComposite(FilterType& type, int depth)
254 void ContactSearchEngine::visitPostComposite(FilterType& type, int depth)
256 ContactIdSetArrayPtr idSets = m_contactIdSetArrayStack.top();
257 m_contactIdSetArrayStack.pop();
259 ContactIdSetPtr idSet = ContactIdSetPtr(new ContactIdSet());
261 if(type == UNION_FILTER)
262 getUnion(idSets, idSet);
263 else if(type == INTERSECTION_FILTER)
264 getIntersection(idSets, idSet);
268 m_filteredContactIds = idSet;
274 ContactIdSetArrayPtr parentIdSets = m_contactIdSetArrayStack.top();
275 parentIdSets->push_back(idSet);
280 void ContactSearchEngine::visitAttribute(string& attrName, MatchFlag& matchFlag, AnyPtr& matchValue, int depth)
282 ContactIdSetPtr idSet = ContactIdSetPtr(new ContactIdSet());
286 string value = matchValue->getString();
287 idSet->insert(ContactUtility::strToInt(value));
290 m_filteredContactIds = idSet;
293 ContactIdSetArrayPtr parentIdSets = m_contactIdSetArrayStack.top();
294 parentIdSets->push_back(idSet);
299 else if(attrName == "addresses.types" ||
300 attrName == "emails.types" ||
301 attrName == "phoneNumbers.types" ||
302 attrName == "urls.type")
305 m_filteredContactIds = ContactIdSetPtr(NULL);
310 AttributePropertiesMap::iterator iter =
311 attributePropertiesMap.find(attrName);
312 if(iter == attributePropertiesMap.end())
313 ThrowMsg(NotFoundException, "There is no attribute name for filter : " << attrName);
314 AttributeProperties &properties = iter->second;
316 if(properties.type == ContactSvcPrimitiveType_Boolean)
318 bool value = matchValue->getBool();
320 queryAttributeBool(properties, idSet, value);
322 else if(properties.type == ContactSvcPrimitiveType_String)
324 string value = matchValue->getString();
325 contacts_match_str_flag_e flag = CONTACTS_MATCH_EXISTS;
327 if(matchFlag == MATCH_EXACTLY)
328 flag = CONTACTS_MATCH_EXACTLY;
329 else if(matchFlag == MATCH_FULLSTRING)
330 flag = CONTACTS_MATCH_FULLSTRING;
331 else if(matchFlag == MATCH_CONTAINS)
332 flag = CONTACTS_MATCH_CONTAINS;
333 else if(matchFlag == MATCH_STARTSWITH)
334 flag = CONTACTS_MATCH_STARTSWITH;
335 else if(matchFlag == MATCH_ENDSWITH)
336 flag = CONTACTS_MATCH_ENDSWITH;
337 else if(matchFlag == MATCH_EXISTS)
338 flag = CONTACTS_MATCH_EXISTS;
340 queryAttributeString(properties, idSet, flag, value.c_str());
342 else if(properties.type == ContactSvcPrimitiveType_Int)
347 value = ContactUtility::strToInt(matchValue->getString());
349 value = matchValue->getLong();
351 contacts_match_int_flag_e flag;
352 if(matchFlag == MATCH_EXISTS)
354 flag = CONTACTS_MATCH_GREATER_THAN_OR_EQUAL;
357 flag = CONTACTS_MATCH_EQUAL;
360 queryAttributeInt(properties, idSet, flag, value);
365 m_filteredContactIds = idSet;
371 ContactIdSetArrayPtr parentIdSets = m_contactIdSetArrayStack.top();
372 parentIdSets->push_back(idSet);
377 void ContactSearchEngine::visitAttributeRange(string& attrName, AnyPtr& initialValue, AnyPtr& endValue, int depth)
379 ContactIdSetPtr idSet = ContactIdSetPtr(new ContactIdSet());
381 bool initialValueIsSet = false;
382 bool endValueIsSet = false;
384 if(initialValue != NULL || initialValue->isNullOrUndefined())
385 initialValueIsSet = false;
387 if(endValue != NULL || endValue->isNullOrUndefined())
388 endValueIsSet = false;
390 if(!initialValueIsSet && !endValueIsSet)
393 m_filteredContactIds = ContactIdSetPtr(NULL);
401 m_filteredContactIds = idSet;
404 ContactIdSetArrayPtr parentIdSets = m_contactIdSetArrayStack.top();
405 parentIdSets->push_back(idSet);
410 else if(attrName == "addresses.types" ||
411 attrName == "emails.types" ||
412 attrName == "phoneNumbers.types" ||
413 attrName == "urls.type")
416 m_filteredContactIds = ContactIdSetPtr(NULL);
421 AttributePropertiesMap::iterator iter =
422 attributePropertiesMap.find(attrName);
423 if(iter == attributePropertiesMap.end())
424 ThrowMsg(NotFoundException, "There is no attribute name for filter : " << attrName);
425 AttributeProperties &properties = iter->second;
427 if(properties.type == ContactSvcPrimitiveType_Boolean)
429 bool initialValueBool = false;
430 bool endValueBool = false;
432 if(initialValueIsSet)
433 initialValueBool = initialValue->getBool();
435 endValueBool = endValue->getBool();
437 queryAttributeRangeBool(properties, idSet, initialValueIsSet, initialValueBool, endValueIsSet, endValueBool);
439 else if(properties.type == ContactSvcPrimitiveType_String)
441 const char *initialValueCStr = NULL;
442 const char *endValueCStr = NULL;
444 string initialValueStr;
447 if(initialValueIsSet)
449 initialValueStr = initialValue->getString();
450 initialValueCStr = initialValueStr.c_str();
454 endValueStr = endValue->getString();
455 endValueCStr = endValueStr.c_str();
458 queryAttributeRangeString(properties, idSet, initialValueCStr, endValueCStr);
460 else if(properties.type == ContactSvcPrimitiveType_Int)
462 int initialValueInt = 0;
467 if(initialValueIsSet)
468 initialValueInt = ContactUtility::strToInt(initialValue->getString());
470 endValueInt = ContactUtility::strToInt(endValue->getString());
474 if(initialValueIsSet)
475 initialValueInt = initialValue->getLong();
477 endValueInt = endValue->getLong();
480 queryAttributeRangeInt(properties, idSet, initialValueIsSet, initialValueInt, endValueIsSet, endValueInt);
485 m_filteredContactIds = idSet;
489 ContactIdSetArrayPtr parentIdSets = m_contactIdSetArrayStack.top();
490 parentIdSets->push_back(idSet);
494 ContactArrayPtr ContactSearchEngine::getAllContactsSorted(AttributeProperties& attributeProperties, bool is_ascending)
496 ContactArrayPtr contacts = ContactArrayPtr(new ContactArray());
498 ContactArrayPtr allContacts = getAllContacts();
499 ContactIdArrayPtr sortedIds = ContactIdArrayPtr(new ContactIdArray());
501 sortContacts(attributeProperties, sortedIds, is_ascending);
503 map<int,ContactPtr> contactMap;
505 ContactArray::iterator citer;
506 for(citer=allContacts->begin(); citer!=allContacts->end(); citer++)
508 ContactPtr contact = *citer;
509 int id = ContactUtility::strToInt(contact->getId());
510 contactMap.insert(pair<int,ContactPtr>(id, contact));
513 ContactIdArray::iterator iter;
514 for(iter=sortedIds->begin(); iter!=sortedIds->end(); iter++)
518 map<int,ContactPtr>::iterator idPair = contactMap.find(id);
519 if(idPair == contactMap.end())
521 LoggerW("no contact id : " << id);
524 contacts->push_back(idPair->second);
530 ContactArrayPtr ContactSearchEngine::getAllContacts()
534 ContactArrayPtr contacts(new ContactArray());
535 contacts_list_h list = NULL;
537 if(!m_isAddressBookIdSet)
539 errorCode = contacts_db_get_all_records(_contacts_contact._uri, 0, 0, &list);
540 if(errorCode != CONTACTS_ERROR_NONE)
541 ThrowMsg(PlatformException, "contacts_db_get_all_records error : " << errorCode << " (" << __FUNCTION__ << ")");
545 contacts_query_h query = NULL;
546 contacts_filter_h filter = NULL;
548 errorCode = contacts_query_create(_contacts_contact._uri, &query);
549 if(errorCode != CONTACTS_ERROR_NONE)
550 ThrowMsg(PlatformException, "Fail to get contacts_query_create (ret:" << errorCode << ")");
552 errorCode = contacts_filter_create(_contacts_contact._uri, &filter);
553 if(errorCode != CONTACTS_ERROR_NONE)
554 ThrowMsg(PlatformException, "Fail to get contacts_filter_create (ret:" << errorCode << ")");
556 errorCode = contacts_filter_add_int(filter, _contacts_contact.address_book_id, CONTACTS_MATCH_EQUAL, m_addressBookId);
557 if(errorCode != CONTACTS_ERROR_NONE)
558 ThrowMsg(PlatformException, "Fail to get contacts_filter_add_int (ret:" << errorCode << ")");
560 errorCode = contacts_query_set_filter(query, filter);
561 if(errorCode != CONTACTS_ERROR_NONE)
562 ThrowMsg(PlatformException, "Fail to get contacts_query_set_filter (ret:" << errorCode << ")");
564 errorCode = contacts_db_get_records_with_query(query, 0, 0, &list);
565 if(errorCode != CONTACTS_ERROR_NONE)
566 ThrowMsg(PlatformException, "Fail to get contacts_db_get_records_with_query (ret:" << errorCode << ")");
568 errorCode = contacts_filter_destroy(filter);
569 if(errorCode != CONTACTS_ERROR_NONE)
570 ThrowMsg(PlatformException, "Fail to get contacts_filter_destroy (ret:" << errorCode << ")");
572 errorCode = contacts_query_destroy(query);
573 if(errorCode != CONTACTS_ERROR_NONE)
574 ThrowMsg(PlatformException, "Fail to get contacts_query_destroy (ret:" << errorCode << ")");
577 unsigned int record_count = 0;
578 errorCode = contacts_list_get_count(list, &record_count);
579 if(errorCode != CONTACTS_ERROR_NONE)
580 ThrowMsg(PlatformException, "Fail to get contacts_list_get_count : " << errorCode << " (" << __FUNCTION__ << ")");
581 LoggerD("END: pure contact-svc");
583 contacts_list_first(list);
584 for(unsigned int i=0; i<record_count; i++)
586 contacts_record_h record;
587 errorCode = contacts_list_get_current_record_p(list, &record);
588 if(errorCode != CONTACTS_ERROR_NONE || record == NULL)
590 LoggerW("contacts_list_get_current_record_p error : " << errorCode << " (" << __FUNCTION__ << ")");
594 ContactPtr contact(NULL);
597 ContactObjectP2AConverterPtr contactObjConverter(
598 new ContactObjectP2AConverter(record, false));
600 contact = contactObjConverter->getAbstractContact();
604 LoggerW("fail to convert contact");
608 contacts->push_back(contact);
610 contacts_list_next(list);
614 contacts_list_destroy(list, true);
616 LoggerD("END: convertToPlugin Objects");
621 ContactArrayPtr ContactSearchEngine::getContacts(ContactIdArrayPtr& ids)
623 ContactArrayPtr contacts(new ContactArray());
625 ContactIdArray::iterator iter;
626 for(iter=ids->begin(); iter!=ids->end(); iter++)
630 ContactPtr contact = getContact(*iter);
632 contacts->push_back(contact);
636 LoggerW(_rethrown_exception.GetMessage());
644 ContactArrayPtr ContactSearchEngine::getContacts(ContactIdSetPtr& ids)
646 ContactArrayPtr contacts(new ContactArray());
648 ContactIdSet::iterator iter;
649 for(iter=ids->begin(); iter!=ids->end(); iter++)
653 ContactPtr contact = getContact(*iter);
655 contacts->push_back(contact);
659 LoggerW(_rethrown_exception.GetMessage());
666 ContactPtr ContactSearchEngine::getContact(int id)
669 contacts_record_h record = NULL;
671 errorCode = contacts_db_get_record(_contacts_contact._uri, id, &record);
672 if(errorCode != CONTACTS_ERROR_NONE)
674 LoggerE("No contact 1 : " << errorCode << " (" << __FUNCTION__ << ")");
675 return ContactPtr(NULL);
678 if(m_isAddressBookIdSet)
680 int addressBookId = 0;
682 errorCode = contacts_record_get_int(record, _contacts_contact.address_book_id, &addressBookId);
683 if(errorCode != CONTACTS_ERROR_NONE)
685 LoggerE("No contact 2 : " << errorCode << " (" << __FUNCTION__ << ")");
686 return ContactPtr(NULL);
689 if(addressBookId != m_addressBookId)
690 return ContactPtr(NULL);
693 ContactObjectP2AConverterPtr contactObjConverter(
694 new ContactObjectP2AConverter(record, false));
695 ContactPtr contact = contactObjConverter->getAbstractContact();
700 void ContactSearchEngine::queryAttributeBool(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
703 const char* view_uri = attributeProperties.viewUri;
704 unsigned int property_contact_id = attributeProperties.propertyContactId;
705 unsigned int property_id = attributeProperties.propertyId;
708 contacts_query_h query = NULL;
709 contacts_filter_h filter = NULL;
710 contacts_list_h list = NULL;
712 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
714 errorCode = contacts_filter_add_bool(filter, property_id, match_value);
715 if(errorCode != CONTACTS_ERROR_NONE)
717 ThrowMsg(PlatformException, "contacts_filter_add_bool error : " << errorCode << " (" << __FUNCTION__ << ")");
720 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
723 void ContactSearchEngine::queryAttributeInt(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
724 contacts_match_int_flag_e match, int match_value)
726 const char* view_uri = attributeProperties.viewUri;
727 unsigned int property_contact_id = attributeProperties.propertyContactId;
728 unsigned int property_id = attributeProperties.propertyId;
731 contacts_query_h query = NULL;
732 contacts_filter_h filter = NULL;
733 contacts_list_h list = NULL;
735 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
737 errorCode = contacts_filter_add_int(filter, property_id, match, match_value);
738 if(errorCode != CONTACTS_ERROR_NONE)
740 ThrowMsg(PlatformException, "contacts_filter_add_int error : " << errorCode << " (" << __FUNCTION__ << ")");
743 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
746 void ContactSearchEngine::queryAttributeString(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
747 contacts_match_str_flag_e match, const char* match_value)
749 const char* view_uri = attributeProperties.viewUri;
750 unsigned int property_contact_id = attributeProperties.propertyContactId;
751 unsigned int property_id = attributeProperties.propertyId;
754 contacts_query_h query = NULL;
755 contacts_filter_h filter = NULL;
756 contacts_list_h list = NULL;
758 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
760 errorCode = contacts_filter_add_str(filter, property_id, match, match_value);
761 if(errorCode != CONTACTS_ERROR_NONE)
763 ThrowMsg(PlatformException, "contacts_filter_add_int error : " << errorCode << " (" << __FUNCTION__ << ")");
766 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
769 void ContactSearchEngine::queryAttributeRangeBool(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
770 bool initial_value_is_set, bool initial_value, bool end_value_is_set, bool end_value)
772 const char* view_uri = attributeProperties.viewUri;
773 unsigned int property_contact_id = attributeProperties.propertyContactId;
774 unsigned int property_id = attributeProperties.propertyId;
777 contacts_query_h query = NULL;
778 contacts_filter_h filter = NULL;
779 contacts_list_h list = NULL;
781 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
783 if(initial_value_is_set && end_value_is_set)
785 if(initial_value == end_value)
787 if(initial_value == true)
788 errorCode = contacts_filter_add_bool(filter, property_id, true);
789 else if(end_value == false)
790 errorCode = contacts_filter_add_bool(filter, property_id, false);
793 else if(initial_value_is_set)
795 if(initial_value == true)
796 errorCode = contacts_filter_add_bool(filter, property_id, true);
798 else if(end_value_is_set)
800 if(end_value == false)
801 errorCode = contacts_filter_add_bool(filter, property_id, false);
804 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
807 void ContactSearchEngine::queryAttributeRangeInt(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
808 bool initial_value_is_set, int initial_value, bool end_value_is_set, int end_value)
810 const char* view_uri = attributeProperties.viewUri;
811 unsigned int property_contact_id = attributeProperties.propertyContactId;
812 unsigned int property_id = attributeProperties.propertyId;
815 contacts_query_h query = NULL;
816 contacts_filter_h filter = NULL;
817 contacts_list_h list = NULL;
819 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
821 if(initial_value_is_set && end_value_is_set)
823 contacts_filter_h sub_filter = NULL;
825 errorCode = contacts_filter_create(_contacts_person._uri, &sub_filter);
827 errorCode = contacts_filter_add_int(sub_filter, property_id,
828 CONTACTS_MATCH_GREATER_THAN_OR_EQUAL, initial_value);
830 contacts_filter_add_operator(sub_filter, CONTACTS_FILTER_OPERATOR_AND);
832 errorCode = contacts_filter_add_int(sub_filter, property_id,
833 CONTACTS_MATCH_LESS_THAN_OR_EQUAL, end_value);
835 errorCode = contacts_filter_add_filter(filter, sub_filter);
837 else if(initial_value_is_set)
839 errorCode = contacts_filter_add_int(filter, property_id,
840 CONTACTS_MATCH_GREATER_THAN_OR_EQUAL, initial_value);
842 else if(end_value_is_set)
844 errorCode = contacts_filter_add_int(filter, property_id,
845 CONTACTS_MATCH_LESS_THAN_OR_EQUAL, end_value);
848 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
851 void ContactSearchEngine::queryAttributeRangeString(AttributeProperties& attributeProperties, ContactIdSetPtr& result,
852 const char* initial_value, const char* end_value)
855 const char* view_uri = attributeProperties.viewUri;
856 unsigned int property_contact_id = attributeProperties.propertyContactId;
857 unsigned int property_id = attributeProperties.propertyId;
861 contacts_query_h query = NULL;
862 contacts_filter_h filter = NULL;
863 contacts_list_h list = NULL;
865 _CONTACTS_SVC_QUERY_FUNC_PREFIX(view_uri, query, filter);
867 if(initial_value != NULL && end_value != NULL)
869 contacts_filter_h sub_filter = NULL;
871 errorCode = contacts_filter_create(view_uri, &sub_filter);
873 // TODO To be supported start
874 errorCode = contacts_filter_add_str(sub_filter, property_id,
875 CONTACTS_MATCH_STARTSWITH, initial_value);
877 contacts_filter_add_operator(sub_filter, CONTACTS_FILTER_OPERATOR_AND);
879 errorCode = contacts_filter_add_str(sub_filter, property_id,
880 CONTACTS_MATCH_ENDSWITH, end_value);
882 errorCode = contacts_filter_add_filter(filter, sub_filter);
884 else if(initial_value != NULL)
886 errorCode = contacts_filter_add_str(filter, property_id,
887 CONTACTS_MATCH_STARTSWITH, initial_value);
889 else if(end_value != NULL)
891 errorCode = contacts_filter_add_str(filter, property_id,
892 CONTACTS_MATCH_ENDSWITH, end_value);
895 _CONTACTS_SVC_QUERY_FUNC_SUFFIX(query, filter, list, property_contact_id, result);
900 void ContactSearchEngine::sortContacts(AttributeProperties& attributeProperties, ContactIdArrayPtr& result,
901 bool is_ascending, ContactIdSetPtr& idSet)
903 const char* view_uri = attributeProperties.viewUri;
904 unsigned int property_contact_id = attributeProperties.propertyContactId;
905 unsigned int property_id = attributeProperties.propertyId;
910 contacts_query_h query = NULL;
911 contacts_list_h list = NULL;
913 errorCode = contacts_query_create(view_uri, &query);
914 if(errorCode != CONTACTS_ERROR_NONE)
915 ThrowMsg(PlatformException, "contacts_query_create error : " << errorCode << " (" << __FUNCTION__ << ")");
917 errorCode = contacts_query_set_sort(query, property_id, is_ascending);
918 if(errorCode != CONTACTS_ERROR_NONE)
919 ThrowMsg(PlatformException, "contacts_query_set_sort error : " << errorCode << " (" << __FUNCTION__ << ")");
921 errorCode = contacts_db_get_records_with_query(query, 0, 0, &list);
922 if(errorCode != CONTACTS_ERROR_NONE)
923 ThrowMsg(PlatformException, "contacts_db_get_records_with_query error : " << errorCode << " (" << __FUNCTION__ << ")");
925 unsigned int record_count = 0;
926 errorCode = contacts_list_get_count(list, &record_count);
927 if(errorCode != CONTACTS_ERROR_NONE)
928 ThrowMsg(PlatformException, "contacts_list_get_count error : " << errorCode << " (" << __FUNCTION__ << ")");
930 std::set<int>::iterator it;
932 contacts_list_first(list);
933 for(unsigned int i=0; i<record_count; i++)
935 contacts_record_h record;
936 errorCode = contacts_list_get_current_record_p(list, &record);
937 if(errorCode != CONTACTS_ERROR_NONE)
938 ThrowMsg(PlatformException, "contacts_list_get_current_record_p error : " << errorCode << " (" << __FUNCTION__ << ")");
941 errorCode = contacts_record_get_int(record, property_contact_id, &value);
942 if(errorCode != CONTACTS_ERROR_NONE)
943 ThrowMsg(PlatformException, "contacts_record_get_int error : " << errorCode << " (" << __FUNCTION__ << ")");
945 it = idSet->find(value);
946 if(it != idSet->end())
947 result->push_back(value);
949 contacts_list_next(list);
953 contacts_list_destroy(list, true);
956 contacts_query_destroy(query);
962 void ContactSearchEngine::sortContacts(AttributeProperties& attributeProperties, ContactIdArrayPtr& result,
963 bool is_ascending, ContactIdSetPtr& idSet)
965 const char* view_uri = attributeProperties.viewUri;
966 unsigned int property_contact_id = attributeProperties.propertyContactId;
967 unsigned int property_id = attributeProperties.propertyId;
972 contacts_query_h query = NULL;
973 contacts_filter_h filter = NULL;
974 contacts_list_h list = NULL;
976 errorCode = contacts_query_create(view_uri, &query);
977 if(errorCode != CONTACTS_ERROR_NONE)
978 ThrowMsg(PlatformException, "contacts_query_create error : " << errorCode << " (" << __FUNCTION__ << ")");
980 errorCode = contacts_filter_create(view_uri, &filter);
981 if(errorCode != CONTACTS_ERROR_NONE)
982 ThrowMsg(PlatformException, "contacts_filter_create error : " << errorCode << " (" << __FUNCTION__ << ")");
984 ContactIdSet::iterator iter = idSet->begin();
985 if(iter != idSet->end())
987 errorCode = contacts_filter_add_int(filter, property_contact_id, CONTACTS_MATCH_EQUAL, *iter);
988 for(; iter!=idSet->end(); iter++)
990 errorCode = contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_OR);
991 if(errorCode != CONTACTS_ERROR_NONE)
992 ThrowMsg(PlatformException, "contacts_filter_add_operator error : " << errorCode << " (" << __FUNCTION__ << ")");
994 errorCode = contacts_filter_add_int(filter, property_contact_id, CONTACTS_MATCH_EQUAL, *iter);
995 if(errorCode != CONTACTS_ERROR_NONE)
996 ThrowMsg(PlatformException, "contacts_query_create error : " << errorCode << " (" << __FUNCTION__ << ")");
1000 errorCode = contacts_query_set_sort(query, property_id, is_ascending);
1001 if(errorCode != CONTACTS_ERROR_NONE)
1002 ThrowMsg(PlatformException, "contacts_query_set_sort error : " << errorCode << " (" << __FUNCTION__ << ")");
1004 errorCode = contacts_query_set_filter(query, filter);
1005 if(errorCode != CONTACTS_ERROR_NONE)
1006 ThrowMsg(PlatformException, "contacts_query_set_filter error : " << errorCode << " (" << __FUNCTION__ << ")");
1008 errorCode = contacts_db_get_records_with_query(query, 0, 0, &list);
1009 if(errorCode != CONTACTS_ERROR_NONE)
1010 ThrowMsg(PlatformException, "contacts_db_get_records_with_query error : " << errorCode << " (" << __FUNCTION__ << ")");
1012 unsigned int record_count = 0;
1013 errorCode = contacts_list_get_count(list, &record_count);
1014 if(errorCode != CONTACTS_ERROR_NONE)
1015 ThrowMsg(PlatformException, "contacts_list_get_count error : " << errorCode << " (" << __FUNCTION__ << ")");
1017 ContactIdSet overlappingIds;
1019 contacts_list_first(list);
1020 for(unsigned int i=0; i<record_count; i++)
1022 contacts_record_h record;
1023 errorCode = contacts_list_get_current_record_p(list, &record);
1024 if(errorCode != CONTACTS_ERROR_NONE)
1025 ThrowMsg(PlatformException, "contacts_list_get_current_record_p error : " << errorCode << " (" << __FUNCTION__ << ")");
1028 errorCode = contacts_record_get_int(record, property_contact_id, &value);
1029 if(errorCode != CONTACTS_ERROR_NONE)
1030 ThrowMsg(PlatformException, "contacts_record_get_int error : " << errorCode << " (" << __FUNCTION__ << ")");
1032 if(overlappingIds.find(value) == overlappingIds.end())
1034 result->push_back(value);
1035 overlappingIds.insert(value);
1038 contacts_list_next(list);
1042 contacts_list_destroy(list, true);
1045 contacts_filter_destroy(filter);
1048 contacts_query_destroy(query);
1053 void ContactSearchEngine::sortContacts(AttributeProperties& attributeProperties, ContactIdArrayPtr& result,
1056 const char* view_uri = attributeProperties.viewUri;
1057 unsigned int property_contact_id = attributeProperties.propertyContactId;
1058 unsigned int property_id = attributeProperties.propertyId;
1061 contacts_query_h query = NULL;
1062 contacts_list_h list = NULL;
1064 errorCode = contacts_query_create(view_uri, &query);
1065 if(errorCode != CONTACTS_ERROR_NONE)
1066 ThrowMsg(PlatformException, "contacts_query_create error : " << errorCode << " (" << __FUNCTION__ << ")");
1068 errorCode = contacts_query_set_sort(query, property_id, is_ascending);
1069 if(errorCode != CONTACTS_ERROR_NONE)
1070 ThrowMsg(PlatformException, "contacts_query_set_sort error : " << errorCode << " (" << __FUNCTION__ << ")");
1072 errorCode = contacts_db_get_records_with_query(query, 0, 0, &list);
1073 if(errorCode != CONTACTS_ERROR_NONE)
1074 ThrowMsg(PlatformException, "contacts_db_get_records_with_query error : " << errorCode << " (" << __FUNCTION__ << ")");
1076 unsigned int record_count = 0;
1077 errorCode = contacts_list_get_count(list, &record_count);
1078 if(errorCode != CONTACTS_ERROR_NONE)
1079 ThrowMsg(PlatformException, "contacts_list_get_count error : " << errorCode << " (" << __FUNCTION__ << ")");
1081 ContactIdSet overlappingIds;
1083 contacts_list_first(list);
1084 for(unsigned int i=0; i<record_count; i++)
1086 contacts_record_h record;
1087 errorCode = contacts_list_get_current_record_p(list, &record);
1088 if(errorCode != CONTACTS_ERROR_NONE)
1089 ThrowMsg(PlatformException, "contacts_list_get_current_record_p error : " << errorCode << " (" << __FUNCTION__ << ")");
1092 errorCode = contacts_record_get_int(record, property_contact_id, &value);
1093 if(errorCode != CONTACTS_ERROR_NONE)
1094 ThrowMsg(PlatformException, "contacts_record_get_int error : " << errorCode << " (" << __FUNCTION__ << ")");
1096 if(overlappingIds.find(value) == overlappingIds.end())
1098 result->push_back(value);
1099 overlappingIds.insert(value);
1102 contacts_list_next(list);
1106 contacts_list_destroy(list, true);
1109 contacts_query_destroy(query);
1112 void ContactSearchEngine::getIntersection(ContactIdSetArrayPtr& idSets, ContactIdSetPtr& result)
1114 ContactIdSetArray::iterator i;
1116 if(idSets->size() == 0)
1118 result = ContactIdSetPtr(NULL);
1121 else if(idSets->size() == 1)
1123 *result = **idSets->begin();
1127 ContactIdSetArray::iterator minIter;
1128 ContactIdSetArray::size_type minSize =
1129 numeric_limits<ContactIdSetArray::size_type>::max();
1131 for(i=idSets->begin(); i!=idSets->end(); i++)
1133 ContactIdSetPtr idSet = *i;
1134 ContactIdSetArray::size_type size = idSet->size();
1142 ContactIdSetPtr p = *minIter;
1143 ContactIdSetArrayPtr sa = ContactIdSetArrayPtr(new ContactIdSetArray());
1144 for(i=idSets->begin(); i!=idSets->end(); i++)
1152 ContactIdSet::iterator iter;
1153 for(iter=p->begin(); iter!=p->end(); iter++)
1155 bool excluded = false;
1158 for(i=sa->begin(); i!=sa->end(); i++)
1160 ContactIdSetPtr idSet = *i;
1161 if(idSet->find(value) == idSet->end())
1168 if(excluded == false)
1170 result->insert(value);
1175 void ContactSearchEngine::getUnion(ContactIdSetArrayPtr& idSets, ContactIdSetPtr& result)
1177 ContactIdSetArray::iterator i;
1179 if(idSets->size() == 0)
1181 result = ContactIdSetPtr(NULL);
1184 else if(idSets->size() == 1)
1186 *result = **idSets->begin();
1190 for(i=idSets->begin(); i!=idSets->end(); i++)
1192 ContactIdSetPtr ids = *i;
1193 ContactIdSet::iterator j;
1194 for(j=ids->begin(); j!=ids->end(); j++)