Uninstall updates for csc preloaded app
[platform/framework/native/installer.git] / src / Manager / InstallerManager.cpp
index 1c42b91..6083af7 100755 (executable)
@@ -185,6 +185,7 @@ InstallerManager::Construct(const String& path, InstallerOperation operation, In
                        {
                                AppLog("INSTALLER_OPTION_CSC is detected.");
                                __pContext->__isCsc = true;
+                               __pContext->__cscInfo = *pOptionalData;
                        }
 
                        installerType = INSTALLER_TYPE_PACKAGE;
@@ -479,6 +480,7 @@ InstallerManager::ParseOptionalData(const String* pOptionalData)
 
                String storeClientId;
                String removable;
+               String path;
 
                while (pEnum->MoveNext() == E_SUCCESS)
                {
@@ -499,6 +501,11 @@ InstallerManager::ParseOptionalData(const String* pOptionalData)
                        {
                                removable = (*pValue);
                        }
+
+                       if (pKey->Equals(L"path", false) == true)
+                       {
+                               path = (*pValue);
+                       }
                }
 
                if (storeClientId.IsEmpty() == false)
@@ -512,6 +519,18 @@ InstallerManager::ParseOptionalData(const String* pOptionalData)
                        __pContext->__isUninstallable = true;
                        AppLog(" # removable = [true]");
                }
+
+               if (__pContext->__isCsc == true)
+               {
+                       if (path.IsEmpty() == false)
+                       {
+                               std::unique_ptr< PackageInfo > pPackageInfo(_PackageManagerImpl::GetInstance()->GetPackageInfoFromFileN(path));
+                               TryReturn(pPackageInfo, false, "GetPackageInfoFromFileN() failed. [%s]", GetErrorMessage(GetLastResult()));
+
+                               __pContext->__packageId = pPackageInfo->GetId();
+                               AppLog(" # packageId = [%ls]", __pContext->__packageId.GetPointer());
+                       }
+               }
        }
 
        return true;
@@ -940,16 +959,20 @@ InstallerManager::SendEvent(InstallationContext* pContext, const PackageId& pack
 }
 
 bool
-InstallerManager::IsUninstallUpdates(const PackageId& packageId, String& originPath)
+InstallerManager::IsUninstallUpdates(const PackageId& packageId, String& originPath, bool& isCscPackage)
 {
+       String cscInfo;
        String roXmlPath;
        roXmlPath.Format(1024, DIR_RO_PACKAGE_SYSTEM_MANIFEST, packageId.GetPointer());
+
        if (File::IsFileExist(roXmlPath) == true)
        {
                String rwXmlPath;
                rwXmlPath.Format(1024, DIR_RW_PACKAGE_SYSTEM_MANIFEST, packageId.GetPointer());
                if (File::IsFileExist(rwXmlPath) == true)
                {
+                       InstallerUtil::Remove(rwXmlPath);
+
                        String preloadedAppPath(PATH_USR_APPS);
                        preloadedAppPath += L"/";
                        preloadedAppPath += packageId;
@@ -960,12 +983,53 @@ InstallerManager::IsUninstallUpdates(const PackageId& packageId, String& originP
                        return true;
                }
        }
-       else
+       else if(InstallerUtil::IsCscPackage(packageId, cscInfo) == true)
        {
-               //if (CSC_preloaded && update)
-               //{
-               //      originPath = cscPackagePath;
-               //}
+               String tokenDelimiter(":");
+
+               std::unique_ptr< IMap > pMap(InstallerUtil::ParseN(cscInfo, tokenDelimiter));
+               TryReturn(pMap, false, "ParseN() failed. [%s]", GetErrorMessage(GetLastResult()));
+
+               std::unique_ptr< IMapEnumerator > pEnum(pMap->GetMapEnumeratorN());
+               TryReturn(pEnum, false, "GetMapEnumeratorN() failed. [%s]", GetErrorMessage(GetLastResult()));
+
+               String removable;
+               String path;
+
+               while (pEnum->MoveNext() == E_SUCCESS)
+               {
+                       String* pKey = static_cast< String* > (pEnum->GetKey());
+                       TryReturn(pEnum, false, "GetKey() failed. [%s]", GetErrorMessage(GetLastResult()));
+
+                       String* pValue = static_cast< String* > (pEnum->GetValue());
+                       TryReturn(pEnum, false, "GetValue() failed. [%s]", GetErrorMessage(GetLastResult()));
+
+                       AppLog("key = [%ls], value = [%ls]", pKey->GetPointer(), pValue->GetPointer());
+
+                       if (pKey->Equals(L"removable", false) == true)
+                       {
+                               removable = (*pValue);
+                       }
+
+                       if (pKey->Equals(L"path", false) == true)
+                       {
+                               path = (*pValue);
+                       }
+               }
+
+               if (removable.Equals(L"false", false) == true)
+               {
+                       isCscPackage = true;
+
+                       AppLog("uninstall updates for csc-preloaded app [%ls]", path.GetPointer());
+                       originPath = cscInfo;
+
+                       return true;
+               }
+               else
+               {
+                       AppLog("uninstall package for csc-preloaded app. [%ls]");
+               }
        }
 
        return false;
@@ -1356,7 +1420,7 @@ CATCH:
 }
 
 int
-InstallerManager::RequestCsc(const String& buffer, InstallerOption option)
+InstallerManager::RequestCsc(const String& buffer, InstallerOption option, void* pPkgmgrInstaller)
 {
        int errorType = 0;
 
@@ -1406,7 +1470,7 @@ InstallerManager::RequestCsc(const String& buffer, InstallerOption option)
 
        if (op.Equals(L"install", false) == true)
        {
-               errorType = InstallerManager::Request(path, INSTALLER_OPERATION_INSTALL, option, null, &buffer);
+               errorType = InstallerManager::Request(path, INSTALLER_OPERATION_INSTALL, option, pPkgmgrInstaller, &buffer);
        }
        else if (op.Equals(L"uninstall", false) == true)
        {