2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
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
9 // http://www.apache.org/licenses/LICENSE-2.0
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.
18 #include <JSTizenExceptionFactory.h>
19 #include <JSTizenException.h>
20 #include <SecurityExceptions.h>
22 #include <ArgumentValidator.h>
23 #include <PlatformException.h>
24 #include <JSWebAPIException.h>
26 #include <CommonsJavaScript/Converter.h>
27 //#include <CommonsJavaScript/JSUtils.h>
28 //#include <CommonsJavaScript/Utils.h>
31 #include <GlobalContextManager.h>
32 #include <TimeTracer.h>
34 #include "JSPackageManager.h"
35 #include "JSPackageInformation.h"
37 #include "PackageManager.h"
38 #include "PackageInformation.h"
39 #include "plugin_config.h"
46 using namespace WrtDeviceApis::Commons;
47 using namespace WrtDeviceApis::CommonsJavaScript;
48 using namespace DeviceAPI::Common;
50 JSClassRef JSPackageManager::m_jsClassRef = NULL;
52 JSClassDefinition JSPackageManager::m_classInfo = {
53 0, // current (and only) version is 0
54 kJSClassAttributeNone, // attributes
55 TIZEN_INTERFACE_PACKAGE_MANAGER, // class name
57 NULL, // static values
58 m_function, // static functions
59 initialize, // initialize
64 NULL, // deleteProperty
65 NULL, // getPropertyNames
66 NULL, // callAsConstructor
67 NULL, // callAsConstructor
72 JSStaticFunction JSPackageManager::m_function[] = {
73 { PACKAGE_FUNCTION_API_INSTALL, JSPackageManager::install, kJSPropertyAttributeNone },
74 { PACKAGE_FUNCTION_API_UNINSTALL, JSPackageManager::uninstall, kJSPropertyAttributeNone },
75 { PACKAGE_FUNCTION_API_GET_PACKAGE_INFO, JSPackageManager::getPackageInfo, kJSPropertyAttributeNone },
76 { PACKAGE_FUNCTION_API_GET_PACKAGES_INFO, JSPackageManager::getPackagesInfo, kJSPropertyAttributeNone },
77 { PACKAGE_FUNCTION_API_SET_PACKAGE_INFO_EVENT_LISTENER, JSPackageManager::setPackageInfoEventListener, kJSPropertyAttributeNone },
78 { PACKAGE_FUNCTION_API_UNSET_PACKAGE_INFO_EVENT_LISTENER, JSPackageManager::unsetPackageInfoEventListener, kJSPropertyAttributeNone },
82 const JSClassRef JSPackageManager::getClassRef()
85 m_jsClassRef = JSClassCreate(&m_classInfo);
91 const JSClassDefinition* JSPackageManager::getClassInfo()
96 void JSPackageManager::initialize(JSContextRef context, JSObjectRef object)
101 void JSPackageManager::finalize(JSObjectRef object)
103 CallbackUserData *callback = static_cast<CallbackUserData*>(JSObjectGetPrivate(object));
104 if( callback != NULL ){
105 JSObjectSetPrivate(object, NULL);
110 JSValueRef JSPackageManager::install(JSContextRef context,
112 JSObjectRef thisObject,
113 size_t argumentCount,
114 const JSValueRef arguments[],
115 JSValueRef* exception)
118 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
120 AceSecurityStatus status = PACKAGE_CHECK_ACCESS(PACKAGE_FUNCTION_API_INSTALL);
121 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
124 ArgumentValidator validator(context, argumentCount, arguments);
126 string path = validator.toString(0);
128 JSObjectRef eventCBObj = validator.toCallbackObject(1, false, "onprogress", "oncomplete", NULL);
129 JSObjectRef errCB = validator.toFunction(2, true);
131 CallbackUserData *onprogressCb = NULL;
132 CallbackUserData *oncompleteCb = NULL;
133 CallbackUserData *onerrorCb = NULL;
135 JSValueRef onprogress = JSUtil::getProperty(context, eventCBObj, "onprogress", exception);
136 if (!JSValueIsUndefined(context, onprogress)) {
137 onprogressCb = new CallbackUserData(GlobalContextManager::getInstance()->getGlobalContext(context));
138 onprogressCb->setSuccessCallback(onprogress);
141 JSValueRef oncomplete = JSUtil::getProperty(context, eventCBObj, "oncomplete", exception);
142 if (!JSValueIsUndefined(context, oncomplete)) {
143 oncompleteCb = new CallbackUserData(GlobalContextManager::getInstance()->getGlobalContext(context));
144 oncompleteCb->setSuccessCallback(oncomplete);
148 onerrorCb = new CallbackUserData(GlobalContextManager::getInstance()->getGlobalContext(context));
149 onerrorCb->setSuccessCallback(errCB);
152 PackageInstallEventCallback *pkgInstallEventCB = new PackageInstallEventCallback(GlobalContextManager::getInstance()->getGlobalContext(context), onprogressCb, oncompleteCb, onerrorCb);
154 PackageManager::getInstance()->install(path, pkgInstallEventCB);
155 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
156 return JSValueMakeUndefined(context);
158 } catch (const BasePlatformException &err) {
159 return JSWebAPIException::throwException(context, exception, err);
161 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getAppSharedURI().");
162 return JSWebAPIException::throwException(context, exception, err);
167 JSValueRef JSPackageManager::uninstall(JSContextRef context,
169 JSObjectRef thisObject,
170 size_t argumentCount,
171 const JSValueRef arguments[],
172 JSValueRef* exception)
175 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
177 AceSecurityStatus status = PACKAGE_CHECK_ACCESS(PACKAGE_FUNCTION_API_INSTALL);
178 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
181 ArgumentValidator validator(context, argumentCount, arguments);
183 string id = validator.toString(0);
184 //JSObjectRef eventCBObj = validator.toObject(1, true);
185 JSObjectRef eventCBObj = validator.toCallbackObject(1, false, "onprogress", "oncomplete", NULL);
186 JSObjectRef errCB = validator.toFunction(2, true);
188 CallbackUserData *onprogressCb = NULL;
189 CallbackUserData *oncompleteCb = NULL;
190 CallbackUserData *onerrorCb = NULL;
192 JSValueRef onprogress = JSUtil::getProperty(context, eventCBObj, "onprogress", exception);
193 if (!JSValueIsUndefined(context, onprogress)) {
194 onprogressCb = new CallbackUserData(GlobalContextManager::getInstance()->getGlobalContext(context));
195 onprogressCb->setSuccessCallback(onprogress);
198 JSValueRef oncomplete = JSUtil::getProperty(context, eventCBObj, "oncomplete", exception);
199 if (!JSValueIsUndefined(context, oncomplete)) {
200 oncompleteCb = new CallbackUserData(GlobalContextManager::getInstance()->getGlobalContext(context));
201 oncompleteCb->setSuccessCallback(oncomplete);
205 onerrorCb = new CallbackUserData(GlobalContextManager::getInstance()->getGlobalContext(context));
206 onerrorCb->setSuccessCallback(errCB);
209 PackageInstallEventCallback *pkgInstallEventCB = new PackageInstallEventCallback(GlobalContextManager::getInstance()->getGlobalContext(context), onprogressCb, oncompleteCb, onerrorCb);
211 PackageManager::getInstance()->uninstall(id, pkgInstallEventCB);
212 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
213 return JSValueMakeUndefined(context);
215 } catch (const BasePlatformException &err) {
216 return JSWebAPIException::throwException(context, exception, err);
218 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getAppSharedURI().");
219 return JSWebAPIException::throwException(context, exception, err);
224 JSValueRef JSPackageManager::getPackagesInfo(JSContextRef context,
226 JSObjectRef thisObject,
227 size_t argumentCount,
228 const JSValueRef arguments[],
229 JSValueRef* exception)
232 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
234 AceSecurityStatus status = PACKAGE_CHECK_ACCESS(PACKAGE_FUNCTION_API_GET_PACKAGES_INFO);
235 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
238 ArgumentValidator validator(context, argumentCount, arguments);
239 JSObjectRef successCBObj = validator.toFunction(0);
240 JSObjectRef errCB = validator.toFunction(1, true);
242 PackageInfoCallbackData *callback = new PackageInfoCallbackData(GlobalContextManager::getInstance()->getGlobalContext(context));
243 callback->setSuccessCallback(successCBObj);
244 if (argumentCount > 1) {
245 callback->setErrorCallback(errCB);
248 PackageManager::getInstance()->getPackagesInfo(callback);
249 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
250 return JSValueMakeUndefined(context);
252 } catch (const BasePlatformException &err) {
253 return JSWebAPIException::throwException(context, exception, err);
255 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getAppSharedURI().");
256 return JSWebAPIException::throwException(context, exception, err);
260 JSValueRef JSPackageManager::getPackageInfo(JSContextRef context,
262 JSObjectRef thisObject,
263 size_t argumentCount,
264 const JSValueRef arguments[],
265 JSValueRef* exception)
268 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
270 AceSecurityStatus status = PACKAGE_CHECK_ACCESS(PACKAGE_FUNCTION_API_GET_PACKAGE_INFO);
271 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
274 ArgumentValidator validator(context, argumentCount, arguments);
275 string id = validator.toString(0, true);
276 //LoggerD("id = " << id);
278 PackageInformation* pkgInfo = PackageManager::getInstance()->getPackageInfo(id);
279 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
280 return JSPackageInformation::createJSObject(context, pkgInfo);
282 } catch (const BasePlatformException &err) {
283 return JSWebAPIException::throwException(context, exception, err);
285 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getAppSharedURI().");
286 return JSWebAPIException::throwException(context, exception, err);
291 JSValueRef JSPackageManager::setPackageInfoEventListener(JSContextRef context,
293 JSObjectRef thisObject,
294 size_t argumentCount,
295 const JSValueRef arguments[],
296 JSValueRef* exception)
299 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
301 AceSecurityStatus status = PACKAGE_CHECK_ACCESS(PACKAGE_FUNCTION_API_SET_PACKAGE_INFO_EVENT_LISTENER);
302 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
305 ArgumentValidator validator(context, argumentCount, arguments);
307 JSObjectRef eventCBObj = validator.toCallbackObject(0, false, "oninstalled", "onupdated", "onuninstalled", NULL);
309 CallbackUserData *oninstalledCb = NULL;
310 CallbackUserData *onupdatedCb = NULL;
311 CallbackUserData *onuninstalledCb = NULL;
313 JSValueRef oninstalled = JSUtil::getProperty(context, eventCBObj, "oninstalled", exception);
314 if (!JSValueIsUndefined(context, oninstalled)) {
315 oninstalledCb = new CallbackUserData(GlobalContextManager::getInstance()->getGlobalContext(context));
316 oninstalledCb->setSuccessCallback(oninstalled);
319 JSValueRef onupdated = JSUtil::getProperty(context, eventCBObj, "onupdated", exception);
320 if (!JSValueIsUndefined(context, onupdated)) {
321 onupdatedCb = new CallbackUserData(GlobalContextManager::getInstance()->getGlobalContext(context));
322 onupdatedCb->setSuccessCallback(onupdated);
325 JSValueRef onuninstalled = JSUtil::getProperty(context, eventCBObj, "onuninstalled", exception);
326 if (!JSValueIsUndefined(context, onuninstalled)) {
327 onuninstalledCb = new CallbackUserData(GlobalContextManager::getInstance()->getGlobalContext(context));
328 onuninstalledCb->setSuccessCallback(onuninstalled);
331 PackageInfoEventCallback *pkginfoEventCB = new PackageInfoEventCallback(oninstalledCb, onupdatedCb, onuninstalledCb);
333 PackageManager::getInstance()->setPackageInfoEventListener(pkginfoEventCB);
334 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
335 return JSValueMakeUndefined(context);
337 } catch (const BasePlatformException &err) {
338 return JSWebAPIException::throwException(context, exception, err);
340 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getAppSharedURI().");
341 return JSWebAPIException::throwException(context, exception, err);
345 JSValueRef JSPackageManager::unsetPackageInfoEventListener(JSContextRef context,
347 JSObjectRef thisObject,
348 size_t argumentCount,
349 const JSValueRef arguments[],
350 JSValueRef* exception)
353 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
355 AceSecurityStatus status = PACKAGE_CHECK_ACCESS(PACKAGE_FUNCTION_API_UNSET_PACKAGE_INFO_EVENT_LISTENER);
356 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
359 PackageManager::getInstance()->unsetPackageInfoEventListener();
360 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
361 return JSValueMakeUndefined(context);
363 } catch(const BasePlatformException& err) {
364 return JSWebAPIException::throwException(context, exception, err);
370 JSValueRef JSPackageManager::move(JSContextRef context,
372 JSObjectRef thisObject,
373 size_t argumentCount,
374 const JSValueRef arguments[],
375 JSValueRef* exception)
379 //AceSecurityStatus status = PACKAGE_CHECK_ACCESS(PACKAGE_FUNCTION_API_MOVE);
380 //TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
383 Converter converter(context);
384 JSValueRef checkedArguments[4];
386 ArgumentValidationChecker::check(context, argumentCount, arguments, 4, checkedArguments,
387 ArgumentValidationChecker::MANDATORY, ArgumentValidationChecker::String,
388 ArgumentValidationChecker::MANDATORY, ArgumentValidationChecker::String,
389 ArgumentValidationChecker::MANDATORY | ArgumentValidationChecker::NULLABLE, ArgumentValidationChecker::Object,
390 ArgumentValidationChecker::OPTIONAL | ArgumentValidationChecker::NULLABLE, ArgumentValidationChecker::Function,
391 ArgumentValidationChecker::END);
393 string id = converter.toString(checkedArguments[0]);
394 string storage = converter.toString(checkedArguments[1]);
395 if ((storage.compare("EXTERNAL") != 0) && (storage.compare("INTERNAL") != 0)) {
396 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong second parameter type");
399 JSObjectRef eventCBObj = converter.toJSObjectRef(arguments[2]);
400 JSValueRef onprogress = JSUtils::getJSPropertyOrUndefined(context, eventCBObj, "onprogress");
401 JSValueRef oncomplete = JSUtils::getJSPropertyOrUndefined(context, eventCBObj, "oncomplete");
403 if (!JSObjectIsFunction(context, converter.toJSObjectRef(onprogress)) ||
404 !JSObjectIsFunction(context, converter.toJSObjectRef(oncomplete))) {
405 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Wrong third parameter type");
408 CallbackUserData *onprogressCb = new CallbackUserData(GlobalContextManager::getInstance()->getGlobalContext(context));
409 onprogressCb->setSuccessCallback(onprogress);
411 CallbackUserData *oncompleteCb = new CallbackUserData(GlobalContextManager::getInstance()->getGlobalContext(context));
412 oncompleteCb->setSuccessCallback(oncomplete);
414 if (argumentCount > 2) {
415 oncompleteCb->setErrorCallback(checkedArguments[3]);
418 PackageInstallEventCallback *pkgInstallEventCB = new PackageInstallEventCallback(onprogressCb, oncompleteCb);
420 PackageManager::getInstance()->move(id, storage, pkgInstallEventCB);
422 } Catch (NotFoundException) {
423 LoggerW("Exception: "<<_rethrown_exception.GetMessage());
424 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_FOUND_ERROR, _rethrown_exception.GetMessage());
425 } Catch (ConversionException) {
426 LoggerW("Exception: "<<_rethrown_exception.GetMessage());
427 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, _rethrown_exception.GetMessage());
428 } Catch (Exception) {
429 LoggerW("Exception: "<<_rethrown_exception.GetMessage());
430 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, _rethrown_exception.GetMessage());
433 return JSValueMakeUndefined(context);
437 JSValueRef JSPackageManager::isInstalled(JSContextRef context,
439 JSObjectRef thisObject,
440 size_t argumentCount,
441 const JSValueRef arguments[],
442 JSValueRef* exception)
446 //AceSecurityStatus status = PACKAGE_CHECK_ACCESS(PACKAGE_FUNCTION_API_IS_INSTALLED);
447 //TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
449 // Should I change first parameter to "undefined" or throw exception???
450 if (argumentCount < 1) {
451 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "wrong parameter");
455 WrtDeviceApis::CommonsJavaScript::Converter converter(context);
456 string id = converter.toString(arguments[0]);
458 return converter.toJSValueRef(PackageManager::getInstance()->isInstalled(id));
459 } Catch (NotFoundException) {
460 LoggerW("Exception: "<<_rethrown_exception.GetMessage());
461 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_FOUND_ERROR, _rethrown_exception.GetMessage());
462 } Catch (ConversionException) {
463 LoggerW("Exception: "<<_rethrown_exception.GetMessage());
464 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, _rethrown_exception.GetMessage());
465 } Catch (Exception) {
466 LoggerW("Exception: "<<_rethrown_exception.GetMessage());
467 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, _rethrown_exception.GetMessage());
473 JSValueRef JSPackageManager::getPackageIdFromAppId(JSContextRef context,
475 JSObjectRef thisObject,
476 size_t argumentCount,
477 const JSValueRef arguments[],
478 JSValueRef* exception)
482 //AceSecurityStatus status = PACKAGE_CHECK_ACCESS(PACKAGE_FUNCTION_API_GET_PACKAGE_ID_FROM_APP_ID);
483 //TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
486 WrtDeviceApis::CommonsJavaScript::Converter converter(context);
488 if (argumentCount > 0) {
489 id = converter.toString(arguments[0]);
494 return converter.toJSValueRef(PackageManager::getInstance()->getPackageIdFromAppId(id));
495 } Catch (NotFoundException) {
496 LoggerW("Exception: "<<_rethrown_exception.GetMessage());
497 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::NOT_FOUND_ERROR, _rethrown_exception.GetMessage());
498 } Catch (ConversionException) {
499 LoggerW("Exception: "<<_rethrown_exception.GetMessage());
500 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, _rethrown_exception.GetMessage());
501 } Catch (Exception) {
502 LoggerW("Exception: "<<_rethrown_exception.GetMessage());
503 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, _rethrown_exception.GetMessage());
506 return JSValueMakeUndefined(context);