2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
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.
17 * @file FScl_CalendarbookFilterImpl.cpp
18 * @brief This is the implementation for _CalendarbookFilterImpl class.
20 * This file contains definitions of @e _CalendarbookFilterImpl class.
23 #include <unique_ptr.h>
24 #include <FBaseSysLog.h>
25 #include <FBaseDateTime.h>
26 #include <FBase_StringConverter.h>
27 #include <FSclCalendarbookFilter.h>
28 #include "FScl_CalendarbookFilterImpl.h"
29 #include "FScl_CalendarbookUtil.h"
31 using namespace Tizen::Base;
33 namespace Tizen { namespace Social
36 static const long long _CALENDAR_TODO_NO_START_DATE = -0x7fffffffffffffffLL;
37 static const long long _CALENDAR_TODO_NO_DUE_DATE = 0x7fffffffffffffffLL;
39 // CB_FI_TYPE_CALENDAR
40 // The entries must be ordered same as CalendarFilterProperty
41 const _CalendarbookFilterImpl::__FilterPropertyInfoEntry _CalendarbookFilterImpl::__calendarFilterPropertyInfos[] =
43 {CALENDAR_FI_PR_CALENDAR_ID, _calendar_book.id, DATA_TYPE_INT},
44 {CALENDAR_FI_PR_ACCOUNT_ID, _calendar_book.account_id, DATA_TYPE_INT},
45 {CALENDAR_FI_PR_NAME, _calendar_book.name, DATA_TYPE_STRING},
46 {CALENDAR_FI_PR_ITEM_TYPE, _calendar_book.store_type, DATA_TYPE_INT},
50 // The entries must be ordered same as EventFilterProperty
51 const _CalendarbookFilterImpl::__FilterPropertyInfoEntry _CalendarbookFilterImpl::__eventFilterPropertyInfos[] =
53 {EVENT_FI_PR_EVENT_ID, _calendar_event.id, DATA_TYPE_INT},
54 {EVENT_FI_PR_CALENDAR_ID, _calendar_event.calendar_book_id, DATA_TYPE_INT},
55 {EVENT_FI_PR_SUBJECT, _calendar_event.summary, DATA_TYPE_STRING},
56 {EVENT_FI_PR_DESCRIPTION, _calendar_event.description, DATA_TYPE_STRING},
57 {EVENT_FI_PR_LOCATION, _calendar_event.location, DATA_TYPE_STRING},
58 {EVENT_FI_PR_BUSY_STATUS, _calendar_event.busy_status, DATA_TYPE_INT},
59 {EVENT_FI_PR_PRIORITY, _calendar_event.priority, DATA_TYPE_INT},
60 {EVENT_FI_PR_SENSITIVITY, _calendar_event.sensitivity, DATA_TYPE_INT},
61 {EVENT_FI_PR_STATUS, _calendar_event.event_status, DATA_TYPE_INT},
62 {EVENT_FI_PR_UID, _calendar_event.uid, DATA_TYPE_STRING},
63 {EVENT_FI_PR_LATITUDE, _calendar_event.latitude, DATA_TYPE_DOUBLE},
64 {EVENT_FI_PR_LONGITUDE, _calendar_event.longitude, DATA_TYPE_DOUBLE},
65 {EVENT_FI_PR_LAST_REVISED_TIME, _calendar_event.last_modified_time, DATA_TYPE_DATE_TIME},
66 {EVENT_FI_PR_HAS_REMINDER, _calendar_event.has_alarm, DATA_TYPE_BOOL},
67 {EVENT_FI_PR_HAS_ATTENDEE, _calendar_event.has_attendee, DATA_TYPE_BOOL},
71 // The entries must be ordered same as TodoFilterProperty
72 const _CalendarbookFilterImpl::__FilterPropertyInfoEntry _CalendarbookFilterImpl::__todoFilterPropertyInfos[] =
74 {TODO_FI_PR_TODO_ID, _calendar_todo.id, DATA_TYPE_INT},
75 {TODO_FI_PR_CALENDAR_ID, _calendar_todo.calendar_book_id, DATA_TYPE_INT},
76 {TODO_FI_PR_START_DATE, _calendar_todo.start_time, DATA_TYPE_DATE_TIME},
77 {TODO_FI_PR_DUE_DATE, _calendar_todo.due_time, DATA_TYPE_DATE_TIME},
78 {TODO_FI_PR_SUBJECT, _calendar_todo.summary, DATA_TYPE_STRING},
79 {TODO_FI_PR_DESCRIPTION, _calendar_todo.description, DATA_TYPE_STRING},
80 {TODO_FI_PR_LOCATION, _calendar_todo.location, DATA_TYPE_STRING},
81 {TODO_FI_PR_PRIORITY, _calendar_todo.priority, DATA_TYPE_INT},
82 {TODO_FI_PR_SENSITIVITY, _calendar_todo.sensitivity, DATA_TYPE_INT},
83 {TODO_FI_PR_STATUS, _calendar_todo.todo_status, DATA_TYPE_INT},
84 {TODO_FI_PR_LATITUDE, _calendar_todo.latitude, DATA_TYPE_DOUBLE},
85 {TODO_FI_PR_LONGITUDE, _calendar_todo.longitude, DATA_TYPE_DOUBLE},
86 {TODO_FI_PR_LAST_REVISED_TIME, _calendar_todo.last_modified_time, DATA_TYPE_DATE_TIME},
87 {TODO_FI_PR_HAS_REMINDER, _calendar_todo.has_alarm, DATA_TYPE_BOOL},
90 // CB_FI_TYPE_ALL_DAY_EVENT_INSTANCE
91 // The entries must be ordered same as EventInstanceFilterProperty
92 const _CalendarbookFilterImpl::__FilterPropertyInfoEntry _CalendarbookFilterImpl::__allDayEventInstanceFilterPropertyInfos[] =
94 {EVENT_INST_FI_PR_ORIGINAL_EVENT_ID, _calendar_instance_allday_calendar_book.event_id, DATA_TYPE_INT},
95 {EVENT_INST_FI_PR_CALENDAR_ID, _calendar_instance_allday_calendar_book.calendar_book_id, DATA_TYPE_INT},
96 {EVENT_INST_FI_PR_START_TIME, _calendar_instance_allday_calendar_book.start_time, DATA_TYPE_DATE_TIME},
97 {EVENT_INST_FI_PR_END_TIME, _calendar_instance_allday_calendar_book.end_time, DATA_TYPE_DATE_TIME},
98 {EVENT_INST_FI_PR_SUBJECT, _calendar_instance_allday_calendar_book.summary, DATA_TYPE_STRING},
99 {EVENT_INST_FI_PR_DESCRIPTION, _calendar_instance_allday_calendar_book.description, DATA_TYPE_STRING},
100 {EVENT_INST_FI_PR_LOCATION, _calendar_instance_allday_calendar_book.location, DATA_TYPE_STRING},
101 {EVENT_INST_FI_PR_BUSY_STATUS, _calendar_instance_allday_calendar_book.busy_status, DATA_TYPE_INT},
102 {EVENT_INST_FI_PR_PRIORITY, _calendar_instance_allday_calendar_book.priority, DATA_TYPE_INT},
103 {EVENT_INST_FI_PR_SENSITIVITY, _calendar_instance_allday_calendar_book.sensitivity, DATA_TYPE_INT},
104 {EVENT_INST_FI_PR_STATUS, _calendar_instance_allday_calendar_book.event_status, DATA_TYPE_INT},
105 {EVENT_INST_FI_PR_LATITUDE, _calendar_instance_allday_calendar_book.latitude, DATA_TYPE_DOUBLE},
106 {EVENT_INST_FI_PR_LONGITUDE, _calendar_instance_allday_calendar_book.longitude, DATA_TYPE_DOUBLE},
107 {EVENT_INST_FI_PR_IS_RECURRING, _calendar_instance_allday_calendar_book.has_rrule, DATA_TYPE_BOOL},
108 {EVENT_INST_FI_PR_HAS_REMINDER, _calendar_instance_allday_calendar_book.has_alarm, DATA_TYPE_BOOL},
111 // CB_FI_TYPE_NON_ALL_DAY_EVENT_INSTANCE
112 // The entries must be ordered same as EventInstanceFilterProperty
113 const _CalendarbookFilterImpl::__FilterPropertyInfoEntry _CalendarbookFilterImpl::__nonAllDayEventInstanceFilterPropertyInfos[] =
115 {EVENT_INST_FI_PR_ORIGINAL_EVENT_ID, _calendar_instance_normal_calendar_book.event_id, DATA_TYPE_INT},
116 {EVENT_INST_FI_PR_CALENDAR_ID, _calendar_instance_normal_calendar_book.calendar_book_id, DATA_TYPE_INT},
117 {EVENT_INST_FI_PR_START_TIME, _calendar_instance_normal_calendar_book.start_time, DATA_TYPE_DATE_TIME},
118 {EVENT_INST_FI_PR_END_TIME, _calendar_instance_normal_calendar_book.end_time, DATA_TYPE_DATE_TIME},
119 {EVENT_INST_FI_PR_SUBJECT, _calendar_instance_normal_calendar_book.summary, DATA_TYPE_STRING},
120 {EVENT_INST_FI_PR_DESCRIPTION, _calendar_instance_normal_calendar_book.description, DATA_TYPE_STRING},
121 {EVENT_INST_FI_PR_LOCATION, _calendar_instance_normal_calendar_book.location, DATA_TYPE_STRING},
122 {EVENT_INST_FI_PR_BUSY_STATUS, _calendar_instance_normal_calendar_book.busy_status, DATA_TYPE_INT},
123 {EVENT_INST_FI_PR_PRIORITY, _calendar_instance_normal_calendar_book.priority, DATA_TYPE_INT},
124 {EVENT_INST_FI_PR_SENSITIVITY, _calendar_instance_normal_calendar_book.sensitivity, DATA_TYPE_INT},
125 {EVENT_INST_FI_PR_STATUS, _calendar_instance_normal_calendar_book.event_status, DATA_TYPE_INT},
126 {EVENT_INST_FI_PR_LATITUDE, _calendar_instance_normal_calendar_book.latitude, DATA_TYPE_DOUBLE},
127 {EVENT_INST_FI_PR_LONGITUDE, _calendar_instance_normal_calendar_book.longitude, DATA_TYPE_DOUBLE},
128 {EVENT_INST_FI_PR_IS_RECURRING, _calendar_instance_normal_calendar_book.has_rrule, DATA_TYPE_BOOL},
129 {EVENT_INST_FI_PR_HAS_REMINDER, _calendar_instance_normal_calendar_book.has_alarm, DATA_TYPE_BOOL},
132 const _CalendarbookFilterImpl::__FilterInfoEntry _CalendarbookFilterImpl::__filterInfos[] =
134 {CB_FI_TYPE_EVENT, _calendar_event._uri, EVENT_FI_PR_EVENT_ID, sizeof(__eventFilterPropertyInfos)/sizeof(_CalendarbookFilterImpl::__FilterPropertyInfoEntry), __eventFilterPropertyInfos},
135 {CB_FI_TYPE_TODO, _calendar_todo._uri, TODO_FI_PR_TODO_ID, sizeof(__todoFilterPropertyInfos)/sizeof(_CalendarbookFilterImpl::__FilterPropertyInfoEntry), __todoFilterPropertyInfos},
136 {CB_FI_TYPE_CALENDAR, _calendar_book._uri, CALENDAR_FI_PR_CALENDAR_ID, sizeof(__calendarFilterPropertyInfos)/sizeof(_CalendarbookFilterImpl::__FilterPropertyInfoEntry), __calendarFilterPropertyInfos},
137 {CB_FI_TYPE_ALL_DAY_EVENT_INSTANCE, _calendar_instance_allday_calendar_book._uri, EVENT_INST_FI_PR_ORIGINAL_EVENT_ID, sizeof(__allDayEventInstanceFilterPropertyInfos)/sizeof(_CalendarbookFilterImpl::__FilterPropertyInfoEntry), __allDayEventInstanceFilterPropertyInfos},
138 {CB_FI_TYPE_NON_ALL_DAY_EVENT_INSTANCE, _calendar_instance_normal_calendar_book._uri, EVENT_INST_FI_PR_ORIGINAL_EVENT_ID, sizeof(__nonAllDayEventInstanceFilterPropertyInfos)/sizeof(_CalendarbookFilterImpl::__FilterPropertyInfoEntry), __nonAllDayEventInstanceFilterPropertyInfos},
142 _CalendarbookFilterImpl::IsValidProperty(CalendarbookFilterType filterType, unsigned long property)
144 int filterInfoCount = sizeof(__filterInfos)/sizeof(__FilterInfoEntry);
146 if (filterType < 0 || filterType > (filterInfoCount - 1))
151 unsigned long baseIndex = __filterInfos[filterType].baseIndex;
152 int propertyInfoCount = __filterInfos[filterType].propertyInfoCount;
154 if (property < baseIndex || property >= (baseIndex + propertyInfoCount))
162 // IsValidProperty must be called before calling this. If IsValidProperty returns false
163 // this should not be called.
165 _CalendarbookFilterImpl::GetUriFromType(CalendarbookFilterType filterType)
167 return __filterInfos[filterType].pViewUri;
170 // IsValidProperty must be called before calling this. If IsValidProperty returns false
171 // this should not be called.
173 _CalendarbookFilterImpl::GetViewPropertyId(CalendarbookFilterType filterType, unsigned long property)
175 const __FilterPropertyInfoEntry* propertyInfos = __filterInfos[filterType].propertyInfos;
176 unsigned long baseIndex = __filterInfos[filterType].baseIndex;
178 return propertyInfos[property - baseIndex].viewPropertyId;
181 // IsValidProperty must be called before calling this. If IsValidProperty returns__nonAllDayEventInstanceFilterPropertyInfos false
182 // this should not be called.
184 _CalendarbookFilterImpl::GetPropertyType(CalendarbookFilterType filterType, unsigned long property)
186 const __FilterPropertyInfoEntry* propertyInfos = __filterInfos[filterType].propertyInfos;
187 unsigned long baseIndex = __filterInfos[filterType].baseIndex;
189 return propertyInfos[property - baseIndex].dataType;
192 _CalendarbookFilterImpl::_CalendarbookFilterImpl(CalendarbookFilterType type)
193 : __filterHandle(null)
197 calendar_filter_h filterHandle = null;
198 const char* pUri = GetUriFromType(type);
200 int ret = calendar_filter_create(pUri, &filterHandle);
201 SysTryReturnVoidResult(NID_SCL, ret == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(GetLastResult()));
203 __filterHandle = filterHandle;
206 _CalendarbookFilterImpl::~_CalendarbookFilterImpl(void)
208 if (__filterHandle != null)
210 calendar_filter_destroy(__filterHandle);
215 _CalendarbookFilterImpl::Equals(const Object& rhs) const
217 const _CalendarbookFilterImpl* pCalendarbookFilter = dynamic_cast<const _CalendarbookFilterImpl*>(&rhs);
218 if (this == pCalendarbookFilter)
227 _CalendarbookFilterImpl::GetHashCode(void) const
229 return (int)__filterHandle;
232 calendar_match_int_flag_e
233 _CalendarbookFilterImpl::GetMatchIntFlag(FilterComparisonOperator comparisonOperator)
235 calendar_match_int_flag_e match = CALENDAR_MATCH_NONE;
236 switch(comparisonOperator)
238 case FI_CMP_OP_EQUAL:
239 match = CALENDAR_MATCH_EQUAL;
242 case FI_CMP_OP_LESS_THAN:
243 match = CALENDAR_MATCH_LESS_THAN;
246 case FI_CMP_OP_LESS_THAN_OR_EQUAL:
247 match = CALENDAR_MATCH_LESS_THAN_OR_EQUAL;
250 case FI_CMP_OP_GREATER_THAN:
251 match = CALENDAR_MATCH_GREATER_THAN;
254 case FI_CMP_OP_GREATER_THAN_OR_EQUAL:
255 match = CALENDAR_MATCH_GREATER_THAN_OR_EQUAL;
258 case FI_CMP_OP_IS_NULL:
259 match = CALENDAR_MATCH_NONE;
263 match = CALENDAR_MATCH_NONE;
270 calendar_match_str_flag_e
271 _CalendarbookFilterImpl::GetMatchStrFlag(FilterStringOperator stringOperstor)
273 calendar_match_str_flag_e match = CALENDAR_MATCH_EXISTS;
274 switch(stringOperstor)
276 case FI_STR_OP_EQUAL:
277 match = CALENDAR_MATCH_EXACTLY;
280 case FI_STR_OP_FULL_STRING:
281 match = CALENDAR_MATCH_FULLSTRING;
284 case FI_STR_OP_START_WITH:
285 match = CALENDAR_MATCH_STARTSWITH;
288 case FI_STR_OP_END_WITH:
289 match = CALENDAR_MATCH_ENDSWITH;
292 case FI_STR_OP_CONTAIN:
293 match = CALENDAR_MATCH_CONTAINS;
296 case FI_STR_OP_IS_NOT_NULL:
297 match = CALENDAR_MATCH_EXISTS;
301 match = CALENDAR_MATCH_EXISTS;
309 _CalendarbookFilterImpl::AppendInt(FilterConjunctiveOperator conjunctiveOperator, unsigned long filterProperty, FilterComparisonOperator comparisonOperator, int value)
311 SysTryReturn(NID_SCL, IsValidProperty(__filterType, filterProperty), E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. filterProperty = %ld", GetErrorMessage(E_INVALID_ARG), filterProperty);
312 SysTryReturn(NID_SCL, GetPropertyType(__filterType, filterProperty) == DATA_TYPE_INT, E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. The type of the specified filter property %d must be int.", GetErrorMessage(E_INVALID_ARG), filterProperty);
313 SysTryReturn(NID_SCL, !(__isEmpty && (conjunctiveOperator == FI_CONJ_OP_AND || conjunctiveOperator == FI_CONJ_OP_OR)),\
314 E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. conjunctiveOperator %d must be FI_CONJ_OP_NONE if there is no filtering expression or filter that has been appended before",\
315 GetErrorMessage(E_INVALID_ARG), conjunctiveOperator);
316 SysTryReturn(NID_SCL, !(!__isEmpty && (conjunctiveOperator == FI_CONJ_OP_NONE)),\
317 E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. conjunctiveOperator %d must be either of FI_CONJ_OP_AND or FI_CONJ_OP_OR, if there is a filtering expression or filter that has been appended before.",\
318 GetErrorMessage(E_INVALID_ARG), conjunctiveOperator);
320 unsigned int id = _CalendarbookFilterImpl::GetViewPropertyId(__filterType, filterProperty);
321 calendar_match_int_flag_e match = GetMatchIntFlag(comparisonOperator);
323 int convertedValue = 0;
324 switch (filterProperty)
326 case EVENT_FI_PR_BUSY_STATUS:
327 convertedValue = _CalendarbookUtil::ConvertBusyStatusToCSEventBusyStatus(value);
330 case EVENT_FI_PR_PRIORITY:
331 convertedValue = _CalendarbookUtil::ConvertEventPriorityToCSEventPriority(value);
334 case EVENT_FI_PR_SENSITIVITY:
335 convertedValue = _CalendarbookUtil::ConvertSensitivityToCSSensitivity(value);
338 case EVENT_FI_PR_STATUS:
339 convertedValue = _CalendarbookUtil::ConvertEventStatusToCSEventStatus(value);
342 case TODO_FI_PR_PRIORITY:
343 convertedValue = _CalendarbookUtil::ConvertTodoPriorityToCSTodoPriority(value);
346 case TODO_FI_PR_SENSITIVITY:
347 convertedValue = _CalendarbookUtil::ConvertSensitivityToCSSensitivity(value);
350 case TODO_FI_PR_STATUS:
351 convertedValue = _CalendarbookUtil::ConvertTodoStatusToCSTodoStatus(value);
354 case CALENDAR_FI_PR_ITEM_TYPE:
355 convertedValue = _CalendarbookUtil::ConvertCalendarItemTypeToCSCalendarbookType(value);
358 case EVENT_INST_FI_PR_BUSY_STATUS:
359 convertedValue = _CalendarbookUtil::ConvertBusyStatusToCSEventBusyStatus(value);
362 case EVENT_INST_FI_PR_PRIORITY:
363 convertedValue = _CalendarbookUtil::ConvertEventPriorityToCSEventPriority(value);
366 case EVENT_INST_FI_PR_SENSITIVITY:
367 convertedValue = _CalendarbookUtil::ConvertSensitivityToCSSensitivity(value);
370 case EVENT_INST_FI_PR_STATUS:
371 convertedValue = _CalendarbookUtil::ConvertEventStatusToCSEventStatus(value);
375 convertedValue = value;
381 calendar_filter_operator_e filterOperator = conjunctiveOperator == FI_CONJ_OP_AND ? CALENDAR_FILTER_OPERATOR_AND : CALENDAR_FILTER_OPERATOR_OR;
383 int ret = calendar_filter_add_operator(__filterHandle, filterOperator);
384 SysTryReturn(NID_SCL, ret == CALENDAR_ERROR_NONE, E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used.", GetErrorMessage(E_INVALID_ARG));
387 int ret = calendar_filter_add_int(__filterHandle, id, match, convertedValue);
388 SysTryReturn(NID_SCL, ret == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
396 _CalendarbookFilterImpl::AppendDouble(FilterConjunctiveOperator conjunctiveOperator, unsigned long filterProperty, FilterComparisonOperator comparisonOperator, double value)
398 SysTryReturn(NID_SCL, IsValidProperty(__filterType, filterProperty), E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. filterProperty = %ld", GetErrorMessage(E_INVALID_ARG), filterProperty);
399 SysTryReturn(NID_SCL, GetPropertyType(__filterType, filterProperty) == DATA_TYPE_DOUBLE, E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. The type of the specified filter property %d must be double.", GetErrorMessage(E_INVALID_ARG), filterProperty);
400 SysTryReturn(NID_SCL, !(__isEmpty && (conjunctiveOperator == FI_CONJ_OP_AND || conjunctiveOperator == FI_CONJ_OP_OR)),\
401 E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. conjunctiveOperator %d must be FI_CONJ_OP_NONE if there is no filtering expression or filter that has been appended before",\
402 GetErrorMessage(E_INVALID_ARG), conjunctiveOperator);
403 SysTryReturn(NID_SCL, !(!__isEmpty && (conjunctiveOperator == FI_CONJ_OP_NONE)),\
404 E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. conjunctiveOperator %d must be either of FI_CONJ_OP_AND or FI_CONJ_OP_OR, if there is a filtering expression or filter that has been appended before.",\
405 GetErrorMessage(E_INVALID_ARG), conjunctiveOperator);
407 unsigned int id = _CalendarbookFilterImpl::GetViewPropertyId(__filterType, filterProperty);
408 calendar_match_int_flag_e match = GetMatchIntFlag(comparisonOperator);
412 calendar_filter_operator_e filterOperator = conjunctiveOperator == FI_CONJ_OP_AND ? CALENDAR_FILTER_OPERATOR_AND : CALENDAR_FILTER_OPERATOR_OR;
414 int ret = calendar_filter_add_operator(__filterHandle, filterOperator);
415 SysTryReturn(NID_SCL, ret == CALENDAR_ERROR_NONE, E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used.", GetErrorMessage(E_INVALID_ARG));
418 int ret = calendar_filter_add_double(__filterHandle, id, match, value);
419 SysTryReturn(NID_SCL, ret == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
427 _CalendarbookFilterImpl::AppendBool(FilterConjunctiveOperator conjunctiveOperator, unsigned long filterProperty, FilterComparisonOperator comparisonOperator, bool value)
429 SysTryReturn(NID_SCL, IsValidProperty(__filterType, filterProperty), E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. filterProperty = %ld", GetErrorMessage(E_INVALID_ARG), filterProperty);
430 SysTryReturn(NID_SCL, GetPropertyType(__filterType, filterProperty) == DATA_TYPE_BOOL, E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. The type of the specified filter property %d must be bool.", GetErrorMessage(E_INVALID_ARG), filterProperty);
431 SysTryReturn(NID_SCL, !(__isEmpty && (conjunctiveOperator == FI_CONJ_OP_AND || conjunctiveOperator == FI_CONJ_OP_OR)),\
432 E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. conjunctiveOperator %d must be FI_CONJ_OP_NONE if there is no filtering expression or filter that has been appended before",\
433 GetErrorMessage(E_INVALID_ARG), conjunctiveOperator);
434 SysTryReturn(NID_SCL, !(!__isEmpty && conjunctiveOperator == FI_CONJ_OP_NONE),\
435 E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. conjunctiveOperator %d must be either of FI_CONJ_OP_AND or FI_CONJ_OP_OR, if there is a filtering expression or filter that has been appended before.",\
436 GetErrorMessage(E_INVALID_ARG), conjunctiveOperator);
437 SysTryReturn(NID_SCL, comparisonOperator == FI_CMP_OP_EQUAL, E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. comparisonOperator %d must be FI_CMP_OP_EQUAL.", GetErrorMessage(E_INVALID_ARG), comparisonOperator);
439 unsigned int viewPropertyId = _CalendarbookFilterImpl::GetViewPropertyId(__filterType, filterProperty);
443 calendar_filter_operator_e filterOperator = conjunctiveOperator == FI_CONJ_OP_AND ? CALENDAR_FILTER_OPERATOR_AND : CALENDAR_FILTER_OPERATOR_OR;
445 int ret = calendar_filter_add_operator(__filterHandle, filterOperator);
446 SysTryReturn(NID_SCL, ret == CALENDAR_ERROR_NONE, E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used.", GetErrorMessage(E_INVALID_ARG));
449 int ret = calendar_filter_add_int(__filterHandle, viewPropertyId, CALENDAR_MATCH_EQUAL, value);
450 SysTryReturn(NID_SCL, ret == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
458 _CalendarbookFilterImpl::AppendDateTime(FilterConjunctiveOperator conjunctiveOperator, unsigned long filterProperty, FilterComparisonOperator comparisonOperator, const DateTime& value)
460 SysTryReturn(NID_SCL, IsValidProperty(__filterType, filterProperty), E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. filterProperty = %ld", GetErrorMessage(E_INVALID_ARG), filterProperty);
461 SysTryReturn(NID_SCL, GetPropertyType(__filterType, filterProperty) == DATA_TYPE_DATE_TIME, E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. The type of the specified filter property %d must be DateTime.", GetErrorMessage(E_INVALID_ARG), filterProperty);
462 SysTryReturn(NID_SCL, !(__isEmpty && (conjunctiveOperator == FI_CONJ_OP_AND || conjunctiveOperator == FI_CONJ_OP_OR)),\
463 E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. conjunctiveOperator %d must be FI_CONJ_OP_NONE if there is no filtering expression or filter that has been appended before",\
464 GetErrorMessage(E_INVALID_ARG), conjunctiveOperator);
465 SysTryReturn(NID_SCL, !(!__isEmpty && conjunctiveOperator == FI_CONJ_OP_NONE),\
466 E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. conjunctiveOperator %d must be either of FI_CONJ_OP_AND or FI_CONJ_OP_OR, if there is a filtering expression or filter that has been appended before.",\
467 GetErrorMessage(E_INVALID_ARG), conjunctiveOperator);
468 SysTryReturn(NID_SCL, _CalendarbookUtil::CheckValidDateTime(value), null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument is used. The value is not in a valid range.");
470 unsigned int id = _CalendarbookFilterImpl::GetViewPropertyId(__filterType, filterProperty);
471 calendar_match_int_flag_e match = GetMatchIntFlag(comparisonOperator);
475 calendar_filter_operator_e filterOperator = conjunctiveOperator == FI_CONJ_OP_AND ? CALENDAR_FILTER_OPERATOR_AND : CALENDAR_FILTER_OPERATOR_OR;
477 int ret = calendar_filter_add_operator(__filterHandle, filterOperator);
478 SysTryReturn(NID_SCL, ret == CALENDAR_ERROR_NONE, E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used.", GetErrorMessage(E_INVALID_ARG));
482 if (filterProperty == EVENT_FI_PR_LAST_REVISED_TIME || filterProperty == TODO_FI_PR_LAST_REVISED_TIME)
484 int ret = calendar_filter_add_lli(__filterHandle, id, match, _CalendarbookUtil::ConvertDateTimeToEpochTime(value));
485 SysTryReturn(NID_SCL, ret == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
487 else if (filterProperty == TODO_FI_PR_START_DATE)
489 calendar_time_s convertedTime;
491 if (comparisonOperator == FI_CMP_OP_IS_NULL)
493 convertedTime.type = CALENDAR_TIME_UTIME;
494 convertedTime.time.utime = _CALENDAR_TODO_NO_START_DATE;
495 match = CALENDAR_MATCH_EQUAL;
499 _CalendarbookUtil::ConvertDateTimeToCalTime(value, convertedTime);
502 int ret = calendar_filter_add_caltime(__filterHandle, id, match, convertedTime);
503 SysTryReturn(NID_SCL, ret == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
505 else if (filterProperty == TODO_FI_PR_DUE_DATE)
507 calendar_time_s convertedTime;
509 if (comparisonOperator == FI_CMP_OP_IS_NULL)
511 convertedTime.type = CALENDAR_TIME_UTIME;
512 convertedTime.time.utime = _CALENDAR_TODO_NO_DUE_DATE;
513 match = CALENDAR_MATCH_EQUAL;
517 _CalendarbookUtil::ConvertDateTimeToCalTime(value, convertedTime);
520 int ret = calendar_filter_add_caltime(__filterHandle, id, match, convertedTime);
521 SysTryReturn(NID_SCL, ret == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
523 else if ((filterProperty == EVENT_INST_FI_PR_START_TIME || filterProperty == EVENT_INST_FI_PR_END_TIME) && __filterType == CB_FI_TYPE_NON_ALL_DAY_EVENT_INSTANCE)
525 calendar_time_s convertedTime;
526 _CalendarbookUtil::ConvertDateTimeToCalTime(value, convertedTime);
528 int ret = calendar_filter_add_caltime(__filterHandle, id, match, convertedTime);
529 SysTryReturn(NID_SCL, ret == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
531 else if ((filterProperty == EVENT_INST_FI_PR_START_TIME || filterProperty == EVENT_INST_FI_PR_END_TIME) && (__filterType == CB_FI_TYPE_ALL_DAY_EVENT_INSTANCE))
533 calendar_time_s convertedTime;
534 _CalendarbookUtil::ConvertDateToCalTime(value, convertedTime);
536 int ret = calendar_filter_add_caltime(__filterHandle, id, match, convertedTime);
537 SysTryReturn(NID_SCL, ret == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
541 SysLogException(NID_SCL, E_INVALID_ARG, "[%s] Invalid argument is used. The type of the specified filter property %d must be DateTime.", GetErrorMessage(E_INVALID_ARG), filterProperty);
542 return E_INVALID_ARG;
551 _CalendarbookFilterImpl::AppendString(FilterConjunctiveOperator conjunctiveOperator, unsigned long filterProperty, FilterStringOperator comparisonOperator, const String& value)
553 SysTryReturn(NID_SCL, IsValidProperty(__filterType, filterProperty), E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. filterProperty = %ld", GetErrorMessage(E_INVALID_ARG), filterProperty);
554 SysTryReturn(NID_SCL, GetPropertyType(__filterType, filterProperty) == DATA_TYPE_STRING, E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. The type of the specified filter property %d must be String.", GetErrorMessage(E_INVALID_ARG), filterProperty);
555 SysTryReturn(NID_SCL, !(__isEmpty && (conjunctiveOperator == FI_CONJ_OP_AND || conjunctiveOperator == FI_CONJ_OP_OR)),\
556 E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. conjunctiveOperator %d must be FI_CONJ_OP_NONE if there is no filtering expression or filter that has been appended before",\
557 GetErrorMessage(E_INVALID_ARG), conjunctiveOperator);
558 SysTryReturn(NID_SCL, !(!__isEmpty && conjunctiveOperator == FI_CONJ_OP_NONE),\
559 E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. conjunctiveOperator %d must be either of FI_CONJ_OP_AND or FI_CONJ_OP_OR, if there is a filtering expression or filter that has been appended before.",\
560 GetErrorMessage(E_INVALID_ARG), conjunctiveOperator);
562 unsigned int viewPropertyId = _CalendarbookFilterImpl::GetViewPropertyId(__filterType, filterProperty);
564 calendar_match_str_flag_e match = GetMatchStrFlag(comparisonOperator);
565 std::unique_ptr<char[]> pCharArray( _StringConverter::CopyToCharArrayN(value));
566 SysTryReturnResult(NID_SCL, pCharArray != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
570 calendar_filter_operator_e filterOperator = conjunctiveOperator == FI_CONJ_OP_AND ? CALENDAR_FILTER_OPERATOR_AND : CALENDAR_FILTER_OPERATOR_OR;
572 int ret = calendar_filter_add_operator(__filterHandle, filterOperator);
573 SysTryReturn(NID_SCL, ret == CALENDAR_ERROR_NONE, E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used.", GetErrorMessage(E_INVALID_ARG));
576 int ret = calendar_filter_add_str(__filterHandle, viewPropertyId, match, pCharArray.get());
577 SysTryReturn(NID_SCL, ret == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
585 _CalendarbookFilterImpl::AppendFilter(FilterConjunctiveOperator conjunctiveOperator, const _CalendarbookFilterImpl& filter)
587 SysTryReturn(NID_SCL, !filter.IsEmpty(), E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. The specified filter should not be empty.", GetErrorMessage(E_INVALID_ARG));
588 SysTryReturn(NID_SCL, __filterType == filter.__filterType, E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. The type of the filter must be same with the type of this filter.", GetErrorMessage(E_INVALID_ARG));
589 SysTryReturn(NID_SCL, !(__isEmpty && (conjunctiveOperator == FI_CONJ_OP_AND || conjunctiveOperator == FI_CONJ_OP_OR)),\
590 E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. conjunctiveOperator %d must be FI_CONJ_OP_NONE if there is no filtering expression or filter that has been appended before",\
591 GetErrorMessage(E_INVALID_ARG), conjunctiveOperator);
592 SysTryReturn(NID_SCL, !(!__isEmpty && conjunctiveOperator == FI_CONJ_OP_NONE),\
593 E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used. conjunctiveOperator %d must be either of FI_CONJ_OP_AND or FI_CONJ_OP_OR, if there is a filtering expression or filter that has been appended before.",\
594 GetErrorMessage(E_INVALID_ARG), conjunctiveOperator);
598 calendar_filter_operator_e filterOperator = conjunctiveOperator == FI_CONJ_OP_AND ? CALENDAR_FILTER_OPERATOR_AND : CALENDAR_FILTER_OPERATOR_OR;
600 int ret = calendar_filter_add_operator(__filterHandle, filterOperator);
601 SysTryReturn(NID_SCL, ret == CALENDAR_ERROR_NONE, E_INVALID_ARG, E_INVALID_ARG, "[%s] Invalid argument is used.", GetErrorMessage(E_INVALID_ARG));
604 int ret = calendar_filter_add_filter(__filterHandle, filter.__filterHandle);
605 SysTryReturn(NID_SCL, ret == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
613 _CalendarbookFilterImpl::GetFilterHandle(void) const
617 return __filterHandle;
623 CalendarbookFilterType
624 _CalendarbookFilterImpl::GetType(void) const
630 _CalendarbookFilterImpl::IsEmpty(void) const
635 const _CalendarbookFilterImpl*
636 _CalendarbookFilterImpl::GetInstance(const CalendarbookFilter& filter)
638 return filter.__pCalendarbookFilterImpl;
641 _CalendarbookFilterImpl*
642 _CalendarbookFilterImpl::GetInstance(CalendarbookFilter& filter)
644 return filter.__pCalendarbookFilterImpl;