sync with master
[platform/framework/native/appfw.git] / src / app / package / FAppPkg_PackageManagerImpl.cpp
index 91d5e0b..7d5aaf7 100755 (executable)
@@ -42,6 +42,7 @@
 #include "FAppPkg_PackageManagerImpl.h"
 #include "FAppPkg_PackageInfoImpl.h"
 #include "FAppPkg_PackageAppInfoImpl.h"
+#include "FAppPkg_PackageParser.h"
 #include "FApp_AppInfo.h"
 #include "FApp_PackageManagerProxy.h"
 
@@ -58,8 +59,6 @@ PackageManager* pPackageManagerInstance = null;
 
 Tizen::Base::Collection::HashMap _PackageManagerImpl::__installationList;
 
-const wchar_t PACKAGE_DATABASE_FILE_NAME[] = L"/opt/usr/dbspace/.app-package.db";
-
 void
 _PackageManagerEvent::FireImpl(IEventListener& listener, const IEventArg& arg)
 {
@@ -511,10 +510,6 @@ _PackageManagerImpl::MoveToExternalStorage(const PackageId& packageId)
        SysTryReturnResult(NID_APP, packageId.IsEmpty() == false, E_INVALID_ARG, "packageId is empty");
        SysTryReturnResult(NID_APP, IsPackageInstalled(packageId) == true, E_PKG_NOT_INSTALLED, "package is not installed.");
 
-#if defined(_OSP_EMUL_)
-       SysLog(NID_APP, "MoveToExternalStorage() is unavailable on the emulator.");
-       return E_SYSTEM;
-#else
        int res = 0;
        char* pType = null;
        pkgmgrinfo_installed_storage storage = PMINFO_INTERNAL_STORAGE;
@@ -574,7 +569,6 @@ _PackageManagerImpl::MoveToExternalStorage(const PackageId& packageId)
        }
 
        return E_SUCCESS;
-#endif
 }
 
 result
@@ -583,10 +577,6 @@ _PackageManagerImpl::MoveToInternalStorage(const PackageId& packageId)
        SysTryReturnResult(NID_APP, packageId.IsEmpty() == false, E_INVALID_ARG, "packageId is empty");
        SysTryReturnResult(NID_APP, IsPackageInstalled(packageId) == true, E_PKG_NOT_INSTALLED, "package is not installed.");
 
-#if defined(_OSP_EMUL_)
-       SysLog(NID_APP, "MoveToInternalStorage() is unavailable on the emulator.");
-       return E_SYSTEM;
-#else
        int res = 0;
        char* pType = null;
        pkgmgrinfo_installed_storage storage = PMINFO_INTERNAL_STORAGE;
@@ -646,7 +636,6 @@ _PackageManagerImpl::MoveToInternalStorage(const PackageId& packageId)
        }
 
        return E_SUCCESS;
-#endif
 }
 
 int
