#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;
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;
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;
if (__state > STATE_DONE)
{
- AppLogTag(OSP_INSTALLER, "------------------------------------------");
- AppLogTag(OSP_INSTALLER, " UninstallStep - END");
- AppLogTag(OSP_INSTALLER, "------------------------------------------");
+ AppLog(" UninstallStep - END");
break;
}
}
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;
}
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;
}
{
InstallerError error = INSTALLER_ERROR_NONE;
+ InstallerUtil::TerminateApps(__pContext->__packageId);
+
GoNextState();
return error;
}
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");
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
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;