Fix : Search APIs don't return exception despite the content in DB doesn't match...
[platform/framework/native/content.git] / src / FCnt_PlayListImpl.cpp
index b1ac0fe..ec682e2 100644 (file)
  * This file contains implementation of the %_PlayListImpl class.
  */
 
+#include <new>
 #include <FBaseSysLog.h>
 #include <FBaseInteger.h>
 #include <FBaseLongLong.h>
 #include <FBaseFloat.h>
 #include <FCntPlayList.h>
 #include <FBase_StringConverter.h>
-#include <FCnt_PlayListImpl.h>
-#include <FCnt_ContentUtility.h>
+#include "FCnt_PlayListImpl.h"
+#include "FCnt_ContentUtility.h"
+#include "FCnt_ImageContentInfoImpl.h"
+#include "FCnt_AudioContentInfoImpl.h"
+#include "FCnt_VideoContentInfoImpl.h"
+#include "FCnt_OtherContentInfoImpl.h"
+#include "FCnt_ContentInfoHelper.h"
 
 using namespace Tizen::Base;
 using namespace Tizen::Base::Collection;
@@ -45,8 +51,7 @@ namespace Tizen { namespace Content
        bool PlaylistItemsCb(int playlistId, media_info_h media, void *pUserData);
 
 _PlayListImpl::_PlayListImpl(void)
-       : Object()
-       , __pFilterHandle(NULL)
+       : __pFilterHandle(NULL)
        , __playListName(L"")
 {
 
@@ -90,14 +95,16 @@ _PlayListImpl::Construct(const Tizen::Base::String& playListName, bool isAdd)
 
        if (isAdd == true)
        {
-               std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlaylistHandle;
-
                std::unique_ptr<char[]> pInputCond(_StringConverter::CopyToCharArrayN(playListName));
                SysTryReturnResult(NID_CNT, pInputCond, E_OUT_OF_MEMORY, "The memory is insufficient.");
 
-               media_playlist_h tempHandle = pPlaylistHandle.get();
+               media_playlist_h tempHandle = null;
                ret = media_playlist_insert_to_db(pInputCond.get(), &tempHandle);
                r = MapCoreErrorToNativeResult(ret);
+               SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_playlist_insert_to_db operation.");
+
+               std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlaylistHandle(tempHandle);
+               SysTryReturnResult(NID_CNT, pPlaylistHandle != null, E_OUT_OF_MEMORY, "pPlaylistHandle is null.");
        }
 
        return r;
@@ -107,16 +114,19 @@ result
 _PlayListImpl::CreateFilterUsingContentId(const ContentId& contentId) const
 {
        std::unique_ptr<char[]> pInputCond;
-       std::unique_ptr<filter_h, FilterHandleDeleter> pFilterHandle(new (std::nothrow) filter_h);
+       filter_h tempFilter = NULL;
        String uuidStr = L"";
        String playListName = L"";
        String inputCondition = L"MEDIA_ID = ";
        String inputListNameCondition = L"PLAYLIST_NAME = ";
 
-       int ret = media_filter_create(pFilterHandle.get());
+       int ret = media_filter_create(&tempFilter);
        result r = MapCoreErrorToNativeResult(ret);
        SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "Failed to perform media_filter_create operation.");
 
+       std::unique_ptr<filter_s, FilterHandleDeleter> pFilterHandle(tempFilter);
+       SysTryReturnResult(NID_CNT, pFilterHandle != null, E_OUT_OF_MEMORY, "pFilterHandle is null.");
+
        uuidStr = contentId.ToString();
        r = uuidStr.Insert('"', 0);
        SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Insert operation for uuidStr.");
@@ -149,7 +159,7 @@ _PlayListImpl::CreateFilterUsingContentId(const ContentId& contentId) const
 
                SysLog(NID_CNT, "pInputCond = %s", pInputCond.get());
 
-               ret = media_filter_set_condition(*(pFilterHandle.get()), pInputCond.get(), MEDIA_CONTENT_COLLATE_DEFAULT);
+               ret = media_filter_set_condition(pFilterHandle.get(), pInputCond.get(), MEDIA_CONTENT_COLLATE_DEFAULT);
                r = MapCoreErrorToNativeResult(ret);
                SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "Failed to perform media_filter_set_condition operation.");
        }
