Sync to the latest code
authorDuyoung Jang <duyoung.jang@samsung.com>
Mon, 5 Aug 2013 01:50:03 +0000 (10:50 +0900)
committerDuyoung Jang <duyoung.jang@samsung.com>
Mon, 5 Aug 2013 01:50:03 +0000 (10:50 +0900)
Change-Id: I0907dd6250ee51690baac21583305165f003f3cd
Signed-off-by: Duyoung Jang <duyoung.jang@samsung.com>
src/Installer/Installer.cpp
src/Manager/ConfigurationManager.cpp
src/Manager/ConfigurationManager.h
src/Manager/DatabaseManager.cpp
src/Manager/DatabaseManager.h
src/Manager/SmackManager.cpp
src/Manager/SmackManager.h
src/Step/SystemCheckStep.cpp
src/Step/SystemCheckStep.h
src/backend/backend.cpp

index 34c286c..5f7f99c 100755 (executable)
@@ -112,12 +112,12 @@ Installer::OnRegister(void)
 
        if (operation == INSTALLER_OPERATION_INSTALL)
        {
-               databaseManager.UnregisterPackageInfo(pContext);
+               databaseManager.UnregisterPackageInfo(pContext->__packageId);
                databaseManager.RegisterPackageInfo(pContext);
        }
        else
        {
-               databaseManager.UnregisterPackageInfo(pContext);
+               databaseManager.UnregisterPackageInfo(pContext->__packageId);
        }
        AppLog("Installer::OnRegister() - END");
        AppLog("------------------------------------------");
index ba37508..4932df1 100755 (executable)
@@ -37,6 +37,7 @@
 #include <FBase_StringConverter.h>
 
 #include "ConfigurationManager.h"
+#include "DatabaseManager.h"
 #include "ManifestGenerator.h"
 #include "InstallerUtil.h"
 #include "SmackManager.h"
@@ -285,21 +286,33 @@ ConfigurationManager::RemoveFile(InstallationContext* pContext)
 bool
 ConfigurationManager::PostInstall(InstallationContext* pContext, bool error) const
 {
-       app2ext_handle* pHandle = (app2ext_handle*)pContext->__pApp2ExtHandle;
-
        PackageId packageId = pContext->__packageId;
        std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(packageId));
        TryReturn(pPackageId, false, "pPackageId is null.");
 
        if (error == false)
        {
-               RegisterCoreXmlFile(pContext);
-
                SmackManager smackManager;
                smackManager.Construct(pContext);
                smackManager.EnablePermissions(packageId);
+
+               RegisterCoreXmlFile(pContext);
+
+               if ((pContext->__isUpdated == true) && (pContext->__isPreloaded == false))
+               {
+                       CopyData(pContext);
+                       RemoveBackup(pContext);
+               }
+       }
+       else
+       {
+               if ((pContext->__isUpdated == true) && (pContext->__isPreloaded == false))
+               {
+                       RestoreBackup(pContext);
+               }
        }
 
+       app2ext_handle* pHandle = (app2ext_handle*)pContext->__pApp2ExtHandle;
        if (pHandle)
        {
                if (error == true)
@@ -344,6 +357,234 @@ ConfigurationManager::PostUninstall(InstallationContext* pContext) const
 }
 
 bool
