Add type parameter for performance
[platform/framework/native/appfw.git] / src / app / package / FAppPkg_PackageManagerImpl.cpp
index 98f8be5..39cac0d 100755 (executable)
@@ -1,5 +1,4 @@
 //
-// Open Service Platform
 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the License);
@@ -37,6 +36,7 @@
 #include <FBaseSysLog.h>
 #include <FIo.h>
 #include <FIoRegistry.h>
+#include <FSecPrivilegeInfo.h>
 #include <FSysSystemTime.h>
 #include <FBase_StringConverter.h>
 
@@ -50,7 +50,9 @@
 using namespace Tizen::Base;
 using namespace Tizen::Base::Runtime;
 using namespace Tizen::Base::Collection;
+using namespace Tizen::Base::Utility;
 using namespace Tizen::Io;
+using namespace Tizen::Security;
 using namespace Tizen::System;
 
 namespace Tizen { namespace App { namespace Package
@@ -86,15 +88,26 @@ _PackageManagerEvent::FireImpl(IEventListener& listener, const IEventArg& arg)
                }
                else
                {
-                       if (pArg->__install)
+                       if (pArg->__install == false)
                        {
-                               SysLog(NID_APP, "Installation is Completed(Error). [Package = %ls]", pArg->__packageId.GetPointer());
-                               pListener->OnPackageInstallationCompleted(pArg->__packageId, PACKAGE_INSTALLATION_RESULT_INVALID_PACKAGE);
+                               SysLog(NID_APP, "Uninstallation is Completed(Error). [Package = %ls]", pArg->__packageId.GetPointer());
+                               pListener->OnPackageUninstallationCompleted(pArg->__packageId, false);
+                       }
+               }
+       }
+       else if (pArg->__eventKey == L"error")
+       {
+               if (pArg->__install)
+               {
+                       if (pArg->__eventValue == L"62")
+                       {
+                               SysLog(NID_APP, "Installation is Completed(Error = STORAGE_FULL(62)). [Package = %ls]", pArg->__packageId.GetPointer());
+                               pListener->OnPackageInstallationCompleted(pArg->__packageId, PACKAGE_INSTALLATION_RESULT_STORAGE_FULL);
                        }
                        else
                        {
-                               SysLog(NID_APP, "Uninstallation is Completed(Error). [Package = %ls]", pArg->__packageId.GetPointer());
-                               pListener->OnPackageUninstallationCompleted(pArg->__packageId, false);
+                               SysLog(NID_APP, "Installation is Completed(Error). [Package = %ls]", pArg->__packageId.GetPointer());
+                               pListener->OnPackageInstallationCompleted(pArg->__packageId, PACKAGE_INSTALLATION_RESULT_INVALID_PACKAGE);
                        }
                }
        }
@@ -381,12 +394,9 @@ _PackageManagerImpl::InstallPackage(const PackageId& packageId, const String& pa
                return E_SYSTEM;
        }
 
-       // optionalData = 12345abcde:StoreClientId=XXXXX12345.TizenStore
-       AppId StoreClientId = _AppInfo::GetApplicationId();
+       // optionalData = 12345abcde
        String optionalData;
        optionalData.Append(packageId);
-       optionalData.Append(":StoreClientId=");
-       optionalData.Append(StoreClientId);
 
        std::unique_ptr<char[]> pOptionalData(_StringConverter::CopyToCharArrayN(optionalData));
        SysTryReturnResult(NID_APP, pOptionalData, E_OUT_OF_MEMORY, "pOptionalData is null.");
@@ -477,7 +487,7 @@ _PackageManagerImpl::UninstallPackage(const PackageId& packageId, IPackageUninst
        }
 
        res = pkgmgr_client_uninstall(__pRequestClient, pType, pPackageId.get(), PM_QUIET, UninstallationEventHandler, pListener);
