Update change log and spec for wrt-plugins-tizen_0.4.74
[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         LoggerE("Exception occured while get property");
159         return JSValueMakeUndefined(context);
160         }
161
162     try {
163         RequestedApplicationControlPtr providerMgr = priv->getObject();
164                 ApplicationConverterFactory::ConverterType converter = ApplicationConverterFactory::getConverter(context);
165
166         if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_APPLICATION_CONTROL)) {
167             return converter->toJSValueRef(providerMgr->getAppControl());
168         } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN_CALLER_APP_ID)) {
169             return converter->toJSValueRef(providerMgr->getCallerAppId());
170         }
171     } catch (...) {
172         LoggerE("Exception occured while get property");
173         return JSValueMakeUndefined(context);
174     }
175
176         /* do not return undefined object to find method */
177     return NULL;
178 }
179
180
181 JSValueRef JSRequestedApplicationControl::replyResult(JSContextRef context, 
182         JSObjectRef object, 
183         JSObjectRef thisObject, 
184         size_t argumentCount,
185         const JSValueRef arguments[], 
186         JSValueRef* exception) 
187 {
188         LoggerD("replyResult called");
189
190         TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
191         JSRequestedApplicationControlPriv *priv = static_cast<JSRequestedApplicationControlPriv*>(JSObjectGetPrivate(thisObject));
192
193         try {
194         if (!priv) {
195             ThrowMsg(ConversionException, "Object is null.");
196         }
197
198                 ArgumentValidator validator(context, argumentCount, arguments);
199
200                 JSObjectRef dataArrayObj = validator.toArrayObject(0, true);
201                 std::vector<ApplicationControlDataPtr> dataArray;
202                 if (dataArrayObj) {
203                         ApplicationConverterFactory::ConverterType converter = ApplicationConverterFactory::getConverter(context);
204                         dataArray = converter->toApplicationControlDataArray(arguments[0]);
205                 }
206                 RequestedApplicationControlPtr providerMgr = priv->getObject();
207                 providerMgr->replyResult(dataArray);
208
209                 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
210
211         return JSValueMakeUndefined(context);
212
213         } catch (const BasePlatformException &err) {
214                 return JSWebAPIErrorFactory::postException(context, exception, err);
215         } catch(const ConversionException& err) {
216                 return JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::TYPE_MISMATCH_ERROR, "");
217         } catch (const NotFoundException& ex) {
218            return JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::NOT_FOUND_ERROR, ex.GetMessage());
219         } catch (...) {
220                 DeviceAPI::Common::UnknownException err("Unknown Error in RequestedApplicationControl.replyResult().");
221                 return JSWebAPIErrorFactory::postException(context, exception, err);
222         }
223 }
224
225 JSValueRef JSRequestedApplicationControl::replyFailure(JSContextRef context, 
226         JSObjectRef object, 
227         JSObjectRef thisObject, 
228         size_t argumentCount,
229         const JSValueRef arguments[], 
230         JSValueRef* exception) 
231 {
232         LoggerD("replyFailure called");
233
234         TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
235         JSRequestedApplicationControlPriv *priv = static_cast<JSRequestedApplicationControlPriv*>(JSObjectGetPrivate(thisObject));
236
237         try {
238         if (!priv) {
239             ThrowMsg(ConversionException, "Object is null.");
240         }
241
242                 RequestedApplicationControlPtr providerMgr = priv->getObject();
243                 providerMgr->replyFailure();
244
245                 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
246         
247         return JSValueMakeUndefined(context);
248
249         } catch (const BasePlatformException &err) {
250         return JSWebAPIErrorFactory::postException(context, exception, err);
251     } catch (const NotFoundException& ex) {
252            return JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::NOT_FOUND_ERROR, ex.GetMessage());
253         } catch (...) {
254         DeviceAPI::Common::UnknownException err("Unknown Error in RequestedApplicationControl.replyFailure().");
255         return JSWebAPIErrorFactory::postException(context, exception, err);
256     }
257 }
258
259 }
260 }