Fixed can not install to sdcard
[framework/web/wrt-installer.git] / src / jobs / widget_uninstall / job_widget_uninstall.cpp
index 13c336b..4dc7745 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #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>
@@ -24,6 +25,7 @@
 #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>
 
@@ -31,6 +33,21 @@ using namespace WrtDB;
 
 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>
 {
@@ -69,57 +86,89 @@ JobWidgetUninstall::JobWidgetUninstall(
     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(&regx, 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(&regx, REG_TIZEN_PKGID_PATTERN, REG_NOSUB | REG_EXTENDED)!=0){
+        LogDebug("Regcomp failed");
+    }
+    std::string pkgId;
 
-        if ((regexec(&regx, tizenAppId.c_str(),
+    Try {
+        if ((regexec(&regx, 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
@@ -147,9 +196,6 @@ void JobWidgetUninstall::SendProgress()
             // 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(
@@ -170,7 +216,7 @@ void JobWidgetUninstall::SendFinishedSuccess()
     LogDebug("Call widget uninstall success finishedCallback");
     getInstallerStruct().finishedCallback(getInstallerStruct().userParam,
                                           getRemovedTizenId(),
-                                          Exceptions::Success);
+                                          Jobs::Exceptions::Success);
 }
 
 void JobWidgetUninstall::SendFinishedFailure()
@@ -193,20 +239,8 @@ 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