-       SysLog(NID_APP, "pkgmgr_client_uninstall - req_id=[%d], package=[%s], type=[%s]", res, pPackageId.get(), pType);
+       SysLog(NID_APP, "pkgmgr_client_uninstall - req=[%d], package=[%s], type=[%s]", res, pPackageId.get(), pType);
 
        if(pPackageInfoHandle)
        {
@@ -552,9 +562,10 @@ _PackageManagerImpl::MoveToExternalStorage(const PackageId& packageId)
                SysTryReturnResult(NID_APP, __pRequestClient != null, E_SYSTEM, "pkgmgr_client_new(PC_REQUEST) failed");
        }
 
-       res = pkgmgr_client_move(__pRequestClient, pType, pPackageId.get(), PM_MOVE_TO_SDCARD, PM_QUIET);
+       SysLog(NID_APP, "pkgmgr_client_request_service(PM_REQUEST_MOVE, 1, %s, %s)", pType, pPackageId.get());
+       res = pkgmgr_client_request_service(PM_REQUEST_MOVE, 1, __pRequestClient, pType, pPackageId.get(), null, null, null);
 
-       if(packageInfoHandle)
+       if (packageInfoHandle)
        {
                pkgmgrinfo_pkginfo_destroy_pkginfo(packageInfoHandle);
        }
@@ -619,9 +630,10 @@ _PackageManagerImpl::MoveToInternalStorage(const PackageId& packageId)
                SysTryReturnResult(NID_APP, __pRequestClient != null, E_SYSTEM, "pkgmgr_client_new(PC_REQUEST) failed");
        }
 
-       res = pkgmgr_client_move(__pRequestClient, pType, pPackageId.get(), PM_MOVE_TO_INTERNAL, PM_QUIET);
+       SysLog(NID_APP, "pkgmgr_client_request_service(PM_REQUEST_MOVE, 0, %s, %s)", pType, pPackageId.get());
+       res = pkgmgr_client_request_service(PM_REQUEST_MOVE, 0, __pRequestClient, pType, pPackageId.get(), null, null, null);
 
-       if(packageInfoHandle)
+       if (packageInfoHandle)
        {
                pkgmgrinfo_pkginfo_destroy_pkginfo(packageInfoHandle);
        }
@@ -667,13 +679,21 @@ _PackageManagerImpl::InstallationEventHandler(int reqId, const char* pType, cons
                                pListener->OnPackageInstallationResponseReceived(pPackageId, PACKAGE_INSTALLATION_RESULT_SUCCESS);
                                SysLog(NID_APP, "OnPackageInstallationResponseReceived(PACKAGE_INSTALLATION_RESULT_SUCCESS)");
                        }
