Add optional param in install api.
[platform/framework/native/appfw.git] / src / app / package / FAppPkg_PackageManagerImpl.cpp
index e4f72ed..398ec66 100755 (executable)
@@ -366,10 +366,13 @@ _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.");
+
+       std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(packageId));
+       SysTryReturnResult(NID_APP, pPackageId, E_OUT_OF_MEMORY, "pPackageId is null.");
 
        if ((strcasecmp(pExtension.get(), "tpk") == 0) || (strcasecmp(pExtension.get(), "wgt") == 0))
        {
@@ -395,7 +398,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(), pPackageId.get(), PM_QUIET, InstallationEventHandler, pListener);
 
        if (res < PKGMGR_R_OK)
        {
@@ -756,6 +759,7 @@ _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 (pPkgInfo->privilege_list)
                {
@@ -813,8 +817,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);
@@ -873,18 +881,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)
@@ -892,7 +890,13 @@ CATCH:
                pkgmgrinfo_pkginfo_filter_destroy(handle);
        }
 
-       return pList;
+       if (pList->GetCount() <= 0)
+       {
+               AppLog("pList's count is 0.");
+               return null;
+       }
+
+       return pList.release();
 }
 
 IList*
@@ -900,24 +904,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);
 
+       res = pkgmgrinfo_appinfo_metadata_filter_create(&metaHandle);
+       SysTryReturn(NID_APP, res == PMINFO_R_OK, null, 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());
@@ -928,7 +947,9 @@ _PackageManagerImpl::GetPackageAppInfoListN(const IMap& packageAppFilterMap) con
                }
                else if ((*pKey) == PACKAGE_APP_FILTER_CATEGORY)
                {
-                       String* pVal = static_cast<String*>(pEnum->GetValue());
+                       definedKey = 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());
@@ -941,21 +962,91 @@ _PackageManagerImpl::GetPackageAppInfoListN(const IMap& packageAppFilterMap) con
                }
                else
                {
-                       SysTryCatch(NID_APP, false, , E_INVALID_ARG, "Invalid key(%ls)", pKey->GetPointer());
+                       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_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);
                }
        }
 
-       pList = new (std::nothrow) ArrayList();
-       SysTryCatch(NID_APP, pList, , E_OUT_OF_MEMORY, "ArrayList creation failure.");
-       pList->Construct();
-
-       res = pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, PackageAppInfoHandler, pList);
-       if (res != 0)
+       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
        {
-               SysLog(NID_APP, "pkgmgrinfo_appinfo_filter_foreach_appinfo() is failed. result = [%d]", res);
+               list.Construct();
 
-               pList->RemoveAll(true);
-               pList = null;
+               res = pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, PackageAppInfoHandler, &list);
+               if (res != PMINFO_R_OK)
+               {
+                       SysLog(NID_APP, "pkgmgrinfo_appinfo_filter_foreach_appinfo() is failed. result = [%d]", res);
+                       goto CATCH;
+               }
+
+               metadataList.Construct();
+
+               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;
+               }
+
+               for (int i = 0; i < list.GetCount(); i++)
+               {
+                       PackageAppInfo* pPackageAppInfo = dynamic_cast < PackageAppInfo* >(list.GetAt(i));
+                       if (pPackageAppInfo)
+                       {
+                               AppLog("PackageAppFilter - AppId [%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)
+                               {
+                                       AppLog("AppId [%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
+                               {
+                                       AppLog("AppId [%ls] is not matched.", pPackageAppInfo->GetAppId().GetPointer());
+                               }
+                       }
+               }
        }
 
 CATCH:
@@ -964,16 +1055,102 @@ CATCH:
                pkgmgrinfo_appinfo_filter_destroy(handle);
        }
 
-       return pList;
+       if (metaHandle)
+       {
+               pkgmgrinfo_appinfo_metadata_filter_destroy(metaHandle);
+       }
+
+       if (pList->GetCount() <= 0)
+       {
+               AppLog("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)
+                                       {
+                                               AppLog("PackageFilter - AppId [%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();
+                       AppLog("AppFilter - AppId [%ls]", appId.GetPointer());
+
+                       if (appIdList.Contains(appId) == true)
+                       {
+                               AppLog("AppId [%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
+                       {
+                               AppLog("AppId [%ls] is not matched.", pPackageAppInfo->GetAppId().GetPointer());
+                       }
+               }
+       }
+
+       if (pList->GetCount() <= 0)
+       {
+               AppLog("pList's count is 0.");
+               return null;
+       }
+
+       return pList.release();
 }
 
 int
@@ -1016,6 +1193,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, "appId = [%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.");
 
@@ -1028,6 +1207,34 @@ _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, "appId = [%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;
+}
+
 _PackageManagerImpl*
 _PackageManagerImpl::GetInstance(void)
 {