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);
970 r = ConvertRRuleByDayStringToDayOfWeekAndWeekOfMonth(pByDay, weekOfMonth, dayOfWeek);
971 SysTryReturn(NID_SCL, r == E_SUCCESS, null, E_INVALID_ARG, "[%s] Invalid argument is used. byday = %s", GetErrorMessage(E_INVALID_ARG), pByDay);
973 pRecurrence->SetWeekOfMonth(weekOfMonth);
974 pRecurrence->SetDayOfWeek(dayOfWeek);
979 case CALENDAR_RECURRENCE_YEARLY:
980 pRecurrence->SetFrequency(FREQ_YEARLY);
986 int maxDaysOfMonth = _CalendarbookUtil::GetMaxDaysOfMonth(untilCalendarTime.time.date.year, monthOfYear);
987 pRecurrence->SetDayOfMonth(maxDaysOfMonth + dayOfMonth);
991 pRecurrence->SetDayOfMonth(dayOfMonth);
996 r = ConvertRRuleByDayStringToDayOfWeekAndWeekOfMonth(pByDay, weekOfMonth, dayOfWeek);
997 SysTryReturn(NID_SCL, r == E_SUCCESS, null, E_INVALID_ARG, "[%s] Invalid argument is used. byday = %s", GetErrorMessage(E_INVALID_ARG), pByDay);
999 pRecurrence->SetWeekOfMonth(weekOfMonth);
1000 pRecurrence->SetDayOfWeek(dayOfWeek);
1002 pRecurrence->SetMonthOfYear(monthOfYear);
1007 SysLogException(NID_SCL, E_INVALID_ARG, "Invalid argument is passed. frequency = %d", srcFrequency);
1011 if (rangeType == CALENDAR_RANGE_NONE)
1013 pRecurrence->SetUntil(&DateTime::GetMaxValue());
1015 else if (rangeType == CALENDAR_RANGE_UNTIL)
1019 if (untilCalendarTime.type == CALENDAR_TIME_LOCALTIME)
1021 until.SetValue(untilCalendarTime.time.date.year, untilCalendarTime.time.date.month, untilCalendarTime.time.date.mday);
1025 until = _CalendarbookUtil::ConvertEpochTimeToDateTime(untilCalendarTime.time.utime);
1028 pRecurrence->SetUntil(&until);
1032 pRecurrence->SetCounts(count);
1034 pRecurrence->SetInterval(interval);
1038 case CALENDAR_SUNDAY:
1039 convertedWeekStart = CAL_SUNDAY;
1042 case CALENDAR_MONDAY:
1043 convertedWeekStart = CAL_MONDAY;
1047 SysLogException(NID_SCL, E_INVALID_ARG, "Invalid argument is passed. week start = %d", weekStart);
1050 pRecurrence->SetWeekStart(convertedWeekStart);
1052 calendar_record_get_str_p(eventHandle, _calendar_event.exdate, &pExDates);
1053 if (pExDates != null && strlen(pExDates) != 0)
1055 r = ConvertRRuleExDateStringToRecurrence(pExDates, *pRecurrence.get());
1056 SysTryReturn(NID_SCL, r == E_SUCCESS, null, E_INVALID_ARG, "[%s] Invalid argument is used. exdate = %s", GetErrorMessage(E_INVALID_ARG), pExDates);
1059 return pRecurrence.release();
1063 _CalEventImpl::GetLastRevisedTime(void) const
1065 long long lastModifiedTime = 0;
1066 DateTime tmpLastRevisedTime;
1068 calendar_record_get_lli(__eventRecord.GetHandle(), _calendar_event.last_modified_time, &lastModifiedTime);
1070 tmpLastRevisedTime = _CalendarbookUtil::ConvertEpochTimeToDateTime(lastModifiedTime);
1072 return tmpLastRevisedTime;
1076 _CalEventImpl::SetSubject(const String& subject)
1078 if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
1080 SysTryReturnResult(NID_SCL, subject.GetLength() <= MAX_EVENT_SUBJECT_LENGTH, E_INVALID_ARG
1081 , "The length of the value exceeds MAX_EVENT_SUBJECT_LENGTH.");
1084 std::unique_ptr<char[]> pConvertedSubject(_StringConverter::CopyToCharArrayN(subject));
1085 SysTryReturnResult(NID_SCL, pConvertedSubject != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
1087 int errorCode = calendar_record_set_str(__eventRecord.GetHandle(), _calendar_event.summary, pConvertedSubject.get());
1088 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1094 _CalEventImpl::SetDescription(const String& description)
1096 if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
1098 SysTryReturnResult(NID_SCL, description.GetLength() <= MAX_EVENT_DESCRIPTION_LENGTH, E_INVALID_ARG
1099 , "The length of the value exceeds MAX_EVENT_DESCRIPTION_LENGTH.");
1102 std::unique_ptr<char[]> pConvertedDescription(_StringConverter::CopyToCharArrayN(description));
1103 SysTryReturnResult(NID_SCL, pConvertedDescription != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
1105 int errorCode = calendar_record_set_str(__eventRecord.GetHandle(), _calendar_event.description, pConvertedDescription.get());
1106 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1112 _CalEventImpl::SetLocation(const String& location)
1114 if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
1116 SysTryReturnResult(NID_SCL, location.GetLength() <= MAX_EVENT_LOCATION_LENGTH, E_INVALID_ARG
1117 , "The length of the value exceeds MAX_EVENT_LOCATION_LENGTH.");
1120 std::unique_ptr<char[]> pConvertedLocation(_StringConverter::CopyToCharArrayN(location));
1121 SysTryReturnResult(NID_SCL, pConvertedLocation != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
1123 int errorCode = calendar_record_set_str(__eventRecord.GetHandle(), _calendar_event.location, pConvertedLocation.get());
1124 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1130 _CalEventImpl::SetStartAndEndTime(const DateTime& start, const DateTime& end)
1132 int recurrenceFrequency = 0;
1134 calendar_record_get_int(__eventRecord.GetHandle(), _calendar_event.freq, &recurrenceFrequency);
1136 SysTryReturnResult(NID_SCL, recurrenceFrequency == CALENDAR_RECURRENCE_NONE, E_INVALID_CONDITION
1137 , "The recurrence date is already set. Cannot modify the start and end date/time.");
1138 SysTryReturnResult(NID_SCL, _CalendarbookUtil::CheckValidDateTime(start), E_INVALID_ARG, "Invalid argument is used. start = %S", start.ToString().GetPointer());
1139 SysTryReturnResult(NID_SCL, _CalendarbookUtil::CheckValidDateTime(end), E_INVALID_ARG, "Invalid argument is used. end = %S", end.ToString().GetPointer());
1140 SysTryReturnResult(NID_SCL, start <= end, E_INVALID_ARG, "Invalid argument is used. The end date is earlier than the start date.");
1142 return SetStartAndEndTimeCommon(start, end);
1146 _CalEventImpl::SetStartAndEndTimeCommon(const DateTime& start, const DateTime& end)
1148 calendar_time_s startCalendarTime;
1149 calendar_time_s endCalendarTime;
1151 calendar_record_get_caltime(__eventRecord.GetHandle(), _calendar_event.start_time, &startCalendarTime);
1153 if (startCalendarTime.type == CALENDAR_TIME_LOCALTIME)
1155 startCalendarTime.time.date.year = start.GetYear();
1156 startCalendarTime.time.date.month = start.GetMonth();
1157 startCalendarTime.time.date.mday = start.GetDay();
1159 endCalendarTime.type = CALENDAR_TIME_LOCALTIME;
1160 endCalendarTime.time.date.year = end.GetYear();
1161 endCalendarTime.time.date.month = end.GetMonth();
1162 endCalendarTime.time.date.mday = end.GetDay();
1166 startCalendarTime.time.utime = _CalendarbookUtil::ConvertDateTimeToEpochTime(start);
1168 endCalendarTime.type = CALENDAR_TIME_UTIME;
1169 endCalendarTime.time.utime = _CalendarbookUtil::ConvertDateTimeToEpochTime(end);
1172 calendar_record_set_caltime(__eventRecord.GetHandle(), _calendar_event.start_time, startCalendarTime);
1173 calendar_record_set_caltime(__eventRecord.GetHandle(), _calendar_event.end_time, endCalendarTime);
1179 _CalEventImpl::SetCategory(EventCategory category)
1181 std::unique_ptr<char[]> pConvertedCategory;
1183 if (category == EVENT_CATEGORY_ANNIVERSARY)
1185 SetAllDayEvent(true);
1187 pConvertedCategory.reset(_StringConverter::CopyToCharArrayN(_EVENT_CATEGORY_ANNIVERSARY_STRING));
1188 SysTryReturnVoidResult(NID_SCL, pConvertedCategory != null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1192 pConvertedCategory.reset(_StringConverter::CopyToCharArrayN(_EVENT_CATEGORY_APPOINTMENT_STRING));
1193 SysTryReturnVoidResult(NID_SCL, pConvertedCategory != null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1196 int errorCode = calendar_record_set_str(__eventRecord.GetHandle(), _calendar_event.categories, pConvertedCategory.get());
1197 SysTryReturnVoidResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1201 _CalEventImpl::SetSensitivity(RecordSensitivity sensitivity)
1203 calendar_record_set_int(__eventRecord.GetHandle(), _calendar_event.sensitivity, _CalendarbookUtil::ConvertSensitivityToCSSensitivity(sensitivity));
1207 _CalEventImpl::SetCoordinates(double latitude, double longitude)
1209 SysTryReturnResult(NID_SCL, latitude >= _MIN_LATITUDE && latitude <= _MAX_LATITUDE, E_INVALID_ARG, "Invalid argument is used. The latitude is out of range.");
1210 SysTryReturnResult(NID_SCL, longitude >= _MIN_LONGITUDE && longitude <= _MAX_LONGITUDE, E_INVALID_ARG, "Invalid argument is used. The longitude is out of range.");
1212 calendar_record_set_double(__eventRecord.GetHandle(), _calendar_event.latitude, latitude);
1213 calendar_record_set_double(__eventRecord.GetHandle(), _calendar_event.longitude, longitude);
1219 _CalEventImpl::GetCoordinates(double& latitude, double& longitude) const
1221 calendar_record_get_double(__eventRecord.GetHandle(), _calendar_event.latitude, &latitude);
1222 calendar_record_get_double(__eventRecord.GetHandle(), _calendar_event.longitude, &longitude);
1226 _CalEventImpl::SetReminder(const Reminder* pReminder)
1228 unsigned int reminderCount = 0;
1229 calendar_record_h tmpAlarmHandle = null;
1231 calendar_record_get_child_record_count(__eventRecord.GetHandle(), _calendar_event.calendar_alarm, &reminderCount);
1233 if (pReminder != null)
1235 int convertedTimeUnit = 0;
1236 switch (pReminder->GetTimeUnit())
1238 case REMINDER_TIME_UNIT_MINUTE:
1239 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_MINUTE;
1241 case REMINDER_TIME_UNIT_HOUR:
1242 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_HOUR;
1244 case REMINDER_TIME_UNIT_DAY:
1245 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_DAY;
1247 case REMINDER_TIME_UNIT_WEEK:
1248 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_WEEK;
1254 calendar_record_h tmpAlarmHandle = null;
1255 int errorCode = CALENDAR_ERROR_NONE;
1257 if (reminderCount > 0)
1259 calendar_record_get_child_record_at_p(__eventRecord.GetHandle(), _calendar_event.calendar_alarm, 0, &tmpAlarmHandle);
1260 calendar_record_set_int(tmpAlarmHandle, _calendar_alarm.tick_unit, convertedTimeUnit);
1261 calendar_record_set_int(tmpAlarmHandle, _calendar_alarm.tick, pReminder->GetTimeOffset());
1263 std::unique_ptr<char[]> pTmpAlarmTone(_StringConverter::CopyToCharArrayN(pReminder->GetSoundFile()));
1264 SysTryReturnResult(NID_SCL, pTmpAlarmTone != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
1266 errorCode = calendar_record_set_str(tmpAlarmHandle, _calendar_alarm.tone, pTmpAlarmTone.get());
1267 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1271 std::unique_ptr<char[]> pTmpAlarmTone(_StringConverter::CopyToCharArrayN(pReminder->GetSoundFile()));
1272 SysTryReturnResult(NID_SCL, pTmpAlarmTone != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
1274 errorCode = calendar_record_create(_calendar_alarm._uri, &tmpAlarmHandle);
1275 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1277 calendar_record_set_int(tmpAlarmHandle, _calendar_alarm.tick_unit, convertedTimeUnit);
1278 calendar_record_set_int(tmpAlarmHandle, _calendar_alarm.tick, pReminder->GetTimeOffset());
1279 errorCode = calendar_record_set_str(tmpAlarmHandle, _calendar_alarm.tone, pTmpAlarmTone.get());
1280 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1282 errorCode = calendar_record_add_child_record(__eventRecord.GetHandle(), _calendar_event.calendar_alarm, tmpAlarmHandle);
1283 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1288 if (reminderCount > 0)
1290 calendar_record_get_child_record_at_p(__eventRecord.GetHandle(), _calendar_event.calendar_alarm, 0, &tmpAlarmHandle);
1291 calendar_record_remove_child_record(__eventRecord.GetHandle(), _calendar_event.calendar_alarm, tmpAlarmHandle);
1295 __reminderList.RemoveAll(true);
1296 __reminderListUpdated = false;
1302 _CalEventImpl::SetRecurrence(const Recurrence* pRecurrence)
1304 if (pRecurrence != null)
1306 result r = VerifyRecurrence(*pRecurrence);
1307 SysTryReturn(NID_SCL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1309 r = ResetStartAndEndTimeByRecurrence(*pRecurrence);
1310 SysTryReturn(NID_SCL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1312 r = ConvertRecurrenceToEventHandle(*pRecurrence, __eventRecord.GetHandle());
1313 SysTryReturn(NID_SCL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1315 std::unique_ptr<char[]> pExDates(_StringConverter::CopyToCharArrayN(ConvertRecurrenceToRRuleExDateString(*pRecurrence, IsAllDayEvent())));
1316 int errorCode = calendar_record_set_str(__eventRecord.GetHandle(), _calendar_event.exdate, pExDates.get());
1317 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1319 __pRecurrence.reset(new (std::nothrow) Recurrence(*pRecurrence));
1320 SysTryReturnResult(NID_SCL, __pRecurrence != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
1324 calendar_record_set_int(__eventRecord.GetHandle(), _calendar_event.freq, CALENDAR_RECURRENCE_NONE);
1326 __pRecurrence.reset(null);
1333 _CalEventImpl::AddReminder(const Reminder& reminder)
1335 calendar_record_h tmpAlarmHandle = null;
1337 std::unique_ptr<char[]> pTmpAlarmTone(_StringConverter::CopyToCharArrayN(reminder.GetSoundFile()));
1338 SysTryReturnResult(NID_SCL, pTmpAlarmTone != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
1340 int errorCode = calendar_record_create(_calendar_alarm._uri, &tmpAlarmHandle);
1341 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1343 int convertedTimeUnit = 0;
1345 ReminderTimeUnit timeUnit = reminder.GetTimeUnit();
1348 case REMINDER_TIME_UNIT_MINUTE:
1349 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_MINUTE;
1352 case REMINDER_TIME_UNIT_HOUR:
1353 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_HOUR;
1356 case REMINDER_TIME_UNIT_DAY:
1357 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_DAY;
1360 case REMINDER_TIME_UNIT_WEEK:
1361 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_WEEK;
1364 case REMINDER_TIME_UNIT_NONE:
1365 convertedTimeUnit = CALENDAR_ALARM_TIME_UNIT_SPECIFIC;
1372 calendar_record_set_int(tmpAlarmHandle, _calendar_alarm.tick_unit, convertedTimeUnit);
1373 calendar_record_set_int(tmpAlarmHandle, _calendar_alarm.tick, reminder.GetTimeOffset());
1374 errorCode = calendar_record_set_str(tmpAlarmHandle, _calendar_alarm.tone, pTmpAlarmTone.get());
1375 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1377 if (convertedTimeUnit == CALENDAR_ALARM_TIME_UNIT_SPECIFIC)
1379 calendar_record_set_lli(tmpAlarmHandle, _calendar_alarm.time, _CalendarbookUtil::ConvertDateTimeToEpochTime(reminder.GetAbsoluteTime()));
1382 errorCode = calendar_record_add_child_record(__eventRecord.GetHandle(), _calendar_event.calendar_alarm, tmpAlarmHandle);
1383 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1385 __reminderList.RemoveAll(true);
1386 __reminderListUpdated = false;
1392 _CalEventImpl::RemoveReminderAt(int index)
1394 calendar_record_h tmpAlarmHandle = null;
1396 calendar_record_get_child_record_at_p(__eventRecord.GetHandle(), _calendar_event.calendar_alarm, index, &tmpAlarmHandle);
1397 SysTryReturnResult(NID_SCL, tmpAlarmHandle != null, E_OUT_OF_RANGE, "The index is out of range. index = %d", index);
1399 calendar_record_remove_child_record(__eventRecord.GetHandle(), _calendar_event.calendar_alarm, tmpAlarmHandle);
1401 __reminderList.RemoveAll(true);
1402 __reminderListUpdated = false;
1408 _CalEventImpl::GetAllReminders(void) const
1412 if (__reminderListUpdated == false)
1414 result r = _CalendarbookUtil::ConvertEventAlarmsToReminderList(__eventRecord.GetHandle(), __reminderList);
1415 SysTryReturn(NID_SCL, r == E_SUCCESS, __reminderList, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1417 __reminderListUpdated = true;
1420 return __reminderList;
1424 _CalEventImpl::ConvertRecurrenceToEventHandle(const Recurrence& recurrence, calendar_record_h eventHandle) const
1426 result r = E_SUCCESS;
1428 int weekStart = CALENDAR_SUNDAY;
1429 std::unique_ptr<char[]> pByDay;
1430 std::unique_ptr<char[]> pByMonth;
1431 std::unique_ptr<char[]> pByMonthDay;
1434 String dayOfWeekString;
1435 String exDateString;
1437 switch (recurrence.GetWeekStart())
1440 weekStart = CALENDAR_SUNDAY;
1444 weekStart = CALENDAR_MONDAY;
1448 SysLogException(NID_SCL, E_INVALID_ARG, "Invalid argument is passed. week start = %d", recurrence.GetWeekStart());
1449 return E_INVALID_ARG;
1452 int errorCode = calendar_record_set_int(eventHandle, _calendar_event.wkst, weekStart);
1453 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_INVALID_ARG, "Invalid argument is passed. week start = %d", weekStart);
1455 if (recurrence.GetUntil() != null)
1457 if (*recurrence.GetUntil() == DateTime::GetMaxValue())
1459 calendar_record_set_int(eventHandle, _calendar_event.range_type, CALENDAR_RANGE_NONE);
1463 calendar_time_s startCalendarTime;
1464 calendar_time_s untilCalendarTime;
1466 calendar_record_get_caltime(eventHandle, _calendar_event.start_time, &startCalendarTime);
1467 if (startCalendarTime.type == CALENDAR_TIME_LOCALTIME)
1469 untilCalendarTime.type = CALENDAR_TIME_LOCALTIME;
1470 untilCalendarTime.time.date.year = recurrence.GetUntil()->GetYear();
1471 untilCalendarTime.time.date.month = recurrence.GetUntil()->GetMonth();
1472 untilCalendarTime.time.date.mday = recurrence.GetUntil()->GetDay();
1476 untilCalendarTime.type = CALENDAR_TIME_UTIME;
1477 untilCalendarTime.time.utime = _CalendarbookUtil::ConvertDateTimeToEpochTime(*recurrence.GetUntil());
1480 calendar_record_set_int(eventHandle, _calendar_event.range_type, CALENDAR_RANGE_UNTIL);
1481 calendar_record_set_caltime(eventHandle, _calendar_event.until_time, untilCalendarTime);
1486 calendar_record_set_int(eventHandle, _calendar_event.range_type, CALENDAR_RANGE_COUNT);
1487 calendar_record_set_int(eventHandle, _calendar_event.count, recurrence.GetCounts());
1490 calendar_record_set_int(eventHandle, _calendar_event.interval, recurrence.GetInterval());
1492 switch (recurrence.GetFrequency())
1495 calendar_record_set_int(eventHandle, _calendar_event.freq, CALENDAR_RECURRENCE_DAILY);
1499 calendar_record_set_int(eventHandle, _calendar_event.freq, CALENDAR_RECURRENCE_WEEKLY);
1501 dayOfWeek = recurrence.GetDayOfWeek();
1502 r = ConvertDayOfWeekToRRuleByDayString(dayOfWeek, 0, dayOfWeekString);
1503 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_INVALID_ARG, "Invalid argument is passed. day of week = %d", dayOfWeek);
1505 pByDay.reset(_StringConverter::CopyToCharArrayN(dayOfWeekString));
1510 calendar_record_set_int(eventHandle, _calendar_event.freq, CALENDAR_RECURRENCE_MONTHLY);
1512 if (recurrence.GetDayOfMonth() != 0)
1514 pByMonthDay.reset(_StringConverter::CopyToCharArrayN(Integer::ToString(recurrence.GetDayOfMonth())));
1518 dayOfWeek = recurrence.GetDayOfWeek();
1519 r = ConvertDayOfWeekToRRuleByDayString(dayOfWeek, recurrence.GetWeekOfMonth(), dayOfWeekString);
1520 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_INVALID_ARG, "Invalid argument is passed. day of week = %d", dayOfWeek);
1522 pByDay.reset(_StringConverter::CopyToCharArrayN(dayOfWeekString));
1528 calendar_record_set_int(eventHandle, _calendar_event.freq, CALENDAR_RECURRENCE_YEARLY);
1530 pByMonth.reset(_StringConverter::CopyToCharArrayN(Integer::ToString(recurrence.GetMonthOfYear())));
1532 if (recurrence.GetDayOfMonth() != 0)
1534 pByMonthDay.reset(_StringConverter::CopyToCharArrayN(Integer::ToString(recurrence.GetDayOfMonth())));
1538 dayOfWeek = recurrence.GetDayOfWeek();
1539 r = ConvertDayOfWeekToRRuleByDayString(dayOfWeek, recurrence.GetWeekOfMonth(), dayOfWeekString);
1540 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_INVALID_ARG, "Invalid argument is passed. day of week = %d", dayOfWeek);
1542 pByDay.reset(_StringConverter::CopyToCharArrayN(dayOfWeekString));
1548 SysLogException(NID_SCL, E_INVALID_ARG, "[%s] Invalid argument is used. frequency = %d", GetErrorMessage(E_INVALID_ARG), recurrence.GetFrequency());
1549 return E_INVALID_ARG;
1552 errorCode = calendar_record_set_str(eventHandle, _calendar_event.byday, pByDay.get());
1553 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1554 errorCode = calendar_record_set_str(eventHandle, _calendar_event.bymonth, pByMonth.get());
1555 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1556 errorCode = calendar_record_set_str(eventHandle, _calendar_event.bymonthday, pByMonthDay.get());
1557 SysTryReturnResult(NID_SCL, errorCode == CALENDAR_ERROR_NONE, E_OUT_OF_MEMORY, "Memory allocation failed.");
1563 _CalEventImpl::ConvertDayOfWeekToRRuleByDayString(int dayOfWeek, int weekOfMonth, String& byDayString) const
1565 int tmpDayOfWeek = CAL_SUNDAY;
1567 byDayString.Clear();
1568 for (int i = 0; i < _NUMBER_OF_DAYS_OF_WEEK; i++)
1570 if (dayOfWeek & tmpDayOfWeek)
1572 if (weekOfMonth != 0)
1574 byDayString.Append(weekOfMonth);
1577 switch (tmpDayOfWeek)
1580 byDayString.Append(_RECURRENCE_KEYWORD_SUNDAY);
1583 byDayString.Append(_RECURRENCE_KEYWORD_MONDAY);
1586 byDayString.Append(_RECURRENCE_KEYWORD_TUESDAY);
1589 byDayString.Append(_RECURRENCE_KEYWORD_WEDNESDAY);
1592 byDayString.Append(_RECURRENCE_KEYWORD_THURSDAY);
1595 byDayString.Append(_RECURRENCE_KEYWORD_FRIDAY);
1598 byDayString.Append(_RECURRENCE_KEYWORD_SATURDAY);
1601 byDayString.Append(_RECURRENCE_DELIMITER);
1607 byDayString.Remove(byDayString.GetLength() - 1, _RECURRENCE_DELIMITER_LENGTH);
1613 _CalEventImpl::GetCalendarId(void) const
1615 int srcCalendarbookId = 0;
1617 calendar_record_get_int(__eventRecord.GetHandle(), _calendar_event.calendar_book_id, &srcCalendarbookId);
1619 return srcCalendarbookId;
1623 _CalEventImpl::GetBaseEventId(void) const
1625 int srcBaseEventId = INVALID_RECORD_ID;
1627 calendar_record_get_int(__eventRecord.GetHandle(), _calendar_event.original_event_id, &srcBaseEventId);
1629 return srcBaseEventId;
1633 _CalEventImpl::SetOriginalCalEventId(RecordId originalEventId)
1635 __originalEventId = originalEventId;
1636 __isInstance = true;
1640 _CalEventImpl::GetAttendeeIndex(const char* pAttendeeEmail)
1642 int index = _INVALID_ATTENDEE_INDEX;
1643 unsigned int attendeeCount = 0;
1645 calendar_record_get_child_record_count(__eventRecord.GetHandle(), _calendar_event.calendar_attendee, &attendeeCount);
1647 calendar_record_h tmpAttendeeHandle = null;
1648 char* pTmpAttendeeEmail = null;
1649 for (unsigned int i = 0; i < attendeeCount; i++)
1651 calendar_record_get_child_record_at_p(__eventRecord.GetHandle(), _calendar_event.calendar_attendee, i, &tmpAttendeeHandle);
1652 calendar_record_get_str_p(tmpAttendeeHandle, _calendar_attendee.email, &pTmpAttendeeEmail);
1654 if (strcmp(pAttendeeEmail, pTmpAttendeeEmail) == 0)
1665 _CalEventImpl::VerifyRecurrence(const Recurrence& recurrence)
1667 const DateTime* pUntil = recurrence.GetUntil();
1668 RecurFrequency frequency = recurrence.GetFrequency();
1669 int durationLimit = 0;
1670 int interval = recurrence.GetInterval();
1672 DateTime startTime = GetStartTime();
1673 DateTime endTime = GetEndTime();
1674 EventCategory category = GetCategory();
1678 SysTryReturnResult(NID_SCL, startTime <= *pUntil, E_INVALID_CONDITION, "The until date of recurrence is earlier than start date.");
1681 if (_AppInfo::GetApiVersion() == _API_VERSION_2_0 && _AppInfo::IsOspCompat())
1683 if (category == EVENT_CATEGORY_ANNIVERSARY)
1685 SysTryReturnResult(NID_SCL, frequency == FREQ_YEARLY, E_TYPE_MISMATCH
1686 , "The recurrence pattern is not a yearly pattern in case of the event being an Anniversary.");
1690 if (frequency == FREQ_DAILY)
1692 durationLimit = _TERM_LIMIT_DAILY * interval;
1694 else if (frequency == FREQ_WEEKLY)
1696 SysTryReturnResult(NID_SCL, recurrence.GetDayOfWeek() != 0, E_INVALID_ARG, "Invalid argument is used. The day of week is not set.");
1697 durationLimit = _TERM_LIMIT_WEEKLY * interval;
1699 else if (frequency == FREQ_MONTHLY)
1701 SysTryReturnResult(NID_SCL, recurrence.GetDayOfMonth() != 0 || (recurrence.GetDayOfWeek() != 0 && recurrence.GetWeekOfMonth() != 0)
1702 , E_INVALID_ARG, "Invalid argument is used. The day of month or day of week/week of month is not set.");
1703 durationLimit = _TERM_LIMIT_MONTHLY * interval;
1705 else if (frequency == FREQ_YEARLY)
1707 int dayOfMonth = recurrence.GetDayOfMonth();
1708 int monthOfYear = recurrence.GetMonthOfYear();
1709 SysTryReturnResult(NID_SCL, monthOfYear != 0, E_INVALID_ARG, "Invalid argument is used. The month of year is not set.");
1710 SysTryReturnResult(NID_SCL, dayOfMonth != 0 || (recurrence.GetDayOfWeek() != 0 && recurrence.GetWeekOfMonth() != 0)
1711 , E_INVALID_ARG, "Invalid argument is used. The day of month or day of week/week of month is not set.");
1713 SysTryReturnResult(NID_SCL, monthOfYear != 2 || dayOfMonth < 30
1714 , E_INVALID_ARG, "Invalid argument is used. If the frequency is yearly, the max days of the February is less than 30.");
1715 if (dayOfMonth > 30)
1717 SysTryReturnResult(NID_SCL, monthOfYear != 4 && monthOfYear != 6 && monthOfYear != 9 && monthOfYear != 11
1718 , 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.");
1721 durationLimit = _TERM_LIMIT_YEARLY * interval;
1724 TimeSpan duration = endTime.GetTime() - startTime.GetTime();
1725 SysTryReturnResult(NID_SCL, duration.GetDays() <= durationLimit, E_INVALID_CONDITION
1726 , "The duration of the event is greater than (interval x frequency) days. duration days = %d", duration.GetDays());
1732 _CalEventImpl::ResetStartAndEndTimeByRecurrence(const Recurrence& recurrence)
1737 bool isAllDay = IsAllDayEvent();
1738 Locales::TimeZone timeZone;
1742 timeZone = GetTimeZone();
1743 startTime = timeZone.UtcTimeToWallTime(GetStartTime());
1744 endTime = timeZone.UtcTimeToWallTime(GetEndTime());
1748 startTime = GetStartTime();
1749 endTime = GetEndTime();
1752 DateTime calculatedStartTime(startTime);
1753 DateTime calculatedEndTime(endTime);
1754 RecurFrequency frequency = recurrence.GetFrequency();
1755 int interval = recurrence.GetInterval();
1756 int dayOfMonth = recurrence.GetDayOfMonth();
1757 int dayOfWeek = recurrence.GetDayOfWeek();
1758 int weekOfMonth = recurrence.GetWeekOfMonth();
1759 int monthOfYear = recurrence.GetMonthOfYear();
1760 CalDayOfWeek weekStart = recurrence.GetWeekStart();
1761 CalDayOfWeek weekEnd = CAL_SATURDAY;
1763 TimeSpan duration = endTime.GetTime() - startTime.GetTime();
1765 if (weekStart == CAL_MONDAY)
1767 weekEnd = CAL_SUNDAY;
1770 if (recurrence.GetUntil() != null)
1772 until = *(recurrence.GetUntil());
1775 until = timeZone.UtcTimeToWallTime(until);
1780 until = _CalendarbookImpl::GetMaxDateTime();
1783 CalDayOfWeek dayOfStartTime = GetDayOfWeek(startTime, timeZone);
1785 if (frequency == FREQ_WEEKLY)
1789 for (int i = 0; i < _NUMBER_OF_DAYS_OF_WEEK; i++)
1791 if ((dayOfStartTime & dayOfWeek) != 0)
1796 if ((dayOfStartTime & weekEnd) != 0)
1798 count += (interval - 1) * _NUMBER_OF_DAYS_OF_WEEK;
1801 dayOfStartTime = GetNextDayOfWeek(dayOfStartTime);
1805 result r = calculatedStartTime.AddDays(count);
1806 SysTryReturnResult(NID_SCL, !IsFailed(r), r, "[%s][Propagating]", GetErrorMessage(r));
1807 r = calculatedEndTime.AddDays(count);
1808 SysTryReturnResult(NID_SCL, !IsFailed(r), r, "[%s][Propagating]", GetErrorMessage(r));
1811 else if (frequency == FREQ_MONTHLY)
1813 if (dayOfMonth != 0)
1815 bool isDone = false;
1816 while (calculatedStartTime <= until)
1818 if (calculatedStartTime.SetValue(calculatedStartTime.GetYear(), calculatedStartTime.GetMonth(), dayOfMonth, calculatedStartTime.GetHour(), calculatedStartTime.GetMinute(), calculatedStartTime.GetSecond()) == E_SUCCESS)
1820 if (calculatedStartTime >= startTime)
1826 calculatedStartTime.AddMonths(interval);
1828 SysTryReturnResult(NID_SCL, isDone, E_INVALID_ARG, "Invalid argument is used. There is no instance of the recurrence.");
1829 calculatedEndTime = calculatedStartTime;
1830 calculatedEndTime.Add(duration);
1834 bool isDone = false;
1836 CalDayOfWeek tmpDayOfWeek = GetFirstDay(weekStart, dayOfWeek, dayCount);
1837 while (calculatedStartTime <= until)
1839 for (int i = 0; i < dayCount; i++)
1841 calculatedStartTime = GetDate(calculatedStartTime.GetYear(), calculatedStartTime.GetMonth(), weekOfMonth, tmpDayOfWeek, calculatedStartTime, timeZone);
1842 if (calculatedStartTime >= startTime)
1847 tmpDayOfWeek = GetNextDay(dayOfWeek, tmpDayOfWeek);
1853 calculatedStartTime.AddMonths(interval);
1856 SysTryReturnResult(NID_SCL, isDone, E_INVALID_ARG, "Invalid argument is used. There is no instance of the recurrence.");
1857 calculatedEndTime = calculatedStartTime;
1858 calculatedEndTime.Add(duration);
1861 else if (frequency == FREQ_YEARLY)
1863 if (dayOfMonth != 0)
1865 bool isDone = false;
1866 while (calculatedStartTime <= until)
1868 if (calculatedStartTime.SetValue(calculatedStartTime.GetYear(), monthOfYear, dayOfMonth, calculatedStartTime.GetHour(), calculatedStartTime.GetMinute(), calculatedStartTime.GetSecond()) == E_SUCCESS)
1870 if (calculatedStartTime >= startTime)
1876 calculatedStartTime.AddYears(interval);
1878 SysTryReturnResult(NID_SCL, isDone, E_INVALID_ARG, "Invalid argument is used. There is no instance of the recurrence.");
1879 calculatedEndTime = calculatedStartTime;
1880 calculatedEndTime.Add(duration);
1884 bool isDone = false;
1886 CalDayOfWeek tmpDayOfWeek = GetFirstDay(weekStart, dayOfWeek, dayCount);
1887 while (calculatedStartTime <= until)
1889 for (int i = 0; i < dayCount; i++)
1891 calculatedStartTime = GetDate(calculatedStartTime.GetYear(), monthOfYear, weekOfMonth, tmpDayOfWeek, calculatedStartTime, timeZone);
1892 if (calculatedStartTime >= startTime)
1897 tmpDayOfWeek = GetNextDay(dayOfWeek, tmpDayOfWeek);
1903 calculatedStartTime.AddYears(interval);
1906 SysTryReturnResult(NID_SCL, isDone, E_INVALID_ARG, "Invalid argument is used. There is no instance of the recurrence.");
1907 calculatedEndTime = calculatedStartTime;
1908 calculatedEndTime.Add(duration);
1914 calculatedStartTime = timeZone.WallTimeToUtcTime(calculatedStartTime);
1915 calculatedEndTime = timeZone.WallTimeToUtcTime(calculatedEndTime);
1918 SysTryReturnResult(NID_SCL, calculatedStartTime <= until, E_INVALID_ARG, "Invalid argument is used. There is no instance of the recurrence.");
1919 SysTryReturnResult(NID_SCL, calculatedEndTime <= _CalendarbookImpl::GetMaxDateTime(), E_INVALID_ARG, "Invalid argument is used. There is no instance of the recurrence.");
1921 SysLog(NID_SCL, "Reset start time : %S", calculatedStartTime.ToString().GetPointer());
1922 SetStartAndEndTimeCommon(calculatedStartTime, calculatedEndTime);
1928 _CalEventImpl::ConvertRRuleByDayStringToDayOfWeek(const String& byDay) const
1933 SysTryReturn(NID_SCL, !byDay.IsEmpty(), 0, E_INVALID_ARG, "[%s] Invalid argument is used. The byDay is empty.", GetErrorMessage(E_INVALID_ARG));
1935 String delim(_RECURRENCE_DELIMITER);
1938 StringTokenizer strTok(byDay, delim);
1939 while (strTok.HasMoreTokens())
1941 result r = strTok.GetNextToken(token);
1942 SysTryReturn(NID_SCL, r == E_SUCCESS, 0, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
1944 if (token == String(_RECURRENCE_KEYWORD_SUNDAY))
1946 dayOfWeek |= CAL_SUNDAY;
1948 else if (token == String(_RECURRENCE_KEYWORD_MONDAY))
1950 dayOfWeek |= CAL_MONDAY;
1952 else if (token == String(_RECURRENCE_KEYWORD_TUESDAY))
1954 dayOfWeek |= CAL_TUESDAY;
1956 else if (token == String(_RECURRENCE_KEYWORD_WEDNESDAY))
1958 dayOfWeek |= CAL_WEDNESDAY;
1960 else if (token == String(_RECURRENCE_KEYWORD_THURSDAY))
1962 dayOfWeek |= CAL_THURSDAY;
1964 else if (token == String(_RECURRENCE_KEYWORD_FRIDAY))
1966 dayOfWeek |= CAL_FRIDAY;
1968 else if (token == String(_RECURRENCE_KEYWORD_SATURDAY))
1970 dayOfWeek |= CAL_SATURDAY;
1974 SysLogException(NID_SCL, E_INVALID_ARG, "[%s] Invalid argument is used. byday = %S", GetErrorMessage(E_INVALID_ARG), byDay.GetPointer());
1983 _CalEventImpl::ConvertRRuleByDayStringToDayOfWeekAndWeekOfMonth(const String& byDay, int& weekOfMonth, int& dayOfWeek) const
1985 String delim(_RECURRENCE_DELIMITER);
1987 wchar_t tmpChar = 0;
1988 int tmpWeekOfMonth = 0;
1989 int weekStringStartIndex = 0;
1995 SysTryReturnResult(NID_SCL, !byDay.IsEmpty(), E_INVALID_ARG, "Invalid argument is passed. The byDay is empty.");
1997 StringTokenizer strTok(byDay, delim);
1999 while (strTok.HasMoreTokens())
2001 result r = strTok.GetNextToken(token);
2002 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_OUT_OF_MEMORY, "Memory allocation failed.");
2004 r = token.GetCharAt(_RECURRENCE_BY_DAY_FIRST_INDEX, tmpChar);
2005 if (tmpChar == _RECURRENCE_BY_DAY_CHAR_MINUS)
2007 SysTryReturnResult(NID_SCL, weekOfMonth == 0 || weekOfMonth == _MAX_WEEK_OF_MONTH
2008 , E_INVALID_ARG, "Invalid argument is passed. byday = %S", byDay.GetPointer());
2010 if (weekOfMonth == 0)
2013 r = token.GetCharAt(_RECURRENCE_BY_DAY_SECOND_INDEX, tmpChar);
2014 SysTryReturnResult(NID_SCL, tmpChar == _RECURRENCE_BY_DAY_CHAR_ONE
2015 , E_INVALID_ARG, "Invalid argument is passed. byday = %S", byDay.GetPointer());
2017 weekOfMonth = _MAX_WEEK_OF_MONTH;
2019 weekStringStartIndex = _RECURRENCE_BY_DAY_SECOND_INDEX + 1;
2021 else if (tmpChar == _RECURRENCE_BY_DAY_CHAR_PLUS)
2023 if (weekOfMonth == 0)
2026 r = token.GetCharAt(_RECURRENCE_BY_DAY_SECOND_INDEX, tmpChar);
2027 tmpWeekOfMonth = Character::ToDigit(tmpChar, Character::RADIX_DECIMAL);
2028 SysTryReturnResult(NID_SCL, tmpWeekOfMonth > 0 && tmpWeekOfMonth <= _MAX_WEEK_OF_MONTH
2029 , E_INVALID_ARG, "Invalid argument is passed. byday = %S", byDay.GetPointer());
2031 weekOfMonth = tmpWeekOfMonth;
2035 SysTryReturnResult(NID_SCL, weekOfMonth == tmpWeekOfMonth
2036 , E_INVALID_ARG, "Invalid argument is passed. byday = %S", byDay.GetPointer());
2039 weekStringStartIndex = _RECURRENCE_BY_DAY_SECOND_INDEX + 1;
2043 if (weekOfMonth == 0)
2045 tmpWeekOfMonth = Character::ToDigit(tmpChar, Character::RADIX_DECIMAL);
2046 SysTryReturnResult(NID_SCL, tmpWeekOfMonth > 0 && tmpWeekOfMonth <= _MAX_WEEK_OF_MONTH
2047 , E_INVALID_ARG, "Invalid argument is passed. byday = %S", byDay.GetPointer());
2049 weekOfMonth = tmpWeekOfMonth;
2053 SysTryReturnResult(NID_SCL, weekOfMonth == tmpWeekOfMonth
2054 , E_INVALID_ARG, "Invalid argument is passed. byday = %S", byDay.GetPointer());
2057 weekStringStartIndex = _RECURRENCE_BY_DAY_FIRST_INDEX + 1;
2060 token.SubString(weekStringStartIndex, tmpString);
2062 if (tmpString == String(_RECURRENCE_KEYWORD_SUNDAY))
2064 dayOfWeek |= CAL_SUNDAY;
2066 else if (tmpString == String(_RECURRENCE_KEYWORD_MONDAY))
2068 dayOfWeek |= CAL_MONDAY;
2070 else if (tmpString == String(_RECURRENCE_KEYWORD_TUESDAY))
2072 dayOfWeek |= CAL_TUESDAY;
2074 else if (tmpString == String(_RECURRENCE_KEYWORD_WEDNESDAY))
2076 dayOfWeek |= CAL_WEDNESDAY;
2078 else if (tmpString == String(_RECURRENCE_KEYWORD_THURSDAY))
2080 dayOfWeek |= CAL_THURSDAY;
2082 else if (tmpString == String(_RECURRENCE_KEYWORD_FRIDAY))
2084 dayOfWeek |= CAL_FRIDAY;
2086 else if (tmpString == String(_RECURRENCE_KEYWORD_SATURDAY))
2088 dayOfWeek |= CAL_SATURDAY;
2092 SysLogException(NID_SCL, E_INVALID_ARG, "[%s] Invalid argument is used. byday = %S", GetErrorMessage(E_INVALID_ARG), byDay.GetPointer());
2100 _CalEventImpl::ConvertRRuleExDateStringToRecurrence(const String& exdate, Recurrence& recurrence) const
2102 String delim(_RECURRENCE_DELIMITER);
2104 DateTime tmpDateTime;
2105 TimeZone tmpTimeZone;
2106 TimeZone utcTimeZone = TimeZone::GetGmtTimeZone();
2107 bool isDate = false;
2109 SysTryReturnResult(NID_SCL, !exdate.IsEmpty(), E_INVALID_ARG, "Invalid argument is passed. The exdate is empty.");
2111 StringTokenizer strTok(exdate, delim);
2112 while (strTok.HasMoreTokens())
2114 result r = strTok.GetNextToken(token);
2115 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_OUT_OF_MEMORY, "Memory allocation failed.");
2117 r = _CalendarbookUtil::ConvertRRuleDateTimeStringToDateTime(token, tmpDateTime, tmpTimeZone, isDate);
2118 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_INVALID_ARG, "Invalid argument is passed. exdate = %S", exdate.GetPointer());
2120 if (!isDate && tmpTimeZone != utcTimeZone)
2122 tmpDateTime = tmpTimeZone.WallTimeToUtcTime(tmpDateTime);
2125 r = recurrence.AddExceptionDate(tmpDateTime);
2126 SysTryReturnResult(NID_SCL, r == E_SUCCESS, E_INVALID_ARG, "Invalid argument is passed. exdate = %S", exdate.GetPointer());
2133 _CalEventImpl::ConvertRecurrenceToRRuleExDateString(const Recurrence& recurrence, bool isDate) const
2135 bool isNotFirst = false;
2136 String exdateString;
2138 std::unique_ptr<IList, AllElementsDeleter> pExDateList(recurrence.GetExceptionDatesN());
2140 std::unique_ptr<IEnumerator> pEnum(pExDateList->GetEnumeratorN());
2141 while (pEnum->MoveNext() == E_SUCCESS)
2143 DateTime* pDateTime = static_cast<DateTime*>(pEnum->GetCurrent());
2147 exdateString.Append(_RECURRENCE_DELIMITER);
2150 exdateString.Append(_CalendarbookUtil::ConvertDateTimeToRRuleDateTimeString(*pDateTime, isDate));
2155 return exdateString;
2159 _CalEventImpl::GetNextDayOfWeek(CalDayOfWeek currentDay)
2161 int tmpDay = currentDay;
2164 if (tmpDay > CAL_SATURDAY)
2166 tmpDay = CAL_SUNDAY;
2169 return static_cast<CalDayOfWeek>(tmpDay);
2173 _CalEventImpl::GetDate(int year, int month, int weekOfMonth, CalDayOfWeek dayOfWeek, const DateTime& time, const TimeZone& timeZone)
2177 Tizen::Locales::DayOfWeek dayOfWeekByGregorianCalendar = Tizen::Locales::DAY_OF_WEEK_UNDEFINED;
2182 dayOfWeekByGregorianCalendar = Tizen::Locales::SUNDAY;
2186 dayOfWeekByGregorianCalendar = Tizen::Locales::MONDAY;
2190 dayOfWeekByGregorianCalendar = Tizen::Locales::TUESDAY;
2194 dayOfWeekByGregorianCalendar = Tizen::Locales::WEDNESDAY;
2198 dayOfWeekByGregorianCalendar = Tizen::Locales::THURSDAY;
2202 dayOfWeekByGregorianCalendar = Tizen::Locales::FRIDAY;
2206 dayOfWeekByGregorianCalendar = Tizen::Locales::SATURDAY;
2213 std::unique_ptr<Tizen::Locales::Calendar> pGregorianCalendar(Tizen::Locales::Calendar::CreateInstanceN(timeZone, Tizen::Locales::CALENDAR_GREGORIAN));
2214 SysTryReturn(NID_SCL, pGregorianCalendar != null, DateTime(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2216 pGregorianCalendar->SetTimeField(Tizen::Locales::TIME_FIELD_YEAR, year);
2217 pGregorianCalendar->SetTimeField(Tizen::Locales::TIME_FIELD_MONTH, month);
2218 pGregorianCalendar->SetTimeField(Tizen::Locales::TIME_FIELD_DAY_OF_MONTH, 1);
2220 Tizen::Locales::DayOfWeek tmpDayOfWeek = static_cast<Tizen::Locales::DayOfWeek>(pGregorianCalendar->GetTimeField(TIME_FIELD_DAY_OF_WEEK));
2221 int maxDaysOfMonth = pGregorianCalendar->GetActualMaxTimeField(TIME_FIELD_DAY_OF_MONTH);
2222 int tmpDayOfMonth = ((_NUMBER_OF_DAYS_OF_WEEK + dayOfWeekByGregorianCalendar) - tmpDayOfWeek) % _NUMBER_OF_DAYS_OF_WEEK + 1;
2224 tmpDayOfMonth += ((weekOfMonth - 1) * _NUMBER_OF_DAYS_OF_WEEK);
2225 if (tmpDayOfMonth > maxDaysOfMonth)
2227 tmpDayOfMonth -= _NUMBER_OF_DAYS_OF_WEEK;
2230 DateTime resultTime;
2231 resultTime.SetValue(year, month, tmpDayOfMonth, time.GetHour(), time.GetMinute(), time.GetSecond());
2237 _CalEventImpl::GetDayOfWeek(const DateTime& date, const Locales::TimeZone& timeZone)
2241 CalDayOfWeek dayOfWeek = CAL_SUNDAY;
2243 std::unique_ptr<Tizen::Locales::Calendar> pGregorianCalendar(Tizen::Locales::Calendar::CreateInstanceN(timeZone, Tizen::Locales::CALENDAR_GREGORIAN));
2244 SysTryReturn(NID_SCL, pGregorianCalendar != null, dayOfWeek, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
2246 pGregorianCalendar->SetTime(date);
2247 int dayOfWeekByGregorianCalendar = pGregorianCalendar->GetTimeField(Tizen::Locales::TIME_FIELD_DAY_OF_WEEK);
2249 switch (dayOfWeekByGregorianCalendar)
2251 case Tizen::Locales::SUNDAY:
2252 dayOfWeek = CAL_SUNDAY;
2255 case Tizen::Locales::MONDAY:
2256 dayOfWeek = CAL_MONDAY;
2259 case Tizen::Locales::TUESDAY:
2260 dayOfWeek = CAL_TUESDAY;
2263 case Tizen::Locales::WEDNESDAY:
2264 dayOfWeek = CAL_WEDNESDAY;
2267 case Tizen::Locales::THURSDAY:
2268 dayOfWeek = CAL_THURSDAY;
2271 case Tizen::Locales::FRIDAY:
2272 dayOfWeek = CAL_FRIDAY;
2275 case Tizen::Locales::SATURDAY:
2276 dayOfWeek = CAL_SATURDAY;
2287 _CalEventImpl::GetFirstDay(CalDayOfWeek weekStart, int dayOfWeek, int& count)
2290 int tmpDay = weekStart;
2293 for (int i = 0; i < _NUMBER_OF_DAYS_OF_WEEK; i++)
2295 if ((tmpDay & dayOfWeek) != 0)
2305 tmpDay = GetNextDayOfWeek(static_cast<CalDayOfWeek>(tmpDay));
2308 return static_cast<CalDayOfWeek>(firstDay);
2312 _CalEventImpl::GetNextDay(int dayOfWeek, CalDayOfWeek currentDay)
2314 int tmpDay = currentDay;
2316 for (int i = 0; i < _NUMBER_OF_DAYS_OF_WEEK; i++)
2318 tmpDay = GetNextDayOfWeek(static_cast<CalDayOfWeek>(tmpDay));
2320 if ((tmpDay & dayOfWeek) != 0)
2326 return static_cast<CalDayOfWeek>(tmpDay);
2330 _CalEventImpl::SetRecordHandle(calendar_record_h eventHandle)
2332 __eventRecord.ResetHandle(eventHandle);
2336 _CalEventImpl::GetRecordHandle(void) const
2338 return __eventRecord.GetHandle();
2342 _CalEventImpl::CreateDefaultInstanceN(void)
2344 return new (std::nothrow) CalEvent();
2348 _CalEventImpl::GetInstance(CalEvent& event)
2350 return event.__pCalEventImpl;
2353 const _CalEventImpl*
2354 _CalEventImpl::GetInstance(const CalEvent& event)
2356 return event.__pCalEventImpl;