@@ -656,10 +645,10 @@ _PackageManagerImpl::InstallationEventHandler(int reqId, const char* pType, cons
 
        if (pData)
        {
+               IPackageInstallationResponseListener* pListener = (IPackageInstallationResponseListener*) pData;
+
                if (strcmp(pKey, "end") == 0)
                {
-                       IPackageInstallationResponseListener* pListener = (IPackageInstallationResponseListener*) pData;
-
                        if (strcmp(pVal, "ok") == 0)
                        {
                                pListener->OnPackageInstallationResponseReceived(pPackageId, PACKAGE_INSTALLATION_RESULT_SUCCESS);
@@ -673,6 +662,14 @@ _PackageManagerImpl::InstallationEventHandler(int reqId, const char* pType, cons
 
                        delete pListener;
                }
+               else if (strcmp(pKey, "install_percent") == 0)
+               {
+                       int progress = 0;
+                       sscanf(pVal, "%d", &progress);
+
+                       pListener->OnPackageInstallationInProgressResponseReceived(pPackageId, progress);
+                       SysLog(NID_APP, "OnPackageInstallationInProgressResponseReceived(%s, %d)", pPackageId, progress);
+               }
        }
 
        return 0;
@@ -724,6 +721,69 @@ _PackageManagerImpl::Construct(void)
        return E_SUCCESS;
 }
 
+PackageInfo*
+_PackageManagerImpl::GetPackageInfoFromFileN(const String& filePath) const
+{
+       SysTryReturn(NID_APP, filePath.IsEmpty() == false, null, E_INVALID_ARG, "filePath is empty.");
+       SysTryReturn(NID_APP, File::IsFileExist(filePath) == true, null, E_FILE_NOT_FOUND, "package is not existed.");
+
+       String extension = File::GetFileExtension(filePath);
+       SysTryReturn(NID_APP, extension.IsEmpty() == false, null, E_INVALID_ARG, "extension is empty.");
+
+       std::unique_ptr<char[]> pPackagePath(_StringConverter::CopyToCharArrayN(filePath));
+       SysTryReturn(NID_APP, pPackagePath, null, E_OUT_OF_MEMORY, "pPackagePath is null.");
+
+       std::unique_ptr<char[]> pExtension(_StringConverter::CopyToCharArrayN(extension));
+       SysTryReturn(NID_APP, pExtension, null, E_OUT_OF_MEMORY, "pExtension is null.");
+
+       bool res = false;
+
+       if ((strcasecmp(pExtension.get(), "tpk") == 0) || (strcasecmp(pExtension.get(), "wgt") == 0))
+       {
+               SysLog(NID_APP, "packagePath = [%s], extension = [%s]", pPackagePath.get(), pExtension.get());
+               res = true;
+       }
+       SysTryReturn(NID_APP, res == true, null, E_UNSUPPORTED_FORMAT, "invalid extension! - packagePath = [%s], extension = [%s]", pPackagePath.get(), pExtension.get());
+
+       _PackageParser packageParser;
+
+       PackageInfo* pPackageInfo = new (std::nothrow) PackageInfo;
+       SysTryReturn(NID_APP, pPackageInfo, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] pPackageInfo instance must not be null.");
+
+       res = packageParser.Construct(pPackageInfo);
+       SysTryReturn(NID_APP, res, null, E_PARSING_FAILED, "Construct() is failed. [%s]", pPackagePath.get());
+
+       res = packageParser.Parse(filePath);
+       SysTryReturn(NID_APP, res, null, E_PARSING_FAILED, "Parse() is failed. [%s]", pPackagePath.get());
+
+       return pPackageInfo;
+}
+
+IList*
+_PackageManagerImpl::GetPackageInfoListN(const IMap& packageFilterMap) const
+{
+       SysTryReturn(NID_APP, packageFilterMap.GetCount() > 0, null, E_INVALID_ARG, "packageFilterMap.GetCount() is invalid.");
+
+       return null;
+}
+
+IList*
+_PackageManagerImpl::GetPackageAppInfoListN(const IMap& packageAppFilterMap) const
+{
+       SysTryReturn(NID_APP, packageAppFilterMap.GetCount() > 0, null, E_INVALID_ARG, "packageAppFilterMap.GetCount() is invalid.");
+
+       return null;
+}
+
+IList*
+_PackageManagerImpl::GetPackageAppInfoListN(const IMap& packageFilterMap, const IMap& packageAppFilterMap) const
+{
+       SysTryReturn(NID_APP, packageFilterMap.GetCount() > 0, null, E_INVALID_ARG, "packageFilterMap.GetCount() is invalid.");
+       SysTryReturn(NID_APP, packageAppFilterMap.GetCount() > 0, null, E_INVALID_ARG, "packageAppFilterMap.GetCount() is invalid.");
+
+       return null;
+}
+
 _PackageManagerImpl::_PackageManagerImpl(void)
 :__pRequestClient(null),
 __pListeningClient(null),
@@ -830,7 +890,7 @@ _PackageManagerImpl::GetPackageInfoN(PackageType packageType, const String& pack
 
        query.Format(   1024, L"SELECT PkgInfo.*, AppInfo.APP_MAINMENU_ICON FROM AppInfo, PkgInfo WHERE AppInfo.ID = PkgInfo.UNIQUE_ID and AppInfo.PACKAGE_NAME = '%ls'", packageName.GetPointer());
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        pStmt = CreateStatementN(db, query);
@@ -946,7 +1006,7 @@ _PackageManagerImpl::GetFilteredAppIdListN(const String& feature, const String&
 
        query.Format(1024, L"SELECT AppInfo.PACKAGE_NAME FROM AppInfo, AppFeature WHERE AppFeature.ID = AppInfo.UNIQUE_ID and AppFeature.NAME = '%ls' and AppFeature.VALUE = '%ls' COLLATE NOCASE", feature.GetPointer(), value.GetPointer());
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        pStmt = CreateStatementN(db, query);
@@ -995,7 +1055,7 @@ _PackageManagerImpl::GetDataControlInfoN(const String& providerId, const String&
 
        query.Format(1024, L"SELECT AppInfo.PACKAGE_NAME, DataControl.ACCESS FROM AppInfo, DataControl WHERE DataControl.ID = AppInfo.UNIQUE_ID and DataControl.PROVIDER_ID = '%ls' and DataControl.TYPE = '%ls' COLLATE NOCASE", providerId.GetPointer(), type.GetPointer());
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        pStmt = CreateStatementN(db, query);
@@ -1050,7 +1110,7 @@ _PackageManagerImpl::GetUiThemeListN(const PackageId& packageId) const
        query.Format(1024, L"SELECT AppFeature.NAME, AppFeature.VALUE FROM PkgInfo, AppInfo, AppFeature WHERE (AppFeature.ID = AppInfo.UNIQUE_ID and AppInfo.ID = PkgInfo.UNIQUE_ID and PkgInfo.PKG_ID = '%ls') and (AppFeature.NAME = 'SystemTheme' or AppFeature.NAME = 'UserDefinedTheme')"
                        , packageId.GetPointer());
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        pStmt = CreateStatementN(db, query);
@@ -1159,7 +1219,7 @@ _PackageManagerImpl::GetAppIdOfDataControlN(const String& providerId)
        query.Format(1024, L"SELECT PkgInfo.PKG_ID FROM PkgInfo, AppInfo, DataControl WHERE DataControl.PROVIDER_ID = '%ls' and DataControl.ID = AppInfo.UNIQUE_ID and AppInfo.ID = PkgInfo.UNIQUE_ID",
                        providerId.GetPointer());
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        pStmt = CreateStatementN(db, query);
@@ -1233,7 +1293,8 @@ _PackageManagerImpl::CreatePackageTables(void)
                                                         "( ID                          INTEGER,"
                                                         "PRIVILEGES                                    TEXT,"
                                                         "HMAC_PPRIVILEGES                      TEXT,"
-                                                        "CERTIFICATE_TYPE              INTEGER )");
+                                                        "CERTIFICATE_TYPE              INTEGER,"
+                                                    "STR_PRIVILEGES            TEXT )");
        r = db.ExecuteSql(createQuery, true);
        SysTryReturn(NID_APP, r == E_SUCCESS, r, r, "MakePackageDb: db.ExecuteSql is failed. [%s]", GetErrorMessage(r));
        createQuery.Clear();
@@ -1587,7 +1648,7 @@ _PackageManagerImpl::GetPackageInfoN(const String& providerId, const String& ope
                        "GROUP BY AppInfoID"
                        , providerId.GetPointer(), operationId.GetPointer());
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        pStmt = CreateStatementN(db, query);
@@ -1627,7 +1688,7 @@ _PackageManagerImpl::GetAppInfo(int uniqueId, _PackageAppInfoImpl& appInfo) cons
 
        query.Format(1024, L"SELECT * FROM AppInfo WHERE UNIQUE_ID = %d", uniqueId);
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        pStmt = CreateStatementN(db, query);
@@ -1702,7 +1763,7 @@ _PackageManagerImpl::GetPackageAppInfoImplListN(const String& packageId) const
        pPackageInfoImpl = _PackageInfoImpl::GetInstance(pPkgInfo);
        query.Format(1024, L"SELECT * FROM AppInfo WHERE ID = %d", pPackageInfoImpl->GetUniqueId());
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        pStmt = CreateStatementN(db, query);
@@ -1839,7 +1900,7 @@ _PackageManagerImpl::GetAppLaunchConditionListN(const String& packageName) const
 
        query.Format(1024, L"SELECT LaunchCondition.* FROM LaunchCondition, AppInfo WHERE AppInfo.UNIQUE_ID = LaunchCondition.ID and AppInfo.PACKAGE_NAME = '%ls'", packageName.GetPointer());
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        pStmt = CreateStatementN(db, query);
@@ -2286,7 +2347,7 @@ _PackageManagerImpl::FindRecord(const String& tableName, const String& columnNam
        DbEnumerator* pEnum = null;
        int uniqueId = 0;
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        //SysTryCatch(NID_APP, r == E_SUCCESS, r, r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        query.Format(1024, L"SELECT * FROM %ls WHERE %ls = '%ls'", tableName.GetPointer(), columnName.GetPointer(), value.GetPointer());
@@ -2321,7 +2382,7 @@ _PackageManagerImpl::GetRecord(const String& tableName, int uniqueId, const Stri
        DbStatement* pStmt = null;
        DbEnumerator* pEnum = null;
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        //SysTryCatch(NID_APP, r == E_SUCCESS, r, r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        query.Format(1024, L"SELECT %ls FROM %ls WHERE UNIQUE_ID = %d", columnName.GetPointer(), tableName.GetPointer(), uniqueId);
@@ -2425,7 +2486,7 @@ _PackageManagerImpl::GetPackageName(const PackageId& packageId, const String* pN
                        pName->GetPointer(), packageId.GetPointer());
        }
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        pStmt = CreateStatementN(db, query);
@@ -2468,7 +2529,7 @@ _PackageManagerImpl::GetDefaultAppExecutableName(const PackageId& packageId)
                L"SELECT AppInfo.APP_NAME FROM AppInfo, PkgInfo WHERE AppInfo.ID = PkgInfo.UNIQUE_ID and AppInfo.APP_DEFAULT = '%s' and PkgInfo.PKG_ID = '%ls'",
                "True", packageId.GetPointer());
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        pStmt = CreateStatementN(db, query);