Modify the logic to support the virtual root
[platform/framework/native/installer.git] / src / Step / UninstallStep.cpp
index 27209e0..b5d5a48 100755 (executable)
 
 #include <unique_ptr.h>
 
+#include <app2ext_interface.h>
+
 #include <FIoDirectory.h>
 #include <FIo_FileImpl.h>
 #include <FBase_StringConverter.h>
-#include <FAppPkg_PackageManagerImpl.h>
 #include <FAppPkg_PackageInfoImpl.h>
-#include <FAppPkg_PackageAppInfoImpl.h>
 
 #include "InstallationContext.h"
 #include "UninstallStep.h"
 #include "InstallerUtil.h"
+#include "CompatibilityManager.h"
 
 using namespace Tizen::Base;
 using namespace Tizen::Base::Collection;
+using namespace Tizen::App;
 using namespace Tizen::App::Package;
 using namespace Tizen::Io;
 
@@ -51,9 +53,7 @@ InstallerError
 UninstallStep::Run(InstallationContext* pContext)
 {
        InstallerError error = INSTALLER_ERROR_NONE;
-       AppLogTag(OSP_INSTALLER, "------------------------------------------");
-       AppLogTag(OSP_INSTALLER, " UninstallStep - START");
-       AppLogTag(OSP_INSTALLER, "------------------------------------------");
+       AppLog(" UninstallStep - START");
 
        __pContext = pContext;
 
@@ -62,32 +62,32 @@ UninstallStep::Run(InstallationContext* pContext)
                switch (__state)
                {
                case STATE_GET_PACKAGEINFO:
-                       AppLogTag(OSP_INSTALLER, "[STATE_GET_PACKAGEINFO]");
+                       AppLog("[STATE_GET_PACKAGEINFO]");
                        error = OnStateGetPackageInfo();
                        break;
 
                case STATE_CHECK_APP_RUNNING:
-                       AppLogTag(OSP_INSTALLER, "[STATE_CHECK_APP_RUNNING]");
+                       AppLog("[STATE_CHECK_APP_RUNNING]");
                        error = OnStateCheckAppRunning();
                        break;
 
                case STATE_TERMINATE_APP:
-                       AppLogTag(OSP_INSTALLER, "[STATE_TERMINATE_APP]");
+                       AppLog("[STATE_TERMINATE_APP]");
                        error = OnStateTerminateApp();
                        break;
 
                case STATE_START_TIMER:
-                       AppLogTag(OSP_INSTALLER, "[STATE_START_TIMER]");
+                       AppLog("[STATE_START_TIMER]");
                        error = OnStateStartTimer();
                        break;
 
                case STATE_DELETE_DIR:
-                       AppLogTag(OSP_INSTALLER, "[STATE_DELETE_DIR]");
+                       AppLog("[STATE_DELETE_DIR]");
                        error = OnStateRemoveDir();
                        break;
 
                case STATE_DONE:
-                       AppLogTag(OSP_INSTALLER, "[STATE_DONE]");
+                       AppLog("[STATE_DONE]");
                        error = OnStateDone();
                        break;
 
@@ -102,9 +102,7 @@ UninstallStep::Run(InstallationContext* pContext)
 
                if (__state > STATE_DONE)
                {
-                       AppLogTag(OSP_INSTALLER, "------------------------------------------");
-                       AppLogTag(OSP_INSTALLER, " UninstallStep - END");
-                       AppLogTag(OSP_INSTALLER, "------------------------------------------");
+                       AppLog(" UninstallStep - END");
                        break;
                }
        }
@@ -122,18 +120,37 @@ InstallerError
 UninstallStep::OnStateGetPackageInfo(void)
 {
        InstallerError error = INSTALLER_ERROR_NONE;
-       String appId = __pContext->GetId();
+       PackageId packageId = __pContext->__packageId;
+
+       std::unique_ptr< _PackageInfoImpl > pPackageInfoImpl(new (std::nothrow) _PackageInfoImpl());
+       TryReturn(pPackageInfoImpl, INSTALLER_ERROR_OUT_OF_MEMORY, "pPackageInfoImpl is null.");
+
+       AppLog("package = %ls", packageId.GetPointer());
+
+       result r = pPackageInfoImpl->Construct(packageId);
+       TryReturn(r == E_SUCCESS, INSTALLER_ERROR_INTERNAL_STATE, "pPackageInfoImpl->Construct(%ls) failed.", packageId.GetPointer());
+
+//     bool isUninstallable = pPackageInfoImpl->IsUninstallable();
+//     if (isUninstallable == false)
+//     {
+//             __pContext->__additionalErrorString = L"Thrown when the application cannot be uninstalled because the application was preloaded.";
+//     }
+//     TryReturn(isUninstallable == true, INSTALLER_ERROR_PACKAGE_INVALID, "preload app cannot be uninstalled.");
 
-       _PackageInfoImpl* pPackageInfoImpl = __pContext->GetPackageInfoImpl();
-       TryReturn(pPackageInfoImpl, INSTALLER_ERROR_INTERNAL_STATE, "[osp-installer] pPackageInfoImpl is null");
+       String rwXmlPath;
+       rwXmlPath.Format(1024, DIR_RW_PACKAGE_SYSTEM_MANIFEST, packageId.GetPointer());
+       if (File::IsFileExist(rwXmlPath) == false)
+       {
+               AppLog("This is a preload app = [%ls]", rwXmlPath.GetPointer());
+               __pContext->__isPreloaded = true;
+       }
 
-       AppLogTag(OSP_INSTALLER, "appId = %S", appId.GetPointer());
-       pPackageInfoImpl->Construct(appId);
+       __pContext->__rootPath = pPackageInfoImpl->GetAppRootPath();
 
-       if (__pContext->IsHybridService() == true)
+       if (__pContext->__isHybridService == true)
        {
-               AppLogTag(OSP_INSTALLER, "Uninstallation for HybridService");
-               __state = STATE_DELETE_DIR;
+               AppLog("Uninstallation for HybridService");
+               __state = STATE_TERMINATE_APP;
                return error;
        }
 
@@ -142,34 +159,43 @@ UninstallStep::OnStateGetPackageInfo(void)
                int res = 0;
                app2ext_handle* pHandle = null;
 
-               std::unique_ptr<char[]> pAppId(_StringConverter::CopyToCharArrayN(appId));
-               TryReturn(pAppId, INSTALLER_ERROR_INTERNAL_STATE, "[osp-installer] pAppId is null");
+               std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(packageId));
+               TryReturn(pPackageId, INSTALLER_ERROR_INTERNAL_STATE, "pAppId is null");
 
                pHandle = app2ext_init(APP2EXT_SD_CARD);
-               TryReturn(pHandle, INSTALLER_ERROR_INTERNAL_STATE, "[osp-installer] app2ext_init() failed");
+               TryReturn(pHandle, INSTALLER_ERROR_INTERNAL_STATE, "app2ext_init() failed");
 
-               res = pHandle->interface.pre_uninstall(pAppId.get());
-               TryReturn(res == 0, INSTALLER_ERROR_INTERNAL_STATE, "[osp-installer] pHandle->interface.pre_uninstall() failed [%d]", res);
+               res = pHandle->interface.pre_uninstall(pPackageId.get());
+               TryReturn(res == 0, INSTALLER_ERROR_INTERNAL_STATE, "pHandle->interface.pre_uninstall() failed [%d]", res);
 
-               __pContext->SetApp2ExtHandle(pHandle);
+               __pContext->__pApp2ExtHandle = (void*)pHandle;
 
-               AppLogTag(OSP_INSTALLER, "[app2sd] pre_uninstall(%s)", pAppId.get());
+               AppLog("[app2sd] pre_uninstall(%s)", pPackageId.get());
        }
 
        ArrayList* pList = pPackageInfoImpl->GetAppInfoListN();
