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,
51 "Message is JS null or JS undefined.");
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 duration object.");
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);
118 long long TimeUtilConverter::getDurationLength(JSValueRef value) {
119 if (JSValueIsNull(m_context, value) || JSValueIsUndefined(m_context, value) || !JSValueIsObjectOfClass(m_context, value, JSTimeDuration::getClassRef())) {
120 ThrowMsg(Commons::ConversionException,
121 "Duration is JS null or JS undefined.");
123 JSObjectRef obj = toJSObjectRef(value);
124 return getDurationLength(obj);
127 long long TimeUtilConverter::getDurationLength(JSObjectRef object) {
128 TimeDurationPrivObject* privateObject = static_cast<TimeDurationPrivObject*>(JSObjectGetPrivate(object));
129 if (!privateObject) {
130 LoggerE("Private object is not set.");
131 ThrowMsg(Commons::ConversionException, "Private object not initialized");
134 DurationPropertiesPtr duration = privateObject->getObject();
136 return duration->length;
139 short TimeUtilConverter::getDurationUnit(JSValueRef value) {
140 if (JSValueIsNull(m_context, value) || JSValueIsUndefined(m_context, value) || !JSValueIsObjectOfClass(m_context, value, JSTimeDuration::getClassRef())) {
141 ThrowMsg(Commons::ConversionException,
142 "Duration is JS null or JS undefined.");
144 JSObjectRef obj = toJSObjectRef(value);
145 return getDurationUnit(obj);
148 short TimeUtilConverter::getDurationUnit(JSObjectRef object) {
149 TimeDurationPrivObject* privateObject = static_cast<TimeDurationPrivObject*>(JSObjectGetPrivate(object));
150 if (!privateObject) {
151 LoggerE("Private object is not set.");
152 ThrowMsg(Commons::ConversionException, "Private object not initialized");
155 DurationPropertiesPtr duration = privateObject->getObject();
157 return duration->unit;
161 short TimeUtilConverter::toDurationUnit(std::string strUnit) {
162 if (!strUnit.compare("DAYS"))
164 else if (!strUnit.compare("SECS"))
166 else if (!strUnit.compare("MINS"))
168 else if (!strUnit.compare("HOURS"))
170 else if (!strUnit.compare("MSECS"))
176 std::string TimeUtilConverter::toDurationUnitString(short unit) {
193 long long TimeUtilConverter::convertDurationLength(DurationProperties duration, short unit) {
194 if (duration.unit < unit)
195 ThrowMsg(Commons::ConversionException, "Unit is larger thatn duration's unit");
197 if (duration.unit == unit)
198 return duration.length;
200 long long result = duration.length;
204 result = result * 1000;
205 if (duration.unit == SECONDS_UNIT)
207 // intentional fall-through
210 result = result * 60;
211 if (duration.unit == MINUTES_UNIT)
213 // intentional fall-through
216 result = result * 60;
217 if (duration.unit == HOURS_UNIT)
219 // intentional fall-through
222 result = result * 24;
224 // intentional fall-through
229 DurationProperties TimeUtilConverter::optimizedTimeDuration(DurationProperties origin) {
230 DurationProperties result;
231 result.unit = origin.unit;
232 result.length = origin.length;
234 switch(origin.unit) {
236 if (result.length % 1000)
238 result.unit = SECONDS_UNIT;
239 result.length /= 1000;
240 // intentional fall-through
243 if (result.length % 60)
245 result.unit = MINUTES_UNIT;
247 // intentional fall-through
250 if (result.length % 60)
252 result.unit = HOURS_UNIT;
254 // intentional fall-through
257 if (result.length % 24)
259 result.unit = DAYS_UNIT;
261 // intentional fall-through
266 double TimeUtilConverter::getTimeInMilliseconds(JSValueRef arg) {
267 if (JSValueIsNull(m_context, arg) || JSValueIsUndefined(m_context, arg) || !JSValueIsObjectOfClass(m_context, arg, JSTZDate::getClassRef())) {
268 ThrowMsg(Commons::ConversionException,
269 "JSValueRef is JS null or JS undefined.");
271 JSObjectRef obj = toJSObjectRef(arg);
273 return getTimeInMilliseconds(obj);
276 double TimeUtilConverter::getTimeInMilliseconds(JSObjectRef arg) {
278 LoggerE("Object is null");
279 ThrowMsg(Commons::ConversionException, "Private object not initialized");
282 TZDatePrivObject* privateObject = static_cast<TZDatePrivObject*>(JSObjectGetPrivate(arg));
283 if (!privateObject) {
284 LoggerE("Private object is not set.");
285 ThrowMsg(Commons::ConversionException, "Private object not initialized");
288 TZDatePtr tzDate = privateObject->getObject();
290 return tzDate->getTime();
293 tm TimeUtilConverter::toTZDateTime(JSValueRef arg) {
294 if (JSValueIsNull(m_context, arg) || JSValueIsUndefined(m_context, arg) || !JSValueIsObjectOfClass(m_context, arg, JSTZDate::getClassRef())) {
295 ThrowMsg(Commons::ConversionException,
296 "JSValueRef is JS null or JS undefined.");
298 JSObjectRef obj = toJSObjectRef(arg);
300 return toTZDateTime(obj);
303 tm TimeUtilConverter::toTZDateTime(JSObjectRef arg) {
305 LoggerE("Object is null");
306 ThrowMsg(Commons::ConversionException, "Private object not initialized");
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();
316 TZDatePtr utcTzDate(new TZDate(tzDate->getUTCTimezoneName()));
317 if (!utcTzDate->setTime(tzDate->getTime()))
318 ThrowMsg(Commons::ConversionException, "Can not set UTC Time");
320 TZDateProperties utcProperties = utcTzDate->makeProperties();
322 memset(&utcTm, 0, sizeof(utcTm));
324 utcTm.tm_year = utcProperties.year - 1900;
325 utcTm.tm_mon = utcProperties.month;
326 utcTm.tm_mday= utcProperties.day;
327 utcTm.tm_hour= utcProperties.hours;
328 utcTm.tm_min=utcProperties.minutes;
329 utcTm.tm_sec= utcProperties.seconds;
334 JSObjectRef TimeUtilConverter::toJSValueRefTZDate(const double milliseconds, const std::string &timezone) {
335 return JSTZDate::createJSObject(m_context, milliseconds, timezone);