@@ -165,13 +175,15 @@ _PlayListImpl::CreateFilter(const Tizen::Base::String& playListName)const
        std::unique_ptr<char[]> pInputCond;
        String inputCondition = L"PLAYLIST_NAME = ";
        String nameExpr(playListName);
+       filter_h tempFilter = NULL;
 
-       std::unique_ptr<filter_h, FilterHandleDeleter> pFilterHandle(new (std::nothrow) filter_h);
-
-       int ret = media_filter_create(pFilterHandle.get());
+       int ret = media_filter_create(&tempFilter);
        result r = MapCoreErrorToNativeResult(ret);
        SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "Failed to perform media_filter_create operation.");
 
+       std::unique_ptr<filter_s, FilterHandleDeleter> pFilterHandle(tempFilter);
+       SysTryReturnResult(NID_CNT, pFilterHandle != null, E_OUT_OF_MEMORY, "pFilterHandle is null.");
+
        if (!nameExpr.IsEmpty())
        {
                r = nameExpr.Replace("\'", "''");
@@ -195,7 +207,7 @@ _PlayListImpl::CreateFilter(const Tizen::Base::String& playListName)const
 
                SysLog(NID_CNT, "pInputCond is [%s]", pInputCond.get());
 
-               ret = media_filter_set_condition(*(pFilterHandle.get()), pInputCond.get(), MEDIA_CONTENT_COLLATE_DEFAULT);
+               ret = media_filter_set_condition(pFilterHandle.get(), pInputCond.get(), MEDIA_CONTENT_COLLATE_DEFAULT);
                r = MapCoreErrorToNativeResult(ret);
                SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "Failed to perform media_filter_set_condition operation.");
        }
@@ -219,7 +231,7 @@ _PlayListImpl::GetPlayListItemCount(const Tizen::Base::String& playlistName) con
        SysTryReturn(NID_CNT, r == E_SUCCESS, 0, E_DATABASE, "[E_DATABASE] Failed to perform CreateFilter operation.");
 
        pTemp = pItemList.get();
-       ret = media_playlist_foreach_playlist_from_db(*(__pFilterHandle.get()), MediaPlayListImplCb, &pTemp);
+       ret = media_playlist_foreach_playlist_from_db(__pFilterHandle.get(), MediaPlayListImplCb, &pTemp);
        r = MapCoreDatabaseErrorToNativeResult(ret);
        SysTryReturn(NID_CNT, r == E_SUCCESS , 0, r,
                        "[%s] Failed to perform media_playlist_foreach_playlist_from_db operation.", GetErrorMessage(r));
@@ -263,7 +275,7 @@ _PlayListImpl::GetContentInfoListN(const Tizen::Base::String& playlistName) cons
        SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, E_DATABASE, "[E_DATABASE] Failed to perform CreateFilter operation.");
 
        pTemp = pItemList.get();
-       ret = media_playlist_foreach_playlist_from_db(*(__pFilterHandle.get()), MediaPlayListImplCb, &pTemp);
+       ret = media_playlist_foreach_playlist_from_db(__pFilterHandle.get(), MediaPlayListImplCb, &pTemp);
        r = MapCoreDatabaseErrorToNativeResult(ret);
        SysTryReturn(NID_CNT, r == E_SUCCESS , NULL, r,
                        "[%s] Failed to perform media_playlist_foreach_playlist_from_db operation.", GetErrorMessage(r));
@@ -316,16 +328,16 @@ _PlayListImpl::FillPlayListInfo(int playlistId, ArrayList* pPlayListItemList) co
        GList* pTemp = NULL;
        std::unique_ptr<media_info_s, MediaHandleDeleter> pMediaHandle;
 
-       ContentInfo::_ContentData* pContentData = null;
-       ImageContentInfo::_ImageContentData* pImageContentData = null;
-       AudioContentInfo::_AudioContentData* pAudioContentData = null;
-       VideoContentInfo::_VideoContentData* pVideoContentData = null;
-
        std::unique_ptr<ImageContentInfo> pImageContentInfo;
        std::unique_ptr<AudioContentInfo> pAudioContentInfo;
        std::unique_ptr<VideoContentInfo> pVideoContentInfo;
        std::unique_ptr<OtherContentInfo> pOtherContentInfo;
 
