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();
150 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
151 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR, "Internal error");
153 callbackManager->callOnError(error);
158 void ApplicationAsyncAnswerHandler::kill(const EventApplicationKillPtr &event)
160 JSCallbackManagerPtr callbackManager =
161 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
162 if (!callbackManager) {
163 LoggerE("no callback manager");
167 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
169 if(event->checkCancelled()) {
170 LoggerD("Operation cancelled");
174 JSContextRef gContext = callbackManager->getContext();
176 JSValueRef error = NULL;
177 if (ExceptionCodes::None != event->getExceptionCode())
179 switch (event->getExceptionCode())
181 case ExceptionCodes::NotFoundException:
182 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::NOT_FOUND_ERROR,"given package is not found");
184 case ExceptionCodes::PlatformException:
185 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"platform exception");
187 case ExceptionCodes::InvalidArgumentException:
188 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::INVALID_VALUES_ERROR, "invalid value");
191 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"unknown error");
195 callbackManager->callOnError(error);
200 callbackManager->callOnSuccess();
203 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
204 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR, "Internal error");
206 callbackManager->callOnError(error);
211 void ApplicationAsyncAnswerHandler::launchAppControl(const EventApplicationLaunchAppControlPtr &event)
213 JSCallbackManagerPtr callbackManager =
214 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
215 if (!callbackManager) {
216 LoggerE("no callback manager");
220 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
222 if(event->checkCancelled()) {
223 LoggerD("Operation cancelled");
227 JSContextRef gContext = callbackManager->getContext();
229 JSValueRef error = NULL;
230 if (ExceptionCodes::None != event->getExceptionCode())
232 switch (event->getExceptionCode())
234 case ExceptionCodes::NotFoundException:
235 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::NOT_FOUND_ERROR,"given package is not found");
237 case ExceptionCodes::PlatformException:
238 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"platform exception");
241 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"unknown error");
245 callbackManager->callOnError(error);
250 callbackManager->callOnSuccess();
253 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
254 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR, "Internal error");
256 callbackManager->callOnError(error);
261 void ApplicationAsyncAnswerHandler::launchAppControlReply(const EventApplicationLaunchAppControlReplyPtr &event)
263 JSCallbackManagerPtr callbackManager =
264 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
265 if (!callbackManager) {
266 LoggerE("no callback manager");
270 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
272 if(event->checkCancelled()) {
273 LoggerD("Operation cancelled");
277 JSContextRef gContext = callbackManager->getContext();
279 if (ExceptionCodes::None != event->getExceptionCode())
281 callbackManager->callOnError();
286 ApplicationControlDataArrayPtr appControlDataArray = event->getAppControlDataArray();
287 if(appControlDataArray == NULL)
289 ThrowMsg(WrtDeviceApis::Commons::UnknownException, "No reply");
292 ApplicationConverterFactory::ConverterType converter =
293 ApplicationConverterFactory::getConverter(gContext);
294 JSValueRef result = converter->toJSValueRef(*appControlDataArray);
296 callbackManager->callOnSuccess(result);
299 callbackManager->callOnError();
304 void ApplicationAsyncAnswerHandler::findAppControl(const EventApplicationFindAppControlPtr &event)
306 JSCallbackManagerPtr callbackManager =
307 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
308 if (!callbackManager) {
309 LoggerE("no callback manager");
313 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
315 if(event->checkCancelled()) {
316 LoggerD("Operation cancelled");
320 JSContextRef gContext = callbackManager->getContext();
322 JSValueRef error = NULL;
323 if (ExceptionCodes::None != event->getExceptionCode())
325 switch (event->getExceptionCode())
327 case ExceptionCodes::NotFoundException:
328 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::NOT_FOUND_ERROR,"given package is not found");
330 case ExceptionCodes::PlatformException:
331 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"platform exception");
334 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"unknown error");
338 callbackManager->callOnError(error);
343 ApplicationInformationArrayPtr appInfos = event->getAppInfos();
344 ApplicationControlPtr appControl = event->getAppControl();
346 ApplicationConverterFactory::ConverterType converter =
347 ApplicationConverterFactory::getConverter(gContext);
349 JSValueRef result[2];
350 result[0] = converter->toJSValueRef(appInfos);
351 result[1] = converter->toJSValueRef(appControl);
353 callbackManager->callOnSuccess(result, 2);
356 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
357 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR, "Internal error");
359 callbackManager->callOnError(error);
364 void ApplicationAsyncAnswerHandler::getAppsContext(const EventApplicationGetAppsContextPtr &event)
366 JSCallbackManagerPtr callbackManager =
367 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
368 if (!callbackManager) {
369 LoggerE("no callback manager");
373 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
375 if(event->checkCancelled()) {
376 LoggerD("Operation cancelled");
380 JSContextRef gContext = callbackManager->getContext();
382 JSValueRef error = NULL;
383 if (ExceptionCodes::None != event->getExceptionCode())
385 switch (event->getExceptionCode())
387 case ExceptionCodes::NotFoundException:
388 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::NOT_FOUND_ERROR,"given package is not found");
390 case ExceptionCodes::PlatformException:
391 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"platform exception");
394 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"unknown error");
398 callbackManager->callOnError(error);
403 ApplicationContextArrayPtr appContextArray = event->getAppContextArray();
405 ApplicationConverterFactory::ConverterType converter =
406 ApplicationConverterFactory::getConverter(gContext);
408 JSValueRef result = converter->toJSValueRef(appContextArray);
410 callbackManager->callOnSuccess(result);
413 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
414 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR, "Internal error");
416 callbackManager->callOnError(error);
421 void ApplicationAsyncAnswerHandler::getAppsInfo(const EventApplicationGetAppsInfoPtr &event)
423 JSCallbackManagerPtr callbackManager =
424 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
425 if (!callbackManager) {
426 LoggerE("no callback manager");
430 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
432 if(event->checkCancelled()) {
433 LoggerD("Operation cancelled");
437 JSContextRef gContext = callbackManager->getContext();
439 JSValueRef error = NULL;
440 if (ExceptionCodes::None != event->getExceptionCode())
442 switch (event->getExceptionCode())
444 case ExceptionCodes::NotFoundException:
445 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::NOT_FOUND_ERROR,"given package is not found");
447 case ExceptionCodes::PlatformException:
448 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"platform exception");
451 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR,"unknown error");
455 callbackManager->callOnError(error);
460 ApplicationInformationArrayPtr appInfoArray = event->getAppInfoArray();
462 ApplicationConverterFactory::ConverterType converter =
463 ApplicationConverterFactory::getConverter(gContext);
465 JSValueRef result = converter->toJSValueRef(appInfoArray);
467 callbackManager->callOnSuccess(result);
470 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
471 error = JSWebAPIErrorFactory::makeErrorObject(gContext, JSWebAPIErrorFactory::UNKNOWN_ERROR, "Internal error");
473 callbackManager->callOnError(error);
479 void ApplicationAsyncAnswerHandler::eventListener(const EventApplicationAppInfoEventListenerPtr &event)
481 JSApplicationEventCallbackManagerPtr callbackManager =
482 DPL::StaticPointerCast<JSApplicationEventCallbackManager>(event->getPrivateData());
483 if (!callbackManager)
485 LoggerE("no callback manager");
489 JSContextRef gContext = callbackManager->getContext();
491 ApplicationConverterFactory::ConverterType converter =
492 ApplicationConverterFactory::getConverter(gContext);
495 if(event->getType() == EventApplicationAppInfoEventListener::OnInstalled)
497 ApplicationInformationPtr appInfo = event->getAppInfo();
500 LoggerE("AppInfo is not set.");
503 JSValueRef result = converter->toJSValueRefFromApplicationInformation(appInfo);
504 callbackManager->callOnInstalled(result);
506 else if(event->getType() == EventApplicationAppInfoEventListener::OnUpdated)
508 ApplicationInformationPtr appInfo = event->getAppInfo();
511 LoggerE("AppInfo is not set.");
514 JSValueRef result = converter->toJSValueRefFromApplicationInformation(appInfo);
515 callbackManager->callOnUpdated(result);
517 else if(event->getType() == EventApplicationAppInfoEventListener::OnUninstalled)
519 ApplicationInformationPtr appInfo = event->getAppInfo();
520 std::string appId = appInfo->getAppId();
523 LoggerE("AppId is not set.");
526 JSValueRef result = converter->toJSValueRef(appId);
527 callbackManager->callOnUninstalled(result);
531 LoggerE("Event callback type is wrong.");
534 } Catch (Exception) {
535 LoggerE("Conversion error");