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(L"");
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 r = nameExpr.Append(playListName);
188 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Append operation for nameExpr.");
190 if (!nameExpr.IsEmpty())
192 r = nameExpr.Replace("\'", "''");
193 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Replace operation for nameExpr.");
195 r = nameExpr.Insert('\'', 0);
196 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Insert operation for nameExpr.");
198 r = nameExpr.Insert('\'', nameExpr.GetLength());
199 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Insert operation for nameExpr.");
201 r = inputCondition.Append(nameExpr);
202 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Append operation for inputCondition.");
205 if (!inputCondition.IsEmpty())
207 //CopyToCharArrayN: utility function, converts a osp string to char*
208 pInputCond = std::unique_ptr<char[]>(_StringConverter::CopyToCharArrayN(inputCondition));
209 SysTryReturnResult(NID_CNT, pInputCond, E_SYSTEM, "pInputCond is NULL.");
211 SysLog(NID_CNT, "pInputCond is [%s]", pInputCond.get());
213 ret = media_filter_set_condition(pFilterHandle.get(), pInputCond.get(), MEDIA_CONTENT_COLLATE_DEFAULT);
214 r = MapCoreErrorToNativeResult(ret);
215 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "Failed to perform media_filter_set_condition operation.");
218 __pFilterHandle.reset(pFilterHandle.release());
224 _PlayListImpl::GetPlayListItemCount(const Tizen::Base::String& playlistName) const
226 std::unique_ptr<GList, GListDeleter> pItemList;
228 std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlaylistHandle;
230 int ret = MEDIA_CONTENT_ERROR_NONE;
231 int playlistItemCount = 0;
233 result r = CreateFilter(playlistName);
234 SysTryReturn(NID_CNT, r == E_SUCCESS, 0, E_DATABASE, "[E_DATABASE] Failed to perform CreateFilter operation.");
236 pTemp = pItemList.get();
237 ret = media_playlist_foreach_playlist_from_db(__pFilterHandle.get(), MediaPlayListImplCb, &pTemp);
238 r = MapCoreDatabaseErrorToNativeResult(ret);
239 SysTryReturn(NID_CNT, r == E_SUCCESS , 0, r,
240 "[%s] Failed to perform media_playlist_foreach_playlist_from_db operation.", GetErrorMessage(r));
244 r = E_DATABASE; // No match found.
248 pPlaylistHandle.reset(static_cast<media_playlist_h>(g_list_nth_data(pTemp, 0)));
249 if (pPlaylistHandle.get() != NULL)
251 ret = media_playlist_get_playlist_id(pPlaylistHandle.get(), &playlistId);
252 r = MapCoreDatabaseErrorToNativeResult(ret);
253 SysTryReturn(NID_CNT, !IsFailed(r), 0, r, "[%s] Failed to perform media_playlist_get_playlist_id operation.", GetErrorMessage(r));
255 ret = media_playlist_get_media_count_from_db(playlistId, NULL, &playlistItemCount);
256 r = MapCoreDatabaseErrorToNativeResult(ret);
257 SysTryReturn(NID_CNT, !IsFailed(r), 0, r, "[%s] Failed to perform media_playlist_get_media_count_from_db operation.", GetErrorMessage(r));
259 SysLog(NID_CNT, "playlistItemCount is [%d] for media_playlist_get_media_count_from_db", playlistItemCount);
264 return playlistItemCount;
267 Tizen::Base::Collection::IList*
268 _PlayListImpl::GetContentInfoListN(const Tizen::Base::String& playlistName) const
270 std::unique_ptr<GList, GListDeleter> pItemList;
272 std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlaylistHandle;
273 std::unique_ptr<ArrayList, AllElementsDeleter> pPlayListItemList;
275 int ret = MEDIA_CONTENT_ERROR_NONE;
277 result r = CreateFilter(playlistName);
278 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, E_DATABASE, "[E_DATABASE] Failed to perform CreateFilter operation.");
280 pTemp = pItemList.get();
281 ret = media_playlist_foreach_playlist_from_db(__pFilterHandle.get(), MediaPlayListImplCb, &pTemp);
282 r = MapCoreDatabaseErrorToNativeResult(ret);
283 SysTryReturn(NID_CNT, r == E_SUCCESS , NULL, r,
284 "[%s] Failed to perform media_playlist_foreach_playlist_from_db operation.", GetErrorMessage(r));
288 r = E_DATABASE; // No match found.
292 pPlaylistHandle.reset(static_cast<media_playlist_h>(g_list_nth_data(pTemp, 0)));
293 if (pPlaylistHandle.get() != NULL)
295 int playlistItemCount = 0;
297 ret = media_playlist_get_playlist_id(pPlaylistHandle.get(), &playlistId);
298 r = MapCoreDatabaseErrorToNativeResult(ret);
299 SysTryReturn(NID_CNT, !IsFailed(r), NULL, r,
300 "[%s] Failed to perform media_playlist_get_playlist_id operation.", GetErrorMessage(r));
302 ret = media_playlist_get_media_count_from_db(playlistId, NULL, &playlistItemCount);
303 r = MapCoreDatabaseErrorToNativeResult(ret);
304 SysTryReturn(NID_CNT, !IsFailed(r), NULL, r,
305 "[%s] Failed to perform media_playlist_get_media_count_from_db operation.", GetErrorMessage(r));
307 SysLog(NID_CNT, "playlistItemCount is [%d] for media_playlist_get_media_count_from_db", playlistItemCount);
309 pPlayListItemList = std::unique_ptr<ArrayList, AllElementsDeleter>(new (std::nothrow) ArrayList());
310 SysTryReturn(NID_CNT, pPlayListItemList != null, NULL, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] FinalOutList is null.");
312 r = pPlayListItemList->Construct();
313 SysTryReturn(NID_CNT, !IsFailed(r), NULL, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to construct pPlayListItemList ArrayList.");
315 if (playlistItemCount > 0)
317 r = FillPlayListInfo(playlistId, pPlayListItemList.get());
318 SysTryReturn(NID_CNT, !IsFailed(r), NULL, E_DATABASE, "Failed to perform FillPlayListInfo operation.");
324 return pPlayListItemList.release();
328 _PlayListImpl::FillPlayListInfo(int playlistId, ArrayList* pPlayListItemList) const
330 std::unique_ptr<GList, GListDeleter> pItemList;
332 std::unique_ptr<media_info_s, MediaHandleDeleter> pMediaHandle;
334 std::unique_ptr<ImageContentInfo> pImageContentInfo;
335 std::unique_ptr<AudioContentInfo> pAudioContentInfo;
336 std::unique_ptr<VideoContentInfo> pVideoContentInfo;
337 std::unique_ptr<OtherContentInfo> pOtherContentInfo;
339 _ImageContentInfoImpl* pImageContentInfoImpl = null;
340 _AudioContentInfoImpl* pAudioContentInfoImpl = null;
341 _VideoContentInfoImpl* pVideoContentInfoImpl = null;
342 _OtherContentInfoImpl* pOtherContentInfoImpl = null;
344 //SysTryReturn(NID_CNT, pPlayListItemList != NULL , r, r, "[E_SUCCESS] pPlayListItemList is null");
346 pTemp = pItemList.get();
347 int ret = media_playlist_foreach_media_from_db(playlistId, NULL, PlaylistItemsCb, &pTemp);
348 result r = MapCoreErrorToNativeResult(ret);
349 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_playlist_foreach_media_from_db operation.");
351 media_content_type_e mediaType = MEDIA_CONTENT_TYPE_OTHERS;
355 for (int idx = 0; idx < (int)g_list_length(pTemp); idx++)
357 pMediaHandle.reset(static_cast<media_info_h>(g_list_nth_data(pTemp, idx)));
359 ret = media_info_get_media_type(pMediaHandle.get(), &mediaType);
360 r = MapCoreErrorToNativeResult(ret);
361 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_info_get_media_type.");
363 std::unique_ptr<char, UtilCharDeleter> pMediaPath;
364 char* pTempPath = null;
366 ret = media_info_get_file_path(pMediaHandle.get(), &pTempPath);
367 r = MapCoreErrorToNativeResult(ret);
368 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_info_get_file_path operation.");
370 pMediaPath.reset(pTempPath);
371 String contentPath(pMediaPath.get());
375 case MEDIA_CONTENT_TYPE_IMAGE:
376 pImageContentInfo = std::unique_ptr<ImageContentInfo>(new (std::nothrow) ImageContentInfo);
377 SysTryReturnResult(NID_CNT, pImageContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pImageContentInfo.");
379 r = pImageContentInfo->Construct(&contentPath);
380 r = ConvertErrorToResult(r);
381 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Construct operation to ImageContentInfo.");
383 pImageContentInfoImpl = null;
384 pImageContentInfoImpl = _ImageContentInfoImpl::GetInstance(*(pImageContentInfo.get()));
385 SysTryReturnResult(NID_CNT, pImageContentInfoImpl != null, E_OUT_OF_MEMORY, "Failed to assign operation to pImageContentInfoImpl.");
387 r = _ContentUtility::FillContentData(pMediaHandle.get(), pImageContentInfoImpl);
388 SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillContentData operation.");
390 r = _ContentUtility::FillImageContentData(pMediaHandle.get(), pImageContentInfoImpl);
391 SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform GetDataFromImageTable operation.");
393 _ContentInfoHelper::SetContentInfoImpl(pImageContentInfo.get(), pImageContentInfoImpl);
395 // Shallow copy, adds just the pointer: not the element
396 r = pPlayListItemList->Add(*(pImageContentInfo.release()));
397 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");
400 case MEDIA_CONTENT_TYPE_MUSIC:
402 case MEDIA_CONTENT_TYPE_SOUND:
403 pAudioContentInfo = std::unique_ptr<AudioContentInfo>(new (std::nothrow) AudioContentInfo);
404 SysTryReturnResult(NID_CNT, pAudioContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pAudioContentInfo.");
406 r = pAudioContentInfo->Construct(&contentPath);
407 r = ConvertErrorToResult(r);
408 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Construct operation to AudioContentInfo.");
410 pAudioContentInfoImpl = null;
411 pAudioContentInfoImpl = _AudioContentInfoImpl::GetInstance(*(pAudioContentInfo.get()));
412 SysTryReturnResult(NID_CNT, pAudioContentInfoImpl != null, E_OUT_OF_MEMORY, "Failed to assign operation to pAudioContentInfoImpl.");
414 r = _ContentUtility::FillContentData(pMediaHandle.get(), pAudioContentInfoImpl);
415 SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillContentData operation.");
417 r = _ContentUtility::FillAudioContentData(pMediaHandle.get(), pAudioContentInfoImpl);
418 SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillAudioContentData operation.");
420 _ContentInfoHelper::SetContentInfoImpl(pAudioContentInfo.get(), pAudioContentInfoImpl);
422 // Shallow copy, adds just the pointer: not the element
423 r = pPlayListItemList->Add(*(pAudioContentInfo.release()));
424 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for __pFinalOutList.");
427 case MEDIA_CONTENT_TYPE_VIDEO:
428 pVideoContentInfo = std::unique_ptr<VideoContentInfo>(new (std::nothrow) VideoContentInfo);
429 SysTryReturnResult(NID_CNT, pVideoContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pVideoContentInfo.");
431 r = pVideoContentInfo->Construct(&contentPath);
432 r = ConvertErrorToResult(r);
433 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Construct operation to VideoContentInfo.");
435 pVideoContentInfoImpl = null;
436 pVideoContentInfoImpl = _VideoContentInfoImpl::GetInstance(*(pVideoContentInfo.get()));
437 SysTryReturnResult(NID_CNT, pVideoContentInfoImpl != null, E_OUT_OF_MEMORY, "Failed to assign operation to pVideoContentInfoImpl.");
439 r = _ContentUtility::FillContentData(pMediaHandle.get(), pVideoContentInfoImpl);
440 SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillContentData operation.");
442 r = _ContentUtility::FillVideoContentData(pMediaHandle.get(), pVideoContentInfoImpl);
443 SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillVideoContentData operation.");
445 _ContentInfoHelper::SetContentInfoImpl(pVideoContentInfo.get(), pVideoContentInfoImpl);
447 // Shallow copy, adds just the pointer: not the element
448 r = pPlayListItemList->Add(*(pVideoContentInfo.release()));
449 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");
452 case MEDIA_CONTENT_TYPE_OTHERS:
453 pOtherContentInfo = std::unique_ptr<OtherContentInfo>(new (std::nothrow) OtherContentInfo);
454 SysTryReturnResult(NID_CNT, pOtherContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pOtherContentInfo.");
456 r = pOtherContentInfo->Construct(&contentPath);
457 r = ConvertErrorToResult(r);
458 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Construct operation to OtherContentInfo.");
460 pOtherContentInfoImpl = null;
461 pOtherContentInfoImpl = _OtherContentInfoImpl::GetInstance(*(pOtherContentInfo.get()));
462 SysTryReturnResult(NID_CNT, pOtherContentInfoImpl != null, E_OUT_OF_MEMORY, "Failed to assign operation to pOtherContentInfoImpl.");
464 r = _ContentUtility::FillContentData(pMediaHandle.get(), pOtherContentInfoImpl);
465 SysTryReturnResult(NID_CNT, !IsFailed(r), E_DATABASE, "Failed to perform FillContentData operation.");
467 _ContentInfoHelper::SetContentInfoImpl(pOtherContentInfo.get(), pOtherContentInfoImpl);
469 // Shallow copy, adds just the pointer: not the element
470 r = pPlayListItemList->Add(*(pOtherContentInfo.release()));
471 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");
484 _PlayListImpl::AddItemInternal(media_playlist_h playListHandle, const ContentId& contentId)
486 String uuidStr = L"";
487 int ret = MEDIA_CONTENT_ERROR_NONE;
488 result r = E_SUCCESS;
490 uuidStr = contentId.ToString();
491 std::unique_ptr<char[]> pInputCond(_StringConverter::CopyToCharArrayN(uuidStr));
492 SysTryReturnResult(NID_CNT, pInputCond, E_OUT_OF_MEMORY, "The memory is insufficient.");
494 ret = media_playlist_add_media(playListHandle, pInputCond.get());
495 r = MapCoreErrorToNativeResult(ret);
496 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_playlist_add_media operation.");
498 ret = media_playlist_update_to_db(playListHandle);
499 r = MapCoreErrorToNativeResult(ret);
500 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_playlist_update_to_db operation.");
506 _PlayListImpl::AddItem(const Tizen::Base::String& playlistName, const ContentId& contentId)
508 std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlayListHandle;
509 media_playlist_h tempHandle = NULL;
511 result r = CreateFilter(playlistName);
512 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform CreateFilter operation.");
514 tempHandle = pPlayListHandle.get();
515 r = GetPlayListHandle(&tempHandle);
516 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform GetPlayListHandle operation.");
518 r = AddItemInternal(tempHandle, contentId);
519 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform AddItemInternal operation.");
525 _PlayListImpl::AddItems(const Tizen::Base::String& playlistName, const Tizen::Base::Collection::IList& contentIdList)
527 int listCount = contentIdList.GetCount();
528 ContentId *pContentId = NULL;
529 std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlayListHandle;
530 media_playlist_h tempHandle = NULL;
532 result r = CreateFilter(playlistName);
533 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform CreateFilter operation.");
535 tempHandle = pPlayListHandle.get();
536 r = GetPlayListHandle(&tempHandle);
537 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform GetPlayListHandle operation.");
539 for(int index = 0; index < listCount; index++)
541 pContentId = (ContentId*)contentIdList.GetAt(index);
542 r = AddItemInternal(tempHandle, *pContentId);
543 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform AddItemInternal operation.");
550 _PlayListImpl::RemoveItem(const ContentId& contentId)
552 std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlayListHandle;
553 media_playlist_h tempHandle = NULL;
554 int ret = MEDIA_CONTENT_ERROR_NONE;
555 std::unique_ptr<GList, GListDeleter> pItemList;
558 result r = CreateFilterUsingContentId(contentId);
559 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform CreateFilterUsingContentId operation.");
561 tempHandle = pPlayListHandle.get();
562 r = GetPlayListHandle(&tempHandle);
563 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform GetPlayListHandle operation.");
565 if (tempHandle != NULL)
568 int playlistMemberId = 0;
570 ret = media_playlist_get_playlist_id(tempHandle, &playlistId);
571 r = MapCoreErrorToNativeResult(ret);
572 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_playlist_get_playlist_id operation.");
574 pTemp = pItemList.get();
575 int ret = media_playlist_foreach_media_from_db(playlistId, __pFilterHandle.get(), PlaylistImplItemCb, &pTemp);
576 result r = MapCoreErrorToNativeResult(ret);
577 SysTryReturnResult(NID_CNT, r == E_SUCCESS , r, "Failed to perform media_playlist_foreach_media_from_db operation.");
581 playlistMemberId = (int)g_list_nth_data(pTemp, 0);
583 ret = media_playlist_remove_media(tempHandle, playlistMemberId);
584 r = MapCoreErrorToNativeResult(ret);
585 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_playlist_remove_media operation.");
587 ret = media_playlist_update_to_db(tempHandle);
588 r = MapCoreErrorToNativeResult(ret);
589 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_playlist_update_to_db operation.");
597 _PlayListImpl::RemoveItems(const Tizen::Base::Collection::IList& contentIdList)
599 int listCount = contentIdList.GetCount();
600 ContentId *pContentId = NULL;
601 result r = E_SUCCESS;
603 for (int index = 0; index < listCount; index++)
605 pContentId = (ContentId*)contentIdList.GetAt(index);
606 r = RemoveItem(*pContentId);
613 _PlayListImpl::SetPlayListName(const Tizen::Base::String& oldName, const Tizen::Base::String& newName)
615 std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlayListHandle;
616 media_playlist_h tempHandle = NULL;
617 int ret = MEDIA_CONTENT_ERROR_NONE;
619 result r = CreateFilter(oldName);
620 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform CreateFilter operation.");
622 tempHandle = pPlayListHandle.get();
623 r = GetPlayListHandle(&tempHandle);
624 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform GetPlayListHandle operation.");
626 std::unique_ptr<char[]> pInputCond(_StringConverter::CopyToCharArrayN(newName));
627 SysTryReturnResult(NID_CNT, pInputCond, E_OUT_OF_MEMORY, "The memory is insufficient.");
629 ret = media_playlist_set_name(tempHandle, pInputCond.get());
630 r = MapCoreErrorToNativeResult(ret);
631 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_playlist_set_name operation.");
633 ret = media_playlist_update_to_db(tempHandle);
634 r = MapCoreErrorToNativeResult(ret);
635 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_playlist_update_to_db operation.");
640 _PlayListImpl::SetorGetPlayOrder(const ContentId& contentId, int& playOrder, bool isSet) const
642 std::unique_ptr<media_playlist_s, PlayListHandleDeleter> pPlayListHandle;
643 media_playlist_h tempHandle = NULL;
644 std::unique_ptr<GList, GListDeleter> pItemList;
646 int ret = MEDIA_CONTENT_ERROR_NONE;
648 SysTryReturnResult(NID_CNT, contentId != UuId::GetInvalidUuId(), E_INVALID_ARG, "The specified parameter is invalid.");
650 result r = CreateFilterUsingContentId(contentId);
651 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform CreateFilterUsingContentId operation.");
653 tempHandle = pPlayListHandle.get();
654 r = GetPlayListHandle(&tempHandle);
655 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_DATABASE, "Failed to perform GetPlayListHandle operation.");
657 if (tempHandle != NULL)
660 int playlistMemberId = 0;
662 ret = media_playlist_get_playlist_id(tempHandle, &playlistId);
663 r = MapCoreErrorToNativeResult(ret);
664 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_playlist_get_playlist_id operation.");
666 pTemp = pItemList.get();
667 int ret = media_playlist_foreach_media_from_db(playlistId, __pFilterHandle.get(), PlaylistImplItemCb, &pTemp);
668 result r = MapCoreErrorToNativeResult(ret);
669 SysTryReturnResult(NID_CNT, r == E_SUCCESS , r, "media_playlist_foreach_media_from_db failed.");
673 playlistMemberId = (int)g_list_nth_data(pTemp, 0);
677 ret = media_playlist_set_play_order(tempHandle, playlistMemberId, playOrder);
678 r = MapCoreErrorToNativeResult(ret);
679 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_playlist_set_play_order operation.");
681 ret = media_playlist_update_to_db(tempHandle);
682 r = MapCoreErrorToNativeResult(ret);
683 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_playlist_update_to_db operation.");
687 ret = media_playlist_get_play_order(tempHandle, playlistMemberId, &playOrder);
688 r = MapCoreErrorToNativeResult(ret);
689 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_playlist_set_play_order operation.");
697 _PlayListImpl::SetPlayOrder(const ContentId& contentId, const ContentId& nextContentId)
699 int playOrder = GetPlayOrder(contentId) + 1;
700 result r = GetLastResult();
701 SysTryReturnResult(NID_CNT, r == E_SUCCESS , r, "Failed to perform GetPlayOrder operation.");
703 r = SetorGetPlayOrder(nextContentId, playOrder, true);
709 _PlayListImpl::GetPlayOrder(const ContentId& contentId) const
713 result r = SetorGetPlayOrder(contentId, playOrder, false);
720 _PlayListImpl::GetPlayListHandle(media_playlist_h* pPlayListHandle) const
722 std::unique_ptr<GList, GListDeleter> pItemList;
725 pTemp = pItemList.get();
726 int ret = media_playlist_foreach_playlist_from_db(__pFilterHandle.get(), MediaPlayListImplCb, &pTemp);
727 result r = MapCoreErrorToNativeResult(ret);
728 SysTryReturnResult(NID_CNT, r == E_SUCCESS , r, "Failed to perform media_playlist_foreach_playlist_from_db operation.");
732 r = E_INVALID_ARG; // No match found.
736 *pPlayListHandle = static_cast< media_playlist_h >(g_list_nth_data(pTemp, 0));
743 _PlayListImpl::MapCoreErrorToNativeResult(int reason) const
745 result r = E_SUCCESS;
749 case MEDIA_CONTENT_ERROR_NONE:
753 case MEDIA_CONTENT_ERROR_OUT_OF_MEMORY:
755 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_OUT_OF_MEMORY");
758 case MEDIA_CONTENT_ERROR_INVALID_PARAMETER:
760 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_INVALID_PARAMETER");
763 case MEDIA_CONTENT_ERROR_DB_FAILED:
765 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_DB_FAILED");
768 case MEDIA_CONTENT_ERROR_DB_BUSY:
770 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_DB_BUSY");
774 SysLog(NID_CNT, "default");
782 _PlayListImpl::MapCoreDatabaseErrorToNativeResult(int reason) const
784 result r = E_SUCCESS;
788 case MEDIA_CONTENT_ERROR_NONE:
792 case MEDIA_CONTENT_ERROR_OUT_OF_MEMORY:
794 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_OUT_OF_MEMORY");
797 case MEDIA_CONTENT_ERROR_DB_FAILED:
799 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_DB_FAILED");
802 case MEDIA_CONTENT_ERROR_DB_BUSY:
804 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_DB_BUSY");
808 SysLog(NID_CNT, "default");
816 _PlayListImpl::ConvertErrorToResult(result res) const
818 result r = E_SUCCESS;
822 // It is processed by normal case when the content exist in DB but the actual file doesn't exist.
823 case E_FILE_NOT_FOUND:
841 MediaPlayListImplCb(media_playlist_h playlistHandle, void *pUserData)
843 media_playlist_h newPlayListHandle = NULL;
844 media_playlist_clone(&newPlayListHandle, playlistHandle);
846 GList** pList = (GList**)pUserData;
847 *pList = g_list_append(*pList, newPlayListHandle);
852 // This callback appends List with playlistMemberId's
854 PlaylistImplItemCb(int playlistMemberId, media_info_h media, void *pUserData)
856 GList** pList = (GList**)pUserData;
857 *pList = g_list_append(*pList, (gpointer)playlistMemberId);
862 // This callback appends List with media handles
864 PlaylistItemsCb(int playlistId, media_info_h media, void *pUserData)
866 media_info_h new_media = NULL;
867 media_info_clone(&new_media, media);
869 GList** pList = (GList**)pUserData;
870 *pList = g_list_append(*pList, new_media);