+       _ImageContentInfoImpl* pImageContentInfoImpl = null;
+       _AudioContentInfoImpl* pAudioContentInfoImpl = null;
+       _VideoContentInfoImpl* pVideoContentInfoImpl = null;
+       _OtherContentInfoImpl* pOtherContentInfoImpl = null;
+
        //SysTryReturn(NID_CNT, pPlayListItemList != NULL , r, r, "[E_SUCCESS] pPlayListItemList is null");
 
        pTemp = pItemList.get();
@@ -345,23 +357,37 @@ _PlayListImpl::FillPlayListInfo(int playlistId, ArrayList* pPlayListItemList) co
                        r = MapCoreErrorToNativeResult(ret);
                        SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_info_get_media_type.");
 
+                       std::unique_ptr<char, UtilCharDeleter> pMediaPath;
+                       char* pTempPath = null;
+
+                       ret = media_info_get_file_path(pMediaHandle.get(), &pTempPath);
+                       r = MapCoreErrorToNativeResult(ret);
+                       SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_info_get_file_path operation.");
+
+                       pMediaPath.reset(pTempPath);
+                       String contentPath(pMediaPath.get());
+
                        switch (mediaType)
                        {
                        case MEDIA_CONTENT_TYPE_IMAGE:
                                pImageContentInfo = std::unique_ptr<ImageContentInfo>(new (std::nothrow) ImageContentInfo);
                                SysTryReturnResult(NID_CNT, pImageContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pImageContentInfo.");
 
-                               pContentData = pImageContentInfo->GetContentData();
-                               SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+                               r = pImageContentInfo->Construct(&contentPath);
+                               r = ConvertErrorToResult(r);
+                               SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Construct operation to ImageContentInfo.");
+
+                               pImageContentInfoImpl = null;
+                               pImageContentInfoImpl = _ImageContentInfoImpl::GetInstance(*(pImageContentInfo.get()));
+                               SysTryReturnResult(NID_CNT, pImageContentInfoImpl != null, E_OUT_OF_MEMORY, "Failed to assign operation to pImageContentInfoImpl.");
 
-                               pImageContentData = pImageContentInfo->GetImageContentData();
-                               SysTryReturnResult(NID_CNT, pImageContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+                               r = _ContentUtility::FillContentData(pMediaHandle.get(), pImageContentInfoImpl);
+                               SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillContentData operation.");
 
-                               r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);
-                               SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");
+                               r = _ContentUtility::FillImageContentData(pMediaHandle.get(), pImageContentInfoImpl);
+                               SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform GetDataFromImageTable operation.");
 
-                               r = _ContentUtility::FillImageContentData(pMediaHandle.get(), pImageContentData);
-                               SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform GetDataFromImageTable operation.");
+                               _ContentInfoHelper::SetContentInfoImpl(pImageContentInfo.get(), pImageContentInfoImpl);
 
                                // Shallow copy, adds just the pointer: not the element
                                r = pPlayListItemList->Add(*(pImageContentInfo.release()));
@@ -374,17 +400,21 @@ _PlayListImpl::FillPlayListInfo(int playlistId, ArrayList* pPlayListItemList) co
                                pAudioContentInfo = std::unique_ptr<AudioContentInfo>(new (std::nothrow) AudioContentInfo);
                                SysTryReturnResult(NID_CNT, pAudioContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pAudioContentInfo.");
 
-                               pContentData = pAudioContentInfo->GetContentData();
-                               SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+                               r = pAudioContentInfo->Construct(&contentPath);
+                               r = ConvertErrorToResult(r);
+                               SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Construct operation to AudioContentInfo.");
 
-                               pAudioContentData = pAudioContentInfo->GetAudioContentData();
-                               SysTryReturnResult(NID_CNT, pAudioContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+                               pAudioContentInfoImpl = null;
+                               pAudioContentInfoImpl = _AudioContentInfoImpl::GetInstance(*(pAudioContentInfo.get()));
+                               SysTryReturnResult(NID_CNT, pAudioContentInfoImpl != null, E_OUT_OF_MEMORY, "Failed to assign operation to pAudioContentInfoImpl.");
 
-                               r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);
-                               SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");
+                               r = _ContentUtility::FillContentData(pMediaHandle.get(), pAudioContentInfoImpl);
+                               SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillContentData operation.");
 
-                               r = _ContentUtility::FillAudioContentData(pMediaHandle.get(), pAudioContentData);
-                               SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillAudioContentData operation.");
+                               r = _ContentUtility::FillAudioContentData(pMediaHandle.get(), pAudioContentInfoImpl);
+                               SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillAudioContentData operation.");
+
+                               _ContentInfoHelper::SetContentInfoImpl(pAudioContentInfo.get(), pAudioContentInfoImpl);
 
                                // Shallow copy, adds just the pointer: not the element
                                r = pPlayListItemList->Add(*(pAudioContentInfo.release()));
@@ -395,17 +425,21 @@ _PlayListImpl::FillPlayListInfo(int playlistId, ArrayList* pPlayListItemList) co
                                pVideoContentInfo = std::unique_ptr<VideoContentInfo>(new (std::nothrow) VideoContentInfo);
                                SysTryReturnResult(NID_CNT, pVideoContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pVideoContentInfo.");
 
-                               pContentData = pVideoContentInfo->GetContentData();
-                               SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+                               r = pVideoContentInfo->Construct(&contentPath);
+                               r = ConvertErrorToResult(r);
+                               SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Construct operation to VideoContentInfo.");
+
+                               pVideoContentInfoImpl = null;
+                               pVideoContentInfoImpl = _VideoContentInfoImpl::GetInstance(*(pVideoContentInfo.get()));
+                               SysTryReturnResult(NID_CNT, pVideoContentInfoImpl != null, E_OUT_OF_MEMORY, "Failed to assign operation to pVideoContentInfoImpl.");
 
-                               pVideoContentData = pVideoContentInfo->GetVideoContentData();
-                               SysTryReturnResult(NID_CNT, pVideoContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+                               r = _ContentUtility::FillContentData(pMediaHandle.get(), pVideoContentInfoImpl);
+                               SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillContentData operation.");
 
-                               r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);
-                               SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");
+                               r = _ContentUtility::FillVideoContentData(pMediaHandle.get(), pVideoContentInfoImpl);
+                               SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillVideoContentData operation.");
 
-                               r = _ContentUtility::FillVideoContentData(pMediaHandle.get(), pVideoContentData);
-                               SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillVideoContentData operation.");
+                               _ContentInfoHelper::SetContentInfoImpl(pVideoContentInfo.get(), pVideoContentInfoImpl);
 
                                // Shallow copy, adds just the pointer: not the element
                                r = pPlayListItemList->Add(*(pVideoContentInfo.release()));
@@ -416,11 +450,18 @@ _PlayListImpl::FillPlayListInfo(int playlistId, ArrayList* pPlayListItemList) co
                                pOtherContentInfo = std::unique_ptr<OtherContentInfo>(new (std::nothrow) OtherContentInfo);
                                SysTryReturnResult(NID_CNT, pOtherContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pOtherContentInfo.");
 
-                               pContentData = pOtherContentInfo->GetContentData();
-                               SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+                               r = pOtherContentInfo->Construct(&contentPath);
+                               r = ConvertErrorToResult(r);
+                               SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Construct operation to OtherContentInfo.");
 
-                               r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);
-                               SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");
+                               pOtherContentInfoImpl = null;
+                               pOtherContentInfoImpl = _OtherContentInfoImpl::GetInstance(*(pOtherContentInfo.get()));
+                               SysTryReturnResult(NID_CNT, pOtherContentInfoImpl != null, E_OUT_OF_MEMORY, "Failed to assign operation to pOtherContentInfoImpl.");
+
+                               r = _ContentUtility::FillContentData(pMediaHandle.get(), pOtherContentInfoImpl);
+                               SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillContentData operation.");
+
+                               _ContentInfoHelper::SetContentInfoImpl(pOtherContentInfo.get(), pOtherContentInfoImpl);
 
                                // Shallow copy, adds just the pointer: not the element
                                r = pPlayListItemList->Add(*(pOtherContentInfo.release()));
@@ -528,7 +569,7 @@ _PlayListImpl::RemoveItem(const ContentId& contentId)
                SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_playlist_get_playlist_id operation.");
 
                pTemp = pItemList.get();
-               int ret = media_playlist_foreach_media_from_db(playlistId, *(__pFilterHandle.get()), PlaylistImplItemCb, &pTemp);
+               int ret = media_playlist_foreach_media_from_db(playlistId, __pFilterHandle.get(), PlaylistImplItemCb, &pTemp);
                result r = MapCoreErrorToNativeResult(ret);
                SysTryReturnResult(NID_CNT, r == E_SUCCESS , r, "Failed to perform media_playlist_foreach_media_from_db operation.");
 
@@ -620,7 +661,7 @@ _PlayListImpl::SetorGetPlayOrder(const ContentId& contentId, int& playOrder, boo
                SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_playlist_get_playlist_id operation.");
 
                pTemp = pItemList.get();
-               int ret = media_playlist_foreach_media_from_db(playlistId, *(__pFilterHandle.get()), PlaylistImplItemCb, &pTemp);
+               int ret = media_playlist_foreach_media_from_db(playlistId, __pFilterHandle.get(), PlaylistImplItemCb, &pTemp);
                result r = MapCoreErrorToNativeResult(ret);
                SysTryReturnResult(NID_CNT, r == E_SUCCESS , r, "media_playlist_foreach_media_from_db failed.");
 
@@ -679,7 +720,7 @@ _PlayListImpl::GetPlayListHandle(media_playlist_h* pPlayListHandle) const
        GList* pTemp = NULL;
 
        pTemp = pItemList.get();
-       int ret = media_playlist_foreach_playlist_from_db(*(__pFilterHandle.get()), MediaPlayListImplCb, &pTemp);
+       int ret = media_playlist_foreach_playlist_from_db(__pFilterHandle.get(), MediaPlayListImplCb, &pTemp);
        result r = MapCoreErrorToNativeResult(ret);
        SysTryReturnResult(NID_CNT, r == E_SUCCESS , r, "Failed to perform media_playlist_foreach_playlist_from_db operation.");
 
@@ -706,6 +747,11 @@ _PlayListImpl::MapCoreErrorToNativeResult(int reason) const
                r = E_SUCCESS;
                break;
 
+       case MEDIA_CONTENT_ERROR_OUT_OF_MEMORY:
+               r = E_OUT_OF_MEMORY;
+               SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_OUT_OF_MEMORY");
+               break;
+
        case MEDIA_CONTENT_ERROR_INVALID_PARAMETER:
                r = E_INVALID_ARG;
                SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_INVALID_PARAMETER");
@@ -740,6 +786,11 @@ _PlayListImpl::MapCoreDatabaseErrorToNativeResult(int reason) const
                r = E_SUCCESS;
                break;
 
+       case MEDIA_CONTENT_ERROR_OUT_OF_MEMORY:
+               r = E_OUT_OF_MEMORY;
+               SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_OUT_OF_MEMORY");
+               break;
+
        case MEDIA_CONTENT_ERROR_DB_FAILED:
                r = E_DATABASE;
                SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_DB_FAILED");
@@ -758,6 +809,31 @@ _PlayListImpl::MapCoreDatabaseErrorToNativeResult(int reason) const
        return r;
 }
 
+result
+_PlayListImpl::ConvertErrorToResult(result res) const
+{
+       result r = E_SUCCESS;
+
+       switch (res)
+       {
+       // It is processed by normal case when the content exist in DB but the actual file doesn't exist.
+       case E_FILE_NOT_FOUND:
+               r = E_SUCCESS;
+               break;
+
+       case E_INVALID_ARG:
+               // Fall through
+       case E_IO:
+               r = E_SYSTEM;
+               break;
+
+       default:
+               r = res;
+               break;
+       }
+       return r;
+}
+
 bool
 MediaPlayListImplCb(media_playlist_h playlistHandle, void *pUserData)
 {