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 <CommonsJavaScript/JSCallbackManager.h>
19 #include <JSWebAPIErrorFactory.h>
20 #include <TimeTracer.h>
21 #include "ApplicationController.h"
22 #include "ApplicationConverter.h"
23 #include "JSApplicationEventCallbackManager.h"
24 #include "ApplicationAsyncCallbackManager.h"
25 #include "ApplicationInformationEventPrivateData.h"
27 // to unset event callback for kill() API
28 #include <app_manager.h>
33 namespace Application {
35 using namespace DeviceAPI::Common;
36 using namespace WrtDeviceApis::Commons;
37 using namespace WrtDeviceApis::CommonsJavaScript;
39 ApplicationController::ApplicationController(JSContextRef context, IApplicationManagerPtr application) :
40 EventApplicationLaunchEventAnswerReceiver(ThreadEnum::NULL_THREAD),
41 EventApplicationKillEventAnswerReceiver(ThreadEnum::NULL_THREAD),
42 EventApplicationLaunchAppControlEventAnswerReceiver(ThreadEnum::NULL_THREAD),
43 EventApplicationLaunchAppControlReplyEventAnswerReceiver(ThreadEnum::NULL_THREAD),
44 EventApplicationFindAppControlEventAnswerReceiver(ThreadEnum::NULL_THREAD),
45 EventApplicationGetAppsContextEventAnswerReceiver(ThreadEnum::NULL_THREAD),
46 EventApplicationGetAppsInfoEventAnswerReceiver(ThreadEnum::NULL_THREAD),
47 EventApplicationAppInfoEventListenerListener(ThreadEnum::NULL_THREAD),
49 ApplicationPrivObject(context, application)
52 LoggerE("controller has no application object");
56 ApplicationController::~ApplicationController()
60 void ApplicationController::OnAnswerReceived(const EventApplicationLaunchPtr &event)
62 ApplicationAsyncAnswerHandler::launch(event);
63 TIME_TRACER_ITEM_END("launch(async)", 0);
66 void ApplicationController::OnAnswerReceived(const EventApplicationKillPtr &event)
68 ApplicationAsyncAnswerHandler::kill(event);
69 //TIME_TRACER_ITEM_END("kill(async)", 0);
72 void ApplicationController::OnAnswerReceived(const EventApplicationLaunchAppControlPtr &event)
74 ApplicationAsyncAnswerHandler::launchAppControl(event);
75 TIME_TRACER_ITEM_END("launchAppControl(async)", 0);
78 void ApplicationController::OnAnswerReceived(const EventApplicationLaunchAppControlReplyPtr &event)
80 ApplicationAsyncAnswerHandler::launchAppControlReply(event);
81 TIME_TRACER_ITEM_END("launchAppControlReply(async)", 0);
84 void ApplicationController::OnAnswerReceived(const EventApplicationFindAppControlPtr &event)
86 ApplicationAsyncAnswerHandler::findAppControl(event);
87 TIME_TRACER_ITEM_END("findAppControl(async)", 0);
90 void ApplicationController::OnAnswerReceived(const EventApplicationGetAppsContextPtr &event)
92 ApplicationAsyncAnswerHandler::getAppsContext(event);
93 TIME_TRACER_ITEM_END("getAppsContext(async)", 0);
96 void ApplicationController::OnAnswerReceived(const EventApplicationGetAppsInfoPtr &event)
98 ApplicationAsyncAnswerHandler::getAppsInfo(event);
99 TIME_TRACER_ITEM_END("getAppsInfo(async)", 0);
102 void ApplicationController::onAnswerReceived(const EventApplicationAppInfoEventListenerPtr &event)
104 ApplicationAsyncAnswerHandler::eventListener(event);
107 void ApplicationAsyncAnswerHandler::launch(const EventApplicationLaunchPtr &event)
109 JSCallbackManagerPtr callbackManager =
110 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
111 if (!callbackManager) {
112 LoggerE("no callback manager");
116 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
118 if(event->checkCancelled()) {
119 LoggerD("Operation cancelled");
123 JSContextRef gContext = callbackManager->getContext();
125 JSValueRef error = NULL;
126 if (ExceptionCodes::None != event->getExceptionCode())
128 switch (event->getExceptionCode())
130 case ExceptionCodes::InvalidArgumentException:
131 case ExceptionCodes::NotFoundException:
132 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::NOT_FOUND_ERROR, "given app id is not found");
134 case ExceptionCodes::PlatformException:
135 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR, "platform exception");
138 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"unknown error");
142 callbackManager->callOnError(error);
147 callbackManager->callOnSuccess();
148 LoggerD("launch success callback called");
151 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
152 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR, "Internal error");
154 callbackManager->callOnError(error);
155 LoggerD("launch error callback called");
160 void ApplicationAsyncAnswerHandler::kill(const EventApplicationKillPtr &event)
162 JSCallbackManagerPtr callbackManager =
163 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
164 if (!callbackManager) {
165 LoggerE("no callback manager");
169 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
171 if(event->checkCancelled()) {
172 LoggerD("Operation cancelled");
176 JSContextRef gContext = callbackManager->getContext();
178 JSValueRef error = NULL;
179 if (ExceptionCodes::None != event->getExceptionCode())
181 switch (event->getExceptionCode())
183 case ExceptionCodes::NotFoundException:
184 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::NOT_FOUND_ERROR,"given package is not found");
186 case ExceptionCodes::PlatformException:
187 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"platform exception");
189 case ExceptionCodes::InvalidArgumentException:
190 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::INVALID_VALUES_ERROR, "invalid value");
193 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"unknown error");
197 callbackManager->callOnError(error);
198 LoggerD("kill error callback called");
203 callbackManager->callOnSuccess();
204 LoggerD("kill success callback called");
207 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
208 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR, "Internal error");
210 callbackManager->callOnError(error);
211 LoggerD("kill error callback called");
216 void ApplicationAsyncAnswerHandler::launchAppControl(const EventApplicationLaunchAppControlPtr &event)
218 JSCallbackManagerPtr callbackManager =
219 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
220 if (!callbackManager) {
221 LoggerE("no callback manager");
225 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
227 if(event->checkCancelled()) {
228 LoggerD("Operation cancelled");
232 JSContextRef gContext = callbackManager->getContext();
234 JSValueRef error = NULL;
235 if (ExceptionCodes::None != event->getExceptionCode())
237 switch (event->getExceptionCode())
239 case ExceptionCodes::NotFoundException:
240 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::NOT_FOUND_ERROR,"given package is not found");
242 case ExceptionCodes::PlatformException:
243 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"platform exception");
246 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"unknown error");
250 callbackManager->callOnError(error);
251 LoggerD("launchAppControl error callback called");
256 callbackManager->callOnSuccess();
257 LoggerD("launchAppControl success callback called");
260 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
261 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR, "Internal error");
263 callbackManager->callOnError(error);
264 LoggerD("launchAppControl error callback called");
269 void ApplicationAsyncAnswerHandler::launchAppControlReply(const EventApplicationLaunchAppControlReplyPtr &event)
271 JSCallbackManagerPtr callbackManager =
272 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
273 if (!callbackManager) {
274 LoggerE("no callback manager");
278 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
280 if(event->checkCancelled()) {
281 LoggerD("Operation cancelled");
285 JSContextRef gContext = callbackManager->getContext();
287 if (ExceptionCodes::None != event->getExceptionCode())
289 callbackManager->callOnError();
290 LoggerD("launchAppControl reply failure callback called");
295 ApplicationControlDataArrayPtr appControlDataArray = event->getAppControlDataArray();
296 if(appControlDataArray == NULL)
298 ThrowMsg(WrtDeviceApis::Commons::UnknownException, "No reply");
301 ApplicationConverterFactory::ConverterType converter =
302 ApplicationConverterFactory::getConverter(gContext);
303 JSValueRef result = converter->toJSValueRef(*appControlDataArray);
305 callbackManager->callOnSuccess(result);
306 LoggerD("launchAppControl reply return callback called");
309 callbackManager->callOnError();
310 LoggerD("launchAppControl reply failure callback called");
315 void ApplicationAsyncAnswerHandler::findAppControl(const EventApplicationFindAppControlPtr &event)
317 JSCallbackManagerPtr callbackManager =
318 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
319 if (!callbackManager) {
320 LoggerE("no callback manager");
324 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
326 if(event->checkCancelled()) {
327 LoggerD("Operation cancelled");
331 JSContextRef gContext = callbackManager->getContext();
333 JSValueRef error = NULL;
334 if (ExceptionCodes::None != event->getExceptionCode())
336 switch (event->getExceptionCode())
338 case ExceptionCodes::NotFoundException:
339 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::NOT_FOUND_ERROR,"given package is not found");
341 case ExceptionCodes::PlatformException:
342 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"platform exception");
345 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"unknown error");
349 callbackManager->callOnError(error);
350 LoggerD("findAppControl error callback called");
355 ApplicationInformationArrayPtr appInfos = event->getAppInfos();
356 ApplicationControlPtr appControl = event->getAppControl();
358 ApplicationConverter converter(gContext, event.Get());
360 JSValueRef result[2];
361 result[0] = converter.toJSValueRef(appInfos);
362 result[1] = converter.toJSValueRef(appControl);
364 callbackManager->callOnSuccess(result, 2);
365 LoggerD("findAppControl success callback called");
368 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
369 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR, "Internal error");
371 callbackManager->callOnError(error);
372 LoggerD("findAppControl error callback called");
377 void ApplicationAsyncAnswerHandler::getAppsContext(const EventApplicationGetAppsContextPtr &event)
379 JSCallbackManagerPtr callbackManager =
380 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
381 if (!callbackManager) {
382 LoggerE("no callback manager");
386 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
388 if(event->checkCancelled()) {
389 LoggerD("Operation cancelled");
393 JSContextRef gContext = callbackManager->getContext();
395 JSValueRef error = NULL;
396 if (ExceptionCodes::None != event->getExceptionCode())
398 switch (event->getExceptionCode())
400 case ExceptionCodes::NotFoundException:
401 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::NOT_FOUND_ERROR,"given package is not found");
403 case ExceptionCodes::PlatformException:
404 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"platform exception");
407 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"unknown error");
411 callbackManager->callOnError(error);
412 LoggerD("getAppsContext error callback called");
417 ApplicationContextArrayPtr appContextArray = event->getAppContextArray();
419 ApplicationConverterFactory::ConverterType converter =
420 ApplicationConverterFactory::getConverter(gContext);
422 JSValueRef result = converter->toJSValueRef(appContextArray);
424 callbackManager->callOnSuccess(result);
425 LoggerD("getAppsContext success callback called");
428 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
429 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR, "Internal error");
431 callbackManager->callOnError(error);
432 LoggerD("getAppsContext error callback called");
437 void ApplicationAsyncAnswerHandler::getAppsInfo(const EventApplicationGetAppsInfoPtr &event)
439 JSCallbackManagerPtr callbackManager =
440 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
441 if (!callbackManager) {
442 LoggerE("no callback manager");
446 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
448 if(event->checkCancelled()) {
449 LoggerD("Operation cancelled");
453 JSContextRef gContext = callbackManager->getContext();
455 JSValueRef error = NULL;
456 if (ExceptionCodes::None != event->getExceptionCode())
458 switch (event->getExceptionCode())
460 case ExceptionCodes::NotFoundException:
461 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::NOT_FOUND_ERROR,"given package is not found");
463 case ExceptionCodes::PlatformException:
464 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"platform exception");
467 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"unknown error");
471 callbackManager->callOnError(error);
472 LoggerD("getAppsInfo error callback called");
477 ApplicationInformationArrayPtr appInfoArray = event->getAppInfoArray();
479 ApplicationConverter converter(gContext, event.Get());
481 JSValueRef result = converter.toJSValueRef(appInfoArray);
483 callbackManager->callOnSuccess(result);
484 LoggerD("getAppsInfo success callback called");
487 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
488 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR, "Internal error");
490 callbackManager->callOnError(error);
491 LoggerD("getAppsInfo error callback called");
497 void ApplicationAsyncAnswerHandler::eventListener(const EventApplicationAppInfoEventListenerPtr &event)
499 JSApplicationEventCallbackManagerPtr callbackManager =
500 DPL::StaticPointerCast<JSApplicationEventCallbackManager>(event->getPrivateData());
501 if (!callbackManager)
503 LoggerE("no callback manager");
507 JSContextRef gContext = callbackManager->getContext();
509 ApplicationConverter converter(gContext, callbackManager.Get());
512 if(event->getType() == EventApplicationAppInfoEventListener::OnInstalled)
514 ApplicationInformationPtr appInfo = event->getAppInfo();
517 LoggerE("AppInfo is not set.");
520 JSValueRef result = converter.toJSValueRefFromApplicationInformation(appInfo);
521 callbackManager->callOnInstalled(result);
522 LoggerD("AppInfoEvent oninstalled callback called");
524 else if(event->getType() == EventApplicationAppInfoEventListener::OnUpdated)
526 ApplicationInformationPtr appInfo = event->getAppInfo();
529 LoggerE("AppInfo is not set.");
532 JSValueRef result = converter.toJSValueRefFromApplicationInformation(appInfo);
533 callbackManager->callOnUpdated(result);
534 LoggerD("AppInfoEvent onupdated callback called");
536 else if(event->getType() == EventApplicationAppInfoEventListener::OnUninstalled)
538 ApplicationInformationPtr appInfo = event->getAppInfo();
539 std::string appId = appInfo->getAppId();
542 LoggerE("AppId is not set.");
545 JSValueRef result = converter.toJSValueRef(appId);
546 callbackManager->callOnUninstalled(result);
547 LoggerD("AppInfoEvent onuninstalled callback called");
551 LoggerE("Event callback type is wrong.");
554 } Catch (Exception) {
555 LoggerE("Conversion error");