Add event for storage full
[platform/framework/native/appfw.git] / src / app / package / FAppPkg_PackageManagerImpl.cpp
index aef44b2..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
@@ -75,26 +77,37 @@ _PackageManagerEvent::FireImpl(IEventListener& listener, const IEventArg& arg)
                {
                        if (pArg->__install)
                        {
-                               SysLog(NID_APP, "Installation is Completed. [PackageId = %ls]", pArg->__packageId.GetPointer());
+                               SysLog(NID_APP, "Installation is Completed. [Package = %ls]", pArg->__packageId.GetPointer());
                                pListener->OnPackageInstallationCompleted(pArg->__packageId, PACKAGE_INSTALLATION_RESULT_SUCCESS);
                        }
                        else
                        {
-                               SysLog(NID_APP, "Uninstallation is Completed. [PackageId = %ls]", pArg->__packageId.GetPointer());
+                               SysLog(NID_APP, "Uninstallation is Completed. [Package = %ls]", pArg->__packageId.GetPointer());
                                pListener->OnPackageUninstallationCompleted(pArg->__packageId, true);
                        }
                }
                else
                {
-                       if (pArg->__install)
+                       if (pArg->__install == false)
                        {
-                               SysLog(NID_APP, "Installation is Completed(Error). [PackageId = %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). [PackageId = %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);
                        }
                }
        }
@@ -131,7 +144,7 @@ _PackageManagerImpl::GetPackageIdByAppId(const AppId& appId)
                SysTryReturn(NID_APP, pAppId, L"", E_OUT_OF_MEMORY, "pAppId is null");
 
                result = pkgmgrinfo_appinfo_get_appinfo(pAppId.get(), &pAppInfoHandle);
-               SysTryReturn(NID_APP, result == 0, L"", E_PKG_NOT_INSTALLED, "pkgmgrinfo_appinfo_get_appinfo() failed. result=[%d], appId=[%s]", result, pAppId.get());
+               SysTryReturn(NID_APP, result == 0, L"", E_PKG_NOT_INSTALLED, "pkgmgrinfo_appinfo_get_appinfo() failed. result=[%d], app=[%s]", result, pAppId.get());
 
                result = pkgmgrinfo_appinfo_get_pkgname(pAppInfoHandle, &pPackageId);
 
@@ -143,7 +156,7 @@ _PackageManagerImpl::GetPackageIdByAppId(const AppId& appId)
                }
        }
 
-       SysLog(NID_APP, "appId = [%ls], packageId = [%ls]", appId.GetPointer(), packageId.GetPointer());
+       SysLog(NID_APP, "app = [%ls], package = [%ls]", appId.GetPointer(), packageId.GetPointer());
 
        return packageId;
 }
@@ -272,7 +285,7 @@ _PackageManagerImpl::GetPackageInfoN(const PackageId& packageId) const
 
        _PackageInfoImpl* pPackageInfoImpl = _PackageInfoImpl::GetInstance(pPackageInfo);
        r = pPackageInfoImpl->Construct(packageId);
-       SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[E_PKG_NOT_INSTALLED] packageId (%ls) is not found.", packageId.GetPointer());
+       SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[E_PKG_NOT_INSTALLED] package (%ls) is not found.", packageId.GetPointer());
 
        return pPackageInfo;
 
@@ -294,7 +307,7 @@ _PackageManagerImpl::GetPackageAppInfoN(const AppId& appId) const
 
        _PackageAppInfoImpl* pPackageAppInfoImpl = _PackageAppInfoImpl::GetInstance(pPackageAppInfo);
        r = pPackageAppInfoImpl->Construct(appId);
-       SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[E_PKG_NOT_INSTALLED] appId (%ls) is not found.", appId.GetPointer());
+       SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[E_PKG_NOT_INSTALLED] app (%ls) is not found.", appId.GetPointer());
 
        return pPackageAppInfo;
 
@@ -341,7 +354,7 @@ _PackageManagerImpl::IsPackageInstalled(const PackageId& packageId) const
        result = pkgmgrinfo_pkginfo_get_pkginfo(pPackageId.get(), &pPackageInfoHandle);
        if (result != 0)
        {
-               SysLog(NID_APP, "pkgmgrinfo_pkginfo_get_pkginfo() failed. result=[%d], packageId=[%s]", result, pPackageId.get());
+               SysLog(NID_APP, "pkgmgrinfo_pkginfo_get_pkginfo() failed. result=[%d], package=[%s]", result, pPackageId.get());
                return false;
        }
 
@@ -350,7 +363,7 @@ _PackageManagerImpl::IsPackageInstalled(const PackageId& packageId) const
                pkgmgrinfo_pkginfo_destroy_pkginfo(pPackageInfoHandle);
        }
 
