2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
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
9 // http://www.apache.org/licenses/LICENSE-2.0
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.
18 #include <CommonsJavaScript/JSUtils.h>
19 #include <CommonsJavaScript/Converter.h>
20 #include <CommonsJavaScript/Validator.h>
21 #include <CommonsJavaScript/JSDOMExceptionFactory.h>
23 #include <JSWebAPIException.h>
24 #include <ArgumentValidator.h>
26 #include <Commons/Exception.h>
27 #include <JSTizenExceptionFactory.h>
28 #include <JSTizenException.h>
29 #include <SecurityExceptions.h>
31 #include "AlarmAbsolute.h"
32 #include "AlarmConverter.h"
37 #include "plugin_config.h"
38 #include "JSAlarmAbsolute.h"
39 #include "JSAlarmManager.h"
45 using namespace WrtDeviceApis::Commons;
46 using namespace WrtDeviceApis::CommonsJavaScript;
47 using namespace DeviceAPI::Common;
49 JSClassRef JSAlarmAbsolute::m_jsClassRef = NULL;
51 JSClassDefinition JSAlarmAbsolute::m_jsClassInfo = {
53 kJSClassAttributeNone,
54 TIZEN_ALARM_ABSOLUTE_INTERFACE,
63 NULL, //deleteProperty,Geolocation
64 NULL, //getPropertyNames,
71 JSStaticFunction JSAlarmAbsolute::m_function[] = {
72 { ALARM_FUNCTION_API_GET_NEXT_SCHEDULED_DATE, JSAlarmAbsolute::getNextScheduledDate, kJSPropertyAttributeNone },
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 },
84 const JSClassRef JSAlarmAbsolute::getClassRef()
87 m_jsClassRef = JSClassCreate(&m_jsClassInfo);
92 const JSClassDefinition* JSAlarmAbsolute::getClassInfo()
94 return &m_jsClassInfo;
97 void JSAlarmAbsolute::initialize(JSContextRef context, JSObjectRef object)
100 void JSAlarmAbsolute::finalize(JSObjectRef object)
102 JSAlarmAbsolutePriv *priv = static_cast<JSAlarmAbsolutePriv*>(JSObjectGetPrivate(object));
104 LoggerE("Private object is null");
110 bool JSAlarmAbsolute::hasInstance(JSContextRef context, JSObjectRef constructor, JSValueRef possibleInstance, JSValueRef* exception)
112 return JSValueIsObjectOfClass(context, possibleInstance, getClassRef());
115 JSObjectRef JSAlarmAbsolute::constructor(JSContextRef ctx, JSObjectRef constructor, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
118 AlarmAbsolutePtr priv = AlarmAbsolutePtr(new AlarmAbsolute());
120 throw TypeMismatchException("Private object is null");
123 ArgumentValidator validator(ctx, argumentCount, arguments);
124 time_t date = validator.toTimeT(0);
125 struct tm *startDate = localtime(&date);
128 priv->setDate(*startDate);
130 if (argumentCount >= 2) {
131 if (JSIsArrayValue(ctx, arguments[1])) {
132 std::vector<std::string> daysOfTheWeek = validator.toStringVector(1);
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.");
143 if(daysOfTheWeek.size() > 0) {
144 priv->setByDayRecurrence(daysOfTheWeek);
147 long interval = validator.toLong(1);
149 throw InvalidValuesException("period can not be negative value");
152 if (!JSValueIsNull(ctx, arguments[1])) {
153 priv->setInterval(interval);
155 priv->setInterval(-1);
160 return JSValueToObject(ctx, createJSObject(ctx, priv), exception);
162 } catch (const BasePlatformException& err) {
163 JSObjectRef exceptionObj = JSWebAPIException::makeJSWebAPIException(ctx, err);
164 *exception = exceptionObj;
169 AlarmAbsolutePtr JSAlarmAbsolute::getPrivData(JSObjectRef object)
171 JSAlarmAbsolutePriv *priv = static_cast<JSAlarmAbsolutePriv*>(JSObjectGetPrivate(object));
173 throw TypeMismatchException("Private object is null");
175 AlarmAbsolutePtr result = priv->getObject();
177 throw TypeMismatchException("Private object is null");
182 JSValueRef JSAlarmAbsolute::createJSObject(JSContextRef context, const int id)
184 AlarmAbsolutePtr privateData = AlarmAbsolutePtr(new AlarmAbsolute());
185 privateData->setId(id);
187 JSAlarmAbsolutePriv *priv = new JSAlarmAbsolutePriv(context, privateData);
189 throw TypeMismatchException("Private object is null");
191 return JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
194 JSValueRef JSAlarmAbsolute::createJSObject(JSContextRef context, AlarmAbsolutePtr privateData)
196 JSAlarmAbsolutePriv *priv = new JSAlarmAbsolutePriv(context, privateData);
198 throw TypeMismatchException("Private object is null");
200 return JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
203 JSValueRef JSAlarmAbsolute::createJSObject(JSContextRef context, struct tm date, int interval)
205 AlarmAbsolutePtr privateData = AlarmAbsolutePtr(new AlarmAbsolute());
206 privateData->setDate(date);
208 JSAlarmAbsolutePriv *priv = new JSAlarmAbsolutePriv(context, privateData);
210 throw TypeMismatchException("Private object is null");
212 return JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
215 JSValueRef JSAlarmAbsolute::createJSObject(JSContextRef context, struct tm date)
217 AlarmAbsolutePtr privateData = AlarmAbsolutePtr(new AlarmAbsolute());
218 privateData->setDate(date);
220 JSAlarmAbsolutePriv *priv = new JSAlarmAbsolutePriv(context, privateData);
222 throw TypeMismatchException("Private object is null");
224 return JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
227 JSValueRef JSAlarmAbsolute::getNextScheduledDate( JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef * exception)
231 Converter converter(ctx);
233 AlarmAbsolutePtr privateData = getPrivData(thisObject);
235 throw TypeMismatchException("Private object is null");
238 int id = privateData->getId();
239 int err = alarm_get_scheduled_date(id, &date);
240 JSValueRef result = converter.toJSValueRef(date);
242 if(err != ALARM_ERROR_NONE) {
243 return JSValueMakeNull(ctx);
247 } catch (const BasePlatformException &err) {
248 return JSWebAPIException::throwException(ctx, exception, err);
250 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getAppSharedURI().");
251 return JSWebAPIException::throwException(ctx, exception, err);
255 JSValueRef JSAlarmAbsolute::getDate(JSContextRef ctx,
257 JSStringRef propertyName,
258 JSValueRef* exception)
260 Converter converter(ctx);
264 AlarmAbsolutePtr privateData = getPrivData(object);
266 throw TypeMismatchException("Private object is null");
269 date = privateData->getDate();
270 LoggerI("JSAlarmAbsolute Date = " << " Sec : " << date.tm_sec << " Min : "<< date.tm_min
271 << " Hour" << date.tm_hour << "Day : " << date.tm_mday << " MON : " << date.tm_mon
272 << " Year : " << date.tm_year);
275 args[0] = JSValueMakeNumber(ctx, date.tm_year + 1900);
276 args[1] = JSValueMakeNumber(ctx, date.tm_mon);
277 args[2] = JSValueMakeNumber(ctx, date.tm_mday);
278 args[3] = JSValueMakeNumber(ctx, date.tm_hour);
279 args[4] = JSValueMakeNumber(ctx, date.tm_min);
280 args[5] = JSValueMakeNumber(ctx, date.tm_sec);
282 JSObjectRef result = JSObjectMakeDate(ctx, 6, args, exception);
285 LoggerE("Exception: occured");
288 return JSValueMakeUndefined(ctx);
291 JSValueRef JSAlarmAbsolute::getId(JSContextRef ctx,
293 JSStringRef propertyName,
294 JSValueRef* exception)
297 AlarmAbsolutePtr privateData = getPrivData(object);
299 throw TypeMismatchException("Private object is null");
302 Converter converter(ctx);
303 int id = privateData->getId();
305 std::string strId = converter.toString(id);
306 return converter.toJSValueRef(strId);
308 return JSValueMakeNull(ctx);
311 LoggerE("Exception: occured");
314 return JSValueMakeUndefined(ctx);
317 JSValueRef JSAlarmAbsolute::getInterval(JSContextRef ctx,
319 JSStringRef propertyName,
320 JSValueRef* exception)
323 AlarmAbsolutePtr privateData = getPrivData(object);
324 AbsoluteRecurrence::Type alarmType = privateData->getRecurrenceType();
326 if(alarmType == AbsoluteRecurrence::Interval) {
327 long interval = privateData->getInterval();
328 if (interval == -1 ) {
329 return JSValueMakeNull(ctx);
331 return DeviceAPI::Common::JSUtil::toJSValueRef(ctx, interval);
334 return JSValueMakeNull(ctx);
337 LoggerI("Exception: occured");
340 return JSValueMakeUndefined(ctx);
343 JSValueRef JSAlarmAbsolute::getDaysOfTheWeek(JSContextRef ctx,
345 JSStringRef propertyName,
346 JSValueRef* exception)
348 Converter converter(ctx);
351 AlarmAbsolutePtr privateData = getPrivData(object);
353 throw TypeMismatchException("Private object is null");
356 JSObjectRef jsResult = JSCreateArrayObject(ctx, 0, NULL);
357 if (jsResult == NULL) {
358 throw UnknownException("Could not create js array object");
361 std::vector<std::string> daysOfTheWeek = privateData->getByDayRecurrence();
363 if(daysOfTheWeek.size() > 0) {
364 for(size_t i = 0; i<daysOfTheWeek.size(); i++) {
365 JSValueRef val = converter.toJSValueRef(daysOfTheWeek.at(i));
366 if(!JSSetArrayElement(ctx, jsResult, i, val)) {
367 throw UnknownException("Could not insert value into js array");
374 LoggerI("Exception: occured");
377 return JSValueMakeUndefined(ctx);