Update GetPackageAppInfoListN() API.
[platform/framework/native/appfw.git] / src / app / package / FAppPkg_PackageAppInfoImpl.cpp
index 9d77809..c423671 100755 (executable)
 #include <FIoDatabase.h>
 #include <FIoDbEnumerator.h>
 #include <FIoDbStatement.h>
+#include <FIoFile.h>
 #include <FBase_StringConverter.h>
 
 #include "FAppPkg_PackageManagerImpl.h"
+#include "FApp_AppResourceImpl.h"
 #include "FApp_TemplateUtil.h"
 
 using namespace Tizen::Base;
 using namespace Tizen::Base::Collection;
+using namespace Tizen::Graphics;
 using namespace Tizen::Io;
 
 namespace Tizen { namespace App { namespace Package
@@ -122,30 +125,115 @@ _PackageAppInfoImpl::SetAppNotificationIconPath(const String& notificationIconPa
        return E_SUCCESS;
 }
 
+const String&
+_PackageAppInfoImpl::GetAppTempIconPath(void) const
+{
+       return __appTempIconPath;
+}
+
+result
+_PackageAppInfoImpl::SetAppTempIconPath(const String& tempIconPath)
+{
+       __appTempIconPath = tempIconPath;
+       return E_SUCCESS;
+}
+
+Bitmap*
+_PackageAppInfoImpl::GetAppMenuIconN(void) const
+{
+       Bitmap* pBitmap = null;
+       String iconPath;
+
+       if (__fromDatabase)
+       {
+               SysTryReturn(NID_APP, __appIconPath.IsEmpty() == false, null, E_FILE_NOT_FOUND, "appIconPath() is empty.");
+
+               iconPath = __appIconPath;
+       }
+       else
+       {
+               SysTryReturn(NID_APP, __appTempIconPath.IsEmpty() == false, null, E_FILE_NOT_FOUND, "__appTempIconPath() is empty.");
+
+               iconPath = __appTempIconPath;
+       }
+
+       SysLog(NID_APP, "iconPath = [%ls]", iconPath.GetPointer());
+
+       pBitmap = _AppResourceImpl::GetNonScalingBitmapN(iconPath);
+
+       return pBitmap;
+}
+
+HashMap*
+_PackageAppInfoImpl::GetAppMetadataListN(void) const
+{
+       HashMap* pMap = null;
+
+       if (__fromDatabase)
+       {
+               SysTryReturn(NID_APP, __pAppInfoHandle, null, E_SYSTEM, "__pAppInfoHandle is null.");
+
+               result r = E_SUCCESS;
+               int res = PMINFO_R_OK;
+
+               pMap = new (std::nothrow) HashMap();
+               SysTryReturn(NID_APP, pMap, null, E_OUT_OF_MEMORY, "ArrayList creation failure.");
+               pMap->Construct();
+
+               res = pkgmgrinfo_appinfo_foreach_metadata(__pAppInfoHandle, MetadataHandler, pMap);
+               if (res != PMINFO_R_OK)
+               {
+                       SysLog(NID_APP, "pkgmgrinfo_appinfo_foreach_metadata() is failed. result = [%d]", res);
+                       r = E_SYSTEM;
+
+                       pMap->RemoveAll(true);
+                       pMap = null;
+               }
+
+               SetLastResult(r);
+       }
+       else
+       {
+               SysLog(NID_APP, "GetAppMetadataListN() is not available.");
+       }
+
+       return pMap;
+}
+
 ArrayList*
 _PackageAppInfoImpl::GetAppCategoryListN(void) const
 {
-       SysTryReturn(NID_APP, __pAppInfoHandle, null, E_SYSTEM, "[E_SYSTEM] __pAppInfoHandle is null.");
-
-       result r = E_SUCCESS;
-       int res = PMINFO_R_OK;
        ArrayList* pList = null;
 
-       pList = new (std::nothrow) ArrayList();
-       SysTryReturn(NID_APP, pList, null, E_OUT_OF_MEMORY, "ArrayList creation failure.");
-       pList->Construct();
-
-       res = pkgmgrinfo_appinfo_foreach_category(__pAppInfoHandle, CategoryHandler, pList);
-       if (res != PMINFO_R_OK)
+       if (__fromDatabase)
        {
-               SysLog(NID_APP, "pkgmgrinfo_appinfo_foreach_category() is failed. result = [%d]", res);
-               r = E_SYSTEM;
+               SysTryReturn(NID_APP, __pAppInfoHandle, null, E_SYSTEM, "[E_SYSTEM] __pAppInfoHandle is null.");
+
+               result r = E_SUCCESS;
+               int res = PMINFO_R_OK;
 
-               pList->RemoveAll(true);
-               pList = null;
+               pList = new (std::nothrow) ArrayList();
+               SysTryReturn(NID_APP, pList, null, E_OUT_OF_MEMORY, "ArrayList creation failure.");
+               pList->Construct();
+
+               res = pkgmgrinfo_appinfo_foreach_category(__pAppInfoHandle, CategoryHandler, pList);
+               if (res != PMINFO_R_OK)
+               {
+                       SysLog(NID_APP, "pkgmgrinfo_appinfo_foreach_category() is failed. result = [%d]", res);
+                       r = E_SYSTEM;
+
+                       pList->RemoveAll(true);
+                       pList = null;
+               }
+
+               SetLastResult(r);
+
+       }
+       else
+       {
+               SysLog(NID_APP, "GetAppCategoryListN() is not available.");
        }
 
-       SetLastResult(r);
        return pList;
 }
 
@@ -175,6 +263,49 @@ _PackageAppInfoImpl::SetMainApp(bool mainApp)
        return E_SUCCESS;
 }
 
+result
+_PackageAppInfoImpl::AddCategory(String* pCategory)
+{
+       result r = E_SUCCESS;
+       r = __pAppCategoryList->Add(*pCategory);
+       SysTryReturnResult(NID_APP, !IsFailed(r), r, "__pAppCategoryList->Add() is failed.");
+
+       return r;
+}
+
+String
+_PackageAppInfoImpl::GetAppFeature(const String& key) const
+{
+       SysTryReturn(NID_APP, __appId.IsEmpty() == false, L"", E_SYSTEM, "__appId is empty.");
+
+       String value;
+       Database db;
+       String query;
+
+       query.Format(1024, L"SELECT AppFeature.VALUE FROM AppInfo, AppFeature WHERE AppFeature.ID = AppInfo.UNIQUE_ID and AppFeature.NAME = '%ls' and AppInfo.PACKAGE_NAME = '%ls'",
+                       key.GetPointer(), __appId.GetPointer());
+
+       SysLog(NID_APP, "query = [%ls]", query.GetPointer());
+
+       result r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
+       SysTryReturn(NID_APP, r == E_SUCCESS, L"", E_SYSTEM, "db.Construct() failed. [%s]", GetErrorMessage(r));
+
+       std::unique_ptr< DbStatement > pStmt(_PackageManagerImpl::CreateStatementN(db, query));
+       SysTryReturn(NID_APP, pStmt, L"", E_SYSTEM, "CreateStatementN(%ls) failed. [%s]", query.GetPointer(), GetErrorMessage(GetLastResult()));
+
+       std::unique_ptr< DbEnumerator > pEnum(_PackageManagerImpl::ExecuteStatementN(db, pStmt.get()));
+       SysTryReturn(NID_APP, pEnum, L"", E_SYSTEM, "ExecuteStatementN() failed. [%s]", GetErrorMessage(GetLastResult()));
+
+       while (pEnum->MoveNext() == E_SUCCESS)
+       {
+               pEnum->GetStringAt(0, value);
+       }
+
+       SysLog(NID_APP, "value = [%ls]", value.GetPointer());
+
+       return value;
+}
+
 _PackageAppInfoImpl*
 _PackageAppInfoImpl::GetInstance(PackageAppInfo* pPackageAppInfo)
 {
@@ -189,6 +320,8 @@ _PackageAppInfoImpl::GetInstance(PackageAppInfo* pPackageAppInfo)
 result
 _PackageAppInfoImpl::Construct(const AppId& appId)
 {
+       SysTryReturnResult(NID_APP, appId.IsEmpty() == false, E_INVALID_ARG, "appId is empty.");
+
        int res = PMINFO_R_OK;
        char* pExePath = null;
        char* pDisplayName = null;
@@ -202,7 +335,9 @@ _PackageAppInfoImpl::Construct(const AppId& appId)
        SysTryReturnResult(NID_APP, pAppId, E_OUT_OF_MEMORY, "pAppId is null");
 
        res = pkgmgrinfo_appinfo_get_appinfo(pAppId.get(), &__pAppInfoHandle);
-       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_appinfo_get_appinfo failed, res = [%d]", res);
+       SysTryReturnResult(NID_APP, res == 0, E_SYSTEM, "pkgmgrinfo_appinfo_get_appinfo failed, res = [%d], appId = [%s]", res, pAppId.get());
+
+       __fromDatabase = true;
 
        SetAppId(appId);
 
@@ -273,7 +408,7 @@ _PackageAppInfoImpl::Construct(const AppId& appId)
        {
                SysLog(NID_APP, "pkgmgrinfo_appinfo_get_notification_icon(): NotificationIcon = [%s]", pNotificationIcon);
                String notificationIcon(pNotificationIcon);
-               SetAppSettingIconPath(notificationIcon);
+               SetAppNotificationIconPath(notificationIcon);
        }
        else
        {
@@ -294,7 +429,7 @@ _PackageAppInfoImpl::Construct(const AppId& appId)
        res = pkgmgrinfo_appinfo_is_nodisplay(__pAppInfoHandle, &menuIconVisible);
        if (res == PMINFO_R_OK)
        {
-               SysLog(NID_APP, "pkgmgrinfo_appinfo_is_nodisplay(): displayName = [%d]", menuIconVisible);
+               SysLog(NID_APP, "pkgmgrinfo_appinfo_is_nodisplay(): menuIconVisible = [%d]", menuIconVisible);
                SetMenuIconVisible(!menuIconVisible);
        }
        else
@@ -321,15 +456,32 @@ _PackageAppInfoImpl::CategoryHandler(const char* pCategoryName, void* pUserData)
        return 0;
 }
 
+int
+_PackageAppInfoImpl::MetadataHandler(const char* pKey, const char* pValue, void* pUserData)
+{
+       SysTryReturn(NID_APP, pKey, 0, E_SYSTEM, "pKey must not be null.");
+       SysTryReturn(NID_APP, pValue, 0, E_SYSTEM, "pValue must not be null.");
+       SysTryReturn(NID_APP, pUserData, 0, E_SYSTEM, "pUserData must not be null.");
+
+       SysLog(NID_APP, "Key = [%s], Value = [%s]", pKey, pValue);
+
+       MultiHashMap* pMultiMap = (MultiHashMap*) pUserData;
+       pMultiMap->Add(*(new (std::nothrow) String(pKey)), *(new (std::nothrow) String(pValue)));
+
+       return 0;
+}
+
 // to be reviewed
 _PackageAppInfoImpl::_PackageAppInfoImpl(void)
        : __launchingIconVisible(true)
        , __mainApp(false)
+       , __fromDatabase(false)
        , __pLaunchConditionImplList(null)
        , __pNotificationImplList(null)
        , __pAppFeatureImplList(null)
        , __pDataControlImplList(null)
        , __pAppControlImplList(null)
+       , __pAppCategoryList(null)
        , __uniqueId(0)
        , __pkgId(0)
        , __appFeature(0)
@@ -355,6 +507,10 @@ _PackageAppInfoImpl::_PackageAppInfoImpl(void)
        SysTryReturnVoidResult(NID_APP, __pAppControlImplList != null, E_OUT_OF_MEMORY, "__pAppControlImplList instance must not be null.");
        __pAppControlImplList->Construct();
 
+       __pAppCategoryList = new (std::nothrow) ArrayList;
+       SysTryReturnVoidResult(NID_APP, __pAppCategoryList != null, E_OUT_OF_MEMORY, "__pAppCategoryList instance must not be null.");
+       __pAppCategoryList->Construct();
+
        __pNameList = new (std::nothrow) HashMap;
        SysTryReturnVoidResult(NID_APP, __pNameList != null, E_OUT_OF_MEMORY, "__pNameList instance must not be null.");
        __pNameList->Construct();
@@ -378,6 +534,9 @@ _PackageAppInfoImpl::~_PackageAppInfoImpl(void)
        __pAppControlImplList->RemoveAll(true);
        delete __pAppControlImplList;
 
+       __pAppCategoryList->RemoveAll(true);
+       delete __pAppCategoryList;
+
        __pNameList->RemoveAll(true);
        delete __pNameList;
 
@@ -385,6 +544,11 @@ _PackageAppInfoImpl::~_PackageAppInfoImpl(void)
        {
                pkgmgrinfo_appinfo_destroy_appinfo(__pAppInfoHandle);
        }
+
+       if (File::IsFileExist(__appTempIconPath) == true)
+       {
+               File::Remove(__appTempIconPath);
+       }
 }
 
 const String&
@@ -439,7 +603,7 @@ _PackageAppInfoImpl::GetLaunchConditionListN(void) const
 
        query.Format(1024, L"SELECT * FROM LaunchCondition WHERE ID = %d", GetUniqueId());
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        pStmt = db.CreateStatementN(query);
@@ -506,7 +670,7 @@ _PackageAppInfoImpl::GetNotificationListN(void) const
 
        query.Format(1024, L"SELECT * FROM Notification WHERE ID = %d", GetUniqueId());
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        pStmt = db.CreateStatementN(query);
@@ -573,7 +737,7 @@ _PackageAppInfoImpl::GetAppFeatureListN(void) const
 
        query.Format(1024, L"SELECT * FROM AppFeature WHERE ID = %d", GetUniqueId());
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        pStmt = db.CreateStatementN(query);
@@ -629,7 +793,7 @@ _PackageAppInfoImpl::GetAppFeatureMapN(void) const
 
        query.Format(1024, L"SELECT * FROM AppFeature WHERE ID = %d", GetUniqueId());
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        SysTryReturn(NID_APP, r == E_SUCCESS, null, r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        const DbStatement* pStmt = db.CreateStatementN(query);
@@ -813,7 +977,7 @@ _PackageAppInfoImpl::GetUniqueId(void) const
 
        query.Format(1024, L"SELECT UNIQUE_ID FROM AppInfo WHERE APP_NAME = '%ls' and ID = %d", __name.GetPointer(), __pkgId);
 
-       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, false);
+       r = db.Construct(PACKAGE_DATABASE_FILE_NAME, "r");
        SysTryCatch(NID_APP, r == E_SUCCESS, , r, "[%s] An error occurs while opening a database.", GetErrorMessage(r));
 
        pStmt = db.CreateStatementN(query);