-       SysLog(NID_APP, "packageId = [%ls] is installed.", packageId.GetPointer());
+       SysLog(NID_APP, "package = [%ls] is installed.", packageId.GetPointer());
 
        return true;
 }
@@ -366,14 +379,14 @@ _PackageManagerImpl::InstallPackage(const PackageId& packageId, const String& pa
        SysTryReturnResult(NID_APP, extension.IsEmpty() == false, E_INVALID_ARG, "extension is empty.");
 
        std::unique_ptr<char[]> pPackagePath(_StringConverter::CopyToCharArrayN(packagePath));
-       SysTryReturnResult(NID_APP, pPackagePath, E_OUT_OF_MEMORY, "pPackagePath is null");
+       SysTryReturnResult(NID_APP, pPackagePath, E_OUT_OF_MEMORY, "pPackagePath is null.");
 
        std::unique_ptr<char[]> pExtension(_StringConverter::CopyToCharArrayN(extension));
-       SysTryReturnResult(NID_APP, pExtension, E_OUT_OF_MEMORY, "pExtension is null");
+       SysTryReturnResult(NID_APP, pExtension, E_OUT_OF_MEMORY, "pExtension is null.");
 
        if ((strcasecmp(pExtension.get(), "tpk") == 0) || (strcasecmp(pExtension.get(), "wgt") == 0))
        {
-               SysLog(NID_APP, "packageId = [%ls], packagePath = [%s], extension = [%s]", packageId.GetPointer(), pPackagePath.get(), pExtension.get());
+               SysLog(NID_APP, "package = [%ls], packagePath = [%s], extension = [%s]", packageId.GetPointer(), pPackagePath.get(), pExtension.get());
        }
        else
        {
@@ -381,6 +394,15 @@ _PackageManagerImpl::InstallPackage(const PackageId& packageId, const String& pa
                return E_SYSTEM;
        }
 
+       // optionalData = 12345abcde
+       String optionalData;
+       optionalData.Append(packageId);
+
+       std::unique_ptr<char[]> pOptionalData(_StringConverter::CopyToCharArrayN(optionalData));
+       SysTryReturnResult(NID_APP, pOptionalData, E_OUT_OF_MEMORY, "pOptionalData is null.");
+
+       SysLog(NID_APP, "optionalData = [%s]", pOptionalData.get());
+
        result r = E_SUCCESS;
        _PackageManagerProxy packageManagerProxy;
        r = packageManagerProxy.Construct();
@@ -395,7 +417,7 @@ _PackageManagerImpl::InstallPackage(const PackageId& packageId, const String& pa
                SysTryReturnResult(NID_APP, __pRequestClient != null, E_SYSTEM, "pkgmgr_client_new(PC_REQUEST) failed");
        }
 
-       int res = pkgmgr_client_install(__pRequestClient, pExtension.get(), null, pPackagePath.get(), null, PM_QUIET, InstallationEventHandler, pListener);
+       int res = pkgmgr_client_install(__pRequestClient, pExtension.get(), null, pPackagePath.get(), pOptionalData.get(), PM_QUIET, InstallationEventHandler, pListener);
 
        if (res < PKGMGR_R_OK)
        {
@@ -453,10 +475,10 @@ _PackageManagerImpl::UninstallPackage(const PackageId& packageId, IPackageUninst
        SysTryReturnResult(NID_APP, pPackageId != null, E_OUT_OF_MEMORY, "pPackageId is null");
 
        res = pkgmgrinfo_pkginfo_get_pkginfo(pPackageId.get(), &pPackageInfoHandle);
-       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_pkginfo_get_pkginfo() failed. result=[%d], packageId=[%s]", res, pPackageId.get());
+       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_pkginfo_get_pkginfo() failed. result=[%d], package=[%s]", res, pPackageId.get());
 
        res = pkgmgrinfo_pkginfo_get_type(pPackageInfoHandle, &pType);
-       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_pkginfo_get_type() failed. result=[%d], packageId=[%s]", res, pPackageId.get());
+       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_pkginfo_get_type() failed. result=[%d], package=[%s]", res, pPackageId.get());
 
        if (__pRequestClient == null)
        {
@@ -465,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], packageId=[%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)
        {
@@ -520,13 +542,13 @@ _PackageManagerImpl::MoveToExternalStorage(const PackageId& packageId)
        SysTryReturnResult(NID_APP, pPackageId != null, E_OUT_OF_MEMORY, "pPackageId is null");
 
        res = pkgmgrinfo_pkginfo_get_pkginfo(pPackageId.get(), &packageInfoHandle);
-       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_pkginfo_get_pkginfo() failed. result=[%d], packageId=[%s]", res, pPackageId.get());
+       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_pkginfo_get_pkginfo() failed. result=[%d], package=[%s]", res, pPackageId.get());
 
        res = pkgmgrinfo_pkginfo_get_type(packageInfoHandle, &pType);
-       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_pkginfo_get_type() failed. result=[%d], packageId=[%s]", res, pPackageId.get());
+       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_pkginfo_get_type() failed. result=[%d], package=[%s]", res, pPackageId.get());
 
        res = pkgmgrinfo_pkginfo_get_installed_storage(packageInfoHandle, &storage);
-       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_pkginfo_get_installed_storage() failed. result=[%d], packageId=[%s]", res, pPackageId.get());
+       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_pkginfo_get_installed_storage() failed. result=[%d], package=[%s]", res, pPackageId.get());
 
        if (storage == PMINFO_EXTERNAL_STORAGE)
        {
@@ -540,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);
        }
@@ -587,13 +610,13 @@ _PackageManagerImpl::MoveToInternalStorage(const PackageId& packageId)
        SysTryReturnResult(NID_APP, pPackageId != null, E_OUT_OF_MEMORY, "pPackageId is null");
 
        res = pkgmgrinfo_pkginfo_get_pkginfo(pPackageId.get(), &packageInfoHandle);
-       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_pkginfo_get_pkginfo() failed. result=[%d], packageId=[%s]", res, pPackageId.get());
+       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_pkginfo_get_pkginfo() failed. result=[%d], package=[%s]", res, pPackageId.get());
 
        res = pkgmgrinfo_pkginfo_get_type(packageInfoHandle, &pType);
-       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_pkginfo_get_type() failed. result=[%d], packageId=[%s]", res, pPackageId.get());
+       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_pkginfo_get_type() failed. result=[%d], package=[%s]", res, pPackageId.get());
 
        res = pkgmgrinfo_pkginfo_get_installed_storage(packageInfoHandle, &storage);
-       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_pkginfo_get_installed_storage() failed. result=[%d], packageId=[%s]", res, pPackageId.get());
+       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_pkginfo_get_installed_storage() failed. result=[%d], package=[%s]", res, pPackageId.get());
 
        if (storage == PMINFO_INTERNAL_STORAGE)
        {
@@ -607,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);
        }
@@ -642,7 +666,7 @@ _PackageManagerImpl::MoveToInternalStorage(const PackageId& packageId)
 int
 _PackageManagerImpl::InstallationEventHandler(int reqId, const char* pType, const char* pPackageId, const char* pKey, const char* pVal, const void* pMsg, void* pData)
 {
-       SysLog(NID_APP, "reqId[%d], Type[%s], PackageId[%s], Key[%s], Val[%s]", reqId, pType, pPackageId, pKey, pVal);
+       SysLog(NID_APP, "reqId[%d], Type[%s], Package[%s], Key[%s], Val[%s]", reqId, pType, pPackageId, pKey, pVal);
 
        if (pData)
        {
@@ -655,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)
                {
@@ -679,7 +711,7 @@ _PackageManagerImpl::InstallationEventHandler(int reqId, const char* pType, cons
 int
 _PackageManagerImpl::UninstallationEventHandler(int reqId, const char* pType, const char* pPackageId, const char* pKey, const char* pVal, const void* pMsg, void* pData)
 {
-       SysLog(NID_APP, "reqId[%d], Type[%s], PackageId[%s], Key[%s], Val[%s]", reqId, pType, pPackageId, pKey, pVal);
+       SysLog(NID_APP, "reqId[%d], Type[%s], Package[%s], Key[%s], Val[%s]", reqId, pType, pPackageId, pKey, pVal);
 
        if (pData)
        {
@@ -747,7 +779,8 @@ _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)", pPkgInfo->pkgid, pPkgInfo->version, pPkgInfo->label, pPkgInfo->pkg_description, pPkgInfo->author);
+               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);
                pPackageInfoImpl->SetId(pPkgInfo->pkgid);
@@ -755,6 +788,34 @@ _PackageManagerImpl::GetPackageInfoFromFileN(const String& filePath) const
                pPackageInfoImpl->SetDisplayName(pPkgInfo->label);
                pPackageInfoImpl->SetDescription(pPkgInfo->pkg_description);
                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)
                {
@@ -774,17 +835,27 @@ _PackageManagerImpl::GetPackageInfoFromFileN(const String& filePath) const
                }
 
                std::unique_ptr< PackageAppInfo > pPackageAppInfo(new (std::nothrow) PackageAppInfo);
-               SysTryReturn(NID_APP, pPackageAppInfo, null, E_OUT_OF_MEMORY, "pPackageAppInfo instance must not be null.");
-
-               _PackageAppInfoImpl* pPackageAppInfoImpl = _PackageAppInfoImpl::GetInstance(pPackageAppInfo.get());
+               if (pPackageAppInfo)
+               {
+                       _PackageAppInfoImpl* pPackageAppInfoImpl = _PackageAppInfoImpl::GetInstance(pPackageAppInfo.get());
 
-               pPackageAppInfoImpl->SetAppId(pPkgInfo->pkg_name);
-               pPackageAppInfoImpl->SetAppName(pPkgInfo->label);
-               pPackageAppInfoImpl->SetAppDisplayName(pPkgInfo->label);
-               pPackageAppInfoImpl->SetMainApp(true);
-               // icon - pPkgInfo->icon_buf
+                       pPackageAppInfoImpl->SetAppId(pPkgInfo->pkg_name);
+                       pPackageAppInfoImpl->SetAppName(pPkgInfo->label);
+                       pPackageAppInfoImpl->SetAppDisplayName(pPkgInfo->label);
+                       pPackageAppInfoImpl->SetMainApp(true);
+                       if ((pPkgInfo->icon_buf) && (pPkgInfo->icon_size > 0))
+                       {
+                               pPackageAppInfoImpl->SetAppMenuIconBuffer(pPkgInfo->icon_buf, pPkgInfo->icon_size);
+                       }
 
-               pPackageInfoImpl->AddPackageAppInfo(*pPackageAppInfo.release());
+                       pPackageInfoImpl->AddPackageAppInfo(*pPackageAppInfo.release());
+               }
+               else
+               {
+                       SysLog(NID_APP, "pPackageAppInfo instance must not be null.");
+                       pkgmgr_client_free_pkginfo(pPkgmgrInfo);
+                       return null;
+               }
 
                pkgmgr_client_free_pkginfo(pPkgmgrInfo);
        }
@@ -804,8 +875,12 @@ _PackageManagerImpl::GetPackageInfoListN(const IMap& packageFilterMap) const
        std::unique_ptr<IMapEnumerator> pEnum(packageFilterMap.GetMapEnumeratorN());
        SysTryReturn(NID_APP, pEnum, null, E_INVALID_ARG, "GetMapEnumeratorN() is failed.");
 
-       int res = 0;
-       ArrayList* pList = null;
+       std::unique_ptr< ArrayList > pList(new (std::nothrow) ArrayList());
+       SysTryReturn(NID_APP, pList, null, E_OUT_OF_MEMORY, "pList is null.");
+
+       pList->Construct();
+
+       int res = PMINFO_R_OK;
        pkgmgrinfo_pkginfo_filter_h handle = null;
 
        res = pkgmgrinfo_pkginfo_filter_create(&handle);
@@ -838,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;
@@ -864,18 +946,8 @@ _PackageManagerImpl::GetPackageInfoListN(const IMap& packageFilterMap) const
                }
        }
 
-       pList = new (std::nothrow) ArrayList();
-       SysTryCatch(NID_APP, pList, , E_OUT_OF_MEMORY, "ArrayList creation failure.");
-       pList->Construct();
-
-       res = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(handle, PackageInfoHandler, pList);
-       if (res != 0)
-       {
-               SysLog(NID_APP, "pkgmgrinfo_pkginfo_filter_foreach_pkginfo() is failed. result = [%d]", res);
-
-               pList->RemoveAll(true);
-               pList = null;
-       }
+       res = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(handle, PackageInfoHandler, pList.get());
+       SysTryCatch(NID_APP, res == PMINFO_R_OK, , E_SYSTEM, "pkgmgrinfo_pkginfo_filter_foreach_pkginfo() failed. [%d]", res);
 
 CATCH:
        if (handle)
@@ -883,7 +955,13 @@ CATCH:
                pkgmgrinfo_pkginfo_filter_destroy(handle);
        }
 
-       return pList;
+       if (pList->GetCount() <= 0)
+       {
+               SysLog(NID_APP, "pList's count is 0.");
+               return null;
+       }
+
+       return pList.release();
 }
 
 IList*
