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.
21 #include <CommonsJavaScript/Converter.h>
23 //#include <CommonsJavaScript/Validator.h>
24 #include <CommonsJavaScript/JSUtils.h>
26 #include <CommonsJavaScript/JSCallbackManager.h>
27 #include <CommonsJavaScript/Utils.h>
28 #include <CommonsJavaScript/ScopedJSStringRef.h>
30 #include <ArgumentValidator.h>
33 #include <SecurityExceptions.h>
34 //#include <Commons/Exception.h>
35 #include <JSWebAPIErrorFactory.h>
37 #include "ApplicationFactory.h"
38 #include "plugin_config.h"
39 #include "ApplicationController.h"
40 #include "JSApplicationManager.h"
41 #include "ApplicationConverter.h"
42 #include "ApplicationUtil.h"
43 #include "JSApplicationControl.h"
44 #include "ApplicationAsyncCallbackManager.h"
45 #include "ApplicationListenerManager.h"
46 #include "ApplicationInformationEventPrivateData.h"
47 #include "JSApplicationEventCallbackManager.h"
48 #include "JSApplication.h"
49 #include "ApplicationManager.h"
51 #include <TimeTracer.h>
55 #include <plugins-ipc-message/ipc_message_support.h>
58 namespace Application {
60 using namespace DeviceAPI::Common;
62 using namespace WrtDeviceApis::Commons;
63 using namespace WrtDeviceApis::CommonsJavaScript;
65 JSClassRef JSApplicationManager::m_jsClassRef = NULL;
67 JSClassDefinition JSApplicationManager::m_classInfo = {
69 kJSClassAttributeNone,
70 TIZEN_INTERFACE_APPLICATION_MANAGER,
79 NULL, //deleteProperty,
80 NULL, //getPropertyNames,
87 JSStaticFunction JSApplicationManager::m_function[] = {
88 { APPLICATION_FUNCTION_API_GET_CURRENT_APP, JSApplicationManager::getCurrentApplication, kJSPropertyAttributeNone },
89 { APPLICATION_FUNCTION_API_LAUNCH, JSApplicationManager::launch, kJSPropertyAttributeNone },
90 { APPLICATION_FUNCTION_API_KILL, JSApplicationManager::kill, kJSPropertyAttributeNone },
91 { APPLICATION_FUNCTION_API_SET_USER_AGENT, JSApplicationManager::setUserAgent, kJSPropertyAttributeNone },
92 { APPLICATION_FUNCTION_API_GET_APPS_INFO, JSApplicationManager::getAppsInfo, kJSPropertyAttributeNone },
93 { APPLICATION_FUNCTION_API_GET_APPS_CONTEXT, JSApplicationManager::getAppsContext, kJSPropertyAttributeNone },
94 { APPLICATION_FUNCTION_API_GET_APP_INFO, JSApplicationManager::getAppInfo, kJSPropertyAttributeNone },
95 { APPLICATION_FUNCTION_API_GET_APP_CONTEXT, JSApplicationManager::getAppContext, kJSPropertyAttributeNone },
96 { APPLICATION_FUNCTION_API_ADD_APP_INFO_EVENT_LISTENER, JSApplicationManager::addAppInfoEventListener, kJSPropertyAttributeNone },
97 { APPLICATION_FUNCTION_API_REMOVE_APP_INFO_EVENT_LISTENER, JSApplicationManager::removeAppInfoEventListener, kJSPropertyAttributeNone },
98 { APPLICATION_FUNCTION_API_LAUNCH_APP_CONTROL, JSApplicationManager::launchAppControl, kJSPropertyAttributeNone },
99 { APPLICATION_FUNCTION_API_FIND_APP_CONTROL, JSApplicationManager::findAppControl, kJSPropertyAttributeNone },
100 { APPLICATION_FUNCTION_API_GET_APP_CERTS, JSApplicationManager::getAppCerts, kJSPropertyAttributeNone },
101 { APPLICATION_FUNCTION_API_GET_APP_SHARED_URI, JSApplicationManager::getAppSharedURI, kJSPropertyAttributeNone },
102 { APPLICATION_FUNCTION_API_GET_APP_META_DATA, JSApplicationManager::getAppMetaData, kJSPropertyAttributeNone },
106 const JSClassRef DLL_EXPORT JSApplicationManager::getClassRef()
109 m_jsClassRef = JSClassCreate(&m_classInfo);
115 const JSClassDefinition* JSApplicationManager::getClassInfo()
120 void JSApplicationManager::initialize(JSContextRef context, JSObjectRef object)
122 ApplicationController* priv = static_cast<ApplicationController*>(JSObjectGetPrivate(object));
125 IApplicationManagerPtr applications(ApplicationFactory::getInstance().createApplication());
126 priv = new ApplicationController(context, applications);
128 if (!JSObjectSetPrivate(object, static_cast<void*>(priv))) {
132 LoggerD("private date is already exist");
136 void JSApplicationManager::finalize(JSObjectRef object)
138 ApplicationController* priv = static_cast<ApplicationController*> (JSObjectGetPrivate(object));
139 JSObjectSetPrivate(object, NULL);
143 JSValueRef JSApplicationManager::getCurrentApplication(JSContextRef context,
145 JSObjectRef thisObject,
146 size_t argumentCount,
147 const JSValueRef arguments[],
148 JSValueRef* exception)
150 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
153 ApplicationController *controller = static_cast<ApplicationController*>(JSObjectGetPrivate(thisObject));
155 throw TypeMismatchException("No private object.");
157 JSContextRef gContext = controller->getContext();
159 ApplicationPtr result = ApplicationManager::getCurrentApplication();
161 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
162 return JSApplication::makeObject(gContext, result);
165 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getCurrentApplication().");
166 return JSWebAPIErrorFactory::postException(context, exception, err);
171 JSValueRef JSApplicationManager::launch(JSContextRef context,
173 JSObjectRef thisObject,
174 size_t argumentCount,
175 const JSValueRef arguments[],
176 JSValueRef* exception)
178 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
179 TIME_TRACER_ITEM_BEGIN("launch(async)", 0);
181 TIME_TRACER_ITEM_BEGIN("launch(ACE)", 0);
182 AceSecurityStatus status = APPLICATION_CHECK_ACCESS(APPLICATION_FUNCTION_API_LAUNCH);
183 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
184 TIME_TRACER_ITEM_END("launch(ACE)", 0);
187 IApplicationManagerPtr appmgr;
188 JSContextRef gContext;
189 ApplicationController *controller;
191 controller = static_cast<ApplicationController*>(JSObjectGetPrivate(thisObject));
193 throw TypeMismatchException("No private object.");
195 appmgr = controller->getObject();
196 gContext = controller->getContext();
198 EventApplicationLaunchPtr event(new EventApplicationLaunch());
199 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
201 ArgumentValidator validator(context, argumentCount, arguments);
204 std::string id = validator.toString(0);
208 JSObjectRef successCallback = validator.toFunction(1, true);
210 callbackManager->setOnSuccess(successCallback);
213 JSObjectRef errorCallback = validator.toFunction(2, true);
215 callbackManager->setOnError(errorCallback);
217 callbackManager->setObject(thisObject);
218 ApplicationAsyncCallbackManagerSingleton::Instance().registerCallbackManager(callbackManager, gContext);
220 event->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
221 event->setForAsynchronousCall(controller);
223 appmgr->launch(event);
224 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
225 return JSValueMakeUndefined(context);
227 } catch (const BasePlatformException &err) {
228 return JSWebAPIErrorFactory::postException(context, exception, err);
230 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.launch().");
231 return JSWebAPIErrorFactory::postException(context, exception, err);
235 JSValueRef JSApplicationManager::kill(JSContextRef context,
237 JSObjectRef thisObject,
238 size_t argumentCount,
239 const JSValueRef arguments[],
240 JSValueRef* exception)
242 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
243 TIME_TRACER_ITEM_BEGIN("kill(async)", 0);
245 TIME_TRACER_ITEM_BEGIN("kill(ACE)", 0);
246 AceSecurityStatus status = APPLICATION_CHECK_ACCESS(APPLICATION_FUNCTION_API_KILL);
247 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
248 TIME_TRACER_ITEM_END("kill(ACE)", 0);
251 IApplicationManagerPtr appmgr;
252 JSContextRef gContext;
253 ApplicationController *controller;
255 controller = static_cast<ApplicationController*>(JSObjectGetPrivate(thisObject));
257 throw TypeMismatchException("No private object.");
259 appmgr = controller->getObject();
260 gContext = controller->getContext();
262 EventApplicationKillPtr event(new EventApplicationKill());
263 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
264 ArgumentValidator validator(context, argumentCount, arguments);
267 std::string contextId = validator.toString(0);
268 event->setContextId(contextId);
271 JSObjectRef successCallback = validator.toFunction(1, true);
273 callbackManager->setOnSuccess(successCallback);
276 JSObjectRef errorCallback = validator.toFunction(2, true);
278 callbackManager->setOnError(errorCallback);
280 callbackManager->setObject(thisObject);
281 ApplicationAsyncCallbackManagerSingleton::Instance().registerCallbackManager(callbackManager, gContext);
283 event->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
284 event->setForAsynchronousCall(controller);
287 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
288 return JSValueMakeUndefined(context);
290 } catch (const BasePlatformException &err) {
291 return JSWebAPIErrorFactory::postException(context, exception, err);
293 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.kill().");
294 return JSWebAPIErrorFactory::postException(context, exception, err);
299 JSValueRef JSApplicationManager::setUserAgent(JSContextRef context,
301 JSObjectRef thisObject,
302 size_t argumentCount,
303 const JSValueRef arguments[],
304 JSValueRef* exception)
306 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
309 ArgumentValidator validator(context, argumentCount, arguments);
312 std::string userAgent = validator.toString(0);
315 IPCMessageSupport::sendAsyncMessageToUiProcess(IPCMessageSupport::TIZEN_CHANGE_USERAGENT, userAgent.c_str(), NULL, NULL);
317 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
318 return JSValueMakeUndefined(context);
320 } catch (const BasePlatformException &err) {
321 return JSWebAPIErrorFactory::postException(context, exception, err);
323 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.removeAppInfoEventListener().");
324 return JSWebAPIErrorFactory::postException(context, exception, err);
329 JSValueRef JSApplicationManager::launchAppControl(JSContextRef context,
331 JSObjectRef thisObject,
332 size_t argumentCount,
333 const JSValueRef arguments[],
334 JSValueRef* exception)
336 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
337 TIME_TRACER_ITEM_BEGIN("launchAppControlReply", 0);
338 TIME_TRACER_ITEM_BEGIN("launchAppControl(async)", 0);
339 TIME_TRACER_ITEM_BEGIN("launchAppControlReply(async)", 0);
341 TIME_TRACER_ITEM_BEGIN("launchAppControl(ACE)", 0);
342 AceSecurityStatus status = APPLICATION_CHECK_ACCESS(APPLICATION_FUNCTION_API_LAUNCH_APP_CONTROL);
343 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
344 TIME_TRACER_ITEM_END("launchAppControl(ACE)", 0);
347 IApplicationManagerPtr appmgr;
348 JSContextRef gContext;
349 ApplicationController *controller;
351 controller = static_cast<ApplicationController*>(JSObjectGetPrivate(thisObject));
353 throw TypeMismatchException("No private object.");
355 appmgr = controller->getObject();
356 gContext = controller->getContext();
359 EventApplicationLaunchAppControlPtr event(new EventApplicationLaunchAppControl());
360 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
361 ApplicationConverterFactory::ConverterType converter = ApplicationConverterFactory::getConverter(context);
363 ArgumentValidator validator(context, argumentCount, arguments);
366 JSObjectRef appControlObj = validator.toObject(0);
367 ApplicationControlPtr appControl = converter->toApplicationControl(appControlObj);
369 throw TypeMismatchException("ApplicationControl's private object is NULL.");
371 event->setAppControl(appControl);
374 std::string id = validator.toString(1, true, "");
378 JSObjectRef successCallback = validator.toFunction(2, true);
380 callbackManager->setOnSuccess(successCallback);
383 JSObjectRef errorCallback = validator.toFunction(3, true);
385 callbackManager->setOnError(errorCallback);
387 callbackManager->setObject(thisObject);
388 ApplicationAsyncCallbackManagerSingleton::Instance().registerCallbackManager(callbackManager, gContext);
391 JSCallbackManagerPtr callbackManagerReply;
392 JSObjectRef replyCallbackObj = validator.toCallbackObject(4, true, "onsuccess", "onfailure", NULL);
394 if (replyCallbackObj) {
395 callbackManagerReply = JSCallbackManager::createObject(gContext);
398 JSValueRef onsuccess = JSUtil::getProperty(context, replyCallbackObj, "onsuccess", exception);
399 if (!JSValueIsUndefined(context, onsuccess)) {
400 callbackManagerReply->setOnSuccess(onsuccess);
404 JSValueRef onfailure = JSUtil::getProperty(context, replyCallbackObj, "onfailure", exception);
405 if (!JSValueIsUndefined(context, onfailure)) {
406 callbackManagerReply->setOnError(onfailure);
409 callbackManagerReply->setObject(thisObject);
410 ApplicationAsyncCallbackManagerSingleton::Instance().registerCallbackManager(callbackManagerReply, gContext);
412 EventApplicationLaunchAppControlReplyPtr eventReply(new EventApplicationLaunchAppControlReply());
413 eventReply->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManagerReply));
414 eventReply->setForAsynchronousCall(controller);
416 event->setEventReply(eventReply);
419 event->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
420 event->setForAsynchronousCall(controller);
422 appmgr->launchAppControl(event);
424 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
425 TIME_TRACER_ITEM_END("launchAppControlReply", 0);
426 return JSValueMakeUndefined(context);
427 } catch (const BasePlatformException &err) {
428 return JSWebAPIErrorFactory::postException(context, exception, err);
430 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.launchAppControl().");
431 return JSWebAPIErrorFactory::postException(context, exception, err);
437 JSValueRef JSApplicationManager::findAppControl(JSContextRef context,
439 JSObjectRef thisObject,
440 size_t argumentCount,
441 const JSValueRef arguments[],
442 JSValueRef* exception)
444 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
445 TIME_TRACER_ITEM_BEGIN("findAppControl(async)", 0);
448 IApplicationManagerPtr appmgr;
449 JSContextRef gContext;
450 ApplicationController *controller;
452 controller = static_cast<ApplicationController*>(JSObjectGetPrivate(thisObject));
454 throw TypeMismatchException("No private object.");
456 appmgr = controller->getObject();
457 gContext = controller->getContext();
459 ApplicationConverterFactory::ConverterType converter = ApplicationConverterFactory::getConverter(context);
460 EventApplicationFindAppControlPtr event(new EventApplicationFindAppControl());
461 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
463 ArgumentValidator validator(context, argumentCount, arguments);
466 JSObjectRef appControlObj = validator.toObject(0);
468 ApplicationControlPtr appControl = converter->toApplicationControl(appControlObj);
470 throw TypeMismatchException("ApplicationControl's private object is NULL.");
472 event->setAppControl(appControl);
475 JSObjectRef successCallbackObj = validator.toFunction(1);
476 if (successCallbackObj) {
477 callbackManager->setOnSuccess(successCallbackObj);
481 JSObjectRef errorCallback = validator.toFunction(2, true);
483 callbackManager->setOnError(errorCallback);
486 callbackManager->setObject(thisObject);
487 ApplicationAsyncCallbackManagerSingleton::Instance().registerCallbackManager(callbackManager, gContext);
489 event->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
490 event->setForAsynchronousCall(controller);
492 appmgr->findAppControl(event);
493 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
494 return JSValueMakeUndefined(context);
496 } catch (const BasePlatformException &err) {
497 return JSWebAPIErrorFactory::postException(context, exception, err);
499 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.findAppControl().");
500 return JSWebAPIErrorFactory::postException(context, exception, err);
505 JSValueRef JSApplicationManager::getAppsContext(JSContextRef context,
507 JSObjectRef thisObject,
508 size_t argumentCount,
509 const JSValueRef arguments[],
510 JSValueRef* exception)
512 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
513 TIME_TRACER_ITEM_BEGIN("getAppsContext(async)", 0);
516 IApplicationManagerPtr appmgr;
517 JSContextRef gContext;
518 ApplicationController *controller;
520 controller = static_cast<ApplicationController*>(JSObjectGetPrivate(thisObject));
522 throw TypeMismatchException("No private object.");
524 appmgr = controller->getObject();
525 gContext = controller->getContext();
527 EventApplicationGetAppsContextPtr event(new EventApplicationGetAppsContext());
528 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
530 ArgumentValidator validator(context, argumentCount, arguments);
533 JSObjectRef successCallbackObj = validator.toFunction(0);
534 callbackManager->setOnSuccess(successCallbackObj);
537 JSObjectRef errorCallbackObj = validator.toFunction(1, true);
538 if (errorCallbackObj)
539 callbackManager->setOnError(errorCallbackObj);
541 callbackManager->setObject(thisObject);
542 ApplicationAsyncCallbackManagerSingleton::Instance().registerCallbackManager(callbackManager, gContext);
544 event->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
545 event->setForAsynchronousCall(controller);
547 appmgr->getAppsContext(event);
548 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
549 return JSValueMakeUndefined(context);
551 } catch (const BasePlatformException &err) {
552 LoggerE("BasePlatformException");
553 return JSWebAPIErrorFactory::postException(context, exception, err);
556 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getAppsContext().");
557 return JSWebAPIErrorFactory::postException(context, exception, err);
562 JSValueRef JSApplicationManager::getAppContext(JSContextRef context,
564 JSObjectRef thisObject,
565 size_t argumentCount,
566 const JSValueRef arguments[],
567 JSValueRef* exception)
569 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
572 ArgumentValidator validator(context, argumentCount, arguments);
574 ApplicationContextPtr result = ApplicationManager::getAppContext(validator.toString(0, true, ""));
575 ApplicationConverterFactory::ConverterType converter = ApplicationConverterFactory::getConverter(context);
577 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
578 return converter->toJSValueRefFromApplicationContext(result);
580 } catch (const BasePlatformException &err) {
581 return JSWebAPIErrorFactory::postException(context, exception, err);
582 } catch (const WrtDeviceApis::Commons::NotFoundException& ex) {
583 return JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::NOT_FOUND_ERROR, ex.GetMessage());
585 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getAppContext().");
586 return JSWebAPIErrorFactory::postException(context, exception, err);
591 JSValueRef JSApplicationManager::getAppsInfo(JSContextRef context,
593 JSObjectRef thisObject,
594 size_t argumentCount,
595 const JSValueRef arguments[],
596 JSValueRef* exception)
598 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
599 TIME_TRACER_ITEM_BEGIN("getAppsInfo(async)", 0);
602 IApplicationManagerPtr appmgr;
603 JSContextRef gContext;
604 ApplicationController *controller;
606 controller = static_cast<ApplicationController*>(JSObjectGetPrivate(thisObject));
608 throw TypeMismatchException("No private object.");
610 appmgr = controller->getObject();
611 gContext = controller->getContext();
613 EventApplicationGetAppsInfoPtr event(new EventApplicationGetAppsInfo());
614 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(gContext);
616 ArgumentValidator validator(context, argumentCount, arguments);
619 JSObjectRef successCallbackObj = validator.toFunction(0);
620 callbackManager->setOnSuccess(successCallbackObj);
623 JSObjectRef errorCallbackObj = validator.toFunction(1, true);
624 if (errorCallbackObj) {
625 callbackManager->setOnError(errorCallbackObj);
628 callbackManager->setObject(thisObject);
629 ApplicationAsyncCallbackManagerSingleton::Instance().registerCallbackManager(callbackManager, gContext);
631 event->setPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
632 event->setForAsynchronousCall(controller);
634 appmgr->getAppsInfo(event);
635 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
636 return JSValueMakeUndefined(context);
638 } catch (const BasePlatformException &err) {
639 return JSWebAPIErrorFactory::postException(context, exception, err);
641 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getAppsInfo().");
642 return JSWebAPIErrorFactory::postException(context, exception, err);
647 JSValueRef JSApplicationManager::getAppInfo(JSContextRef context,
649 JSObjectRef thisObject,
650 size_t argumentCount,
651 const JSValueRef arguments[],
652 JSValueRef* exception)
654 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
657 ApplicationController *controller = static_cast<ApplicationController*>(JSObjectGetPrivate(thisObject));
659 throw TypeMismatchException("No private object.");
661 JSContextRef gContext = controller->getContext();
663 ArgumentValidator validator(context, argumentCount, arguments);
665 ApplicationInformationPtr result = ApplicationManager::getAppInfo(validator.toString(0, true, ""));
666 ApplicationConverterFactory::ConverterType converter = ApplicationConverterFactory::getConverter(gContext);
668 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
669 return converter->toJSValueRefFromApplicationInformation(result);
671 } catch (const BasePlatformException &err) {
672 return JSWebAPIErrorFactory::postException(context, exception, err);
673 } catch (const WrtDeviceApis::Commons::NotFoundException& ex) {
674 return JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::NOT_FOUND_ERROR, ex.GetMessage());
676 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getAppInfo().");
677 return JSWebAPIErrorFactory::postException(context, exception, err);
681 JSValueRef JSApplicationManager::addAppInfoEventListener(JSContextRef context,
683 JSObjectRef thisObject,
684 size_t argumentCount,
685 const JSValueRef arguments[],
686 JSValueRef* exception)
688 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
691 IApplicationManagerPtr appmgr;
692 JSContextRef gContext;
693 ApplicationController *controller;
695 controller = static_cast<ApplicationController*>(JSObjectGetPrivate(thisObject));
697 throw TypeMismatchException("No private object.");
699 appmgr = controller->getObject();
700 gContext = controller->getContext();
702 EventApplicationAddAppInfoEventListenerPtr event(new EventApplicationAddAppInfoEventListener());
704 ArgumentValidator validator(context, argumentCount, arguments);
707 JSObjectRef eventCBObj = validator.toCallbackObject(0, false, "oninstalled", "onupdated", "onuninstalled", NULL);
708 JSApplicationEventCallbackManagerPtr callbackManager = JSApplicationEventCallbackManager::createObject(gContext);
710 JSValueRef oninstalled = JSUtil::getProperty(context, eventCBObj, "oninstalled", exception);
711 if (!JSValueIsUndefined(context, oninstalled)) {
712 callbackManager->setOnInstalled(oninstalled);
715 JSValueRef onupdated = JSUtil::getProperty(context, eventCBObj, "onupdated", exception);
716 if (!JSValueIsUndefined(context, onupdated)) {
717 callbackManager->setOnUpdated(onupdated);
720 JSValueRef onuninstalled = JSUtil::getProperty(context, eventCBObj, "onuninstalled", exception);
721 if (!JSValueIsUndefined(context, onuninstalled)) {
722 callbackManager->setOnUninstalled(onuninstalled);
725 EventApplicationAppInfoEventListenerEmitterPtr emitter(new EventApplicationAppInfoEventListenerEmitter());
727 emitter->setEventPrivateData(DPL::StaticPointerCast<IEventPrivateData>(callbackManager));
728 emitter->setListener(controller);
730 event->setEmitter(emitter);
731 event->setForSynchronousCall();
733 appmgr->addAppInfoEventListener(event);
735 if (event->getExceptionCode() != ExceptionCodes::None) {
736 throw UnknownException("Unknown Exception Occured");
739 unsigned long id = event->getWatchId();
741 ApplicationListenerCancellerPtr canceller = ApplicationListenerCancellerPtr(new ApplicationListenerCanceller(gContext, thisObject, id));
742 DeviceAPI::Common::IListenerItemPtr listenerItem = DPL::StaticPointerCast<DeviceAPI::Common::IListenerItem>(canceller);
743 ApplicationListenerManagerSingleton::Instance().registerListener(listenerItem, gContext);
745 ApplicationConverterFactory::ConverterType converter = ApplicationConverterFactory::getConverter(context);
746 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
747 return converter->toJSValueRef(id);
749 } catch (const BasePlatformException &err) {
750 return JSWebAPIErrorFactory::postException(context, exception, err);
752 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.addAppInfoEventListener().");
753 return JSWebAPIErrorFactory::postException(context, exception, err);
757 JSValueRef JSApplicationManager::removeAppInfoEventListener(JSContextRef context,
759 JSObjectRef thisObject,
760 size_t argumentCount,
761 const JSValueRef arguments[],
762 JSValueRef* exception)
764 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
767 IApplicationManagerPtr appmgr;
768 JSContextRef gContext;
769 ApplicationController *controller;
771 controller = static_cast<ApplicationController*>(JSObjectGetPrivate(thisObject));
773 throw TypeMismatchException("No private object.");
775 appmgr = controller->getObject();
776 gContext = controller->getContext();
778 EventApplicationRemoveAppInfoEventListenerPtr event(new EventApplicationRemoveAppInfoEventListener());
780 ArgumentValidator validator(context, argumentCount, arguments);
783 long watchId = validator.toLong(0);
784 event->setWatchId(watchId);
786 event->setForSynchronousCall();
788 appmgr->removeAppInfoEventListener(event);
790 ApplicationListenerCancellerPtr canceller = ApplicationListenerCancellerPtr(new ApplicationListenerCanceller(gContext, thisObject, watchId));
791 DeviceAPI::Common::IListenerItemPtr listenerItem = DPL::StaticPointerCast<DeviceAPI::Common::IListenerItem>(canceller);
792 ApplicationListenerManagerSingleton::Instance().unregisterListener(listenerItem);
794 if (event->getExceptionCode() == ExceptionCodes::NotFoundException) {
795 throw NotFoundException("Watch id not found");
797 else if (event->getExceptionCode() != ExceptionCodes::None) {
798 throw UnknownException("UnknownException Occured");
801 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
802 return JSValueMakeUndefined(context);
804 } catch (const BasePlatformException &err) {
805 return JSWebAPIErrorFactory::postException(context, exception, err);
807 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.removeAppInfoEventListener().");
808 return JSWebAPIErrorFactory::postException(context, exception, err);
813 JSValueRef JSApplicationManager::getAppCerts(JSContextRef context,
815 JSObjectRef thisObject,
816 size_t argumentCount,
817 const JSValueRef arguments[],
818 JSValueRef* exception)
820 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
822 TIME_TRACER_ITEM_BEGIN("(getAppCerts)ACE", 0);
823 AceSecurityStatus status = APPLICATION_CHECK_ACCESS(APPLICATION_FUNCTION_API_GET_APP_CERTS);
824 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
825 TIME_TRACER_ITEM_END("(getAppCerts)ACE", 0);
828 ArgumentValidator validator(context, argumentCount, arguments);
830 ApplicationCertArrayPtr result = ApplicationManager::getAppCerts(validator.toString(0, true, ""));
831 ApplicationConverterFactory::ConverterType converter = ApplicationConverterFactory::getConverter(context);
833 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
834 return converter->toJSValueRefFromApplicationCerts(result);
836 } catch (const BasePlatformException &err) {
837 return JSWebAPIErrorFactory::postException(context, exception, err);
838 } catch (const WrtDeviceApis::Commons::NotFoundException& ex) {
839 return JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::NOT_FOUND_ERROR, ex.GetMessage());
841 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getAppCerts().");
842 return JSWebAPIErrorFactory::postException(context, exception, err);
847 JSValueRef JSApplicationManager::getAppSharedURI(JSContextRef context,
849 JSObjectRef thisObject,
850 size_t argumentCount,
851 const JSValueRef arguments[],
852 JSValueRef* exception)
854 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
857 ArgumentValidator validator(context, argumentCount, arguments);
859 std::string result = ApplicationManager::getAppSharedURI(validator.toString(0, true, ""));
860 ApplicationConverterFactory::ConverterType converter = ApplicationConverterFactory::getConverter(context);
862 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
863 return converter->toJSValueRef(result);
865 } catch (const BasePlatformException &err) {
866 return JSWebAPIErrorFactory::postException(context, exception, err);
867 } catch (const WrtDeviceApis::Commons::NotFoundException& ex) {
868 return JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::NOT_FOUND_ERROR, ex.GetMessage());
870 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getAppSharedURI().");
871 return JSWebAPIErrorFactory::postException(context, exception, err);
875 JSValueRef JSApplicationManager::getAppMetaData(JSContextRef context,
877 JSObjectRef thisObject,
878 size_t argumentCount,
879 const JSValueRef arguments[],
880 JSValueRef* exception)
882 TIME_TRACER_ITEM_BEGIN(__FUNCTION__, 0);
884 TIME_TRACER_ITEM_BEGIN("(getAppMetaData)ACE", 0);
885 AceSecurityStatus status = APPLICATION_CHECK_ACCESS(APPLICATION_FUNCTION_API_GET_APP_META_DATA);
886 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
887 TIME_TRACER_ITEM_END("(getAppMetaData)ACE", 0);
890 ArgumentValidator validator(context, argumentCount, arguments);
892 ApplicationMetaDataArrayPtr result = ApplicationManager::getAppMetaData(validator.toString(0, true, ""));
893 ApplicationConverterFactory::ConverterType converter = ApplicationConverterFactory::getConverter(context);
895 TIME_TRACER_ITEM_END(__FUNCTION__, 0);
896 return converter->toJSValueRefFromApplicationMetaDataArray(result);
898 } catch (const BasePlatformException &err) {
899 return JSWebAPIErrorFactory::postException(context, exception, err);
900 } catch (const WrtDeviceApis::Commons::NotFoundException& ex) {
901 return JSWebAPIErrorFactory::postException(context, exception, JSWebAPIErrorFactory::NOT_FOUND_ERROR, ex.GetMessage());
903 DeviceAPI::Common::UnknownException err("Unknown Error in ApplicationManager.getAppCerts().");
904 return JSWebAPIErrorFactory::postException(context, exception, err);
909 /* scheme-callback using title is not working on iframe. So, use IPC API instead of below API.
910 void JSApplicationManager::setTitleProperty(JSContextRef context, std::string propertyValue){
912 WrtDeviceApis::CommonsJavaScript::Converter converter(context);
914 JSObjectRef windowObject = JSContextGetGlobalObject(context);
917 JSObjectRef documentObject = converter.toJSObjectRef(JSObjectGetProperty(context,
919 ScopedJSStringRef(JSStringCreateWithUTF8CString("document")).get(),
922 JSObjectSetProperty(context,
924 ScopedJSStringRef(JSStringCreateWithUTF8CString("title")).get(),
925 JSValueMakeString(context, JSStringCreateWithUTF8CString("tizen://dummy#$#@##")),
926 kJSPropertyAttributeNone,
929 JSObjectSetProperty(context,
931 ScopedJSStringRef(JSStringCreateWithUTF8CString("title")).get(),
932 JSValueMakeString(context, JSStringCreateWithUTF8CString(propertyValue.c_str())),
933 kJSPropertyAttributeNone,