2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 * @author Kisub Song (kisubs.song@samsung.com)
21 * @brief Declaration of the JSFilter class
25 #include <Commons/Exception.h>
31 using namespace WrtDeviceApis::Commons;
32 using namespace WrtDeviceApis::CommonsJavaScript;
34 AnyTypeConverter::AnyTypeConverter(JSContextRef context) :
39 AnyTypeConverter::~AnyTypeConverter()
43 JSValueRef AnyTypeConverter::toJSValueRef(const AnyPtr& arg)
45 PrimitiveType type = arg->getType();
47 if(type == PrimitiveType_Boolean)
48 return DPL::DynamicPointerCast< Any_T<bool> >(arg)->toJSValueRef(m_context);
49 else if(type == PrimitiveType_Char)
50 return DPL::DynamicPointerCast< Any_T<char> >(arg)->toJSValueRef(m_context);
51 else if(type == PrimitiveType_UChar)
52 return DPL::DynamicPointerCast< Any_T<unsigned char> >(arg)->toJSValueRef(m_context);
53 else if(type == PrimitiveType_Int)
54 return DPL::DynamicPointerCast< Any_T<int> >(arg)->toJSValueRef(m_context);
55 else if(type == PrimitiveType_UInt)
56 return DPL::DynamicPointerCast< Any_T<unsigned int> >(arg)->toJSValueRef(m_context);
57 else if(type == PrimitiveType_Long)
58 return DPL::DynamicPointerCast< Any_T<long> >(arg)->toJSValueRef(m_context);
59 else if(type == PrimitiveType_ULong)
60 return DPL::DynamicPointerCast< Any_T<unsigned long> >(arg)->toJSValueRef(m_context);
61 else if(type == PrimitiveType_Double)
62 return DPL::DynamicPointerCast< Any_T<double> >(arg)->toJSValueRef(m_context);
63 else if(type == PrimitiveType_String)
64 return DPL::DynamicPointerCast< Any_T<std::string> >(arg)->toJSValueRef(m_context);
65 else if(type == PrimitiveType_Time)
66 return DPL::DynamicPointerCast< Any_T<tm> >(arg)->toJSValueRef(m_context);
68 return DPL::DynamicPointerCast< Any_T<std::string> >(arg)->toJSValueRef(m_context);
71 AnyPtr AnyTypeConverter::toAny(const JSValueRef &value, const PrimitiveType preferredNumberType)
73 JSType jstype = JSValueGetType(m_context, value);
75 if(jstype == kJSTypeBoolean)
76 return toAny(Converter::toBool(value));
77 else if(jstype == kJSTypeNumber)
79 if(preferredNumberType == PrimitiveType_Char)
80 return toAny(Converter::toChar(value));
81 else if(preferredNumberType == PrimitiveType_UChar)
82 return toAny(Converter::toUChar(value));
83 else if(preferredNumberType == PrimitiveType_Int)
84 return toAny(Converter::toInt(value));
85 else if(preferredNumberType == PrimitiveType_UInt)
86 return toAny(static_cast<unsigned int>(Converter::toULong(value)));
87 else if(preferredNumberType == PrimitiveType_Long)
88 return toAny(Converter::toLong(value));
89 else if(preferredNumberType == PrimitiveType_ULong)
90 return toAny(Converter::toULong(value));
91 else if(preferredNumberType == PrimitiveType_Double)
92 return toAny(Converter::toDouble(value));
94 return toAny(Converter::toDouble(value));
96 else if(jstype == kJSTypeString)
97 return toAny(Converter::toString(value));
98 else if(isDate(value))
99 return toAny(Converter::toDateTm(value));
101 return toAny(Converter::toString(value));
104 AnyPtr AnyTypeConverter::toAny(const bool &value)
106 AnyPtr ptr(new Any_T<bool>(value));
110 AnyPtr AnyTypeConverter::toAny(const char &value)
112 AnyPtr ptr(new Any_T<char>(value));
116 AnyPtr AnyTypeConverter::toAny(const unsigned char &value)
118 AnyPtr ptr(new Any_T<unsigned char>(value));
122 AnyPtr AnyTypeConverter::toAny(const int &value)
124 AnyPtr ptr(new Any_T<int>(value));
128 AnyPtr AnyTypeConverter::toAny(const unsigned int &value)
130 AnyPtr ptr(new Any_T<unsigned int>(value));
134 AnyPtr AnyTypeConverter::toAny(const long &value)
136 AnyPtr ptr(new Any_T<long>(value));
140 AnyPtr AnyTypeConverter::toAny(const unsigned long &value)
142 AnyPtr ptr(new Any_T<unsigned long>(value));
146 AnyPtr AnyTypeConverter::toAny(const double &value)
148 AnyPtr ptr(new Any_T<double>(value));
152 AnyPtr AnyTypeConverter::toAny(const std::string &value)
154 AnyPtr ptr(new Any_T<std::string>(value));
158 AnyPtr AnyTypeConverter::toAny(const tm &value)
160 AnyPtr ptr(new Any_T<tm>(value));
164 bool AnyTypeConverter::toBool(const AnyPtr& arg)
166 if(arg->getType() != PrimitiveType_Boolean)
167 ThrowMsg(InvalidArgumentException, "Type mismatch.");
169 return DPL::DynamicPointerCast< Any_T<bool> >(arg)->getValue();
172 char AnyTypeConverter::toChar(const AnyPtr& arg)
174 if(arg->getType() != PrimitiveType_Char)
175 ThrowMsg(InvalidArgumentException, "Type mismatch.");
177 return DPL::DynamicPointerCast< Any_T<char> >(arg)->getValue();
180 unsigned char AnyTypeConverter::toUChar(const AnyPtr& arg)
182 if(arg->getType() != PrimitiveType_UChar)
183 ThrowMsg(InvalidArgumentException, "Type mismatch.");
185 return DPL::DynamicPointerCast< Any_T<unsigned char> >(arg)->getValue();
188 int AnyTypeConverter::toInt(const AnyPtr& arg)
190 if(arg->getType() != PrimitiveType_Int)
191 ThrowMsg(InvalidArgumentException, "Type mismatch.");
193 return DPL::DynamicPointerCast< Any_T<int> >(arg)->getValue();
196 unsigned int AnyTypeConverter::toUInt(const AnyPtr& arg)
198 if(arg->getType() != PrimitiveType_UInt)
199 ThrowMsg(InvalidArgumentException, "Type mismatch.");
201 return DPL::DynamicPointerCast< Any_T<unsigned int> >(arg)->getValue();
204 long AnyTypeConverter::toLong(const AnyPtr& arg)
206 if(arg->getType() != PrimitiveType_Long)
207 ThrowMsg(InvalidArgumentException, "Type mismatch.");
209 return DPL::DynamicPointerCast< Any_T<long> >(arg)->getValue();
212 unsigned long AnyTypeConverter::toULong(const AnyPtr& arg)
214 if(arg->getType() != PrimitiveType_ULong)
215 ThrowMsg(InvalidArgumentException, "Type mismatch.");
217 return DPL::DynamicPointerCast< Any_T<unsigned long> >(arg)->getValue();
220 double AnyTypeConverter::toDouble(const AnyPtr& arg)
222 if(arg->getType() != PrimitiveType_Double)
223 ThrowMsg(InvalidArgumentException, "Type mismatch.");
225 return DPL::DynamicPointerCast< Any_T<double> >(arg)->getValue();
228 std::string AnyTypeConverter::toString(const AnyPtr& arg)
230 if(arg->getType() != PrimitiveType_String)
231 ThrowMsg(InvalidArgumentException, "Type mismatch.");
233 return DPL::DynamicPointerCast< Any_T<std::string> >(arg)->getValue();
236 tm AnyTypeConverter::toDateTm(const AnyPtr& arg)
238 if(arg->getType() != PrimitiveType_Time)
239 ThrowMsg(InvalidArgumentException, "Type mismatch.");
241 return DPL::DynamicPointerCast< Any_T<tm> >(arg)->getValue();
244 bool AnyTypeConverter::isDate(const JSValueRef& arg)
246 // this method originated from TizenApis::Commons::Validator::isDate()
247 if ( JSValueIsNull( m_context, arg ) || JSValueIsUndefined( m_context, arg ) || !JSValueIsObject( m_context, arg ) )