@@ -891,24 +969,39 @@ _PackageManagerImpl::GetPackageAppInfoListN(const IMap& packageAppFilterMap) con
 {
        SysTryReturn(NID_APP, packageAppFilterMap.GetCount() > 0, null, E_INVALID_ARG, "packageAppFilterMap.GetCount() is invalid.");
 
-       std::unique_ptr<IMapEnumerator> pEnum(packageAppFilterMap.GetMapEnumeratorN());
+       std::unique_ptr< IMapEnumerator > pEnum(packageAppFilterMap.GetMapEnumeratorN());
        SysTryReturn(NID_APP, pEnum, null, E_INVALID_ARG, "GetMapEnumeratorN() is failed.");
 
+       std::unique_ptr< ArrayList > pList(new (std::nothrow) ArrayList());
+       SysTryReturn(NID_APP, pList, null, E_OUT_OF_MEMORY, "pList is null.");
+
+       pList->Construct();
+
        int res = 0;
-       ArrayList* pList = null;
+       bool definedKey = false;
+       bool metadataKey = false;
+       ArrayList list;
+       ArrayList metadataList;
+       ArrayList appIdList;
        pkgmgrinfo_appinfo_filter_h handle = null;
+       pkgmgrinfo_appinfo_metadata_filter_h metaHandle = null;
 
        res = pkgmgrinfo_appinfo_filter_create(&handle);
-       SysTryReturn(NID_APP, res == PMINFO_R_OK, null, E_SYSTEM, "pkgmgrinfo_appinfo_filter_create() is failed. [%d]", res);
+       SysTryCatch(NID_APP, res == PMINFO_R_OK, , E_SYSTEM, "pkgmgrinfo_appinfo_filter_create() is failed. [%d]", res);
+
+       res = pkgmgrinfo_appinfo_metadata_filter_create(&metaHandle);
+       SysTryCatch(NID_APP, res == PMINFO_R_OK, , E_SYSTEM, "pkgmgrinfo_appinfo_metadata_filter_create() is failed. [%d]", res);
 
        while(pEnum->MoveNext() == E_SUCCESS)
        {
-               String* pKey = static_cast<String*>(pEnum->GetKey());
+               String* pKey = static_cast< String* >(pEnum->GetKey());
                SysTryCatch(NID_APP, pKey, , E_INVALID_ARG, "GetKey() is failed.");
 
                if ((*pKey) == PACKAGE_APP_FILTER_MENUICON_VISIBLE)
                {
-                       Boolean* pVal = static_cast<Boolean*>(pEnum->GetValue());
+                       definedKey = true;
+
+                       Boolean* pVal = static_cast< Boolean* >(pEnum->GetValue());
                        SysTryCatch(NID_APP, pVal, , E_INVALID_ARG, "GetValue() is failed.");
 
                        bool nodisplay = !(pVal->ToBool());
@@ -917,36 +1010,172 @@ _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);
                }
-               else if ((*pKey) == PACKAGE_APP_FILTER_CATEGORY)
+#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)
                {
-                       String* pVal = static_cast<String*>(pEnum->GetValue());
+                       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)
+               {
+                       definedKey = true;
+
+                       std::unique_ptr<char[]> pDefinedKey(_StringConverter::CopyToCharArrayN(*pKey));
+                       SysTryCatch(NID_APP, pDefinedKey, , E_OUT_OF_MEMORY, "pDefinedKey is null.");
+
+                       Boolean* pVal = static_cast< Boolean* >(pEnum->GetValue());
+                       SysTryCatch(NID_APP, pVal, , E_INVALID_ARG, "GetValue() is failed.");
+
+                       SysLog(NID_APP, "Key[%ls], Value[%d]", pKey->GetPointer(), pVal->ToBool());
+                       SysTryCatch(NID_APP, pVal->ToBool() == true, , E_INVALID_ARG, "Value(false) is not allowed.");
+
+                       res = pkgmgrinfo_appinfo_filter_add_string(handle, PMINFO_APPINFO_PROP_APP_CATEGORY, pDefinedKey.get());
+                       SysTryCatch(NID_APP, res == PMINFO_R_OK, , E_SYSTEM, "pkgmgrinfo_appinfo_filter_add_string(CATEGORY, %s) is failed. [%d]", pDefinedKey.get(), res);
+               }
+               else
+               {
+                       metadataKey = true;
+
+                       String* pVal = static_cast< String* >(pEnum->GetValue());
                        SysTryCatch(NID_APP, pVal, , E_INVALID_ARG, "GetValue() is failed.");
 
                        SysLog(NID_APP, "Key[%ls], Value[%ls]", pKey->GetPointer(), pVal->GetPointer());
 
+                       std::unique_ptr<char[]> pMetaKey(_StringConverter::CopyToCharArrayN(*pKey));
+                       SysTryCatch(NID_APP, pMetaKey, , E_OUT_OF_MEMORY, "pMetaKey is null.");
+
                        std::unique_ptr<char[]> pValue(_StringConverter::CopyToCharArrayN(*pVal));
                        SysTryCatch(NID_APP, pValue, , E_OUT_OF_MEMORY, "pValue is null.");
 
-                       res = pkgmgrinfo_appinfo_filter_add_string(handle, PMINFO_APPINFO_PROP_APP_CATEGORY, pValue.get());
-                       SysTryCatch(NID_APP, res == PMINFO_R_OK, , E_SYSTEM, "pkgmgrinfo_appinfo_filter_add_string(CATEGORY, %s) is failed. [%d]", pValue.get(), res);
+                       if ((*pVal) == L"*")
+                       {
+                               res = pkgmgrinfo_appinfo_metadata_filter_add(metaHandle, pMetaKey.get(), null);
+                               SysTryCatch(NID_APP, res == PMINFO_R_OK, , E_SYSTEM, "pkgmgrinfo_appinfo_metadata_filter_add(%s, null) is failed. [%d]", pMetaKey.get(), res);
+                       }
+                       else
+                       {
+                               res = pkgmgrinfo_appinfo_metadata_filter_add(metaHandle, pMetaKey.get(), pValue.get());
+                               SysTryCatch(NID_APP, res == PMINFO_R_OK, , E_SYSTEM, "pkgmgrinfo_appinfo_metadata_filter_add(%s, %s) is failed. [%d]", pMetaKey.get(), pValue.get(), res);
+                       }
                }
-               else
+       }
+
+       if ((definedKey == true) && (metadataKey == false))
+       {
+               res = pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, PackageAppInfoHandler, pList.get());
+               SysTryCatch(NID_APP, res == PMINFO_R_OK, , E_SYSTEM, "pkgmgrinfo_appinfo_filter_foreach_appinfo() failed. [%d]", res);
+       }
+       else if ((definedKey == false) && (metadataKey == true))
+       {
+               res = pkgmgrinfo_appinfo_metadata_filter_foreach(metaHandle, PackageAppInfoMetadataHandler, pList.get());
+               SysTryCatch(NID_APP, res == PMINFO_R_OK, , E_SYSTEM, "pkgmgrinfo_appinfo_metadata_filter_foreach() failed. [%d]", res);
+       }
+       else
+       {
+               list.Construct();
+
+               res = pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, PackageAppInfoHandler, &list);
+               if (res != PMINFO_R_OK)
                {
-                       SysTryCatch(NID_APP, false, , E_INVALID_ARG, "Invalid key(%ls)", pKey->GetPointer());
+                       SysLog(NID_APP, "pkgmgrinfo_appinfo_filter_foreach_appinfo() is failed. result = [%d]", res);
+                       goto CATCH;
                }
