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_CalEventImpl.cpp
18 * @brief This is the implementation for _CalEventImpl class.
20 * This file contains definitions of @e _CalEventImpl class.
25 #include <FApp_AppInfo.h>
26 #include <FBaseColArrayList.h>
27 #include <FBaseSysLog.h>
28 #include <FBase_StringConverter.h>
29 #include <FLclCalendar.h>
30 #include <FLclGregorianCalendar.h>
31 #include <FLclTimeZone.h>
32 #include <FSclAttendee.h>
33 #include <FSclCalEvent.h>
34 #include <FSclRecord.h>
35 #include <FSysSystemTime.h>
36 #include "FScl_RecordImpl.h"
37 #include "FScl_CalEventImpl.h"
38 #include "FScl_RecurrenceImpl.h"
39 #include "FScl_CalendarbookImpl.h"
40 #include "FScl_CalendarbookDbConnector.h"
42 using namespace Tizen::App;
43 using namespace Tizen::Base;
44 using namespace Tizen::Base::Collection;
45 using namespace Tizen::Base::Utility;
46 using namespace Tizen::Locales;
47 using namespace Tizen::System;
49 namespace Tizen { namespace Social
52 static const int _DEFAULT_ADDED_HOUR = 1;
53 static const int _INVALID_ATTENDEE_INDEX = -1;
55 static const int _TERM_LIMIT_DAILY = 1;
56 static const int _TERM_LIMIT_WEEKLY = 7;
57 static const int _TERM_LIMIT_MONTHLY = 31;
58 static const int _TERM_LIMIT_YEARLY = 366;
59 static const int _NUMBER_OF_DAYS_OF_WEEK = 7;
61 static const wchar_t* _EVENT_CATEGORY_APPOINTMENT_STRING = L"Appointment";
62 static const wchar_t* _EVENT_CATEGORY_ANNIVERSARY_STRING = L"Anniversary";
64 static const wchar_t* _RECURRENCE_KEYWORD_SUNDAY = L"SU";
65 static const wchar_t* _RECURRENCE_KEYWORD_MONDAY = L"MO";
66 static const wchar_t* _RECURRENCE_KEYWORD_TUESDAY = L"TU";
67 static const wchar_t* _RECURRENCE_KEYWORD_WEDNESDAY = L"WE";
68 static const wchar_t* _RECURRENCE_KEYWORD_THURSDAY = L"TH";
69 static const wchar_t* _RECURRENCE_KEYWORD_FRIDAY = L"FR";
70 static const wchar_t* _RECURRENCE_KEYWORD_SATURDAY = L"SA";
72 static const wchar_t* _RECURRENCE_DELIMITER = L",";
73 static const int _RECURRENCE_DELIMITER_LENGTH = 1;
74 static const wchar_t _RECURRENCE_BY_DAY_CHAR_PLUS = L'+';
75 static const wchar_t _RECURRENCE_BY_DAY_CHAR_MINUS = L'-';
76 static const wchar_t _RECURRENCE_BY_DAY_CHAR_ONE = L'1';
77 static const int _RECURRENCE_BY_DAY_FIRST_INDEX = 0;
78 static const int _RECURRENCE_BY_DAY_SECOND_INDEX = 1;
79 static const int _MAX_WEEK_OF_MONTH = 5;
81 static const double _MIN_LATITUDE = -90.0;
82 static const double _MAX_LATITUDE = 90.0;
83 static const double _MIN_LONGITUDE = -180.0;
84 static const double _MAX_LONGITUDE = 180.0;
86 _CalEventImpl::_CalEventImpl(void)
87 : __originalEventId(INVALID_RECORD_ID)
89 , __reminderListUpdated(false)
91 // Set default start and end time
93 SystemTime::GetCurrentTime(startTime);
94 if (IsFailed(GetLastResult()))
96 startTime = _CalendarbookImpl::GetMinDateTime();
100 DateTime endTime(startTime);
101 result r = endTime.AddHours(_DEFAULT_ADDED_HOUR);
102 SysTryReturnVoidResult(NID_SCL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
104 calendar_time_s startCalendarTime;
105 calendar_time_s endCalendarTime;
106 startCalendarTime.type = CALENDAR_TIME_UTIME;
107 endCalendarTime.type = CALENDAR_TIME_UTIME;
108 startCalendarTime.time.utime = _CalendarbookUtil::ConvertDateTimeToEpochTime(startTime);
109 endCalendarTime.time.utime = _CalendarbookUtil::ConvertDateTimeToEpochTime(endTime);
111 r = _CalendarbookDbConnector::Connect();
112 SysTryReturnVoidResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "[%s] A system error has been occurred.", GetErrorMessage(E_SYSTEM));
114 calendar_record_h eventHandle = null;
115 int errorCode = calendar_record_create(_calendar_event._uri, &eventHandle);
116 SysTryReturnVoidResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
118 __eventRecord.ResetHandle(eventHandle);
120 calendar_record_set_caltime(eventHandle, _calendar_event.start_time, startCalendarTime);
121 calendar_record_set_caltime(eventHandle, _calendar_event.end_time, endCalendarTime);
124 calendar_record_set_int(eventHandle, _calendar_event.event_status, CALENDAR_EVENT_STATUS_NONE);
125 calendar_record_set_int(eventHandle, _calendar_event.busy_status, CALENDAR_EVENT_BUSY_STATUS_FREE);
126 calendar_record_set_int(eventHandle, _calendar_event.priority, CALENDAR_EVENT_PRIORITY_NORMAL);
127 calendar_record_set_int(eventHandle, _calendar_event.sensitivity, CALENDAR_SENSITIVITY_PUBLIC);
128 calendar_record_set_int(eventHandle, _calendar_event.calendar_book_id, INVALID_RECORD_ID);
130 r = __reminderList.Construct();
131 SysTryReturnVoidResult(NID_SCL, r == E_SUCCESS, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
134 _CalEventImpl::_CalEventImpl(const _CalEventImpl& rhs)
135 : __originalEventId(rhs.__originalEventId)
136 , __isInstance(rhs.__isInstance)
137 , __reminderListUpdated(false)
139 result r = _CalendarbookDbConnector::Connect();
140 SysTryReturnVoidResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "[%s] A system error has been occurred.", GetErrorMessage(E_SYSTEM));
142 calendar_record_h eventHandle = null;
143 int errorCode = calendar_record_clone(rhs.__eventRecord.GetHandle(), &eventHandle);
144 SysTryReturnVoidResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
146 __eventRecord.ResetHandle(eventHandle);
148 r = __reminderList.Construct();
149 SysTryReturnVoidResult(NID_SCL, r == E_SUCCESS, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
152 _CalEventImpl::~_CalEventImpl(void)
154 calendar_record_destroy(__eventRecord.ReleaseHandle(), true);
156 __reminderList.RemoveAll(true);
158 result r = _CalendarbookDbConnector::Disconnect();
159 SysTryReturnVoidResult(NID_SCL, r == E_SUCCESS, E_SYSTEM, "[%s] A system error has been occurred.", GetErrorMessage(E_SYSTEM));
163 _CalEventImpl::operator =(const _CalEventImpl& rhs)
170 __originalEventId = rhs.__originalEventId;
171 __isInstance = rhs.__isInstance;
172 __reminderList.RemoveAll(true);
173 __reminderListUpdated = false;
175 int errorCode = CALENDAR_ERROR_NONE;
176 calendar_record_h eventHandle = null;
178 errorCode = calendar_record_clone(rhs.__eventRecord.GetHandle(), &eventHandle);
179 SysTryReturn(NID_SCL, errorCode == CALENDAR_ERROR_NONE, *this, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
181 __eventRecord.ResetHandle(eventHandle);
187 _CalEventImpl::IsInstance(void) const
193 _CalEventImpl::IsRecurring(void) const
195 int recurrenceFreq = CALENDAR_RECURRENCE_NONE;
197 calendar_record_get_int(__eventRecord.GetHandle(), _calendar_event.freq, &recurrenceFreq);
199 if (recurrenceFreq == CALENDAR_RECURRENCE_NONE)
208 _CalEventImpl::GetOriginalCalEventId(void) const
210 return __originalEventId;
214 _CalEventImpl::IsAllDayEvent(void) const
216 calendar_time_s startCalendarTime;
218 calendar_record_get_caltime(__eventRecord.GetHandle(), _calendar_event.start_time, &startCalendarTime);
219 if (startCalendarTime.type == CALENDAR_TIME_UTIME)
228 _CalEventImpl::SetAllDayEvent(bool isAllDayEvent)
230 if (GetCategory() == EVENT_CATEGORY_ANNIVERSARY)
235 calendar_time_s startCalendarTime;
236 calendar_time_s tmpStartCalendarTime;
237 calendar_time_s endCalendarTime;
238 calendar_time_s tmpEndCalendarTime;
240 bool isChanged = false;
242 calendar_record_get_caltime(__eventRecord.GetHandle(), _calendar_event.start_time, &startCalendarTime);
243 calendar_record_get_caltime(__eventRecord.GetHandle(), _calendar_event.end_time, &endCalendarTime);
245 if (isAllDayEvent && startCalendarTime.type == CALENDAR_TIME_UTIME)
247 tmpStartCalendarTime.type = CALENDAR_TIME_LOCALTIME;
248 DateTime tmpStartTime = _CalendarbookUtil::ConvertEpochTimeToDateTime(startCalendarTime.time.utime);
249 tmpStartCalendarTime.time.date.year = tmpStartTime.GetYear();
250 tmpStartCalendarTime.time.date.month = tmpStartTime.GetMonth();
251 tmpStartCalendarTime.time.date.mday = tmpStartTime.GetDay();
253 tmpEndCalendarTime.type = CALENDAR_TIME_LOCALTIME;
254 DateTime tmpEndTime = _CalendarbookUtil::ConvertEpochTimeToDateTime(endCalendarTime.time.utime);
255 tmpEndCalendarTime.time.date.year = tmpEndTime.GetYear();
256 tmpEndCalendarTime.time.date.month = tmpEndTime.GetMonth();
257 tmpEndCalendarTime.time.date.mday = tmpEndTime.GetDay();
259 calendar_record_set_caltime(__eventRecord.GetHandle(), _calendar_event.start_time, tmpStartCalendarTime);
260 calendar_record_set_caltime(__eventRecord.GetHandle(), _calendar_event.end_time, tmpEndCalendarTime);
264 else if (!isAllDayEvent && startCalendarTime.type == CALENDAR_TIME_LOCALTIME)
266 tmpStartCalendarTime.type = CALENDAR_TIME_UTIME;
267 DateTime tmpStartTime;
268 tmpStartTime.SetValue(startCalendarTime.time.date.year, startCalendarTime.time.date.month, startCalendarTime.time.date.mday);
269 tmpStartCalendarTime.time.utime = _CalendarbookUtil::ConvertDateTimeToEpochTime(tmpStartTime);
271 tmpEndCalendarTime.type = CALENDAR_TIME_UTIME;
273 tmpEndTime.SetValue(endCalendarTime.time.date.year, endCalendarTime.time.date.month, endCalendarTime.time.date.mday);
274 tmpEndCalendarTime.time.utime = _CalendarbookUtil::ConvertDateTimeToEpochTime(tmpEndTime);
276 calendar_record_set_caltime(__eventRecord.GetHandle(), _calendar_event.start_time, tmpStartCalendarTime);
277 calendar_record_set_caltime(__eventRecord.GetHandle(), _calendar_event.end_time, tmpEndCalendarTime);
284 int rangeType = CALENDAR_RANGE_NONE;
285 calendar_record_get_int(__eventRecord.GetHandle(), _calendar_event.range_type, &rangeType);
287 if (rangeType == CALENDAR_RANGE_UNTIL)
289 calendar_time_s untilCalendarTime;
290 calendar_time_s tmpUntilCalendarTime;
292 calendar_record_get_caltime(__eventRecord.GetHandle(), _calendar_event.until_time, &untilCalendarTime);
293 if (isAllDayEvent && untilCalendarTime.type == CALENDAR_TIME_UTIME)
295 tmpUntilCalendarTime.type = CALENDAR_TIME_LOCALTIME;
296 DateTime tmpUntilTime = _CalendarbookUtil::ConvertEpochTimeToDateTime(untilCalendarTime.time.utime);
297 tmpUntilCalendarTime.time.date.year = tmpUntilTime.GetYear();
298 tmpUntilCalendarTime.time.date.month = tmpUntilTime.GetMonth();
299 tmpUntilCalendarTime.time.date.mday = tmpUntilTime.GetDay();
301 calendar_record_set_caltime(__eventRecord.GetHandle(), _calendar_event.until_time, tmpUntilCalendarTime);
303 else if (!isAllDayEvent && untilCalendarTime.type == CALENDAR_TIME_LOCALTIME)
305 tmpUntilCalendarTime.type = CALENDAR_TIME_UTIME;
306 DateTime tmpUntilTime;
307 tmpUntilTime.SetValue(untilCalendarTime.time.date.year, untilCalendarTime.time.date.month, untilCalendarTime.time.date.mday);
308 tmpUntilCalendarTime.time.utime = _CalendarbookUtil::ConvertDateTimeToEpochTime(tmpUntilTime);
310 calendar_record_set_caltime(__eventRecord.GetHandle(), _calendar_event.until_time, tmpUntilCalendarTime);
316 if (__pRecurrence == null)
318 __pRecurrence.reset(ConvertEventHandleToRecurrenceN(__eventRecord.GetHandle()));
321 std::unique_ptr<char[]> pExDates(_StringConverter::CopyToCharArrayN(ConvertRecurrenceToRRuleExDateString(*__pRecurrence.get(), isAllDayEvent)));
322 int errorCode = calendar_record_set_str(__eventRecord.GetHandle(), _calendar_event.exdate, pExDates.get());
323 SysTryReturnVoidResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
329 _CalEventImpl::GetUIDN(void) const
333 char* pStrUid = null;
334 calendar_record_get_str_p(__eventRecord.GetHandle(), _calendar_event.uid, &pStrUid);
336 if (pStrUid == null || strlen(pStrUid) == 0)
341 ByteBuffer* pConvertedUidBuffer = _CalendarbookUtil::ConvertCharArrayToByteBufferN(pStrUid);
342 SysTryReturn(NID_SCL, pConvertedUidBuffer != null, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
344 return pConvertedUidBuffer;
348 _CalEventImpl::SetUID(const ByteBuffer* pUid)
350 int errorCode = CALENDAR_ERROR_NONE;
354 std::unique_ptr<char[]> pConvertedUidArray(_CalendarbookUtil::ConvertByteBufferToCharArrayN(*pUid));
355 SysTryReturn(NID_SCL, pConvertedUidArray != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
357 errorCode = calendar_record_set_str(__eventRecord.GetHandle(), _calendar_event.uid, pConvertedUidArray.get());
358 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
362 errorCode = calendar_record_set_str(__eventRecord.GetHandle(), _calendar_event.uid, null);
363 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
370 _CalEventImpl::GetUid(void) const
372 char* pStrUid = null;
373 calendar_record_get_str_p(__eventRecord.GetHandle(), _calendar_event.uid, &pStrUid);
375 return String(pStrUid);
379 _CalEventImpl::SetUid(const String& uid)
381 std::unique_ptr<char[]> pStrUid(_StringConverter::CopyToCharArrayN(uid));
382 SysTryReturnVoidResult(NID_SCL, pStrUid != null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
384 int errorCode = calendar_record_set_str(__eventRecord.GetHandle(), _calendar_event.uid, pStrUid.get());
385 SysTryReturnVoidResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
389 _CalEventImpl::GetStatus(void) const
391 int srcEventStatus = CALENDAR_EVENT_STATUS_NONE;
393 EventStatus eventStatus = EVENT_STATUS_NONE;
395 calendar_record_get_int(__eventRecord.GetHandle(), _calendar_event.event_status, &srcEventStatus);
397 switch (srcEventStatus)
399 case CALENDAR_EVENT_STATUS_NONE:
400 eventStatus = EVENT_STATUS_NONE;
402 case CALENDAR_EVENT_STATUS_TENTATIVE:
403 eventStatus = EVENT_STATUS_TENTATIVE;
405 case CALENDAR_EVENT_STATUS_CONFIRMED:
406 eventStatus = EVENT_STATUS_CONFIRMED;
408 case CALENDAR_EVENT_STATUS_CANCELLED:
409 eventStatus = EVENT_STATUS_CANCELLED;
412 SysLog(NID_SCL, "The status value is invalid.");
413 return EVENT_STATUS_NONE;
420 _CalEventImpl::SetStatus(EventStatus status)
422 calendar_record_set_int(__eventRecord.GetHandle(), _calendar_event.event_status, _CalendarbookUtil::ConvertEventStatusToCSEventStatus(status));
426 _CalEventImpl::GetBusyStatus(void) const
428 int srcEventBusyStatus = CALENDAR_EVENT_BUSY_STATUS_FREE;
430 BusyStatus busyStatus = BUSY_STATUS_FREE;
432 calendar_record_get_int(__eventRecord.GetHandle(), _calendar_event.busy_status, &srcEventBusyStatus);
434 switch (srcEventBusyStatus)
436 case CALENDAR_EVENT_BUSY_STATUS_FREE:
437 busyStatus = BUSY_STATUS_FREE;
439 case CALENDAR_EVENT_BUSY_STATUS_BUSY:
440 busyStatus = BUSY_STATUS_BUSY;
442 case CALENDAR_EVENT_BUSY_STATUS_UNAVAILABLE:
443 busyStatus = BUSY_STATUS_UNAVAILABLE;
445 case CALENDAR_EVENT_BUSY_STATUS_TENTATIVE:
446 busyStatus = BUSY_STATUS_TENTATIVE;
449 SysLog(NID_SCL, "The busy status value is invalid.");
450 busyStatus = BUSY_STATUS_FREE;
458 _CalEventImpl::SetBusyStatus(BusyStatus busyStatus)
460 calendar_record_set_int(__eventRecord.GetHandle(), _calendar_event.busy_status, _CalendarbookUtil::ConvertBusyStatusToCSEventBusyStatus(busyStatus));
464 _CalEventImpl::GetPriority(void) const
466 int srcPriority = CALENDAR_EVENT_PRIORITY_LOW;
468 EventPriority priority = EVENT_PRIORITY_NORMAL;
470 calendar_record_get_int(__eventRecord.GetHandle(), _calendar_event.priority, &srcPriority);
474 case CALENDAR_EVENT_PRIORITY_LOW:
475 priority = EVENT_PRIORITY_LOW;
477 case CALENDAR_EVENT_PRIORITY_NONE:
479 case CALENDAR_EVENT_PRIORITY_NORMAL:
480 priority = EVENT_PRIORITY_NORMAL;
482 case CALENDAR_EVENT_PRIORITY_HIGH:
483 priority = EVENT_PRIORITY_HIGH;
486 SysLog(NID_SCL, "The priority value is invalid.");
487 priority = EVENT_PRIORITY_NORMAL;
494 _CalEventImpl::SetPriority(EventPriority priority)
496 calendar_record_set_int(__eventRecord.GetHandle(), _calendar_event.priority, _CalendarbookUtil::ConvertEventPriorityToCSEventPriority(priority));
500 _CalEventImpl::AddAttendee(const Attendee& attendee)
502 if (_AppInfo::GetApiVersion() == _API_VERSION_2_0)
504 SysTryReturnResult(NID_SCL, !attendee.GetEmail().IsEmpty(), E_OBJ_ALREADY_EXIST
505 , "The attendee's email string is empty.");
509 SysTryReturnResult(NID_SCL, !attendee.GetEmail().IsEmpty(), E_INVALID_ARG
510 , "The attendee's email string is empty.");
513 std::unique_ptr<char[]> pConvertedEmail(_StringConverter::CopyToCharArrayN(attendee.GetEmail()));
514 SysTryReturnResult(NID_SCL, pConvertedEmail != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
516 SysTryReturnResult(NID_SCL, GetAttendeeIndex(pConvertedEmail.get()) == _INVALID_ATTENDEE_INDEX, E_OBJ_ALREADY_EXIST
517 , "The specified attendee already exists as this email is already registered.");
519 std::unique_ptr<char[]> pConvertedName(_StringConverter::CopyToCharArrayN(attendee.GetName()));
520 SysTryReturnResult(NID_SCL, pConvertedName != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
522 std::unique_ptr<char[]> pConvertedPhoneNumber(_StringConverter::CopyToCharArrayN(attendee.GetPhoneNumber()));
523 SysTryReturnResult(NID_SCL, pConvertedPhoneNumber != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
525 calendar_attendee_status_e convertedStatus = CALENDAR_ATTENDEE_STATUS_TENTATIVE;
526 switch (attendee.GetStatus())
528 case ATTENDEE_STATUS_NONE:
529 convertedStatus = CALENDAR_ATTENDEE_STATUS_COMPLETED;
531 case ATTENDEE_STATUS_NOT_RESPONDED:
532 convertedStatus = CALENDAR_ATTENDEE_STATUS_PENDING;
534 case ATTENDEE_STATUS_ACCEPTED:
535 convertedStatus = CALENDAR_ATTENDEE_STATUS_ACCEPTED;
537 case ATTENDEE_STATUS_DECLINED:
538 convertedStatus = CALENDAR_ATTENDEE_STATUS_DECLINED;
540 case ATTENDEE_STATUS_TENTATIVE:
541 convertedStatus = CALENDAR_ATTENDEE_STATUS_TENTATIVE;
544 SysLog(NID_SCL, "The attendee status value is invalid. attendee status = %d", attendee.GetStatus());
545 convertedStatus = CALENDAR_ATTENDEE_STATUS_TENTATIVE;
549 calendar_attendee_role_e convertedRole = CALENDAR_ATTENDEE_ROLE_NON_PARTICIPANT;
550 switch (attendee.GetRole())
552 case ATTENDEE_ROLE_ATTENDEE:
553 convertedRole = CALENDAR_ATTENDEE_ROLE_OPT_PARTICIPANT;
555 case ATTENDEE_ROLE_REQUIRED_ATTENDEE:
556 convertedRole = CALENDAR_ATTENDEE_ROLE_REQ_PARTICIPANT;
558 case ATTENDEE_ROLE_ORGANIZER:
559 convertedRole = CALENDAR_ATTENDEE_ROLE_CHAIR;
562 SysLog(NID_SCL, "The attendee role value is invalid. attendee role = %d", attendee.GetRole());
563 convertedRole = CALENDAR_ATTENDEE_ROLE_OPT_PARTICIPANT;
567 calendar_record_h attendeeHandle = null;
568 int errorCode = calendar_record_create(_calendar_attendee._uri, &attendeeHandle);
569 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
571 errorCode = calendar_record_set_str(attendeeHandle, _calendar_attendee.name, pConvertedName.get());
572 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
573 errorCode = calendar_record_set_str(attendeeHandle, _calendar_attendee.email, pConvertedEmail.get());
574 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
575 errorCode = calendar_record_set_str(attendeeHandle, _calendar_attendee.number, pConvertedPhoneNumber.get());
576 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
577 calendar_record_set_int(attendeeHandle, _calendar_attendee.status, convertedStatus);
578 calendar_record_set_int(attendeeHandle, _calendar_attendee.role, convertedRole);
579 calendar_record_set_int(attendeeHandle, _calendar_attendee.person_id, attendee.GetPersonId());
581 errorCode = calendar_record_add_child_record(__eventRecord.GetHandle(), _calendar_event.calendar_attendee, attendeeHandle);
582 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
588 _CalEventImpl::RemoveAttendee(const Attendee& attendee)
590 std::unique_ptr<char[]> pConvertedEmail(_StringConverter::CopyToCharArrayN(attendee.GetEmail()));
591 SysTryReturnResult(NID_SCL, pConvertedEmail != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
593 int index = GetAttendeeIndex(pConvertedEmail.get());
594 SysTryReturnResult(NID_SCL, index != _INVALID_ATTENDEE_INDEX, E_OBJ_NOT_FOUND, "The specified attendee does not exist.");
596 calendar_record_h tmpAttendeeHandle = null;
597 calendar_record_get_child_record_at_p(__eventRecord.GetHandle(), _calendar_event.calendar_attendee, index, &tmpAttendeeHandle);
598 calendar_record_remove_child_record(__eventRecord.GetHandle(), _calendar_event.calendar_attendee, tmpAttendeeHandle);
604 _CalEventImpl::GetAllAttendeesN(void) const
608 std::unique_ptr<ArrayList, AllElementsDeleter> pList(new (std::nothrow) ArrayList());
609 SysTryReturn(NID_SCL, pList != null, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
610 result r = pList->Construct();
611 SysTryReturn(NID_SCL, !IsFailed(r), null, r, "[%s] Propagating.", GetErrorMessage(r));
613 unsigned int attendeeCount = 0;
614 calendar_record_get_child_record_count(__eventRecord.GetHandle(), _calendar_event.calendar_attendee, &attendeeCount);
616 for (unsigned int i = 0; i < attendeeCount; i++)
618 calendar_record_h tmpAttendeeHandle = null;
619 char* pTmpEmail = null;
620 char* pTmpName = null;
621 char* pTmpPhoneNumber = null;
624 int tmpPersonId = -1;
625 AttendeeStatus attendeeStatus = ATTENDEE_STATUS_NONE;
626 AttendeeRole attendeeRole = ATTENDEE_ROLE_ATTENDEE;
628 calendar_record_get_child_record_at_p(__eventRecord.GetHandle(), _calendar_event.calendar_attendee, i, &tmpAttendeeHandle);
629 calendar_record_get_str_p(tmpAttendeeHandle, _calendar_attendee.email, &pTmpEmail);
630 calendar_record_get_str_p(tmpAttendeeHandle, _calendar_attendee.name, &pTmpName);
631 calendar_record_get_str_p(tmpAttendeeHandle, _calendar_attendee.number, &pTmpPhoneNumber);
632 calendar_record_get_int(tmpAttendeeHandle, _calendar_attendee.status, &tmpStatus);
633 calendar_record_get_int(tmpAttendeeHandle, _calendar_attendee.role, &tmpRole);
634 calendar_record_get_int(tmpAttendeeHandle, _calendar_attendee.person_id, &tmpPersonId);
638 case CALENDAR_ATTENDEE_STATUS_PENDING:
639 attendeeStatus = ATTENDEE_STATUS_NOT_RESPONDED;
641 case CALENDAR_ATTENDEE_STATUS_ACCEPTED:
642 attendeeStatus = ATTENDEE_STATUS_ACCEPTED;
644 case CALENDAR_ATTENDEE_STATUS_DECLINED:
645 attendeeStatus = ATTENDEE_STATUS_DECLINED;
647 case CALENDAR_ATTENDEE_STATUS_TENTATIVE:
648 attendeeStatus = ATTENDEE_STATUS_TENTATIVE;
650 case CALENDAR_ATTENDEE_STATUS_DELEGATED:
651 attendeeStatus = ATTENDEE_STATUS_NONE;
653 case CALENDAR_ATTENDEE_STATUS_COMPLETED:
654 attendeeStatus = ATTENDEE_STATUS_NONE;
656 case CALENDAR_ATTENDEE_STATUS_IN_PROCESS:
657 attendeeStatus = ATTENDEE_STATUS_NOT_RESPONDED;
660 SysLog(NID_SCL, "The attendee status value is invalid. attendee status = %d", tmpStatus);
661 attendeeStatus = ATTENDEE_STATUS_NONE;
667 case CALENDAR_ATTENDEE_ROLE_REQ_PARTICIPANT:
668 attendeeRole = ATTENDEE_ROLE_REQUIRED_ATTENDEE;
670 case CALENDAR_ATTENDEE_ROLE_OPT_PARTICIPANT:
671 attendeeRole = ATTENDEE_ROLE_ATTENDEE;
673 case CALENDAR_ATTENDEE_ROLE_NON_PARTICIPANT:
674 attendeeRole = ATTENDEE_ROLE_ATTENDEE;
676 case CALENDAR_ATTENDEE_ROLE_CHAIR:
677 attendeeRole = ATTENDEE_ROLE_ORGANIZER;
680 SysLog(NID_SCL, "The attendee role value is invalid. attendee role = %d", tmpRole);
681 attendeeRole = ATTENDEE_ROLE_ATTENDEE;
685 std::unique_ptr<Attendee> pTmpAttendee(new (std::nothrow) Attendee(pTmpEmail));
686 SysTryReturn(NID_SCL, pTmpAttendee != null, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
688 if (pTmpName != null && strlen(pTmpName) > 0)
690 pTmpAttendee->SetName(pTmpName);
693 if (pTmpPhoneNumber != null && strlen(pTmpPhoneNumber) > 0)
695 pTmpAttendee->SetPhoneNumber(pTmpPhoneNumber);
698 pTmpAttendee->SetStatus(attendeeStatus);
699 pTmpAttendee->SetRole(attendeeRole);
700 pTmpAttendee->SetPersonId(tmpPersonId);
702 r = pList->Add(pTmpAttendee.get());
703 SysTryReturn(NID_SCL, !IsFailed(r), null, r, "[%s] Propagating.", GetErrorMessage(r));
705 pTmpAttendee.release();
708 return pList.release();
712 _CalEventImpl::GetTimeZone(void) const
714 char* pTimeZoneId = null;
717 calendar_record_get_str_p(__eventRecord.GetHandle(), _calendar_event.start_tzid, &pTimeZoneId);
718 if (pTimeZoneId != null && strlen(pTimeZoneId) > 0)
720 DateTime startTime = GetStartTime();
722 TimeZone::GetTimeZone(pTimeZoneId, startTime, timeZone);
729 _CalEventImpl::SetTimeZone(const TimeZone& timeZone)
731 std::unique_ptr<char[]> pConvertedTimeZoneId(_StringConverter::CopyToCharArrayN(timeZone.GetId()));
732 SysTryReturnResult(NID_SCL, pConvertedTimeZoneId != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
734 int errorCode = calendar_record_set_str(__eventRecord.GetHandle(), _calendar_event.start_tzid, pConvertedTimeZoneId.get());
735 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
736 errorCode = calendar_record_set_str(__eventRecord.GetHandle(), _calendar_event.end_tzid, pConvertedTimeZoneId.get());
737 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
743 _CalEventImpl::GetRecurrenceId(void) const
746 SysTryReturn(NID_SCL, __isInstance, DateTime(), E_INVALID_STATE,
747 "[%s] The instance does not have a recurrence or is not a CalEvent instance which doesn't have a RecurrenceId.", GetErrorMessage(E_INVALID_STATE));
749 return GetStartTime();
753 _CalEventImpl::GetSubject(void) const
755 char* pSubject = null;
757 calendar_record_get_str_p(__eventRecord.GetHandle(), _calendar_event.summary, &pSubject);
759 return String(pSubject);
763 _CalEventImpl::GetDescription(void) const
765 char* pDescription = null;
767 calendar_record_get_str_p(__eventRecord.GetHandle(), _calendar_event.description, &pDescription);
769 return String(pDescription);
772 _CalEventImpl::GetStartTime(void) const
774 calendar_time_s startCalendarTime;
775 DateTime tmpStartTime;
777 calendar_record_get_caltime(__eventRecord.GetHandle(), _calendar_event.start_time, &startCalendarTime);
779 if (startCalendarTime.type == CALENDAR_TIME_UTIME)
781 tmpStartTime = _CalendarbookUtil::ConvertEpochTimeToDateTime(startCalendarTime.time.utime);
785 tmpStartTime.SetValue(startCalendarTime.time.date.year, startCalendarTime.time.date.month, startCalendarTime.time.date.mday);
792 _CalEventImpl::GetEndTime(void) const
794 calendar_time_s endCalendarTime;
797 calendar_record_get_caltime(__eventRecord.GetHandle(), _calendar_event.end_time, &endCalendarTime);
799 if (endCalendarTime.type == CALENDAR_TIME_UTIME)
801 tmpEndTime = _CalendarbookUtil::ConvertEpochTimeToDateTime(endCalendarTime.time.utime);
803 else if (endCalendarTime.type == CALENDAR_TIME_LOCALTIME)
805 tmpEndTime.SetValue(endCalendarTime.time.date.year, endCalendarTime.time.date.month, endCalendarTime.time.date.mday);
812 _CalEventImpl::GetLocation(void) const
814 char* pLocation = null;
816 calendar_record_get_str_p(__eventRecord.GetHandle(), _calendar_event.location, &pLocation);
818 return String(pLocation);
822 _CalEventImpl::GetCategory(void) const
824 char* pCategories = null;
826 calendar_record_get_str_p(__eventRecord.GetHandle(), _calendar_event.categories, &pCategories);
828 return _CalendarbookUtil::ConvertCSCategoriesToEventCategory(pCategories);
832 _CalEventImpl::GetSensitivity(void) const
834 int srcSensitivity = CALENDAR_SENSITIVITY_PUBLIC;
835 RecordSensitivity sensitivity = SENSITIVITY_PUBLIC;
837 calendar_record_get_int(__eventRecord.GetHandle(), _calendar_event.sensitivity, &srcSensitivity);
839 switch (srcSensitivity)
841 case CALENDAR_SENSITIVITY_PUBLIC:
842 sensitivity = SENSITIVITY_PUBLIC;
844 case CALENDAR_SENSITIVITY_PRIVATE:
845 sensitivity = SENSITIVITY_PRIVATE;
847 case CALENDAR_SENSITIVITY_CONFIDENTIAL:
848 sensitivity = SENSITIVITY_CONFIDENTIAL;
851 SysLogException(NID_SCL, E_INVALID_ARG, "[%s] Invalid argument is used. sensitivity = %d", GetErrorMessage(E_INVALID_ARG), srcSensitivity);
852 sensitivity = SENSITIVITY_PUBLIC;
859 _CalEventImpl::GetReminder(void) const
861 if (__reminderListUpdated == false)
863 result r = _CalendarbookUtil::ConvertEventAlarmsToReminderList(__eventRecord.GetHandle(), __reminderList);
864 SysTryReturn(NID_SCL, r == E_SUCCESS, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
866 __reminderListUpdated = true;
869 if (__reminderList.GetCount() > 0)
871 return static_cast<const Reminder*>(__reminderList.GetAt(0));
878 _CalEventImpl::GetRecurrence(void) const
880 if (__pRecurrence == null)
882 __pRecurrence.reset(ConvertEventHandleToRecurrenceN(__eventRecord.GetHandle()));
885 return __pRecurrence.get();
889 _CalEventImpl::ConvertEventHandleToRecurrenceN(calendar_record_h eventHandle) const
891 int srcFrequency = CALENDAR_RECURRENCE_NONE;
892 calendar_time_s untilCalendarTime;
893 int rangeType = CALENDAR_RANGE_NONE;
897 char* pByMonthDay = null;
898 char* pByMonth = null;
900 char* pExDates = null;
902 result r = E_SUCCESS;
907 CalDayOfWeek convertedWeekStart = CAL_SUNDAY;
909 std::unique_ptr<Recurrence> pRecurrence(new (std::nothrow) Recurrence());
911 calendar_record_get_int(eventHandle, _calendar_event.freq, &srcFrequency);
913 if (srcFrequency == CALENDAR_RECURRENCE_NONE)
918 calendar_record_get_int(eventHandle, _calendar_event.range_type, &rangeType);
919 calendar_record_get_int(eventHandle, _calendar_event.count, &count);
920 calendar_record_get_int(eventHandle, _calendar_event.interval, &interval);
921 calendar_record_get_caltime(eventHandle, _calendar_event.until_time, &untilCalendarTime);
922 calendar_record_get_int(eventHandle, _calendar_event.wkst, &weekStart);
924 calendar_record_get_str_p(eventHandle, _calendar_event.byday, &pByDay);
925 calendar_record_get_str_p(eventHandle, _calendar_event.bymonthday, &pByMonthDay);
926 if (pByMonthDay != null)
928 r = Integer::Parse(pByMonthDay, dayOfMonth);
929 SysTryReturn(NID_SCL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
931 calendar_record_get_str_p(eventHandle, _calendar_event.bymonth, &pByMonth);
932 if (pByMonth != null)
934 r = Integer::Parse(pByMonth, monthOfYear);
935 SysTryReturn(NID_SCL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
938 switch (srcFrequency)
940 case CALENDAR_RECURRENCE_DAILY:
941 pRecurrence->SetFrequency(FREQ_DAILY);
944 case CALENDAR_RECURRENCE_WEEKLY:
945 pRecurrence->SetFrequency(FREQ_WEEKLY);
947 dayOfWeek = ConvertRRuleByDayStringToDayOfWeek(pByDay);
948 SysTryReturn(NID_SCL, GetLastResult() == E_SUCCESS, null, E_INVALID_ARG, "[%s] Invalid argument is used. byday = %s", GetErrorMessage(E_INVALID_ARG), pByDay);
950 pRecurrence->SetDayOfWeek(dayOfWeek);
953 case CALENDAR_RECURRENCE_MONTHLY:
954 pRecurrence->SetFrequency(FREQ_MONTHLY);
960 int maxDaysOfMonth = _CalendarbookUtil::GetMaxDaysOfMonth(untilCalendarTime.time.date.year, monthOfYear);
961 pRecurrence->SetDayOfMonth(maxDaysOfMonth + dayOfMonth);
965 pRecurrence->SetDayOfMonth(dayOfMonth);
972 r = ConvertRRuleByDayStringToDayOfWeekAndWeekOfMonth(pByDay, weekOfMonth, dayOfWeek);
973 SysTryReturn(NID_SCL, r == E_SUCCESS, null, E_INVALID_ARG, "[%s] Invalid argument is used. byday = %s", GetErrorMessage(E_INVALID_ARG), pByDay);
975 pRecurrence->SetWeekOfMonth(weekOfMonth);
976 pRecurrence->SetDayOfWeek(dayOfWeek);
980 DateTime startTime = GetStartTime();
982 dayOfMonth = startTime.GetDay();
983 pRecurrence->SetDayOfMonth(dayOfMonth);
989 case CALENDAR_RECURRENCE_YEARLY:
990 pRecurrence->SetFrequency(FREQ_YEARLY);
996 int maxDaysOfMonth = _CalendarbookUtil::GetMaxDaysOfMonth(untilCalendarTime.time.date.year, monthOfYear);
997 pRecurrence->SetDayOfMonth(maxDaysOfMonth + dayOfMonth);
1001 pRecurrence->SetDayOfMonth(dayOfMonth);
1008 r = ConvertRRuleByDayStringToDayOfWeekAndWeekOfMonth(pByDay, weekOfMonth, dayOfWeek);
1009 SysTryReturn(NID_SCL, r == E_SUCCESS, null, E_INVALID_ARG, "[%s] Invalid argument is used. byday = %s", GetErrorMessage(E_INVALID_ARG), pByDay);
1011 pRecurrence->SetWeekOfMonth(weekOfMonth);
1012 pRecurrence->SetDayOfWeek(dayOfWeek);
1016 DateTime startTime = GetStartTime();
1018 dayOfMonth = startTime.GetDay();
1019 monthOfYear = startTime.GetMonth();
1021 pRecurrence->SetDayOfMonth(dayOfMonth);
1024 pRecurrence->SetMonthOfYear(monthOfYear);
1029 SysLogException(NID_SCL, E_INVALID_ARG, "Invalid argument is passed. frequency = %d", srcFrequency);
1033 if (rangeType == CALENDAR_RANGE_NONE)
1035 pRecurrence->SetUntil(&DateTime::GetMaxValue());
1037 else if (rangeType == CALENDAR_RANGE_UNTIL)
1041 if (untilCalendarTime.type == CALENDAR_TIME_LOCALTIME)
1043 until.SetValue(untilCalendarTime.time.date.year, untilCalendarTime.time.date.month, untilCalendarTime.time.date.mday);
1047 until = _CalendarbookUtil::ConvertEpochTimeToDateTime(untilCalendarTime.time.utime);
1050 if (until < _CalendarbookImpl::GetMinDateTime())
1052 until = _CalendarbookImpl::GetMinDateTime();
1054 else if(until > _CalendarbookImpl::GetMaxDateTime())
1056 until = _CalendarbookImpl::GetMaxDateTime();
1059 pRecurrence->SetUntil(&until);
1063 pRecurrence->SetCounts(count);
1065 pRecurrence->SetInterval(interval);
1069 case CALENDAR_SUNDAY:
1070 convertedWeekStart = CAL_SUNDAY;
1073 case CALENDAR_MONDAY:
1074 convertedWeekStart = CAL_MONDAY;
1078 SysLogException(NID_SCL, E_INVALID_ARG, "Invalid argument is passed. week start = %d", weekStart);
1081 pRecurrence->SetWeekStart(convertedWeekStart);
1083 calendar_record_get_str_p(eventHandle, _calendar_event.exdate, &pExDates);
1084 if (pExDates != null && strlen(pExDates) != 0)
1086 r = ConvertRRuleExDateStringToRecurrence(pExDates, *pRecurrence.get());
1087 SysTryReturn(NID_SCL, r == E_SUCCESS, null, E_INVALID_ARG, "[%s] Invalid argument is used. exdate = %s", GetErrorMessage(E_INVALID_ARG), pExDates);
1090 return pRecurrence.release();
1094 _CalEventImpl::GetLastRevisedTime(void) const
1096 long long lastModifiedTime = 0;
1097 DateTime tmpLastRevisedTime;
1099 calendar_record_get_lli(__eventRecord.GetHandle(), _calendar_event.last_modified_time, &lastModifiedTime);
1101 tmpLastRevisedTime = _CalendarbookUtil::ConvertEpochTimeToDateTime(lastModifiedTime);
1103 return tmpLastRevisedTime;
1107 _CalEventImpl::SetSubject(const String& subject)
1109 if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
1111 SysTryReturnResult(NID_SCL, subject.GetLength() <= MAX_EVENT_SUBJECT_LENGTH, E_INVALID_ARG
1112 , "The length of the value exceeds MAX_EVENT_SUBJECT_LENGTH.");
1115 std::unique_ptr<char[]> pConvertedSubject(_StringConverter::CopyToCharArrayN(subject));
1116 SysTryReturnResult(NID_SCL, pConvertedSubject != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
1118 int errorCode = calendar_record_set_str(__eventRecord.GetHandle(), _calendar_event.summary, pConvertedSubject.get());
1119 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1125 _CalEventImpl::SetDescription(const String& description)
1127 if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
1129 SysTryReturnResult(NID_SCL, description.GetLength() <= MAX_EVENT_DESCRIPTION_LENGTH, E_INVALID_ARG
1130 , "The length of the value exceeds MAX_EVENT_DESCRIPTION_LENGTH.");
1133 std::unique_ptr<char[]> pConvertedDescription(_StringConverter::CopyToCharArrayN(description));
1134 SysTryReturnResult(NID_SCL, pConvertedDescription != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
1136 int errorCode = calendar_record_set_str(__eventRecord.GetHandle(), _calendar_event.description, pConvertedDescription.get());
1137 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1143 _CalEventImpl::SetLocation(const String& location)
1145 if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
1147 SysTryReturnResult(NID_SCL, location.GetLength() <= MAX_EVENT_LOCATION_LENGTH, E_INVALID_ARG
1148 , "The length of the value exceeds MAX_EVENT_LOCATION_LENGTH.");
1151 std::unique_ptr<char[]> pConvertedLocation(_StringConverter::CopyToCharArrayN(location));
1152 SysTryReturnResult(NID_SCL, pConvertedLocation != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
1154 int errorCode = calendar_record_set_str(__eventRecord.GetHandle(), _calendar_event.location, pConvertedLocation.get());
1155 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1161 _CalEventImpl::SetStartAndEndTime(const DateTime& start, const DateTime& end)
1163 int recurrenceFrequency = 0;
1165 calendar_record_get_int(__eventRecord.GetHandle(), _calendar_event.freq, &recurrenceFrequency);
1167 SysTryReturnResult(NID_SCL, recurrenceFrequency == CALENDAR_RECURRENCE_NONE, E_INVALID_CONDITION
1168 , "The recurrence date is already set. Cannot modify the start and end date/time.");
1169 SysTryReturnResult(NID_SCL, _CalendarbookUtil::CheckValidDateTime(start), E_INVALID_ARG, "Invalid argument is used. start = %S", start.ToString().GetPointer());
1170 SysTryReturnResult(NID_SCL, _CalendarbookUtil::CheckValidDateTime(end), E_INVALID_ARG, "Invalid argument is used. end = %S", end.ToString().GetPointer());
1171 SysTryReturnResult(NID_SCL, start <= end, E_INVALID_ARG, "Invalid argument is used. The end date is earlier than the start date.");
1173 return SetStartAndEndTimeCommon(start, end);
1177 _CalEventImpl::SetStartAndEndTimeCommon(const DateTime& start, const DateTime& end)
1179 calendar_time_s startCalendarTime;
1180 calendar_time_s endCalendarTime;
1182 calendar_record_get_caltime(__eventRecord.GetHandle(), _calendar_event.start_time, &startCalendarTime);
1184 if (startCalendarTime.type == CALENDAR_TIME_LOCALTIME)
1186 startCalendarTime.time.date.year = start.GetYear();
1187 startCalendarTime.time.date.month = start.GetMonth();
1188 startCalendarTime.time.date.mday = start.GetDay();
1190 endCalendarTime.type = CALENDAR_TIME_LOCALTIME;
1191 endCalendarTime.time.date.year = end.GetYear();
1192 endCalendarTime.time.date.month = end.GetMonth();
1193 endCalendarTime.time.date.mday = end.GetDay();
1197 startCalendarTime.time.utime = _CalendarbookUtil::ConvertDateTimeToEpochTime(start);
1199 endCalendarTime.type = CALENDAR_TIME_UTIME;
1200 endCalendarTime.time.utime = _CalendarbookUtil::ConvertDateTimeToEpochTime(end);
1203 calendar_record_set_caltime(__eventRecord.GetHandle(), _calendar_event.start_time, startCalendarTime);
1204 calendar_record_set_caltime(__eventRecord.GetHandle(), _calendar_event.end_time, endCalendarTime);
1210 _CalEventImpl::SetCategory(EventCategory category)
1212 std::unique_ptr<char[]> pConvertedCategory;
1214 if (category == EVENT_CATEGORY_ANNIVERSARY)
1216 SetAllDayEvent(true);
1218 pConvertedCategory.reset(_StringConverter::CopyToCharArrayN(_EVENT_CATEGORY_ANNIVERSARY_STRING));
1219 SysTryReturnVoidResult(NID_SCL, pConvertedCategory != null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1223 pConvertedCategory.reset(_StringConverter::CopyToCharArrayN(_EVENT_CATEGORY_APPOINTMENT_STRING));
1224 SysTryReturnVoidResult(NID_SCL, pConvertedCategory != null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1227 int errorCode = calendar_record_set_str(__eventRecord.GetHandle(), _calendar_event.categories, pConvertedCategory.get());
1228 SysTryReturnVoidResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1232 _CalEventImpl::SetSensitivity(RecordSensitivity sensitivity)
1234 calendar_record_set_int(__eventRecord.GetHandle(), _calendar_event.sensitivity, _CalendarbookUtil::ConvertSensitivityToCSSensitivity(sensitivity));
1238 _CalEventImpl::SetCoordinates(double latitude, double longitude)
1240 SysTryReturnResult(NID_SCL, latitude >= _MIN_LATITUDE && latitude <= _MAX_LATITUDE, E_INVALID_ARG, "Invalid argument is used. The latitude is out of range.");
1241 SysTryReturnResult(NID_SCL, longitude >= _MIN_LONGITUDE && longitude <= _MAX_LONGITUDE, E_INVALID_ARG, "Invalid argument is used. The longitude is out of range.");
1243 calendar_record_set_double(__eventRecord.GetHandle(), _calendar_event.latitude, latitude);
1244 calendar_record_set_double(__eventRecord.GetHandle(), _calendar_event.longitude, longitude);
1250 _CalEventImpl::GetCoordinates(double& latitude, double& longitude) const
1252 calendar_record_get_double(__eventRecord.GetHandle(), _calendar_event.latitude, &latitude);
1253 calendar_record_get_double(__eventRecord.GetHandle(), _calendar_event.longitude, &longitude);
1257 _CalEventImpl::SetReminder(const Reminder* pReminder)
1259 unsigned int reminderCount = 0;
1260 calendar_record_h tmpAlarmHandle = null;
1262 calendar_record_get_child_record_count(__eventRecord.GetHandle(), _calendar_event.calendar_alarm, &reminderCount);
1264 if (pReminder != null)
1266 int convertedTimeUnit = 0;
1267 switch (pReminder->GetTimeUnit())
1269 case REMINDER_TIME_UNIT_MINUTE:
1270 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_MINUTE;
1272 case REMINDER_TIME_UNIT_HOUR:
1273 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_HOUR;
1275 case REMINDER_TIME_UNIT_DAY:
1276 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_DAY;
1278 case REMINDER_TIME_UNIT_WEEK:
1279 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_WEEK;
1285 calendar_record_h tmpAlarmHandle = null;
1286 int errorCode = CALENDAR_ERROR_NONE;
1288 if (reminderCount > 0)
1290 calendar_record_get_child_record_at_p(__eventRecord.GetHandle(), _calendar_event.calendar_alarm, 0, &tmpAlarmHandle);
1291 calendar_record_set_int(tmpAlarmHandle, _calendar_alarm.tick_unit, convertedTimeUnit);
1292 calendar_record_set_int(tmpAlarmHandle, _calendar_alarm.tick, pReminder->GetTimeOffset());
1294 std::unique_ptr<char[]> pTmpAlarmTone(_StringConverter::CopyToCharArrayN(pReminder->GetSoundFile()));
1295 SysTryReturnResult(NID_SCL, pTmpAlarmTone != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
1297 errorCode = calendar_record_set_str(tmpAlarmHandle, _calendar_alarm.tone, pTmpAlarmTone.get());
1298 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1302 std::unique_ptr<char[]> pTmpAlarmTone(_StringConverter::CopyToCharArrayN(pReminder->GetSoundFile()));
1303 SysTryReturnResult(NID_SCL, pTmpAlarmTone != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
1305 errorCode = calendar_record_create(_calendar_alarm._uri, &tmpAlarmHandle);
1306 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1308 calendar_record_set_int(tmpAlarmHandle, _calendar_alarm.tick_unit, convertedTimeUnit);
1309 calendar_record_set_int(tmpAlarmHandle, _calendar_alarm.tick, pReminder->GetTimeOffset());
1310 errorCode = calendar_record_set_str(tmpAlarmHandle, _calendar_alarm.tone, pTmpAlarmTone.get());
1311 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1313 errorCode = calendar_record_add_child_record(__eventRecord.GetHandle(), _calendar_event.calendar_alarm, tmpAlarmHandle);
1314 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1319 if (reminderCount > 0)
1321 calendar_record_get_child_record_at_p(__eventRecord.GetHandle(), _calendar_event.calendar_alarm, 0, &tmpAlarmHandle);
1322 calendar_record_remove_child_record(__eventRecord.GetHandle(), _calendar_event.calendar_alarm, tmpAlarmHandle);
1326 __reminderList.RemoveAll(true);
1327 __reminderListUpdated = false;
1333 _CalEventImpl::SetRecurrence(const Recurrence* pRecurrence)
1335 if (pRecurrence != null)
1337 result r = VerifyRecurrence(*pRecurrence);
1338 SysTryReturn(NID_SCL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1340 r = ResetStartAndEndTimeByRecurrence(*pRecurrence);
1341 SysTryReturn(NID_SCL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1343 r = ConvertRecurrenceToEventHandle(*pRecurrence, __eventRecord.GetHandle());
1344 SysTryReturn(NID_SCL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1346 std::unique_ptr<char[]> pExDates(_StringConverter::CopyToCharArrayN(ConvertRecurrenceToRRuleExDateString(*pRecurrence, IsAllDayEvent())));
1347 int errorCode = calendar_record_set_str(__eventRecord.GetHandle(), _calendar_event.exdate, pExDates.get());
1348 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1350 __pRecurrence.reset(new (std::nothrow) Recurrence(*pRecurrence));
1351 SysTryReturnResult(NID_SCL, __pRecurrence != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
1355 calendar_record_set_int(__eventRecord.GetHandle(), _calendar_event.freq, CALENDAR_RECURRENCE_NONE);
1357 __pRecurrence.reset(null);
1364 _CalEventImpl::AddReminder(const Reminder& reminder)
1366 calendar_record_h tmpAlarmHandle = null;
1368 std::unique_ptr<char[]> pTmpAlarmTone(_StringConverter::CopyToCharArrayN(reminder.GetSoundFile()));
1369 SysTryReturnResult(NID_SCL, pTmpAlarmTone != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
1371 int errorCode = calendar_record_create(_calendar_alarm._uri, &tmpAlarmHandle);
1372 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1374 int convertedTimeUnit = 0;
1376 ReminderTimeUnit timeUnit = reminder.GetTimeUnit();
1379 case REMINDER_TIME_UNIT_MINUTE:
1380 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_MINUTE;
1383 case REMINDER_TIME_UNIT_HOUR:
1384 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_HOUR;
1387 case REMINDER_TIME_UNIT_DAY:
1388 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_DAY;
1391 case REMINDER_TIME_UNIT_WEEK:
1392 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_WEEK;
1395 case REMINDER_TIME_UNIT_NONE:
1396 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_SPECIFIC;
1403 calendar_record_set_int(tmpAlarmHandle, _calendar_alarm.tick_unit, convertedTimeUnit);
1404 calendar_record_set_int(tmpAlarmHandle, _calendar_alarm.tick, reminder.GetTimeOffset());
1405 errorCode = calendar_record_set_str(tmpAlarmHandle, _calendar_alarm.tone, pTmpAlarmTone.get());
1406 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1408 if (convertedTimeUnit == CALENDAR_ALARM_TIME_UNIT_SPECIFIC)
1410 calendar_record_set_lli(tmpAlarmHandle, _calendar_alarm.time, _CalendarbookUtil::ConvertDateTimeToEpochTime(reminder.GetAbsoluteTime()));
1413 errorCode = calendar_record_add_child_record(__eventRecord.GetHandle(), _calendar_event.calendar_alarm, tmpAlarmHandle);
1414 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1416 __reminderList.RemoveAll(true);
1417 __reminderListUpdated = false;
1423 _CalEventImpl::RemoveReminderAt(int index)
1425 calendar_record_h tmpAlarmHandle = null;
1427 calendar_record_get_child_record_at_p(__eventRecord.GetHandle(), _calendar_event.calendar_alarm, index, &tmpAlarmHandle);
1428 SysTryReturnResult(NID_SCL, tmpAlarmHandle != null, E_OUT_OF_RANGE, "The index is out of range. index = %d", index);
1430 calendar_record_remove_child_record(__eventRecord.GetHandle(), _calendar_event.calendar_alarm, tmpAlarmHandle);
1432 __reminderList.RemoveAll(true);
1433 __reminderListUpdated = false;
1439 _CalEventImpl::GetAllReminders(void) const
1443 if (__reminderListUpdated == false)
1445 result r = _CalendarbookUtil::ConvertEventAlarmsToReminderList(__eventRecord.GetHandle(), __reminderList);
1446 SysTryReturn(NID_SCL, r == E_SUCCESS, __reminderList, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1448 __reminderListUpdated = true;
1451 return __reminderList;
1455 _CalEventImpl::ConvertRecurrenceToEventHandle(const Recurrence& recurrence, calendar_record_h eventHandle) const
1457 result r = E_SUCCESS;
1459 int weekStart = CALENDAR_SUNDAY;
1460 std::unique_ptr<char[]> pByDay;
1461 std::unique_ptr<char[]> pByMonth;
1462 std::unique_ptr<char[]> pByMonthDay;
1465 String dayOfWeekString;
1466 String exDateString;
1468 switch (recurrence.GetWeekStart())
1471 weekStart = CALENDAR_SUNDAY;
1475 weekStart = CALENDAR_MONDAY;
1479 SysLogException(NID_SCL, E_INVALID_ARG, "Invalid argument is passed. week start = %d", recurrence.GetWeekStart());
1480 return E_INVALID_ARG;
1483 int errorCode = calendar_record_set_int(eventHandle, _calendar_event.wkst, weekStart);
1484 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_INVALID_ARG, "Invalid argument is passed. week start = %d", weekStart);
1486 if (recurrence.GetUntil() != null)
1488 if (*recurrence.GetUntil() == DateTime::GetMaxValue())
1490 calendar_record_set_int(eventHandle, _calendar_event.range_type, CALENDAR_RANGE_NONE);
1494 calendar_time_s startCalendarTime;
1495 calendar_time_s untilCalendarTime;
1497 calendar_record_get_caltime(eventHandle, _calendar_event.start_time, &startCalendarTime);
1498 if (startCalendarTime.type == CALENDAR_TIME_LOCALTIME)
1500 untilCalendarTime.type = CALENDAR_TIME_LOCALTIME;
1501 untilCalendarTime.time.date.year = recurrence.GetUntil()->GetYear();
1502 untilCalendarTime.time.date.month = recurrence.GetUntil()->GetMonth();
1503 untilCalendarTime.time.date.mday = recurrence.GetUntil()->GetDay();
1507 untilCalendarTime.type = CALENDAR_TIME_UTIME;
1508 untilCalendarTime.time.utime = _CalendarbookUtil::ConvertDateTimeToEpochTime(*recurrence.GetUntil());
1511 calendar_record_set_int(eventHandle, _calendar_event.range_type, CALENDAR_RANGE_UNTIL);
1512 calendar_record_set_caltime(eventHandle, _calendar_event.until_time, untilCalendarTime);
1517 calendar_record_set_int(eventHandle, _calendar_event.range_type, CALENDAR_RANGE_COUNT);
1518 calendar_record_set_int(eventHandle, _calendar_event.count, recurrence.GetCounts());
1521 calendar_record_set_int(eventHandle, _calendar_event.interval, recurrence.GetInterval());
1523 switch (recurrence.GetFrequency())
1526 calendar_record_set_int(eventHandle, _calendar_event.freq, CALENDAR_RECURRENCE_DAILY);
1530 calendar_record_set_int(eventHandle, _calendar_event.freq, CALENDAR_RECURRENCE_WEEKLY);
1532 dayOfWeek = recurrence.GetDayOfWeek();
1533 r = ConvertDayOfWeekToRRuleByDayString(dayOfWeek, 0, dayOfWeekString);
1534 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_INVALID_ARG, "Invalid argument is passed. day of week = %d", dayOfWeek);
1536 pByDay.reset(_StringConverter::CopyToCharArrayN(dayOfWeekString));
1541 calendar_record_set_int(eventHandle, _calendar_event.freq, CALENDAR_RECURRENCE_MONTHLY);
1543 if (recurrence.GetDayOfMonth() != 0)
1545 pByMonthDay.reset(_StringConverter::CopyToCharArrayN(Integer::ToString(recurrence.GetDayOfMonth())));
1549 dayOfWeek = recurrence.GetDayOfWeek();
1550 r = ConvertDayOfWeekToRRuleByDayString(dayOfWeek, recurrence.GetWeekOfMonth(), dayOfWeekString);
1551 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_INVALID_ARG, "Invalid argument is passed. day of week = %d", dayOfWeek);
1553 pByDay.reset(_StringConverter::CopyToCharArrayN(dayOfWeekString));
1559 calendar_record_set_int(eventHandle, _calendar_event.freq, CALENDAR_RECURRENCE_YEARLY);
1561 pByMonth.reset(_StringConverter::CopyToCharArrayN(Integer::ToString(recurrence.GetMonthOfYear())));
1563 if (recurrence.GetDayOfMonth() != 0)
1565 pByMonthDay.reset(_StringConverter::CopyToCharArrayN(Integer::ToString(recurrence.GetDayOfMonth())));
1569 dayOfWeek = recurrence.GetDayOfWeek();
1570 r = ConvertDayOfWeekToRRuleByDayString(dayOfWeek, recurrence.GetWeekOfMonth(), dayOfWeekString);
1571 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_INVALID_ARG, "Invalid argument is passed. day of week = %d", dayOfWeek);
1573 pByDay.reset(_StringConverter::CopyToCharArrayN(dayOfWeekString));
1579 SysLogException(NID_SCL, E_INVALID_ARG, "[%s] Invalid argument is used. frequency = %d", GetErrorMessage(E_INVALID_ARG), recurrence.GetFrequency());
1580 return E_INVALID_ARG;
1583 errorCode = calendar_record_set_str(eventHandle, _calendar_event.byday, pByDay.get());
1584 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1585 errorCode = calendar_record_set_str(eventHandle, _calendar_event.bymonth, pByMonth.get());
1586 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1587 errorCode = calendar_record_set_str(eventHandle, _calendar_event.bymonthday, pByMonthDay.get());
1588 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1594 _CalEventImpl::ConvertDayOfWeekToRRuleByDayString(int dayOfWeek, int weekOfMonth, String& byDayString) const
1596 int tmpDayOfWeek = CAL_SUNDAY;
1598 byDayString.Clear();
1599 for (int i = 0; i < _NUMBER_OF_DAYS_OF_WEEK; i++)
1601 if (dayOfWeek & tmpDayOfWeek)
1603 if (weekOfMonth != 0)
1605 byDayString.Append(weekOfMonth);
1608 switch (tmpDayOfWeek)
1611 byDayString.Append(_RECURRENCE_KEYWORD_SUNDAY);
1614 byDayString.Append(_RECURRENCE_KEYWORD_MONDAY);
1617 byDayString.Append(_RECURRENCE_KEYWORD_TUESDAY);
1620 byDayString.Append(_RECURRENCE_KEYWORD_WEDNESDAY);
1623 byDayString.Append(_RECURRENCE_KEYWORD_THURSDAY);
1626 byDayString.Append(_RECURRENCE_KEYWORD_FRIDAY);
1629 byDayString.Append(_RECURRENCE_KEYWORD_SATURDAY);
1632 byDayString.Append(_RECURRENCE_DELIMITER);
1638 byDayString.Remove(byDayString.GetLength() - 1, _RECURRENCE_DELIMITER_LENGTH);
1644 _CalEventImpl::GetCalendarId(void) const
1646 int srcCalendarbookId = 0;
1648 calendar_record_get_int(__eventRecord.GetHandle(), _calendar_event.calendar_book_id, &srcCalendarbookId);
1650 return srcCalendarbookId;
1654 _CalEventImpl::GetBaseEventId(void) const
1656 int srcBaseEventId = INVALID_RECORD_ID;
1658 calendar_record_get_int(__eventRecord.GetHandle(), _calendar_event.original_event_id, &srcBaseEventId);
1660 return srcBaseEventId;
1664 _CalEventImpl::SetOriginalCalEventId(RecordId originalEventId)
1666 __originalEventId = originalEventId;
1667 __isInstance = true;
1671 _CalEventImpl::GetAttendeeIndex(const char* pAttendeeEmail)
1673 int index = _INVALID_ATTENDEE_INDEX;
1674 unsigned int attendeeCount = 0;
1676 calendar_record_get_child_record_count(__eventRecord.GetHandle(), _calendar_event.calendar_attendee, &attendeeCount);
1678 calendar_record_h tmpAttendeeHandle = null;
1679 char* pTmpAttendeeEmail = null;
1680 for (unsigned int i = 0; i < attendeeCount; i++)
1682 calendar_record_get_child_record_at_p(__eventRecord.GetHandle(), _calendar_event.calendar_attendee, i, &tmpAttendeeHandle);
1683 calendar_record_get_str_p(tmpAttendeeHandle, _calendar_attendee.email, &pTmpAttendeeEmail);
1685 if (strcmp(pAttendeeEmail, pTmpAttendeeEmail) == 0)
1696 _CalEventImpl::VerifyRecurrence(const Recurrence& recurrence)
1698 const DateTime* pUntil = recurrence.GetUntil();
1699 RecurFrequency frequency = recurrence.GetFrequency();
1700 int durationLimit = 0;
1701 int interval = recurrence.GetInterval();
1703 DateTime startTime = GetStartTime();
1704 DateTime endTime = GetEndTime();
1705 EventCategory category = GetCategory();
1709 SysTryReturnResult(NID_SCL, startTime <= *pUntil, E_INVALID_CONDITION, "The until date of recurrence is earlier than start date.");
1712 if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
1714 if (category == EVENT_CATEGORY_ANNIVERSARY)
1716 SysTryReturnResult(NID_SCL, frequency == FREQ_YEARLY, E_TYPE_MISMATCH
1717 , "The recurrence pattern is not a yearly pattern in case of the event being an Anniversary.");
1721 if (frequency == FREQ_DAILY)
1723 durationLimit = _TERM_LIMIT_DAILY * interval;
1725 else if (frequency == FREQ_WEEKLY)
1727 SysTryReturnResult(NID_SCL, recurrence.GetDayOfWeek() != 0, E_INVALID_ARG, "Invalid argument is used. The day of week is not set.");
1728 durationLimit = _TERM_LIMIT_WEEKLY * interval;
1730 else if (frequency == FREQ_MONTHLY)
1732 SysTryReturnResult(NID_SCL, recurrence.GetDayOfMonth() != 0 || (recurrence.GetDayOfWeek() != 0 && recurrence.GetWeekOfMonth() != 0)
1733 , E_INVALID_ARG, "Invalid argument is used. The day of month or day of week/week of month is not set.");
1734 durationLimit = _TERM_LIMIT_MONTHLY * interval;
1736 else if (frequency == FREQ_YEARLY)
1738 int dayOfMonth = recurrence.GetDayOfMonth();
1739 int monthOfYear = recurrence.GetMonthOfYear();
1740 SysTryReturnResult(NID_SCL, monthOfYear != 0, E_INVALID_ARG, "Invalid argument is used. The month of year is not set.");
1741 SysTryReturnResult(NID_SCL, dayOfMonth != 0 || (recurrence.GetDayOfWeek() != 0 && recurrence.GetWeekOfMonth() != 0)
1742 , E_INVALID_ARG, "Invalid argument is used. The day of month or day of week/week of month is not set.");
1744 SysTryReturnResult(NID_SCL, monthOfYear != 2 || dayOfMonth < 30
1745 , E_INVALID_ARG, "Invalid argument is used. If the frequency is yearly, the max days of the February is less than 30.");
1746 if (dayOfMonth > 30)
1748 SysTryReturnResult(NID_SCL, monthOfYear != 4 && monthOfYear != 6 && monthOfYear != 9 && monthOfYear != 11
1749 , E_INVALID_ARG, "Invalid argument is used. If the frequency is yearly, the max days of the April, June, September and November is less than 31.");
1752 durationLimit = _TERM_LIMIT_YEARLY * interval;
1755 TimeSpan duration = endTime.GetTime() - startTime.GetTime();
1756 SysTryReturnResult(NID_SCL, duration.GetDays() <= durationLimit, E_INVALID_CONDITION
1757 , "The duration of the event is greater than (interval x frequency) days. duration days = %d", duration.GetDays());
1763 _CalEventImpl::ResetStartAndEndTimeByRecurrence(const Recurrence& recurrence)
1768 bool isAllDay = IsAllDayEvent();
1769 Locales::TimeZone timeZone;
1773 timeZone = GetTimeZone();
1774 startTime = timeZone.UtcTimeToWallTime(GetStartTime());
1775 endTime = timeZone.UtcTimeToWallTime(GetEndTime());
1779 startTime = GetStartTime();
1780 endTime = GetEndTime();
1783 DateTime calculatedStartTime(startTime);
1784 DateTime calculatedEndTime(endTime);
1785 RecurFrequency frequency = recurrence.GetFrequency();
1786 int interval = recurrence.GetInterval();
1787 int dayOfMonth = recurrence.GetDayOfMonth();
1788 int dayOfWeek = recurrence.GetDayOfWeek();
1789 int weekOfMonth = recurrence.GetWeekOfMonth();
1790 int monthOfYear = recurrence.GetMonthOfYear();
1791 CalDayOfWeek weekStart = recurrence.GetWeekStart();
1792 CalDayOfWeek weekEnd = CAL_SATURDAY;
1794 TimeSpan duration = endTime.GetTime() - startTime.GetTime();
1796 if (weekStart == CAL_MONDAY)
1798 weekEnd = CAL_SUNDAY;
1801 if (recurrence.GetUntil() != null)
1803 until = *(recurrence.GetUntil());
1806 until = timeZone.UtcTimeToWallTime(until);
1811 until = _CalendarbookImpl::GetMaxDateTime();
1814 CalDayOfWeek dayOfStartTime = GetDayOfWeek(startTime, timeZone);
1816 if (frequency == FREQ_WEEKLY)
1820 for (int i = 0; i < _NUMBER_OF_DAYS_OF_WEEK; i++)
1822 if ((dayOfStartTime & dayOfWeek) != 0)
1827 if ((dayOfStartTime & weekEnd) != 0)
1829 count += (interval - 1) * _NUMBER_OF_DAYS_OF_WEEK;
1832 dayOfStartTime = GetNextDayOfWeek(dayOfStartTime);
1836 result r = calculatedStartTime.AddDays(count);
1837 SysTryReturnResult(NID_SCL, !IsFailed(r), r, "[%s][Propagating]", GetErrorMessage(r));
1838 r = calculatedEndTime.AddDays(count);
1839 SysTryReturnResult(NID_SCL, !IsFailed(r), r, "[%s][Propagating]", GetErrorMessage(r));
1842 else if (frequency == FREQ_MONTHLY)
1844 if (dayOfMonth != 0)
1846 bool isDone = false;
1847 while (calculatedStartTime <= until)
1849 if (calculatedStartTime.SetValue(calculatedStartTime.GetYear(), calculatedStartTime.GetMonth(), dayOfMonth, calculatedStartTime.GetHour(), calculatedStartTime.GetMinute(), calculatedStartTime.GetSecond()) == E_SUCCESS)
1851 if (calculatedStartTime >= startTime)
1857 calculatedStartTime.AddMonths(interval);
1859 SysTryReturnResult(NID_SCL, isDone, E_INVALID_ARG, "Invalid argument is used. There is no instance of the recurrence.");
1860 calculatedEndTime = calculatedStartTime;
1861 calculatedEndTime.Add(duration);
1865 bool isDone = false;
1867 CalDayOfWeek tmpDayOfWeek = GetFirstDay(weekStart, dayOfWeek, dayCount);
1868 while (calculatedStartTime <= until)
1870 for (int i = 0; i < dayCount; i++)
1872 calculatedStartTime = GetDate(calculatedStartTime.GetYear(), calculatedStartTime.GetMonth(), weekOfMonth, tmpDayOfWeek, calculatedStartTime, timeZone);
1873 if (calculatedStartTime >= startTime)
1878 tmpDayOfWeek = GetNextDay(dayOfWeek, tmpDayOfWeek);
1884 calculatedStartTime.AddMonths(interval);
1887 SysTryReturnResult(NID_SCL, isDone, E_INVALID_ARG, "Invalid argument is used. There is no instance of the recurrence.");
1888 calculatedEndTime = calculatedStartTime;
1889 calculatedEndTime.Add(duration);
1892 else if (frequency == FREQ_YEARLY)
1894 if (dayOfMonth != 0)
1896 bool isDone = false;
1897 while (calculatedStartTime <= until)
1899 if (calculatedStartTime.SetValue(calculatedStartTime.GetYear(), monthOfYear, dayOfMonth, calculatedStartTime.GetHour(), calculatedStartTime.GetMinute(), calculatedStartTime.GetSecond()) == E_SUCCESS)
1901 if (calculatedStartTime >= startTime)
1907 calculatedStartTime.AddYears(interval);
1909 SysTryReturnResult(NID_SCL, isDone, E_INVALID_ARG, "Invalid argument is used. There is no instance of the recurrence.");
1910 calculatedEndTime = calculatedStartTime;
1911 calculatedEndTime.Add(duration);
1915 bool isDone = false;
1917 CalDayOfWeek tmpDayOfWeek = GetFirstDay(weekStart, dayOfWeek, dayCount);
1918 while (calculatedStartTime <= until)
1920 for (int i = 0; i < dayCount; i++)
1922 calculatedStartTime = GetDate(calculatedStartTime.GetYear(), monthOfYear, weekOfMonth, tmpDayOfWeek, calculatedStartTime, timeZone);
1923 if (calculatedStartTime >= startTime)
1928 tmpDayOfWeek = GetNextDay(dayOfWeek, tmpDayOfWeek);
1934 calculatedStartTime.AddYears(interval);
1937 SysTryReturnResult(NID_SCL, isDone, E_INVALID_ARG, "Invalid argument is used. There is no instance of the recurrence.");
1938 calculatedEndTime = calculatedStartTime;
1939 calculatedEndTime.Add(duration);
1945 calculatedStartTime = timeZone.WallTimeToUtcTime(calculatedStartTime);
1946 calculatedEndTime = timeZone.WallTimeToUtcTime(calculatedEndTime);
1949 SysTryReturnResult(NID_SCL, calculatedStartTime <= until, E_INVALID_ARG, "Invalid argument is used. There is no instance of the recurrence.");
1950 SysTryReturnResult(NID_SCL, calculatedEndTime <= _CalendarbookImpl::GetMaxDateTime(), E_INVALID_ARG, "Invalid argument is used. There is no instance of the recurrence.");
1952 SysLog(NID_SCL, "Reset start time : %S", calculatedStartTime.ToString().GetPointer());
1953 SetStartAndEndTimeCommon(calculatedStartTime, calculatedEndTime);
1959 _CalEventImpl::ConvertRRuleByDayStringToDayOfWeek(const String& byDay) const
1964 SysTryReturn(NID_SCL, !byDay.IsEmpty(), 0, E_INVALID_ARG, "[%s] Invalid argument is used. The byDay is empty.", GetErrorMessage(E_INVALID_ARG));
1966 String delim(_RECURRENCE_DELIMITER);
1969 StringTokenizer strTok(byDay, delim);
1970 while (strTok.HasMoreTokens())
1972 result r = strTok.GetNextToken(token);
1973 SysTryReturn(NID_SCL, r == E_SUCCESS, 0, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1975 if (token == String(_RECURRENCE_KEYWORD_SUNDAY))
1977 dayOfWeek |= CAL_SUNDAY;
1979 else if (token == String(_RECURRENCE_KEYWORD_MONDAY))
1981 dayOfWeek |= CAL_MONDAY;
1983 else if (token == String(_RECURRENCE_KEYWORD_TUESDAY))
1985 dayOfWeek |= CAL_TUESDAY;
1987 else if (token == String(_RECURRENCE_KEYWORD_WEDNESDAY))
1989 dayOfWeek |= CAL_WEDNESDAY;
1991 else if (token == String(_RECURRENCE_KEYWORD_THURSDAY))
1993 dayOfWeek |= CAL_THURSDAY;
1995 else if (token == String(_RECURRENCE_KEYWORD_FRIDAY))
1997 dayOfWeek |= CAL_FRIDAY;
1999 else if (token == String(_RECURRENCE_KEYWORD_SATURDAY))
2001 dayOfWeek |= CAL_SATURDAY;
2005 SysLogException(NID_SCL, E_INVALID_ARG, "[%s] Invalid argument is used. byday = %S", GetErrorMessage(E_INVALID_ARG), byDay.GetPointer());
2014 _CalEventImpl::ConvertRRuleByDayStringToDayOfWeekAndWeekOfMonth(const String& byDay, int& weekOfMonth, int& dayOfWeek) const
2016 String delim(_RECURRENCE_DELIMITER);
2018 wchar_t tmpChar = 0;
2019 int tmpWeekOfMonth = 0;
2020 int weekStringStartIndex = 0;
2026 SysTryReturnResult(NID_SCL, !byDay.IsEmpty(), E_INVALID_ARG, "Invalid argument is passed. The byDay is empty.");
2028 StringTokenizer strTok(byDay, delim);
2030 while (strTok.HasMoreTokens())
2032 result r = strTok.GetNextToken(token);
2033 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_OUT_OF_MEMORY, "Memory allocation failed.");
2035 r = token.GetCharAt(_RECURRENCE_BY_DAY_FIRST_INDEX, tmpChar);
2036 if (tmpChar == _RECURRENCE_BY_DAY_CHAR_MINUS)
2038 SysTryReturnResult(NID_SCL, weekOfMonth == 0 || weekOfMonth == _MAX_WEEK_OF_MONTH
2039 , E_INVALID_ARG, "Invalid argument is passed. byday = %S", byDay.GetPointer());
2041 if (weekOfMonth == 0)
2044 r = token.GetCharAt(_RECURRENCE_BY_DAY_SECOND_INDEX, tmpChar);
2045 SysTryReturnResult(NID_SCL, tmpChar == _RECURRENCE_BY_DAY_CHAR_ONE
2046 , E_INVALID_ARG, "Invalid argument is passed. byday = %S", byDay.GetPointer());
2048 weekOfMonth = _MAX_WEEK_OF_MONTH;
2050 weekStringStartIndex = _RECURRENCE_BY_DAY_SECOND_INDEX + 1;
2052 else if (tmpChar == _RECURRENCE_BY_DAY_CHAR_PLUS)
2054 if (weekOfMonth == 0)
2057 r = token.GetCharAt(_RECURRENCE_BY_DAY_SECOND_INDEX, tmpChar);
2058 tmpWeekOfMonth = Character::ToDigit(tmpChar, Character::RADIX_DECIMAL);
2059 SysTryReturnResult(NID_SCL, tmpWeekOfMonth > 0 && tmpWeekOfMonth <= _MAX_WEEK_OF_MONTH
2060 , E_INVALID_ARG, "Invalid argument is passed. byday = %S", byDay.GetPointer());
2062 weekOfMonth = tmpWeekOfMonth;
2066 SysTryReturnResult(NID_SCL, weekOfMonth == tmpWeekOfMonth
2067 , E_INVALID_ARG, "Invalid argument is passed. byday = %S", byDay.GetPointer());
2070 weekStringStartIndex = _RECURRENCE_BY_DAY_SECOND_INDEX + 1;
2074 if (weekOfMonth == 0)
2076 tmpWeekOfMonth = Character::ToDigit(tmpChar, Character::RADIX_DECIMAL);
2077 SysTryReturnResult(NID_SCL, tmpWeekOfMonth > 0 && tmpWeekOfMonth <= _MAX_WEEK_OF_MONTH
2078 , E_INVALID_ARG, "Invalid argument is passed. byday = %S", byDay.GetPointer());
2080 weekOfMonth = tmpWeekOfMonth;
2084 SysTryReturnResult(NID_SCL, weekOfMonth == tmpWeekOfMonth
2085 , E_INVALID_ARG, "Invalid argument is passed. byday = %S", byDay.GetPointer());
2088 weekStringStartIndex = _RECURRENCE_BY_DAY_FIRST_INDEX + 1;
2091 token.SubString(weekStringStartIndex, tmpString);
2093 if (tmpString == String(_RECURRENCE_KEYWORD_SUNDAY))
2095 dayOfWeek |= CAL_SUNDAY;
2097 else if (tmpString == String(_RECURRENCE_KEYWORD_MONDAY))
2099 dayOfWeek |= CAL_MONDAY;
2101 else if (tmpString == String(_RECURRENCE_KEYWORD_TUESDAY))
2103 dayOfWeek |= CAL_TUESDAY;
2105 else if (tmpString == String(_RECURRENCE_KEYWORD_WEDNESDAY))
2107 dayOfWeek |= CAL_WEDNESDAY;
2109 else if (tmpString == String(_RECURRENCE_KEYWORD_THURSDAY))
2111 dayOfWeek |= CAL_THURSDAY;
2113 else if (tmpString == String(_RECURRENCE_KEYWORD_FRIDAY))
2115 dayOfWeek |= CAL_FRIDAY;
2117 else if (tmpString == String(_RECURRENCE_KEYWORD_SATURDAY))
2119 dayOfWeek |= CAL_SATURDAY;
2123 SysLogException(NID_SCL, E_INVALID_ARG, "[%s] Invalid argument is used. byday = %S", GetErrorMessage(E_INVALID_ARG), byDay.GetPointer());
2131 _CalEventImpl::ConvertRRuleExDateStringToRecurrence(const String& exdate, Recurrence& recurrence) const
2133 String delim(_RECURRENCE_DELIMITER);
2135 DateTime tmpDateTime;
2136 TimeZone tmpTimeZone;
2137 TimeZone utcTimeZone = TimeZone::GetGmtTimeZone();
2138 bool isDate = false;
2140 SysTryReturnResult(NID_SCL, !exdate.IsEmpty(), E_INVALID_ARG, "Invalid argument is passed. The exdate is empty.");
2142 StringTokenizer strTok(exdate, delim);
2143 while (strTok.HasMoreTokens())
2145 result r = strTok.GetNextToken(token);
2146 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_OUT_OF_MEMORY, "Memory allocation failed.");
2148 r = _CalendarbookUtil::ConvertRRuleDateTimeStringToDateTime(token, tmpDateTime, tmpTimeZone, isDate);
2149 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_INVALID_ARG, "Invalid argument is passed. exdate = %S", exdate.GetPointer());
2151 if (!isDate && tmpTimeZone != utcTimeZone)
2153 tmpDateTime = tmpTimeZone.WallTimeToUtcTime(tmpDateTime);
2156 r = recurrence.AddExceptionDate(tmpDateTime);
2157 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_INVALID_ARG, "Invalid argument is passed. exdate = %S", exdate.GetPointer());
2164 _CalEventImpl::ConvertRecurrenceToRRuleExDateString(const Recurrence& recurrence, bool isDate) const
2166 bool isNotFirst = false;
2167 String exdateString;
2169 std::unique_ptr<IList, AllElementsDeleter> pExDateList(recurrence.GetExceptionDatesN());
2171 std::unique_ptr<IEnumerator> pEnum(pExDateList->GetEnumeratorN());
2172 while (pEnum->MoveNext() == E_SUCCESS)
2174 DateTime* pDateTime = static_cast<DateTime*>(pEnum->GetCurrent());
2178 exdateString.Append(_RECURRENCE_DELIMITER);
2181 exdateString.Append(_CalendarbookUtil::ConvertDateTimeToRRuleDateTimeString(*pDateTime, isDate));
2186 return exdateString;
2190 _CalEventImpl::GetNextDayOfWeek(CalDayOfWeek currentDay)
2192 int tmpDay = currentDay;
2195 if (tmpDay > CAL_SATURDAY)
2197 tmpDay = CAL_SUNDAY;
2200 return static_cast<CalDayOfWeek>(tmpDay);
2204 _CalEventImpl::GetDate(int year, int month, int weekOfMonth, CalDayOfWeek dayOfWeek, const DateTime& time, const TimeZone& timeZone)
2208 Tizen::Locales::DayOfWeek dayOfWeekByGregorianCalendar = Tizen::Locales::DAY_OF_WEEK_UNDEFINED;
2213 dayOfWeekByGregorianCalendar = Tizen::Locales::SUNDAY;
2217 dayOfWeekByGregorianCalendar = Tizen::Locales::MONDAY;
2221 dayOfWeekByGregorianCalendar = Tizen::Locales::TUESDAY;
2225 dayOfWeekByGregorianCalendar = Tizen::Locales::WEDNESDAY;
2229 dayOfWeekByGregorianCalendar = Tizen::Locales::THURSDAY;
2233 dayOfWeekByGregorianCalendar = Tizen::Locales::FRIDAY;
2237 dayOfWeekByGregorianCalendar = Tizen::Locales::SATURDAY;
2244 std::unique_ptr<Tizen::Locales::Calendar> pGregorianCalendar(Tizen::Locales::Calendar::CreateInstanceN(timeZone, Tizen::Locales::CALENDAR_GREGORIAN));
2245 SysTryReturn(NID_SCL, pGregorianCalendar != null, DateTime(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2247 pGregorianCalendar->SetTimeField(Tizen::Locales::TIME_FIELD_YEAR, year);
2248 pGregorianCalendar->SetTimeField(Tizen::Locales::TIME_FIELD_MONTH, month);
2249 pGregorianCalendar->SetTimeField(Tizen::Locales::TIME_FIELD_DAY_OF_MONTH, 1);
2251 Tizen::Locales::DayOfWeek tmpDayOfWeek = static_cast<Tizen::Locales::DayOfWeek>(pGregorianCalendar->GetTimeField(TIME_FIELD_DAY_OF_WEEK));
2252 int maxDaysOfMonth = pGregorianCalendar->GetActualMaxTimeField(TIME_FIELD_DAY_OF_MONTH);
2253 int tmpDayOfMonth = ((_NUMBER_OF_DAYS_OF_WEEK + dayOfWeekByGregorianCalendar) - tmpDayOfWeek) % _NUMBER_OF_DAYS_OF_WEEK + 1;
2255 tmpDayOfMonth += ((weekOfMonth - 1) * _NUMBER_OF_DAYS_OF_WEEK);
2256 if (tmpDayOfMonth > maxDaysOfMonth)
2258 tmpDayOfMonth -= _NUMBER_OF_DAYS_OF_WEEK;
2261 DateTime resultTime;
2262 resultTime.SetValue(year, month, tmpDayOfMonth, time.GetHour(), time.GetMinute(), time.GetSecond());
2268 _CalEventImpl::GetDayOfWeek(const DateTime& date, const Locales::TimeZone& timeZone)
2272 CalDayOfWeek dayOfWeek = CAL_SUNDAY;
2274 std::unique_ptr<Tizen::Locales::Calendar> pGregorianCalendar(Tizen::Locales::Calendar::CreateInstanceN(timeZone, Tizen::Locales::CALENDAR_GREGORIAN));
2275 SysTryReturn(NID_SCL, pGregorianCalendar != null, dayOfWeek, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2277 pGregorianCalendar->SetTime(date);
2278 int dayOfWeekByGregorianCalendar = pGregorianCalendar->GetTimeField(Tizen::Locales::TIME_FIELD_DAY_OF_WEEK);
2280 switch (dayOfWeekByGregorianCalendar)
2282 case Tizen::Locales::SUNDAY:
2283 dayOfWeek = CAL_SUNDAY;
2286 case Tizen::Locales::MONDAY:
2287 dayOfWeek = CAL_MONDAY;
2290 case Tizen::Locales::TUESDAY:
2291 dayOfWeek = CAL_TUESDAY;
2294 case Tizen::Locales::WEDNESDAY:
2295 dayOfWeek = CAL_WEDNESDAY;
2298 case Tizen::Locales::THURSDAY:
2299 dayOfWeek = CAL_THURSDAY;
2302 case Tizen::Locales::FRIDAY:
2303 dayOfWeek = CAL_FRIDAY;
2306 case Tizen::Locales::SATURDAY:
2307 dayOfWeek = CAL_SATURDAY;
2318 _CalEventImpl::GetFirstDay(CalDayOfWeek weekStart, int dayOfWeek, int& count)
2321 int tmpDay = weekStart;
2324 for (int i = 0; i < _NUMBER_OF_DAYS_OF_WEEK; i++)
2326 if ((tmpDay & dayOfWeek) != 0)
2336 tmpDay = GetNextDayOfWeek(static_cast<CalDayOfWeek>(tmpDay));
2339 return static_cast<CalDayOfWeek>(firstDay);
2343 _CalEventImpl::GetNextDay(int dayOfWeek, CalDayOfWeek currentDay)
2345 int tmpDay = currentDay;
2347 for (int i = 0; i < _NUMBER_OF_DAYS_OF_WEEK; i++)
2349 tmpDay = GetNextDayOfWeek(static_cast<CalDayOfWeek>(tmpDay));
2351 if ((tmpDay & dayOfWeek) != 0)
2357 return static_cast<CalDayOfWeek>(tmpDay);
2361 _CalEventImpl::SetRecordHandle(calendar_record_h eventHandle)
2363 __eventRecord.ResetHandle(eventHandle);
2367 _CalEventImpl::GetRecordHandle(void) const
2369 return __eventRecord.GetHandle();
2373 _CalEventImpl::CreateDefaultInstanceN(void)
2375 return new (std::nothrow) CalEvent();
2379 _CalEventImpl::GetInstance(CalEvent& event)
2381 return event.__pCalEventImpl;
2384 const _CalEventImpl*
2385 _CalEventImpl::GetInstance(const CalEvent& event)
2387 return event.__pCalEventImpl;