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 <JSTizenExceptionFactory.h>
20 #include <JSTizenException.h>
21 #include <TimeTracer.h>
22 #include "ApplicationController.h"
23 #include "ApplicationConverter.h"
24 #include "JSApplicationEventCallbackManager.h"
25 #include "ApplicationAsyncCallbackManager.h"
26 #include "ApplicationInformationEventPrivateData.h"
30 namespace Application {
32 using namespace DeviceAPI::Common;
33 using namespace WrtDeviceApis::Commons;
34 using namespace WrtDeviceApis::CommonsJavaScript;
36 ApplicationController::ApplicationController(JSContextRef context, IApplicationManagerPtr application) :
37 EventApplicationLaunchEventAnswerReceiver(ThreadEnum::NULL_THREAD),
38 EventApplicationKillEventAnswerReceiver(ThreadEnum::NULL_THREAD),
39 EventApplicationLaunchAppControlEventAnswerReceiver(ThreadEnum::NULL_THREAD),
40 EventApplicationLaunchAppControlReplyEventAnswerReceiver(ThreadEnum::NULL_THREAD),
41 EventApplicationFindAppControlEventAnswerReceiver(ThreadEnum::NULL_THREAD),
42 EventApplicationGetAppsContextEventAnswerReceiver(ThreadEnum::NULL_THREAD),
43 EventApplicationGetAppsInfoEventAnswerReceiver(ThreadEnum::NULL_THREAD),
44 EventApplicationAppInfoEventListenerListener(ThreadEnum::NULL_THREAD),
45 ApplicationPrivObject(context, application)
47 LoggerD("ApplicationController constructed : " << this);
49 LoggerW("controller has no application object");
53 ApplicationController::~ApplicationController()
55 LoggerD("ApplicationController destructed : " << this);
58 void ApplicationController::OnAnswerReceived(const EventApplicationLaunchPtr &event)
60 ApplicationAsyncAnswerHandler::launch(event);
61 TIME_TRACER_ITEM_END("launch(async)", 0);
64 void ApplicationController::OnAnswerReceived(const EventApplicationKillPtr &event)
66 ApplicationAsyncAnswerHandler::kill(event);
67 TIME_TRACER_ITEM_END("kill(async)", 0);
70 void ApplicationController::OnAnswerReceived(const EventApplicationLaunchAppControlPtr &event)
72 ApplicationAsyncAnswerHandler::launchAppControl(event);
73 TIME_TRACER_ITEM_END("launchAppControl(async)", 0);
76 void ApplicationController::OnAnswerReceived(const EventApplicationLaunchAppControlReplyPtr &event)
78 ApplicationAsyncAnswerHandler::launchAppControlReply(event);
79 TIME_TRACER_ITEM_END("launchAppControlReply(async)", 0);
82 void ApplicationController::OnAnswerReceived(const EventApplicationFindAppControlPtr &event)
84 ApplicationAsyncAnswerHandler::findAppControl(event);
85 TIME_TRACER_ITEM_END("findAppControl(async)", 0);
88 void ApplicationController::OnAnswerReceived(const EventApplicationGetAppsContextPtr &event)
90 ApplicationAsyncAnswerHandler::getAppsContext(event);
91 TIME_TRACER_ITEM_END("getAppsContext(async)", 0);
94 void ApplicationController::OnAnswerReceived(const EventApplicationGetAppsInfoPtr &event)
96 ApplicationAsyncAnswerHandler::getAppsInfo(event);
97 TIME_TRACER_ITEM_END("getAppsInfo(async)", 0);
100 void ApplicationController::onAnswerReceived(const EventApplicationAppInfoEventListenerPtr &event)
102 ApplicationAsyncAnswerHandler::eventListener(event);
105 void ApplicationAsyncAnswerHandler::launch(const EventApplicationLaunchPtr &event)
108 JSCallbackManagerPtr callbackManager =
109 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
110 if (!callbackManager) {
111 LoggerE("no callback manager");
115 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
117 if(event->checkCancelled()) {
118 LoggerD("Operation cancelled");
122 JSContextRef gContext = callbackManager->getContext();
124 JSValueRef error = NULL;
125 if (ExceptionCodes::None != event->getExceptionCode())
127 switch (event->getExceptionCode())
129 case ExceptionCodes::InvalidArgumentException:
130 case ExceptionCodes::NotFoundException:
131 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR, "given app id is not found");
133 case ExceptionCodes::PlatformException:
134 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "platform exception");
137 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"unknown error");
141 callbackManager->callOnError(error);
146 callbackManager->callOnSuccess();
149 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
150 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
152 callbackManager->callOnError(error);
157 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 = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR,"given package is not found");
184 case ExceptionCodes::PlatformException:
185 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"platform exception");
187 case ExceptionCodes::InvalidArgumentException:
188 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::INVALID_VALUES_ERROR, "invalid value");
191 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"unknown error");
195 callbackManager->callOnError(error);
200 callbackManager->callOnSuccess();
203 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
204 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
206 callbackManager->callOnError(error);
211 void ApplicationAsyncAnswerHandler::launchAppControl(const EventApplicationLaunchAppControlPtr &event)
214 JSCallbackManagerPtr callbackManager =
215 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
216 if (!callbackManager) {
217 LoggerE("no callback manager");
221 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
223 if(event->checkCancelled()) {
224 LoggerD("Operation cancelled");
228 JSContextRef gContext = callbackManager->getContext();
230 JSValueRef error = NULL;
231 if (ExceptionCodes::None != event->getExceptionCode())
233 switch (event->getExceptionCode())
235 case ExceptionCodes::NotFoundException:
236 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR,"given package is not found");
238 case ExceptionCodes::PlatformException:
239 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"platform exception");
242 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"unknown error");
246 callbackManager->callOnError(error);
251 callbackManager->callOnSuccess();
254 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
255 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
257 callbackManager->callOnError(error);
262 void ApplicationAsyncAnswerHandler::launchAppControlReply(const EventApplicationLaunchAppControlReplyPtr &event)
265 JSCallbackManagerPtr callbackManager =
266 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
267 if (!callbackManager) {
268 LoggerE("no callback manager");
272 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
274 if(event->checkCancelled()) {
275 LoggerD("Operation cancelled");
279 JSContextRef gContext = callbackManager->getContext();
281 if (ExceptionCodes::None != event->getExceptionCode())
283 callbackManager->callOnError();
288 ApplicationControlDataArrayPtr appControlDataArray = event->getAppControlDataArray();
289 if(appControlDataArray == NULL)
291 ThrowMsg(WrtDeviceApis::Commons::UnknownException, "No reply");
294 ApplicationConverterFactory::ConverterType converter =
295 ApplicationConverterFactory::getConverter(gContext);
296 JSValueRef result = converter->toJSValueRef(*appControlDataArray);
298 LoggerD("replyCallbackManager onsuccess");
300 callbackManager->callOnSuccess(result);
303 callbackManager->callOnError();
308 void ApplicationAsyncAnswerHandler::findAppControl(const EventApplicationFindAppControlPtr &event)
311 JSCallbackManagerPtr callbackManager =
312 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
313 if (!callbackManager) {
314 LoggerE("no callback manager");
318 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
320 if(event->checkCancelled()) {
321 LoggerD("Operation cancelled");
325 JSContextRef gContext = callbackManager->getContext();
327 JSValueRef error = NULL;
328 if (ExceptionCodes::None != event->getExceptionCode())
330 switch (event->getExceptionCode())
332 case ExceptionCodes::NotFoundException:
333 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR,"given package is not found");
335 case ExceptionCodes::PlatformException:
336 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"platform exception");
339 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"unknown error");
343 callbackManager->callOnError(error);
348 ApplicationInformationArrayPtr appInfos = event->getAppInfos();
349 ApplicationControlPtr appControl = event->getAppControl();
351 ApplicationConverterFactory::ConverterType converter =
352 ApplicationConverterFactory::getConverter(gContext);
354 JSValueRef result[2];
355 result[0] = converter->toJSValueRef(appInfos);
356 result[1] = converter->toJSValueRef(appControl);
358 callbackManager->callOnSuccess(result, 2);
361 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
362 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
364 callbackManager->callOnError(error);
369 void ApplicationAsyncAnswerHandler::getAppsContext(const EventApplicationGetAppsContextPtr &event)
372 JSCallbackManagerPtr callbackManager =
373 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
374 if (!callbackManager) {
375 LoggerE("no callback manager");
379 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
381 if(event->checkCancelled()) {
382 LoggerD("Operation cancelled");
386 JSContextRef gContext = callbackManager->getContext();
388 JSValueRef error = NULL;
389 if (ExceptionCodes::None != event->getExceptionCode())
391 switch (event->getExceptionCode())
393 case ExceptionCodes::NotFoundException:
394 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR,"given package is not found");
396 case ExceptionCodes::PlatformException:
397 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"platform exception");
400 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"unknown error");
404 callbackManager->callOnError(error);
409 ApplicationContextArrayPtr appContextArray = event->getAppContextArray();
411 ApplicationConverterFactory::ConverterType converter =
412 ApplicationConverterFactory::getConverter(gContext);
414 JSValueRef result = converter->toJSValueRef(appContextArray);
416 callbackManager->callOnSuccess(result);
419 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
420 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
422 callbackManager->callOnError(error);
427 void ApplicationAsyncAnswerHandler::getAppsInfo(const EventApplicationGetAppsInfoPtr &event)
430 JSCallbackManagerPtr callbackManager =
431 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
432 if (!callbackManager) {
433 LoggerE("no callback manager");
437 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
439 if(event->checkCancelled()) {
440 LoggerD("Operation cancelled");
444 JSContextRef gContext = callbackManager->getContext();
446 JSValueRef error = NULL;
447 if (ExceptionCodes::None != event->getExceptionCode())
449 switch (event->getExceptionCode())
451 case ExceptionCodes::NotFoundException:
452 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR,"given package is not found");
454 case ExceptionCodes::PlatformException:
455 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"platform exception");
458 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"unknown error");
462 callbackManager->callOnError(error);
467 ApplicationInformationArrayPtr appInfoArray = event->getAppInfoArray();
469 ApplicationConverterFactory::ConverterType converter =
470 ApplicationConverterFactory::getConverter(gContext);
472 JSValueRef result = converter->toJSValueRef(appInfoArray);
474 callbackManager->callOnSuccess(result);
477 LoggerE("error during processing answer" << _rethrown_exception.GetMessage());
478 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
480 callbackManager->callOnError(error);
486 void ApplicationAsyncAnswerHandler::eventListener(const EventApplicationAppInfoEventListenerPtr &event)
489 JSApplicationEventCallbackManagerPtr callbackManager =
490 DPL::StaticPointerCast<JSApplicationEventCallbackManager>(event->getPrivateData());
491 if (!callbackManager)
493 LoggerE("no callback manager");
497 JSContextRef gContext = callbackManager->getContext();
499 ApplicationConverterFactory::ConverterType converter =
500 ApplicationConverterFactory::getConverter(gContext);
503 if(event->getType() == EventApplicationAppInfoEventListener::OnInstalled)
505 ApplicationInformationPtr appInfo = event->getAppInfo();
508 LoggerE("AppInfo did not set.");
511 JSValueRef result = converter->toJSValueRefFromApplicationInformation(appInfo);
512 callbackManager->callOnInstalled(result);
514 else if(event->getType() == EventApplicationAppInfoEventListener::OnUpdated)
516 ApplicationInformationPtr appInfo = event->getAppInfo();
519 LoggerE("AppInfo did not set.");
522 JSValueRef result = converter->toJSValueRefFromApplicationInformation(appInfo);
523 callbackManager->callOnUpdated(result);
525 else if(event->getType() == EventApplicationAppInfoEventListener::OnUninstalled)
527 ApplicationInformationPtr appInfo = event->getAppInfo();
528 std::string appId = appInfo->getAppId();
531 LoggerE("AppId did not set.");
534 JSValueRef result = converter->toJSValueRef(appId);
535 callbackManager->callOnUninstalled(result);
539 LoggerE("Event callback type is wrong.");
542 } Catch (Exception) {
543 LoggerE("Conversion error");