+
+                       delete pListener;
+               }
+               else if (strcmp(pKey, "error") == 0)
+               {
+                       if (strcmp(pVal, "62") == 0)
+                       {
+                               pListener->OnPackageInstallationResponseReceived(pPackageId, PACKAGE_INSTALLATION_RESULT_STORAGE_FULL);
+                               SysLog(NID_APP, "OnPackageInstallationResponseReceived(PACKAGE_INSTALLATION_RESULT_STORAGE_FULL)");
+                       }
                        else
                        {
                                pListener->OnPackageInstallationResponseReceived(pPackageId, PACKAGE_INSTALLATION_RESULT_INVALID_PACKAGE);
                                SysLog(NID_APP, "OnPackageInstallationResponseReceived(PACKAGE_INSTALLATION_RESULT_INVALID_PACKAGE)");
                        }
-
-                       delete pListener;
                }
                else if (strcmp(pKey, "install_percent") == 0)
                {
@@ -738,7 +758,6 @@ _PackageManagerImpl::GetPackageInfoFromFileN(const String& filePath) const
        SysLog(NID_APP, "packagePath = [%s], extension = [%s]", pPackagePath.get(), pExtension.get());
 
        bool res = true;
-       result r = E_SUCCESS;
 
        if (strcasecmp(pExtension.get(), "tpk") == 0)
        {
@@ -760,7 +779,7 @@ _PackageManagerImpl::GetPackageInfoFromFileN(const String& filePath) const
                _package_manager_pkg_detail_info_t* pPkgInfo = (_package_manager_pkg_detail_info_t*) pPkgmgrInfo;
                _PackageInfoImpl* pPackageInfoImpl = _PackageInfoImpl::GetInstance(pPackageInfo.get());
 
-               SysLog(NID_APP, "id(%s), version(%s), label(%s), description(%s), author(%s), icon_size(%d), pkgname(%s)", pPkgInfo->pkgid, pPkgInfo->version, pPkgInfo->label,
+               SysLog(NID_APP, "package(%s), version(%s), label(%s), description(%s), author(%s), icon_size(%d), pkgname(%s)", pPkgInfo->pkgid, pPkgInfo->version, pPkgInfo->label,
                                pPkgInfo->pkg_description, pPkgInfo->author, pPkgInfo->icon_size, pPkgInfo->pkg_name);
 
                pPackageInfoImpl->SetType(PACKAGE_TYPE_WGT);
@@ -771,6 +790,33 @@ _PackageManagerImpl::GetPackageInfoFromFileN(const String& filePath) const
                pPackageInfoImpl->SetAuthor(pPkgInfo->author);
                pPackageInfoImpl->SetMainAppId(pPkgInfo->pkg_name);
 
+               if (IsHybridPackage(filePath) == true)
+               {
+                       PackageInfo hybridServiceInfo;
+                       _PackageParser packageParser;
+
+                       res = packageParser.Construct(&hybridServiceInfo);
+                       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());
+
+                       IList* pList = hybridServiceInfo.GetPrivilegeListN();
+                       if (pList)
+                       {
+                               for (int i = 0; i < pList->GetCount(); i++)
+                               {
+                                       PrivilegeInfo* pPrivilegeInfo = dynamic_cast < PrivilegeInfo* >(pList->GetAt(i));
+                                       if (pPrivilegeInfo)
+                                       {
+                                               String privilege = pPrivilegeInfo->GetId();
+                                               pPackageInfoImpl->AddPrivilege(*new (std::nothrow) String(privilege));
+                                               SysLog(NID_APP, "privilege[%ls] is added for hybrid.", privilege.GetPointer());
+                                       }
+                                }
+                       }
+               }
+
                if (pPkgInfo->privilege_list)
                {
                        GList* pList = null;
@@ -799,12 +845,7 @@ _PackageManagerImpl::GetPackageInfoFromFileN(const String& filePath) const
                        pPackageAppInfoImpl->SetMainApp(true);
                        if ((pPkgInfo->icon_buf) && (pPkgInfo->icon_size > 0))
                        {
-                               String iconPath("/tmp/icon.png");
-                               File file;
-                               r = file.Construct(iconPath, "w+");
-                               r = file.Write(pPkgInfo->icon_buf, pPkgInfo->icon_size);
-
-                               pPackageAppInfoImpl->SetAppTempIconPath(iconPath);
+                               pPackageAppInfoImpl->SetAppMenuIconBuffer(pPkgInfo->icon_buf, pPkgInfo->icon_size);
                        }
 
                        pPackageInfoImpl->AddPackageAppInfo(*pPackageAppInfo.release());
@@ -872,6 +913,13 @@ _PackageManagerImpl::GetPackageInfoListN(const IMap& packageFilterMap) const
                        res = pkgmgrinfo_pkginfo_filter_add_bool(handle, PMINFO_PKGINFO_PROP_PACKAGE_APPSETTING, value);
                        SysTryCatch(NID_APP, res == PMINFO_R_OK, , E_SYSTEM, "pkgmgrinfo_pkginfo_filter_add_bool(APPSETTING, %d) is failed. [%d]", value, res);
                }
+               else if ((*pKey) == PACKAGE_FILTER_TPK)
+               {
+                       SysTryCatch(NID_APP, value == true, , E_SYSTEM, "Value(false) is invalid for PACKAGE_FILTER_TPK.");
+
+                       res = pkgmgrinfo_pkginfo_filter_add_string(handle, PMINFO_PKGINFO_PROP_PACKAGE_TYPE, "tpk");
+                       SysTryCatch(NID_APP, res == PMINFO_R_OK, , E_SYSTEM, "pkgmgrinfo_pkginfo_filter_add_string(TYPE, tpk) is failed. [%d]", res);
+               }
                else if ((*pKey) == PACKAGE_FILTER_EXTERNAL_STORAGE)
                {
                        String installedStorage;
@@ -909,7 +957,7 @@ CATCH:
 
        if (pList->GetCount() <= 0)
        {
-               AppLog("pList's count is 0.");
+               SysLog(NID_APP, "pList's count is 0.");
                return null;
        }
 
@@ -962,6 +1010,60 @@ _PackageManagerImpl::GetPackageAppInfoListN(const IMap& packageAppFilterMap) con
                        res = pkgmgrinfo_appinfo_filter_add_bool(handle, PMINFO_APPINFO_PROP_APP_NODISPLAY, nodisplay);
                        SysTryCatch(NID_APP, res == PMINFO_R_OK, , E_SYSTEM, "pkgmgrinfo_pkginfo_filter_add_bool(NODISPLAY, %d) is failed. [%d]", nodisplay, res);
                }
+#if 0
+               else if ((*pKey) == PACKAGE_APP_FILTER_LAUNCH_ONBOOT)
+               {
+                       definedKey = true;
+
+                       Boolean* pVal = static_cast< Boolean* >(pEnum->GetValue());
+                       SysTryCatch(NID_APP, pVal, , E_INVALID_ARG, "GetValue() is failed.");
+
+                       bool value = pVal->ToBool();
+                       SysLog(NID_APP, "Key[%ls], Value[%d]", pKey->GetPointer(), value);
+
+                       res = pkgmgrinfo_appinfo_filter_add_bool(handle, PMINFO_APPINFO_PROP_APP_ONBOOT, value);
+                       SysTryCatch(NID_APP, res == PMINFO_R_OK, , E_SYSTEM, "pkgmgrinfo_pkginfo_filter_add_bool(ONBOOT, %d) is failed. [%d]", value, res);
+               }
+               else if ((*pKey) == PACKAGE_APP_FILTER_AUTO_RESTART)
+               {
+                       definedKey = true;
+
+                       Boolean* pVal = static_cast< Boolean* >(pEnum->GetValue());
+                       SysTryCatch(NID_APP, pVal, , E_INVALID_ARG, "GetValue() is failed.");
+
+                       bool value = pVal->ToBool();
+                       SysLog(NID_APP, "Key[%ls], Value[%d]", pKey->GetPointer(), value);
+
+                       res = pkgmgrinfo_appinfo_filter_add_bool(handle, PMINFO_APPINFO_PROP_APP_AUTORESTART, value);
+                       SysTryCatch(NID_APP, res == PMINFO_R_OK, , E_SYSTEM, "pkgmgrinfo_pkginfo_filter_add_bool(AUTORESTART, %d) is failed. [%d]", value, res);
+               }
+#endif
+               else if ((*pKey) == PACKAGE_APP_FILTER_LAUNCHING_HISTORY_VISIBLE)
+               {
+                       definedKey = true;
+
+                       Boolean* pVal = static_cast< Boolean* >(pEnum->GetValue());
+                       SysTryCatch(NID_APP, pVal, , E_INVALID_ARG, "GetValue() is failed.");
+
+                       bool value = pVal->ToBool();
+                       SysLog(NID_APP, "Key[%ls], Value[%d]", pKey->GetPointer(), value);
+
+                       res = pkgmgrinfo_appinfo_filter_add_bool(handle, PMINFO_APPINFO_PROP_APP_TASKMANAGE, value);
+                       SysTryCatch(NID_APP, res == PMINFO_R_OK, , E_SYSTEM, "pkgmgrinfo_pkginfo_filter_add_bool(TASKMANAGE, %d) is failed. [%d]", value, res);
+               }
+               else if ((*pKey) == PACKAGE_APP_FILTER_LAUNCH_CONDITION)
+               {
+                       definedKey = true;
+
+                       Boolean* pVal = static_cast< Boolean* >(pEnum->GetValue());
+                       SysTryCatch(NID_APP, pVal, , E_INVALID_ARG, "GetValue() is failed.");
+
+                       bool value = pVal->ToBool();
+                       SysLog(NID_APP, "Key[%ls], Value[%d]", pKey->GetPointer(), value);
+
+                       res = pkgmgrinfo_appinfo_filter_add_bool(handle, PMINFO_APPINFO_PROP_APP_LAUNCHCONDITION, value);
+                       SysTryCatch(NID_APP, res == PMINFO_R_OK, , E_SYSTEM, "pkgmgrinfo_pkginfo_filter_add_bool(LAUNCHCONDITION, %d) is failed. [%d]", value, res);
+               }
                else if ((*pKey) == PACKAGE_APP_FILTER_CATEGORY_HOMEAPP || (*pKey) == PACKAGE_APP_FILTER_CATEGORY_LOCKAPP
                                                || (*pKey) == PACKAGE_APP_FILTER_CATEGORY_MENUAPP)
                {
@@ -1042,7 +1144,7 @@ _PackageManagerImpl::GetPackageAppInfoListN(const IMap& packageAppFilterMap) con
                        PackageAppInfo* pPackageAppInfo = dynamic_cast < PackageAppInfo* >(list.GetAt(i));
                        if (pPackageAppInfo)
                        {
-                               AppLog("PackageAppFilter - App [%ls]", pPackageAppInfo->GetAppId().GetPointer());
+                               SysLog(NID_APP, "PackageAppFilter - App [%ls]", pPackageAppInfo->GetAppId().GetPointer());
 
                                std::unique_ptr< AppId > pAppId(new (std::nothrow) AppId(pPackageAppInfo->GetAppId()));
                                appIdList.Add(pAppId.release());
@@ -1058,7 +1160,7 @@ _PackageManagerImpl::GetPackageAppInfoListN(const IMap& packageAppFilterMap) con
 
                                if (appIdList.Contains(appId) == true)
                                {
-                                       AppLog("App [%ls] is matched.", appId.GetPointer());
+                                       SysLog(NID_APP, "App [%ls] is matched.", appId.GetPointer());
 
                                        std::unique_ptr< PackageAppInfo > pAppInfo(new (std::nothrow) PackageAppInfo);
                                        SysTryCatch(NID_APP, pAppInfo, , E_OUT_OF_MEMORY, "pAppInfo is null.");
@@ -1070,7 +1172,7 @@ _PackageManagerImpl::GetPackageAppInfoListN(const IMap& packageAppFilterMap) con
                                }
                                else
                                {
-                                       AppLog("App [%ls] is not matched.", pPackageAppInfo->GetAppId().GetPointer());
+                                       SysLog(NID_APP, "App [%ls] is not matched.", pPackageAppInfo->GetAppId().GetPointer());
                                }
                        }
                }
@@ -1089,7 +1191,7 @@ CATCH:
 
        if (pList->GetCount() <= 0)
        {
-               AppLog("pList's count is 0.");
+               SysLog(NID_APP, "pList's count is 0.");
                return null;
        }
 
@@ -1124,7 +1226,7 @@ _PackageManagerImpl::GetPackageAppInfoListN(const IMap& packageFilterMap, const
                                        PackageAppInfo* pPackageAppInfo = dynamic_cast < PackageAppInfo* >(pPackageAppInfoList->GetAt(j));
                                        if (pPackageAppInfo)
                                        {
-                                               AppLog("PackageFilter - App [%ls]", pPackageAppInfo->GetAppId().GetPointer());
+                                               SysLog(NID_APP, "PackageFilter - App [%ls]", pPackageAppInfo->GetAppId().GetPointer());
 
                                                std::unique_ptr< AppId > pAppId(new (std::nothrow) AppId(pPackageAppInfo->GetAppId()));
                                                appIdList.Add(pAppId.release());
@@ -1150,11 +1252,11 @@ _PackageManagerImpl::GetPackageAppInfoListN(const IMap& packageFilterMap, const
                if (pPackageAppInfo)
                {
                        AppId appId = pPackageAppInfo->GetAppId();
-                       AppLog("AppFilter - App [%ls]", appId.GetPointer());
+                       SysLog(NID_APP, "AppFilter - App [%ls]", appId.GetPointer());
 
                        if (appIdList.Contains(appId) == true)
                        {
-                               AppLog("App [%ls] is matched.", appId.GetPointer());
+                               SysLog(NID_APP, "App [%ls] is matched.", appId.GetPointer());
 
                                std::unique_ptr< PackageAppInfo > pPackageAppInfo(new (std::nothrow) PackageAppInfo);
                                SysTryReturn(NID_APP, pPackageAppInfo, null, E_OUT_OF_MEMORY, "PackageAppInfo is null.");
@@ -1166,14 +1268,14 @@ _PackageManagerImpl::GetPackageAppInfoListN(const IMap& packageFilterMap, const
                        }
                        else
                        {
-                               AppLog("App [%ls] is not matched.", pPackageAppInfo->GetAppId().GetPointer());
+                               SysLog(NID_APP, "App [%ls] is not matched.", pPackageAppInfo->GetAppId().GetPointer());
                        }
                }
        }
 
        if (pList->GetCount() <= 0)
        {
-               AppLog("pList's count is 0.");
+               SysLog(NID_APP, "pList's count is 0.");
                return null;
        }
 
@@ -1262,6 +1364,33 @@ _PackageManagerImpl::PackageAppInfoMetadataHandler(const pkgmgrinfo_appinfo_h ha
        return 0;
 }
 
+bool
+_PackageManagerImpl::IsHybridPackage(const String& filePath) const
+{
+       SysTryReturn(NID_APP, filePath.IsEmpty() == false, false, E_INVALID_ARG, "filePath is empty.");
+
+       bool res = true;
+       FileUnzipper unzipper;
+       ZipEntry zipEntry;
+
+       result r = unzipper.Construct(filePath);
+       SysTryReturn(NID_APP, !IsFailed(r), false, E_SYSTEM, "unzipper.Construct() failed.");
+
+       r = unzipper.GetEntry(L"info/manifest.xml", zipEntry);
+       if (!IsFailed(r))
+       {
+               SysLog(NID_APP, "It's hybrid package. [%ls]", filePath.GetPointer());
+               res = true;
+       }
+       else
+       {
+               SysLog(NID_APP, "It's not hybrid package. [%ls]", filePath.GetPointer());
+               res = false;
+       }
+
+       return res;
+}
+
 _PackageManagerImpl*
 _PackageManagerImpl::GetInstance(void)
 {
@@ -1677,7 +1806,7 @@ int
 _PackageManagerImpl::PackageEventHandler(int req_id, const char* pkg_type, const char* pkg_name,
                                                                                const char* key, const char* val, const void* pmsg, void* data)
 {
-       SysLog(NID_APP, "PackageEventHandler - req_id: %d, pkg_type: %s, pkg_name: %s, key: %s, val: %s", req_id, pkg_type,
+       SysLog(NID_APP, "PackageEventHandler - req: %d, pkg_type: %s, pkg_name: %s, key: %s, val: %s", req_id, pkg_type,
                                pkg_name, key, val);
 
        PackageType type = PACKAGE_TYPE_TPK;
@@ -1713,7 +1842,7 @@ _PackageManagerImpl::GetAppIdOfDataControlN(const String& providerId)
        String query;
        String* pAppId = null;
 
-       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",
+       query.Format(1024, L"SELECT AppInfo.PACKAGE_NAME FROM AppInfo, DataControl WHERE DataControl.PROVIDER_ID = '%ls' and DataControl.ID = AppInfo.UNIQUE_ID",
                        providerId.GetPointer());
 
        r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");