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 #include <dpl/log/log.h>
19 #include "CalendarFilter.h"
20 #include "CalendarQuery.h"
21 #include <calendar-svc-provider.h>
26 using namespace TizenApis::Api::Calendar;
27 using namespace WrtDeviceApis::Commons;
33 // The selected fields for the generic filter support.
34 std::map<std::string, std::string> CalendarFilter::m_attributeMap = {
35 {CALENDAR_FILTER_ATTRIBUTE_ID_UID, CAL_VALUE_INT_INDEX},
36 {CALENDAR_FILTER_ATTRIBUTE_ID, CAL_VALUE_INT_INDEX},
37 {CALENDAR_FILTER_ATTRIBUTE_LAST_MODIFIED_DATE, CALS_VALUE_LLI_LASTMOD},
38 {CALENDAR_FILTER_ATTRIBUTE_DESCRIPTION, CAL_VALUE_TXT_DESCRIPTION},
39 {CALENDAR_FILTER_ATTRIBUTE_SUMMARY, CAL_VALUE_TXT_SUMMARY},
40 {CALENDAR_FILTER_ATTRIBUTE_START_DATE, CALS_VALUE_LLI_DTSTART_UTIME},
41 {CALENDAR_FILTER_ATTRIBUTE_LOCATION, CAL_VALUE_TXT_LOCATION},
42 {CALENDAR_FILTER_ATTRIBUTE_LATITUDE, CAL_VALUE_DBL_LATITUDE},
43 {CALENDAR_FILTER_ATTRIBUTE_LONGITUDE, CAL_VALUE_DBL_LONGITUDE},
44 {CALENDAR_FILTER_ATTRIBUTE_ORGANIZER, CAL_VALUE_TXT_ORGANIZER_NAME},
45 {CALENDAR_FILTER_ATTRIBUTE_VISIBILITY, CAL_VALUE_INT_SENSITIVITY},
46 {CALENDAR_FILTER_ATTRIBUTE_STATUS, CAL_VALUE_INT_TASK_STATUS},
47 //{"alarms", CAL_VALUE_INT_ALARMS_TICK}, // object interface
48 {CALENDAR_FILTER_ATTRIBUTE_CATEGORIES, CAL_VALUE_TXT_CATEGORIES}, // string array
49 {CALENDAR_FILTER_ATTRIBUTE_PRIORITY, CAL_VALUE_INT_PRIORITY},
50 {CALENDAR_FILTER_ATTRIBUTE_DUE_DATE, CALS_VALUE_LLI_DTEND_UTIME},
51 {CALENDAR_FILTER_ATTRIBUTE_COMPLETED_DATE, CAL_VALUE_LLI_COMPLETED_TIME},
52 {CALENDAR_FILTER_ATTRIBUTE_PROGRESS, CAL_VALUE_INT_PROGRESS},
53 {CALENDAR_FILTER_ATTRIBUTE_IS_DETACHED, CAL_VALUE_INT_ORIGINAL_EVENT_ID},
54 {CALENDAR_FILTER_ATTRIBUTE_IS_ALL_DAY, CALS_VALUE_INT_DTSTART_TYPE},
55 //{CALENDAR_FILTER_ATTRIBUTE_DURATION, CALS_VALUE_LLI_DTEND_UTIME}, // needs end date calculation
56 //{"attendees", CAL_VALUE_TXT_ATTENDEE_DETAIL_NAME}, // object array interface
57 {CALENDAR_FILTER_ATTRIBUTE_END_DATE, CALS_VALUE_LLI_DTEND_UTIME},
58 {CALENDAR_FILTER_ATTRIBUTE_AVAILABILITY, CAL_VALUE_INT_AVAILABILITY},
59 {CALENDAR_FILTER_ATTRIBUTE_RECURRENCE_RULE, CALS_VALUE_INT_RRULE_FREQ}
62 CalendarFilter::CalendarFilter()
66 m_query.append(" WHERE");
69 CalendarFilter::~CalendarFilter()
73 void CalendarFilter::visitPreComposite(TizenApis::Api::Tizen::FilterType& type, int depth)
79 void CalendarFilter::visitInComposite(TizenApis::Api::Tizen::FilterType& type, int depth)
82 if(type == TizenApis::Api::Tizen::UNION_FILTER)
83 m_query.append(" OR ");
84 else if(type == TizenApis::Api::Tizen::INTERSECTION_FILTER)
85 m_query.append(" AND ");
88 void CalendarFilter::visitPostComposite(TizenApis::Api::Tizen::FilterType& type, int depth)
94 void CalendarFilter::visitAttribute(std::string& attrName, TizenApis::Api::Tizen::MatchFlag& matchFlag, TizenApis::Api::Tizen::AnyPtr& matchValue, int depth)
96 if(matchValue == NULL)
99 LogDebug("attrName: "<<attrName<<", value length: "<<matchValue->toString()<<", matchFlag: "<<matchFlag<<", depth:"<<depth);
101 std::string conditionQuery;
102 std::string matchString;
103 std::string valueString;
105 if(matchValue->isType(TizenApis::Api::Tizen::PrimitiveType_Time))
107 tm date = matchValue->getDateTm();
108 std::stringstream time;
109 time << timegm(&date);
110 valueString = time.str();
112 else if(matchValue->isType(TizenApis::Api::Tizen::PrimitiveType_Boolean))
114 if (matchValue->getBool()) {
115 valueString = std::string("1");
117 valueString = std::string("0");
122 valueString = matchValue->toString();
125 if(attrName==CALENDAR_FILTER_ATTRIBUTE_VISIBILITY
126 || attrName==CALENDAR_FILTER_ATTRIBUTE_STATUS
127 || attrName==CALENDAR_FILTER_ATTRIBUTE_PRIORITY
128 || attrName==CALENDAR_FILTER_ATTRIBUTE_AVAILABILITY
129 || attrName==CALENDAR_FILTER_ATTRIBUTE_RECURRENCE_RULE) {
130 valueString = convertStringToValue(attrName, valueString);
133 if( matchFlag==TizenApis::Api::Tizen::MATCH_EXACTLY ) {
134 matchString = " = \'" + valueString + "\'"; // case-sensitive
135 } else if( matchFlag==TizenApis::Api::Tizen::MATCH_FULLSTRING ) {
136 matchString = " like \'" + valueString + "\'"; // case-insensitive
137 } else if( matchFlag==TizenApis::Api::Tizen::MATCH_CONTAINS) {
138 matchString = " like \'%" + valueString + "%\'";
139 } else if( matchFlag==TizenApis::Api::Tizen::MATCH_STARTSWITH) {
140 matchString = " like \'%" + valueString + "\'";
141 } else if( matchFlag==TizenApis::Api::Tizen::MATCH_ENDSWITH) {
142 matchString = " like \'" + valueString + "%\'";
143 }else if( matchFlag==TizenApis::Api::Tizen::MATCH_EXISTS) {
144 if(attrName==CALENDAR_FILTER_ATTRIBUTE_RECURRENCE_RULE) {
145 matchString = " is not 0";
147 matchString = " is not null";
150 LogError("Invalid matchFlag!");
151 matchString = " is not null";
154 if (attrName==CALENDAR_FILTER_ATTRIBUTE_IS_DETACHED) {
155 if (valueString=="1") {
156 conditionQuery.append(" (" + m_attributeMap[attrName] + " > 0 )");
158 conditionQuery.append(" (" + m_attributeMap[attrName] + " < 0 )");
160 } else if (attrName==CALENDAR_FILTER_ATTRIBUTE_IS_ALL_DAY) {
161 std::stringstream ss;
162 if (valueString=="1") {
163 ss<<CALS_TIME_LOCALTIME;
167 conditionQuery.append(" (" + m_attributeMap[attrName] + " = " + ss.str() + " )");
169 conditionQuery.append(" (" + m_attributeMap[attrName] + matchString + ") ");
172 LogInfo("Generated condition query: [" << conditionQuery << "]");
174 m_query.append(conditionQuery);
177 void CalendarFilter::visitAttributeRange(std::string& attrName, TizenApis::Api::Tizen::AnyPtr& initialValue, TizenApis::Api::Tizen::AnyPtr& endValue, int depth)
179 if(initialValue == NULL || endValue == NULL)
182 LogDebug("attrName: " <<attrName<<", initialValue: "<<initialValue->toString()<<", endValue: " <<endValue->toString()<<", depth: "<<depth);
183 std::string conditionQuery;
184 std::string initialValueStr;
185 std::string endValueStr;
187 if (!initialValue->isNullOrUndefined()) {
188 if( TizenApis::Api::Tizen::PrimitiveType_Time==initialValue->getType() ) {
189 tm date = initialValue->getDateTm();
190 std::stringstream time;
191 time << timegm(&date);
192 initialValueStr = time.str();
194 initialValueStr = initialValue->toString();
198 if (!endValue->isNullOrUndefined()) {
199 if( TizenApis::Api::Tizen::PrimitiveType_Time==endValue->getType() ) {
200 tm date = endValue->getDateTm();
201 std::stringstream time;
202 time << timegm(&date);
203 endValueStr = time.str();
205 endValueStr = endValue->toString();
209 if (!initialValue->isNullOrUndefined() && endValue->isNullOrUndefined() ) {
210 conditionQuery = " " + m_attributeMap[attrName] + ">" + initialValueStr + " ";
211 } else if (initialValue->isNullOrUndefined() && !endValue->isNullOrUndefined() ) {
212 conditionQuery = " " + m_attributeMap[attrName] + "<" + endValueStr + " ";
213 } else if (!initialValue->isNullOrUndefined() && !endValue->isNullOrUndefined() ) {
214 conditionQuery = " " + m_attributeMap[attrName] + ">" + initialValueStr + " AND " + m_attributeMap[attrName] + "<" + endValueStr + " ";
217 m_query.append(conditionQuery);
220 std::string CalendarFilter::getResult() const
226 bool CalendarFilter::convertToCalendar(calendar_query_s *queryData, CalendarEventListPtr calendarListPtr)
230 if (queryData == NULL)
233 CalendarEventPtr calendarEvent(new CalendarEvent());
235 // Convert query results to the event struct.
236 calendarEvent->setId(queryData->id);
238 calendarListPtr->push_back(calendarEvent);
243 bool CalendarFilter::executeQuery(std::string &query, CalendarEventListPtr calendarListPtr)
247 calendar_query_s query_data;
252 hstmt = calendar_query_prepare((char *)(query.c_str()));
254 ThrowMsg(PlatformException, "Can't prepare query!");
258 ret = calendar_query_step(hstmt);
259 LogDebug("Query result : [" << ret << "]");
260 if (ret == SQLITE_ROW) { // 100
261 query_data.id = calendar_query_column_int(hstmt, 0);
263 convertToCalendar(&query_data, calendarListPtr);
264 } else if (ret == SQLITE_DONE) { // 101
265 LogDebug("Query done [" << ret << "]");
267 } else { //if (ret == SQLITE_DONE || ret == SQLITE_IOERR || ret == SQLITE_BUSY || ret == SQLITE_ERROR || ret == SQLITE_MISUSE)
268 LogDebug("Query error [" << ret << "]");
273 calendar_query_finalize(hstmt);
278 std::string CalendarFilter::makeQuerySortMode(TizenApis::Api::Tizen::SortModeArrayPtr attr)
282 std::string query("");
283 std::string attriName;
285 TizenApis::Api::Tizen::SortModeArray::iterator it = attr->begin();
287 for (;it!=attr->end(); ++it) {
288 attriName = (*it)->getAttributeName();
289 if (attriName.compare("") != 0) {
291 query.append(" ORDER BY ");
295 query.append(attriName);
297 if ((*it)->getOrder()==TizenApis::Api::Tizen::ASCENDING_SORT_ORDER) {
298 query.append(" ASC");
300 query.append(" DESC");
309 std::string CalendarFilter::convertStringToValue(const std::string attrName, const std::string valueString)
313 std::stringstream ss;
315 if(attrName==CALENDAR_FILTER_ATTRIBUTE_VISIBILITY)
317 if(valueString=="PUBLIC") {
318 ss<<PUBLIC_VISIBILITY;
320 } else if(valueString=="PRIVATE") {
321 ss<<PRIVATE_VISIBILITY;
323 } else if(valueString=="CONFIDENTIAL") {
324 ss<<CONFIDENTIAL_VISIBILITY;
330 else if(attrName==CALENDAR_FILTER_ATTRIBUTE_STATUS)
332 if(valueString=="TENTATIVE") {
333 ss<<CALS_EVENT_STATUS_TENTATIVE;
335 } else if(valueString=="CONFIRMED") {
336 ss<<CALS_EVENT_STATUS_CONFIRMED;
338 } else if(valueString=="CANCELLED") {
339 ss<<CALS_EVENT_STATUS_CANCELLED;
341 } else if(valueString=="NEEDS_ACTION") {
342 ss<<CALS_TODO_STATUS_NEEDS_ACTION;
344 } else if(valueString=="IN_PROCESS") {
345 ss<<CALS_TODO_STATUS_IN_PROCESS;
347 } else if(valueString=="COMPLETED") {
348 ss<<CALS_TODO_STATUS_COMPLETED;
354 else if(attrName==CALENDAR_FILTER_ATTRIBUTE_PRIORITY)
356 if(valueString=="HIGH") {
357 ss<<EVENT_PRIORITY_HIGH;
359 } else if(valueString=="MEDIUM") {
360 ss<<EVENT_PRIORITY_NORMAL;
362 } else if(valueString=="LOW") {
363 ss<<EVENT_PRIORITY_LOW;
369 else if(attrName==CALENDAR_FILTER_ATTRIBUTE_AVAILABILITY)
371 if(valueString=="BUSY") {
374 } else if(valueString=="FREE") {
381 else if(attrName==CALENDAR_FILTER_ATTRIBUTE_RECURRENCE_RULE)
383 if(valueString=="DAILY") {
384 ss<<CAL_REPEAT_EVERY_DAY;
386 } else if(valueString=="WEEKLY") {
387 ss<<CAL_REPEAT_EVERY_WEEK;
389 } else if(valueString=="MONTHLY") {
390 ss<<CAL_REPEAT_EVERY_MONTH;
392 } else if(valueString=="YEARLY") {
393 ss<<CAL_REPEAT_EVERY_YEAR;
401 LogWarning("Invalid attrName");
407 std::string CalendarFilter::concatenateFilterAttributes()
411 std::string attributes;
412 std::map<std::string, std::string>::iterator iter;
414 for( iter=m_attributeMap.begin(); iter!=m_attributeMap.end(); iter++) {
415 attributes.append((*iter).second);
416 if( i+1<m_attributeMap.size() ) {
417 attributes.append(", ");