-       TryReturn(pList, INSTALLER_ERROR_DATABASE, "[osp-installer] pList is null.");
+       TryReturn(pList, INSTALLER_ERROR_DATABASE, "pList is null.");
 
        for (int i = 0; i < pList->GetCount(); i++)
        {
                _PackageAppInfoImpl* pAppInfoImpl = dynamic_cast<_PackageAppInfoImpl*>(pList->GetAt(i));
                if (pAppInfoImpl)
                {
-                       pPackageInfoImpl->AddAppInfo(*pAppInfoImpl);
-                       pAppInfoImpl = null;
+                       AppData* pAppData = new (std::nothrow) AppData;
+                       TryReturn(pAppData, INSTALLER_ERROR_OUT_OF_MEMORY, "pAppData is null");
+
+                       error = pAppData->Construct();
+                       TryReturn(error == INSTALLER_ERROR_NONE, INSTALLER_ERROR_INTERNAL_STATE, "pAppData->Construct() failed.");
+
+                       pAppData->__appId = pAppInfoImpl->GetPackageName();
+                       pAppData->__feature = pAppInfoImpl->GetAppFeature();
+
+                       __pContext->__pAppDataList->Add(pAppData);
                }
        }
+       delete pList;
 
-       __state = STATE_DELETE_DIR;
+       __state = STATE_TERMINATE_APP;
 
        return error;
 }
@@ -189,6 +215,8 @@ UninstallStep::OnStateTerminateApp(void)
 {
        InstallerError error = INSTALLER_ERROR_NONE;
 
+       InstallerUtil::TerminateApps(__pContext->__packageId);
+
        GoNextState();
        return error;
 }
