4664038c8a7cfdd0328fd3cf27854bab6f07db9c
[framework/web/wrt-plugins-tizen.git] / src / Alarm / JSAlarmAbsolute.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 <dpl/log/log.h>
20 #include <CommonsJavaScript/JSUtils.h>
21 #include <CommonsJavaScript/Converter.h>
22 #include <CommonsJavaScript/Validator.h>
23 #include <CommonsJavaScript/JSDOMExceptionFactory.h>
24
25 #include <JSWebAPIException.h>
26 #include <ArgumentValidator.h>
27
28 #include <Commons/Exception.h>
29 #include <JSTizenExceptionFactory.h>
30 #include <JSTizenException.h>
31 #include <SecurityExceptions.h>
32
33 #include "AlarmAbsolute.h"
34 #include "AlarmConverter.h"
35 #include <app.h>
36 #include <time.h>
37
38 #include "plugin_config.h"
39 #include "JSAlarmAbsolute.h"
40 #include "JSAlarmManager.h"
41
42 namespace DeviceAPI {
43 namespace Alarm {
44
45 using namespace WrtDeviceApis::Commons;
46 using namespace WrtDeviceApis::CommonsJavaScript;
47 using namespace DeviceAPI::Common;
48
49 JSClassRef JSAlarmAbsolute::m_jsClassRef = NULL;
50
51 JSClassDefinition JSAlarmAbsolute::m_jsClassInfo = {
52                 0,
53                 kJSClassAttributeNone,
54                 TIZEN_ALARM_ABSOLUTE_INTERFACE,
55                 NULL,
56                 m_property,
57                 m_function,
58                 initialize,
59                 finalize,
60                 NULL, //hasProperty,
61                 NULL, //getProperty,
62                 NULL, //setProperty,
63                 NULL, //deleteProperty,Geolocation
64                 NULL, //getPropertyNames,
65                 NULL,
66                 NULL, // constructor
67                 NULL,
68                 NULL
69 };
70
71 JSStaticFunction JSAlarmAbsolute::m_function[] = { 
72         { ALARM_FUNCTION_API_GET_NEXT_SCHEDULED_DATE, JSAlarmAbsolute::getNextScheduledDate, kJSPropertyAttributeNone },
73         { 0, 0, 0 }
74 };
75
76 JSStaticValue JSAlarmAbsolute::m_property[] = {
77         { TIZEN_ALARM_ABSOLUTE_ATTRIBUTE_ID, getId, NULL, kJSPropertyAttributeReadOnly },
78         { TIZEN_ALARM_ABSOLUTE_ATTRIBUTE_DATE, getDate, NULL, kJSPropertyAttributeReadOnly },
79         { TIZEN_ALARM_ABSOLUTE_ATTRIBUTE_PERIOD, getInterval, NULL, kJSPropertyAttributeReadOnly },
80         { TIZEN_ALARM_ABSOLUTE_ATTRIBUTE_DAYSOFTHEWEEK, getDaysOfTheWeek, NULL, kJSPropertyAttributeReadOnly },
81         { 0, 0, 0, 0 }                                                                                            
82 };
83
84 const JSClassRef JSAlarmAbsolute::getClassRef() 
85 {
86         if (!m_jsClassRef) {
87                 m_jsClassRef = JSClassCreate(&m_jsClassInfo);
88         }
89         return m_jsClassRef;
90 }
91
92 const JSClassDefinition* JSAlarmAbsolute::getClassInfo() 
93 {
94         return &m_jsClassInfo;
95 }
96
97 void JSAlarmAbsolute::initialize(JSContextRef context, JSObjectRef object) 
98 {
99 }
100 void JSAlarmAbsolute::finalize(JSObjectRef object) 
101 {
102     JSAlarmAbsolutePriv *priv = static_cast<JSAlarmAbsolutePriv*>(JSObjectGetPrivate(object));
103     if (!priv) {
104         LogError("Private object is null");
105     }
106     delete priv;
107
108 }
109
110 bool JSAlarmAbsolute::hasInstance(JSContextRef context, JSObjectRef constructor, JSValueRef possibleInstance, JSValueRef* exception)
111 {
112     return JSValueIsObjectOfClass(context, possibleInstance, getClassRef());
113 }
114
115 JSObjectRef JSAlarmAbsolute::constructor(JSContextRef ctx, JSObjectRef constructor, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
116 {
117     try {
118         AlarmAbsolutePtr priv = AlarmAbsolutePtr(new AlarmAbsolute());
119                 if (!priv) {
120                         throw TypeMismatchException("Private object is null");
121                 }
122
123                 ArgumentValidator validator(ctx, argumentCount, arguments);     
124                 time_t date = validator.toTimeT(0);
125                 struct tm *startDate = localtime(&date);
126                 mktime(startDate);
127                 
128                 priv->setDate(*startDate);
129
130                 if (argumentCount >= 2) {
131                         if (JSIsArrayValue(ctx, arguments[1])) {
132                                 std::vector<std::string> daysOfTheWeek =  validator.toStringVector(1);
133
134                 for (int i = 0; i < daysOfTheWeek.size(); i++ ) {
135                     if ( (daysOfTheWeek[i]!="SU") && (daysOfTheWeek[i]!="MO") &&
136                          (daysOfTheWeek[i]!="TU") && (daysOfTheWeek[i]!="WE") &&
137                          (daysOfTheWeek[i]!="TH") && (daysOfTheWeek[i]!="FR") &&
138                          (daysOfTheWeek[i]!="SA") ) {
139                         throw TypeMismatchException("Invalid days of the week value.");
140                     }
141                 }
142
143                 if(daysOfTheWeek.size() > 0) {
144                     priv->setByDayRecurrence(daysOfTheWeek);    
145                 }
146                         } else {
147                                 unsigned long long interval = validator.toULongLong(1);
148                                 if (!JSValueIsNull(ctx, arguments[1])) {
149                                         priv->setInterval(interval);
150                                 } else {
151                                         priv->setInterval(-1);
152                                 }
153                         }
154                 }
155
156                 return JSValueToObject(ctx, createJSObject(ctx, priv), exception);
157
158     } catch (const BasePlatformException& err) {
159                 JSObjectRef exceptionObj = JSWebAPIException::makeJSWebAPIException(ctx, err);
160                 *exception = exceptionObj;
161                 return exceptionObj;
162     }
163 }
164
165 AlarmAbsolutePtr JSAlarmAbsolute::getPrivData(JSObjectRef object)
166 {
167     JSAlarmAbsolutePriv *priv = static_cast<JSAlarmAbsolutePriv*>(JSObjectGetPrivate(object));
168     if (!priv) {
169                 throw TypeMismatchException("Private object is null");
170     }
171     AlarmAbsolutePtr result = priv->getObject();
172     if (!result) {
173                 throw TypeMismatchException("Private object is null");
174     }
175     return result;
176 }
177
178 JSValueRef JSAlarmAbsolute::createJSObject(JSContextRef context, const int id)
179 {
180     AlarmAbsolutePtr privateData = AlarmAbsolutePtr(new AlarmAbsolute());   
181     privateData->setId(id);
182     
183     JSAlarmAbsolutePriv *priv = new JSAlarmAbsolutePriv(context, privateData);
184     if (!priv) {
185                 throw TypeMismatchException("Private object is null");
186     }
187     return  JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
188 }
189
190 JSValueRef JSAlarmAbsolute::createJSObject(JSContextRef context, AlarmAbsolutePtr privateData)
191 {
192     JSAlarmAbsolutePriv *priv = new JSAlarmAbsolutePriv(context, privateData);
193     if (!priv) {
194                 throw TypeMismatchException("Private object is null");
195     }
196     return JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
197 }
198
199 JSValueRef JSAlarmAbsolute::createJSObject(JSContextRef context, struct tm date, int interval)
200 {
201     AlarmAbsolutePtr privateData = AlarmAbsolutePtr(new AlarmAbsolute());
202     privateData->setDate(date);
203
204     JSAlarmAbsolutePriv *priv = new JSAlarmAbsolutePriv(context, privateData);
205     if (!priv) {
206                 throw TypeMismatchException("Private object is null");
207     }
208     return JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
209 }
210
211 JSValueRef JSAlarmAbsolute::createJSObject(JSContextRef context, struct tm date)
212 {
213     AlarmAbsolutePtr privateData = AlarmAbsolutePtr(new AlarmAbsolute());
214     privateData->setDate(date);
215
216     JSAlarmAbsolutePriv *priv = new JSAlarmAbsolutePriv(context, privateData);
217     if (!priv) {
218                 throw TypeMismatchException("Private object is null");
219     }
220     return JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
221 }
222
223 JSValueRef JSAlarmAbsolute::getNextScheduledDate( JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef * exception)
224 {   
225         try {
226             struct tm date;
227             Converter converter(ctx);
228                 
229         AlarmAbsolutePtr privateData = getPrivData(thisObject);
230                 if (!privateData) {
231                         throw TypeMismatchException("Private object is null");
232             }
233                 
234         int id = privateData->getId(); 
235         int err = alarm_get_scheduled_date(id, &date);
236         JSValueRef result = converter.toJSValueRef(date);
237
238         if(err != ALARM_ERROR_NONE) {
239             return JSValueMakeNull(ctx);
240         }
241         return result;
242                 
243         } catch (const BasePlatformException &err) {
244         return JSWebAPIException::throwException(ctx, exception, err);
245     } catch (...) {
246         DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getAppSharedURI().");
247         return JSWebAPIException::throwException(ctx, exception, err);
248     }
249 }
250
251 JSValueRef JSAlarmAbsolute::getDate(JSContextRef ctx,
252                 JSObjectRef object,
253                 JSStringRef propertyName,
254                 JSValueRef* exception)
255 {
256     Converter converter(ctx);
257     struct tm date;
258
259         try {
260         AlarmAbsolutePtr privateData = getPrivData(object);
261                 if (!privateData) {
262                         throw TypeMismatchException("Private object is null");
263             }
264                 
265         date = privateData->getDate();
266         LogInfo("JSAlarmAbsolute Date  = " << "  Sec : " << date.tm_sec << "  Min : "<< date.tm_min
267         << "  Hour" << date.tm_hour << "Day : " << date.tm_mday << "  MON : " << date.tm_mon 
268         << "  Year : " <<  date.tm_year);
269
270         JSValueRef args[6];
271         args[0] = JSValueMakeNumber(ctx, date.tm_year + 1900);
272         args[1] = JSValueMakeNumber(ctx, date.tm_mon);
273         args[2] = JSValueMakeNumber(ctx, date.tm_mday);
274         args[3] = JSValueMakeNumber(ctx, date.tm_hour);
275         args[4] = JSValueMakeNumber(ctx, date.tm_min);
276         args[5] = JSValueMakeNumber(ctx, date.tm_sec);
277
278         JSObjectRef result = JSObjectMakeDate(ctx, 6, args, exception);
279         return result;
280     } catch (...) {
281         LogWarning("Exception: occured");
282     }
283
284         return JSValueMakeUndefined(ctx);
285 }
286
287 JSValueRef JSAlarmAbsolute::getId(JSContextRef ctx,
288                 JSObjectRef object,
289                 JSStringRef propertyName,
290                 JSValueRef* exception)
291 {
292         try {
293         AlarmAbsolutePtr privateData = getPrivData(object);
294                 if (!privateData) {
295                         throw TypeMismatchException("Private object is null");
296             }
297                 
298         Converter converter(ctx);
299         int id = privateData->getId();
300         if(id >= 0) {
301             std::string strId = converter.toString(id);
302             return converter.toJSValueRef(strId);
303         } else {
304             return JSValueMakeNull(ctx);
305         }
306         } catch (...) {
307         LogWarning("Exception: occured");
308     }
309
310         return JSValueMakeUndefined(ctx);
311 }
312
313 JSValueRef JSAlarmAbsolute::getInterval(JSContextRef ctx,
314                 JSObjectRef object,
315                 JSStringRef propertyName,
316                 JSValueRef* exception)
317 {
318         try {
319         AlarmAbsolutePtr privateData = getPrivData(object);
320         AbsoluteRecurrence::Type alarmType = privateData->getRecurrenceType();
321        
322         if(alarmType == AbsoluteRecurrence::Interval) {
323                     Converter converter(ctx);
324             int interval = privateData->getInterval();
325                         if (interval == -1 ) {
326                                 return JSValueMakeNull(ctx);
327                         } else {
328                     return converter.toJSValueRef(interval);
329                         }
330         } else {
331             return JSValueMakeNull(ctx);    
332         }
333     } catch (...) {
334         LogWarning("Exception: occured");
335     }
336
337         return JSValueMakeUndefined(ctx);
338 }
339
340 JSValueRef JSAlarmAbsolute::getDaysOfTheWeek(JSContextRef ctx,
341                 JSObjectRef object,
342                 JSStringRef propertyName,
343                 JSValueRef* exception)
344 {
345     Converter converter(ctx);
346     
347     try {
348         AlarmAbsolutePtr privateData = getPrivData(object);
349                 if (!privateData) {
350                         throw TypeMismatchException("Private object is null");
351             }
352
353         JSObjectRef jsResult = JSCreateArrayObject(ctx, 0, NULL);
354                 if (jsResult == NULL) {
355                         throw UnknownException("Could not create js array object");
356         }
357                 
358         std::vector<std::string> daysOfTheWeek = privateData->getByDayRecurrence();
359
360         if(daysOfTheWeek.size() > 0) {
361             for(unsigned int i=0; i<daysOfTheWeek.size(); i++) {
362                 JSValueRef val = converter.toJSValueRef(daysOfTheWeek.at(i));
363                 if(!JSSetArrayElement(ctx, jsResult, i, val)) {
364                                         throw UnknownException("Could not insert value into js array");
365                 }
366             }
367         }
368
369         return jsResult;
370         } catch (...) {
371         LogWarning("Exception: occured");
372     }
373
374         return JSValueMakeUndefined(ctx);
375 }
376
377 } // Alarm
378 } // TizenApis
379
380