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.
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>
25 #include <JSWebAPIException.h>
26 #include <ArgumentValidator.h>
28 #include <Commons/Exception.h>
29 #include <JSTizenExceptionFactory.h>
30 #include <JSTizenException.h>
31 #include <SecurityExceptions.h>
33 #include "AlarmAbsolute.h"
34 #include "AlarmConverter.h"
38 #include "plugin_config.h"
39 #include "JSAlarmAbsolute.h"
40 #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 LogError("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 unsigned long long interval = validator.toULongLong(1);
148 if (!JSValueIsNull(ctx, arguments[1])) {
149 priv->setInterval(interval);
151 priv->setInterval(-1);
156 return JSValueToObject(ctx, createJSObject(ctx, priv), exception);
158 } catch (const BasePlatformException& err) {
159 JSObjectRef exceptionObj = JSWebAPIException::makeJSWebAPIException(ctx, err);
160 *exception = exceptionObj;
165 AlarmAbsolutePtr JSAlarmAbsolute::getPrivData(JSObjectRef object)
167 JSAlarmAbsolutePriv *priv = static_cast<JSAlarmAbsolutePriv*>(JSObjectGetPrivate(object));
169 throw TypeMismatchException("Private object is null");
171 AlarmAbsolutePtr result = priv->getObject();
173 throw TypeMismatchException("Private object is null");
178 JSValueRef JSAlarmAbsolute::createJSObject(JSContextRef context, const int id)
180 AlarmAbsolutePtr privateData = AlarmAbsolutePtr(new AlarmAbsolute());
181 privateData->setId(id);
183 JSAlarmAbsolutePriv *priv = new JSAlarmAbsolutePriv(context, privateData);
185 throw TypeMismatchException("Private object is null");
187 return JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
190 JSValueRef JSAlarmAbsolute::createJSObject(JSContextRef context, AlarmAbsolutePtr privateData)
192 JSAlarmAbsolutePriv *priv = new JSAlarmAbsolutePriv(context, privateData);
194 throw TypeMismatchException("Private object is null");
196 return JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
199 JSValueRef JSAlarmAbsolute::createJSObject(JSContextRef context, struct tm date, int interval)
201 AlarmAbsolutePtr privateData = AlarmAbsolutePtr(new AlarmAbsolute());
202 privateData->setDate(date);
204 JSAlarmAbsolutePriv *priv = new JSAlarmAbsolutePriv(context, privateData);
206 throw TypeMismatchException("Private object is null");
208 return JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
211 JSValueRef JSAlarmAbsolute::createJSObject(JSContextRef context, struct tm date)
213 AlarmAbsolutePtr privateData = AlarmAbsolutePtr(new AlarmAbsolute());
214 privateData->setDate(date);
216 JSAlarmAbsolutePriv *priv = new JSAlarmAbsolutePriv(context, privateData);
218 throw TypeMismatchException("Private object is null");
220 return JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
223 JSValueRef JSAlarmAbsolute::getNextScheduledDate( JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef * exception)
227 Converter converter(ctx);
229 AlarmAbsolutePtr privateData = getPrivData(thisObject);
231 throw TypeMismatchException("Private object is null");
234 int id = privateData->getId();
235 int err = alarm_get_scheduled_date(id, &date);
236 JSValueRef result = converter.toJSValueRef(date);
238 if(err != ALARM_ERROR_NONE) {
239 return JSValueMakeNull(ctx);
243 } catch (const BasePlatformException &err) {
244 return JSWebAPIException::throwException(ctx, exception, err);
246 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getAppSharedURI().");
247 return JSWebAPIException::throwException(ctx, exception, err);
251 JSValueRef JSAlarmAbsolute::getDate(JSContextRef ctx,
253 JSStringRef propertyName,
254 JSValueRef* exception)
256 Converter converter(ctx);
260 AlarmAbsolutePtr privateData = getPrivData(object);
262 throw TypeMismatchException("Private object is null");
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);
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);
278 JSObjectRef result = JSObjectMakeDate(ctx, 6, args, exception);
281 LogWarning("Exception: occured");
284 return JSValueMakeUndefined(ctx);
287 JSValueRef JSAlarmAbsolute::getId(JSContextRef ctx,
289 JSStringRef propertyName,
290 JSValueRef* exception)
293 AlarmAbsolutePtr privateData = getPrivData(object);
295 throw TypeMismatchException("Private object is null");
298 Converter converter(ctx);
299 int id = privateData->getId();
301 std::string strId = converter.toString(id);
302 return converter.toJSValueRef(strId);
304 return JSValueMakeNull(ctx);
307 LogWarning("Exception: occured");
310 return JSValueMakeUndefined(ctx);
313 JSValueRef JSAlarmAbsolute::getInterval(JSContextRef ctx,
315 JSStringRef propertyName,
316 JSValueRef* exception)
319 AlarmAbsolutePtr privateData = getPrivData(object);
320 AbsoluteRecurrence::Type alarmType = privateData->getRecurrenceType();
322 if(alarmType == AbsoluteRecurrence::Interval) {
323 Converter converter(ctx);
324 int interval = privateData->getInterval();
325 if (interval == -1 ) {
326 return JSValueMakeNull(ctx);
328 return converter.toJSValueRef(interval);
331 return JSValueMakeNull(ctx);
334 LogWarning("Exception: occured");
337 return JSValueMakeUndefined(ctx);
340 JSValueRef JSAlarmAbsolute::getDaysOfTheWeek(JSContextRef ctx,
342 JSStringRef propertyName,
343 JSValueRef* exception)
345 Converter converter(ctx);
348 AlarmAbsolutePtr privateData = getPrivData(object);
350 throw TypeMismatchException("Private object is null");
353 JSObjectRef jsResult = JSCreateArrayObject(ctx, 0, NULL);
354 if (jsResult == NULL) {
355 throw UnknownException("Could not create js array object");
358 std::vector<std::string> daysOfTheWeek = privateData->getByDayRecurrence();
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");
371 LogWarning("Exception: occured");
374 return JSValueMakeUndefined(ctx);