* @version 1.0
* @brief Header file for widget uninstall task check
*/
+#include <time.h>
#include <dpl/sstream.h>
#include <widget_uninstall/task_check.h>
#include <widget_uninstall/job_widget_uninstall.h>
}
TaskCheck::~TaskCheck()
-{
-}
+{}
void TaskCheck::StepUninstallPreCheck()
{
//check if deferred
//TODO if widget to be updated, then remove it from Deferred list?
- int ret = APP_MANAGER_ERROR_NONE;
bool isRunning = false;
- ret = app_manager_is_running(m_context.tzAppid.c_str(), &isRunning);
+ int ret = app_manager_is_running(m_context.tzAppid.c_str(), &isRunning);
if (APP_MANAGER_ERROR_NONE != ret) {
LogError("Fail to get running state");
ThrowMsg(Exceptions::PlatformAPIFailure,
}
if (true == isRunning) {
- LogError("Widget is not stopped. Cannot uninstall!");
- //TODO different error
- ThrowMsg(Exceptions::AlreadyUninstalling,
- "Widget is not stopped. Cannot uninstall!");
- //TODO or defer uninstall?
+ // get app_context for running application
+ // app_context must be released with app_context_destroy
+ app_context_h appCtx = NULL;
+ ret = app_manager_get_app_context(m_context.tzAppid.c_str(), &appCtx);
+ if (APP_MANAGER_ERROR_NONE != ret) {
+ LogError("Fail to get app_context");
+ ThrowMsg(Exceptions::AppIsRunning,
+ "Widget is not stopped. Cannot uninstall!");
+ }
+
+ // terminate app_context_h
+ ret = app_manager_terminate_app(appCtx);
+ if (APP_MANAGER_ERROR_NONE != ret) {
+ LogError("Fail to terminate running application");
+ app_context_destroy(appCtx);
+ ThrowMsg(Exceptions::AppIsRunning,
+ "Widget is not stopped. Cannot uninstall!");
+ } else {
+ app_context_destroy(appCtx);
+ // app_manager_terminate_app isn't sync API
+ // wait until application isn't running (50ms * 100)
+ bool isStillRunning = true;
+ int checkingloop = 100;
+ struct timespec duration = { 0, 50 * 1000 * 1000 };
+ while (--checkingloop >= 0) {
+ nanosleep(&duration, NULL);
+ int ret = app_manager_is_running(m_context.tzAppid.c_str(), &isStillRunning);
+ if (APP_MANAGER_ERROR_NONE != ret) {
+ LogError("Fail to get running state");
+ ThrowMsg(Exceptions::PlatformAPIFailure,
+ "Fail to get widget state");
+ }
+ if (!isStillRunning) {
+ break;
+ }
+ }
+ if (isStillRunning) {
+ LogError("Fail to terminate running application");
+ ThrowMsg(Exceptions::AppIsRunning,
+ "Widget is not stopped. Cannot uninstall!");
+ }
+ LogInfo("terminate application");
+ }
}
LogInfo("Widget Can be uninstalled. Pkgname : " << m_context.tzAppid);
m_context.job->UpdateProgress(UninstallerContext::UNINSTALL_PRECHECK,
"Uninstall pre-checking Finished");
}
-
} //namespace WidgetUninstall
} //namespace Jobs