+ConfigurationManager::CreateBackup(InstallationContext* pContext) const
+{
+       TryReturn(pContext, false, "pContext is null.");
+       TryReturn(pContext->__packageId.IsEmpty() == false, false, "packageId is empty.");
+
+       if (pContext->__isHybridService == true)
+       {
+               return true;
+       }
+
+       bool res = true;
+       result r = E_SUCCESS;
+       PackageId packageId = pContext->__packageId;
+       String rootPath;
+
+       rootPath += PATH_OPT_USR_APPS;
+       rootPath += L"/";
+       rootPath += packageId;
+       TryReturn(File::IsFileExist(rootPath) == true, false, "rootPath[%ls] is not found.", rootPath.GetPointer());
+
+       String backupPath = rootPath + BACKUP_NAME_RULE;
+       if (File::IsFileExist(backupPath) == true)
+       {
+               InstallerUtil::Remove(backupPath);
+       }
+
+       // folder
+       r = Directory::Rename(rootPath, backupPath);
+       TryReturn(r == E_SUCCESS, false, "Directory::Rename(%ls, %ls) failed.", rootPath.GetPointer(), backupPath.GetPointer());
+
+       AppLog("[%ls] -> [%ls] is renamed.", rootPath.GetPointer(), backupPath.GetPointer());
+
+       // database
+       DatabaseManager databaseManager;
+       res = databaseManager.BackupPackageInfo(pContext);
+       TryReturn(res == true, false, "databaseManager.BackupPackageInfo() failed.");
+
+       // core xml
+       String rwXmlPath;
+       rwXmlPath.Format(1024, DIR_RW_PACKAGE_SYSTEM_MANIFEST, packageId.GetPointer());
+
+       if (File::IsFileExist(rwXmlPath) == true)
+       {
+               String backupXmlPath = rwXmlPath + BACKUP_NAME_RULE;
+               if (File::IsFileExist(backupXmlPath) == true)
+               {
+                       InstallerUtil::Remove(backupXmlPath);
+               }
+
+               result r = File::Move(rwXmlPath, backupXmlPath);
+               TryReturn(r == E_SUCCESS, false, "File::Move(%ls, %ls) failed.", rwXmlPath.GetPointer(), backupXmlPath.GetPointer());
+
+               AppLog("[%ls] -> [%ls] is renamed.", rwXmlPath.GetPointer(), backupXmlPath.GetPointer());
+       }
+       else
+       {
+               AppLog("It's updated from preloaded to downloaded, need not to backup xml file. [%ls]", packageId.GetPointer());
+       }
+
+       return true;
+}
+
+bool
+ConfigurationManager::RemoveBackup(InstallationContext* pContext) const
+{
+       TryReturn(pContext, false, "pContext is null.");
+       TryReturn(pContext->__packageId.IsEmpty() == false, false, "packageId is empty.");
+
+       if (pContext->__isHybridService == true)
+       {
+               return true;
+       }
+
+       PackageId packageId = pContext->__packageId;
+       bool res = true;
+       String backupPath;
+
+       backupPath += PATH_OPT_USR_APPS;
+       backupPath += L"/";
+       backupPath += packageId;
+       backupPath += BACKUP_NAME_RULE;
+       TryReturn(File::IsFileExist(backupPath) == true, false, "backupPath[%ls] is not found.", backupPath.GetPointer());
+
+       // folder
+       InstallerUtil::Remove(backupPath);
+       AppLog("[%ls] is removed.", backupPath.GetPointer());
+
+       // database
+       DatabaseManager databaseManager;
+       res = databaseManager.UnregisterPackageInfo(packageId, true);
+       TryReturn(res == true, false, "databaseManager.UnregisterPackageInfo() failed.");
+
+       // core xml
+       String backupXmlPath;
+       backupXmlPath.Format(1024, DIR_RW_PACKAGE_SYSTEM_MANIFEST, packageId.GetPointer());
+       backupXmlPath += BACKUP_NAME_RULE;
+
+       if (File::IsFileExist(backupXmlPath) == true)
+       {
+               InstallerUtil::Remove(backupXmlPath);
+       }
+       else
+       {
+               AppLog("It's updated from preloaded to downloaded, There is no backup xml file. [%ls]", packageId.GetPointer());
+       }
+
+       return true;
+}
+
+bool
+ConfigurationManager::RestoreBackup(InstallationContext* pContext) const
+{
+       TryReturn(pContext, false, "pContext is null.");
+       TryReturn(pContext->__packageId.IsEmpty() == false, false, "packageId is empty.");
+
+       if (pContext->__isHybridService == true)
+       {
+               return true;
+       }
+
+       bool res = true;
+       result r = E_SUCCESS;
+       PackageId packageId = pContext->__packageId;
+       String rootPath;
+       String backupPath;
+
+       rootPath += PATH_OPT_USR_APPS;
+       rootPath += L"/";
+       rootPath += packageId;
+
+       if (File::IsFileExist(rootPath) == true)
+       {
+               InstallerUtil::Remove(rootPath);
+       }
+
+       backupPath = rootPath + BACKUP_NAME_RULE;
+       TryReturn(File::IsFileExist(backupPath) == true, false, "backupPath[%ls] is not found.", backupPath.GetPointer());
+
+       // folder
+       r = Directory::Rename(backupPath, rootPath);
+       TryReturn(r == E_SUCCESS, false, "Directory::Rename(%ls, %ls) failed.", backupPath.GetPointer(), rootPath.GetPointer());
+
+       AppLog("[%ls] -> [%ls] is renamed.", backupPath.GetPointer(), rootPath.GetPointer());
+
+       // database
+       DatabaseManager databaseManager;
+       res = databaseManager.RestorePackageInfo(pContext);
+       TryReturn(res == true, false, "databaseManager.RestorePackageInfo() failed.");
+
+       // core xml
+       String rwXmlPath;
+       rwXmlPath.Format(1024, DIR_RW_PACKAGE_SYSTEM_MANIFEST, packageId.GetPointer());
+
+       String backupXmlPath = rwXmlPath + BACKUP_NAME_RULE;
+       if (File::IsFileExist(backupXmlPath) == true)
+       {
+               if (File::IsFileExist(rwXmlPath) == true)
+               {
+                       InstallerUtil::Remove(rwXmlPath);
+               }
+
+               result r = File::Move(backupXmlPath, rwXmlPath);
+               TryReturn(r == E_SUCCESS, false, "File::Move(%ls, %ls) failed.", backupXmlPath.GetPointer(), rwXmlPath.GetPointer());
+
+               AppLog("[%ls] -> [%ls] is renamed.", backupXmlPath.GetPointer(), rwXmlPath.GetPointer());
+       }
+
+       return true;
+}
+
+bool
+ConfigurationManager::CopyData(InstallationContext* pContext) const
+{
+       TryReturn(pContext, false, "pContext is null.");
+       TryReturn(pContext->__packageId.IsEmpty() == false, false, "packageId is empty.");
+
+       if (pContext->__isHybridService == true)
+       {
+               return true;
+       }
+
+       SmackManager smackManager;
+       smackManager.Construct(pContext);
+
+       PackageId packageId = pContext->__packageId;
+       String srcPath;
+       String destPath;
+       String rootPath;
+       String backupPath;
+
+       rootPath += PATH_OPT_USR_APPS;
+       rootPath += L"/";
+       rootPath += packageId;
+
+       backupPath = rootPath + BACKUP_NAME_RULE;
+
+       // data
+       srcPath = backupPath + DIR_DATA;
+       destPath = rootPath + DIR_DATA;
+       InstallerUtil::CopyDirectory(srcPath, destPath);
+       InstallerUtil::ChangeDirectoryPermission(destPath, PERM_BASE, true);
+       smackManager.SetupPath(packageId, destPath, SMACK_DIR_TYPE_PRIVATE);
+
+       // setting
+       srcPath = backupPath + DIR_SETTING;
+       destPath = rootPath + DIR_SETTING;
+       InstallerUtil::CopyDirectory(srcPath, destPath);
+       InstallerUtil::ChangeDirectoryPermission(destPath, PERM_BASE | PERM_WRITE, false);
+       smackManager.SetupPath(packageId, destPath, SMACK_DIR_TYPE_SETTINGS_RW);
+
+       // shared/data
+       srcPath = backupPath + DIR_SHARED_DATA;
+       destPath = rootPath + DIR_SHARED_DATA;
+       InstallerUtil::CopyDirectory(srcPath, destPath);
+       InstallerUtil::ChangeDirectoryPermission(destPath, PERM_BASE, true);
+       smackManager.SetupPath(packageId, destPath, SMACK_DIR_TYPE_PUBLIC_RO);
+
+       // shared/trust
+       srcPath = backupPath + DIR_SHARED_TRUSTED;
+       destPath = rootPath + DIR_SHARED_TRUSTED;
+       InstallerUtil::CopyDirectory(srcPath, destPath);
+       InstallerUtil::ChangeDirectoryPermission(destPath, PERM_BASE, true);
+       smackManager.SetupPath(packageId, destPath, SMACK_DIR_TYPE_GROUP_RW);
+
+       return true;
+}
+
+bool
 ConfigurationManager::CreateCoreXmlFile(InstallationContext* pContext) const
 {
        AppLog("------------------------------------------");
index 95d9e53..2156d97 100755 (executable)
@@ -45,6 +45,8 @@ public:
        bool PostInstall(InstallationContext* pContext, bool error) const;
        bool PostUninstall(InstallationContext* pContext) const;
 
+       bool CreateBackup(InstallationContext* pContext) const;
+
 private:
        bool CreateCoreXmlFile(InstallationContext* pContext) const;
        bool RegisterCoreXmlFile(InstallationContext* pContext) const;
@@ -66,6 +68,10 @@ private:
 
        bool CreateAppInfoFile(AppData* pAppData, const Tizen::Base::String& rootPath) const;
 
+       bool RemoveBackup(InstallationContext* pContext) const;
+       bool RestoreBackup(InstallationContext* pContext) const;
+       bool CopyData(InstallationContext* pContext) const;
+
 }; // ConfigurationManager
 
 #endif // _CONFIGURATION_MANAGER_H_
