a6eb790469e4b1733803a62d07109da9f0e5d92f
[framework/web/wrt-plugins-tizen.git] / src / Application / JSApplicationControlData.cpp
1 //
2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
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.
16 //
17
18 #include <dpl/shared_ptr.h>
19 #include <CommonsJavaScript/Converter.h>
20 #include <CommonsJavaScript/JSDOMExceptionFactory.h>
21
22 #include <ArgumentValidator.h>
23 #include <JSWebAPIErrorFactory.h>
24 #include <JSUtil.h>
25 #include <Export.h>
26 #include "JSApplicationControlData.h"
27 #include "ApplicationConverter.h"
28 #include "ApplicationUtil.h"
29
30 using namespace WrtDeviceApis::Commons;
31 using namespace WrtDeviceApis::CommonsJavaScript;
32 using namespace DeviceAPI::Common;
33
34 namespace DeviceAPI {
35 namespace Application {
36
37 JSClassRef JSApplicationControlData::m_classRef = NULL;
38
39 JSClassDefinition JSApplicationControlData::m_classInfo =
40 {
41         0,
42         kJSClassAttributeNone,
43         TIZEN_INTERFACE_APPLICATION_CONTROL_DATA,
44         NULL,
45         m_property,
46         m_functions,
47         initialize,
48         finalize,
49         NULL, //hasProperty,
50         NULL, //GetProperty,
51         NULL, //SetProperty,
52         NULL, //DeleteProperty,
53         NULL, //getPropertyNames,
54         NULL,
55         NULL,
56         NULL,
57         NULL, //ConvertToType,
58 };
59
60 JSStaticValue JSApplicationControlData::m_property[] = {
61         { TIZEN_APPLICATION_CONTROL_DATA_KEY, getProperty, setProperty, kJSPropertyAttributeNone },
62         { TIZEN_APPLICATION_CONTROL_DATA_VALUE, getProperty, setProperty, kJSPropertyAttributeNone },
63         { 0, 0, 0, 0 }
64 };
65
66 JSStaticFunction JSApplicationControlData::m_functions[] =
67 {
68         { 0, 0, 0 }
69 };
70
71 JSClassRef DLL_EXPORT JSApplicationControlData::getClassRef() {
72         if (!m_classRef) {
73                 m_classRef = JSClassCreate(&m_classInfo);
74         }
75         return m_classRef;
76 }
77
78 JSObjectRef JSApplicationControlData::createJSObject(JSContextRef context, const ApplicationControlDataPtr &appdata)
79 {
80         JSApplicationControlDataPriv *priv = new JSApplicationControlDataPriv(context, appdata);
81
82         if (!priv) {
83                 throw TypeMismatchException("Private object is null");
84         }
85
86         return JSObjectMake(context, getClassRef(), priv);
87 }
88
89 JSObjectRef DLL_EXPORT JSApplicationControlData::constructor(JSContextRef context, JSObjectRef constructor, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
90 {
91         ArgumentValidator validator(context, argumentCount, arguments);
92
93         ApplicationControlDataPtr appdata(new ApplicationControlData());
94
95         try {
96             appdata->setKey(validator.toString(0));
97                 appdata->setValue(JSUtil::JSArrayToStringVector(context, validator.toArrayObject(1)));
98         } catch (BasePlatformException &err) {
99                 LoggerE("Exception occured while creating constructor : " << err.getMessage());
100         }
101
102     JSApplicationControlDataPriv *priv = new JSApplicationControlDataPriv(context, appdata);
103     JSObjectRef obj = JSObjectMake(context, getClassRef(),priv);
104
105     JSStringRef ctorName = JSStringCreateWithUTF8CString("constructor");
106     JSObjectSetProperty(context, obj, ctorName, constructor,
107         kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete | kJSPropertyAttributeDontEnum, NULL);
108     JSStringRelease(ctorName);
109
110     return obj;
111 }
112
113 void JSApplicationControlData::initialize(JSContextRef context, JSObjectRef object)
114 {
115 }
116
117 void JSApplicationControlData::finalize(JSObjectRef object)
118 {
119     JSApplicationControlDataPriv* priv = static_cast<JSApplicationControlDataPriv*>(JSObjectGetPrivate(object));
120     JSObjectSetPrivate(object, NULL);
121     delete priv;        
122 }
123
124 bool JSApplicationControlData::isObjectOfClass(JSContextRef context, JSValueRef value)
125 {
126         return JSValueIsObjectOfClass(context, value, getClassRef());
127 }
128
129 ApplicationControlDataPtr JSApplicationControlData::getPrivData(JSObjectRef object)
130 {
131         JSApplicationControlDataPriv *priv = static_cast<JSApplicationControlDataPriv*>(JSObjectGetPrivate(object));
132         if (!priv) {
133                 throw TypeMismatchException("Private object is null");
134         }
135         ApplicationControlDataPtr result = priv->getObject();
136         if (!result) {
137                 throw TypeMismatchException("Private object is null");
138         }
139         return result;
140 }
141
142 ApplicationControlDataPtr JSApplicationControlData::getApplicationControlData(JSContextRef context, JSValueRef value)
143 {
144         if (!isObjectOfClass(context, value)) {
145                 throw TypeMismatchException("is not a object class");
146         }
147         JSObjectRef object = JSValueToObject(context, value, NULL);
148         if (!object) {
149                 throw TypeMismatchException("Fail to get object");
150         }
151         JSApplicationControlDataPriv *priv = static_cast<JSApplicationControlDataPriv*>(JSObjectGetPrivate(object));
152         if (!priv) {
153                 throw TypeMismatchException("Private object is null");
154         }
155         return priv->getObject();
156 }
157
158
159 JSValueRef JSApplicationControlData::getProperty(JSContextRef context,
160                 JSObjectRef object,
161                 JSStringRef propertyName,
162                 JSValueRef* exception)
163 {
164         try {
165                 WrtDeviceApis::CommonsJavaScript::Converter converter(context);
166                 ApplicationControlDataPtr privateData = getPrivData(object);
167                 
168                 if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_APPLICATION_CONTROL_DATA_KEY)) {
169                         return converter.toJSValueRef(privateData->getKey());
170                 } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_APPLICATION_CONTROL_DATA_VALUE)) {
171                         return converter.toJSValueRef(privateData->getValue());
172                 } 
173         } catch (const BasePlatformException &err) {
174         return JSWebAPIErrorFactory::postException(context, exception, err);
175     } catch (...) {
176         DeviceAPI::Common::TypeMismatchException err("TypeMismatchException occured");
177         return JSWebAPIErrorFactory::postException(context, exception, err);
178     }
179         
180         return JSValueMakeUndefined(context);
181 }
182
183 bool JSApplicationControlData::setProperty(JSContextRef context,
184                         JSObjectRef object,
185                         JSStringRef propertyName,
186                         JSValueRef value,
187                         JSValueRef* exception)
188 {
189         try {
190                 WrtDeviceApis::CommonsJavaScript::Converter converter(context);
191                 ApplicationControlDataPtr privateData = getPrivData(object);
192                 
193                 if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_APPLICATION_CONTROL_DATA_KEY)) {
194                         privateData->setKey(converter.toString(value));
195                         return true;
196                 } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_APPLICATION_CONTROL_DATA_VALUE)) {
197                         privateData->setValue(converter.toVectorOfStrings(value));
198                         return true;                    
199                 } 
200         } catch (const BasePlatformException &err) {
201         return JSWebAPIErrorFactory::postException(context, exception, err);
202     } catch (...) {
203         DeviceAPI::Common::TypeMismatchException err("TypeMismatchException occured");
204         return JSWebAPIErrorFactory::postException(context, exception, err);
205     }
206         
207         return false;
208 }
209
210 }
211 }