Update change log and spec for wrt-plugins-tizen_0.2.84
[framework/web/wrt-plugins-tizen.git] / src / standards / Tizen / Calendar / CalendarConverter.cpp
index 5d1dda5..a98b55f 100755 (executable)
@@ -28,6 +28,9 @@
 #include "JSCalendarAttendee.h"
 #include "JSCalendarRecurrenceRule.h"
 #include "JSCalendarAlarm.h"
+#include "JSStringArray.h"
+#include "JSNumberArray.h"
+
 #include <Tizen/TimeUtil/TimeUtilConverter.h>
 #include <API/TimeUtil/DurationProperties.h>
 #include <Tizen/Tizen/JSSimpleCoordinates.h>
@@ -88,25 +91,73 @@ JSValueRef CalendarConverter::toJSValueRef(const std::vector<ICalendarPtr> &arg)
     return toJSValueRef_(arg, &CalendarConverter::toJSValueRefCalendar, this);
 }
 
-CalendarEvent::EventAlarmType CalendarConverter::toEventAlarmType(std::string alarmMethod)
+JSValueRef CalendarConverter::toJSValueRef(const StringArrayPtr &arg)
+{
+       return JSStringArray::createArray(m_context, arg);
+}
+
+JSValueRef CalendarConverter::toJSValueRef(const NumberArrayPtr &arg)
+{
+       return JSNumberArray::createArray(m_context, arg);
+}
+
+StringArrayPtr CalendarConverter::toStringArray(const JSValueRef &jsValue)
+{
+       if(JSStringArray::isObjectOfClass(m_context, jsValue))
+               return JSStringArray::getStringArray(m_context, jsValue);
+
+       if(!JSIsArrayValue(m_context, jsValue))
+               ThrowMsg(WrtDeviceApis::Commons::ConversionException, "StringArray is not array.");
+
+       StringArrayPtr result = StringArrayPtr(new StringArray());
+       JSObjectRef jsObject = toJSObjectRef(jsValue);
+    for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
+        JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
+        result->push_back(toString(element));
+    }
+    return result;
+}
+
+NumberArrayPtr CalendarConverter::toNumberArray(const JSValueRef &jsValue)
+{
+    LogDebug("entered");
+       if(JSNumberArray::isObjectOfClass(m_context, jsValue))
+               return JSNumberArray::getNumberArray(m_context, jsValue);
+
+       if(!JSIsArrayValue(m_context, jsValue))
+               ThrowMsg(WrtDeviceApis::Commons::ConversionException, "NumberArray is not array.");
+
+    TimeUtilConverter timeConverter(m_context);
+
+       NumberArrayPtr result = NumberArrayPtr(new NumberArray());
+       JSObjectRef jsObject = toJSObjectRef(jsValue);
+    for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
+        JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
+        result->push_back((long long int) (timeConverter.getTimeInMilliseconds(element)/1000));
+    }
+    LogInfo("First exception: "<<result->at(0));
+    return result;
+}
+
+EventAlarm::EventAlarmType CalendarConverter::toEventAlarmType(std::string alarmMethod)
 const
 {
     if (!alarmMethod.compare(TIZEN_CALENDAR_PROPERTY_DISPLAY_ALARM))
-        return CalendarEvent::SILENT_ALARM;
+        return EventAlarm::SILENT_ALARM;
     else if (!alarmMethod.compare(TIZEN_CALENDAR_PROPERTY_SOUND_ALARM))
-        return CalendarEvent::SOUND_ALARM;
+        return EventAlarm::SOUND_ALARM;
     else
         ThrowMsg(ConversionException, "Invalid alarm type.");
 
-    return CalendarEvent::UNDEFINED_ALARM_TYPE;
+    return EventAlarm::UNDEFINED_ALARM_TYPE;
 }
 
