WidgetHandle removal - part 2. Task order change
[framework/web/wrt-installer.git] / src / jobs / widget_uninstall / job_widget_uninstall.cpp
index 8c1c5b8..0bfc879 100644 (file)
  *    See the License for the specific language governing permissions and
  *    limitations under the License.
  */
+
 #include <widget_uninstall/job_widget_uninstall.h>
+#include <widget_uninstall/widget_uninstall_errors.h>
 #include <widget_uninstall/task_check.h>
 #include <widget_uninstall/task_db_update.h>
 #include <widget_uninstall/task_remove_files.h>
 #include <widget_uninstall/task_smack.h>
+#include <widget_uninstall/task_uninstall_ospsvc.h>
+#include <widget_uninstall/task_delete_certificates.h>
+#include <pkg-manager/pkgmgr_signal.h>
 
 using namespace WrtDB;
 
+namespace { //anonymous
+class UninstallerTaskFail :
+    public DPL::TaskDecl<UninstallerTaskFail>
+{
+  private:
+    bool m_uninstalled;
+
+    void StepFail()
+    {
+        if(m_uninstalled) {
+            ThrowMsg(Jobs::WidgetUninstall::Exceptions::WidgetNotExist,
+                    "Widget does not exist");
+        } else {
+            Throw(Jobs::WidgetUninstall::Exceptions::Base);
+        }
+    }
+
+  public:
+    UninstallerTaskFail(bool uninstalled) :
+        DPL::TaskDecl<UninstallerTaskFail>(this),
+        m_uninstalled(uninstalled)
+    {
+        AddStep(&UninstallerTaskFail::StepFail);
+    }
+};
+}
+
 namespace Jobs {
 namespace WidgetUninstall {
-JobWidgetUninstall::JobWidgetUninstall(WidgetHandle widgetHandle,
+JobWidgetUninstall::JobWidgetUninstall(const std::string & widgetPkgName,
         const WidgetUninstallationStruct &uninstallerStruct) :
     Job(Uninstallation),
     JobContextBase<WidgetUninstallationStruct>(uninstallerStruct)
 {
-    WidgetDAO dao(widgetHandle);
-
-    m_context.widgetHandle = widgetHandle;
+    using namespace PackageManager;
     m_context.removeStarted = false;
     m_context.removeFinished = false;
     m_context.uninstallStep = UninstallerContext::UNINSTALL_START;
     m_context.job = this;
+    m_context.pkgname = widgetPkgName;
 
-    AddTask(new TaskSmack(m_context));
-    AddTask(new TaskCheck(m_context));
-    AddTask(new TaskRemoveFiles(m_context));
-    AddTask(new TaskDbUpdate(m_context));
+    Try
+    {
+        WrtDB::WidgetDAOReadOnly dao(DPL::FromUTF8String(widgetPkgName));
+        m_context.locations = WidgetLocation(m_context.pkgname);
+
+        LogInfo("Widget model exists. Pkg name: " << m_context.pkgname);
+
+        AddTask(new TaskSmack(m_context));
+        AddTask(new TaskCheck(m_context));
+
+        if (dao.getPkgType() == PKG_TYPE_TIZEN_WITHSVCAPP) {
+            AddTask(new TaskUninstallOspsvc(m_context));
+        }
+        AddTask(new TaskRemoveFiles(m_context));
+        AddTask(new TaskDbUpdate(m_context));
+        AddTask(new TaskDeleteCertificates(m_context));
+
+        // send start signal of pkgmgr
+        if (PkgmgrSignalSingleton::Instance().setPkgname(m_context.pkgname)) {
+            PkgmgrSignalSingleton::Instance().sendSignal(
+                    PKGMGR_START_KEY,
+                    PKGMGR_START_UNINSTALL);
+        }
+    } Catch (WidgetDAOReadOnly::Exception::WidgetNotExist) {
+        AddTask(new UninstallerTaskFail(true));
+    } Catch (WidgetDAOReadOnly::Exception::Base) {
+        AddTask(new UninstallerTaskFail(false));
+    }
 }
 
-WidgetHandle JobWidgetUninstall::getRemovedWidgetHandle() const
+std::string JobWidgetUninstall::getRemovedTizenId() const
 {
-    return m_context.widgetHandle;
+    return m_context.pkgname;
 }
 
 bool JobWidgetUninstall::getRemoveStartedFlag() const
@@ -59,9 +114,17 @@ bool JobWidgetUninstall::getRemoveFinishedFlag() const
 
 void JobWidgetUninstall::SendProgress()
 {
+    using namespace PackageManager;
     if (!getRemoveStartedFlag() ||
         (getRemoveStartedFlag() && getRemoveFinishedFlag())) {
         if (NULL != getInstallerStruct().progressCallback) {
+            // send progress signal of pkgmgr
+            std::ostringstream percent;
+            percent << static_cast<int>(GetProgressPercent());
+            PkgmgrSignalSingleton::Instance().sendSignal(
+                        PKGMGR_PROGRESS_KEY,
+                        percent.str());
+
             LogDebug("Call widget uninstall progressCallback");
             getInstallerStruct().progressCallback(
                     getInstallerStruct().userParam,
@@ -72,19 +135,31 @@ void JobWidgetUninstall::SendProgress()
 
 void JobWidgetUninstall::SendFinishedSuccess()
 {
+    using namespace PackageManager;
+    // send signal of pkgmgr
+    PkgmgrSignalSingleton::Instance().sendSignal(
+                PKGMGR_END_KEY,
+                PKGMGR_END_SUCCESS);
+
     LogDebug("Call widget uninstall success finishedCallback");
     getInstallerStruct().finishedCallback(getInstallerStruct().userParam,
-            getRemovedWidgetHandle(),Exceptions::Success);
+            getRemovedTizenId(),Exceptions::Success);
 }
 
 void JobWidgetUninstall::SendFinishedFailure()
 {
+    using namespace PackageManager;
     LogError("Error in uninstallation step: " << m_exceptionCaught);
     LogError("Message: " << m_exceptionMessage);
 
+    // send signal of pkgmgr
+    PkgmgrSignalSingleton::Instance().sendSignal(
+                PKGMGR_END_KEY,
+                PKGMGR_END_FAILURE);
+
     LogDebug("Call widget uninstall failure finishedCallback");
     getInstallerStruct().finishedCallback(getInstallerStruct().userParam,
-        getRemovedWidgetHandle(), m_exceptionCaught); //TODO
+            getRemovedTizenId(), m_exceptionCaught); //TODO
     LogDebug("[JobWidgetUninstall] Asynchronous failure callback status sent");
 }