[Release] wrt-installer_0.0.89
[framework/web/wrt-installer.git] / src / jobs / widget_uninstall / task_remove_files.cpp
index 2dfe92e..d7c3157 100644 (file)
 #include <widget_uninstall/uninstaller_context.h>
 #include <dpl/wrt-dao-rw/widget_dao.h>
 #include <dpl/wrt-dao-ro/widget_config.h>
+#include <dpl/wrt-dao-ro/vconf_config.h>
 #include <dpl/assert.h>
 #include <dpl/utils/wrt_utility.h>
 #include <ail.h>
 #include <pkgmgr/pkgmgr_parser.h>
+#include <errno.h>
+#include <string.h>
+#include <widget_install_to_external.h>
+#include <vconf.h>
 
 namespace Jobs {
 namespace WidgetUninstall {
 
 using namespace WrtDB;
 
+namespace {
+const char * const VCONF_KEY_PREFIX = "file/private/";
+}
+
 TaskRemoveFiles::TaskRemoveFiles(UninstallerContext& context) :
     DPL::TaskDecl<TaskRemoveFiles>(this),
     m_context(context)
 {
-    AddStep(&TaskRemoveFiles::StepRemoveInstallationDirectory);
+    if (!m_context.isExternalWidget) {
+        AddStep(&TaskRemoveFiles::StepRemoveInstallationDirectory);
+    } else {
+        AddStep(&TaskRemoveFiles::StepRemoveExternalWidget);
+    }
     //AddStep(&TaskRemoveFiles::StepRemoveDesktop);
     AddStep(&TaskRemoveFiles::StepRemoveManifest);
     AddStep(&TaskRemoveFiles::StepRemoveExternalLocations);
+    AddStep(&TaskRemoveFiles::StepRemoveVconf);
     AddStep(&TaskRemoveFiles::StepRemoveFinished);
 }
 
@@ -60,6 +74,10 @@ void TaskRemoveFiles::StepRemoveInstallationDirectory()
     if(!WrtUtilRemove(widgetDir)){
         LogWarning("Removing widget installation directory failed");
     }
+    std::string dataDir = m_context.locations->getUserDataRootDir();
+    if(!WrtUtilRemove(dataDir)){
+        LogWarning(dataDir + " is already removed");
+    }
     m_context.job->UpdateProgress(
         UninstallerContext::UNINSTALL_REMOVE_WIDGETDIR,
         "Widget INstallation Directory Removal Finished");
@@ -138,7 +156,10 @@ void TaskRemoveFiles::StepRemoveExternalLocations()
         if(WrtUtilFileExists(*path))
         {
             LogDebug("  -> " << *path);
-            remove(path->c_str());
+            int ret = remove(path->c_str());
+            if (ret != 0) {
+                LogError("Failed to remove the file: " << path->c_str() << " with error: " << strerror(errno));
+            }
         }
         else if(WrtUtilDirExists(*path))
         {
@@ -155,5 +176,30 @@ void TaskRemoveFiles::StepRemoveExternalLocations()
     dao.unregisterAllExternalLocations();
 }
 
+void TaskRemoveFiles::StepRemoveVconf()
+{
+    std::string key =
+        WrtDB::VconfConfig::GetVconfKeyRootPath(
+            m_context.locations->getPkgname());
+    if(vconf_unset_recursive(key.c_str())) {
+        LogError("Fail to unset vconf file");
+    } else {
+        LogDebug("vconf file is removed");
+    }
+}
+
+void TaskRemoveFiles::StepRemoveExternalWidget()
+{
+    Try {
+        WidgetInstallToExtSingleton::Instance().initialize(m_context.pkgname);
+        WidgetInstallToExtSingleton::Instance().uninstallation();
+        WidgetInstallToExtSingleton::Instance().deinitialize();
+    }
+    Catch (WidgetInstallToExt::Exception::ErrorInstallToExt)
+    {
+        Throw(Jobs::WidgetUninstall::TaskRemoveFiles::Exception::RemoveFilesFailed);
+    }
+}
+
 } //namespace WidgetUninstall
 } //namespace Jobs