-std::string CalendarConverter::toTizenValue(CalendarEvent::EventAlarmType abstractValue) const
+std::string CalendarConverter::toTizenValue(EventAlarm::EventAlarmType abstractValue) const
 {
     switch (abstractValue) {
-    case CalendarEvent::SILENT_ALARM:
+    case EventAlarm::SILENT_ALARM:
         return TIZEN_CALENDAR_PROPERTY_DISPLAY_ALARM;
-    case CalendarEvent::SOUND_ALARM:
+    case EventAlarm::SOUND_ALARM:
         return TIZEN_CALENDAR_PROPERTY_SOUND_ALARM;
     default:
         break;
@@ -250,7 +301,7 @@ EventRecurrenceRulePtr CalendarConverter::toEventRecurrenceRule(JSValueRef rrule
         result->setDaysOfTheMonth(toVectorOfInts(daysOfTheMonthData));
     }*/
     if (!JSValueIsUndefined(m_context, daysOfTheWeekData)) {
-        result->setDaysOfTheWeek(toVectorOfStrings(daysOfTheWeekData));
+        result->setDaysOfTheWeek(toStringArray(daysOfTheWeekData));
     }
     /*if (!JSValueIsUndefined(m_context, daysOfTheYearData)) {
         result->setDaysOfTheYear(toVectorOfInts(daysOfTheYearData));
@@ -263,7 +314,7 @@ EventRecurrenceRulePtr CalendarConverter::toEventRecurrenceRule(JSValueRef rrule
         //result->setSetPosition(toBool(setPositionData));
     }
     if (!JSValueIsUndefined(m_context, exceptionsData)) {
-        result->setExceptions(toVectorOfTimeFromTZDate(exceptionsData));
+        result->setExceptions(toNumberArray(exceptionsData));
     }
 
     return result;
@@ -478,10 +529,10 @@ JSValueRef CalendarConverter::toFunction(const JSValueRef& arg)
     ThrowMsg(ConversionException, "Not a function.");
 }
 
-CategoryListPtr CalendarConverter::toCategories(JSValueRef categories)
+StringArrayPtr CalendarConverter::toCategories(JSValueRef categories)
 {
     LogDebug("entered");
-    CategoryListPtr result(new CategoryList());
+    StringArrayPtr result(new StringArray());
     *result = toVectorOfStrings(categories);
     return result;
 }
@@ -610,7 +661,7 @@ EventAlarmPtr CalendarConverter::toEventAlarm(JSValueRef alarm)
     }
     if (!JSValueIsUndefined(m_context, methodData)) {
         std::string method = toString(methodData);
-        std::vector<CalendarEvent::EventAlarmType> convertedMethods;
+        std::vector<EventAlarm::EventAlarmType> convertedMethods;
         convertedMethods.push_back(toEventAlarmType(method));
         result->setMethods(convertedMethods);
     }
@@ -708,20 +759,24 @@ CalendarEventPtr CalendarConverter::toEvent(const JSValueRef event)
     if (!JSValueIsUndefined(m_context, descriptionData)) {
         result->setDescription(toString(descriptionData));
     }
+
     if (!JSValueIsUndefined(m_context, summaryData)) {
         result->setSubject(toString(summaryData));
     }
+    
     //It's important to set startTime before duration to set end date
     if (!JSValueIsUndefined(m_context, startTimeData)) {
         result->setStartTime((long long int) (timeUtilConverter.getTimeInMilliseconds(startTimeData)/1000));
         result->setTimeZone(timeUtilConverter.getPropertiesInTZDate(startTimeData).timezone);
         LogInfo("start time converted from TZDate: "<<result->getStartTime()<<", time zone: "<<result->getTimeZone());
     } else {
+    
         //set default value, current local time.
         if(m_calendarType == CalendarEvent::EVENT_TYPE) {
             //result->setStartTime(std::time(NULL));
         }
     }
+    
     if (!JSValueIsUndefined(m_context, durationData)) {
         long length = timeUtilConverter.getDurationLength(durationData);
         int unit = timeUtilConverter.getDurationUnit(durationData);
@@ -745,10 +800,11 @@ CalendarEventPtr CalendarConverter::toEvent(const JSValueRef event)
         result->setLocation(toString(locationData));
     }
     if (!JSValueIsUndefined(m_context, categoriesData)) {
-        CategoryListPtr categories(new CategoryList());
+        StringArrayPtr categories(new StringArray());
         *categories = toVectorOfStrings(categoriesData);
         result->setCategories(categories);
     }
+    
     if (!JSValueIsUndefined(m_context, statusData)) {
         result->setStatus(toEventStatus(toString(statusData)));
     } else {
@@ -756,46 +812,7 @@ CalendarEventPtr CalendarConverter::toEvent(const JSValueRef event)
     }
     if (!JSValueIsUndefined(m_context, alarmsData)) {
         EventAlarmListPtr alarms = toVectorOfEventAlarmsFromReference(alarmsData);
-        std::vector<CalendarEvent::EventAlarmType> alarmsType;
-        std::vector<long> alarmsTick;
-        std::vector<std::string> alarmsDescription;
-
-        for( unsigned int i=0; i<alarms->size(); i++) {
-            EventAlarmPtr theAlarm = alarms->at(i);
-            alarmsType.push_back(theAlarm->getMethods().at(0));
-            alarmsDescription.push_back(theAlarm->getDescription());
-
-            if( 0 < theAlarm->getAbsoluteDate() ) {
-                alarmsTick.push_back(theAlarm->getAbsoluteDate()/60); // minutes only in platform.
-            } else {
-                long tick;
-                long length = theAlarm->getDuration().length;
-                switch(theAlarm->getDuration().unit) {
-                case TizenApis::Api::TimeUtil::MSECS_UNIT:
-                    tick = length/(1000*60);
-                    break;
-                case TizenApis::Api::TimeUtil::SECONDS_UNIT:
-                    tick = length/60;
-                    break;
-                case TizenApis::Api::TimeUtil::MINUTES_UNIT:
-                    tick = length;
-                    break;
-                case TizenApis::Api::TimeUtil::HOURS_UNIT:
-                    tick = length*60;
-                    break;
-                case TizenApis::Api::TimeUtil::DAYS_UNIT:
-                    tick = length*60*24;
-                    break;
-                default:
-                    ThrowMsg(ConversionException, "Wrong alarm unit type.");
-                }
-
-                alarmsTick.push_back(tick);
-            }
-        }
-        result->setAlarmsType(alarmsType);
-        result->setAlarmsTick(alarmsTick);
-        result->setAlarmsDescription(alarmsDescription);
+        result->setAlarms(alarms);
     }
     if (!JSValueIsUndefined(m_context, isAllDayData)) {
         result->setIsAllDay(toBool(isAllDayData));
@@ -826,17 +843,27 @@ CalendarEventPtr CalendarConverter::toEvent(const JSValueRef event)
         result->setPriority(toTaskPriority(toString(priorityData)));
     }
     if (!JSValueIsUndefined(m_context, endDateData)) {
+        if( result->getTimeZone().empty() ) {
+            result->setTimeZone(timeUtilConverter.getPropertiesInTZDate(endDateData).timezone);
+        }
         result->setEndTime((long long int) (timeUtilConverter.getTimeInMilliseconds(endDateData)/1000));
     }
     if (!JSValueIsUndefined(m_context, dueDateData)) {
+        if( result->getTimeZone().empty() ) {
+            result->setTimeZone(timeUtilConverter.getPropertiesInTZDate(dueDateData).timezone);
+        }
         result->setEndTime((long long int) (timeUtilConverter.getTimeInMilliseconds(dueDateData)/1000));
     }
     if (!JSValueIsUndefined(m_context, completedDateData)) {
+        if( result->getTimeZone().empty() ) {
+            result->setTimeZone(timeUtilConverter.getPropertiesInTZDate(completedDateData).timezone);
+        }
         result->setCompletedDate((long long int) (timeUtilConverter.getTimeInMilliseconds(completedDateData)/1000));
     }
     if (!JSValueIsUndefined(m_context, progressData)) {
         result->setProgress(toInt(progressData));
     }
+    LogDebug("timezone: "<<result->getTimeZone());
 
     return result;
 }