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 <ArgumentValidator.h>
25 #include <Commons/Exception.h>
26 #include <JSWebAPIErrorFactory.h>
27 #include <SecurityExceptions.h>
29 #include "plugin_config.h"
31 #include "AlarmRelative.h"
32 #include "AlarmConverter.h"
33 #include "JSAlarmRelative.h"
34 #include "JSAlarmManager.h"
38 #include <TimeTracer.h>
47 using namespace WrtDeviceApis::Commons;
48 using namespace WrtDeviceApis::CommonsJavaScript;
49 using namespace DeviceAPI::Common;
51 JSClassRef JSAlarmRelative::m_jsClassRef = NULL;
53 JSClassDefinition JSAlarmRelative::m_jsClassInfo = {
55 kJSClassAttributeNone,
56 TIZEN_ALARM_RELATIVE_INTERFACE,
65 NULL, //deleteProperty,Geolocation
66 NULL, //getPropertyNames,
73 JSStaticFunction JSAlarmRelative::m_function[] = {
74 { ALARM_FUNCTION_API_GET_REMAINING_SECONDS, JSAlarmRelative::getRemainingSeconds, kJSPropertyAttributeNone },
78 JSStaticValue JSAlarmRelative::m_property[] = {
79 { TIZEN_ALARM_RELATIVE_ATTRIBUTE_ID, getId, NULL, kJSPropertyAttributeReadOnly },
80 { TIZEN_ALARM_RELATIVE_ATTRIBUTE_DELAY, getDelay, NULL, kJSPropertyAttributeReadOnly },
81 { TIZEN_ALARM_RELATIVE_ATTRIBUTE_PERIOD, getPeriod, NULL, kJSPropertyAttributeReadOnly },
85 const JSClassRef DLL_EXPORT JSAlarmRelative::getClassRef()
88 m_jsClassRef = JSClassCreate(&m_jsClassInfo);
93 const JSClassDefinition* JSAlarmRelative::getClassInfo()
95 return &m_jsClassInfo;
98 void JSAlarmRelative::initialize(JSContextRef context, JSObjectRef object)
101 void JSAlarmRelative::finalize(JSObjectRef object)
103 JSAlarmRelativePriv *priv = static_cast<JSAlarmRelativePriv*>(JSObjectGetPrivate(object));
105 LoggerE("Private object is null");
111 JSObjectRef DLL_EXPORT JSAlarmRelative::constructor(JSContextRef ctx, JSObjectRef constructor, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
113 ArgumentValidator validator(ctx, argumentCount, arguments);
115 AlarmRelativePtr privateData = AlarmRelativePtr(new AlarmRelative());
118 long delay = validator.toLong(0);
119 privateData->setDelay(delay);
121 long period = validator.toLong(1, true, -1);
122 privateData->setPeriod(period);
124 } catch (const BasePlatformException& err) {
125 LoggerE("Exception occured while creating constructor : " << err.getMessage());
128 JSAlarmRelativePriv *priv = new JSAlarmRelativePriv(ctx, privateData);
129 JSObjectRef obj = JSObjectMake(ctx, getClassRef(), priv);
131 JSStringRef ctorName = JSStringCreateWithUTF8CString("constructor");
132 JSObjectSetProperty(ctx, obj, ctorName, constructor,
133 kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete | kJSPropertyAttributeDontEnum, NULL);
134 JSStringRelease(ctorName);
139 AlarmRelativePtr JSAlarmRelative::getPrivData(JSObjectRef object)
141 JSAlarmRelativePriv *priv = static_cast<JSAlarmRelativePriv*>(JSObjectGetPrivate(object));
143 throw TypeMismatchException("Private object is null");
145 AlarmRelativePtr result = priv->getObject();
147 throw TypeMismatchException("Private object is null");
152 JSValueRef JSAlarmRelative::createJSObject(JSContextRef context, AlarmRelativePtr privateData)
154 JSAlarmRelativePriv *priv = new JSAlarmRelativePriv(context, privateData);
156 throw TypeMismatchException("Private object is null");
158 return JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
162 JSValueRef JSAlarmRelative::createJSObject(JSContextRef context, int delay, int interval)
164 AlarmRelativePtr privateData = AlarmRelativePtr(new AlarmRelative());
165 privateData->setDelay(delay);
166 privateData->setPeriod(interval);
168 JSAlarmRelativePriv *priv = new JSAlarmRelativePriv(context, privateData);
170 throw TypeMismatchException("Private object is null");
172 return JSObjectMake(context, getClassRef(), static_cast<void*>(priv));
175 JSValueRef JSAlarmRelative::getRemainingSeconds(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef * exception)
183 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
186 AlarmRelativePtr privateData = getPrivData(thisObject);
188 if(!privateData->is_registered) {
189 return JSValueMakeNull(ctx);
192 id = privateData->getId();
194 TIME_TRACER_ITEM_BEGIN("(getRemainingSeconds)alarm_get_scheduled_date", 0);
195 int err = alarm_get_scheduled_date(id, &date);
196 TIME_TRACER_ITEM_END("(getRemainingSeconds)alarm_get_scheduled_date", 0);
197 if(err != ALARM_ERROR_NONE)
199 if(err == ALARM_ERROR_INVALID_PARAMETER) {
200 return JSValueMakeNull(ctx);
202 throw UnknownException("Unknown exception occurred. fail to get scheduled date");
206 TIME_TRACER_ITEM_BEGIN("(getRemainingSeconds)alarm_get_current_time", 0);
207 alarm_get_current_time(¤t);
209 nextTime = mktime(&date);
210 currentTime = mktime(¤t);
211 TIME_TRACER_ITEM_END("(getRemainingSeconds)alarm_get_current_time", 0);
213 long result = nextTime - currentTime;
215 LoggerI("nextTime: "<<nextTime<<", currentTime: "<<currentTime<<", result: "<<result);
218 return JSValueMakeNull(ctx);
220 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
222 return DeviceAPI::Common::JSUtil::toJSValueRef(ctx, result);
223 } catch (const BasePlatformException &err) {
224 return JSWebAPIErrorFactory::postException(ctx, exception, err);
226 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getAppSharedURI().");
227 return JSWebAPIErrorFactory::postException(ctx, exception, err);
231 JSValueRef JSAlarmRelative::getId(JSContextRef ctx,
233 JSStringRef propertyName,
234 JSValueRef* exception)
236 Converter converter(ctx);
239 AlarmRelativePtr privateData = getPrivData(object);
241 throw TypeMismatchException("Private object is null");
244 if(privateData->is_registered) {
245 std::string strId = converter.toString(privateData->getId());
246 return converter.toJSValueRef(strId);
248 return JSValueMakeNull(ctx);
250 } catch (const BasePlatformException &err) {
251 return JSWebAPIErrorFactory::postException(ctx, exception, err);
253 DeviceAPI::Common::TypeMismatchException err("TypeMismatchException occured");
254 return JSWebAPIErrorFactory::postException(ctx, exception, err);
258 JSValueRef JSAlarmRelative::getDelay(JSContextRef ctx,
260 JSStringRef propertyName,
261 JSValueRef* exception)
266 AlarmRelativePtr privateData = getPrivData(object);
268 throw TypeMismatchException("Private object is null");
271 delay = privateData->getDelay();
272 LoggerI("JSAlarmRelative delay = " << delay);
273 return DeviceAPI::Common::JSUtil::toJSValueRef(ctx, delay);
274 } catch (const BasePlatformException &err) {
275 return JSWebAPIErrorFactory::postException(ctx, exception, err);
277 DeviceAPI::Common::TypeMismatchException err("TypeMismatchException occured");
278 return JSWebAPIErrorFactory::postException(ctx, exception, err);
282 JSValueRef JSAlarmRelative::getPeriod(JSContextRef ctx,
284 JSStringRef propertyName,
285 JSValueRef* exception)
290 AlarmRelativePtr privateData = getPrivData(object);
292 throw TypeMismatchException("Private object is null");
295 period = privateData->getPeriod();
296 LoggerI("JSAlarmRelative interval = " << period);
298 return JSValueMakeNull(ctx);
300 return DeviceAPI::Common::JSUtil::toJSValueRef(ctx, period);
302 } catch (const BasePlatformException &err) {
303 return JSWebAPIErrorFactory::postException(ctx, exception, err);
305 DeviceAPI::Common::TypeMismatchException err("TypeMismatchException occured");
306 return JSWebAPIErrorFactory::postException(ctx, exception, err);