Update change log and spec for wrt-plugins-tizen_0.4.51
[framework/web/wrt-plugins-tizen.git] / src / Application / JSRequestedApplicationControl.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 <cassert>
19 #include <memory>
20
21 #include <SecurityExceptions.h>
22 #include <JSWebAPIError.h>
23 #include <ArgumentValidator.h>
24
25 #include "plugin_config.h"
26 #include "ApplicationConverter.h"
27 #include "ApplicationUtil.h"
28 #include "JSRequestedApplicationControl.h"
29 #include <Export.h>
30
31 #include <TimeTracer.h>
32
33 #include <Logger.h>
34
35 using namespace WrtDeviceApis::Commons;
36 using namespace WrtDeviceApis::CommonsJavaScript;
37 using namespace DeviceAPI::Common;
38
39 namespace DeviceAPI {
40 namespace Application {
41
42 using WrtDeviceApis::Commons::NotFoundException;
43
44 JSClassRef JSRequestedApplicationControl::m_jsClassRef = NULL;
45
46 JSClassDefinition JSRequestedApplicationControl::m_classInfo = {
47     0,
48     kJSClassAttributeNone,
49     TIZEN_INTERFACE_REQUESTED_APPLICATION_CONTROL,
50     0,
51     m_property,
52     m_function,
53     initialize,
54     finalize,
55     NULL,     //HasProperty,
56     NULL,
57     NULL,     //SetProperty,
58     NULL,     //DeleteProperty,
59     NULL,     //GetPropertyNames,
60     NULL,     //CallAsFunction,
61     NULL,     //CallAsConstructor,
62     NULL,
63     NULL,     //ConvertToType
64 };
65
66 JSStaticValue JSRequestedApplicationControl::m_property[] = {
67     { TIZEN_APPLICATION_CONTROL, getProperty, NULL, kJSPropertyAttributeNone },
68     { TIZEN_CALLER_APP_ID, getProperty, NULL, kJSPropertyAttributeNone },
69     { 0, 0, 0, 0 }
70 };
71
72 JSStaticFunction JSRequestedApplicationControl::m_function[] = {
73                 { APPLICATION_FUNCTION_API_REPLY_RESULT, JSRequestedApplicationControl::replyResult, kJSPropertyAttributeNone },
74                 { APPLICATION_FUNCTION_API_REPLY_FAILURE, JSRequestedApplicationControl::replyFailure,kJSPropertyAttributeNone },
75                 { 0, 0, 0 }
76 };
77
78 const JSClassDefinition* JSRequestedApplicationControl::getClassInfo()
79 {
80     return &m_classInfo;
81 }
82
83 JSClassRef DLL_EXPORT JSRequestedApplicationControl::getClassRef()
84 {
85     if (!m_jsClassRef) {
86         m_jsClassRef = JSClassCreate(&m_classInfo);
87     }
88         
89     return m_jsClassRef;
90 }
91
92 JSObjectRef JSRequestedApplicationControl::createJSObject(JSContextRef context, const RequestedApplicationControlPtr &appsvc)
93 {
94     JSRequestedApplicationControlPriv *priv = new JSRequestedApplicationControlPriv(context, appsvc);
95
96     if (!priv) {
97         ThrowMsg(WrtDeviceApis::Commons::NullPointerException, "Can not new an object");
98     }
99         
100     return JSObjectMake(context, getClassRef(), priv);
101 }
102
103
104
105 void JSRequestedApplicationControl::initialize(JSContextRef context,JSObjectRef object)
106 {
107 }
108
109 void JSRequestedApplicationControl::finalize(JSObjectRef object)
110 {
111     JSRequestedApplicationControlPriv* priv = static_cast<JSRequestedApplicationControlPriv*>(JSObjectGetPrivate(object));
112     JSObjectSetPrivate(object, NULL);
113     delete priv;
114 }
115
116
117 bool JSRequestedApplicationControl::isObjectOfClass(JSContextRef context, JSValueRef value)
118 {
119         return JSValueIsObjectOfClass(context, value, getClassRef());
120 }
121
122 RequestedApplicationControlPtr JSRequestedApplicationControl::getRequestedApplicationControl(JSContextRef context, JSValueRef value)
123 {
124         if (!isObjectOfClass(context, value)) {
125                 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
126         }
127         
128         JSObjectRef object = JSValueToObject(context, value, NULL);
129         if (!object) {
130                 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
131         }
132         
133         JSRequestedApplicationControlPriv *priv = static_cast<JSRequestedApplicationControlPriv*>(JSObjectGetPrivate(object));
134         if (!priv) {
135                 Throw(WrtDeviceApis::Commons::InvalidArgumentException);
136         }
137         return priv->getObject();
138 }
139
140
141 RequestedApplicationControlPtr JSRequestedApplicationControl::getPrivData(JSObjectRef object)
142 {
143         JSRequestedApplicationControlPriv *priv = static_cast<JSRequestedApplicationControlPriv*>(JSObjectGetPrivate(object));
144         if (!priv) {
145                 ThrowMsg(WrtDeviceApis::Commons::NullPointerException, "Private object is null");
146         }
147         RequestedApplicationControlPtr result = priv->getObject();
148         if (!result) {
149                 ThrowMsg(WrtDeviceApis::Commons::NullPointerException, "Private object is null");
150         }
151         return result;
152 }
153
154 JSValueRef JSRequestedApplicationControl::getProperty(JSContextRef context, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception)
155 {
156     JSRequestedApplicationControlPriv *priv = static_cast<JSRequestedApplicationControlPriv*>(JSObjectGetPrivate(object));
157     if (!priv) {
158                 return JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "Type mistmatch error.");
159         }
160
161     try {
162         RequestedApplicationControlPtr providerMgr = priv->getObject();
163                 ApplicationConverterFactory::ConverterType converter = ApplicationConverterFactory::getConverter(context);
164
165         if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_APPLICATION_CONTROL)) {
166             return converter->toJSValueRef(providerMgr->getAppControl());
167         } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_CALLER_APP_ID)) {
168             return converter->toJSValueRef(providerMgr->getCallerAppId());
169         }
170     } catch (const BasePlatformException &err) {
171         LoggerW("Getting property is failed. %s", err.getMessage().c_str());
172     } catch (...) {
173         DeviceAPI::Common::UnknownException err("Unknown Error in RequestedApplicationControl.replyFailure().");
174         LoggerW("Getting property is failed. %s", err.getMessage().c_str());
175     }
176
177         /* do not return undefined object to find method */
178     return NULL;
179 }
180
181
182 JSValueRef JSRequestedApplicationControl::replyResult(JSContextRef context, 
183         JSObjectRef object, 
184         JSObjectRef thisObject, 
185         size_t argumentCount,
186         const JSValueRef arguments[], 
187         JSValueRef* exception) 
188 {
189         TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
190         JSRequestedApplicationControlPriv *priv = static_cast<JSRequestedApplicationControlPriv*>(JSObjectGetPrivate(thisObject));
191
192         try {
193         if (!priv) {
194             ThrowMsg(ConversionException, "Object is null.");
195         }
196
197                 ArgumentValidator validator(context, argumentCount, arguments);
198
199                 JSObjectRef dataArrayObj = validator.toArrayObject(0, true);
200                 std::vector<ApplicationControlDataPtr> dataArray;
201                 if (dataArrayObj) {
202                         ApplicationConverterFactory::ConverterType converter = ApplicationConverterFactory::getConverter(context);
203                         dataArray = converter->toApplicationControlDataArray(arguments[0]);
204                 }
205                 RequestedApplicationControlPtr providerMgr = priv->getObject();
206                 providerMgr->replyResult(dataArray);
207
208                 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
209
210         return JSValueMakeUndefined(context);
211
212         } catch (const BasePlatformException &err) {
213                 return JSWebAPIErrorFactory::postException(context, exception, err);
214         }  catch(const ConversionException& err) {
215                 return JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "");
216         } catch (...) {
217                 DeviceAPI::Common::UnknownException err("Unknown Error in RequestedApplicationControl.replyResult().");
218                 return JSWebAPIErrorFactory::postException(context, exception, err);
219         }
220 }
221
222 JSValueRef JSRequestedApplicationControl::replyFailure(JSContextRef context, 
223         JSObjectRef object, 
224         JSObjectRef thisObject, 
225         size_t argumentCount,
226         const JSValueRef arguments[], 
227         JSValueRef* exception) 
228 {
229         TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
230         JSRequestedApplicationControlPriv *priv = static_cast<JSRequestedApplicationControlPriv*>(JSObjectGetPrivate(thisObject));
231
232         try {
233         if (!priv) {
234             ThrowMsg(ConversionException, "Object is null.");
235         }
236
237                 RequestedApplicationControlPtr providerMgr = priv->getObject();
238                 providerMgr->replyFailure();
239
240                 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
241         
242         return JSValueMakeUndefined(context);
243
244         } catch (const BasePlatformException &err) {
245         return JSWebAPIErrorFactory::postException(context, exception, err);
246     } catch (...) {
247         DeviceAPI::Common::UnknownException err("Unknown Error in RequestedApplicationControl.replyFailure().");
248         return JSWebAPIErrorFactory::postException(context, exception, err);
249     }
250 }
251
252 }
253 }