2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Apache License, Version 2.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
17 * @file FCnt_PlayLisImpl.cpp
18 * @brief This is the implementation file for the %_PlayListImpl class.
20 * This file contains implementation of the %_PlayListImpl class.
24 #include <FBaseSysLog.h>
25 #include <FBaseInteger.h>
26 #include <FBaseLongLong.h>
27 #include <FBaseFloat.h>
28 #include <FCntPlayList.h>
29 #include <FBase_StringConverter.h>
30 #include "FCnt_PlayListImpl.h"
31 #include "FCnt_ContentUtility.h"
32 #include "FCnt_ImageContentInfoImpl.h"
33 #include "FCnt_AudioContentInfoImpl.h"
34 #include "FCnt_VideoContentInfoImpl.h"
35 #include "FCnt_OtherContentInfoImpl.h"
36 #include "FCnt_ContentInfoHelper.h"
38 using namespace Tizen::Base;
39 using namespace Tizen::Base::Collection;
40 using namespace Tizen::Io;
42 namespace Tizen { namespace Content
44 // Declaration for Callback function registered to playlist details
45 bool MediaPlayListImplCb(media_playlist_h playlistHandle, void *pUserData);
47 // Declaration for Callback function registered to playlist items details
48 bool PlaylistImplItemCb(int playlistMemberId, media_info_h media, void *pUserData);
50 // Declaration for Callback function registered to playlist items details
51 bool PlaylistItemsCb(int playlistId, media_info_h media, void *pUserData);
53 _PlayListImpl::_PlayListImpl(void)
54 : __pFilterHandle(NULL)
60 //(disconnects the DB connection)
61 _PlayListImpl::~_PlayListImpl(void)
63 int ret = MEDIA_CONTENT_ERROR_NONE;
66 ret = media_content_disconnect();
67 r = MapCoreErrorToNativeResult(ret);
68 SysTryLog(r == E_SUCCESS, "[%s] Propagating for media_content_disconnect", GetErrorMessage(r));
70 SysLog(NID_CNT, "media_content_disconnect result[%d].", ret);
74 _PlayListImpl::GetInstance(PlayList& playList)
76 return (&playList != null) ? playList.__pImpl : null;
80 _PlayListImpl::GetInstance(const PlayList& playList)
82 return (&playList != null) ? playList.__pImpl : null;
86 _PlayListImpl::Construct(const Tizen::Base::String& playListName, bool isAdd)
88 int ret = media_content_connect();
89 result r = MapCoreErrorToNativeResult(ret);
90 SysTryReturnResult(NID_CNT, r == E_SUCCESS , r, "Propagating for media_content_connect");
92 SysLog(NID_CNT, "media_content_connect result[%d].", ret);
94 __playListName = playListName;
98 std::unique_ptr<char[]> pInputCond(_StringConverter::CopyToCharArrayN(playListName));
99 SysTryReturnResult(NID_CNT, pInputCond, E_OUT_OF_MEMORY, "The memory is insufficient.");
101 media_playlist_h tempHandle = null;
102 ret = media_playlist_insert_to_db(pInputCond.get(), &tempHandle);
103 r = MapCoreErrorToNativeResult(ret);
104 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_playlist_insert_to_db operation.");
106 std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlaylistHandle(tempHandle);
107 SysTryReturnResult(NID_CNT, pPlaylistHandle != null, E_OUT_OF_MEMORY, "pPlaylistHandle is null.");
114 _PlayListImpl::CreateFilterUsingContentId(const ContentId& contentId) const
116 std::unique_ptr<char[]> pInputCond;
117 filter_h tempFilter = NULL;
118 String uuidStr = L"";
119 String playListName = L"";
120 String inputCondition = L"MEDIA_ID = ";
121 String inputListNameCondition = L"PLAYLIST_NAME = ";
123 int ret = media_filter_create(&tempFilter);
124 result r = MapCoreErrorToNativeResult(ret);
125 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "Failed to perform media_filter_create operation.");
127 std::unique_ptr<filter_s, FilterHandleDeleter> pFilterHandle(tempFilter);
128 SysTryReturnResult(NID_CNT, pFilterHandle != null, E_OUT_OF_MEMORY, "pFilterHandle is null.");
130 uuidStr = contentId.ToString();
131 r = uuidStr.Insert('"', 0);
132 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Insert operation for uuidStr.");
133 r = uuidStr.Insert('"', uuidStr.GetLength());
134 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Insert operation for uuidStr.");
136 r = inputCondition.Append(uuidStr);
137 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Append operation for inputCondition.");
139 playListName = __playListName;
140 r = playListName.Insert('"', 0);
141 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Insert operation for playListName.");
142 r = playListName.Insert('"', playListName.GetLength());
143 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Insert operation for playListName.");
145 r = inputListNameCondition.Append(playListName);
146 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Append operation for inputListNameCondition.");
148 r = inputCondition.Append(" AND ");
149 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform append operation.");
151 r = inputCondition.Append(inputListNameCondition);
152 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform append operation.");
154 if (!inputCondition.IsEmpty())
156 //CopyToCharArrayN: utility function, converts a osp string to char*
157 pInputCond = std::unique_ptr<char[]>(_StringConverter::CopyToCharArrayN(inputCondition));
158 SysTryReturnResult(NID_CNT, pInputCond, E_SYSTEM, "pInputCond is NULL.");
160 SysLog(NID_CNT, "pInputCond = %s", pInputCond.get());
162 ret = media_filter_set_condition(pFilterHandle.get(), pInputCond.get(), MEDIA_CONTENT_COLLATE_DEFAULT);
163 r = MapCoreErrorToNativeResult(ret);
164 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "Failed to perform media_filter_set_condition operation.");
167 __pFilterHandle.reset(pFilterHandle.release());
173 _PlayListImpl::CreateFilter(const Tizen::Base::String& playListName)const
175 std::unique_ptr<char[]> pInputCond;
176 String inputCondition = L"PLAYLIST_NAME = ";
177 String nameExpr(playListName);
178 filter_h tempFilter = NULL;
180 int ret = media_filter_create(&tempFilter);
181 result r = MapCoreErrorToNativeResult(ret);
182 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "Failed to perform media_filter_create operation.");
184 std::unique_ptr<filter_s, FilterHandleDeleter> pFilterHandle(tempFilter);
185 SysTryReturnResult(NID_CNT, pFilterHandle != null, E_OUT_OF_MEMORY, "pFilterHandle is null.");
187 if (!nameExpr.IsEmpty())
189 r = nameExpr.Replace("\'", "''");
190 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Replace operation for nameExpr.");
192 r = nameExpr.Insert('\'', 0);
193 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Insert operation for nameExpr.");
195 r = nameExpr.Insert('\'', nameExpr.GetLength());
196 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Insert operation for nameExpr.");
198 r = inputCondition.Append(nameExpr);
199 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Append operation for inputCondition.");
202 if (!inputCondition.IsEmpty())
204 //CopyToCharArrayN: utility function, converts a osp string to char*
205 pInputCond = std::unique_ptr<char[]>(_StringConverter::CopyToCharArrayN(inputCondition));
206 SysTryReturnResult(NID_CNT, pInputCond, E_SYSTEM, "pInputCond is NULL.");
208 SysLog(NID_CNT, "pInputCond is [%s]", pInputCond.get());
210 ret = media_filter_set_condition(pFilterHandle.get(), pInputCond.get(), MEDIA_CONTENT_COLLATE_DEFAULT);
211 r = MapCoreErrorToNativeResult(ret);
212 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "Failed to perform media_filter_set_condition operation.");
215 __pFilterHandle.reset(pFilterHandle.release());
221 _PlayListImpl::GetPlayListItemCount(const Tizen::Base::String& playlistName) const
223 std::unique_ptr<GList, GListDeleter> pItemList;
225 std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlaylistHandle;
227 int ret = MEDIA_CONTENT_ERROR_NONE;
228 int playlistItemCount = 0;
230 result r = CreateFilter(playlistName);
231 SysTryReturn(NID_CNT, r == E_SUCCESS, 0, E_DATABASE, "[E_DATABASE] Failed to perform CreateFilter operation.");
233 pTemp = pItemList.get();
234 ret = media_playlist_foreach_playlist_from_db(__pFilterHandle.get(), MediaPlayListImplCb, &pTemp);
235 r = MapCoreDatabaseErrorToNativeResult(ret);
236 SysTryReturn(NID_CNT, r == E_SUCCESS , 0, r,
237 "[%s] Failed to perform media_playlist_foreach_playlist_from_db operation.", GetErrorMessage(r));
241 r = E_DATABASE; // No match found.
245 pPlaylistHandle.reset(static_cast<media_playlist_h>(g_list_nth_data(pTemp, 0)));
246 if (pPlaylistHandle.get() != NULL)
248 ret = media_playlist_get_playlist_id(pPlaylistHandle.get(), &playlistId);
249 r = MapCoreDatabaseErrorToNativeResult(ret);
250 SysTryReturn(NID_CNT, !IsFailed(r), 0, r, "[%s] Failed to perform media_playlist_get_playlist_id operation.", GetErrorMessage(r));
252 ret = media_playlist_get_media_count_from_db(playlistId, NULL, &playlistItemCount);
253 r = MapCoreDatabaseErrorToNativeResult(ret);
254 SysTryReturn(NID_CNT, !IsFailed(r), 0, r, "[%s] Failed to perform media_playlist_get_media_count_from_db operation.", GetErrorMessage(r));
256 SysLog(NID_CNT, "playlistItemCount is [%d] for media_playlist_get_media_count_from_db", playlistItemCount);
261 return playlistItemCount;
264 Tizen::Base::Collection::IList*
265 _PlayListImpl::GetContentInfoListN(const Tizen::Base::String& playlistName) const
267 std::unique_ptr<GList, GListDeleter> pItemList;
269 std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlaylistHandle;
270 std::unique_ptr<ArrayList, AllElementsDeleter> pPlayListItemList;
272 int ret = MEDIA_CONTENT_ERROR_NONE;
274 result r = CreateFilter(playlistName);
275 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, E_DATABASE, "[E_DATABASE] Failed to perform CreateFilter operation.");
277 pTemp = pItemList.get();
278 ret = media_playlist_foreach_playlist_from_db(__pFilterHandle.get(), MediaPlayListImplCb, &pTemp);
279 r = MapCoreDatabaseErrorToNativeResult(ret);
280 SysTryReturn(NID_CNT, r == E_SUCCESS , NULL, r,
281 "[%s] Failed to perform media_playlist_foreach_playlist_from_db operation.", GetErrorMessage(r));
285 r = E_DATABASE; // No match found.
289 pPlaylistHandle.reset(static_cast<media_playlist_h>(g_list_nth_data(pTemp, 0)));
290 if (pPlaylistHandle.get() != NULL)
292 int playlistItemCount = 0;
294 ret = media_playlist_get_playlist_id(pPlaylistHandle.get(), &playlistId);
295 r = MapCoreDatabaseErrorToNativeResult(ret);
296 SysTryReturn(NID_CNT, !IsFailed(r), NULL, r,
297 "[%s] Failed to perform media_playlist_get_playlist_id operation.", GetErrorMessage(r));
299 ret = media_playlist_get_media_count_from_db(playlistId, NULL, &playlistItemCount);
300 r = MapCoreDatabaseErrorToNativeResult(ret);
301 SysTryReturn(NID_CNT, !IsFailed(r), NULL, r,
302 "[%s] Failed to perform media_playlist_get_media_count_from_db operation.", GetErrorMessage(r));
304 SysLog(NID_CNT, "playlistItemCount is [%d] for media_playlist_get_media_count_from_db", playlistItemCount);
306 pPlayListItemList = std::unique_ptr<ArrayList, AllElementsDeleter>(new (std::nothrow) ArrayList());
307 SysTryReturn(NID_CNT, pPlayListItemList != null, NULL, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] FinalOutList is null.");
309 r = pPlayListItemList->Construct();
310 SysTryReturn(NID_CNT, !IsFailed(r), NULL, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to construct pPlayListItemList ArrayList.");
312 if (playlistItemCount > 0)
314 r = FillPlayListInfo(playlistId, pPlayListItemList.get());
315 SysTryReturn(NID_CNT, !IsFailed(r), NULL, E_DATABASE, "Failed to perform FillPlayListInfo operation.");
321 return pPlayListItemList.release();
325 _PlayListImpl::FillPlayListInfo(int playlistId, ArrayList* pPlayListItemList) const
327 std::unique_ptr<GList, GListDeleter> pItemList;
329 std::unique_ptr<media_info_s, MediaHandleDeleter> pMediaHandle;
331 std::unique_ptr<ImageContentInfo> pImageContentInfo;
332 std::unique_ptr<AudioContentInfo> pAudioContentInfo;
333 std::unique_ptr<VideoContentInfo> pVideoContentInfo;
334 std::unique_ptr<OtherContentInfo> pOtherContentInfo;
336 _ImageContentInfoImpl* pImageContentInfoImpl = null;
337 _AudioContentInfoImpl* pAudioContentInfoImpl = null;
338 _VideoContentInfoImpl* pVideoContentInfoImpl = null;
339 _OtherContentInfoImpl* pOtherContentInfoImpl = null;
341 //SysTryReturn(NID_CNT, pPlayListItemList != NULL , r, r, "[E_SUCCESS] pPlayListItemList is null");
343 pTemp = pItemList.get();
344 int ret = media_playlist_foreach_media_from_db(playlistId, NULL, PlaylistItemsCb, &pTemp);
345 result r = MapCoreErrorToNativeResult(ret);
346 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_playlist_foreach_media_from_db operation.");
348 media_content_type_e mediaType = MEDIA_CONTENT_TYPE_OTHERS;
352 for (int idx = 0; idx < (int)g_list_length(pTemp); idx++)
354 pMediaHandle.reset(static_cast<media_info_h>(g_list_nth_data(pTemp, idx)));
356 ret = media_info_get_media_type(pMediaHandle.get(), &mediaType);
357 r = MapCoreErrorToNativeResult(ret);
358 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_info_get_media_type.");
360 std::unique_ptr<char, UtilCharDeleter> pMediaPath;
361 char* pTempPath = null;
363 ret = media_info_get_file_path(pMediaHandle.get(), &pTempPath);
364 r = MapCoreErrorToNativeResult(ret);
365 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_info_get_file_path operation.");
367 pMediaPath.reset(pTempPath);
368 String contentPath(pMediaPath.get());
372 case MEDIA_CONTENT_TYPE_IMAGE:
373 pImageContentInfo = std::unique_ptr<ImageContentInfo>(new (std::nothrow) ImageContentInfo);
374 SysTryReturnResult(NID_CNT, pImageContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pImageContentInfo.");
376 r = pImageContentInfo->Construct(&contentPath);
377 r = ConvertErrorToResult(r);
378 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Construct operation to ImageContentInfo.");
380 pImageContentInfoImpl = null;
381 pImageContentInfoImpl = _ImageContentInfoImpl::GetInstance(*(pImageContentInfo.get()));
382 SysTryReturnResult(NID_CNT, pImageContentInfoImpl != null, E_OUT_OF_MEMORY, "Failed to assign operation to pImageContentInfoImpl.");
384 r = _ContentUtility::FillContentData(pMediaHandle.get(), pImageContentInfoImpl);
385 SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillContentData operation.");
387 r = _ContentUtility::FillImageContentData(pMediaHandle.get(), pImageContentInfoImpl);
388 SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform GetDataFromImageTable operation.");
390 _ContentInfoHelper::SetContentInfoImpl(pImageContentInfo.get(), pImageContentInfoImpl);
392 // Shallow copy, adds just the pointer: not the element
393 r = pPlayListItemList->Add(*(pImageContentInfo.release()));
394 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");
397 case MEDIA_CONTENT_TYPE_MUSIC:
399 case MEDIA_CONTENT_TYPE_SOUND:
400 pAudioContentInfo = std::unique_ptr<AudioContentInfo>(new (std::nothrow) AudioContentInfo);
401 SysTryReturnResult(NID_CNT, pAudioContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pAudioContentInfo.");
403 r = pAudioContentInfo->Construct(&contentPath);
404 r = ConvertErrorToResult(r);
405 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Construct operation to AudioContentInfo.");
407 pAudioContentInfoImpl = null;
408 pAudioContentInfoImpl = _AudioContentInfoImpl::GetInstance(*(pAudioContentInfo.get()));
409 SysTryReturnResult(NID_CNT, pAudioContentInfoImpl != null, E_OUT_OF_MEMORY, "Failed to assign operation to pAudioContentInfoImpl.");
411 r = _ContentUtility::FillContentData(pMediaHandle.get(), pAudioContentInfoImpl);
412 SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillContentData operation.");
414 r = _ContentUtility::FillAudioContentData(pMediaHandle.get(), pAudioContentInfoImpl);
415 SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillAudioContentData operation.");
417 _ContentInfoHelper::SetContentInfoImpl(pAudioContentInfo.get(), pAudioContentInfoImpl);
419 // Shallow copy, adds just the pointer: not the element
420 r = pPlayListItemList->Add(*(pAudioContentInfo.release()));
421 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for __pFinalOutList.");
424 case MEDIA_CONTENT_TYPE_VIDEO:
425 pVideoContentInfo = std::unique_ptr<VideoContentInfo>(new (std::nothrow) VideoContentInfo);
426 SysTryReturnResult(NID_CNT, pVideoContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pVideoContentInfo.");
428 r = pVideoContentInfo->Construct(&contentPath);
429 r = ConvertErrorToResult(r);
430 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Construct operation to VideoContentInfo.");
432 pVideoContentInfoImpl = null;
433 pVideoContentInfoImpl = _VideoContentInfoImpl::GetInstance(*(pVideoContentInfo.get()));
434 SysTryReturnResult(NID_CNT, pVideoContentInfoImpl != null, E_OUT_OF_MEMORY, "Failed to assign operation to pVideoContentInfoImpl.");
436 r = _ContentUtility::FillContentData(pMediaHandle.get(), pVideoContentInfoImpl);
437 SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillContentData operation.");
439 r = _ContentUtility::FillVideoContentData(pMediaHandle.get(), pVideoContentInfoImpl);
440 SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillVideoContentData operation.");
442 _ContentInfoHelper::SetContentInfoImpl(pVideoContentInfo.get(), pVideoContentInfoImpl);
444 // Shallow copy, adds just the pointer: not the element
445 r = pPlayListItemList->Add(*(pVideoContentInfo.release()));
446 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");
449 case MEDIA_CONTENT_TYPE_OTHERS:
450 pOtherContentInfo = std::unique_ptr<OtherContentInfo>(new (std::nothrow) OtherContentInfo);
451 SysTryReturnResult(NID_CNT, pOtherContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pOtherContentInfo.");
453 r = pOtherContentInfo->Construct(&contentPath);
454 r = ConvertErrorToResult(r);
455 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Construct operation to OtherContentInfo.");
457 pOtherContentInfoImpl = null;
458 pOtherContentInfoImpl = _OtherContentInfoImpl::GetInstance(*(pOtherContentInfo.get()));
459 SysTryReturnResult(NID_CNT, pOtherContentInfoImpl != null, E_OUT_OF_MEMORY, "Failed to assign operation to pOtherContentInfoImpl.");
461 r = _ContentUtility::FillContentData(pMediaHandle.get(), pOtherContentInfoImpl);
462 SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillContentData operation.");
464 _ContentInfoHelper::SetContentInfoImpl(pOtherContentInfo.get(), pOtherContentInfoImpl);
466 // Shallow copy, adds just the pointer: not the element
467 r = pPlayListItemList->Add(*(pOtherContentInfo.release()));
468 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");
481 _PlayListImpl::AddItemInternal(media_playlist_h playListHandle, const ContentId& contentId)
483 String uuidStr = L"";
484 int ret = MEDIA_CONTENT_ERROR_NONE;
485 result r = E_SUCCESS;
487 uuidStr = contentId.ToString();
488 std::unique_ptr<char[]> pInputCond(_StringConverter::CopyToCharArrayN(uuidStr));
489 SysTryReturnResult(NID_CNT, pInputCond, E_OUT_OF_MEMORY, "The memory is insufficient.");
491 ret = media_playlist_add_media(playListHandle, pInputCond.get());
492 r = MapCoreErrorToNativeResult(ret);
493 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_playlist_add_media operation.");
495 ret = media_playlist_update_to_db(playListHandle);
496 r = MapCoreErrorToNativeResult(ret);
497 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_playlist_update_to_db operation.");
503 _PlayListImpl::AddItem(const Tizen::Base::String& playlistName, const ContentId& contentId)
505 std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlayListHandle;
506 media_playlist_h tempHandle = NULL;
508 result r = CreateFilter(playlistName);
509 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform CreateFilter operation.");
511 tempHandle = pPlayListHandle.get();
512 r = GetPlayListHandle(&tempHandle);
513 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform GetPlayListHandle operation.");
515 r = AddItemInternal(tempHandle, contentId);
516 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform AddItemInternal operation.");
522 _PlayListImpl::AddItems(const Tizen::Base::String& playlistName, const Tizen::Base::Collection::IList& contentIdList)
524 int listCount = contentIdList.GetCount();
525 ContentId *pContentId = NULL;
526 std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlayListHandle;
527 media_playlist_h tempHandle = NULL;
529 result r = CreateFilter(playlistName);
530 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform CreateFilter operation.");
532 tempHandle = pPlayListHandle.get();
533 r = GetPlayListHandle(&tempHandle);
534 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform GetPlayListHandle operation.");
536 for(int index = 0; index < listCount; index++)
538 pContentId = (ContentId*)contentIdList.GetAt(index);
539 r = AddItemInternal(tempHandle, *pContentId);
540 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform AddItemInternal operation.");
547 _PlayListImpl::RemoveItem(const ContentId& contentId)
549 std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlayListHandle;
550 media_playlist_h tempHandle = NULL;
551 int ret = MEDIA_CONTENT_ERROR_NONE;
552 std::unique_ptr<GList, GListDeleter> pItemList;
555 result r = CreateFilterUsingContentId(contentId);
556 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform CreateFilterUsingContentId operation.");
558 tempHandle = pPlayListHandle.get();
559 r = GetPlayListHandle(&tempHandle);
560 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform GetPlayListHandle operation.");
562 if (tempHandle != NULL)
565 int playlistMemberId = 0;
567 ret = media_playlist_get_playlist_id(tempHandle, &playlistId);
568 r = MapCoreErrorToNativeResult(ret);
569 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_playlist_get_playlist_id operation.");
571 pTemp = pItemList.get();
572 int ret = media_playlist_foreach_media_from_db(playlistId, __pFilterHandle.get(), PlaylistImplItemCb, &pTemp);
573 result r = MapCoreErrorToNativeResult(ret);
574 SysTryReturnResult(NID_CNT, r == E_SUCCESS , r, "Failed to perform media_playlist_foreach_media_from_db operation.");
578 playlistMemberId = (int)g_list_nth_data(pTemp, 0);
580 ret = media_playlist_remove_media(tempHandle, playlistMemberId);
581 r = MapCoreErrorToNativeResult(ret);
582 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_playlist_remove_media operation.");
584 ret = media_playlist_update_to_db(tempHandle);
585 r = MapCoreErrorToNativeResult(ret);
586 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_playlist_update_to_db operation.");
594 _PlayListImpl::RemoveItems(const Tizen::Base::Collection::IList& contentIdList)
596 int listCount = contentIdList.GetCount();
597 ContentId *pContentId = NULL;
598 result r = E_SUCCESS;
600 for (int index = 0; index < listCount; index++)
602 pContentId = (ContentId*)contentIdList.GetAt(index);
603 r = RemoveItem(*pContentId);
610 _PlayListImpl::SetPlayListName(const Tizen::Base::String& oldName, const Tizen::Base::String& newName)
612 std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlayListHandle;
613 media_playlist_h tempHandle = NULL;
614 int ret = MEDIA_CONTENT_ERROR_NONE;
616 result r = CreateFilter(oldName);
617 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform CreateFilter operation.");
619 tempHandle = pPlayListHandle.get();
620 r = GetPlayListHandle(&tempHandle);
621 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform GetPlayListHandle operation.");
623 std::unique_ptr<char[]> pInputCond(_StringConverter::CopyToCharArrayN(newName));
624 SysTryReturnResult(NID_CNT, pInputCond, E_OUT_OF_MEMORY, "The memory is insufficient.");
626 ret = media_playlist_set_name(tempHandle, pInputCond.get());
627 r = MapCoreErrorToNativeResult(ret);
628 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_playlist_set_name operation.");
630 ret = media_playlist_update_to_db(tempHandle);
631 r = MapCoreErrorToNativeResult(ret);
632 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_playlist_update_to_db operation.");
637 _PlayListImpl::SetorGetPlayOrder(const ContentId& contentId, int& playOrder, bool isSet) const
639 std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlayListHandle;
640 media_playlist_h tempHandle = NULL;
641 std::unique_ptr<GList, GListDeleter> pItemList;
643 int ret = MEDIA_CONTENT_ERROR_NONE;
645 SysTryReturnResult(NID_CNT, contentId != UuId::GetInvalidUuId(), E_INVALID_ARG, "The specified parameter is invalid.");
647 result r = CreateFilterUsingContentId(contentId);
648 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform CreateFilterUsingContentId operation.");
650 tempHandle = pPlayListHandle.get();
651 r = GetPlayListHandle(&tempHandle);
652 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform GetPlayListHandle operation.");
654 if (tempHandle != NULL)
657 int playlistMemberId = 0;
659 ret = media_playlist_get_playlist_id(tempHandle, &playlistId);
660 r = MapCoreErrorToNativeResult(ret);
661 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_playlist_get_playlist_id operation.");
663 pTemp = pItemList.get();
664 int ret = media_playlist_foreach_media_from_db(playlistId, __pFilterHandle.get(), PlaylistImplItemCb, &pTemp);
665 result r = MapCoreErrorToNativeResult(ret);
666 SysTryReturnResult(NID_CNT, r == E_SUCCESS , r, "media_playlist_foreach_media_from_db failed.");
670 playlistMemberId = (int)g_list_nth_data(pTemp, 0);
674 ret = media_playlist_set_play_order(tempHandle, playlistMemberId, playOrder);
675 r = MapCoreErrorToNativeResult(ret);
676 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_playlist_set_play_order operation.");
678 ret = media_playlist_update_to_db(tempHandle);
679 r = MapCoreErrorToNativeResult(ret);
680 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_playlist_update_to_db operation.");
684 ret = media_playlist_get_play_order(tempHandle, playlistMemberId, &playOrder);
685 r = MapCoreErrorToNativeResult(ret);
686 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_playlist_set_play_order operation.");
694 _PlayListImpl::SetPlayOrder(const ContentId& contentId, const ContentId& nextContentId)
696 int playOrder = GetPlayOrder(contentId) + 1;
697 result r = GetLastResult();
698 SysTryReturnResult(NID_CNT, r == E_SUCCESS , r, "Failed to perform GetPlayOrder operation.");
700 r = SetorGetPlayOrder(nextContentId, playOrder, true);
706 _PlayListImpl::GetPlayOrder(const ContentId& contentId) const
710 result r = SetorGetPlayOrder(contentId, playOrder, false);
717 _PlayListImpl::GetPlayListHandle(media_playlist_h* pPlayListHandle) const
719 std::unique_ptr<GList, GListDeleter> pItemList;
722 pTemp = pItemList.get();
723 int ret = media_playlist_foreach_playlist_from_db(__pFilterHandle.get(), MediaPlayListImplCb, &pTemp);
724 result r = MapCoreErrorToNativeResult(ret);
725 SysTryReturnResult(NID_CNT, r == E_SUCCESS , r, "Failed to perform media_playlist_foreach_playlist_from_db operation.");
729 r = E_INVALID_ARG; // No match found.
733 *pPlayListHandle = static_cast< media_playlist_h >(g_list_nth_data(pTemp, 0));
740 _PlayListImpl::MapCoreErrorToNativeResult(int reason) const
742 result r = E_SUCCESS;
746 case MEDIA_CONTENT_ERROR_NONE:
750 case MEDIA_CONTENT_ERROR_OUT_OF_MEMORY:
752 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_OUT_OF_MEMORY");
755 case MEDIA_CONTENT_ERROR_INVALID_PARAMETER:
757 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_INVALID_PARAMETER");
760 case MEDIA_CONTENT_ERROR_DB_FAILED:
762 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_DB_FAILED");
765 case MEDIA_CONTENT_ERROR_DB_BUSY:
767 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_DB_BUSY");
771 SysLog(NID_CNT, "default");
779 _PlayListImpl::MapCoreDatabaseErrorToNativeResult(int reason) const
781 result r = E_SUCCESS;
785 case MEDIA_CONTENT_ERROR_NONE:
789 case MEDIA_CONTENT_ERROR_OUT_OF_MEMORY:
791 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_OUT_OF_MEMORY");
794 case MEDIA_CONTENT_ERROR_DB_FAILED:
796 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_DB_FAILED");
799 case MEDIA_CONTENT_ERROR_DB_BUSY:
801 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_DB_BUSY");
805 SysLog(NID_CNT, "default");
813 _PlayListImpl::ConvertErrorToResult(result res) const
815 result r = E_SUCCESS;
819 // It is processed by normal case when the content exist in DB but the actual file doesn't exist.
820 case E_FILE_NOT_FOUND:
838 MediaPlayListImplCb(media_playlist_h playlistHandle, void *pUserData)
840 media_playlist_h newPlayListHandle = NULL;
841 media_playlist_clone(&newPlayListHandle, playlistHandle);
843 GList** pList = (GList**)pUserData;
844 *pList = g_list_append(*pList, newPlayListHandle);
849 // This callback appends List with playlistMemberId's
851 PlaylistImplItemCb(int playlistMemberId, media_info_h media, void *pUserData)
853 GList** pList = (GList**)pUserData;
854 *pList = g_list_append(*pList, (gpointer)playlistMemberId);
859 // This callback appends List with media handles
861 PlaylistItemsCb(int playlistId, media_info_h media, void *pUserData)
863 media_info_h new_media = NULL;
864 media_info_clone(&new_media, media);
866 GList** pList = (GList**)pUserData;
867 *pList = g_list_append(*pList, new_media);