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 ContactSearchEngine.cpp
19 * @author Kisub Song (kisubs.song@samsung.com)
24 #include "query-svc/query-service.h"
28 #include <Commons/Exception.h>
29 #include "ContactSearchEngine.h"
35 using namespace TizenApis::Api::Contact;
36 using namespace TizenApis::Api::Tizen;
37 using namespace WrtDeviceApis::Commons;
40 using TizenApis::Api::Contact::Contact;
42 map<string, int> ContactSearchEngine::attrEnumMap = {
43 {"id", contact_attribute_e::CONTACT_ID},
44 {"readOnly", contact_attribute_e::ATTRIBUTE_MAX},
45 {"accountId", contact_attribute_e::ATTRIBUTE_MAX},
46 {"prefix", contact_attribute_e::NAME_PREFIX},
47 {"name.firstName", contact_attribute_e::NAME_FIRST},
48 {"name.middleName", contact_attribute_e::NAME_MIDDLE},
49 {"name.lastName", contact_attribute_e::NAME_LAST},
50 {"name.nicknames", contact_attribute_e::NICKNAME_NAME},
51 {"name.phoneticName", contact_attribute_e::NAME_PHONETIC},
52 {"name.displayName", contact_attribute_e::NAME_DISPLAY},
53 {"addresses.country", contact_attribute_e::ADDRESS_COUNTRY},
54 {"addresses.region", contact_attribute_e::ADDRESS_REGION},
55 {"addresses.city", contact_attribute_e::ADDRESS_CITY},
56 {"addresses.streetAddress", contact_attribute_e::ADDRESS_STREET},
57 {"addresses.additionalInformation", contact_attribute_e::ADDRESS_ADDITIONAL},
58 {"addresses.postalCode", contact_attribute_e::ADDRESS_POSTAL_CODE},
59 {"addresses.types", contact_attribute_e::ATTRIBUTE_MAX},
60 {"photoURI", contact_attribute_e::CONTACT_PHOTO_URI},
61 {"phoneNumbers.number", contact_attribute_e::NUMBER_ADDRESS},
62 {"phoneNumbers.types", contact_attribute_e::NUMBER_TYPES},
63 {"emails.email", contact_attribute_e::EMAIL_ADDRESS},
64 {"emails.types", contact_attribute_e::EMAIL_TYPE},
65 {"birthday", contact_attribute_e::EVENT_DATE},
66 {"anniversaries.date", contact_attribute_e::EVENT_DATE},
67 {"organizations.name", contact_attribute_e::ORGANIZATION_NAME},
68 {"organization.department", contact_attribute_e::ORGANIZATION_DEPARTMENT},
69 {"organization.title", contact_attribute_e::ORGANIZATION_TITLE},
70 {"organization.role", contact_attribute_e::ORGANIZATION_ROLE},
71 {"organization.logoURI", contact_attribute_e::ATTRIBUTE_MAX},
72 {"notes", contact_attribute_e::CONTACT_NOTE},
73 {"urls.url", contact_attribute_e::URL_ADDRESS},
74 {"urls.type", contact_attribute_e::URL_TYPE},
75 {"lastUpdated", contact_attribute_e::CONTACT_LAST_UPDATED_TIME_STAMP},
76 {"isFavorite", contact_attribute_e::CONTACT_IS_FAVORITE},
77 {"ringtoneURI", contact_attribute_e::CONTACT_RINGTONE},
78 {"categories", contact_attribute_e::CATEGORY_INFO}
82 ContactSearchEngine::ContactSearchEngine(ContactQueryType type)
85 query_type_e qtype = query_type_e::QUERY_TO_PERSON;
86 if (type == CONTACT_QUERY)
87 qtype = query_type_e::QUERY_TO_CONTACT;
89 m_contact_query_service = query_init(&error, qtype);
90 if (error != QUERY_SUCCESS)
91 m_contact_query_service = NULL;
94 ContactSearchEngine::~ContactSearchEngine()
96 if (m_contact_query_service)
97 query_finalize(m_contact_query_service);
100 void ContactSearchEngine::setCondition(FilterPtr filter)
105 IFilterVisitorPtr filterQuery = DPL::StaticPointerCast<IFilterVisitor>(SharedFromThis());
106 filter->travel(filterQuery);
109 void ContactSearchEngine::setSortMode(SortModePtr attr)
114 if (attr->getOrder() == ASCENDING_SORT_ORDER)
119 query_set_order_by(m_contact_query_service, getPlatformAttr(attr->getAttributeName()), ord);
123 query_set_order_by(m_contact_query_service, contact_attribute_e::CONTACT_ID, ASC);
127 void ContactSearchEngine::setAttributeOfInterest(StringArrayPtr attr)
131 m_attributesOfInterest = attr;
132 for (StringArray::iterator it = attr->begin(); it!=attr->end(); ++it)
134 query_set_attribute(m_contact_query_service, getPlatformAttr(*it));
139 m_attributesOfInterest = StringArrayPtr(new StringArray());
140 for (map<string, int>::iterator it=attrEnumMap.begin(); it!=attrEnumMap.end(); it++)
142 if(query_set_attribute(m_contact_query_service, static_cast<contact_attribute_e>(it->second)) == QUERY_SUCCESS)
143 m_attributesOfInterest->push_back(it->first);
148 ContactArrayPtr ContactSearchEngine::getContactSearchResult()
150 ContactArrayPtr result = ContactArrayPtr(new ContactArray());
154 contact_attribute_e pattr;
156 bool nameAlreadyChecked = false;
157 bool numberAlreadyChecked = false;
158 bool emailAlreadyChecked = false;
159 bool urlAlreadyChecked = false;
160 bool addrAlreadyChecked = false;
161 bool eventAlreadyChecked = false;
162 bool organizationAlreadyChecked = false;
163 bool nicknameAlreadyChecked = false;
164 bool categoryAlreadyChecked = false;
166 LogDebug("Start generating result set");
168 while ( query_get_result_contact(m_contact_query_service) == QUERY_SUCCESS )
170 ContactPtr contact = ContactPtr(new Contact());
172 for (StringArray::iterator it = m_attributesOfInterest->begin(); it != m_attributesOfInterest->end(); it++)
174 pattr = getPlatformAttr(*it);
178 if (!nameAlreadyChecked &&
179 (pattr == CONTACT_ID || pattr == NAME_FIRST || pattr == NAME_LAST ||
180 pattr == NAME_MIDDLE || pattr == NAME_DISPLAY))
184 str = query_get_attribute(m_contact_query_service, CONTACT_ID, &err);
188 str = query_get_attribute(m_contact_query_service, ACCOUNT_ID, &err);
190 contact->getAccount()->setAccountId(str);
192 str = query_get_attribute(m_contact_query_service, CONTACT_IS_FAVORITE, &err);
194 contact->setIsFavorite(toBool(str));
196 str = query_get_attribute(m_contact_query_service, CONTACT_RINGTONE, &err);
198 contact->setRingtoneURI(str);
200 str = query_get_attribute(m_contact_query_service, CONTACT_NOTE, &err);
203 StringArrayPtr notes(new StringArray());
204 notes->push_back(str);
205 contact->setNotes(notes);
208 str = query_get_attribute(m_contact_query_service, CONTACT_PHOTO_URI, &err);
210 contact->setPhotoURI(str);
212 str = query_get_attribute(m_contact_query_service, CONTACT_LAST_UPDATED_TIME_STAMP, &err);
216 time_t db_time_stamp = (time_t)atoi(str);
218 struct tm* tmp_time = gmtime(&db_time_stamp);
219 memcpy(&time_stamp, tmp_time, sizeof(tm));
220 contact->setLastUpdated(time_stamp);
223 ContactNamePtr contactName = contact->getName();
225 str = query_get_attribute(m_contact_query_service, NAME_FIRST, &err);
227 contactName->setFirstName(str);
229 str = query_get_attribute(m_contact_query_service, NAME_LAST, &err);
231 contactName->setLastName(str);
233 str = query_get_attribute(m_contact_query_service, NAME_MIDDLE, &err);
235 contactName->setMiddleName(str);
237 str = query_get_attribute(m_contact_query_service, NAME_DISPLAY, &err);
239 contactName->setDisplayName(str);
241 str = query_get_attribute(m_contact_query_service, NAME_PREFIX, &err);
243 contactName->setPrefix(str);
245 str = query_get_attribute(m_contact_query_service, NAME_PHONETIC, &err);
247 contactName->setPhoneticName(str);
249 nameAlreadyChecked = true;
251 else if (!numberAlreadyChecked && (pattr == NUMBER_ADDRESS || pattr == NUMBER_TYPES))
255 char *number = query_get_attribute(m_contact_query_service, NUMBER_ADDRESS, &err);
256 char *numType = query_get_attribute(m_contact_query_service, NUMBER_TYPES, &err);
258 setPhoneNumber(contact, number, numType);
260 } while ( fetch_next_row(m_contact_query_service) == QUERY_SUCCESS );
262 numberAlreadyChecked = true;
264 else if (!emailAlreadyChecked && (pattr == EMAIL_ADDRESS || pattr == EMAIL_TYPE))
268 char *email = query_get_attribute(m_contact_query_service, EMAIL_ADDRESS, &err);
269 char *emailType = query_get_attribute(m_contact_query_service, EMAIL_TYPE, &err);
271 setEmailAddresses(contact, email, emailType);
273 } while ( fetch_next_row(m_contact_query_service) == QUERY_SUCCESS );
275 emailAlreadyChecked = true;
277 else if (!urlAlreadyChecked && (pattr == URL_ADDRESS || pattr == URL_TYPE))
281 char *url = query_get_attribute(m_contact_query_service, URL_ADDRESS, &err);
282 char *urlType = query_get_attribute(m_contact_query_service, URL_TYPE, &err);
284 setUrlAddresses(contact, url, urlType);
286 } while ( fetch_next_row(m_contact_query_service) == QUERY_SUCCESS );
288 urlAlreadyChecked = true;
290 else if (!addrAlreadyChecked &&
291 (pattr == ADDRESS_COUNTRY || pattr == ADDRESS_REGION ||
292 pattr == ADDRESS_CITY || pattr == ADDRESS_STREET ||
293 pattr == ADDRESS_POSTAL_CODE || pattr == ADDRESS_ADDITIONAL) )
297 char *country = query_get_attribute(m_contact_query_service, ADDRESS_COUNTRY, &err);
298 char *region = query_get_attribute(m_contact_query_service, ADDRESS_REGION, &err);
299 char *city = query_get_attribute(m_contact_query_service, ADDRESS_CITY, &err);
300 char *street = query_get_attribute(m_contact_query_service, ADDRESS_STREET, &err);
301 char *postal_code = query_get_attribute(m_contact_query_service, ADDRESS_POSTAL_CODE, &err);
302 char *additional = query_get_attribute(m_contact_query_service, ADDRESS_ADDITIONAL, &err);
304 setAddresses(contact, country, region, city, NULL, street, postal_code, additional);
306 } while ( fetch_next_row(m_contact_query_service) == QUERY_SUCCESS );
308 addrAlreadyChecked = true;
310 else if (!eventAlreadyChecked && (pattr == EVENT_DATE || pattr == EVENT_TYPE))
314 char *event = query_get_attribute(m_contact_query_service, EVENT_DATE, &err);
315 char *eventType = query_get_attribute(m_contact_query_service, EVENT_TYPE, &err);
317 setEvent(contact, event, eventType);
319 } while ( fetch_next_row(m_contact_query_service) == QUERY_SUCCESS );
321 eventAlreadyChecked = true;
323 else if (!organizationAlreadyChecked &&
324 (pattr == ORGANIZATION_NAME || pattr == ORGANIZATION_DEPARTMENT ||
325 pattr == ORGANIZATION_TITLE || pattr == ORGANIZATION_ROLE ) )
329 char *orgname = query_get_attribute(m_contact_query_service, ORGANIZATION_NAME, &err);
330 char *org_dept = query_get_attribute(m_contact_query_service, ORGANIZATION_DEPARTMENT, &err);
331 char *org_title = query_get_attribute(m_contact_query_service, ORGANIZATION_TITLE, &err);
332 char *org_role = query_get_attribute(m_contact_query_service, ORGANIZATION_ROLE, &err);
334 setOrganization(contact, orgname, org_dept, org_title, org_role);
336 } while ( fetch_next_row(m_contact_query_service) == QUERY_SUCCESS );
338 organizationAlreadyChecked = true;
340 else if (!nicknameAlreadyChecked && (pattr == NICKNAME_NAME))
344 char *nickname = query_get_attribute(m_contact_query_service, NICKNAME_NAME, &err);
346 contact->getName()->addNickname(string(nickname));
348 } while ( fetch_next_row(m_contact_query_service) == QUERY_SUCCESS );
350 nicknameAlreadyChecked = true;
352 else if (!categoryAlreadyChecked && (pattr == CATEGORY_INFO))
356 char *category = query_get_attribute(m_contact_query_service, CATEGORY_INFO, &err);
358 contact->addCategory(string(category));
360 } while ( fetch_next_row(m_contact_query_service) == QUERY_SUCCESS );
362 categoryAlreadyChecked = true;
366 nameAlreadyChecked = false;
367 numberAlreadyChecked = false;
368 emailAlreadyChecked = false;
369 urlAlreadyChecked = false;
370 addrAlreadyChecked = false;
371 eventAlreadyChecked = false;
372 organizationAlreadyChecked = false;
373 nicknameAlreadyChecked = false;
374 categoryAlreadyChecked = false;
376 result->push_back(contact);
379 LogDebug("entered, end generating result set");
383 void ContactSearchEngine::visitPreComposite(FilterType& type, int depth)
385 query_set_condition_append(m_contact_query_service, LEFT_BRACKET);
388 void ContactSearchEngine::visitInComposite(FilterType& type, int depth)
390 if(type == UNION_FILTER)
391 query_set_condition_append(m_contact_query_service, OR);
392 else if(type == INTERSECTION_FILTER)
393 query_set_condition_append(m_contact_query_service, AND);
396 void ContactSearchEngine::visitPostComposite(FilterType& type, int depth)
398 query_set_condition_append(m_contact_query_service, RIGHT_BRACKET);
401 void ContactSearchEngine::visitAttribute(string& attrName, AnyArrayPtr& matchValues, string& matchFlag, bool caseSensitive, int depth)
403 contact_attribute_e attr;
404 attr = getPlatformAttr(attrName);
406 string matchValueStr;
408 if(matchFlag == "EXISTS")
410 query_set_condition(m_contact_query_service, attr, EXISTS, NULL);
412 else if(attrName == "id" && (matchFlag == "" || matchFlag == "EXACTLY"))
414 visitAttributeID(matchValues);
416 else if(matchValues->size() == 1)
419 if(matchFlag == "EXACTLY")
421 else if (matchFlag == "STARTSWITH" || matchFlag == "ENDSWITH")
426 AnyPtr matchValue = matchValues->at(0);
428 visitAttributeEach(attr, matchValue, cond);
430 else if(matchValues->size() > 1)
433 if(matchFlag == "EXACTLY")
435 else if (matchFlag == "STARTSWITH" || matchFlag == "ENDSWITH")
440 query_set_condition_append(m_contact_query_service, LEFT_BRACKET);
442 AnyArray::iterator iter;
443 for(iter = matchValues->begin(); iter != matchValues->end(); iter++)
445 AnyPtr matchValue = *iter;
446 if(iter != matchValues->begin())
447 query_set_condition_append(m_contact_query_service, OR);
449 visitAttributeEach(attr, matchValue, cond);
452 query_set_condition_append(m_contact_query_service, RIGHT_BRACKET);
456 void ContactSearchEngine::visitAttributeRange(string& attrName, AnyPtr& initialValue, AnyPtr& endValue, int depth)
458 contact_attribute_e attr;
459 string initialValueStr;
462 if(initialValue->getType() == PrimitiveType_Time)
464 tm date = DPL::DynamicPointerCast< Any_T<tm> >(initialValue)->getValue();
465 initialValueStr = toDateDbStr(date);
469 initialValueStr = initialValue->toString();
472 if(endValue->getType() == PrimitiveType_Time)
474 tm date = DPL::DynamicPointerCast< Any_T<tm> >(endValue)->getValue();
475 endValueStr = toDateDbStr(date);
479 endValueStr = endValue->toString();
482 attr = getPlatformAttr(attrName);
483 query_set_condition_append(m_contact_query_service, LEFT_BRACKET);
484 query_set_condition(m_contact_query_service, attr, GREATER_THAN_OR_EQUAL, ("\"" + initialValueStr + "\"").c_str());
485 query_set_condition_append(m_contact_query_service, AND);
486 query_set_condition(m_contact_query_service, attr, LESS_THAN_OR_EQUAL, ("\"" + endValueStr + "\"").c_str());
487 query_set_condition_append(m_contact_query_service, RIGHT_BRACKET);
490 void ContactSearchEngine::visitAttributeEach(contact_attribute_e attr, AnyPtr& matchValue, condition_e flag)
493 if(matchValue->getType() == PrimitiveType_Time)
495 tm date = DPL::DynamicPointerCast< Any_T<tm> >(matchValue)->getValue();
496 valueStr = toDateDbStr(date);
500 valueStr = matchValue->toString();
503 query_set_condition(m_contact_query_service, attr, flag, valueStr.c_str());
506 void ContactSearchEngine::visitAttributeID(AnyArrayPtr &ids)
508 if (ids->size() == 1)
510 query_set_condition(m_contact_query_service, getPlatformAttr("id"), EQUAL, ids->at(0)->toString().c_str());
512 else if (ids->size() > 1)
514 query_set_condition_with_indices_begin(m_contact_query_service);
516 for (AnyArray::iterator iter = ids->begin(); iter != ids->end(); iter++)
517 query_set_condition_with_indices(m_contact_query_service, (*iter)->toString().c_str());
519 query_set_condition_with_indices_end(m_contact_query_service);
523 contact_attribute_e ContactSearchEngine::getPlatformAttr(string attrName)
525 contact_attribute_e platformAttr = contact_attribute_e::ATTRIBUTE_MAX;
527 platformAttr = (contact_attribute_e) attrEnumMap.find(attrName)->second;
528 if (platformAttr >= ATTRIBUTE_MAX)
530 ThrowMsg(UnsupportedException, "Attribute(" << attrName << ") is not supported.");
537 void ContactSearchEngine::setPlatformAttrValue(Contact& contact, contact_attribute_e attr, char* val)
545 contact.setId(string(val));
547 case CONTACT_IS_FAVORITE:
548 contact.setIsFavorite(toBool(val));
550 case CONTACT_RINGTONE:
551 contact.setRingtoneURI(string(val));
554 contact.addNote(string(val));
556 case CONTACT_PHOTO_URI:
557 contact.setPhotoURI(string(val));
559 // CONTACT_READ_ONLY,
560 // CONTACT_SEND_TO_VOICE_MAIL,
561 case CONTACT_LAST_UPDATED_TIME_STAMP:
562 contact.setLastUpdated(toDateTm(val));
566 // CONTACT_LONGITUDE,
568 contact.setFirstName(string(val));
571 contact.setMiddleName(string(val));
574 contact.setLastName(string(val));
577 contact.setPrefix(string(val));
580 contact.setPhoneticName(string(val));
583 contact.setDisplayName(string(val));
586 contact.addNickname(string(val));
599 case ADDRESS_COUNTRY:
601 // case ADDRESS_COUNTY:
604 case ADDRESS_POSTAL_CODE:
605 case ADDRESS_ADDITIONAL:
609 contact.addCategory(string(val));
615 // ORGANIZATION_NAME = 140,
616 // ORGANIZATION_DEPARTMENT,
617 //// ORGANIZATION_OFFICE,
618 // ORGANIZATION_TITLE,
619 // ORGANIZATION_ROLE,
620 //// ORGANIZATION_LOGO_URI,
623 // PRESENCE_STATE = 160,
625 // PRESENCE_ICON_URI,
626 // PRESENCE_CAPABILITY,
629 // ATTRIBUTE_MAX = 1000
636 void ContactSearchEngine::setPhoneNumber(ContactPtr& contact, char *number, char *type)
641 ContactPhoneNumberPtr numberType = ContactPhoneNumberPtr(new ContactPhoneNumber());
644 numberType->setNumber(string(number));
648 vector<string> tokens;
649 tokenize(type,tokens, ",");
651 for (unsigned int i=0; i<tokens.size(); i++)
652 numberType->addType(tokens[i]);
655 contact->addPhoneNumber(numberType);
658 void ContactSearchEngine::setEmailAddresses(ContactPtr& contact, char *email, char *type)
663 ContactEmailAddressPtr emailAddr = ContactEmailAddressPtr(new ContactEmailAddress());
666 emailAddr->setEmail(string(email));
670 vector<string> tokens;
671 tokenize(type,tokens, ",");
672 for (unsigned int i=0; i<tokens.size(); i++)
674 if (tokens[i].compare("WORK") == 0)
675 emailAddr->addType(CONTACT_EMAIL_TYPE_WORK);
676 else if (tokens[i].compare("PREF"))
677 emailAddr->addType(CONTACT_EMAIL_TYPE_PREF);
678 else if (tokens[i].compare("HOME"))
679 emailAddr->addType(CONTACT_EMAIL_TYPE_HOME);
683 contact->addEmail(emailAddr);
686 void ContactSearchEngine::setUrlAddresses(ContactPtr& contact, char *url, char *type)
691 ContactWebSitePtr urlType = ContactWebSitePtr(new ContactWebSite());
694 urlType->setUrl(string(url));
698 vector<string> tokens;
699 tokenize(type,tokens, ",");
700 for (unsigned int i=0; i<tokens.size(); i++)
702 if (tokens[i].compare("HOMEPAGE") == 0)
703 urlType->setType(WEBSITE_TYPE_HOMEPAGE);
704 else if (tokens[i].compare("BLOG") == 0)
705 urlType->setType(WEBSITE_TYPE_BLOG);
709 contact->addUrl(urlType);
712 void ContactSearchEngine::setAddresses(ContactPtr& contact,
713 char *country, char *region, char* city, char *county, char *street, char *postal_code, char *additional)
715 if(country == NULL && region == NULL && city == NULL && county == NULL &&
716 street == NULL && postal_code == NULL && additional == NULL)
719 ContactAddressPtr addr = ContactAddressPtr(new ContactAddress());
722 addr->setCountry(string(country));
725 addr->setRegion(string(region));
728 addr->setCity(string(city));
731 addr->setStreetAddress(string(street));
734 addr->setPostalCode(string(postal_code));
737 addr->setAdditionalInformation(string(additional));
739 contact->addAddress(addr);
742 void ContactSearchEngine::setEvent(ContactPtr& contact, char *date, char *type)
747 tm tm_date = toDateTmFromDateDbStr(date);
751 if(strcmp(type, "BIRTHDAY") == 0)
753 contact->setBirthday(tm_date);
755 else if(strcmp(type, "ANNIVERSARY") == 0)
757 ContactAnniversaryPtr anniv = ContactAnniversaryPtr(new ContactAnniversary());
759 anniv->setDate(tm_date);
761 // anniv->setLabel(string(type));
763 contact->addAnniversary(anniv);
767 LogDebug("type is null");
770 void ContactSearchEngine::setOrganization(ContactPtr& contact,
771 char* org_name, char* org_dept, char* org_title, char* org_role)
773 ContactOrganizationPtr org = ContactOrganizationPtr(new ContactOrganization());
776 org->setName(string(org_name));
779 org->setDepartment(string(org_dept));
782 org->setTitle(string(org_title));
785 org->setRole(string(org_role));
787 contact->setOrganization(org);
790 void ContactSearchEngine::tokenize(const string& str, vector<string>& tokens, const string& delimiters)
792 // Skip delimiters at beginning.
793 string::size_type lastPos = str.find_first_not_of(delimiters, 0);
794 // Find first "non-delimiter".
795 string::size_type pos = str.find_first_of(delimiters, lastPos);
797 while (string::npos != pos || string::npos != lastPos)
799 // Found a token, add it to the vector.
800 tokens.push_back(str.substr(lastPos, pos - lastPos));
801 // Skip delimiters. Note the "not_of"
802 lastPos = str.find_first_not_of(delimiters, pos);
803 // Find next "non-delimiter"
804 pos = str.find_first_of(delimiters, lastPos);
808 bool ContactSearchEngine::toBool(char* val)
812 if (boolStr == "true" || boolStr == "TRUE")
818 tm ContactSearchEngine::toDateTm(char* arg)
820 // this code originated from Converter
822 char* currentLocale = setlocale(LC_TIME, NULL);
823 if (currentLocale == NULL) {
824 ThrowMsg(ConversionException, "Couldn't get current locale.");
826 DPL::ScopedFree<char> currentLocaleCopy(strdup(currentLocale));
827 if (setlocale(LC_TIME, "C") == NULL) {
828 ThrowMsg(ConversionException, "Couldn't set POSIX locale.");
830 if (strptime(arg, "%a %b %d %Y %T", &result) == NULL) {
831 ThrowMsg(ConversionException, "Couldn't convert supplied date.");
833 if (setlocale(LC_TIME, currentLocaleCopy.Get()) == NULL) {
834 ThrowMsg(ConversionException, "Couldn't set previous locale back.");
839 string ContactSearchEngine::toDateDbStr(const tm &date) const
842 ss << setfill('0') << setiosflags(ios::right) << setw(4) << (date.tm_year + 1900);
843 ss << setfill('0') << setiosflags(ios::right) << setw(2) << (date.tm_mon + 1);
844 ss << setfill('0') << setiosflags(ios::right) << setw(2) << date.tm_mday;
849 tm ContactSearchEngine::toDateTmFromDateDbStr(const char* arg) const
854 ThrowMsg(InvalidArgumentException, "Invalid Date type");
858 stringstream ss(arg);
861 date.tm_year = (dateDb / 10000) - 1900;
862 date.tm_mon = ((dateDb - ((date.tm_year + 1900) * 10000)) / 100) - 1;
863 date.tm_mday = (dateDb - ((date.tm_year + 1900) * 10000) - date.tm_mon * 100);