metadata filter is added.
authorDuyoung Jang <duyoung.jang@samsung.com>
Wed, 3 Apr 2013 05:48:48 +0000 (14:48 +0900)
committerDuyoung Jang <duyoung.jang@samsung.com>
Wed, 3 Apr 2013 06:06:16 +0000 (15:06 +0900)
Change-Id: I46a84c23754eb9be64d28f0095fba0e7be6be62c
Signed-off-by: Duyoung Jang <duyoung.jang@samsung.com>
src/app/inc/FAppPkg_PackageManagerImpl.h
src/app/package/FAppPkg_PackageManagerImpl.cpp

index 25386d0..317a7be 100755 (executable)
@@ -141,6 +141,7 @@ public:
 
        static int PackageInfoHandler(const pkgmgrinfo_pkginfo_h handle, void* pUserData);
        static int PackageAppInfoHandler(const pkgmgrinfo_appinfo_h handle, void* pUserData);
+       static int PackageAppInfoMetadataHandler(const pkgmgrinfo_appinfo_h handle, void* pUserdata);
 
        void SendPackageEvent(PackageType type, const PackageId& packageId, const char* eventKey, const char* eventValue);
 
index 98558de..1a985af 100755 (executable)
@@ -905,20 +905,31 @@ _PackageManagerImpl::GetPackageAppInfoListN(const IMap& packageAppFilterMap) con
        SysTryReturn(NID_APP, pEnum, null, E_INVALID_ARG, "GetMapEnumeratorN() is failed.");
 
        int res = 0;
+       bool definedKey = false;
+       bool metadataKey = false;
        ArrayList* pList = null;
+       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());
@@ -929,7 +940,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());
@@ -942,21 +955,113 @@ _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();
+       if ((definedKey == true) && (metadataKey == false))
+       {
+               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)
+               res = pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, PackageAppInfoHandler, pList);
+               if (res != PMINFO_R_OK)
+               {
+                       SysLog(NID_APP, "pkgmgrinfo_appinfo_filter_foreach_appinfo() is failed. result = [%d]", res);
+
+                       pList->RemoveAll(true);
+                       pList = null;
+               }
+       }
+       else if ((definedKey == false) && (metadataKey == true))
        {
-               SysLog(NID_APP, "pkgmgrinfo_appinfo_filter_foreach_appinfo() is failed. result = [%d]", res);
+               pList = new (std::nothrow) ArrayList();
+               SysTryCatch(NID_APP, pList, , E_OUT_OF_MEMORY, "ArrayList creation failure.");
+               pList->Construct();
 
-               pList->RemoveAll(true);
-               pList = null;
+               res = pkgmgrinfo_appinfo_metadata_filter_foreach(metaHandle, PackageAppInfoMetadataHandler, pList);
+               if (res != PMINFO_R_OK)
+               {
+                       SysLog(NID_APP, "pkgmgrinfo_appinfo_metadata_filter_foreach() is failed. result = [%d]", res);
+
+                       pList->RemoveAll(true);
+                       pList = null;
+               }
+       }
+       else
+       {
+               list.Construct();
+
+               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());
+                       }
+               }
+
+               pList = new (std::nothrow) ArrayList();
+               SysTryCatch(NID_APP, pList, , E_OUT_OF_MEMORY, "ArrayList creation failure.");
+               pList->Construct();
+
+               for (int j = 0; j < metadataList.GetCount(); j++)
+               {
+                       PackageAppInfo* pPackageAppInfo = dynamic_cast < PackageAppInfo* >(metadataList.GetAt(j));
+                       if (pPackageAppInfo)
+                       {
+                               if (appIdList.Contains(pPackageAppInfo->GetAppId()) == true)
+                               {
+                                       AppLog("AppId [%ls] is matched.", pPackageAppInfo->GetAppId().GetPointer());
+
+                                       std::unique_ptr< PackageAppInfo > pPackageAppInfo(new (std::nothrow) PackageAppInfo);
+                                       SysTryCatch(NID_APP, pPackageAppInfo, , E_OUT_OF_MEMORY, "PackageAppInfo is null.");
+
+                                       _PackageAppInfoImpl* pPackageAppInfoImpl = _PackageAppInfoImpl::GetInstance(pPackageAppInfo.get());
+                                       pPackageAppInfoImpl->Construct(pPackageAppInfo->GetAppId());
+
+                                       pList->Add(pPackageAppInfo.release());
+                               }
+                               else
+                               {
+                                       AppLog("AppId [%ls] is not matched.", pPackageAppInfo->GetAppId().GetPointer());
+                               }
+                       }
+               }
        }
 
 CATCH:
@@ -965,6 +1070,10 @@ CATCH:
                pkgmgrinfo_appinfo_filter_destroy(handle);
        }
 
+       if (metaHandle)
+       {
+               pkgmgrinfo_appinfo_metadata_filter_destroy(metaHandle);
+       }
        return pList;
 }
 
@@ -1104,6 +1213,32 @@ _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);
+
+       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)
 {