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 <dpl/log/log.h>
19 #include <CommonsJavaScript/JSCallbackManager.h>
20 #include <JSTizenExceptionFactory.h>
21 #include <JSTizenException.h>
22 #include "ApplicationController.h"
23 #include "ApplicationConverter.h"
24 #include "JSApplicationEventCallbackManager.h"
25 #include "ApplicationAsyncCallbackManager.h"
26 #include "ApplicationInformationEventPrivateData.h"
29 namespace Application {
31 using namespace DeviceAPI::Common;
32 using namespace WrtDeviceApis::Commons;
33 using namespace WrtDeviceApis::CommonsJavaScript;
35 ApplicationController::ApplicationController(JSContextRef context, IApplicationManagerPtr application) :
36 EventApplicationLaunchEventAnswerReceiver(ThreadEnum::NULL_THREAD),
37 EventApplicationKillEventAnswerReceiver(ThreadEnum::NULL_THREAD),
38 EventApplicationLaunchAppControlEventAnswerReceiver(ThreadEnum::NULL_THREAD),
39 EventApplicationLaunchAppControlReplyEventAnswerReceiver(ThreadEnum::NULL_THREAD),
40 EventApplicationFindAppControlEventAnswerReceiver(ThreadEnum::NULL_THREAD),
41 EventApplicationGetAppsContextEventAnswerReceiver(ThreadEnum::NULL_THREAD),
42 EventApplicationGetAppsInfoEventAnswerReceiver(ThreadEnum::NULL_THREAD),
43 EventApplicationAppInfoEventListenerListener(ThreadEnum::NULL_THREAD),
44 ApplicationPrivObject(context, application)
46 LogDebug("ApplicationController constructed : " << this);
48 LogWarning("controller has no application object");
52 ApplicationController::~ApplicationController()
54 LogDebug("ApplicationController destructed : " << this);
57 void ApplicationController::OnAnswerReceived(const EventApplicationLaunchPtr &event)
59 ApplicationAsyncAnswerHandler::launch(event);
62 void ApplicationController::OnAnswerReceived(const EventApplicationKillPtr &event)
64 ApplicationAsyncAnswerHandler::kill(event);
67 void ApplicationController::OnAnswerReceived(const EventApplicationLaunchAppControlPtr &event)
69 ApplicationAsyncAnswerHandler::launchAppControl(event);
72 void ApplicationController::OnAnswerReceived(const EventApplicationLaunchAppControlReplyPtr &event)
74 ApplicationAsyncAnswerHandler::launchAppControlReply(event);
77 void ApplicationController::OnAnswerReceived(const EventApplicationFindAppControlPtr &event)
79 ApplicationAsyncAnswerHandler::findAppControl(event);
82 void ApplicationController::OnAnswerReceived(const EventApplicationGetAppsContextPtr &event)
84 ApplicationAsyncAnswerHandler::getAppsContext(event);
87 void ApplicationController::OnAnswerReceived(const EventApplicationGetAppsInfoPtr &event)
89 ApplicationAsyncAnswerHandler::getAppsInfo(event);
92 void ApplicationController::onAnswerReceived(const EventApplicationAppInfoEventListenerPtr &event)
94 ApplicationAsyncAnswerHandler::eventListener(event);
97 void ApplicationAsyncAnswerHandler::launch(const EventApplicationLaunchPtr &event)
100 JSCallbackManagerPtr callbackManager =
101 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
102 if (!callbackManager) {
103 LogError("no callback manager");
107 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
109 if(event->checkCancelled()) {
110 LogDebug("Operation cancelled");
114 JSContextRef gContext = callbackManager->getContext();
116 JSValueRef error = NULL;
117 if (ExceptionCodes::None != event->getExceptionCode())
119 switch (event->getExceptionCode())
121 case ExceptionCodes::InvalidArgumentException:
122 case ExceptionCodes::NotFoundException:
123 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR, "given app id is not found");
125 case ExceptionCodes::PlatformException:
126 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "platform exception");
129 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"unknown error");
133 callbackManager->callOnError(error);
138 callbackManager->callOnSuccess();
141 LogError("error during processing answer" << _rethrown_exception.GetMessage());
142 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
144 callbackManager->callOnError(error);
149 void ApplicationAsyncAnswerHandler::kill(const EventApplicationKillPtr &event)
152 JSCallbackManagerPtr callbackManager =
153 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
154 if (!callbackManager) {
155 LogError("no callback manager");
159 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
161 if(event->checkCancelled()) {
162 LogDebug("Operation cancelled");
166 JSContextRef gContext = callbackManager->getContext();
168 JSValueRef error = NULL;
169 if (ExceptionCodes::None != event->getExceptionCode())
171 switch (event->getExceptionCode())
173 case ExceptionCodes::NotFoundException:
174 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR,"given package is not found");
176 case ExceptionCodes::PlatformException:
177 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"platform exception");
179 case ExceptionCodes::InvalidArgumentException:
180 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::INVALID_VALUES_ERROR, "invalid value");
183 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"unknown error");
187 callbackManager->callOnError(error);
192 callbackManager->callOnSuccess();
195 LogError("error during processing answer" << _rethrown_exception.GetMessage());
196 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
198 callbackManager->callOnError(error);
203 void ApplicationAsyncAnswerHandler::launchAppControl(const EventApplicationLaunchAppControlPtr &event)
206 JSCallbackManagerPtr callbackManager =
207 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
208 if (!callbackManager) {
209 LogError("no callback manager");
213 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
215 if(event->checkCancelled()) {
216 LogDebug("Operation cancelled");
220 JSContextRef gContext = callbackManager->getContext();
222 JSValueRef error = NULL;
223 if (ExceptionCodes::None != event->getExceptionCode())
225 switch (event->getExceptionCode())
227 case ExceptionCodes::NotFoundException:
228 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR,"given package is not found");
230 case ExceptionCodes::PlatformException:
231 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"platform exception");
234 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"unknown error");
238 callbackManager->callOnError(error);
243 callbackManager->callOnSuccess();
246 LogError("error during processing answer" << _rethrown_exception.GetMessage());
247 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
249 callbackManager->callOnError(error);
254 void ApplicationAsyncAnswerHandler::launchAppControlReply(const EventApplicationLaunchAppControlReplyPtr &event)
257 JSCallbackManagerPtr callbackManager =
258 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
259 if (!callbackManager) {
260 LogError("no callback manager");
264 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
266 if(event->checkCancelled()) {
267 LogDebug("Operation cancelled");
271 JSContextRef gContext = callbackManager->getContext();
273 if (ExceptionCodes::None != event->getExceptionCode())
275 callbackManager->callOnError();
280 ApplicationControlDataArrayPtr appControlDataArray = event->getAppControlDataArray();
281 if(appControlDataArray == NULL)
283 ThrowMsg(WrtDeviceApis::Commons::UnknownException, "No reply");
286 ApplicationConverterFactory::ConverterType converter =
287 ApplicationConverterFactory::getConverter(gContext);
288 JSValueRef result = converter->toJSValueRef(*appControlDataArray);
290 LogDebug("replyCallbackManager onsuccess");
292 callbackManager->callOnSuccess(result);
295 callbackManager->callOnError();
300 void ApplicationAsyncAnswerHandler::findAppControl(const EventApplicationFindAppControlPtr &event)
303 JSCallbackManagerPtr callbackManager =
304 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
305 if (!callbackManager) {
306 LogError("no callback manager");
310 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
312 if(event->checkCancelled()) {
313 LogDebug("Operation cancelled");
317 JSContextRef gContext = callbackManager->getContext();
319 JSValueRef error = NULL;
320 if (ExceptionCodes::None != event->getExceptionCode())
322 switch (event->getExceptionCode())
324 case ExceptionCodes::NotFoundException:
325 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR,"given package is not found");
327 case ExceptionCodes::PlatformException:
328 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"platform exception");
331 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"unknown error");
335 callbackManager->callOnError(error);
340 ApplicationInformationArrayPtr appInfos = event->getAppInfos();
341 ApplicationControlPtr appControl = event->getAppControl();
343 ApplicationConverterFactory::ConverterType converter =
344 ApplicationConverterFactory::getConverter(gContext);
346 JSValueRef result[2];
347 result[0] = converter->toJSValueRef(appInfos);
348 result[1] = converter->toJSValueRef(appControl);
350 callbackManager->callOnSuccess(result, 2);
353 LogError("error during processing answer" << _rethrown_exception.GetMessage());
354 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
356 callbackManager->callOnError(error);
361 void ApplicationAsyncAnswerHandler::getAppsContext(const EventApplicationGetAppsContextPtr &event)
364 JSCallbackManagerPtr callbackManager =
365 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
366 if (!callbackManager) {
367 LogError("no callback manager");
371 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
373 if(event->checkCancelled()) {
374 LogDebug("Operation cancelled");
378 JSContextRef gContext = callbackManager->getContext();
380 JSValueRef error = NULL;
381 if (ExceptionCodes::None != event->getExceptionCode())
383 switch (event->getExceptionCode())
385 case ExceptionCodes::NotFoundException:
386 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR,"given package is not found");
388 case ExceptionCodes::PlatformException:
389 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"platform exception");
392 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"unknown error");
396 callbackManager->callOnError(error);
401 ApplicationContextArrayPtr appContextArray = event->getAppContextArray();
403 ApplicationConverterFactory::ConverterType converter =
404 ApplicationConverterFactory::getConverter(gContext);
406 JSValueRef result = converter->toJSValueRef(appContextArray);
408 callbackManager->callOnSuccess(result);
411 LogError("error during processing answer" << _rethrown_exception.GetMessage());
412 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
414 callbackManager->callOnError(error);
419 void ApplicationAsyncAnswerHandler::getAppsInfo(const EventApplicationGetAppsInfoPtr &event)
422 JSCallbackManagerPtr callbackManager =
423 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
424 if (!callbackManager) {
425 LogError("no callback manager");
429 ApplicationAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(callbackManager);
431 if(event->checkCancelled()) {
432 LogDebug("Operation cancelled");
436 JSContextRef gContext = callbackManager->getContext();
438 JSValueRef error = NULL;
439 if (ExceptionCodes::None != event->getExceptionCode())
441 switch (event->getExceptionCode())
443 case ExceptionCodes::NotFoundException:
444 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::NOT_FOUND_ERROR,"given package is not found");
446 case ExceptionCodes::PlatformException:
447 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"platform exception");
450 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR,"unknown error");
454 callbackManager->callOnError(error);
459 ApplicationInformationArrayPtr appInfoArray = event->getAppInfoArray();
461 ApplicationConverterFactory::ConverterType converter =
462 ApplicationConverterFactory::getConverter(gContext);
464 JSValueRef result = converter->toJSValueRef(appInfoArray);
466 callbackManager->callOnSuccess(result);
469 LogError("error during processing answer" << _rethrown_exception.GetMessage());
470 error = JSTizenExceptionFactory::makeErrorObject(gContext, JSTizenException::UNKNOWN_ERROR, "Internal error");
472 callbackManager->callOnError(error);
478 void ApplicationAsyncAnswerHandler::eventListener(const EventApplicationAppInfoEventListenerPtr &event)
481 JSApplicationEventCallbackManagerPtr callbackManager =
482 DPL::StaticPointerCast<JSApplicationEventCallbackManager>(event->getPrivateData());
483 if (!callbackManager)
485 LogError("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 LogError("AppInfo did 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 LogError("AppInfo did 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 LogError("AppId did not set.");
526 JSValueRef result = converter->toJSValueRef(appId);
527 callbackManager->callOnUninstalled(result);
531 LogError("Event callback type is wrong.");
534 } Catch (Exception) {
535 LogError("Conversion error");