Update change log and spec for wrt-plugins-tizen_0.4.38
[framework/web/wrt-plugins-tizen.git] / src / Calendar / CalendarConverter.cpp
1 //
2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18 #include <CommonsJavaScript/Validator.h>
19 #include <CommonsJavaScript/JSUtils.h>
20 #include "JSCalendarEvent.h"
21 #include "JSCalendarTask.h"
22 #include "JSCalendarItemProperties.h"
23 #include "JSCalendarEventId.h"
24 #include "CalendarConverter.h"
25 #include "JSCalendar.h"
26 #include "JSCalendarManager.h"
27 #include "JSCalendarAttendee.h"
28 #include "JSCalendarRecurrenceRule.h"
29 #include "JSCalendarAlarm.h"
30
31 #include <TimeUtilConverter.h>
32 #include <DurationProperties.h>
33 #include <JSSimpleCoordinates.h>
34 #include <ContactConverter.h>
35 #include <Logger.h>
36
37 using namespace WrtDeviceApis::Commons;
38 using namespace WrtDeviceApis::CommonsJavaScript;
39 using namespace DeviceAPI::Time;
40
41 namespace {
42 const int DEFAULT_EVENT_INTERVAL = 1;
43 }
44
45 namespace DeviceAPI {
46 namespace Calendar {
47
48 CalendarConverter::CalendarConverter(JSContextRef context, CalendarEvent::CalendarType calendarType) : Converter(context)
49 {
50     m_calendarType = calendarType;
51 }
52
53 CalendarConverter::~CalendarConverter()
54 {
55 }
56
57 JSValueRef CalendarConverter::toJSValueRefEvent(const CalendarEventPtr& arg)
58 {
59     return JSUtils::makeObject(m_context, JSCalendarEvent::getClassRef(), arg);
60 }
61
62 JSValueRef CalendarConverter::toJSValueRefTask(const CalendarEventPtr& arg)
63 {
64     return JSUtils::makeObject(m_context, JSCalendarTask::getClassRef(), arg);
65 }
66
67 JSValueRef CalendarConverter::toJSValueRefEventArray(const CalendarEventListPtr &arg)
68 {
69     return toJSValueRef_(*arg, &CalendarConverter::toJSValueRefEvent, this);
70 }
71
72 JSValueRef CalendarConverter::toJSValueRefTaskArray(const CalendarEventListPtr &arg)
73 {
74     return toJSValueRef_(*arg, &CalendarConverter::toJSValueRefTask, this);
75 }
76
77 JSValueRef CalendarConverter::toJSValueRefCalendar(const ICalendarPtr& arg)
78 {
79     CalendarPrivObject *priv = new CalendarPrivObject(m_context, arg);
80     return JSObjectMake(m_context, JSCalendar::getClassRef(), priv);
81 }
82
83 JSValueRef CalendarConverter::toJSValueRef(const std::vector<ICalendarPtr> &arg)
84 {
85     return toJSValueRef_(arg, &CalendarConverter::toJSValueRefCalendar, this);
86 }
87
88 JSValueRef CalendarConverter::toJSValueRefStringArray(const StringArrayPtr &arg)
89 {
90         int size = arg->size();
91
92         JSObjectRef resultObject = JSCreateArrayObject(m_context, 0, NULL);
93         if (!resultObject) {
94                 ThrowMsg(ConversionException, "Can not create an array object.");
95         }
96
97         for(int i = 0; i < size; i++) {
98                 JSValueRef jsvalue = toJSValueRef(arg->at(i));
99                 if (!JSSetArrayElement(m_context, resultObject, i, jsvalue)) {
100                         ThrowMsg(ConversionException, "Can not add an object to array.");
101                 }
102         }
103
104         return resultObject;
105 }
106
107 JSValueRef CalendarConverter::toJSValueRefNumberArray(const NumberArrayPtr &arg)
108 {
109         int size = arg->size();
110
111         JSObjectRef resultObject = JSCreateArrayObject(m_context, 0, NULL);
112         if (!resultObject) {
113                 ThrowMsg(ConversionException, "Can not create an array object.");
114         }
115
116         for(int i = 0; i < size; i++) {
117                 JSValueRef jsvalue = toJSValueRef(arg->at(i));
118                 if (!JSSetArrayElement(m_context, resultObject, i, jsvalue)) {
119                         ThrowMsg(ConversionException, "Can not add an object to array.");
120                 }
121         }
122
123         return resultObject;
124 }
125
126 JSValueRef CalendarConverter::toJSValueRefTZDateArray(const NumberArrayPtr &arg, const std::string &timeZone)
127 {
128         int size = arg->size();
129
130         JSObjectRef resultObject = JSCreateArrayObject(m_context, 0, NULL);
131         if (!resultObject) {
132                 ThrowMsg(ConversionException, "Can not create an array object.");
133         }
134
135     TimeUtilConverter timeConverter(m_context);
136         for(int i = 0; i < size; i++) {
137                 JSValueRef jsvalue = timeConverter.toJSValueRefTZDate((double)((arg->at(i))*1000.0), timeZone);
138                 if (!JSSetArrayElement(m_context, resultObject, i, jsvalue)) {
139                         ThrowMsg(ConversionException, "Can not add an object to array.");
140                 }
141         }
142
143         return resultObject;
144 }
145
146 StringArrayPtr CalendarConverter::toStringArray(const JSValueRef &jsValue)
147 {
148         StringArrayPtr result = StringArrayPtr(new StringArray());
149         if(!JSIsArrayValue(m_context, jsValue)) {
150                 LoggerW("JSValue is not an array.");
151         ThrowMsg(ConversionException, "Invalid string array type.");
152         }
153
154         JSObjectRef jsObject = toJSObjectRef(jsValue);
155     for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
156         JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
157         result->push_back(toString(element));
158     }
159     return result;
160 }
161
162 NumberArrayPtr CalendarConverter::toNumberArray(const JSValueRef &jsValue)
163 {
164         NumberArrayPtr result = NumberArrayPtr(new NumberArray());
165         if(!JSIsArrayValue(m_context, jsValue)) {
166                 LoggerW("JSValue is not an array.");
167         ThrowMsg(ConversionException, "Invalid number array type.");
168         }
169
170         JSObjectRef jsObject = toJSObjectRef(jsValue);
171     for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
172         JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
173         result->push_back((long long int) (toLongLong(element)));
174     }
175     return result;
176 }
177
178 NumberArrayPtr CalendarConverter::toTZDateArray(const JSValueRef &jsValue)
179 {
180         NumberArrayPtr result = NumberArrayPtr(new NumberArray());
181         if(!JSIsArrayValue(m_context, jsValue)) {
182                 LoggerW("JSValue is not an array.");
183         ThrowMsg(ConversionException, "Invalid TZDate array type.");
184         }
185
186     TimeUtilConverter timeConverter(m_context);
187
188         JSObjectRef jsObject = toJSObjectRef(jsValue);
189     for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
190         JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
191         result->push_back((long long int) (timeConverter.getTimeInMilliseconds(element)/1000));
192     }
193     return result;
194 }
195
196 EventAlarm::EventAlarmType CalendarConverter::toEventAlarmType(std::string alarmMethod)
197 const
198 {
199     if (!alarmMethod.compare(TIZEN_CALENDAR_PROPERTY_DISPLAY_ALARM))
200         return EventAlarm::SILENT_ALARM;
201     else if (!alarmMethod.compare(TIZEN_CALENDAR_PROPERTY_SOUND_ALARM))
202         return EventAlarm::SOUND_ALARM;
203     else
204         ThrowMsg(ConversionException, "Invalid alarm type.");
205
206     return EventAlarm::UNDEFINED_ALARM_TYPE;
207 }
208
209 std::string CalendarConverter::toTizenValue(EventAlarm::EventAlarmType abstractValue) const
210 {
211     switch (abstractValue) {
212     case EventAlarm::SILENT_ALARM:
213         return TIZEN_CALENDAR_PROPERTY_DISPLAY_ALARM;
214     case EventAlarm::SOUND_ALARM:
215         return TIZEN_CALENDAR_PROPERTY_SOUND_ALARM;
216     default:
217         break;
218     }
219     ThrowMsg(ConversionException, "Invalid alarm type");
220 }
221
222 CalendarEvent::EventStatus CalendarConverter::toEventStatus(std::string tizenValue) const
223 {
224     if(!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_TENTATIVE_STATUS))
225         return CalendarEvent::TENTATIVE_STATUS;
226     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_CONFIRMED_STATUS))
227         return CalendarEvent::CONFIRMED_STATUS;
228     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_CANCELLED_STATUS))
229         return CalendarEvent::CANCELLED_STATUS;
230     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_NEEDS_ACTION_STATUS))
231         return CalendarEvent::NEEDS_ACTION_STATUS;
232     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_IN_PROCESS_STATUS))
233         return CalendarEvent::IN_PROCESS_STATUS;
234     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_COMPLETED_STATUS))
235         return CalendarEvent::COMPLETED_STATUS;
236     else
237         ThrowMsg(ConversionException, "Invalid status type.");
238
239     return CalendarEvent::UNDEFINED_STATUS;
240 }
241
242 std::string CalendarConverter::toTizenValue(CalendarEvent::EventStatus abstractValue)
243 const
244 {
245     switch (abstractValue) {
246     case CalendarEvent::TENTATIVE_STATUS:
247         return TIZEN_CALENDAR_PROPERTY_TENTATIVE_STATUS;
248     case CalendarEvent::CONFIRMED_STATUS:
249         return TIZEN_CALENDAR_PROPERTY_CONFIRMED_STATUS;
250     case CalendarEvent::CANCELLED_STATUS:
251         return TIZEN_CALENDAR_PROPERTY_CANCELLED_STATUS;
252     case CalendarEvent::NEEDS_ACTION_STATUS:
253         return TIZEN_CALENDAR_PROPERTY_NEEDS_ACTION_STATUS;
254     case CalendarEvent::IN_PROCESS_STATUS:
255         return TIZEN_CALENDAR_PROPERTY_IN_PROCESS_STATUS;
256     case CalendarEvent::COMPLETED_STATUS:
257         return TIZEN_CALENDAR_PROPERTY_COMPLETED_STATUS;
258     default:
259         {
260             if (CalendarEvent::TASK_TYPE==m_calendarType) {
261                 return TIZEN_CALENDAR_PROPERTY_NEEDS_ACTION_STATUS;
262             } else {
263                 return TIZEN_CALENDAR_PROPERTY_CONFIRMED_STATUS;
264             }
265             break;
266         }
267     }
268 }
269
270 EventRecurrenceRule::EventRecurrence CalendarConverter::toRecurrenceFrequency(
271         std::string tizenValue) const
272 {
273     if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_DAILY_RECURRENCE))
274         return EventRecurrenceRule::DAILY_RECURRENCE;
275     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_WEEKLY_RECURRENCE))
276         return EventRecurrenceRule::WEEKLY_RECURRENCE;
277     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_MONTHLY_RECURRENCE))
278         return EventRecurrenceRule::MONTHLY_RECURRENCE;
279     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_YEARLY_RECURRENCE))
280         return EventRecurrenceRule::YEARLY_RECURRENCE;
281     else
282         ThrowMsg(ConversionException, "Invalid recurrence frequency type.");
283
284     return EventRecurrenceRule::UNDEFINED_RECURRENCE;
285 }
286
287 std::string CalendarConverter::toTizenValue(
288         EventRecurrenceRule::EventRecurrence abstractValue) const
289 {
290     switch (abstractValue) {
291     case EventRecurrenceRule::DAILY_RECURRENCE:
292         return TIZEN_CALENDAR_PROPERTY_DAILY_RECURRENCE;
293     case EventRecurrenceRule::WEEKLY_RECURRENCE:
294         return TIZEN_CALENDAR_PROPERTY_WEEKLY_RECURRENCE;
295     case EventRecurrenceRule::MONTHLY_RECURRENCE:
296         return TIZEN_CALENDAR_PROPERTY_MONTHLY_RECURRENCE;
297     case EventRecurrenceRule::YEARLY_RECURRENCE:
298         return TIZEN_CALENDAR_PROPERTY_YEARLY_RECURRENCE;
299     case EventRecurrenceRule::NO_RECURRENCE:
300     default:
301         return "";
302         break;
303     }
304 }
305
306 EventRecurrenceRulePtr CalendarConverter::toEventRecurrenceRule(JSValueRef rrule)
307 {
308     EventRecurrenceRulePtr result(new EventRecurrenceRule());
309
310     const ScopedJSStringRef frequencyStr(JSStringCreateWithUTF8CString(TIZEN_RECURRENCE_RULE_FREQUENCY));
311     const ScopedJSStringRef intervalStr(JSStringCreateWithUTF8CString(TIZEN_RECURRENCE_RULE_INTERVAL));
312     const ScopedJSStringRef untilDateStr(JSStringCreateWithUTF8CString(TIZEN_RECURRENCE_RULE_UNTIL_DATE));
313     const ScopedJSStringRef occurrenceCountStr(JSStringCreateWithUTF8CString(TIZEN_RECURRENCE_RULE_OCCURRENCE_COUNT));
314     //const ScopedJSStringRef daysOfTheMonthStr(JSStringCreateWithUTF8CString(TIZEN_RECURRENCE_RULE_DAYS_OF_THE_MONTH));
315     const ScopedJSStringRef daysOfTheWeekStr(JSStringCreateWithUTF8CString(TIZEN_RECURRENCE_RULE_DAYS_OF_THE_WEEK));
316     //const ScopedJSStringRef daysOfTheYearStr(JSStringCreateWithUTF8CString(TIZEN_RECURRENCE_RULE_DAYS_OF_THE_YEAR));
317     //const ScopedJSStringRef weeksOfTheYearStr(JSStringCreateWithUTF8CString(TIZEN_RECURRENCE_RULE_WEEKS_OF_THE_YEAR));
318     const ScopedJSStringRef setPositionsStr(JSStringCreateWithUTF8CString(TIZEN_RECURRENCE_RULE_SET_POSITIONS));
319     const ScopedJSStringRef exceptionsStr(JSStringCreateWithUTF8CString(TIZEN_RECURRENCE_RULE_EXCEPTIONS));
320
321     JSObjectRef arg = toJSObjectRef(rrule);
322
323     JSValueRef frequencyData = JSObjectGetProperty(m_context, arg, frequencyStr.get(), NULL);
324     JSValueRef intervalData = JSObjectGetProperty(m_context, arg, intervalStr.get(), NULL);
325     JSValueRef untilDateData = JSObjectGetProperty(m_context, arg, untilDateStr.get(), NULL);
326     JSValueRef occurrenceCountData = JSObjectGetProperty(m_context, arg, occurrenceCountStr.get(), NULL);
327     //JSValueRef daysOfTheMonthData = JSObjectGetProperty(m_context, arg, daysOfTheMonthStr.get(), NULL);
328     JSValueRef daysOfTheWeekData = JSObjectGetProperty(m_context, arg, daysOfTheWeekStr.get(), NULL);
329     //JSValueRef daysOfTheYearData = JSObjectGetProperty(m_context, arg, daysOfTheYearStr.get(), NULL);
330     //JSValueRef weeksOfTheYearData = JSObjectGetProperty(m_context, arg, weeksOfTheYearStr.get(), NULL);
331     JSValueRef setPositionsData = JSObjectGetProperty(m_context, arg, setPositionsStr.get(), NULL);
332     JSValueRef exceptionsData = JSObjectGetProperty(m_context, arg, exceptionsStr.get(), NULL);
333
334     if (!JSValueIsUndefined(m_context, frequencyData)) {
335         result->setFrequency(toRecurrenceFrequency(toString(frequencyData)));
336     }
337     if (!JSValueIsUndefined(m_context, intervalData)) {
338         result->setInterval(toInt(intervalData));
339     }
340     if (!JSValueIsUndefined(m_context, untilDateData)) {
341         if (!JSValueIsNull(m_context, untilDateData)) {
342             TimeUtilConverter timeUtilConverter(m_context);
343             result->setEndDate((long long int) (timeUtilConverter.getTimeInMilliseconds(untilDateData)/1000));
344             result->setTimeZone(timeUtilConverter.getPropertiesInTZDate(untilDateData).timezone);
345         } else {
346             result->setEndDate(UNDEFINED_TIME);
347         }
348     }
349     if (!JSValueIsUndefined(m_context, occurrenceCountData)) {
350         result->setOccurrenceCount(toLong(occurrenceCountData));
351     }
352     /*if (!JSValueIsUndefined(m_context, daysOfTheMonthData)) {
353         result->setDaysOfTheMonth(toVectorOfInts(daysOfTheMonthData));
354     }*/
355     if (!JSValueIsUndefined(m_context, daysOfTheWeekData)) {
356         result->setDaysOfTheWeek(toStringArray(daysOfTheWeekData));
357     }
358     /*if (!JSValueIsUndefined(m_context, daysOfTheYearData)) {
359         result->setDaysOfTheYear(toVectorOfInts(daysOfTheYearData));
360     }
361     if (!JSValueIsUndefined(m_context, weeksOfTheYearData)) {
362         result->setWeeksOfTheYear(toVectorOfInts(weeksOfTheYearData));
363     }*/
364     if (!JSValueIsUndefined(m_context, setPositionsData)) {
365         result->setSetPositions(toNumberArray(setPositionsData));
366     }
367     if (!JSValueIsUndefined(m_context, exceptionsData)) {
368         result->setExceptions(toTZDateArray(exceptionsData));
369     }
370
371     return result;
372 }
373
374 CalendarEvent::EventVisibility CalendarConverter::toEventVisibility(std::string tizenValue)
375 const
376 {
377     if(!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_PUBLIC_VISIBILITY))
378         return CalendarEvent::PUBLIC_VISIBILITY;
379     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_PRIVATE_VISIBILITY))
380         return CalendarEvent::PRIVATE_VISIBILITY;
381     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_CONFIDENTIAL_VISIBILITY))
382         return CalendarEvent::CONFIDENTIAL_VISIBILITY;
383     else
384         ThrowMsg(ConversionException, "Invalid visibility type.");
385
386     return CalendarEvent::UNDEFINED_VISIBILITY;
387 }
388
389 std::string CalendarConverter::toTizenValue(
390         CalendarEvent::EventVisibility abstractValue) const
391 {
392     switch (abstractValue) {
393     case CalendarEvent::PUBLIC_VISIBILITY:
394         return TIZEN_CALENDAR_PROPERTY_PUBLIC_VISIBILITY;
395     case CalendarEvent::PRIVATE_VISIBILITY:
396         return TIZEN_CALENDAR_PROPERTY_PRIVATE_VISIBILITY;
397     case CalendarEvent::CONFIDENTIAL_VISIBILITY:
398         return TIZEN_CALENDAR_PROPERTY_CONFIDENTIAL_VISIBILITY;
399     default:
400         break;
401     }
402
403     return TIZEN_CALENDAR_PROPERTY_PUBLIC_VISIBILITY;
404 }
405
406 CalendarEvent::EventAvailability CalendarConverter::toEventAvailability(std::string tizenValue)
407 const
408 {
409     if(!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_BUSY))
410         return CalendarEvent::BUSY_FB;
411     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_BUSY_UNAVAILABLE_FB))
412         return CalendarEvent::BUSY_UNAVAILABLE_FB;
413     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_FREE))
414         return CalendarEvent::FREE_FB;
415     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_BUSY_TENTATIVE))
416         return CalendarEvent::BUSY_TENTATIVE_FB;
417     else
418         ThrowMsg(ConversionException, "Invalid availability type.");
419
420     return CalendarEvent::UNDEFINED_AVAILABILITY;
421 }
422
423 std::string CalendarConverter::toTizenValue(
424         CalendarEvent::EventAvailability abstractValue) const
425 {
426     switch (abstractValue) {
427     case CalendarEvent::BUSY_FB:
428         return TIZEN_CALENDAR_PROPERTY_BUSY;
429     case CalendarEvent::BUSY_UNAVAILABLE_FB:
430         return TIZEN_CALENDAR_PROPERTY_BUSY_UNAVAILABLE_FB;
431     case CalendarEvent::FREE_FB:
432         return TIZEN_CALENDAR_PROPERTY_FREE;
433     case CalendarEvent::BUSY_TENTATIVE_FB:
434         return TIZEN_CALENDAR_PROPERTY_BUSY_TENTATIVE;
435     default:
436         break;
437     }
438
439     return TIZEN_CALENDAR_PROPERTY_BUSY;
440 }
441
442 EventAttendee::EventAttendeeRole CalendarConverter::toEventAttendeeRole(std::string tizenValue)
443 const
444 {
445     if(!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_REQ_PARTICIPANT_ROLE))
446         return EventAttendee::REQ_PARTICIPANT_ROLE;
447     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_OPT_PARTICIPANT_ROLE))
448         return EventAttendee::OPT_PARTICIPANT_ROLE;
449     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_NON_PARTICIPANT_ROLE))
450         return EventAttendee::NON_PARTICIPANT_ROLE;
451     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_CHAIR_ROLE))
452         return EventAttendee::CHAIR_ROLE;
453     else
454         ThrowMsg(ConversionException, "Invalid attendee role type.");
455
456     return EventAttendee::UNDEFINED_ATTENDEE_ROLE;
457 }
458
459 std::string CalendarConverter::toTizenValue(
460         EventAttendee::EventAttendeeRole abstractValue) const
461 {
462     switch (abstractValue) {
463     case EventAttendee::REQ_PARTICIPANT_ROLE:
464         return TIZEN_CALENDAR_PROPERTY_REQ_PARTICIPANT_ROLE;
465     case EventAttendee::OPT_PARTICIPANT_ROLE:
466         return TIZEN_CALENDAR_PROPERTY_OPT_PARTICIPANT_ROLE;
467     case EventAttendee::NON_PARTICIPANT_ROLE:
468         return TIZEN_CALENDAR_PROPERTY_NON_PARTICIPANT_ROLE;
469     case EventAttendee::CHAIR_ROLE:
470         return TIZEN_CALENDAR_PROPERTY_CHAIR_ROLE;
471     default:
472         break;
473     }
474     return TIZEN_CALENDAR_PROPERTY_REQ_PARTICIPANT_ROLE;
475 }
476
477 EventAttendee::EventAttendeeStatus CalendarConverter::toEventAttendeeStatus(std::string tizenValue)
478 const
479 {
480     if(!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_PENDING_STATUS))
481         return EventAttendee::PENDING_AT_STATUS;
482     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_ACCEPTED_STATUS))
483         return EventAttendee::ACCEPTED_AT_STATUS;
484     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_DECLINED_STATUS))
485         return EventAttendee::DECLINED_AT_STATUS;
486     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_TENTATIVE_STATUS))
487         return EventAttendee::TENTATIVE_AT_STATUS;
488     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_DELEGATED_STATUS))
489         return EventAttendee::DELEGATED_AT_STATUS;
490     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_COMPLETED_STATUS))
491         return EventAttendee::COMPLETED_AT_STATUS;
492     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_IN_PROCESS_STATUS))
493         return EventAttendee::IN_PROCESS_AT_STATUS;
494     else
495         ThrowMsg(ConversionException, "Invalid attendee status type.");
496
497     return EventAttendee::UNDEFINED_ATTENDEE_STATUS;
498 }
499
500 std::string CalendarConverter::toTizenValue(
501         EventAttendee::EventAttendeeStatus abstractValue) const
502 {
503     switch (abstractValue) {
504     case EventAttendee::PENDING_AT_STATUS:
505         return TIZEN_CALENDAR_PROPERTY_PENDING_STATUS;
506     case EventAttendee::ACCEPTED_AT_STATUS:
507         return TIZEN_CALENDAR_PROPERTY_ACCEPTED_STATUS;
508     case EventAttendee::DECLINED_AT_STATUS:
509         return TIZEN_CALENDAR_PROPERTY_DECLINED_STATUS;
510     case EventAttendee::TENTATIVE_AT_STATUS:
511         return TIZEN_CALENDAR_PROPERTY_TENTATIVE_STATUS;
512     case EventAttendee::DELEGATED_AT_STATUS:
513         return TIZEN_CALENDAR_PROPERTY_DELEGATED_STATUS;
514     case EventAttendee::COMPLETED_AT_STATUS:
515         return TIZEN_CALENDAR_PROPERTY_COMPLETED_STATUS;
516     case EventAttendee::IN_PROCESS_AT_STATUS:
517         return TIZEN_CALENDAR_PROPERTY_IN_PROCESS_STATUS;
518     default:
519         break;
520     }
521     return TIZEN_CALENDAR_PROPERTY_PENDING_STATUS;
522 }
523
524 EventAttendee::EventAttendeeType CalendarConverter::toEventAttendeeType(std::string tizenValue)
525 const
526 {
527     if(!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_INDIVIDUAL_TYPE))
528         return EventAttendee::INDIVIDUAL_TYPE;
529     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_GROUP_TYPE))
530         return EventAttendee::GROUP_TYPE;
531     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_RESOURCE_TYPE))
532         return EventAttendee::RESOURCE_TYPE;
533     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_ROOM_TYPE))
534         return EventAttendee::ROOM_TYPE;
535     else if (!tizenValue.compare(TIZEN_CALENDAR_PROPERTY_UNKNOWN_TYPE))
536         return EventAttendee::UNKNOWN_TYPE;
537     else
538         ThrowMsg(ConversionException, "Invalid attendee type.");
539
540     return EventAttendee::INDIVIDUAL_TYPE;
541 }
542
543 std::string CalendarConverter::toTizenValue(
544         EventAttendee::EventAttendeeType abstractValue) const
545 {
546     switch (abstractValue) {
547     case EventAttendee::INDIVIDUAL_TYPE:
548         return TIZEN_CALENDAR_PROPERTY_INDIVIDUAL_TYPE;
549     case EventAttendee::GROUP_TYPE:
550         return TIZEN_CALENDAR_PROPERTY_GROUP_TYPE;
551     case EventAttendee::RESOURCE_TYPE:
552         return TIZEN_CALENDAR_PROPERTY_RESOURCE_TYPE;
553     case EventAttendee::ROOM_TYPE:
554         return TIZEN_CALENDAR_PROPERTY_ROOM_TYPE;
555     case EventAttendee::UNKNOWN_TYPE:
556         return TIZEN_CALENDAR_PROPERTY_UNKNOWN_TYPE;
557     default:
558         break;
559     }
560
561     return TIZEN_CALENDAR_PROPERTY_INDIVIDUAL_TYPE;
562 }
563
564 JSValueRef CalendarConverter::toFunctionOrNull(const JSValueRef& arg)
565 {
566     if (Validator(m_context).isCallback(arg)) {
567         return arg;
568     } else if (!JSValueIsNull(m_context, arg)) {
569         ThrowMsg(ConversionException, "Not a function nor JS null.");
570     }
571     return NULL;
572 }
573
574 JSValueRef CalendarConverter::toFunction(const JSValueRef& arg)
575 {
576     if (Validator(m_context).isCallback(arg)) {
577         return arg;
578     }
579     ThrowMsg(ConversionException, "Not a function.");
580 }
581
582 StringArrayPtr CalendarConverter::toCategories(JSValueRef categories)
583 {
584     StringArrayPtr result(new StringArray());
585     *result = toVectorOfStrings(categories);
586     return result;
587 }
588
589 EventAttendeePtr CalendarConverter::toAttendee(JSValueRef attendee)
590 {
591     EventAttendeePtr result(new EventAttendee());
592     const ScopedJSStringRef nameStr(JSStringCreateWithUTF8CString(TIZEN_ATTENDEE_NAME));
593     const ScopedJSStringRef uriStr(JSStringCreateWithUTF8CString(TIZEN_ATTENDEE_URI));
594     const ScopedJSStringRef roleStr(JSStringCreateWithUTF8CString(TIZEN_ATTENDEE_ROLE));
595     const ScopedJSStringRef statusStr(JSStringCreateWithUTF8CString(TIZEN_ATTENDEE_STATUS));
596     const ScopedJSStringRef RSVPStr(JSStringCreateWithUTF8CString(TIZEN_ATTENDEE_RSVP));
597     const ScopedJSStringRef typeStr(JSStringCreateWithUTF8CString(TIZEN_ATTENDEE_TYPE));
598     const ScopedJSStringRef groupStr(JSStringCreateWithUTF8CString(TIZEN_ATTENDEE_GROUP));
599     const ScopedJSStringRef delegatorURIStr(JSStringCreateWithUTF8CString(TIZEN_ATTENDEE_DELEGATORURI));
600     const ScopedJSStringRef delegateURIStr(JSStringCreateWithUTF8CString(TIZEN_ATTENDEE_DELEGATEURI));
601     const ScopedJSStringRef contactRefStr(JSStringCreateWithUTF8CString(TIZEN_ATTENDEE_CONTACT_REF));
602
603     JSObjectRef arg = toJSObjectRef(attendee);
604
605     JSValueRef nameData = JSObjectGetProperty(m_context, arg, nameStr.get(), NULL);
606     JSValueRef uriData = JSObjectGetProperty(m_context, arg, uriStr.get(), NULL);
607     JSValueRef roleData = JSObjectGetProperty(m_context, arg, roleStr.get(), NULL);
608     JSValueRef statusData = JSObjectGetProperty(m_context, arg, statusStr.get(), NULL);
609     JSValueRef RSVPData = JSObjectGetProperty(m_context, arg, RSVPStr.get(), NULL);
610     JSValueRef typeData = JSObjectGetProperty(m_context, arg, typeStr.get(), NULL);
611     JSValueRef groupData = JSObjectGetProperty(m_context, arg, groupStr.get(), NULL);
612     JSValueRef delegatorURIData = JSObjectGetProperty(m_context, arg, delegatorURIStr.get(), NULL);
613     JSValueRef delegateURIData = JSObjectGetProperty(m_context, arg, delegateURIStr.get(), NULL);
614     JSValueRef contactRefData = JSObjectGetProperty(m_context, arg, contactRefStr.get(), NULL);
615
616     if (!JSValueIsUndefined(m_context, nameData)) {
617         result->setName(toString(nameData));
618     }
619     if (!JSValueIsUndefined(m_context, uriData)) {
620         result->setURI(toString(uriData));
621     }
622     if (!JSValueIsUndefined(m_context, roleData)) {
623         result->setRole(toEventAttendeeRole(toString(roleData)));
624     }
625     if (!JSValueIsUndefined(m_context, statusData)) {
626         result->setStatus(toEventAttendeeStatus(toString(statusData)));
627     }
628     if (!JSValueIsUndefined(m_context, RSVPData)) {
629         result->setRSVP(toBool(RSVPData));
630     }
631     if (!JSValueIsUndefined(m_context, typeData)) {
632         result->setType(toEventAttendeeType(toString(typeData)));
633     }
634     if (!JSValueIsUndefined(m_context, groupData)) {
635         result->setGroup(toString(groupData));
636     }
637     if (!JSValueIsUndefined(m_context, delegatorURIData)) {
638         result->setDelegatorURI(toString(delegatorURIData));
639     }
640     if (!JSValueIsUndefined(m_context, delegateURIData)) {
641         result->setDelegateURI(toString(delegateURIData));
642     }
643     if (!JSValueIsUndefined(m_context, contactRefData)) {
644         DeviceAPI::Contact::ContactConverter contactConverter(m_context);
645         result->setContactId(contactConverter.toContactRef(contactRefData)->getContactId());
646         result->setAddressBookId(contactConverter.toContactRef(contactRefData)->getAddressBookId());
647     }
648
649     return result;
650 }
651
652 EventAttendeeListPtr CalendarConverter::toVectorOfAttendeesFromDictionary(JSValueRef attendees)
653 {
654         if(!JSIsArrayValue(m_context, attendees)) {
655                 LoggerW("JSValue is not an array.");
656         ThrowMsg(ConversionException, "Invalid array type.");
657         }
658
659     EventAttendeeListPtr result(new EventAttendeeList());
660
661     JSObjectRef objArg = toJSObjectRef(attendees);
662     LoggerD("array length "<<JSGetArrayLength(m_context, objArg));
663     for (std::size_t i = 0; i < JSGetArrayLength(m_context, objArg); i++) {
664         JSValueRef element = JSGetArrayElement(m_context, objArg, i);
665         result->push_back(toAttendee(element));
666     }
667
668     return result;
669 }
670
671 EventAttendeeListPtr CalendarConverter::toVectorOfAttendeesFromReference(JSValueRef attendees)
672 {
673         if(!JSIsArrayValue(m_context, attendees)) {
674                 LoggerW("JSValue is not an array.");
675         ThrowMsg(ConversionException, "Invalid array type.");
676         }
677
678     EventAttendeeListPtr result(new EventAttendeeList());
679
680     JSObjectRef objArg = toJSObjectRef(attendees);
681     LoggerD("array length "<<JSGetArrayLength(m_context, objArg));
682     for (std::size_t i = 0; i < JSGetArrayLength(m_context, objArg); i++) {
683         JSValueRef element = JSGetArrayElement(m_context, objArg, i);
684                 if (JSValueIsObjectOfClass(m_context, element, JSCalendarAttendee::getClassRef())) {
685                 result->push_back(JSCalendarAttendee::getPrivateObject(JSValueToObject(m_context, element, NULL)));
686                 } else {
687                         LoggerD("Invalid attendee type. Skip this with index: "<<i);
688                         continue;
689                 }
690     }
691
692     return result;
693 }
694
695 EventAlarmPtr CalendarConverter::toEventAlarm(JSValueRef alarm)
696 {
697     EventAlarmPtr result(new EventAlarm());
698     const ScopedJSStringRef absoluteDateStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ALARM_ABSOLUTE_DATE));
699     const ScopedJSStringRef beforeStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ALARM_BEFORE));
700     const ScopedJSStringRef methodStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ALARM_METHOD));
701     const ScopedJSStringRef descriptionStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ALARM_DESCRIPTION));
702
703     JSObjectRef arg = toJSObjectRef(alarm);
704
705     JSValueRef absoluteDateData = JSObjectGetProperty(m_context, arg, absoluteDateStr.get(), NULL);
706     JSValueRef beforeData = JSObjectGetProperty(m_context, arg, beforeStr.get(), NULL);
707     JSValueRef methodData = JSObjectGetProperty(m_context, arg, methodStr.get(), NULL);
708     JSValueRef descriptionData = JSObjectGetProperty(m_context, arg, descriptionStr.get(), NULL);
709
710     if (!JSValueIsUndefined(m_context, absoluteDateData)) {
711         TimeUtilConverter timeConverter(m_context);
712         result->setAbsoluteDate((long long int) (timeConverter.getTimeInMilliseconds(absoluteDateData)/1000));
713     }
714     if (!JSValueIsUndefined(m_context, beforeData)) {
715         TimeUtilConverter timeConverter(m_context);
716         result->setDuration(timeConverter.getDurationProperties(beforeData));
717     }
718     if (!JSValueIsUndefined(m_context, methodData)) {
719         result->setMethod(toEventAlarmType(toString(methodData)));
720     }
721     if (!JSValueIsUndefined(m_context, descriptionData)) {
722         result->setDescription(toString(descriptionData));
723     }
724
725     return result;
726 }
727
728 EventAlarmListPtr CalendarConverter::toVectorOfEventAlarmsFromDictionary(JSValueRef alarms)
729 {
730         if(!JSIsArrayValue(m_context, alarms)) {
731                 LoggerW("JSValue is not an array.");
732         ThrowMsg(ConversionException, "Invalid array type.");
733         }
734
735     EventAlarmListPtr result(new EventAlarmList());
736
737     JSObjectRef objArg = toJSObjectRef(alarms);
738     LoggerD("array length "<<JSGetArrayLength(m_context, objArg));
739     for (std::size_t i = 0; i < JSGetArrayLength(m_context, objArg); i++) {
740         JSValueRef element = JSGetArrayElement(m_context, objArg, i);
741         result->push_back(toEventAlarm(element));
742     }
743
744     return result;
745 }
746
747 EventAlarmListPtr CalendarConverter::toVectorOfEventAlarmsFromReference(JSValueRef alarms)
748 {
749         if(!JSIsArrayValue(m_context, alarms)) {
750                 LoggerW("JSValue is not an array.");
751         ThrowMsg(ConversionException, "Invalid array type.");
752         }
753
754     EventAlarmListPtr result(new EventAlarmList());
755
756     JSObjectRef objArg = toJSObjectRef(alarms);
757     LoggerD("array length "<<JSGetArrayLength(m_context, objArg));
758     for (std::size_t i = 0; i < JSGetArrayLength(m_context, objArg); i++) {
759         JSValueRef element = JSGetArrayElement(m_context, objArg, i);
760                 if (JSValueIsObjectOfClass(m_context, element, JSCalendarAlarm::getClassRef())) {
761                 result->push_back(JSCalendarAlarm::getPrivateObject(JSValueToObject(m_context, element, NULL)));
762                 } else {
763                         LoggerD("Invalid alarm type. Skip this with index: "<<i);
764                         continue;
765                 }
766     }
767
768     return result;
769 }
770
771 CalendarEventPtr CalendarConverter::toItem(const JSValueRef value, bool updateMode)
772 {
773         CalendarEventPtr result(NULL);
774         JSObjectRef arg = toJSObjectRef(value);
775
776         if(updateMode) {
777                 LoggerD("Update mode.");
778         result = JSCalendarEvent::getPrivateObject(arg);
779         } else {
780                 LoggerD("Constructor mode.");
781             CalendarEventPtr resultPtr(new CalendarEvent());
782                 result = resultPtr;
783         }
784
785     const ScopedJSStringRef descriptionStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ITEM_DESCRIPTION));
786     const ScopedJSStringRef summaryStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ITEM_SUMMARY));
787     const ScopedJSStringRef startTimeStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ITEM_START_DATE));
788     const ScopedJSStringRef durationStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ITEM_DURATION));
789     const ScopedJSStringRef locationStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ITEM_LOCATION));
790     const ScopedJSStringRef categoriesStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ITEM_CATEGORIES));
791     const ScopedJSStringRef statusStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ITEM_STATUS));
792     const ScopedJSStringRef alarmsStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ITEM_ALARMS));
793     const ScopedJSStringRef isAllDayStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ITEM_IS_ALL_DAY));
794     const ScopedJSStringRef organizerStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ITEM_ORGANIZER));
795     const ScopedJSStringRef attendeesStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ITEM_ATTENDEES));
796     const ScopedJSStringRef geolocationStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ITEM_GEOLOCATION));
797     const ScopedJSStringRef visibilityStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ITEM_VISIBILITY));
798     const ScopedJSStringRef availabilityStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_EVENT_AVAILABILITY));
799     const ScopedJSStringRef recurrenceRuleStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_EVENT_RECURRENCE_RULE));
800     const ScopedJSStringRef priorityStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_ITEM_PRIORITY));
801     const ScopedJSStringRef endDateStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_EVENT_END_DATE));
802     const ScopedJSStringRef dueDateStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_TASK_DUE_DATE));
803     const ScopedJSStringRef completedDateStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_TASK_COMPLETED_DATE));
804     const ScopedJSStringRef progressStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_TASK_PROGRESS));
805
806     JSValueRef descriptionData = JSObjectGetProperty(m_context, arg, descriptionStr.get(), NULL);
807     JSValueRef summaryData = JSObjectGetProperty(m_context, arg, summaryStr.get(), NULL);
808     JSValueRef startTimeData = JSObjectGetProperty(m_context, arg, startTimeStr.get(), NULL);
809     JSValueRef durationData = JSObjectGetProperty(m_context, arg, durationStr.get(), NULL);
810     JSValueRef locationData = JSObjectGetProperty(m_context, arg, locationStr.get(), NULL);
811     JSValueRef categoriesData = JSObjectGetProperty(m_context, arg, categoriesStr.get(), NULL);
812     JSValueRef statusData = JSObjectGetProperty(m_context, arg, statusStr.get(), NULL);
813     JSValueRef alarmsData = JSObjectGetProperty(m_context, arg, alarmsStr.get(), NULL);
814     JSValueRef isAllDayData = JSObjectGetProperty(m_context, arg, isAllDayStr.get(), NULL);
815     JSValueRef organizerData = JSObjectGetProperty(m_context, arg, organizerStr.get(), NULL);
816     JSValueRef attendeesData = JSObjectGetProperty(m_context, arg, attendeesStr.get(), NULL);
817     JSValueRef geolocationData = JSObjectGetProperty(m_context, arg, geolocationStr.get(), NULL);
818     JSValueRef visibilityData = JSObjectGetProperty(m_context, arg, visibilityStr.get(), NULL);
819     JSValueRef availabilityData = JSObjectGetProperty(m_context, arg, availabilityStr.get(), NULL);
820     JSValueRef recurrenceRuleData = JSObjectGetProperty(m_context, arg, recurrenceRuleStr.get(), NULL);
821     JSValueRef priorityData = JSObjectGetProperty(m_context, arg, priorityStr.get(), NULL);
822     JSValueRef endDateData = JSObjectGetProperty(m_context, arg, endDateStr.get(), NULL);
823     JSValueRef dueDateData = JSObjectGetProperty(m_context, arg, dueDateStr.get(), NULL);
824     JSValueRef completedDateData = JSObjectGetProperty(m_context, arg, completedDateStr.get(), NULL);
825     JSValueRef progressData = JSObjectGetProperty(m_context, arg, progressStr.get(), NULL);
826
827     TimeUtilConverter timeUtilConverter(m_context);
828
829     if (!JSValueIsUndefined(m_context, descriptionData)) {
830         result->setDescription(toString(descriptionData));
831     }
832     if (!JSValueIsUndefined(m_context, summaryData)) {
833         result->setSubject(toString(summaryData));
834     }
835
836     //It's important to set startTime before duration to set end date
837     if (!JSValueIsUndefined(m_context, startTimeData) && !JSValueIsNull(m_context, startTimeData)) {
838         result->setStartTime((long long int) (timeUtilConverter.getTimeInMilliseconds(startTimeData)/1000));
839         result->setTimeZone(timeUtilConverter.getPropertiesInTZDate(startTimeData).timezone);
840         LoggerI("start time converted from TZDate: "<<result->getStartTime()<<", time zone: "<<result->getTimeZone());
841     } else {
842         LoggerD("Start time undefined.");
843     }
844
845     if (!JSValueIsUndefined(m_context, durationData) && !JSValueIsNull(m_context, durationData)) {
846                 DurationPropertiesPtr duration = timeUtilConverter.getDuration(durationData);
847         long long length = duration->length;
848         int unit = duration->unit;
849         LoggerD("duration length: "<<length<<", unit "<<unit);
850
851                 result->setDuration(duration);
852     }
853     if (!JSValueIsUndefined(m_context, locationData)) {
854         result->setLocation(toString(locationData));
855     }
856     if (!JSValueIsUndefined(m_context, categoriesData)) {
857         StringArrayPtr categories(new StringArray());
858         *categories = toVectorOfStrings(categoriesData);
859         result->setCategories(categories);
860     }
861
862     if (!JSValueIsUndefined(m_context, statusData)) {
863         result->setStatus(toEventStatus(toString(statusData)));
864     } else {
865         result->setStatus(CalendarEvent::CONFIRMED_STATUS);
866     }
867     if (!JSValueIsUndefined(m_context, alarmsData)) {
868         EventAlarmListPtr alarms = toVectorOfEventAlarmsFromReference(alarmsData);
869         result->setAlarms(alarms);
870     }
871     if (!JSValueIsUndefined(m_context, isAllDayData)) {
872         result->setIsAllDay(toBool(isAllDayData));
873     }
874     if (!JSValueIsUndefined(m_context, organizerData)) {
875         result->setOrganizer(toString(organizerData));
876     }
877     if (!JSValueIsUndefined(m_context, attendeesData)) {
878         EventAttendeeListPtr attendees = toVectorOfAttendeesFromReference(attendeesData);
879         result->setAttendees(attendees);
880     }
881     if (!JSValueIsUndefined(m_context, geolocationData) && !JSValueIsNull(m_context, geolocationData)) {
882             Try {
883                 DeviceAPI::Tizen::SimpleCoordinatesPtr geoLocation = DeviceAPI::Tizen::JSSimpleCoordinates::getSimpleCoordinates(m_context, geolocationData);
884                 result->setGeolocation(geoLocation);
885         } Catch(InvalidArgumentException) {
886                 ThrowMsg(ConversionException, "Wrong geolocation type.");
887                 }
888     }
889
890     if (!JSValueIsUndefined(m_context, visibilityData)) {
891         result->setVisibility(toEventVisibility(toString(visibilityData)));
892     }
893     if (!JSValueIsUndefined(m_context, availabilityData)) {
894         result->setAvailability(toEventAvailability(toString(availabilityData)));
895     }
896     if (!JSValueIsUndefined(m_context, recurrenceRuleData) && !JSValueIsNull(m_context, recurrenceRuleData)) {
897                 result->setRecurrenceRule(toEventRecurrenceRule(recurrenceRuleData));
898     }
899     if (!JSValueIsUndefined(m_context, priorityData)) {
900         result->setPriority(toTaskPriority(toString(priorityData)));
901     }
902     if (!JSValueIsUndefined(m_context, endDateData) && !JSValueIsNull(m_context, endDateData)) {
903         if( result->getTimeZone().empty() ) {
904             result->setTimeZone(timeUtilConverter.getPropertiesInTZDate(endDateData).timezone);
905         }
906         result->setEndTime((long long int) (timeUtilConverter.getTimeInMilliseconds(endDateData)/1000));
907     }
908     if (!JSValueIsUndefined(m_context, dueDateData) && !JSValueIsNull(m_context, dueDateData)) {
909         if( result->getTimeZone().empty() ) {
910             result->setTimeZone(timeUtilConverter.getPropertiesInTZDate(dueDateData).timezone);
911         }
912         result->setEndTime((long long int) (timeUtilConverter.getTimeInMilliseconds(dueDateData)/1000));
913     }
914     if (!JSValueIsUndefined(m_context, completedDateData) && !JSValueIsNull(m_context, completedDateData)) {
915         if( result->getTimeZone().empty() ) {
916             result->setTimeZone(timeUtilConverter.getPropertiesInTZDate(completedDateData).timezone);
917         }
918         result->setCompletedDate((long long int) (timeUtilConverter.getTimeInMilliseconds(completedDateData)/1000));
919     }
920     if (!JSValueIsUndefined(m_context, progressData)) {
921         result->setProgress(toInt(progressData));
922     }
923     LoggerD("timezone: "<<result->getTimeZone());
924
925     return result;
926 }
927
928 CalendarEventListPtr CalendarConverter::toVectorOfItems(JSValueRef items)
929 {
930         if(!JSIsArrayValue(m_context, items)) {
931                 LoggerW("JSValue is not an array.");
932         ThrowMsg(ConversionException, "Invalid array type.");
933         }
934
935     CalendarEventListPtr result(new CalendarEventList());
936
937     JSObjectRef objArg = toJSObjectRef(items);
938     LoggerD("array length "<<JSGetArrayLength(m_context, objArg));
939     for (std::size_t i = 0; i < JSGetArrayLength(m_context, objArg); i++) {
940         JSValueRef element = JSGetArrayElement(m_context, objArg, i);
941                 if (JSValueIsObjectOfClass(m_context, element, JSCalendarEvent::getClassRef())) {
942                 JSObjectRef arg = JSValueToObject(m_context, element, NULL);
943             result->push_back(JSCalendarEvent::getPrivateObject(arg));
944                 } else if (JSValueIsObjectOfClass(m_context, element, JSCalendarTask::getClassRef())) {
945                 JSObjectRef arg = JSValueToObject(m_context, element, NULL);
946             result->push_back(JSCalendarTask::getPrivateObject(arg));
947                 } else {
948                         LoggerD("Invalid item type. Skip this with index: "<<i);
949                         continue;
950                 }
951     }
952
953     return result;
954 }
955
956 CalendarEventListPtr CalendarConverter::toVectorOfItemsFromDictionary(JSValueRef items, bool updateMode)
957 {
958         if(!JSIsArrayValue(m_context, items)) {
959                 LoggerW("JSValue is not an array.");
960         ThrowMsg(ConversionException, "Invalid array type.");
961         }
962
963     CalendarEventListPtr result(new CalendarEventList());
964
965     JSObjectRef objArg = toJSObjectRef(items);
966     LoggerD("array length "<<JSGetArrayLength(m_context, objArg));
967     for (std::size_t i = 0; i < JSGetArrayLength(m_context, objArg); i++) {
968         result->push_back(toItem(JSGetArrayElement(m_context, objArg, i), updateMode));
969     }
970
971     return result;
972 }
973
974 EventIdPtr CalendarConverter::toEventId(JSValueRef eventId)
975 {
976     EventIdPtr result(new EventId());
977     const ScopedJSStringRef uidStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_EVENT_ID_UID));
978     const ScopedJSStringRef recurrenceIdStr(JSStringCreateWithUTF8CString(TIZEN_CALENDAR_EVENT_ID_RECURRENCEID));
979
980     JSObjectRef arg = toJSObjectRef(eventId);
981
982     JSValueRef uidData = JSObjectGetProperty(m_context, arg, uidStr.get(), NULL);
983     JSValueRef recurrenceIdData = JSObjectGetProperty(m_context, arg, recurrenceIdStr.get(), NULL);
984
985     if (!JSValueIsUndefined(m_context, uidData)) {
986         result->setUId(toString(uidData));
987     }
988     if (!JSValueIsUndefined(m_context, recurrenceIdData)) {
989         result->setRecurrenceId(toString(recurrenceIdData));
990    }
991
992     return result;
993 }
994
995 EventIdListPtr CalendarConverter::toVectorOfEventIds(JSValueRef eventIds)
996 {
997         if(!JSIsArrayValue(m_context, eventIds)) {
998                 LoggerW("JSValue is not an array.");
999         ThrowMsg(ConversionException, "Invalid array type.");
1000         }
1001
1002     EventIdListPtr result(new EventIdList());
1003
1004     JSObjectRef objArg = toJSObjectRef(eventIds);
1005     LoggerD("array length "<<JSGetArrayLength(m_context, objArg));
1006     for (std::size_t i = 0; i < JSGetArrayLength(m_context, objArg); i++) {
1007         JSValueRef element = JSGetArrayElement(m_context, objArg, i);
1008
1009                 if (JSValueIsObjectOfClass(m_context, element, JSCalendarEventId::getClassRef())) {
1010                         EventIdPtr idPtr = JSCalendarEventId::getPrivateObject(JSValueToObject(m_context, element, NULL));
1011                     idPtr->setCalendarType(CalendarEvent::EVENT_TYPE);
1012                         result->push_back(idPtr);
1013                 } else {
1014                         LoggerD("Invalid event id type. Skip this index: "<<i);
1015                         continue;
1016                 }
1017     }
1018
1019     return result;
1020 }
1021
1022 std::vector<long long int> CalendarConverter::toVectorOfTimeFromTZDate(JSValueRef dates)
1023 {
1024         if(!JSIsArrayValue(m_context, dates)) {
1025                 LoggerW("JSValue is not an array.");
1026         ThrowMsg(ConversionException, "Invalid array type.");
1027         }
1028
1029     std::vector<long long int> result;
1030     TimeUtilConverter converter(m_context);
1031
1032     JSObjectRef objArg = toJSObjectRef(dates);
1033     LoggerD("array length "<<JSGetArrayLength(m_context, objArg));
1034     for (std::size_t i = 0; i < JSGetArrayLength(m_context, objArg); i++) {
1035         JSValueRef element = JSGetArrayElement(m_context, objArg, i);
1036         result.push_back((long long int) (converter.getTimeInMilliseconds(element)/1000));
1037     }
1038
1039     return result;
1040 }
1041
1042 std::string CalendarConverter::toTizenValue(CalendarEvent::TaskPriority abstractValue) const
1043 {
1044     switch (abstractValue) {
1045     case CalendarEvent::HIGH_PRIORITY:
1046         return TIZEN_CALENDAR_PROPERTY_HIGH_PRIORITY;
1047     case CalendarEvent::MEDIUM_PRIORITY:
1048         return TIZEN_CALENDAR_PROPERTY_MEDIUM_PRIORITY;
1049     case CalendarEvent::LOW_PRIORITY:
1050         return TIZEN_CALENDAR_PROPERTY_LOW_PRIORITY;
1051     default:
1052         break;
1053     }
1054     return TIZEN_CALENDAR_PROPERTY_LOW_PRIORITY;
1055 }
1056
1057 CalendarEvent::TaskPriority CalendarConverter::toTaskPriority(std::string priority) const
1058 {
1059     if (!priority.compare(TIZEN_CALENDAR_PROPERTY_HIGH_PRIORITY))
1060         return CalendarEvent::HIGH_PRIORITY;
1061     else if (!priority.compare(TIZEN_CALENDAR_PROPERTY_MEDIUM_PRIORITY))
1062         return CalendarEvent::MEDIUM_PRIORITY;
1063     else if (!priority.compare(TIZEN_CALENDAR_PROPERTY_LOW_PRIORITY))
1064         return CalendarEvent::LOW_PRIORITY;
1065     else
1066         ThrowMsg(ConversionException, "Invalid priority type.");
1067
1068     return CalendarEvent::UNDEFINED_PRIORITY;
1069 }
1070
1071 CalendarEvent::CalendarType CalendarConverter::toCalendarType(std::string type) const
1072 {
1073     if (!type.compare(TIZEN_CALENDAR_PROPERTY_TYPE_EVENT))
1074         return CalendarEvent::EVENT_TYPE;
1075     else if (!type.compare(TIZEN_CALENDAR_PROPERTY_TYPE_TASK))
1076         return CalendarEvent::TASK_TYPE;
1077     else
1078         ThrowMsg(ConversionException, "Invalid calendar type.");
1079
1080     return CalendarEvent::UNDEFINED_TYPE;
1081 }
1082
1083 CalendarEvent::VObjectFormat CalendarConverter::toVObjectFormat(std::string format) const
1084 {
1085     if (!format.compare(TIZEN_CALENDAR_PROPERTY_VCALENDAR_20_FORMAT))
1086         return CalendarEvent::ICALENDAR_20;
1087     else if (!format.compare(TIZEN_CALENDAR_PROPERTY_VCALENDAR_10_FORMAT))
1088         return CalendarEvent::VCALENDAR_10;
1089     else
1090         ThrowMsg(ConversionException, "Invalid format type.");
1091
1092     return CalendarEvent::UNDEFINED_FORMAT;
1093 }
1094
1095 }
1096 }