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 double TimeUtilConverter::getTimeInMilliseconds(JSValueRef arg) {
230 if (JSValueIsNull(m_context, arg) || JSValueIsUndefined(m_context, arg) || !JSValueIsObjectOfClass(m_context, arg, JSTZDate::getClassRef())) {
231 ThrowMsg(Commons::ConversionException,
232 "JSValueRef is JS null or JS undefined.");
234 JSObjectRef obj = toJSObjectRef(arg);
236 return getTimeInMilliseconds(obj);
239 double TimeUtilConverter::getTimeInMilliseconds(JSObjectRef arg) {
241 LoggerE("Object is null");
242 ThrowMsg(Commons::ConversionException, "Private object not initialized");
245 TZDatePrivObject* privateObject = static_cast<TZDatePrivObject*>(JSObjectGetPrivate(arg));
246 if (!privateObject) {
247 LoggerE("Private object is not set.");
248 ThrowMsg(Commons::ConversionException, "Private object not initialized");
251 TZDatePtr tzDate = privateObject->getObject();
253 return tzDate->getTime();
256 tm TimeUtilConverter::toTZDateTime(JSValueRef arg) {
257 if (JSValueIsNull(m_context, arg) || JSValueIsUndefined(m_context, arg) || !JSValueIsObjectOfClass(m_context, arg, JSTZDate::getClassRef())) {
258 ThrowMsg(Commons::ConversionException,
259 "JSValueRef is JS null or JS undefined.");
261 JSObjectRef obj = toJSObjectRef(arg);
263 return toTZDateTime(obj);
266 tm TimeUtilConverter::toTZDateTime(JSObjectRef arg) {
268 LoggerE("Object is null");
269 ThrowMsg(Commons::ConversionException, "Private object not initialized");
272 TZDatePrivObject* privateObject = static_cast<TZDatePrivObject*>(JSObjectGetPrivate(arg));
273 if (!privateObject) {
274 LoggerE("Private object is not set.");
275 ThrowMsg(Commons::ConversionException, "Private object not initialized");
278 TZDatePtr tzDate = privateObject->getObject();
279 TZDatePtr utcTzDate(new TZDate(tzDate->getUTCTimezoneName()));
280 if (!utcTzDate->setTime(tzDate->getTime()))
281 ThrowMsg(Commons::ConversionException, "Can not set UTC Time");
283 TZDateProperties utcProperties = utcTzDate->makeProperties();
285 memset(&utcTm, 0, sizeof(utcTm));
287 utcTm.tm_year = utcProperties.year - 1900;
288 utcTm.tm_mon = utcProperties.month;
289 utcTm.tm_mday= utcProperties.day;
290 utcTm.tm_hour= utcProperties.hours;
291 utcTm.tm_min=utcProperties.minutes;
292 utcTm.tm_sec= utcProperties.seconds;
297 JSObjectRef TimeUtilConverter::toJSValueRefTZDate(const double milliseconds, const std::string &timezone) {
298 return JSTZDate::createJSObject(m_context, milliseconds, timezone);