b370af402be075a3d17c8762bb96f939a8a4f0e9
[profile/ivi/wrt-plugins-tizen.git] / src / standards / Tizen / Application / ApplicationConverter.cpp
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 #include <dpl/log/log.h>
18 #include <CommonsJavaScript/JSUtils.h>
19 #include <CommonsJavaScript/Validator.h>
20 #include <CommonsJavaScript/ScopedJSStringRef.h>
21 #include <Commons/RegexUtils.h>
22 #include <Commons/Exception.h>
23
24 #include "ApplicationConverter.h"
25 #include "JSApplicationInformation.h"
26 #include "JSApplicationInformationArray.h"
27 #include "JSApplicationServiceExtraDataArray.h"
28 #include "JSApplicationServiceExtraData.h"
29 #include "JSApplicationServiceRequest.h"
30 #include "JSApplicationServiceReply.h"
31
32 namespace {
33         const char* APPLICATOIN_ATTRIBUTE_NAME = "name";
34         const char* APPLICATOIN_ATTRIBUTE_PACKAGE_NAME = "packageName";
35         const char* APPLICATOIN_ATTRIBUTE_ICONF_PATH = "iconPath";
36         const char* APPLICATOIN_ATTRIBUTE_VERSION = "version";
37         const char* APPLICATOIN_ATTRIBUTE_EXTRA_KEY = "key";
38         const char* APPLICATOIN_ATTRIBUTE_EXTRA_VALUE = "value";
39         const char* APPLICATOIN_ATTRIBUTE_OPERATION = "operation";
40         const char* APPLICATOIN_ATTRIBUTE_URI = "uri";
41         const char* APPLICATOIN_ATTRIBUTE_MIME = "mime";
42         const char* APPLICATOIN_ATTRIBUTE_EXTRADATA = "extraData";      
43 }
44
45 namespace TizenApis {
46 namespace Tizen1_0 {
47 namespace Application {
48
49 using namespace WrtDeviceApis;
50 using namespace WrtDeviceApis::CommonsJavaScript;
51 using namespace Api::Application;
52
53 std::vector<std::string> ApplicationConverter::m_allowedApplicationInformation;
54 std::vector<std::string> ApplicationConverter::m_allowedApplicationServiceRequest;
55 std::vector<std::string> ApplicationConverter::m_allowedApplicationServiceReply;
56 std::vector<std::string> ApplicationConverter::m_allowedApplicationServiceExtraData;
57
58 ApplicationConverter::ApplicationConverter(JSContextRef context) : Converter(context)
59 {
60     static bool init = initializeAllowedProperties();
61     (void) init;
62 }
63
64 ApplicationConverter::~ApplicationConverter()
65 {
66 }
67
68 JSValueRef ApplicationConverter::toJSValueRef(const ApplicationInformationPtr &arg)
69 {
70         if(arg == NULL)
71         {
72                 Throw(Commons::InvalidArgumentException);
73         }
74         return CommonsJavaScript::JSUtils::makeObject(m_context, JSApplicationInformation::getClassRef(), arg);
75 }
76
77 ApplicationInformationPtr ApplicationConverter::toApplicationInformation(const JSValueRef &jsValue)
78 {
79         if(JSApplicationInformation::isObjectOfClass(m_context, jsValue))
80                 return JSApplicationInformation::getApplicationInformation(m_context, jsValue);
81
82         CommonsJavaScript::Validator validator(m_context);
83         if (!validator.checkArrayKeys(m_allowedApplicationInformation, jsValue)) {
84                 LogError("invalid properties in contact object");
85                 ThrowMsg(Commons::ConversionException, "Wrong attribute");
86         }
87
88         const ScopedJSStringRef nameStr(JSStringCreateWithUTF8CString(APPLICATOIN_ATTRIBUTE_NAME));
89         const ScopedJSStringRef packageStr(JSStringCreateWithUTF8CString(APPLICATOIN_ATTRIBUTE_PACKAGE_NAME));
90         const ScopedJSStringRef iconPathStr(JSStringCreateWithUTF8CString(APPLICATOIN_ATTRIBUTE_ICONF_PATH));
91         const ScopedJSStringRef versionStr(JSStringCreateWithUTF8CString(APPLICATOIN_ATTRIBUTE_VERSION));       
92
93         JSObjectRef jsObject = toJSObjectRef(jsValue);
94
95         JSValueRef nameData = JSObjectGetProperty(m_context, jsObject, nameStr.get(), NULL);
96         JSValueRef packageData = JSObjectGetProperty(m_context, jsObject, packageStr.get(), NULL);
97         JSValueRef iconPathData = JSObjectGetProperty(m_context, jsObject, iconPathStr.get(), NULL);
98         JSValueRef versionData = JSObjectGetProperty(m_context, jsObject, versionStr.get(), NULL);      
99
100         std::string name;
101         std::string package;
102         std::string iconPath;
103         std::string version;    
104
105         ApplicationInformationPtr result(new ApplicationInformation());
106         if (!result) {
107                 Throw(Commons::ConversionException);
108         }
109
110         if (!JSValueIsUndefined(m_context, nameData)) {
111                 name = toString(nameData);
112                 result->setName(name);
113         }
114         if (!JSValueIsUndefined(m_context, packageData)) {
115                 package = toString(packageData);
116                 result->setPackage(package);
117         }
118         if (!JSValueIsUndefined(m_context, iconPathData)) {
119                 iconPath = toString(iconPathData);
120                 result->setIconPath(iconPath);
121         }
122         if (!JSValueIsUndefined(m_context, versionData)) {
123                 version = toString(versionData);
124                 result->setVersion(version);
125         }
126         
127         return result;
128 }
129
130 JSValueRef ApplicationConverter::toJSValueRef(const ApplicationInformationArrayPtr &arg)
131 {
132         if(arg == NULL)
133         {
134                 Throw(Commons::InvalidArgumentException);
135         }
136         return CommonsJavaScript::JSUtils::makeObject(m_context, JSApplicationInformationArray::getClassRef(), arg);
137 }
138
139 ApplicationInformationArrayPtr ApplicationConverter::toApplicationInformationArray(const JSValueRef &jsValue)
140 {
141         if(JSApplicationInformationArray::isObjectOfClass(m_context, jsValue))
142                 return JSApplicationInformationArray::getApplicationInformationArray(m_context, jsValue);
143
144         ApplicationInformationArrayPtr result(new ApplicationInformationArray());
145
146         JSObjectRef jsObject = toJSObjectRef(jsValue);
147     for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
148         JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
149         result->push_back(toApplicationInformation(element));
150     }
151     return result;
152 }
153
154 JSValueRef ApplicationConverter::toJSValueRef(const ApplicationServiceRequestPtr &arg)
155 {
156         LogDebug("entered");
157         return CommonsJavaScript::JSUtils::makeObject(m_context, JSApplicationServiceRequest::getClassRef(), arg);
158 }
159
160 ApplicationServiceRequestPtr ApplicationConverter::toApplicationServiceRequest(const JSValueRef &jsValue)
161 {
162         if(JSApplicationServiceRequest::isObjectOfClass(m_context, jsValue))
163                 return JSApplicationServiceRequest::getApplicationServiceRequest(m_context, jsValue);
164
165         CommonsJavaScript::Validator validator(m_context);
166         if (!validator.checkArrayKeys(m_allowedApplicationServiceRequest, jsValue)) {
167                 LogError("invalid properties in ApplicationServiceRequest object");
168                 ThrowMsg(Commons::ConversionException, "Wrong attribute");
169         }
170
171         const ScopedJSStringRef operationStr(JSStringCreateWithUTF8CString(APPLICATOIN_ATTRIBUTE_OPERATION));
172         const ScopedJSStringRef uriStr(JSStringCreateWithUTF8CString(APPLICATOIN_ATTRIBUTE_URI));
173         const ScopedJSStringRef mimeStr(JSStringCreateWithUTF8CString(APPLICATOIN_ATTRIBUTE_MIME));
174         const ScopedJSStringRef packageStr(JSStringCreateWithUTF8CString(APPLICATOIN_ATTRIBUTE_PACKAGE_NAME));
175         const ScopedJSStringRef extraDataStr(JSStringCreateWithUTF8CString(APPLICATOIN_ATTRIBUTE_EXTRADATA));   
176
177         JSObjectRef jsObject = toJSObjectRef(jsValue);
178
179         JSValueRef jsoperation = JSObjectGetProperty(m_context, jsObject, operationStr.get(), NULL);
180         JSValueRef jsuri = JSObjectGetProperty(m_context, jsObject, uriStr.get(), NULL);
181         JSValueRef jsmime = JSObjectGetProperty(m_context, jsObject, mimeStr.get(), NULL);
182         JSValueRef jspackage = JSObjectGetProperty(m_context, jsObject, packageStr.get(), NULL);
183         JSValueRef jsextradata = JSObjectGetProperty(m_context, jsObject, extraDataStr.get(), NULL);    
184
185         std::string operation;
186         std::string uri;
187         std::string mime;
188         std::string package;
189         ApplicationServiceExtraDataArrayPtr extraDataArray;
190         
191         ApplicationServiceRequestPtr result(new ApplicationServiceRequest());
192         if (!result) {
193                 Throw(Commons::ConversionException);
194         }
195
196         if (!JSValueIsUndefined(m_context, jsoperation)) {
197                 operation = toString(jsoperation);
198                 LogDebug("operation : "<<operation);
199                 result->setOperation(operation);
200         }
201
202         if (!JSValueIsUndefined(m_context, jsuri)) {
203                 uri = toString(jsuri);
204                 result->setUri(uri);
205         }
206
207         if (!JSValueIsUndefined(m_context, jsmime)) {
208                 mime = toString(jsmime);
209                 result->setMime(mime);
210         }
211
212         if (!JSValueIsUndefined(m_context, jspackage)) {
213                 package = toString(jspackage);
214                 LogDebug("package : "<<package);
215                 result->setPackage(package);
216         }
217
218         if (!JSValueIsUndefined(m_context, jsextradata)) {
219                 extraDataArray = toApplicationServiceExtraDataArray(jsextradata);
220                 result->setExtraDataArray(extraDataArray);
221         }
222         LogDebug("done");
223         return result;
224 }
225
226 JSValueRef ApplicationConverter::toJSValueRef(const ApplicationServiceReplyPtr &arg)
227 {
228         LogDebug("entered");
229         return CommonsJavaScript::JSUtils::makeObject(m_context, JSApplicationServiceReply::getClassRef(), arg);
230 }
231
232 ApplicationServiceReplyPtr ApplicationConverter::toApplicationServiceReply(const JSValueRef &jsValue)
233 {
234         if(JSApplicationServiceReply::isObjectOfClass(m_context, jsValue))
235                 return JSApplicationServiceReply::getApplicationServiceReply(m_context, jsValue);
236
237         CommonsJavaScript::Validator validator(m_context);
238         if (!validator.checkArrayKeys(m_allowedApplicationServiceReply, jsValue)) {
239                 LogError("invalid properties in ApplicationServiceReply object");
240                 ThrowMsg(Commons::ConversionException, "Wrong attribute");
241         }
242
243         const ScopedJSStringRef extraDataStr(JSStringCreateWithUTF8CString(APPLICATOIN_ATTRIBUTE_EXTRADATA));   
244
245         JSObjectRef jsObject = toJSObjectRef(jsValue);
246
247         JSValueRef jsextradata = JSObjectGetProperty(m_context, jsObject, extraDataStr.get(), NULL);    
248
249         ApplicationServiceExtraDataArrayPtr extraDataArray;
250         
251         ApplicationServiceReplyPtr result(new ApplicationServiceReply());
252         if (!result) {
253                 Throw(Commons::ConversionException);
254         }
255
256         if (!JSValueIsUndefined(m_context, jsextradata)) {
257                 extraDataArray = toApplicationServiceExtraDataArray(jsextradata);
258                 result->setExtraDataArray(extraDataArray);
259         }
260         LogDebug("done");
261         return result;
262 }
263
264 JSValueRef ApplicationConverter::toJSValueRef(const ApplicationServiceExtraDataPtr &arg)
265 {
266         LogDebug("entered");
267         return CommonsJavaScript::JSUtils::makeObject(m_context, JSApplicationServiceExtraData::getClassRef(), arg);
268 }
269
270 ApplicationServiceExtraDataPtr ApplicationConverter::toApplicationServiceExtraData(const JSValueRef &jsValue)
271 {
272         if(JSApplicationServiceExtraData::isObjectOfClass(m_context, jsValue))
273                 return JSApplicationServiceExtraData::getApplicationServiceExtraData(m_context, jsValue);
274
275         CommonsJavaScript::Validator validator(m_context);
276         if (!validator.checkArrayKeys(m_allowedApplicationServiceExtraData, jsValue)) {
277                 LogError("invalid properties in contact object");
278                 ThrowMsg(Commons::ConversionException, "Wrong attribute");
279         }
280
281         const ScopedJSStringRef extraDataKeyStr(JSStringCreateWithUTF8CString(APPLICATOIN_ATTRIBUTE_EXTRA_KEY));
282         const ScopedJSStringRef extraDataValueStr(JSStringCreateWithUTF8CString(APPLICATOIN_ATTRIBUTE_EXTRA_VALUE));
283
284         JSObjectRef jsObject = toJSObjectRef(jsValue);
285
286         JSValueRef extraDataKeyData = JSObjectGetProperty(m_context, jsObject, extraDataKeyStr.get(), NULL);
287         JSValueRef extraDataValueData = JSObjectGetProperty(m_context, jsObject, extraDataValueStr.get(), NULL);
288
289         std::string extraDataKey;
290         std::string extraDataValue;     
291
292         ApplicationServiceExtraDataPtr result(new ApplicationServiceExtraData());
293         if (!result) {
294                 Throw(Commons::ConversionException);
295         }
296
297         if (!JSValueIsUndefined(m_context, extraDataKeyData)) {
298                 extraDataKey = toString(extraDataKeyData);
299                 result->setKey(extraDataKey);
300         }
301
302         if (!JSValueIsUndefined(m_context, extraDataValueData)) {
303                 extraDataValue = toString(extraDataValueData);
304                 result->setValue(extraDataValue);
305         }
306         return result;
307 }
308
309 JSValueRef ApplicationConverter::toJSValueRef(const ApplicationServiceExtraDataArrayPtr &arg)
310 {
311         LogDebug("entered");
312         return CommonsJavaScript::JSUtils::makeObject(m_context, JSApplicationServiceExtraDataArray::getClassRef(), arg);
313 }
314
315 ApplicationServiceExtraDataArrayPtr ApplicationConverter::toApplicationServiceExtraDataArray(const JSValueRef &jsValue)
316 {
317         if(JSApplicationServiceExtraDataArray::isObjectOfClass(m_context, jsValue))
318                 return JSApplicationServiceExtraDataArray::getApplicationServiceExtraDataArray(m_context, jsValue);
319
320         ApplicationServiceExtraDataArrayPtr result(new ApplicationServiceExtraDataArray());
321
322         JSObjectRef jsObject = toJSObjectRef(jsValue);
323     for (std::size_t i = 0; i < JSGetArrayLength(m_context, jsObject); ++i) {
324         JSValueRef element = JSGetArrayElement(m_context, jsObject, i);
325         result->push_back(toApplicationServiceExtraData(element));
326     }
327     return result;
328 }
329
330 bool ApplicationConverter::initializeAllowedProperties()
331 {
332         m_allowedApplicationInformation.push_back(APPLICATOIN_ATTRIBUTE_NAME);
333         m_allowedApplicationInformation.push_back(APPLICATOIN_ATTRIBUTE_PACKAGE_NAME);
334         m_allowedApplicationInformation.push_back(APPLICATOIN_ATTRIBUTE_ICONF_PATH);
335         m_allowedApplicationInformation.push_back(APPLICATOIN_ATTRIBUTE_VERSION);       
336
337         m_allowedApplicationServiceRequest.push_back(APPLICATOIN_ATTRIBUTE_OPERATION);  
338         m_allowedApplicationServiceRequest.push_back(APPLICATOIN_ATTRIBUTE_URI);
339         m_allowedApplicationServiceRequest.push_back(APPLICATOIN_ATTRIBUTE_MIME);
340         m_allowedApplicationServiceRequest.push_back(APPLICATOIN_ATTRIBUTE_PACKAGE_NAME);
341         m_allowedApplicationServiceRequest.push_back(APPLICATOIN_ATTRIBUTE_EXTRADATA);
342
343         m_allowedApplicationServiceReply.push_back(APPLICATOIN_ATTRIBUTE_EXTRADATA);
344
345         m_allowedApplicationServiceExtraData.push_back(APPLICATOIN_ATTRIBUTE_EXTRA_KEY);
346         m_allowedApplicationServiceExtraData.push_back(APPLICATOIN_ATTRIBUTE_EXTRA_VALUE);
347
348         return true;
349 }
350
351 }
352 }
353 }