-       }
 
-       pList = new (std::nothrow) ArrayList();
-       SysTryCatch(NID_APP, pList, , E_OUT_OF_MEMORY, "ArrayList creation failure.");
-       pList->Construct();
+               metadataList.Construct();
 
-       res = pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, PackageAppInfoHandler, pList);
-       if (res != 0)
-       {
-               SysLog(NID_APP, "pkgmgrinfo_appinfo_filter_foreach_appinfo() is failed. result = [%d]", res);
+               res = pkgmgrinfo_appinfo_metadata_filter_foreach(metaHandle, PackageAppInfoMetadataHandler, &metadataList);
+               if (res != PMINFO_R_OK)
+               {
+                       SysLog(NID_APP, "pkgmgrinfo_appinfo_metadata_filter_foreach() is failed. result = [%d]", res);
+                       goto CATCH;
+               }
 
-               pList->RemoveAll(true);
-               pList = null;
+               for (int i = 0; i < list.GetCount(); i++)
+               {
+                       PackageAppInfo* pPackageAppInfo = dynamic_cast < PackageAppInfo* >(list.GetAt(i));
+                       if (pPackageAppInfo)
+                       {
+                               SysLog(NID_APP, "PackageAppFilter - App [%ls]", pPackageAppInfo->GetAppId().GetPointer());
+
+                               std::unique_ptr< AppId > pAppId(new (std::nothrow) AppId(pPackageAppInfo->GetAppId()));
+                               appIdList.Add(pAppId.release());
+                       }
+               }
+
+               for (int j = 0; j < metadataList.GetCount(); j++)
+               {
+                       PackageAppInfo* pPackageAppInfo = dynamic_cast < PackageAppInfo* >(metadataList.GetAt(j));
+                       if (pPackageAppInfo)
+                       {
+                               AppId appId = pPackageAppInfo->GetAppId();
+
+                               if (appIdList.Contains(appId) == true)
+                               {
+                                       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.");
+
+                                       _PackageAppInfoImpl* pPackageAppInfoImpl = _PackageAppInfoImpl::GetInstance(pAppInfo.get());
+                                       pPackageAppInfoImpl->Construct(appId);
+
+                                       pList->Add(pAppInfo.release());
+                               }
+                               else
+                               {
+                                       SysLog(NID_APP, "App [%ls] is not matched.", pPackageAppInfo->GetAppId().GetPointer());
+                               }
+                       }
+               }
        }
 
 CATCH:
