*/
#include <regex.h>
+#include <sys/stat.h>
#include <widget_uninstall/job_widget_uninstall.h>
#include <widget_uninstall/widget_uninstall_errors.h>
#include <widget_uninstall/task_check.h>
#include <widget_uninstall/task_smack.h>
#include <widget_uninstall/task_uninstall_ospsvc.h>
#include <widget_uninstall/task_delete_certificates.h>
+#include <dpl/wrt-dao-ro/global_config.h>
#include <pkg-manager/pkgmgr_signal.h>
#include <app2ext_interface.h>
namespace { //anonymous
const char* REG_TIZEN_PKGID_PATTERN = "^[a-zA-Z0-9]{10}$";
+const int PKGID_LENTH = 10;
+
+bool checkDirectoryExist(const std::string& pkgId)
+{
+ std::string installPath =
+ std::string(GlobalConfig::GetUserInstalledWidgetPath()) +
+ "/" + pkgId;
+
+ struct stat dirStat;
+ if ((stat(installPath.c_str(), &dirStat) == 0)) {
+ return true;
+ }
+ return false;
+}
+
class UninstallerTaskFail :
public DPL::TaskDecl<UninstallerTaskFail>
{
using namespace PackageManager;
m_context.removeStarted = false;
m_context.removeFinished = false;
+ m_context.removeAbnormal = false;
m_context.uninstallStep = UninstallerContext::UNINSTALL_START;
m_context.job = this;
- m_context.isExternalWidget = getExternalWidgetFlag();
Try
{
- regex_t regx;
- if(regcomp(®x, REG_TIZEN_PKGID_PATTERN, REG_NOSUB | REG_EXTENDED)!=0){
- LogDebug("Regcomp failed");
+ WidgetStatus status = getWidgetStatus(tizenAppId);
+
+ if (WidgetStatus::Ok == status) {
+ WrtDB::WidgetDAOReadOnly dao(DPL::FromUTF8String(m_context.tzAppid));
+ m_context.tzPkgid = DPL::ToUTF8String(dao.getTizenPkgId());
+ m_context.locations = WidgetLocation(m_context.tzPkgid);
+ m_context.locations->registerAppid(m_context.tzAppid);
+
+ LogInfo("Widget model exists. App id : " << m_context.tzAppid);
+
+ AddTask(new TaskSmack(m_context));
+ AddTask(new TaskCheck(m_context));
+
+ if (dao.getPackagingType() == PKG_TYPE_HYBRID_WEB_APP) {
+ AddTask(new TaskUninstallOspsvc(m_context));
+ }
+ AddTask(new TaskRemoveFiles(m_context));
+ AddTask(new TaskDbUpdate(m_context));
+ AddTask(new TaskRemoveCustomHandlers(m_context));
+ AddTask(new TaskDeleteCertificates(m_context));
+
+ // send start signal of pkgmgr
+ if (getInstallerStruct().pkgmgrInterface->setPkgname(m_context.tzPkgid))
+ {
+ getInstallerStruct().pkgmgrInterface->sendSignal(
+ PKGMGR_START_KEY,
+ PKGMGR_START_UNINSTALL);
+ }
+ } else if (WidgetStatus::NOT_INSTALLED == status) {
+ AddTask(new UninstallerTaskFail(true));
+ } else if (WidgetStatus::ABNORMAL == status) {
+ m_context.locations = WidgetLocation(m_context.tzPkgid);
+ m_context.removeAbnormal = true;
+ AddTask(new TaskRemoveFiles(m_context));
+ } else {
+ AddTask(new UninstallerTaskFail(false));
}
+ } Catch(WidgetDAOReadOnly::Exception::Base) {
+ AddTask(new UninstallerTaskFail(false));
+ }
+}
+
+JobWidgetUninstall::WidgetStatus JobWidgetUninstall::getWidgetStatus(const std::string &id)
+{
+ regex_t regx;
+ if(regcomp(®x, REG_TIZEN_PKGID_PATTERN, REG_NOSUB | REG_EXTENDED)!=0){
+ LogDebug("Regcomp failed");
+ }
+ std::string pkgId;
- if ((regexec(®x, tizenAppId.c_str(),
+ Try {
+ if ((regexec(®x, id.c_str(),
static_cast<size_t>(0), NULL, 0) == REG_NOERROR)) {
+ pkgId = id;
+
TizenAppId appid =
WrtDB::WidgetDAOReadOnly::getTzAppId(
- DPL::FromUTF8String(tizenAppId));
+ DPL::FromUTF8String(id));
LogDebug("Get appid from pkgid : " << appid);
m_context.tzAppid = DPL::ToUTF8String(appid);
} else {
- m_context.tzAppid = tizenAppId;
- }
- WrtDB::WidgetDAOReadOnly dao(DPL::FromUTF8String(m_context.tzAppid));
- m_context.tzPkgid = DPL::ToUTF8String(dao.getTizenPkgId());
- m_context.locations = WidgetLocation(m_context.tzPkgid);
- m_context.locations->registerAppid(m_context.tzAppid);
-
- LogInfo("Widget model exists. App id : " << m_context.tzAppid);
-
- AddTask(new TaskSmack(m_context));
- AddTask(new TaskCheck(m_context));
-
- if (dao.getPackagingType() == PKG_TYPE_HYBRID_WEB_APP) {
- AddTask(new TaskUninstallOspsvc(m_context));
- }
- AddTask(new TaskRemoveFiles(m_context));
- AddTask(new TaskDbUpdate(m_context));
- AddTask(new TaskRemoveCustomHandlers(m_context));
- AddTask(new TaskDeleteCertificates(m_context));
-
- // send start signal of pkgmgr
- if (getInstallerStruct().pkgmgrInterface->setPkgname(m_context.tzPkgid))
- {
- getInstallerStruct().pkgmgrInterface->sendSignal(
- PKGMGR_START_KEY,
- PKGMGR_START_UNINSTALL);
+ pkgId = id.substr(0, PKGID_LENTH);
+ WrtDB::WidgetDAOReadOnly dao(DPL::FromUTF8String(id));
+ m_context.tzAppid = id;
}
} Catch(WidgetDAOReadOnly::Exception::WidgetNotExist) {
- AddTask(new UninstallerTaskFail(true));
- } Catch(WidgetDAOReadOnly::Exception::Base) {
- AddTask(new UninstallerTaskFail(false));
+ LogDebug("package id : " << pkgId);
+ m_context.tzPkgid = pkgId;
+ if (!pkgId.empty()) {
+ if(checkDirectoryExist(pkgId)) {
+ LogError("installed widget status is abnormal");
+ return WidgetStatus::ABNORMAL;
+ }
+ }
+ return WidgetStatus::NOT_INSTALLED;
}
+ return WidgetStatus::Ok;
}
std::string JobWidgetUninstall::getRemovedTizenId() const
// send progress signal of pkgmgr
std::ostringstream percent;
percent << static_cast<int>(GetProgressPercent());
- getInstallerStruct().pkgmgrInterface->sendSignal(
- PKGMGR_PROGRESS_KEY,
- percent.str());
LogDebug("Call widget uninstall progressCallback");
getInstallerStruct().progressCallback(
LogDebug("Call widget uninstall success finishedCallback");
getInstallerStruct().finishedCallback(getInstallerStruct().userParam,
getRemovedTizenId(),
- Exceptions::Success);
+ Jobs::Exceptions::Success);
}
void JobWidgetUninstall::SendFinishedFailure()
void JobWidgetUninstall::SaveExceptionData(const Jobs::JobExceptionBase &e)
{
- m_exceptionCaught = static_cast<Exceptions::Type>(e.getParam());
+ m_exceptionCaught = static_cast<Jobs::Exceptions::Type>(e.getParam());
m_exceptionMessage = e.GetMessage();
}
-
-bool JobWidgetUninstall::getExternalWidgetFlag() const
-{
- LogDebug("Get external widget");
- if (APP2EXT_SD_CARD ==
- app2ext_get_app_location(m_context.tzAppid.c_str()))
- {
- LogDebug("This widget is in external stroage");
- return true;
- }
- return false;
-}
} //namespace WidgetUninstall
} //namespace Jobs