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_ContentDirectoryImpl.cpp
18 * @brief This is the implementation file for the %_ContentDirectoryImpl class.
20 * This file contains implementation of the %_ContentDirectoryImpl class.
23 #include <FBaseSysLog.h>
24 #include <FBaseInteger.h>
25 #include <FBaseLongLong.h>
26 #include <FBaseFloat.h>
27 #include <FBaseColIList.h>
28 #include <FBaseColIEnumeratorT.h>
29 #include <FCntContentDirectory.h>
30 #include <FCntContentSearchResult.h>
31 #include <FSysEnvironment.h>
32 #include <FBase_StringConverter.h>
33 #include <FCnt_ContentUtility.h>
34 #include <FCnt_ContentDirectoryImpl.h>
36 using namespace Tizen::Base;
37 using namespace Tizen::Base::Collection;
38 using namespace Tizen::Io;
39 using namespace Tizen::System;
41 namespace Tizen { namespace Content
43 // Declaration for Callback function registered to each media info details
44 bool MediaFoldersCb(media_folder_h folder, void* pUserdata);
45 // Declaration for Callback function registered to each media info details
46 bool MediaFolderItemsCb(media_info_h media, void* pUserdata);
48 _ContentDirectoryImpl::_ContentDirectoryImpl(void)
50 , __pFilterHandle(null)
51 , __pFinalOutList(null)
52 , __contentType(CONTENT_TYPE_UNKNOWN)
53 , __isMultiContentType(false)
54 , __multiContentTypeExpr(L"")
59 // (disconnects the DB connection)
60 _ContentDirectoryImpl::~_ContentDirectoryImpl(void)
62 int ret = MEDIA_CONTENT_ERROR_NONE;
65 ret = media_content_disconnect();
66 r = MapCoreErrorToNativeResult(ret);
67 SysTryLog(NID_CNT, r == E_SUCCESS, "[%s] Propagating for media_content_disconnect.", GetErrorMessage(r));
69 SysLog(NID_CNT, "media_content_disconnect result[%d].", ret);
72 _ContentDirectoryImpl*
73 _ContentDirectoryImpl::GetInstance(ContentDirectory& contentDirectory)
75 return (&contentDirectory != null) ? contentDirectory.__pImpl : null;
78 const _ContentDirectoryImpl*
79 _ContentDirectoryImpl::GetInstance(const ContentDirectory& contentDirectory)
81 return (&contentDirectory != null) ? contentDirectory.__pImpl : null;
84 //make a connection to DB
86 _ContentDirectoryImpl::Construct(ContentType type)
89 int ret = MEDIA_CONTENT_ERROR_NONE;
91 ret = media_content_connect();
92 r = MapCoreErrorToNativeResult(ret);
93 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Propagating for media_content_connect.");
95 SysLog(NID_CNT, "media_content_connect result[%d].", ret);
98 __isMultiContentType = false;
99 __multiContentTypeExpr.Clear();
104 //make a connection to DB
106 _ContentDirectoryImpl::Construct(const Tizen::Base::Collection::IListT<ContentType>& contentTypeList)
108 result r = E_SUCCESS;
109 int ret = MEDIA_CONTENT_ERROR_NONE;
110 ContentType contentType = CONTENT_TYPE_UNKNOWN;
112 ret = media_content_connect();
113 r = MapCoreErrorToNativeResult(ret);
114 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Propagating for media_content_connect.");
116 SysLog(NID_CNT, "media_content_connect result[%d].", ret);
118 __multiContentTypeExpr.Clear();
120 std::unique_ptr<IEnumeratorT<ContentType> > pEnum(contentTypeList.GetEnumeratorN());
122 while ((pEnum.get() != NULL) && (pEnum->MoveNext() == E_SUCCESS))
124 if (!__multiContentTypeExpr.IsEmpty())
126 r = __multiContentTypeExpr.Append("OR ");
127 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Append operation.");
129 pEnum->GetCurrent(contentType);
132 // Image-0,video-1,sound-2,music-3,other-4
133 case CONTENT_TYPE_OTHER:
134 r = __multiContentTypeExpr.Append("MEDIA_TYPE=4 ");
135 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Append operation.");
137 case CONTENT_TYPE_IMAGE:
138 r = __multiContentTypeExpr.Append("MEDIA_TYPE=0 ");
139 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Append operation.");
141 case CONTENT_TYPE_AUDIO:
142 r = __multiContentTypeExpr.Append("(MEDIA_TYPE=2 or MEDIA_TYPE=3) ");
143 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Append operation.");;
145 case CONTENT_TYPE_VIDEO:
146 r = __multiContentTypeExpr.Append("MEDIA_TYPE=1 ");
147 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Append operation.");
149 case CONTENT_TYPE_ALL:
150 //If content type is CONTENT_TYPE_ALL, then MEDIA_TYPE is empty
157 r = __multiContentTypeExpr.Insert('(', 0);
158 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Append operation.");
160 r = __multiContentTypeExpr.Insert(')', __multiContentTypeExpr.GetLength());
161 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Append operation.");
163 __isMultiContentType = true;
169 _ContentDirectoryImpl::CreateFolderFilter(bool isMultiContentType, const Tizen::Base::String& inputFolderPath) const
171 result r = E_SUCCESS;
172 filter_h tempFilter = NULL;
173 int ret = MEDIA_CONTENT_ERROR_NONE;
174 String inputCondition = L"";
175 String folderPath(inputFolderPath);
177 ret = media_filter_create(&tempFilter);
178 r = MapCoreErrorToNativeResult(ret);
179 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "Failed to perform media_filter_create operation.");
181 std::unique_ptr<filter_s, FilterHandleDeleter> pFilterHandle(tempFilter);
182 SysTryReturnResult(NID_CNT, pFilterHandle != null, E_OUT_OF_MEMORY, "pFilterHandle is null.");
184 if (isMultiContentType)
186 r = inputCondition.Append(__multiContentTypeExpr);
187 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Append operation.");
191 switch (__contentType)
193 // Image-0,video-1,sound-2,music-3,other-4
194 case CONTENT_TYPE_OTHER:
195 inputCondition = "MEDIA_TYPE=4 ";
197 case CONTENT_TYPE_IMAGE:
198 inputCondition = "MEDIA_TYPE=0 ";
200 case CONTENT_TYPE_AUDIO:
201 inputCondition = "(MEDIA_TYPE=2 or MEDIA_TYPE=3) ";
203 case CONTENT_TYPE_VIDEO:
204 inputCondition = "MEDIA_TYPE=1 ";
206 case CONTENT_TYPE_ALL:
207 //If content type is CONTENT_TYPE_ALL, then MEDIA_TYPE is empty
214 if (!folderPath.IsEmpty())
216 if (!inputCondition.IsEmpty()) //For CONTENT_TYPE_ALL inputCondition is empty
218 r = inputCondition.Append("AND FOLDER_PATH = ");
219 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Append operation.");
223 r = inputCondition.Append("FOLDER_PATH = ");
224 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Append operation.");
227 r = folderPath.Replace("\'", "''");
228 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Replace operation for nameExpr.");
230 r = folderPath.Insert('\'', 0);
231 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Insert operation for nameExpr.");
233 r = folderPath.Insert('\'', folderPath.GetLength());
234 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Insert operation for nameExpr.");
236 r = inputCondition.Append(folderPath);
237 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform Append operation.");
240 if (!inputCondition.IsEmpty())
242 //CopyToCharArrayN: utility function, converts a osp string to char*
243 std::unique_ptr<char[]> pInputCond(_StringConverter::CopyToCharArrayN(inputCondition));
244 SysTryReturnResult(NID_CNT, pInputCond, E_OUT_OF_MEMORY, "The memory is insufficient.");
246 SysLog(NID_CNT, "pInputCond is [%s].", pInputCond.get());
248 ret = media_filter_set_condition(pFilterHandle.get(), pInputCond.get(), MEDIA_CONTENT_COLLATE_DEFAULT);
249 r = MapCoreErrorToNativeResult(ret);
250 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "Failed to perform media_filter_set_condition operation.");
253 __pFilterHandle.reset(pFilterHandle.release());
259 _ContentDirectoryImpl::GetContentDirectoryCount(void) const
261 int directoryCount = 0;
262 result r = E_SUCCESS;
263 int ret = MEDIA_CONTENT_ERROR_NONE;
265 r = CreateFolderFilter(__isMultiContentType, L"");
266 SysTryReturnResult(NID_CNT, !IsFailed(r), E_SYSTEM, "Propagating for CreateFolderFilter.");
268 ret = media_folder_get_folder_count_from_db(__pFilterHandle.get(), &directoryCount);
269 r = MapCoreErrorToNativeResult(ret);
270 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "Failed to perform media_folder_get_folder_count_from_db operation.");
272 SysLog(NID_CNT, "directoryCount is [%d].", directoryCount);
275 return directoryCount;
279 _ContentDirectoryImpl::GetContentDirectoryPathListN(Tizen::Base::SortOrder sortOrder) const
281 result r = E_SUCCESS;
282 int ret = MEDIA_CONTENT_ERROR_NONE;
283 std::unique_ptr<GList, GListDeleter> pItemList;
284 GList* pTempList = null;
285 char* pTempFolderPath = null;
286 std::unique_ptr<media_folder_s, FolderHandleDeleter> pFolderHandle;
287 std::unique_ptr<Object> pValue;
289 __pFinalOutList = std::unique_ptr<ArrayList, AllElementsDeleter>(new (std::nothrow) ArrayList());
290 SysTryReturn(NID_CNT, __pFinalOutList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] FinalOutList is null.");
292 r = __pFinalOutList->Construct();
293 SysTryReturn(NID_CNT, r == E_SUCCESS, null, r, "[%s] Failed to construct __pFinalOutList ArrayList.", GetErrorMessage(r));
295 r = CreateFolderFilter(__isMultiContentType, L"");
296 SysTryReturn(NID_CNT, !IsFailed(r), null, E_SYSTEM, "[E_SYSTEM] Failed to perform CreateFolderFilter operation.");
298 if (sortOrder == SORT_ORDER_ASCENDING)
300 ret = media_filter_set_order(__pFilterHandle.get(), MEDIA_CONTENT_ORDER_ASC, MEDIA_PATH, MEDIA_CONTENT_COLLATE_NOCASE);
301 r = MapCoreErrorToNativeResult(ret);
302 SysTryReturn(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, null, r,
303 "[%s] Failed to perform media_filter_set_order operation.", GetErrorMessage(r));
305 else if (sortOrder == SORT_ORDER_DESCENDING)
307 ret = media_filter_set_order(__pFilterHandle.get(), MEDIA_CONTENT_ORDER_DESC, MEDIA_PATH, MEDIA_CONTENT_COLLATE_NOCASE);
308 r = MapCoreErrorToNativeResult(ret);
309 SysTryReturn(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, null, r,
310 "[%s] Failed to perform media_filter_set_order operation.", GetErrorMessage(r));
313 pTempList = pItemList.get();
314 ret = media_folder_foreach_folder_from_db(__pFilterHandle.get(), MediaFoldersCb, &pTempList);
315 r = MapCoreErrorToNativeResult(ret);
316 SysTryReturn(NID_CNT, !IsFailed(r), null, r, "[%s] Failed to perform media_folder_foreach_folder_from_db operation.", GetErrorMessage(r));
318 SysTryReturn(NID_CNT, pTempList != NULL, null, r, "[%s] pItemList for media_folder_foreach_folder_from_db is null.", GetErrorMessage(r));
320 for (int idx = 0; idx < (int)g_list_length(pTempList); idx++)
322 pFolderHandle.reset(static_cast<media_folder_h>(g_list_nth_data(pTempList, idx)));
324 if (pFolderHandle.get() != NULL)
326 ret = media_folder_get_path(pFolderHandle.get(), &pTempFolderPath);
327 r = MapCoreErrorToNativeResult(ret);
328 SysTryReturn(NID_CNT, !IsFailed(r), null, r, "[%s] Failed to perform media_folder_get_path operation.", GetErrorMessage(r));
330 if (pTempFolderPath != NULL)
332 SysLog(NID_CNT, "pFolderPath is [%s].", pTempFolderPath);
334 std::unique_ptr<char[], CharDeleter> pFolderPath(pTempFolderPath);
335 SysTryReturn(NID_CNT, pFolderPath != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] pFolderPath is null.");
337 pValue = std::unique_ptr<Object>(new (std::nothrow) String(pFolderPath.get()));
341 r = __pFinalOutList->Add(*(pValue.release()));
342 SysTryReturn(NID_CNT, !IsFailed(r), null, r, "[%s] Failed to perform Add operation to __pFinalOutList.", GetErrorMessage(r));
348 return __pFinalOutList.release();
352 _ContentDirectoryImpl::GetContentDirectoryItemCount(const Tizen::Base::String& contentDirectoryPath) const
354 SysLog(NID_CNT, "contentDirectoryPath is [%ls]", contentDirectoryPath.GetPointer());
356 int directoryItemCount = 0;
357 result r = E_SUCCESS;
358 int ret = MEDIA_CONTENT_ERROR_NONE;
359 GList* pItemList = NULL;
360 char* pTempFolderId = null;
361 std::unique_ptr<media_folder_s, FolderHandleDeleter> pFolderHandle;
363 SysTryReturn(NID_CNT, CheckMediaPath(contentDirectoryPath), directoryItemCount, E_INVALID_ARG,
364 "[E_INVALID_ARG] Failed to perform CheckMediaPath operation.");
366 String detachedPath = contentDirectoryPath;
368 if (contentDirectoryPath.EndsWith(L"/"))
370 r = detachedPath.Remove(detachedPath.GetLength() - 1, 1);
371 SysTryReturn(NID_CNT, !IsFailed(r), directoryItemCount, E_INVALID_ARG, "[E_INVALID_ARG] Failed to remove the path string.");
374 r = CreateFolderFilter(__isMultiContentType, detachedPath);
375 SysTryReturn(NID_CNT, !IsFailed(r), directoryItemCount, E_SYSTEM, "[E_SYSTEM] Failed to perform CreateFolderFilter operation.");
377 ret = media_folder_foreach_folder_from_db(__pFilterHandle.get(), MediaFoldersCb, &pItemList);
378 r = MapCoreErrorToNativeResult(ret);
379 SysTryReturn(NID_CNT, r == E_SUCCESS, directoryItemCount, r,
380 "[%s] Failed to perform media_folder_foreach_folder_from_db operation.", GetErrorMessage(r));
382 SysTryReturn(NID_CNT, pItemList != NULL, directoryItemCount, r,
383 "[%s] pItemList for media_folder_foreach_folder_from_db is null.", GetErrorMessage(r));
385 for (int idx = 0; idx < (int)g_list_length(pItemList); idx++)
387 SysLog(NID_CNT, "idx is [%d] and (int)g_list_length(pItemList) is [%d].", idx, (int)g_list_length(pItemList));
389 pFolderHandle.reset(static_cast<media_folder_h>(g_list_nth_data(pItemList, idx)));
391 if (pFolderHandle.get() != NULL)
393 ret = media_folder_get_folder_id(pFolderHandle.get(), &pTempFolderId);
394 r = MapCoreErrorToNativeResult(ret);
395 SysTryReturn(NID_CNT, !IsFailed(r), directoryItemCount, r,
396 "[%s] Failed to perform media_folder_get_folder_id operation.", GetErrorMessage(r));
401 SysTryReturn(NID_CNT, r != E_SUCCESS, directoryItemCount, r, "[E_SYSTEM] pFolderHandle is null.");
405 if (pTempFolderId != NULL)
407 std::unique_ptr<char[], CharDeleter> pFolderId(pTempFolderId);
408 SysTryReturnResult(NID_CNT, pFolderId != null, E_OUT_OF_MEMORY, "pFolderId is null.");
410 r = CreateFolderFilter(__isMultiContentType, L"");
411 SysTryReturn(NID_CNT, !IsFailed(r), directoryItemCount, E_SYSTEM, "[E_SYSTEM] Failed to perform CreateFolderFilter operation.");
413 ret = media_folder_get_media_count_from_db(pFolderId.get(), __pFilterHandle.get(), &directoryItemCount);
414 r = MapCoreErrorToNativeResult(ret);
415 SysTryReturn(NID_CNT, !IsFailed(r), directoryItemCount, r,
416 "[%s] Failed to perform media_folder_get_media_count_from_db operation.", GetErrorMessage(r));
419 SysLog(NID_CNT, "directoryItemCount is [%d].", directoryItemCount);
422 return directoryItemCount;
425 // Osp column names are mapped with slp column names
426 // CONTENT_TYPE_OTHER and CONTENT_TYPE_IMAGE (0 - 13 ) are valid columns
427 // CONTENT_TYPE_VIDEO (0 - 16 ) are valid columns
428 // CONTENT_TYPE_ALL and CONTENT_TYPE_VIDEO (0 - 18 ) are valid columns
429 // if the given osp column is out of the specified range of the type, E_INVALID_ARG is retuned.
431 _ContentDirectoryImpl::GetSlpColumnName(String& inputCol, String sortCol) const
433 String ospColumnName(L"");
434 String slpColumnName(L"");
435 String columnName(sortCol);
436 result r = E_SUCCESS;
437 int maxCols = MAX_QUERY_COLUMNS;
439 if(!__isMultiContentType)
441 switch (__contentType)
443 case CONTENT_TYPE_OTHER:
445 case CONTENT_TYPE_IMAGE:
446 maxCols = MAX_QUERY_COLUMNS_FOR_IMAGE_OTHERS;
448 case CONTENT_TYPE_VIDEO:
449 maxCols = MAX_QUERY_COLUMNS_FOR_VIDEO;
451 case CONTENT_TYPE_AUDIO:
453 case CONTENT_TYPE_ALL:
454 maxCols = MAX_QUERY_COLUMNS;
462 if(!__multiContentTypeExpr.IsEmpty())
464 if(__multiContentTypeExpr.Contains("MEDIA_TYPE=2"))
466 maxCols = MAX_QUERY_COLUMNS;
468 else if(__multiContentTypeExpr.Contains("MEDIA_TYPE=1"))
470 maxCols = MAX_QUERY_COLUMNS_FOR_VIDEO;
472 else if(__multiContentTypeExpr.Contains("MEDIA_TYPE=0"))
474 maxCols = MAX_QUERY_COLUMNS_FOR_IMAGE_OTHERS;
479 for (int colIndex=0; colIndex < maxCols; colIndex++)
481 ospColumnName.Clear();
482 slpColumnName.Clear();
484 ospColumnName = dbfieldinfo[colIndex].dbFieldOspName ;
485 slpColumnName = dbfieldinfo[colIndex].dbFieldSlpName ;
487 ospColumnName.ToUpper();
488 columnName.ToUpper();
490 if (columnName == ospColumnName)
492 inputCol = slpColumnName;
496 return E_INVALID_ARG;
500 _ContentDirectoryImpl::GetContentDirectoryItemListN(const Tizen::Base::String& contentDirectoryPath, int pageNo, int countPerPage,
501 const Tizen::Base::String& column, Tizen::Base::SortOrder sortOrder) const
503 SysLog(NID_CNT, "contentDirectoryPath is [%ls].", contentDirectoryPath.GetPointer());
505 result r = E_SUCCESS;
507 int totalPageCount = 0;
508 int ret = MEDIA_CONTENT_ERROR_NONE;
509 String slpColumn = L"";
510 std::unique_ptr<GList, GListDeleter> pItemList;
511 GList* pTempList = null;
512 char* pTempFolderId = null;
513 std::unique_ptr<char[], CharDeleter> pFolderId;
514 std::unique_ptr<media_folder_s, FolderHandleDeleter> pFolderHandle;
517 SysTryReturn(NID_CNT, CheckMediaPath(contentDirectoryPath), null, E_INVALID_ARG,
518 "[E_INVALID_ARG] Failed to perform CheckMediaPath operation.");
520 String detachedPath = contentDirectoryPath;
522 if (contentDirectoryPath.EndsWith(L"/"))
524 r = detachedPath.Remove(detachedPath.GetLength() - 1, 1);
525 SysTryReturn(NID_CNT, !IsFailed(r), null, E_INVALID_ARG, "[E_INVALID_ARG] Failed to remove the path string.");
528 if (!column.IsEmpty())
530 //__inputColumnName (osp column name) is replaced with slpColumn (slp column name).
531 r = GetSlpColumnName(slpColumn, column);
532 SysTryReturn(NID_CNT, !IsFailed(r), null, r, "[%s] Failed to perform GetSlpColumnName operation.", GetErrorMessage(r));
535 __pFinalOutList = std::unique_ptr<ArrayList, AllElementsDeleter>(new (std::nothrow) ArrayList());
536 SysTryReturn(NID_CNT, __pFinalOutList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] FinalOutList is null.");
538 r = __pFinalOutList->Construct();
539 SysTryReturn(NID_CNT, r == E_SUCCESS, null, r, "[%s] Failed to construct __pFinalOutList ArrayList.", GetErrorMessage(r));
541 r = CreateFolderFilter(__isMultiContentType, detachedPath);
542 SysTryReturn(NID_CNT, !IsFailed(r), null, E_SYSTEM, "[E_SYSTEM] Failed to perform CreateFolderFilter operation.");
544 pTempList = pItemList.get();
545 ret = media_folder_foreach_folder_from_db(__pFilterHandle.get(), MediaFoldersCb, &pTempList);
546 r = MapCoreErrorToNativeResult(ret);
547 SysTryReturn(NID_CNT, !IsFailed(r), null, r,
548 "[%s] Failed to perform media_folder_foreach_folder_from_db operation.", GetErrorMessage(r));
550 if (pTempList != NULL)
552 for (int idx = 0; idx < (int)g_list_length(pTempList); idx++)
554 SysLog(NID_CNT, "idx is [%d] and (int)g_list_length(pItemList) is [%d].", idx, (int)g_list_length(pTempList));
556 pFolderHandle.reset(static_cast<media_folder_h>(g_list_nth_data(pTempList, idx)));
558 if (pFolderHandle.get() != NULL)
560 ret = media_folder_get_folder_id(pFolderHandle.get(), &pTempFolderId);
561 r = MapCoreErrorToNativeResult(ret);
562 SysTryReturn(NID_CNT, !IsFailed(r), null, r,
563 "[%s] Failed to perform media_folder_get_folder_id operation.", GetErrorMessage(r));
568 SysTryReturn(NID_CNT, r != E_SUCCESS, null, r, "[E_SYSTEM] pFolderHandle is null.");
573 if (pTempFolderId != NULL)
575 pFolderId = std::unique_ptr<char[], CharDeleter>(pTempFolderId);
576 SysTryReturn(NID_CNT, pFolderId != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] pFolderId is null.");
578 r = CreateFolderFilter(__isMultiContentType, L"");
579 SysTryReturn(NID_CNT, !IsFailed(r), null, E_SYSTEM, "[E_SYSTEM] Failed to perform CreateFolderFilter operation.");
581 ret = media_folder_get_media_count_from_db(pFolderId.get(), __pFilterHandle.get(), &totalCount);
582 r = MapCoreErrorToNativeResult(ret);
583 SysTryReturn(NID_CNT, !IsFailed(r), null, r,
584 "[%s] Failed to perform media_folder_get_media_count_from_db operation.", GetErrorMessage(r));
586 SysLog(NID_CNT, "totalCount is [%d].", totalCount);
591 if ((totalCount % countPerPage) == 0)
593 totalPageCount = totalCount / countPerPage;
597 totalPageCount = (totalCount / countPerPage) + 1;
600 SysTryReturn(NID_CNT, ((pageNo >= 1) && (pageNo <= totalPageCount)) , NULL, E_INVALID_ARG, "[E_INVALID_ARG] (pageNo < 1) || (pageNo > totalPageCount).");
602 offset = (pageNo * countPerPage) - countPerPage;
604 SysLog(NID_CNT, "totalCount [%d] totalPageCount[%d] __countPerPage[%d] __pageNo[%d] offset[%d]",
605 totalCount, totalPageCount, countPerPage, pageNo, offset);
607 if ((!column.IsEmpty()) && (sortOrder != SORT_ORDER_NONE))
609 //CopyToCharArrayN: utility function, converts a osp string to char*
610 std::unique_ptr<char[]> pSortCol(_StringConverter::CopyToCharArrayN(slpColumn));
611 SysTryReturn(NID_CNT, pSortCol, null, E_OUT_OF_MEMORY, "The memory is insufficient.");
613 if (sortOrder == SORT_ORDER_ASCENDING)
615 ret = media_filter_set_order(__pFilterHandle.get(), MEDIA_CONTENT_ORDER_ASC, pSortCol.get(), MEDIA_CONTENT_COLLATE_NOCASE);
616 r = MapCoreErrorToNativeResult(ret);
617 SysTryReturn(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, null, r,
618 "[%s] Failed to perform media_filter_set_order operation.", GetErrorMessage(r));
620 else if (sortOrder == SORT_ORDER_DESCENDING)
622 ret = media_filter_set_order(__pFilterHandle.get(), MEDIA_CONTENT_ORDER_DESC, pSortCol.get(), MEDIA_CONTENT_COLLATE_NOCASE);
623 r = MapCoreErrorToNativeResult(ret);
624 SysTryReturn(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, null, r,
625 "[%s] Failed to perform media_filter_set_order operation.", GetErrorMessage(r));
629 ret = media_filter_set_offset(__pFilterHandle.get(),offset,countPerPage);
630 r = MapCoreErrorToNativeResult(ret);
631 SysTryReturn(NID_CNT, !IsFailed(r), null, r, "[%s] Failed to perform media_filter_set_offset operation.", GetErrorMessage(r));
633 r = FillFinalOutList(pFolderId.get());
634 SysTryReturn(NID_CNT, !IsFailed(r), null, E_SYSTEM, "[E_SYSTEM] Failed to perform FillFinalOutList operation.");
639 SysTryReturn(NID_CNT, !(IsFailed(r)), null, r, "[E_INVALID_ARG] (pageNo > 1) and (totalcount = 0).");
643 return __pFinalOutList.release();
647 _ContentDirectoryImpl::FillFinalOutList(char* pFolderId) const
649 int ret = MEDIA_CONTENT_ERROR_NONE;
650 result r = E_SUCCESS;
651 GList* pTempList = NULL;
652 std::unique_ptr<media_info_s, MediaHandleDeleter> pMediaHandle;
654 ContentInfo::_ContentData* pContentData = null;
655 ImageContentInfo::_ImageContentData* pImageContentData = null;
656 AudioContentInfo::_AudioContentData* pAudioContentData = null;
657 VideoContentInfo::_VideoContentData* pVideoContentData = null;
659 std::unique_ptr<ImageContentInfo> pImageContentInfo;
660 std::unique_ptr<AudioContentInfo> pAudioContentInfo;
661 std::unique_ptr<VideoContentInfo> pVideoContentInfo;
662 std::unique_ptr<OtherContentInfo> pOtherContentInfo;
664 ret = media_folder_foreach_media_from_db(pFolderId, __pFilterHandle.get(), MediaFolderItemsCb, &pTempList);
665 r = MapCoreErrorToNativeResult(ret);
666 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_folder_foreach_media_from_db operation.");
668 SysTryReturnResult(NID_CNT, pTempList != NULL, r, "pItemList for media_info_foreach_media_from_db is null.");
670 std::unique_ptr<GList, GListDeleter> pItemList(pTempList);
671 SysTryReturnResult(NID_CNT, pItemList != null, E_OUT_OF_MEMORY, "pItemList is null.");
673 media_content_type_e mediaType;
675 for (int idx = 0; idx < (int)g_list_length(pItemList.get()); idx++)
677 pMediaHandle.reset(static_cast<media_info_h>(g_list_nth_data(pItemList.get(), idx)));
679 ret = media_info_get_media_type(pMediaHandle.get(), &mediaType);
680 r = MapCoreErrorToNativeResult(ret);
681 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_info_get_media_type operation.");
685 case MEDIA_CONTENT_TYPE_OTHERS:
686 pOtherContentInfo = std::unique_ptr<OtherContentInfo>(new (std::nothrow) OtherContentInfo);
687 SysTryReturnResult(NID_CNT, pOtherContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pOtherContentInfo.");
689 pContentData = pOtherContentInfo->GetContentData();
690 SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
692 r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);
693 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");
695 // Shallow copy, adds just the pointer: not the element
696 r = __pFinalOutList->Add(*(pOtherContentInfo.release()));
697 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation to pFinalOutList.");
700 case MEDIA_CONTENT_TYPE_IMAGE:
701 pImageContentInfo = std::unique_ptr<ImageContentInfo>(new (std::nothrow) ImageContentInfo);
702 SysTryReturnResult(NID_CNT, pImageContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pImageContentInfo.");
704 pContentData = pImageContentInfo->GetContentData();
705 SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
707 pImageContentData = pImageContentInfo->GetImageContentData();
708 SysTryReturnResult(NID_CNT, pImageContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
710 r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);
711 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");
713 r = _ContentUtility::FillImageContentData(pMediaHandle.get(), pImageContentData);
714 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform GetDataFromImageTable operation.");
716 // Shallow copy, adds just the pointer: not the element
717 r = __pFinalOutList->Add(*(pImageContentInfo.release()));
718 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation to __pFinalOutList.");
721 case MEDIA_CONTENT_TYPE_MUSIC:
723 case MEDIA_CONTENT_TYPE_SOUND:
724 pAudioContentInfo = std::unique_ptr<AudioContentInfo>(new (std::nothrow) AudioContentInfo);
725 SysTryReturnResult(NID_CNT, pAudioContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pAudioContentInfo.");
727 pContentData = pAudioContentInfo->GetContentData();
728 SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
730 pAudioContentData = pAudioContentInfo->GetAudioContentData();
731 SysTryReturnResult(NID_CNT, pAudioContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
733 r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);
734 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");
736 r = _ContentUtility::FillAudioContentData(pMediaHandle.get(), pAudioContentData);
737 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillAudioContentData operation.");
739 // Shallow copy, adds just the pointer: not the element
740 r = __pFinalOutList->Add(*(pAudioContentInfo.release()));
741 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation to __pFinalOutList.");
744 case MEDIA_CONTENT_TYPE_VIDEO:
745 pVideoContentInfo = std::unique_ptr<VideoContentInfo>(new (std::nothrow) VideoContentInfo);
746 SysTryReturnResult(NID_CNT, pVideoContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pVideoContentInfo.");
748 pContentData = pVideoContentInfo->GetContentData();
749 SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
751 pVideoContentData = pVideoContentInfo->GetVideoContentData();
752 SysTryReturnResult(NID_CNT, pVideoContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
754 r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);
755 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");
757 r = _ContentUtility::FillVideoContentData(pMediaHandle.get(), pVideoContentData);
758 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillVideoContentData operation.");
760 // Shallow copy, adds just the pointer: not the element
761 r = __pFinalOutList->Add(*(pVideoContentInfo.release()));
762 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation to __pFinalOutList.");
774 _ContentDirectoryImpl::CheckMediaPath(const Tizen::Base::String& directoryPath) const
776 String phoneStr = Environment::GetMediaPath();
777 String mmcStr = Environment::GetExternalStoragePath();
779 if (!(directoryPath.StartsWith(phoneStr, 0) || directoryPath.StartsWith(mmcStr , 0)))
782 result r = phoneStr.SubString(0, (phoneStr.GetLength() - 1), checkPhone);
783 SysTryReturn(NID_CNT, !IsFailed(r), false, E_INVALID_ARG, "[E_INVALID_ARG] Failed to substring operation.");
786 r = mmcStr.SubString(0, (mmcStr.GetLength() - 1), checkMmc);
787 SysTryReturn(NID_CNT, !IsFailed(r), false, E_INVALID_ARG, "[E_INVALID_ARG] Failed to substring operation.");
789 SysTryReturn(NID_CNT, (directoryPath.Equals(checkPhone) || directoryPath.Equals(checkMmc)), false, E_INVALID_ARG,
790 "[E_INVALID_ARG] The contentDirectoryPath is not valid[%ls].", directoryPath.GetPointer());
797 _ContentDirectoryImpl::MapCoreErrorToNativeResult(int reason) const
799 result r = E_SUCCESS;
803 case MEDIA_CONTENT_ERROR_NONE:
807 case MEDIA_CONTENT_ERROR_DB_BUSY:
809 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_DB_BUSY");
812 case MEDIA_CONTENT_ERROR_DB_FAILED:
814 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_DB_FAILED");
817 case MEDIA_CONTENT_ERROR_OUT_OF_MEMORY:
819 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_OUT_OF_MEMORY");
823 SysLog(NID_CNT, "default");
830 // Callback function registered to each media info details
831 // all items are appended to the list
833 MediaFoldersCb(media_folder_h folder, void* pUserdata)
835 int ret = MEDIA_CONTENT_ERROR_NONE;
836 media_folder_h new_folder = NULL;
837 ret = media_folder_clone(&new_folder, folder);
838 SysTryLog(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, "[E_SYSTEM] Propagating for media_folder_clone.");
840 GList** pList = (GList**)pUserdata;
841 *pList = g_list_append(*pList, new_folder);
846 // Callback function registered to each media info details
847 // all items are appended to the list
849 MediaFolderItemsCb(media_info_h media, void* pUserdata)
851 int ret = MEDIA_CONTENT_ERROR_NONE;
852 media_info_h new_media = NULL;
853 ret = media_info_clone(&new_media, media);
854 SysTryLog(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, "[E_SYSTEM] Propagating for media_info_clone.");
856 GList** pList = (GList**)pUserdata;
857 *pList = g_list_append(*pList, new_media);