@@ -955,16 +1184,102 @@ CATCH:
                pkgmgrinfo_appinfo_filter_destroy(handle);
        }
 
-       return pList;
+       if (metaHandle)
+       {
+               pkgmgrinfo_appinfo_metadata_filter_destroy(metaHandle);
+       }
+
+       if (pList->GetCount() <= 0)
+       {
+               SysLog(NID_APP, "pList's count is 0.");
+               return null;
+       }
+
+       return pList.release();
 }
 
 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.");
+       SysTryReturn(NID_APP, packageFilterMap.GetCount() > 0, null, E_INVALID_ARG, "packageFilterMap Count is invalid.");
+       SysTryReturn(NID_APP, packageAppFilterMap.GetCount() > 0, null, E_INVALID_ARG, "packageAppFilterMap Count is invalid.");
 
-       return null;
+       ArrayList appIdList;
+
+       std::unique_ptr< IList > pPackageFilterList(GetPackageInfoListN(packageFilterMap));
+       if (pPackageFilterList == null)
+       {
+               SysLog(NID_APP, "GetPackageInfoListN(packageFilterMap) is null.");
+               return null;
+       }
+
+       for (int i = 0; i < pPackageFilterList->GetCount(); i++)
+       {
+               PackageInfo* pPackageInfo = dynamic_cast < PackageInfo* >(pPackageFilterList->GetAt(i));
+               if (pPackageInfo)
+               {
+                       std::unique_ptr< IList > pPackageAppInfoList(pPackageInfo->GetPackageAppInfoListN());
+                       if (pPackageAppInfoList)
+                       {
+                               for (int j = 0; j < pPackageAppInfoList->GetCount(); j++)
+                               {
+                                       PackageAppInfo* pPackageAppInfo = dynamic_cast < PackageAppInfo* >(pPackageAppInfoList->GetAt(j));
+                                       if (pPackageAppInfo)
+                                       {
+                                               SysLog(NID_APP, "PackageFilter - App [%ls]", pPackageAppInfo->GetAppId().GetPointer());
+
+                                               std::unique_ptr< AppId > pAppId(new (std::nothrow) AppId(pPackageAppInfo->GetAppId()));
+                                               appIdList.Add(pAppId.release());
+                                       }
+                               }
+                       }
+               }
+       }
+
+       std::unique_ptr< ArrayList > pList(new (std::nothrow) ArrayList);
+       SysTryReturn(NID_APP, pList, null, E_OUT_OF_MEMORY, "pList is null.");
+
+       std::unique_ptr< IList > pAppFilterList(GetPackageAppInfoListN(packageAppFilterMap));
+       if (pAppFilterList == null)
+       {
+               SysLog(NID_APP, "GetPackageAppInfoListN(packageAppFilterMap) is null.");
+               return null;
+       }
+
+       for (int k = 0; k < pAppFilterList->GetCount(); k++)
+       {
+               PackageAppInfo* pPackageAppInfo = dynamic_cast < PackageAppInfo* >(pAppFilterList->GetAt(k));
+               if (pPackageAppInfo)
+               {
+                       AppId appId = pPackageAppInfo->GetAppId();
+                       SysLog(NID_APP, "AppFilter - App [%ls]", appId.GetPointer());
+
+                       if (appIdList.Contains(appId) == true)
+                       {
+                               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.");
+
+                               _PackageAppInfoImpl* pPackageAppInfoImpl = _PackageAppInfoImpl::GetInstance(pPackageAppInfo.get());
+                               pPackageAppInfoImpl->Construct(appId);
+
+                               pList->Add(pPackageAppInfo.release());
+                       }
+                       else
+                       {
+                               SysLog(NID_APP, "App [%ls] is not matched.", pPackageAppInfo->GetAppId().GetPointer());
+                       }
+               }
+       }
+
+       if (pList->GetCount() <= 0)
+       {
+               SysLog(NID_APP, "pList's count is 0.");
+               return null;
+       }
+
+       return pList.release();
 }
 
 int
