ae2d2985c6592c7095a44660d76d49a3a2dc46d9
[framework/web/wrt-plugins-tizen.git] / src / Calendar / JSCalendarRecurrenceRule.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
19 #include "JSCalendarRecurrenceRule.h"
20 #include <dpl/log/log.h>
21 #include <JSTizenException.h>
22 #include <JSTizenExceptionFactory.h>
23 #include <CommonsJavaScript/Converter.h>
24 #include "CalendarConverter.h"
25 #include <TimeUtilConverter.h>
26 #include <JSTZDate.h>
27
28
29 using namespace WrtDeviceApis::Commons;
30 using namespace WrtDeviceApis::CommonsJavaScript;
31 using namespace DeviceAPI::Common;
32 using namespace DeviceAPI::Time;
33
34 namespace DeviceAPI {
35 namespace Calendar {
36
37 JSClassDefinition JSCalendarRecurrenceRule::m_classInfo = {
38     0,
39     kJSClassAttributeNone,
40     TIZEN_INTERFACE_CALENDAR_RECURRENCE_RULE,
41     0,
42     m_property,
43     NULL, //m_function,
44     initialize,
45     finalize,
46     NULL, //hasProperty,
47     NULL, //getProperty,
48     NULL, //setProperty,
49     NULL, //deleteProperty,
50     NULL, //getPropertyNames,
51     NULL, //callAsFunction,
52     constructor,
53     NULL, //hasInstance,
54     NULL, //convertToType,
55 };
56
57 JSStaticValue JSCalendarRecurrenceRule::m_property[] = {
58     { TIZEN_RECURRENCE_RULE_FREQUENCY, getProperty, setProperty, kJSPropertyAttributeNone },
59     { TIZEN_RECURRENCE_RULE_INTERVAL, getProperty, setProperty, kJSPropertyAttributeNone },
60     { TIZEN_RECURRENCE_RULE_UNTIL_DATE, getProperty, setProperty, kJSPropertyAttributeNone },
61     { TIZEN_RECURRENCE_RULE_OCCURRENCE_COUNT, getProperty, setProperty, kJSPropertyAttributeNone },
62 //    { TIZEN_RECURRENCE_RULE_DAYS_OF_THE_MONTH, getProperty, setProperty, kJSPropertyAttributeNone },
63     { TIZEN_RECURRENCE_RULE_DAYS_OF_THE_WEEK, getProperty, setProperty, kJSPropertyAttributeNone },
64 //    { TIZEN_RECURRENCE_RULE_DAYS_OF_THE_YEAR, getProperty, setProperty, kJSPropertyAttributeNone },
65 //    { TIZEN_RECURRENCE_RULE_WEEKS_OF_THE_YEAR, getProperty, setProperty, kJSPropertyAttributeNone },
66     { TIZEN_RECURRENCE_RULE_SET_POSITIONS, getProperty, setProperty, kJSPropertyAttributeNone },
67     { TIZEN_RECURRENCE_RULE_EXCEPTIONS, getProperty, setProperty, kJSPropertyAttributeNone },
68
69     { 0, 0, 0, 0 }
70 };
71
72 JSClassRef JSCalendarRecurrenceRule::m_jsClassRef = JSClassCreate(
73         JSCalendarRecurrenceRule::getClassInfo());
74
75 const JSClassDefinition* JSCalendarRecurrenceRule::getClassInfo()
76 {
77     return &(m_classInfo);
78 }
79
80 JSClassRef JSCalendarRecurrenceRule::getClassRef()
81 {
82     if (!m_jsClassRef) {
83         m_jsClassRef = JSClassCreate(&m_classInfo);
84     }
85     return m_jsClassRef;
86 }
87
88 JSObjectRef JSCalendarRecurrenceRule::createJSCalendarRecurrenceRule(JSContextRef context, EventRecurrenceRulePtr rule)
89 {
90     RecurrenceRulePrivateObject *priv = new RecurrenceRulePrivateObject(context, rule);
91     return JSObjectMake(context, getClassRef(), priv);
92 }
93
94 void JSCalendarRecurrenceRule::initialize(JSContextRef context, JSObjectRef object)
95 {
96     if (!JSObjectGetPrivate(object)) {
97         LogDebug("Create calendar rrule private object.");
98         EventRecurrenceRulePtr rrule( new EventRecurrenceRule() );
99         RecurrenceRulePrivateObject *priv = new RecurrenceRulePrivateObject(context, rrule);
100         if (!JSObjectSetPrivate(object, static_cast<void*>(priv))) {
101             delete priv;
102         }
103     } else {
104         LogDebug("Private object already set.");
105     }
106 }
107
108 void JSCalendarRecurrenceRule::finalize(JSObjectRef object)
109 {
110     RecurrenceRulePrivateObject* priv = static_cast<RecurrenceRulePrivateObject*>(JSObjectGetPrivate(object));
111     if (priv) {
112         delete priv;
113         JSObjectSetPrivate(object, NULL);
114     }
115 }
116
117 EventRecurrenceRulePtr JSCalendarRecurrenceRule::getPrivateObject(JSObjectRef object)
118 {
119     RecurrenceRulePrivateObject *priv =
120         static_cast<RecurrenceRulePrivateObject*>(JSObjectGetPrivate(object));
121     if (!priv) {
122         ThrowMsg(NullPointerException, "Private object is null.");
123     }
124     EventRecurrenceRulePtr result = priv->getObject();
125     if (!result) {
126         ThrowMsg(NullPointerException, "Private object is null.");
127     }
128     return result;
129 }
130
131 void JSCalendarRecurrenceRule::setPrivateObject(const EventRecurrenceRulePtr &rrule,
132         JSContextRef ctx,
133         const JSObjectRef object)
134 {
135     Try
136     {
137         RecurrenceRulePrivateObject *priv =
138             static_cast<RecurrenceRulePrivateObject*>(JSObjectGetPrivate(object));
139         delete priv;
140         priv = new RecurrenceRulePrivateObject(ctx, rrule);
141         if (!JSObjectSetPrivate(object, static_cast<void*>(priv))) {
142             delete priv;
143         }
144     }
145     Catch(Exception)
146     {
147         LogError("Error during replacing rrule object.");
148     }
149 }
150
151 JSObjectRef JSCalendarRecurrenceRule::constructor(JSContextRef context,
152     JSObjectRef constructor,
153     size_t argumentCount,
154     const JSValueRef arguments[],
155     JSValueRef* exception)
156 {
157     Try
158     {
159         CalendarConverter converter(context);
160         EventRecurrenceRulePtr rrule;
161
162         if (argumentCount==0) {
163             EventRecurrenceRulePtr result( new EventRecurrenceRule());
164             rrule = result;
165         } else if (argumentCount==1) {
166             EventRecurrenceRulePtr result( new EventRecurrenceRule());
167             rrule = result;
168             rrule->setFrequency(converter.toRecurrenceFrequency(converter.toString(arguments[0])));
169         } else if (argumentCount>=2) {
170             if (JSValueIsNull(context, arguments[1]) || JSValueIsUndefined(context, arguments[1])) {
171                 EventRecurrenceRulePtr result( new EventRecurrenceRule());
172                 rrule = result;
173             } else {
174                 if (!JSValueIsObject(context, arguments[1])) {
175                     ThrowMsg(ConversionException, "Wrong second parameter type.");
176                 }
177
178                 rrule = converter.toEventRecurrenceRule(arguments[1]);
179                 if (!rrule) {
180                     ThrowMsg(ConversionException, "Parameter conversion failed.");
181                 }
182             }
183             rrule->setFrequency(converter.toRecurrenceFrequency(converter.toString(arguments[0])));
184         }
185
186         return createJSCalendarRecurrenceRule(context, rrule);
187     }
188     Catch(UnsupportedException)
189     {
190         LogWarning("Exception: "<<_rethrown_exception.GetMessage());
191         *exception = JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::NOT_SUPPORTED_ERROR, _rethrown_exception.GetMessage());
192     }
193     Catch(InvalidArgumentException)
194     {
195         LogWarning("Exception: "<<_rethrown_exception.GetMessage());
196         *exception = JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::INVALID_VALUES_ERROR, _rethrown_exception.GetMessage());
197     }
198     Catch(ConversionException)
199     {
200         LogWarning("Exception: "<<_rethrown_exception.GetMessage());
201         *exception = JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::TYPE_MISMATCH_ERROR, _rethrown_exception.GetMessage());
202     }
203     Catch(Exception)
204     {
205         LogWarning("Exception: "<<_rethrown_exception.GetMessage());
206         *exception = JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::UNKNOWN_ERROR, _rethrown_exception.GetMessage());
207     }
208
209     return NULL;
210 }
211
212 JSValueRef JSCalendarRecurrenceRule::getProperty(JSContextRef context,
213         JSObjectRef object,
214         JSStringRef propertyName,
215         JSValueRef* exception)
216 {
217     CalendarConverter converter(context);
218     TimeUtilConverter timeConverter(context);
219     Try
220     {
221         RecurrenceRulePrivateObject* priv =
222             static_cast<RecurrenceRulePrivateObject*>(JSObjectGetPrivate(object));
223         if (!priv) {
224             ThrowMsg(NullPointerException, "Private object is NULL.");
225         }
226         EventRecurrenceRulePtr rrule = priv->getObject();
227         if (!rrule) {
228             ThrowMsg(NullPointerException, "recurrenceRule is NULL.");
229         }
230
231         if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_FREQUENCY)) {
232             return converter.toJSValueRef(converter.toTizenValue(rrule->getFrequency()));
233         } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_INTERVAL)) {
234             return converter.toJSValueRef(rrule->getInterval());
235         } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_UNTIL_DATE)) {
236             if (UNDEFINED_TIME==rrule->getEndDate()) {
237                 return JSValueMakeNull(context);
238             } else {
239                 return timeConverter.toJSValueRefTZDate((double)(rrule->getEndDate()*1000.0), rrule->getTimeZone());
240             }
241         } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_OCCURRENCE_COUNT)) {
242             return converter.toJSValueRefLong(rrule->getOccurrenceCount());
243         //} else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_DAYS_OF_THE_MONTH)) {
244             //return converter.toJSValueRef(rrule->getDaysOfTheMonth());
245         } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_DAYS_OF_THE_WEEK)) {
246            return converter.toJSValueRef(rrule->getDaysOfTheWeek());
247         //} else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_DAYS_OF_THE_YEAR)) {
248             //return converter.toJSValueRef(rrule->getDaysOfTheYear());
249         //} else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_WEEKS_OF_THE_YEAR)) {
250             //return converter.toJSValueRef(rrule->getWeeksOfTheYear());
251         } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_SET_POSITIONS)) {
252             return converter.toJSValueRefNumberArray(rrule->getSetPositions());
253         } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_EXCEPTIONS)) {
254             return converter.toJSValueRefTZDateArray(rrule->getExceptions());
255         }
256     }
257     Catch(Exception)
258     {
259                 LogWarning("Exception: "<<_rethrown_exception.GetMessage());
260     }
261     return JSValueMakeUndefined(context);
262 }
263
264 bool JSCalendarRecurrenceRule::setProperty(JSContextRef context,
265         JSObjectRef object,
266         JSStringRef propertyName,
267         JSValueRef value,
268         JSValueRef* exception)
269 {
270     CalendarConverter converter(context);
271     Try
272     {
273         RecurrenceRulePrivateObject* priv =
274             static_cast<RecurrenceRulePrivateObject*>(JSObjectGetPrivate(object));
275         if (!priv) {
276             ThrowMsg(NullPointerException, "Private object is NULL.");
277         }
278         EventRecurrenceRulePtr rrule = priv->getObject();
279
280         if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_FREQUENCY)) {
281             std::string frequency = converter.toString(value);
282             rrule->setFrequency(converter.toRecurrenceFrequency(frequency));
283             return true;
284         } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_INTERVAL)) {
285             int interval = converter.toInt(value);
286             rrule->setInterval(interval);
287             return true;
288         } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_UNTIL_DATE)) {
289             if (!JSValueIsObjectOfClass(context, value, JSTZDate::getClassRef())) {
290                 ThrowMsg(ConversionException, "Wrong untilDate type.");
291             }
292             TimeUtilConverter timeConverter(context);
293             long long int untilDate = (long long int) (timeConverter.getTimeInMilliseconds(value)/1000);
294             rrule->setEndDate(untilDate);
295 /*
296             if( rrule->getTimeZone().empty() ) {
297                 std::string timeZone = timeConverter.getPropertiesInTZDate(value).timezone;
298                 rrule->setTimeZone(timeZone);
299             }
300 */
301             return true;
302         } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_OCCURRENCE_COUNT)) {
303             long occurrenceCount = converter.toLong(value);
304             rrule->setOccurrenceCount(occurrenceCount);
305             return true;
306         /*} else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_DAYS_OF_THE_MONTH)) {
307             std::vector<int> daysOfTheMonth = converter.toVectorOfInts(value);
308             rrule->setDaysOfTheMonth(daysOfTheMonth);
309             return true;*/
310         } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_DAYS_OF_THE_WEEK)) {
311             rrule->setDaysOfTheWeek(converter.toStringArray(value));
312             return true;
313         /*} else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_DAYS_OF_THE_YEAR)) {
314             std::vector<int> daysOfTheYear = converter.toVectorOfInts(value);
315             rrule->setDaysOfTheYear(daysOfTheYear);
316             return true;
317         } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_WEEKS_OF_THE_YEAR)) {
318             std::vector<int> weekOfTheYear = converter.toVectorOfInts(value);
319             rrule->setWeeksOfTheYear(weekOfTheYear);
320             return true;*/
321         } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_SET_POSITIONS)) {
322             rrule->setSetPositions(converter.toNumberArray(value));
323             return true;
324         } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_RECURRENCE_RULE_EXCEPTIONS)) {
325             rrule->setExceptions(converter.toTZDateArray(value));
326             return true;
327         }
328     }
329     Catch(Exception)
330     {
331                 LogWarning("Exception: "<<_rethrown_exception.GetMessage());
332     }
333     JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR);
334     return false;
335 }
336
337 }
338 }