#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);
}
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");
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))
{
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