@@ -206,13 +234,11 @@ InstallerError
 UninstallStep::OnStateRemoveDir(void)
 {
        InstallerError error = INSTALLER_ERROR_NONE;
-
-       _PackageInfoImpl* pPackageInfoImpl = __pContext->GetPackageInfoImpl();
-       TryReturn(pPackageInfoImpl, INSTALLER_ERROR_INTERNAL_STATE, "[osp-installer] pPackageInfoImpl is null");
+       bool res = true;
 
        String rootPath;
-       rootPath = pPackageInfoImpl->GetAppRootPath();
-       AppLogTag(OSP_INSTALLER, "rootPath[%ls]", rootPath.GetPointer());
+       rootPath = __pContext->__rootPath;
+       AppLog("rootPath = [%ls]", rootPath.GetPointer());
 
        String compatPath(rootPath);
        compatPath.Append(L"/info/compat.info");
@@ -220,24 +246,33 @@ UninstallStep::OnStateRemoveDir(void)
        result r = GetLastResult();
        if (r == E_SUCCESS && ospCompat == true)
        {
-               if (_FileImpl::FinalizeDataCaging(rootPath) == false)
+               if (CompatibilityManager::FinalizeDataCaging(rootPath) == false)
                {
-                       AppLogTag(OSP_INSTALLER, "[Tizen::Io] Failed to unmount directories for 2.0 application, appRootPath: %ls",
+                       AppLog("[Tizen::Io] Failed to unmount directories for 2.0 application, appRootPath: %ls",
                                        rootPath.GetPointer());
                        return INSTALLER_ERROR_UNMOUNT_FAILED;
                }
        }
        else if (r != E_SUCCESS)
        {
-               AppLogTag(OSP_INSTALLER, "[Tizen::Io] Failed to access %ls", compatPath.GetPointer());
+               AppLog("[Tizen::Io] Failed to access %ls", compatPath.GetPointer());
                return INSTALLER_ERROR_UNMOUNT_FAILED;
        }
 
-       AppLogTag(OSP_INSTALLER, "Directory::Remove - START");
+       CompatibilityManager::CleanDirectories(rootPath, __pContext->__packageId);
+
+       String virtualRoot = rootPath + DIR_VIRTUAL_ROOT;
+       if (File::IsFileExist(virtualRoot) == true)
+       {
+               res = CompatibilityManager::FinalizeVirtualRoot(rootPath, __pContext->__packageId);
+               TryReturn(res == true, INSTALLER_ERROR_UNMOUNT_FAILED, "CompatibilityManager::FinalizeVirtualRoot(%ls) failed.", rootPath.GetPointer());
+       }
+
+       AppLog("Directory::Remove - START");
 
-       if (__pContext->IsHybridService() == true)
+       if (__pContext->__isHybridService == true)
        {
-               AppLogTag(OSP_INSTALLER, "Uninstallation for HybridService - skip Remove");
+               AppLog("Uninstallation for HybridService - skip Remove");
 
        }
        else
@@ -254,29 +289,27 @@ UninstallStep::OnStateRemoveDir(void)
                InstallerUtil::Remove(rootPath);
        }
 
-       _PackageAppInfoImpl* pAppInfoImpl = null;
-       ArrayList* pAppList = null;
+       IListT<AppData*>* pAppDataList = __pContext->__pAppDataList;
+       TryReturn(pAppDataList, INSTALLER_ERROR_INTERNAL_STATE, "pAppDataList is null");
 
-       pAppList = pPackageInfoImpl->GetAppInfoList();
-       for (int i = 0 ; i < pAppList->GetCount(); i++)
+       int count = pAppDataList->GetCount();
+       for (int i = 0; i < count; i++)
        {
-               pAppInfoImpl = dynamic_cast<_PackageAppInfoImpl*>(pAppList->GetAt(i));
-               if (pAppInfoImpl)
-               {
-                       String packageName = pAppInfoImpl->GetPackageName();
-                       String destPath;
-                       destPath.Format(1024, L"%S/%S", SLP_APP_PATH, packageName.GetPointer());
-                       InstallerUtil::Remove(destPath);
+               AppData* pAppData = null;
+               pAppDataList->GetAt(i, pAppData);
 
-                       if (pAppInfoImpl->GetAppFeature() == CATEGORY_TYPE_IME)
+               if (pAppData)
+               {
+                       if (pAppData->__feature == CATEGORY_TYPE_IME)
                        {
                                String symlinkPath;
-                               symlinkPath.Format(1024, L"%s/%ls.so", IME_PATH, packageName.GetPointer());
+                               symlinkPath.Format(1024, L"%s/%ls.so", IME_PATH, pAppData->__appId.GetPointer());
                                InstallerUtil::Remove(symlinkPath);
                        }
                }
        }
-       AppLogTag(OSP_INSTALLER, "Directory::Remove - END");
+
+       AppLog("Directory::Remove - END");
 
        GoNextState();
        return error;