@@ -1007,6 +1322,8 @@ _PackageManagerImpl::PackageAppInfoHandler(const pkgmgrinfo_appinfo_h handle, vo
        res = pkgmgrinfo_appinfo_get_appid(handle, &pAppId);
        SysTryReturn(NID_APP, res == PMINFO_R_OK, 0, E_SYSTEM, "pkgmgrinfo_appinfo_get_appid is failed. [%d]", res);
 
+       SysLog(NID_APP, "app = [%s]", pAppId);
+
        std::unique_ptr<PackageAppInfo> pPackageAppInfo(new (std::nothrow) PackageAppInfo);
        SysTryReturn(NID_APP, pPackageAppInfo, 0, E_OUT_OF_MEMORY, "pPackageAppInfo instance must not be null.");
 
@@ -1019,6 +1336,61 @@ _PackageManagerImpl::PackageAppInfoHandler(const pkgmgrinfo_appinfo_h handle, vo
        return 0;
 }
 
+int
+_PackageManagerImpl::PackageAppInfoMetadataHandler(const pkgmgrinfo_appinfo_h handle, void* pUserData)
+{
+       SysTryReturn(NID_APP, handle, 0, E_SYSTEM, "handle must not be null.");
+       SysTryReturn(NID_APP, pUserData, 0, E_SYSTEM, "pUserData must not be null.");
+
+       result r = E_SUCCESS;
+       int res = PMINFO_R_OK;
+       char* pAppId = null;
+       ArrayList* pList = (ArrayList*)pUserData;
+
+       res = pkgmgrinfo_appinfo_get_appid(handle, &pAppId);
+       SysTryReturn(NID_APP, res == PMINFO_R_OK, 0, E_SYSTEM, "pkgmgrinfo_appinfo_get_appid is failed. [%d]", res);
+
+       SysLog(NID_APP, "app = [%s]", pAppId);
+
+       std::unique_ptr< PackageAppInfo > pPackageAppInfo(new (std::nothrow) PackageAppInfo);
+       SysTryReturn(NID_APP, pPackageAppInfo, 0, E_OUT_OF_MEMORY, "pPackageAppInfo instance must not be null.");
+
+       _PackageAppInfoImpl* pPackageAppInfoImpl = _PackageAppInfoImpl::GetInstance(pPackageAppInfo.get());
+       r = pPackageAppInfoImpl->Construct(pAppId);
+       SysTryReturn(NID_APP, r == E_SUCCESS, 0, E_SYSTEM, "Construct(%s) is failed.", pAppId);
+
+       pList->Add(*pPackageAppInfo.release());
+
+       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)
 {
@@ -1117,7 +1489,7 @@ _PackageManagerImpl::SendPackageEvent(PackageType type, const PackageId& package
                                SysLog(NID_APP, "pEvent->Fire(*pEventArg) failed. [%s]", GetErrorMessage(r));
                        }
 
-                       SysLog(NID_APP, "PackageId = [%ls], Key = [%ls], Value = [%ls], install = [%d]", pEventArg->__packageId.GetPointer(), pEventArg->__eventKey.GetPointer(), pEventArg->__eventValue.GetPointer(), pEventArg->__install);
+                       SysLog(NID_APP, "Package = [%ls], Key = [%ls], Value = [%ls], install = [%d]", pEventArg->__packageId.GetPointer(), pEventArg->__eventKey.GetPointer(), pEventArg->__eventValue.GetPointer(), pEventArg->__install);
                }
                else
                {
@@ -1219,14 +1591,15 @@ _PackageManagerImpl::PackageInfoEventHandler(const pkgmgrinfo_pkginfo_h handle,
 {
        SysTryReturn(NID_APP, handle != null, 0, E_SYSTEM, "[E_SYSTEM] handle must not be null.");
 
+       result r = E_SUCCESS;
        int result = 0;
        char* pPackage = null;
        ArrayList* pList = (ArrayList*)pUserData;
 
-       PackageInfo *pPackageInfo = new (std::nothrow) PackageInfo;
-       SysTryReturn(NID_APP, pPackageInfo != null, 0, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] pPackageInfo instance must not be null.");
+       std::unique_ptr< PackageInfo > pPackageInfo(new (std::nothrow) PackageInfo);
+       SysTryReturn(NID_APP, pPackageInfo, null, E_OUT_OF_MEMORY, "pPackageInfo instance must not be null.");
 
-       _PackageInfoImpl* pPackageInfoImpl = _PackageInfoImpl::GetInstance(pPackageInfo);
+       _PackageInfoImpl* pPackageInfoImpl = _PackageInfoImpl::GetInstance(pPackageInfo.get());
 
        result = pkgmgrinfo_pkginfo_get_pkgname(handle, &pPackage);
        if (result == 0)
@@ -1238,8 +1611,11 @@ _PackageManagerImpl::PackageInfoEventHandler(const pkgmgrinfo_pkginfo_h handle,
                SysLog(NID_APP, "pkgmgrinfo_pkginfo_get_pkgname() is failed. result = [%d]", result);
        }
 
-       pPackageInfoImpl->Construct(pPackage);
-       pList->Add(*pPackageInfo);
+       r = pPackageInfoImpl->Construct(pPackage);
+       SysTryReturn(NID_APP, r == E_SUCCESS, -1, E_SYSTEM, "pPackageInfoImpl->Construct() failed.");
+
+       r = pList->Add(*pPackageInfo.release());
+       SysTryReturn(NID_APP, r == E_SUCCESS, -1, E_SYSTEM, "pList->Add() failed.");
 
        return result;
 }
@@ -1416,7 +1792,7 @@ _PackageManagerImpl::IsAppInstalled(const AppId& appId)
        SysTryReturn(NID_APP, pPackageId, false, E_OUT_OF_MEMORY, "pPackageId is null");
 
        result = pkgmgrinfo_pkginfo_get_pkginfo(pPackageId.get(), &pPackageInfoHandle);
-       SysTryReturn(NID_APP, result == 0, false, E_APP_NOT_INSTALLED, "pkgmgrinfo_pkginfo_get_pkginfo() failed. result=[%d], packageId=[%s]", result, pPackageId.get());
+       SysTryReturn(NID_APP, result == 0, false, E_APP_NOT_INSTALLED, "pkgmgrinfo_pkginfo_get_pkginfo() failed. result=[%d], package=[%s]", result, pPackageId.get());
 
        if(pPackageInfoHandle)
        {
@@ -1430,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;
@@ -1466,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");