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 <Commons/Exception.h>
19 #include <CommonsJavaScript/ScopedJSStringRef.h>
20 #include <CommonsJavaScript/PrivateObject.h>
21 #include <CommonsJavaScript/Validator.h>
22 #include <CommonsJavaScript/JSUtils.h>
23 #include <Commons/RegexUtils.h>
25 #include "TimeUtilConverter.h"
27 #include "JSTimeDuration.h"
30 using namespace WrtDeviceApis;
35 TimeUtilConverter::TimeUtilConverter(JSContextRef context)
36 : WrtDeviceApis::CommonsJavaScript::Converter(context) {
39 TimeUtilConverter::~TimeUtilConverter() {
42 short TimeUtilConverter::toShort(const JSValueRef& arg)
44 double tmp = toNumber_(arg);
45 return (isNan(tmp) ? 0 : static_cast<short>(tmp));
48 TZDateProperties TimeUtilConverter::getPropertiesInTZDate(JSValueRef arg) {
49 if (JSValueIsNull(m_context, arg) || JSValueIsUndefined(m_context, arg) || !JSValueIsObjectOfClass(m_context, arg, JSTZDate::getClassRef())) {
50 ThrowMsg(Commons::ConversionException,
53 JSObjectRef obj = toJSObjectRef(arg);
54 return getPropertiesInTZDate(obj);
58 TZDateProperties TimeUtilConverter::getPropertiesInTZDate(JSObjectRef arg) {
59 LoggerD("TZDate object=" << arg);
61 LoggerE("Object is null");
62 ThrowMsg(Commons::ConversionException, "Private object not initialized");
64 TZDatePrivObject* privateObject = static_cast<TZDatePrivObject*>(JSObjectGetPrivate(arg));
66 LoggerE("Private object is not set.");
67 ThrowMsg(Commons::ConversionException, "Private object not initialized");
70 TZDatePtr tzDate = privateObject->getObject();
71 TZDateProperties result;
73 result.timezone = tzDate->getTimezone();
74 result.year = tzDate->get(TZDate::TZDATE_YEAR);
75 result.month = tzDate->get(TZDate::TZDATE_MONTH);
76 result.day= tzDate->get(TZDate::TZDATE_DATE);
77 result.hours= tzDate->get(TZDate::TZDATE_HOUR_OF_DAY);
78 result.minutes= tzDate->get(TZDate::TZDATE_MINUTE);
79 result.seconds= tzDate->get(TZDate::TZDATE_SECOND);
80 result.milliseconds = tzDate->get(TZDate::TZDATE_MILLISECOND);
84 JSObjectRef TimeUtilConverter::makeDurationObject(const DurationProperties &duration) {
85 return JSTimeDuration::createJSObject(m_context, duration);
88 JSObjectRef TimeUtilConverter::makeMillisecondDurationObject(const long long length) {
89 DurationProperties duration;
90 duration.length = length;
91 duration.unit = MSECS_UNIT;
92 const long long dayToMsecs = 1000 * 60 * 60 * 24;
93 if ((length % dayToMsecs) == 0) {
94 duration.length = length / dayToMsecs;
95 duration.unit = DAYS_UNIT;
98 return makeDurationObject(duration);
101 DurationPropertiesPtr TimeUtilConverter::getDuration(JSValueRef value) {
102 if (!JSValueIsObjectOfClass(m_context, value, JSTimeDuration::getClassRef())) {
103 ThrowMsg(Commons::ConversionException, "Wrong input type");
106 TimeDurationPrivObject* privateObject = static_cast<TimeDurationPrivObject*>(JSObjectGetPrivate(toJSObjectRef(value)));
107 DurationPropertiesPtr duration = privateObject->getObject();
111 DurationProperties TimeUtilConverter::getDurationProperties(JSValueRef value) {
112 DurationProperties duration;
113 duration.length = getDurationLength(value);
114 duration.unit = getDurationUnit(value);
115 if (duration.unit == WRONG_UNIT)
116 ThrowMsg(Commons::ConversionException, "Wrong Unit");
120 long long TimeUtilConverter::getDurationLength(JSValueRef value) {
121 if (JSValueIsNull(m_context, value) || JSValueIsUndefined(m_context, value) || !JSValueIsObjectOfClass(m_context, value, JSTimeDuration::getClassRef())) {
122 ThrowMsg(Commons::ConversionException,
125 JSObjectRef obj = toJSObjectRef(value);
126 return getDurationLength(obj);
129 long long TimeUtilConverter::getDurationLength(JSObjectRef object) {
130 TimeDurationPrivObject* privateObject = static_cast<TimeDurationPrivObject*>(JSObjectGetPrivate(object));
131 if (!privateObject) {
132 LoggerE("Private object is not set.");
133 ThrowMsg(Commons::ConversionException, "Private object not initialized");
136 DurationPropertiesPtr duration = privateObject->getObject();
138 return duration->length;
141 short TimeUtilConverter::getDurationUnit(JSValueRef value) {
142 if (JSValueIsNull(m_context, value) || JSValueIsUndefined(m_context, value) || !JSValueIsObjectOfClass(m_context, value, JSTimeDuration::getClassRef())) {
143 ThrowMsg(Commons::ConversionException,
146 JSObjectRef obj = toJSObjectRef(value);
147 return getDurationUnit(obj);
150 short TimeUtilConverter::getDurationUnit(JSObjectRef object) {
151 TimeDurationPrivObject* privateObject = static_cast<TimeDurationPrivObject*>(JSObjectGetPrivate(object));
152 if (!privateObject) {
153 LoggerE("Private object is not set.");
154 ThrowMsg(Commons::ConversionException, "Private object not initialized");
157 DurationPropertiesPtr duration = privateObject->getObject();
159 return duration->unit;
163 std::string TimeUtilConverter::getDurationUnitString(JSValueRef value) {
164 if (JSValueIsNull(m_context, value) || JSValueIsUndefined(m_context, value) || !JSValueIsObjectOfClass(m_context, value, JSTimeDuration::getClassRef())) {
165 ThrowMsg(Commons::ConversionException,
168 JSObjectRef obj = toJSObjectRef(value);
169 return getDurationUnitString(obj);
172 std::string TimeUtilConverter::getDurationUnitString(JSObjectRef object) {
173 TimeDurationPrivObject* privateObject = static_cast<TimeDurationPrivObject*>(JSObjectGetPrivate(object));
174 if (!privateObject) {
175 LoggerE("Private object is not set.");
176 ThrowMsg(Commons::ConversionException, "Private object not initialized");
179 DurationPropertiesPtr duration = privateObject->getObject();
181 return duration->unitStr;
185 short TimeUtilConverter::toDurationUnit(std::string strUnit) {
186 if (!strUnit.compare("DAYS"))
188 else if (!strUnit.compare("SECS"))
190 else if (!strUnit.compare("MINS"))
192 else if (!strUnit.compare("HOURS"))
194 else if (!strUnit.compare("MSECS"))
200 std::string TimeUtilConverter::toDurationUnitString(short unit) {
217 long long TimeUtilConverter::convertDurationLength(DurationProperties duration, short unit) {
218 if ((duration.unit == WRONG_UNIT) || (unit == WRONG_UNIT))
219 ThrowMsg(Commons::ConversionException, "Wrong Unit");
220 if (duration.unit < unit)
221 ThrowMsg(Commons::ConversionException, "Unit is larger than duration's unit");
223 if (duration.unit == unit)
224 return duration.length;
226 long long result = duration.length;
230 result = result * 1000;
231 if (duration.unit == SECONDS_UNIT)
233 // intentional fall-through
236 result = result * 60;
237 if (duration.unit == MINUTES_UNIT)
239 // intentional fall-through
242 result = result * 60;
243 if (duration.unit == HOURS_UNIT)
245 // intentional fall-through
248 result = result * 24;
250 // intentional fall-through
255 DurationProperties TimeUtilConverter::optimizedTimeDuration(DurationProperties origin) {
256 DurationProperties result;
257 result.unit = origin.unit;
258 result.length = origin.length;
260 switch(origin.unit) {
262 if (result.length % 1000)
264 result.unit = SECONDS_UNIT;
265 result.length /= 1000;
266 // intentional fall-through
269 if (result.length % 60)
271 result.unit = MINUTES_UNIT;
273 // intentional fall-through
276 if (result.length % 60)
278 result.unit = HOURS_UNIT;
280 // intentional fall-through
283 if (result.length % 24)
285 result.unit = DAYS_UNIT;
287 // intentional fall-through
289 result.unitStr = toDurationUnitString(result.unit);
293 double TimeUtilConverter::getTimeInMilliseconds(JSValueRef arg) {
294 if (JSValueIsNull(m_context, arg) || JSValueIsUndefined(m_context, arg) || !JSValueIsObjectOfClass(m_context, arg, JSTZDate::getClassRef())) {
295 ThrowMsg(Commons::ConversionException,
298 JSObjectRef obj = toJSObjectRef(arg);
300 return getTimeInMilliseconds(obj);
303 double TimeUtilConverter::getTimeInMilliseconds(JSObjectRef arg) {
305 LoggerE("Object is null");
306 ThrowMsg(Commons::ConversionException, "Object is null");
309 TZDatePrivObject* privateObject = static_cast<TZDatePrivObject*>(JSObjectGetPrivate(arg));
310 if (!privateObject) {
311 LoggerE("Private object is not set.");
312 ThrowMsg(Commons::ConversionException, "Private object not initialized");
315 TZDatePtr tzDate = privateObject->getObject();
317 return tzDate->getTime();
320 tm TimeUtilConverter::toTZDateTime(JSValueRef arg) {
321 if (JSValueIsNull(m_context, arg) || JSValueIsUndefined(m_context, arg) || !JSValueIsObjectOfClass(m_context, arg, JSTZDate::getClassRef())) {
322 ThrowMsg(Commons::ConversionException,
325 JSObjectRef obj = toJSObjectRef(arg);
327 return toTZDateTime(obj);
330 tm TimeUtilConverter::toTZDateTime(JSObjectRef arg) {
332 LoggerE("Object is null");
333 ThrowMsg(Commons::ConversionException, "Object is null");
336 TZDatePrivObject* privateObject = static_cast<TZDatePrivObject*>(JSObjectGetPrivate(arg));
337 if (!privateObject) {
338 LoggerE("Private object is not set.");
339 ThrowMsg(Commons::ConversionException, "Private object not initialized");
342 TZDatePtr tzDate = privateObject->getObject();
343 TZDatePtr utcTzDate(new TZDate(tzDate->getUTCTimezoneName()));
344 if (!utcTzDate->setTime(tzDate->getTime()))
345 ThrowMsg(Commons::ConversionException, "Can not set Time");
347 TZDateProperties utcProperties = utcTzDate->makeProperties();
349 memset(&utcTm, 0, sizeof(utcTm));
351 utcTm.tm_year = utcProperties.year - 1900;
352 utcTm.tm_mon = utcProperties.month;
353 utcTm.tm_mday= utcProperties.day;
354 utcTm.tm_hour= utcProperties.hours;
355 utcTm.tm_min=utcProperties.minutes;
356 utcTm.tm_sec= utcProperties.seconds;
361 JSObjectRef TimeUtilConverter::toJSValueRefTZDate(const double milliseconds, const std::string &timezone) {
362 return JSTZDate::createJSObject(m_context, milliseconds, timezone);