index c6121fc..32f6f48 100755 (executable)
@@ -281,8 +281,8 @@ DatabaseManager::RegisterAppInfoList(InstallationContext* pContext, Database& db
 bool
 DatabaseManager::RegisterLaunchConditionList(AppData* pAppData, Database& db) const
 {
-       TryReturn(pAppData, E_SYSTEM, "pAppData is null.");
-       TryReturn(pAppData->__pLaunchConditionList, E_SYSTEM, "__pLaunchConditionList is null.");
+       TryReturn(pAppData, false, "pAppData is null.");
+       TryReturn(pAppData->__pLaunchConditionList, false, "__pLaunchConditionList is null.");
 
        result r = E_SUCCESS;
        MultiHashMap* pList = pAppData->__pLaunchConditionList;
@@ -326,8 +326,8 @@ DatabaseManager::RegisterLaunchConditionList(AppData* pAppData, Database& db) co
 bool
 DatabaseManager::RegisterAppFeatureList(AppData* pAppData, Database& db) const
 {
-       TryReturn(pAppData, E_SYSTEM, "pAppData is null.");
-       TryReturn(pAppData->__pFeatureList, E_SYSTEM, "__pFeatureList is null.");
+       TryReturn(pAppData, false, "pAppData is null.");
+       TryReturn(pAppData->__pFeatureList, false, "__pFeatureList is null.");
 
        result r = E_SUCCESS;
        HashMap* pList = pAppData->__pFeatureList;
@@ -371,8 +371,8 @@ DatabaseManager::RegisterAppFeatureList(AppData* pAppData, Database& db) const
 bool
 DatabaseManager::RegisterDataControlList(AppData* pAppData, Database& db) const
 {
-       TryReturn(pAppData, E_SYSTEM, "pAppData is null.");
-       TryReturn(pAppData->__pDataControlList, E_SYSTEM, "__pDataControlList is null.");
+       TryReturn(pAppData, false, "pAppData is null.");
+       TryReturn(pAppData->__pDataControlList, false, "__pDataControlList is null.");
 
        result r = E_SUCCESS;
 
@@ -431,11 +431,20 @@ DatabaseManager::RegisterDataControlList(AppData* pAppData, Database& db) const
 }
 
 bool
-DatabaseManager::UnregisterPackageInfo(InstallationContext* pContext) const
+DatabaseManager::UnregisterPackageInfo(const PackageId& uniquePackageId, bool backup) const
 {
        Database db;
        String query;
-       PackageId packageId = pContext->__packageId;
+       PackageId packageId;
+
+       if (backup == false)
+       {
+               packageId = uniquePackageId;
+       }
+       else
+       {
+               packageId = uniquePackageId + BACKUP_NAME_RULE;
+       }
 
        result r = db.Construct(L"/opt/usr/dbspace/.app-package.db", "r+");
        TryReturn(r == E_SUCCESS, false, "db.Construct failed. [%s]", GetErrorMessage(r));
@@ -515,6 +524,136 @@ DatabaseManager::UnregisterPackageInfo(InstallationContext* pContext) const
        }
        query.Clear();
 
+       AppLog("Remove PackageInfo[%ls] in db", packageId.GetPointer());
+
+       return true;
+}
+
+bool
+DatabaseManager::BackupPackageInfo(InstallationContext* pContext) const
+{
+       TryReturn(pContext, false, "pContext is null.");
+       TryReturn(pContext->__packageId.IsEmpty() == false, false, "packageId is empty.");
+
+       result r = E_SUCCESS;
+       PackageId packageId = pContext->__packageId;
+       Database db;
+       String query;
+       String backupId = packageId + BACKUP_NAME_RULE;
+
+       r = db.Construct(L"/opt/usr/dbspace/.app-package.db", "r+");
+       TryReturn(r == E_SUCCESS, false, "db.Construct failed. [%s]", GetErrorMessage(r));
+
+       query.Format(1024, L"UPDATE PkgInfo SET PKG_ID = '%ls' WHERE PKG_ID = '%ls'", backupId.GetPointer(), packageId.GetPointer());
+
+       std::unique_ptr< DbStatement > pStmt(_PackageManagerImpl::CreateStatementN(db, query));
+       TryReturn(pStmt, false, "CreateStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
+
+       std::unique_ptr< DbEnumerator > pEnum(_PackageManagerImpl::ExecuteStatementN(db, pStmt.get()));
+       TryReturn(!IsFailed(GetLastResult()), false, "ExecuteStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
+
+       AppLog("Backup PackageInfo[%ls] in db", backupId.GetPointer());
+
+       return BackupAppInfoList(pContext, db);
+}
+
+bool
+DatabaseManager::BackupAppInfoList(InstallationContext* pContext, Database& db) const
+{
+       TryReturn(pContext, false, "pContext is null.");
+
+       String query;
+
+       IListT<AppData*>* pAppDataList = pContext->__pAppDataList;
+       TryReturn(pAppDataList, false, "pAppDataList is null.");
+
+       int count = pAppDataList->GetCount();
+
+       for (int i = 0; i < count; i++)
+       {
+               AppData* pAppData = null;
+               pAppDataList->GetAt(i, pAppData);
+
+               if (pAppData)
+               {
+                       AppId backupAppId = pAppData->__appId + BACKUP_NAME_RULE;
+                       query.Format(1024, L"UPDATE AppInfo SET PACKAGE_NAME = '%ls' WHERE PACKAGE_NAME = '%ls'", backupAppId.GetPointer(), pAppData->__appId.GetPointer());
+
+                       std::unique_ptr< DbStatement > pStmt(_PackageManagerImpl::CreateStatementN(db, query));
+                       TryReturn(pStmt, false, "CreateStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
+
+                       std::unique_ptr< DbEnumerator > pEnum(_PackageManagerImpl::ExecuteStatementN(db, pStmt.get()));
+                       TryReturn(!IsFailed(GetLastResult()), false, "ExecuteStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
+
+                       AppLog("Backup AppInfo[%ls] in db", backupAppId.GetPointer());
+               }
+       }
+
+       return true;
+}
+
+bool
+DatabaseManager::RestorePackageInfo(InstallationContext* pContext) const
+{
+       TryReturn(pContext, false, "pContext is null.");
+       TryReturn(pContext->__packageId.IsEmpty() == false, false, "packageId is empty.");
+
+       result r = E_SUCCESS;
+       PackageId packageId = pContext->__packageId;
+       Database db;
+       String query;
+       String backupId = packageId + BACKUP_NAME_RULE;
+
+       UnregisterPackageInfo(packageId);
+
+       r = db.Construct(L"/opt/usr/dbspace/.app-package.db", "r+");
+       TryReturn(r == E_SUCCESS, false, "db.Construct failed. [%s]", GetErrorMessage(r));
+
+       query.Format(1024, L"UPDATE PkgInfo SET PKG_ID = '%ls' WHERE PKG_ID = '%ls'", packageId.GetPointer(), backupId.GetPointer());
+
+       std::unique_ptr< DbStatement > pStmt(_PackageManagerImpl::CreateStatementN(db, query));
+       TryReturn(pStmt, false, "CreateStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
+
+       std::unique_ptr< DbEnumerator > pEnum(_PackageManagerImpl::ExecuteStatementN(db, pStmt.get()));
+       TryReturn(!IsFailed(GetLastResult()), false, "ExecuteStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
+
+       AppLog("Restore PackageInfo[%ls] in db", backupId.GetPointer());
+
+       return RestoreAppInfoList(pContext, db);
+}
+
+bool
+DatabaseManager::RestoreAppInfoList(InstallationContext* pContext, Database& db) const
+{
+       TryReturn(pContext, false, "pContext is null.");
+
+       String query;
+
+       IListT<AppData*>* pAppDataList = pContext->__pAppDataList;
+       TryReturn(pAppDataList, false, "pAppDataList is null.");
+
+       int count = pAppDataList->GetCount();
+
+       for (int i = 0; i < count; i++)
+       {
+               AppData* pAppData = null;
+               pAppDataList->GetAt(i, pAppData);
+
+               if (pAppData)
+               {
+                       AppId backupAppId = pAppData->__appId + BACKUP_NAME_RULE;
+                       query.Format(1024, L"UPDATE AppInfo SET PACKAGE_NAME = '%ls' WHERE PACKAGE_NAME = '%ls'", pAppData->__appId.GetPointer(), backupAppId.GetPointer());
+
+                       std::unique_ptr< DbStatement > pStmt(_PackageManagerImpl::CreateStatementN(db, query));
+                       TryReturn(pStmt, false, "CreateStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
+
+                       std::unique_ptr< DbEnumerator > pEnum(_PackageManagerImpl::ExecuteStatementN(db, pStmt.get()));
+                       TryReturn(!IsFailed(GetLastResult()), false, "ExecuteStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
+
+                       AppLog("Restore AppInfo[%ls] in db", backupAppId.GetPointer());
+               }
+       }
+
        return true;
 }
 
index 8f0d08a..4183a09 100755 (executable)
@@ -37,7 +37,10 @@ public:
        virtual ~DatabaseManager(void);
 
        bool RegisterPackageInfo(InstallationContext* pContext) const;
-       bool UnregisterPackageInfo(InstallationContext* pContext) const;
+       bool UnregisterPackageInfo(const Tizen::App::PackageId& uniquePackageId, bool backup = false) const;
+
+       bool BackupPackageInfo(InstallationContext* pContext) const;
+       bool RestorePackageInfo(InstallationContext* pContext) const;
 
        bool DisableAutoRestart(Tizen::App::AppId appId) const;
 
@@ -50,6 +53,9 @@ private:
 
        bool CreatePackageTables(void) const;
 
+       bool BackupAppInfoList(InstallationContext* pContext, Tizen::Io::Database& db) const;
+       bool RestoreAppInfoList(InstallationContext* pContext, Tizen::Io::Database& db) const;
+
 }; // DatabaseManager
 
 #endif // _DATABASE_MANAGER_H_
index 563c800..8e74194 100755 (executable)
@@ -147,182 +147,6 @@ SmackManager::AddLabelSymlink(const String& symlink)
        return true;
 }
 
-#if 0
-bool
-SmackManager::AddLabelSharedDir(const PackageId& packageId, const String& dirPath)
-{
-       TryReturn(__pContext, false, "__pContext is null");
-
-//     if (__pContext->__isVerificationMode == false)
-//     {
-//             AppLog("VerificationMode is off.");
-//             return true;
-//     }
-
-       int res = 0;
-       String label = packageId;
-
-       std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(packageId));
-       TryReturn(pPackageId, false, "pPackageId is null.");
-
-       std::unique_ptr<char[]> pPath(_StringConverter::CopyToCharArrayN(dirPath));
-       TryReturn(pPath, false, "pPath is null.");
-
-       if (dirPath.Contains(L"shared/data") == true)
-       {
-               //label.Append("_shareddata");
-               //AddSharedDirReaders(label);
-
-               label = L"*";
-       }
-       else if (dirPath.Contains(L"shared/trusted") == true)
-       {
-               if (__pContext->__isVerificationMode == true)
-               {
-                       Sha1Hash hash;
-                       String base64Value;
-                       result r = E_SUCCESS;
-
-                       IListT<String *>* pAuthorCertList = __pContext->__pAuthorCertList;
-                       TryReturn(pAuthorCertList, false, "pAuthorCertList is null.");
-
-                       String *pEntity = null;
-                       r = pAuthorCertList->GetAt(0, pEntity);
-                       TryReturn(!IsFailed(r), false, "pAuthorCertList->GetAt() is failed.");
-                       TryReturn(pEntity, false, "pEntity is null.");
-
-                       std::unique_ptr<ByteBuffer> pEncodedData(StringUtil::DecodeBase64StringN(*pEntity));
-                       TryReturn(pEncodedData, false, "pEncodedData is null.");
-
-                       std::unique_ptr<ByteBuffer> pHashValue(hash.GetHashN(*pEncodedData.get()));
-                       TryReturn(pHashValue, false, "pHashValue is null.");
-
-                       r = StringUtil::EncodeToBase64String(*pHashValue, base64Value);
-                       TryReturn(!IsFailed(r), false, "EncodeToBase64String() is failed.");
-
-                       // in smack, '/' is not allowed for label.
-                       r = base64Value.Replace(L"/", L"#");
-                       TryReturn(!IsFailed(r), false, "base64Value.Replace() is failed.");
-
-                       std::unique_ptr<char[]> pHashEncodedValue(_StringConverter::CopyToCharArrayN(base64Value));
-                       TryReturn(pHashEncodedValue, false, "pHashEncodedValue is null.");
-
-                       label = pHashEncodedValue.get();
-                       AppLog("pHashEncodedValue = [%s]", pHashEncodedValue.get());
-               }
-               else
-               {
-                       AddLabelDir(pPackageId.get(), pPath.get());
-                       return true;
-               }
-       }
-       else
-       {
-               AppLog("Invalid Directory = [%ls]", dirPath.GetPointer());
-               return false;
-       }
-
-       std::unique_ptr<char[]> pLabel(_StringConverter::CopyToCharArrayN(label));
-       TryReturn(pLabel, false, "pLabel is null.");
-
-       res = AddLabelSharedDir(pPackageId.get(), pLabel.get(), pPath.get());
-
-       return true;
-}
-#endif
-
-#if 0
-bool
-SmackManager::AddSharedDirReaders(const String& label)
-{
-       TryReturn(__pContext, false, "__pContext is null");
-
-       int error = 0;
-       bool res = true;
-       IList* pPackageList = null;
-
-       std::unique_ptr<char[]> pLabel(_StringConverter::CopyToCharArrayN(label));
-       TryReturn(pLabel, false, "pLabel is null.");
-
-       if (__pContext->__isPreloaded == true)
-       {
-               pPackageList = GetPreloadedAppListN();
-       }
-       else
-       {
-               pPackageList = _PackageManagerImpl::GetInstance()->GetPackageInfoListN();
-       }
-       TryReturn(pPackageList, false, "pPackageList is null.");
-
-       int count = pPackageList->GetCount();
-
-       const char** pList = new (std::nothrow) const char*[count+1];
-       TryReturn(pList, false, "pList is null.");
-       int len = sizeof(const char*) * (count+1);
-       memset(pList, 0, len);
-       AppLog("pList : init: size=%d", len);
-
-       for (int i = 0; i < count; i++)
-       {
-               if (__pContext->__isPreloaded == true)
-               {
-                       String* pPackage = dynamic_cast < String* >(pPackageList->GetAt(i));
-                       if (pPackage)
-                       {
-                               PackageId packageId = *pPackage;
-
-                               if (packageId == __pContext->__packageId)
-                               {
-                                       AppLog("package [%ls] is skipped.", packageId.GetPointer());
-                                       continue;
-                               }
-
-                               std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(packageId));
-                               TryCatch(pPackageId, res = false, "pPackage is null.");
-
-                               pList[i] = pPackageId.release();
-                               AppLog("Package - [%s]", pList[i]);
-                       }
-               }
-               else
-               {
-                       PackageInfo* pPackage = dynamic_cast < PackageInfo* >(pPackageList->GetAt(i));
-                       if (pPackage)
-                       {
-                               PackageId packageId = pPackage->GetId();
-
-                               if (packageId == __pContext->__packageId)
-                               {
-                                       AppLog("package [%ls] is skipped.", packageId.GetPointer());
-                                       continue;
-                               }
-
-                               std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(packageId));
-                               TryCatch(pPackageId, res = false, "pPackage is null.");
-
-                               pList[i] = pPackageId.release();
-                               AppLog("Package - [%s]", pList[i]);
-                       }
-               }
-        }
-
-       pList[count] = null;
-
-       error = AddSharedDirReaders(pLabel.get(), pList);
-       res = true;
-
-CATCH:
-       for (int i = 0; pList[i] != null; i++)
-       {
-               delete[] pList[i];
-        }
-       delete[] pList;
-       delete pPackageList;
-
-       return res;
-}
-#endif
-
 bool
 SmackManager::AddFriend(const Tizen::App::PackageId& packageId1, const Tizen::App::PackageId& packageId2)
 {
@@ -400,6 +224,12 @@ SmackManager::SetupPath(const PackageId& packageId, const String& dirPath, Smack
        int res = 0;
        String realPath;
 
+       if (File::IsFileExist(dirPath) == false)
+       {
+               AppLog("dirPath [%ls] is not existed. skip!", dirPath.GetPointer());
+               return true;
+       }
+
        std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(packageId));
        TryReturn(pPackageId, false, "pPackageId is null.");
 
@@ -584,76 +414,6 @@ SmackManager::AddLabelDir(const char* pLabel, const char* pDirPath)
        return 0;
 }
 
-#if 0
-int
-SmackManager::AddLabelSharedDir(const char* pLabel, const char* pSharedLabel, const char* pDirPath)
-{
-       int ret = 0;
-       void* pHandle = null;
-       char* pErrorMsg = null;
-       int (*app_label_shared_dir)(const char*, const char*, const char*) = null;
-
-       pHandle = dlopen("libprivilege-control.so.0", RTLD_LAZY | RTLD_GLOBAL);
-       if (!pHandle)
-       {
-               AppLog("AddLabelSharedDir(): dlopen() failed. [%s]", dlerror());
-               return -1;
-       }
-
-       app_label_shared_dir = reinterpret_cast <int (*)(const char*, const char*, const char*)>(dlsym(pHandle, "app_label_shared_dir"));
-       pErrorMsg = dlerror();
-       if ((pErrorMsg != null) || (app_label_shared_dir == null))
-       {
-               AppLog("AddLabelSharedDir(): dlsym() failed. [%s]", pErrorMsg);
-               dlclose(pHandle);
-               return -1;
-       }
-
-       AppLog("[smack] app_label_shared_dir(%s, %s, %s)", pLabel, pSharedLabel, pDirPath);
-       ret = app_label_shared_dir(pLabel, pSharedLabel, pDirPath);
-       AppLog("[smack] app_label_shared_dir(%s, %s, %s), result = [%d]", pLabel, pSharedLabel, pDirPath, ret);
-
-       dlclose(pHandle);
-
-       return 0;
-}
-#endif
-
-#if 0
-int
-SmackManager::AddSharedDirReaders(const char* pSharedLabel, const char** ppAppList)
-{
-       int ret = 0;
-       void* pHandle = null;
-       char* pErrorMsg = null;
-       int (*add_shared_dir_readers)(const char*, const char**) = null;
-
-       pHandle = dlopen("libprivilege-control.so.0", RTLD_LAZY | RTLD_GLOBAL);
-       if (!pHandle)
-       {
-               AppLog("AddSharedDirReaders(): dlopen() failed. [%s]", dlerror());
-               return -1;
-       }
-
-       add_shared_dir_readers = reinterpret_cast <int (*)(const char*, const char**)>(dlsym(pHandle, "add_shared_dir_readers"));
-       pErrorMsg = dlerror();
-       if ((pErrorMsg != null) || (add_shared_dir_readers == null))
-       {
-               AppLog("AddSharedDirReaders(): dlsym() failed. [%s]", pErrorMsg);
-               dlclose(pHandle);
-               return -1;
-       }
-
-       AppLog("[smack] add_shared_dir_readers(%s)", pSharedLabel);
-       ret = add_shared_dir_readers(pSharedLabel, ppAppList);
-       AppLog("[smack] add_shared_dir_readers(%s), result = [%d]", pSharedLabel, ret);
-
-       dlclose(pHandle);
-
-       return 0;
-}
-#endif
-
 int
 SmackManager::AddFriend(const char* pPackageId1, const char* pPackageId2)
 {
index 85281c8..6356b7c 100755 (executable)
@@ -39,8 +39,6 @@ public:
 
        bool AddLabelDir(const Tizen::Base::String& label, const Tizen::Base::String& dirPath, bool rootDirectory = false);
        bool AddLabelSymlink(const Tizen::Base::String& symlink);
-       //bool AddLabelSharedDir(const Tizen::App::PackageId& packageId, const Tizen::Base::String& dirPath);
-       //bool AddSharedDirReaders(const Tizen::Base::String& label);
        bool AddFriend(const Tizen::App::PackageId& packageId1, const Tizen::App::PackageId& packageId2);
 
        bool EnablePermissions(const Tizen::App::PackageId& packageId);
@@ -53,8 +51,6 @@ private:
        int Uninstall(const char* pPackageId);
 
        int AddLabelDir(const char* pLabel, const char* pDirPath);
-       //int AddLabelSharedDir(const char* pLabel, const char* pSharedLabel, const char* pDirPath);
-       //int AddSharedDirReaders(const char* pSharedLabel, const char** ppAppList);
        int AddFriend(const char* pPackageId1, const char* pPackageId2);
 
        int EnablePermissions(const char* pPackageId, int appType, const char** ppPermissions, bool persistent);
index 0cbc791..a1d2488 100755 (executable)
@@ -27,6 +27,7 @@
 
 #include "InstallationContext.h"
 #include "SystemCheckStep.h"
+#include "ConfigurationManager.h"
 #include "DatabaseManager.h"
 
 using namespace Tizen::App;
@@ -59,8 +60,8 @@ SystemCheckStep::Run(InstallationContext* pContext)
                        error = OnStateVersionCheck();
                        break;
 
-               case STATE_AGENT_CHECK:
-                       error = OnStateAgentCheck();
+               case STATE_BACKUP:
+                       error = OnStateBackup();
                        break;
 
                case STATE_AGENT_TIMER:
@@ -168,10 +169,17 @@ SystemCheckStep::OnStateVersionCheck(void)
 }
 
 InstallerError
-SystemCheckStep::OnStateAgentCheck(void)
+SystemCheckStep::OnStateBackup(void)
 {
        InstallerError error = INSTALLER_ERROR_NONE;
 
+       if ((__pContext->__isUpdated == true) && (__pContext->__isPreloaded == false))
+       {
+               ConfigurationManager configurationManager;
+               bool res = configurationManager.CreateBackup(__pContext);
+               TryReturn(res == true, INSTALLER_ERROR_BACKUP_FAILED, "configurationManager.CreateBackup(%ls) failed.", __pContext->__packageId.GetPointer());
+       }
+
        GoNextState();
        return error;
 }
index da6b1b2..6dddf49 100755 (executable)
@@ -46,7 +46,7 @@ private:
        enum
        {
                STATE_VERSION_CHECK,
-               STATE_AGENT_CHECK,
+               STATE_BACKUP,
                STATE_AGENT_TIMER,
                STATE_DONE
        };
@@ -61,7 +61,7 @@ private:
 
        void GoNextState(void);
        InstallerError OnStateVersionCheck(void);
-       InstallerError OnStateAgentCheck(void);
+       InstallerError OnStateBackup(void);
        InstallerError OnStateAgentTimer(void);
        InstallerError OnStateDone(void);
 
index 070f842..36b2b39 100755 (executable)
@@ -51,6 +51,7 @@ main(int argc, char **argv)
        const char *pkg_info = null;
        char* pkg_path = null;
        const char* pOptional = null;
+       const char* pStoreClientId = null;
        String path;
        String optionalData;
        PackageId packageId;
@@ -159,6 +160,15 @@ main(int argc, char **argv)
                                AppLog(" # path = [%ls] -> optionalData = [%ls]", path.GetPointer(), optionalData.GetPointer());
                        }
 
+                       pStoreClientId = pkgmgr_installer_get_caller_pkgid(pi);
+                       if (pStoreClientId)
+                       {
+                               PackageId StoreClientId = pStoreClientId;
+                               optionalData.Append(":StoreClientId=");
+                               optionalData.Append(StoreClientId);
+                               AppLog(" # optionalData = [%ls]", optionalData.GetPointer());
+                       }
+
                        errorType = InstallerManager::Request(path, INSTALLER_OPERATION_INSTALL, INSTALLER_OPTION_NORMAL, pi, &optionalData);
 
 //             if (errorType != 0)