2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
\r
4 // Licensed under the Apache License, Version 2.0 (the License);
\r
5 // you may not use this file except in compliance with the License.
\r
6 // You may obtain a copy of the License at
\r
8 // http://www.apache.org/licenses/LICENSE-2.0
\r
10 // Unless required by applicable law or agreed to in writing, software
\r
11 // distributed under the License is distributed on an "AS IS" BASIS,
\r
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 // See the License for the specific language governing permissions and
\r
14 // limitations under the License.
\r
17 * @file FCnt_ContentSearchImpl.cpp
\r
18 * @brief This is the implementation file for the %_ContentSearchImpl class.
\r
20 * This file contains implementation of the %_ContentSearchImpl class.
\r
24 #include <FBaseSysLog.h>
\r
25 #include <FBaseInteger.h>
\r
26 #include <FBaseLongLong.h>
\r
27 #include <FBaseFloat.h>
\r
28 #include <FBaseColIList.h>
\r
29 #include <FBaseUtilStringTokenizer.h>
\r
30 #include <FCntContentSearch.h>
\r
31 #include <FCntContentSearchResult.h>
\r
32 #include <FBase_StringConverter.h>
\r
33 #include <FCnt_ContentUtility.h>
\r
34 #include <FCnt_ContentSearchImpl.h>
\r
36 using namespace Tizen::Base;
\r
37 using namespace Tizen::Base::Collection;
\r
38 using namespace Tizen::Base::Utility;
\r
39 using namespace Tizen::Io;
\r
41 namespace Tizen { namespace Content
\r
44 static const int QUERY_LENGTH = 4096;
\r
46 // Declaration for Callback function registered to each media info details
\r
47 bool MediaItemCb(media_info_h media, void* pUserdata);
\r
48 // Declaration for Callback function registered to each column details
\r
49 bool GroupItemCb(const char* pGroupName, void* pUserdata);
\r
50 // Declaration for Callback function registered to each album details
\r
51 bool AlbumItemCb(media_album_h album, void* pUserdata);
\r
53 // Default constructor
\r
54 _ContentSearchImpl::_ContentSearchImpl(void)
\r
56 , __contentType(CONTENT_TYPE_UNKNOWN)
\r
57 , __pFinalOutList(NULL)
\r
59 , __inputColumnName(L"")
\r
60 , __inputSortOrder(SORT_ORDER_NONE)
\r
61 , __pFilterHandle(0)
\r
63 SysLog(NID_CNT, "Enter\n");
\r
67 // Default destructor (disconnects the DB connection)
\r
68 _ContentSearchImpl::~_ContentSearchImpl(void)
\r
70 SysLog(NID_CNT, "Enter\n");
\r
72 int ret = MEDIA_CONTENT_ERROR_NONE;
\r
73 result r = E_SUCCESS;
\r
75 ret = media_content_disconnect();
\r
76 r = MapCoreErrorToNativeResult(ret);
\r
77 SysTryLog(NID_CNT, r == E_SUCCESS, "[%s] Propagated in ~_ContentSearchImpl", GetErrorMessage(r));
\r
81 _ContentSearchImpl::GetInstance(ContentSearch& contentSearch)
\r
83 return contentSearch.__pImpl;
\r
86 const _ContentSearchImpl*
\r
87 _ContentSearchImpl::GetInstance(const ContentSearch& contentSearch)
\r
89 return contentSearch.__pImpl;
\r
92 //make a connection to DB
\r
94 _ContentSearchImpl::Construct(ContentType type)
\r
96 SysLog(NID_CNT, "Enter\n");
\r
98 result r = E_SUCCESS;
\r
99 int ret = MEDIA_CONTENT_ERROR_NONE;
\r
101 ret = media_content_connect();
\r
102 SysTryReturnResult(NID_CNT, r == E_SUCCESS , E_SYSTEM, "Failed to perform media_content_connect operation.");
\r
104 __contentType = type;
\r
109 // Creates a filter for the input query string along with content type
\r
110 // Initializes filter handle
\r
111 // Image - MEDIA_TYPE=0
\r
112 // Vide0 - MEDIA_TYPE=1
\r
113 // Audio - MEDIA_TYPE=2 or MEDIA_TYPE=3
\r
114 // Others - MEDIA_TYPE=4
\r
116 // Appends MEDIA_TYPE with "AND" (if the input expression is not empty and content type is not ALL) and input expression
\r
117 // Sets the condition and order.
\r
118 // If any argument is not proper E_INVALID_ARG is returned
\r
120 _ContentSearchImpl::CreateQueryFilter(bool isAndAppendReq) const
\r
122 int ret = MEDIA_CONTENT_ERROR_NONE;
\r
123 result r = E_SUCCESS;
\r
125 std::unique_ptr<char[]> pInputCond;
\r
126 std::unique_ptr<char[]> pSortCol;
\r
128 String inputCondition;
\r
131 std::unique_ptr<filter_h, SearchFilterHandleDeleter> pFilterHandle(new (std::nothrow) filter_h);
\r
133 ret = media_filter_create(pFilterHandle.get());
\r
134 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, E_SYSTEM, "Failed to perform media_filter_create operation.");
\r
136 switch (__contentType)
\r
138 // Image-0,video-1,sound-2,music-3,other-4
\r
139 case CONTENT_TYPE_OTHER:
\r
140 inputCondition = "MEDIA_TYPE=4 ";
\r
142 case CONTENT_TYPE_IMAGE:
\r
143 inputCondition = "MEDIA_TYPE=0 ";
\r
145 case CONTENT_TYPE_AUDIO:
\r
146 inputCondition = "(MEDIA_TYPE=2 or MEDIA_TYPE=3) ";
\r
148 case CONTENT_TYPE_VIDEO:
\r
149 inputCondition = "MEDIA_TYPE=1 ";
\r
151 case CONTENT_TYPE_ALL:
\r
152 //If content type is CONTENT_TYPE_ALL, then MEDIA_TYPE is empty
\r
158 if (!__inputExpr.IsEmpty())
\r
160 if (isAndAppendReq && (!inputCondition.IsEmpty())) //For CONTENT_TYPE_ALL inputCondition is empty
\r
162 r = inputCondition.Append("AND ");
\r
163 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform append operation.");
\r
166 r = inputCondition.Append(__inputExpr);
\r
167 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform append operation.");
\r
170 if (!inputCondition.IsEmpty())
\r
172 //CopyToCharArrayN: utility function, converts a osp string to char*
\r
173 pInputCond = std::unique_ptr<char[]>(_StringConverter::CopyToCharArrayN(inputCondition));
\r
174 SysTryReturnResult(NID_CNT, pInputCond, E_OUT_OF_MEMORY, "pInputCond is NULL.");
\r
176 SysLog(NID_CNT, "pInputCond = %s", pInputCond.get());
\r
178 ret = media_filter_set_condition(*(pFilterHandle.get()), pInputCond.get(), MEDIA_CONTENT_COLLATE_DEFAULT);
\r
179 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, E_SYSTEM, "Failed to perform media_filter_set_condition operation.");
\r
182 if (!__inputColumnName.IsEmpty()) // SortColumn is optional in case of SearchN
\r
184 //__inputColumnName (osp column name) is replaced with slpColumn (slp column name).
\r
185 r = GetSlpColumnName(slpColumn);
\r
186 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform GetSlpColumnName operation.");
\r
188 //CopyToCharArrayN: utility function, converts a osp string to char*
\r
190 pSortCol = std::unique_ptr<char[]>(_StringConverter::CopyToCharArrayN(slpColumn));
\r
191 SysTryReturnResult(NID_CNT, pSortCol, E_OUT_OF_MEMORY, "pSortCol is NULL.");
\r
193 if (__inputSortOrder == SORT_ORDER_ASCENDING)
\r
195 ret = media_filter_set_order(*(pFilterHandle.get()), MEDIA_CONTENT_ORDER_ASC, pSortCol.get(), MEDIA_CONTENT_COLLATE_DEFAULT);
\r
196 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, E_SYSTEM, "Failed to perform media_filter_set_order operation.");
\r
198 else if (__inputSortOrder == SORT_ORDER_DESCENDING)
\r
200 ret = media_filter_set_order(*(pFilterHandle.get()), MEDIA_CONTENT_ORDER_DESC, pSortCol.get(), MEDIA_CONTENT_COLLATE_DEFAULT);
\r
201 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, E_SYSTEM, "Failed to perform media_filter_set_order operation.");
\r
205 __pFilterHandle.reset(pFilterHandle.release());
\r
210 // Osp column names are mapped with slp column names
\r
211 // CONTENT_TYPE_OTHER and CONTENT_TYPE_IMAGE (0 - 13 ) are valid columns
\r
212 // CONTENT_TYPE_VIDEO (0 - 16 ) are valid columns
\r
213 // CONTENT_TYPE_ALL and CONTENT_TYPE_VIDEO (0 - 18 ) are valid columns
\r
214 // if the given osp column is out of the specified range of the type, E_INVALID_ARG is retuned.
\r
216 _ContentSearchImpl::GetSlpColumnName(String& inputCol) const
\r
218 String ospColumnName(L"");
\r
219 String slpColumnName(L"");
\r
220 String columnName(__inputColumnName);
\r
221 result r = E_SUCCESS;
\r
223 switch (__contentType)
\r
225 case CONTENT_TYPE_OTHER:
\r
227 case CONTENT_TYPE_IMAGE:
\r
228 maxCols = MAX_QUERY_COLUMNS_FOR_IMAGE_OTHERS;
\r
230 case CONTENT_TYPE_VIDEO:
\r
231 maxCols = MAX_QUERY_COLUMNS_FOR_VIDEO;
\r
233 case CONTENT_TYPE_AUDIO:
\r
235 case CONTENT_TYPE_ALL:
\r
236 maxCols = MAX_QUERY_COLUMNS;
\r
241 for (int colIndex = 0; colIndex < maxCols; colIndex++)
\r
243 ospColumnName.Clear();
\r
244 slpColumnName.Clear();
\r
246 ospColumnName = dbfieldinfo[colIndex].dbFieldOspName ;
\r
247 slpColumnName = dbfieldinfo[colIndex].dbFieldSlpName ;
\r
249 ospColumnName.ToUpper();
\r
250 columnName.ToUpper();
\r
251 if (columnName == ospColumnName)
\r
253 inputCol = slpColumnName;
\r
257 return E_INVALID_ARG;
\r
260 //If the input expression contains any osp column name, it will be replaced with slp column name.
\r
261 // only CONTENT_TYPE_AUDIO and CONTENT_TYPE_ALL allowed to use all given columns
\r
262 // so, check for invalid column for CONTENT_TYPE_OTHER,CONTENT_TYPE_IMAGE and CONTENT_TYPE_VIDEO.
\r
263 // all the osp columns in the expression should be replaced with slp column names.
\r
264 // ' is used as a delimeter in parsing user query. so, \\' is saved as a special@apostrophe string.
\r
265 // \\' is replaced with '', which considers ' as normal character.
\r
268 _ContentSearchImpl::ReplaceOspColumnNameWithSlp(void) const
\r
270 String ospColumnName(L"");
\r
271 String slpColumnName(L"");
\r
272 String splApostrophe(L"special@apostrophe");
\r
273 result r = E_SUCCESS;
\r
278 String strToBeReplaced(L"\\'");
\r
279 int strLen = strToBeReplaced.GetLength();
\r
280 int startIndex = 0;
\r
282 while(E_SUCCESS == __inputExpr.IndexOf(strToBeReplaced,startIndex,indexOf))
\r
284 int lenAfterSubStr = indexOf + strLen;
\r
285 while ((lenAfterSubStr < __inputExpr.GetLength()) && (__inputExpr[lenAfterSubStr] == ' '))
\r
289 if ((lenAfterSubStr < __inputExpr.GetLength()) && ((__inputExpr[lenAfterSubStr] == '\'') ||
\r
290 ((!__inputExpr.StartsWith(L"AND ", lenAfterSubStr)) && (!__inputExpr.StartsWith(L"OR ", lenAfterSubStr)))))
\r
292 r = __inputExpr.Remove(indexOf,strLen);
\r
293 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "Failed to perform Remove operation.");
\r
294 r = __inputExpr.Insert(splApostrophe,indexOf);
\r
295 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "Failed to perform Insert operation.");
\r
296 startIndex = indexOf + splApostrophe.GetLength();
\r
300 startIndex = lenAfterSubStr;
\r
304 SysLog(NID_CNT, "__inputExpr after splApostrophe append = %ls", __inputExpr.GetPointer());
\r
306 switch (__contentType)
\r
308 case CONTENT_TYPE_OTHER:
\r
310 case CONTENT_TYPE_IMAGE:
\r
311 r = CheckInvalidColumnInQuery();
\r
312 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_INVALID_ARG, "Invalid Column In QueryString.");
\r
313 maxCols = MAX_QUERY_COLUMNS_FOR_IMAGE_OTHERS;
\r
315 case CONTENT_TYPE_VIDEO:
\r
316 r = CheckInvalidColumnInQuery();
\r
317 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_INVALID_ARG, "Invalid Column In QueryString.");
\r
318 maxCols = MAX_QUERY_COLUMNS_FOR_VIDEO;
\r
320 case CONTENT_TYPE_AUDIO:
\r
322 case CONTENT_TYPE_ALL:
\r
323 maxCols = MAX_QUERY_COLUMNS;
\r
328 for (int colIndex = 0; colIndex < maxCols; colIndex++)
\r
330 ospColumnName.Clear();
\r
331 slpColumnName.Clear();
\r
333 ospColumnName = dbfieldinfo[colIndex].dbFieldOspName ;
\r
334 slpColumnName = dbfieldinfo[colIndex].dbFieldSlpName ;
\r
336 ReplaceString(ospColumnName,slpColumnName);
\r
339 // Append ESCAPE '\' for LIKE query
\r
340 r = AppendEscapeKeywordForLikeQuery();
\r
341 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "AppendEscapeKeywordForLikeQuery failed.");
\r
343 r = ReplaceDateTimeStringWithInt();
\r
344 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_INVALID_ARG, "ReplaceDateTimeStringWithInt failed.");
\r
346 // replace splApostrophe string with actual
\r
347 r = __inputExpr.Replace(splApostrophe, "''");
\r
348 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string Replace failed.");
\r
353 //This function is to appened ESCAPE keyword for _ and % special characters in LIKE query.
\r
356 _ContentSearchImpl::AppendEscapeKeywordForLikeQuery(void) const
\r
358 String delim = L"'"; //Delimeters is ' .
\r
359 result r = E_SUCCESS;
\r
361 bool isAppendEscape = false;
\r
364 String inputExpr = __inputExpr;
\r
366 // Create a StringTokenizer instance
\r
367 StringTokenizer strTok(inputExpr, delim);
\r
371 while (strTok.HasMoreTokens())
\r
373 r = strTok.GetNextToken(token);
\r
374 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "GetNextToken failed.");
\r
375 if (isCol) //column name
\r
378 tokenUpper = token;
\r
379 tokenUpper.ToUpper();
\r
380 if (tokenUpper.Contains(" LIKE"))
\r
382 isAppendEscape = true;
\r
386 isAppendEscape = false;
\r
388 r = inputExpr.Append(token);
\r
389 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");
\r
391 else // value of the column
\r
394 r = inputExpr.Append("'");
\r
395 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");
\r
396 r = inputExpr.Append(token);
\r
397 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");
\r
398 r = inputExpr.Append("'");
\r
399 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");
\r
401 if (isAppendEscape)
\r
403 if (token.Contains("\\_") || token.Contains("\\%"))
\r
405 r = inputExpr.Append("ESCAPE'\\' ");
\r
406 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");
\r
412 __inputExpr.Clear();
\r
413 r = __inputExpr.Insert(inputExpr, 0);
\r
414 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string insert failed.");
\r
419 //This function is to replace DateTime value(osp datetime type is string) which is string with int.(SLP dateTime column type is int)
\r
422 _ContentSearchImpl::ReplaceDateTimeStringWithInt(void) const
\r
424 String delim = L"'"; //Delimeters is ' .
\r
425 result r = E_SUCCESS;
\r
427 bool isConvertReq = false;
\r
428 bool isBetweenExistsInDateTimeQuery = false;
\r
431 String inputExpr = __inputExpr;
\r
433 if(!inputExpr.Contains("MEDIA_ADDED_TIME"))
\r
438 // Create a StringTokenizer instance
\r
439 StringTokenizer strTok(inputExpr, delim);
\r
443 while (strTok.HasMoreTokens())
\r
445 r = strTok.GetNextToken(token);
\r
446 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "GetNextToken failed.");
\r
447 if (isCol) //column name
\r
450 tokenUpper = token;
\r
451 tokenUpper.ToUpper();
\r
452 if(isBetweenExistsInDateTimeQuery)
\r
454 isBetweenExistsInDateTimeQuery = false;
\r
455 isConvertReq = true;
\r
459 if (tokenUpper.Contains("MEDIA_ADDED_TIME"))
\r
461 if (tokenUpper.Contains("BETWEEN"))
\r
463 isBetweenExistsInDateTimeQuery = true;
\r
465 isConvertReq = true;
\r
469 isConvertReq = false;
\r
473 r = inputExpr.Append(token);
\r
474 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string append failed.");
\r
476 else // value of the column
\r
479 r = inputExpr.Append("'");
\r
480 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string append failed.");
\r
484 Tizen::Base::DateTime dt;
\r
485 r = Tizen::Base::DateTime::Parse(token, dt);
\r
486 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to parse DateTime.");
\r
488 int year = dt.GetYear();
\r
489 int month = dt.GetMonth();
\r
490 int day = dt.GetDay();
\r
491 int hour = dt.GetHour();
\r
492 int minute = dt.GetMinute();
\r
493 int second = dt.GetSecond();
\r
496 struct tm* timeInfo;
\r
499 timeInfo = localtime(&rawTime);
\r
500 timeInfo->tm_year = year - 1900;
\r
501 timeInfo->tm_mon = month - 1;
\r
502 timeInfo->tm_mday = day;
\r
503 timeInfo->tm_hour = hour;
\r
504 timeInfo->tm_min = minute;
\r
505 timeInfo->tm_sec = second;
\r
507 time_t seconds = mktime(timeInfo);
\r
508 SysTryReturnResult(NID_CNT, seconds != -1, E_INVALID_ARG, "Failed to convert DateTime to broken-down time.");
\r
510 long long ticksInSeconds = (long long)seconds;
\r
512 r = inputExpr.Append(ticksInSeconds);
\r
513 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string append failed.");
\r
517 r = inputExpr.Append(token);
\r
518 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string append failed.");
\r
521 r = inputExpr.Append("'");
\r
522 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string append failed.");
\r
526 __inputExpr.Clear();
\r
527 r = __inputExpr.Insert(inputExpr, 0);
\r
528 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string insert failed.");
\r
533 // CONTENT_TYPE_OTHER and CONTENT_TYPE_IMAGE (0 - 13 ) are valid columns
\r
534 // CONTENT_TYPE_VIDEO (0 - 16 ) are valid columns
\r
535 // CONTENT_TYPE_ALL and CONTENT_TYPE_VIDEO (0 - 18 ) are valid columns
\r
536 // This functions checks for invalid column in the given input string (only allowed columns should be used by content type other wise
\r
537 // E_INVALID_ARG is returned)
\r
538 // StringTokenizer is used to parse input expression, by using delimater "'", to differentiate column and value.
\r
539 // As values may also contain column names
\r
540 // Ex: 1. where author = syam_author_01 2. where album = jalsa_album_name_01.
\r
543 _ContentSearchImpl::CheckInvalidColumnInQuery(void) const
\r
545 result r = E_SUCCESS;
\r
547 String delim = L"'"; //Delimeters is ' .
\r
548 bool isColReplaceReq = true;
\r
550 String inputExpr = __inputExpr;
\r
552 // Create a StringTokenizer instance
\r
553 StringTokenizer strTok(inputExpr, delim);
\r
557 while (strTok.HasMoreTokens())
\r
559 r = strTok.GetNextToken(token);
\r
560 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "strTok GetNextToken failed.");
\r
562 SysLog(NID_CNT, "In CheckInvalidColumnInQuery token[%d] = %ls", ++tokenNo, token.GetPointer());
\r
564 if (isColReplaceReq)
\r
566 isColReplaceReq = false;
\r
567 r = inputExpr.Append(token);
\r
568 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");
\r
570 switch (__contentType)
\r
572 case CONTENT_TYPE_OTHER:
\r
574 case CONTENT_TYPE_IMAGE:
\r
575 if ((token.Contains("TITLE")) || (token.Contains("ARTIST")) || (token.Contains("GENRE")))
\r
577 SysLog(NID_CNT, "Title or Artist or Genre are not valid cloumns for this content type");
\r
578 return E_INVALID_ARG;
\r
581 case CONTENT_TYPE_VIDEO:
\r
582 if ((token.Contains("COMPOSER")) || (token.Contains("ALBUM")))
\r
584 SysLog(NID_CNT, "Composer or Album are not valid cloumns for this content type");
\r
585 return E_INVALID_ARG;
\r
594 isColReplaceReq = true;
\r
595 r = inputExpr.Append("'");
\r
596 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");
\r
597 r = inputExpr.Append(token);
\r
598 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");
\r
599 r = inputExpr.Append("'");
\r
600 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");
\r
606 // It replaces osp column name with slp column name.
\r
607 // StringTokenizer is used to parse input expression, by using delimater "'", to differentiate column and value.
\r
608 // As values may also contain column names
\r
609 // Only column names are replaced but not values(values may contain column names)
\r
610 // Ex: 1. where author = syam_author_01 2. where album = jalsa_album_name_01.
\r
613 _ContentSearchImpl::ReplaceString(String ospColumnName, String slpColumnName) const
\r
615 String delim = L"'"; //Delimeters is ' .
\r
616 result r = E_SUCCESS;
\r
617 bool isColReplaceReq = true;
\r
619 String inputExpr = __inputExpr;
\r
621 // Create a StringTokenizer instance
\r
622 StringTokenizer strTok(inputExpr, delim);
\r
626 while (strTok.HasMoreTokens())
\r
628 r = strTok.GetNextToken(token); // Osp, StringTokenizer, Sample, code
\r
629 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string GetNextToken() failed.");
\r
630 if (isColReplaceReq) //column name
\r
632 isColReplaceReq = false;
\r
633 r = token.Replace(ospColumnName, slpColumnName);
\r
634 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string replace() failed.");
\r
635 r = inputExpr.Append(token);
\r
636 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");
\r
638 else // value of the column
\r
640 isColReplaceReq = true;
\r
641 r = inputExpr.Append("'");
\r
642 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");
\r
643 r = inputExpr.Append(token);
\r
644 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");
\r
645 r = inputExpr.Append("'");
\r
646 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");
\r
649 __inputExpr.Clear();
\r
650 r = __inputExpr.Insert(inputExpr, 0);
\r
651 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string insert() failed.");
\r
656 //Retuns list of search result for the given expression and content type.
\r
658 _ContentSearchImpl::SearchN(int pageNo, int countPerPage, int& totalPageCount, int& totalCount, const String& whereExpr, const String& sortColumn, SortOrder sortOrder) const
\r
660 SysLog(NID_CNT, "pageNo = %d, countPerPage = %d, whereExpr = %ls", pageNo, countPerPage, whereExpr.GetPointer());
\r
664 result r = E_SUCCESS;
\r
665 int ret = MEDIA_CONTENT_ERROR_NONE;
\r
668 __inputColumnName.Clear();
\r
669 __inputExpr.Clear();
\r
670 __inputColumnName = sortColumn;
\r
671 __inputSortOrder = sortOrder;
\r
672 totalPageCount = 0;
\r
675 if (!whereExpr.IsEmpty()) // copy whereExpr if not empty to class variable __inputExpr
\r
677 //r = __inputExpr.Format(QUERY_LENGTH, L"%ls", whereExpr.GetPointer());
\r
678 r = __inputExpr.Append(whereExpr);
\r
679 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[%s] __inputExpr.Append Failed as whereExpr is not empty.", GetErrorMessage(r));
\r
681 r = ReplaceOspColumnNameWithSlp();
\r
682 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[%s] ReplaceOspColumnNameWithSlp for InputExpr Failed.", GetErrorMessage(r));
\r
684 SysLog(NID_CNT, "After replace __inputExpr = %ls", __inputExpr.GetPointer());
\r
686 if ((__inputColumnName.IsEmpty()) && ((__inputSortOrder == SORT_ORDER_ASCENDING) || (__inputSortOrder == SORT_ORDER_DESCENDING)))
\r
688 SysLog(NID_CNT, "sort column name is empty and sort oder is not none. so,E_INVALID_ARG occured.");
\r
689 SetLastResult(E_INVALID_ARG);
\r
694 std::unique_ptr<ArrayList, AllElementsDeleter> pFinalOutList(new (std::nothrow) ArrayList());
\r
695 SysTryReturn(NID_CNT, pFinalOutList.get() != null, NULL, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to construct ArrayList.");
\r
697 r = pFinalOutList->Construct();
\r
698 SysTryReturn(NID_CNT, !IsFailed(r), NULL, r, "[%s] Failed to construct ArrayList.", GetErrorMessage(r));
\r
700 __pFinalOutList = std::move(pFinalOutList);
\r
702 r = CreateQueryFilter(true);
\r
703 SysTryReturn(NID_CNT, !IsFailed(r), NULL, r, "[%s] Failed to perform CreateQueryFilter operation.", GetErrorMessage(r));
\r
705 ret = media_info_get_media_count_from_db(*(__pFilterHandle.get()), &totalCount);
\r
706 r = MapCoreErrorToNativeResult(ret);
\r
707 SysTryReturn(NID_CNT, r == E_SUCCESS , NULL, r, "[%s] Failed to perform media_info_get_media_count_from_db operation.", GetErrorMessage(r));
\r
709 SysLog(NID_CNT, "totalCount is [%d] for media_info_get_media_count_from_db", totalCount);
\r
711 if (totalCount > 0)
\r
713 if ((totalCount % countPerPage) == 0)
\r
715 totalPageCount = totalCount / countPerPage;
\r
719 totalPageCount = (totalCount / countPerPage) + 1;
\r
722 SysTryReturn(NID_CNT, ((pageNo >= 1) && (pageNo <= totalPageCount)) , NULL, E_INVALID_ARG, "[E_INVALID_ARG] (pageNo < 1) || (pageNo > totalPageCount).");
\r
724 offset = (pageNo * countPerPage) - countPerPage;
\r
726 SysLog(NID_CNT, " SearchN totalCount [%d] totalPageCount[%d] __countPerPage[%d] __pageNo[%d] offset[%d]",
\r
727 totalCount, totalPageCount, countPerPage, pageNo, offset);
\r
729 ret = media_filter_set_offset(*(__pFilterHandle.get()), offset, countPerPage);
\r
730 r = MapCoreErrorToNativeResult(ret);
\r
731 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r,
\r
732 "[%s] Failed to perform media_filter_set_offset operation.", GetErrorMessage(r));
\r
734 r = ExecuteAndFillFinalOutList();
\r
735 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, E_SYSTEM, "[E_SYSTEM] ExecuteAndFillFinalOutList Failed.");
\r
737 else if (pageNo > 1)
\r
740 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[E_INVALID_ARG] (pageNo > 1) and (totalcount = 0).");
\r
744 return __pFinalOutList.release();
\r
747 // Fills final result list
\r
749 _ContentSearchImpl::ExecuteAndFillFinalOutList(void) const
\r
751 SysLog(NID_CNT, "Enter\n");
\r
753 int ret = MEDIA_CONTENT_ERROR_NONE;
\r
754 result r = E_SUCCESS;
\r
756 std::unique_ptr<GList, SearchGListDeleter> pItemList;
\r
757 GList* pTemp = NULL;
\r
758 std::unique_ptr<media_info_s, SearchMediaHandleDeleter> pMediaHandle;
\r
760 ContentInfo::_ContentData* pContentData = null;
\r
761 ImageContentInfo::_ImageContentData* pImageContentData = null;
\r
762 AudioContentInfo::_AudioContentData* pAudioContentData = null;
\r
763 VideoContentInfo::_VideoContentData* pVideoContentData = null;
\r
765 std::unique_ptr<ImageContentInfo> pImageContentInfo;
\r
766 std::unique_ptr<AudioContentInfo> pAudioContentInfo;
\r
767 std::unique_ptr<VideoContentInfo> pVideoContentInfo;
\r
768 std::unique_ptr<OtherContentInfo> pOtherContentInfo;
\r
770 std::unique_ptr<ContentSearchResult> pContentSearchResult;
\r
772 pTemp = pItemList.get();
\r
774 ret = media_info_foreach_media_from_db(*(__pFilterHandle.get()), MediaItemCb, &pTemp);
\r
775 r = MapCoreErrorToNativeResult(ret);
\r
776 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_info_foreach_media_from_db operation.");
\r
778 SysTryReturnResult(NID_CNT, pTemp != NULL, r, "media_info_foreach_media_from_db pTemp is null.");
\r
780 media_content_type_e mediaType = MEDIA_CONTENT_TYPE_OTHERS;
\r
782 for (int idx = 0; idx < (int)g_list_length(pTemp); idx++)
\r
784 pMediaHandle.reset(static_cast<media_info_h>(g_list_nth_data(pTemp, idx)));
\r
786 ret = media_info_get_media_type(pMediaHandle.get(), &mediaType);
\r
787 r = MapCoreErrorToNativeResult(ret);
\r
788 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_info_get_media_type.");
\r
792 case MEDIA_CONTENT_TYPE_OTHERS:
\r
793 //memset(&contentData, 0, sizeof(contentData));
\r
795 pOtherContentInfo = std::unique_ptr<OtherContentInfo>(new (std::nothrow) OtherContentInfo);
\r
796 SysTryReturnResult(NID_CNT, pOtherContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pOtherContentInfo.");
\r
798 pContentData = pOtherContentInfo->GetContentData();
\r
799 SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
\r
801 r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);
\r
802 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");
\r
805 pContentSearchResult = std::unique_ptr<ContentSearchResult>(new (std::nothrow) ContentSearchResult);
\r
806 SysTryReturnResult(NID_CNT, pContentSearchResult.get() != null, E_OUT_OF_MEMORY, "Failed to create pContentSearchResult.");
\r
808 pContentSearchResult->SetContentType(CONTENT_TYPE_OTHER);
\r
809 pContentSearchResult->SetContentInfo(pOtherContentInfo.release());
\r
811 // Shallow copy, adds just the pointer: not the element
\r
813 r = __pFinalOutList->Add(*(pContentSearchResult.release()));
\r
814 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");
\r
816 //pOtherContentInfo = null;
\r
817 //pContentSearchResult = null;
\r
818 //_ContentUtility::DeleteContentData(&contentData);
\r
820 case MEDIA_CONTENT_TYPE_IMAGE:
\r
821 //memset(&contentData, 0, sizeof(contentData));
\r
822 //memset(&imageContentData, 0, sizeof(imageContentData));
\r
824 pImageContentInfo = std::unique_ptr<ImageContentInfo>(new (std::nothrow) ImageContentInfo);
\r
825 SysTryReturnResult(NID_CNT, pImageContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pImageContentInfo.");
\r
827 pContentData = pImageContentInfo->GetContentData();
\r
828 SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
\r
830 pImageContentData = pImageContentInfo->GetImageContentData();
\r
831 SysTryReturnResult(NID_CNT, pImageContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
\r
833 r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);
\r
834 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");
\r
836 r = _ContentUtility::FillImageContentData(pMediaHandle.get(), pImageContentData);
\r
837 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform GetDataFromImageTable operation.");
\r
839 pContentSearchResult = std::unique_ptr<ContentSearchResult>(new (std::nothrow) ContentSearchResult);
\r
840 SysTryReturnResult(NID_CNT, pContentSearchResult.get() != null, E_OUT_OF_MEMORY, "Failed to create pContentSearchResult.");
\r
842 pContentSearchResult->SetContentType(CONTENT_TYPE_IMAGE);
\r
843 pContentSearchResult->SetContentInfo(pImageContentInfo.release());
\r
845 // Shallow copy, adds just the pointer: not the element
\r
847 r = __pFinalOutList->Add(*(pContentSearchResult.release()));
\r
848 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");
\r
849 //pImageContentInfo = null;
\r
850 //pContentSearchResult = null;
\r
851 //_ContentUtility::DeleteContentData(&contentData);
\r
853 case MEDIA_CONTENT_TYPE_MUSIC:
\r
855 case MEDIA_CONTENT_TYPE_SOUND:
\r
856 //memset(&contentData, 0, sizeof(contentData));
\r
857 //memset(&audioContentData, 0, sizeof(audioContentData));
\r
859 pAudioContentInfo = std::unique_ptr<AudioContentInfo>(new (std::nothrow) AudioContentInfo);
\r
860 SysTryReturnResult(NID_CNT, pAudioContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pAudioContentInfo.");
\r
862 pContentData = pAudioContentInfo->GetContentData();
\r
863 SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
\r
865 pAudioContentData = pAudioContentInfo->GetAudioContentData();
\r
866 SysTryReturnResult(NID_CNT, pAudioContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
\r
868 r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);
\r
869 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");
\r
871 r = _ContentUtility::FillAudioContentData(pMediaHandle.get(), pAudioContentData);
\r
872 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillAudioContentData operation.");
\r
874 pContentSearchResult = std::unique_ptr<ContentSearchResult>(new (std::nothrow) ContentSearchResult);
\r
875 SysTryReturnResult(NID_CNT, pContentSearchResult.get() != null, E_OUT_OF_MEMORY, "Failed to create pContentSearchResult.");
\r
877 pContentSearchResult->SetContentType(CONTENT_TYPE_AUDIO);
\r
878 pContentSearchResult->SetContentInfo(pAudioContentInfo.release());
\r
880 // Shallow copy, adds just the pointer: not the element
\r
882 r = __pFinalOutList->Add(*(pContentSearchResult.release()));
\r
883 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");
\r
885 //pAudioContentInfo = null;
\r
886 //pContentSearchResult = null;
\r
887 //_ContentUtility::DeleteContentData(&contentData);
\r
888 //_ContentUtility::DeleteAudioContentData(&audioContentData);
\r
890 case MEDIA_CONTENT_TYPE_VIDEO:
\r
891 //memset(&contentData, 0, sizeof(contentData));
\r
892 //memset(&videoContentData, 0, sizeof(videoContentData));
\r
894 pVideoContentInfo = std::unique_ptr<VideoContentInfo>(new (std::nothrow) VideoContentInfo);
\r
895 SysTryReturnResult(NID_CNT, pVideoContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pVideoContentInfo.");
\r
897 pContentData = pVideoContentInfo->GetContentData();
\r
898 SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
\r
900 pVideoContentData = pVideoContentInfo->GetVideoContentData();
\r
901 SysTryReturnResult(NID_CNT, pVideoContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");
\r
903 r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);
\r
904 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");
\r
906 r = _ContentUtility::FillVideoContentData(pMediaHandle.get(), pVideoContentData);
\r
907 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillVideoContentData operation.");
\r
909 pContentSearchResult = std::unique_ptr<ContentSearchResult>(new (std::nothrow) ContentSearchResult);
\r
910 SysTryReturnResult(NID_CNT, pContentSearchResult.get() != null, E_OUT_OF_MEMORY, "Failed to create pContentSearchResult.");
\r
912 pContentSearchResult->SetContentType(CONTENT_TYPE_VIDEO);
\r
913 pContentSearchResult->SetContentInfo(pVideoContentInfo.release());
\r
915 // Shallow copy, adds just the pointer: not the element
\r
917 r = __pFinalOutList->Add(*(pContentSearchResult.release()));
\r
918 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");
\r
920 //pVideoContentInfo = null;
\r
921 //pContentSearchResult = null;
\r
922 //_ContentUtility::DeleteContentData(&contentData);
\r
923 //_ContentUtility::DeleteVideoContentData(&videoContentData);
\r
932 // returns given column value list in the requested order
\r
934 _ContentSearchImpl::GetValueListN(const String& sortColumn, SortOrder sortOrder)
\r
936 SysLog(NID_CNT, "inputColumn = %ls", sortColumn.GetPointer());
\r
939 result r = E_SUCCESS;
\r
943 __inputColumnName.Clear();
\r
944 __inputExpr.Clear();
\r
946 __inputColumnName = sortColumn;
\r
947 __inputSortOrder = sortOrder;
\r
949 String ospColumnName(L"");
\r
950 String slpColumnName(L"");
\r
952 String columnName(__inputColumnName);
\r
954 if ((__inputColumnName.IsEmpty()) && ((__inputSortOrder == SORT_ORDER_ASCENDING) || (__inputSortOrder == SORT_ORDER_DESCENDING)))
\r
956 SysLog(NID_CNT, "sort column name is empty and sort oder is not none. so,E_INVALID_ARG occured.");
\r
957 SetLastResult(E_INVALID_ARG);
\r
962 std::unique_ptr<ArrayList, AllElementsDeleter> pFinalOutList(new (std::nothrow) ArrayList());
\r
963 SysTryReturn(NID_CNT, pFinalOutList.get() != null, NULL, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to construct ArrayList.");
\r
965 r = pFinalOutList->Construct();
\r
966 SysTryReturn(NID_CNT, !IsFailed(r), NULL, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to construct ArrayList.");
\r
968 __pFinalOutList = std::move(pFinalOutList);
\r
970 switch (__contentType)
\r
972 case CONTENT_TYPE_OTHER:
\r
974 case CONTENT_TYPE_IMAGE:
\r
975 maxCols = MAX_QUERY_COLUMNS_FOR_IMAGE_OTHERS;
\r
977 case CONTENT_TYPE_VIDEO:
\r
978 maxCols = MAX_QUERY_COLUMNS_FOR_VIDEO;
\r
980 case CONTENT_TYPE_AUDIO:
\r
982 case CONTENT_TYPE_ALL:
\r
983 maxCols = MAX_QUERY_COLUMNS;
\r
989 for (colIndex = 0; colIndex < maxCols; colIndex++)
\r
991 ospColumnName.Clear();
\r
992 slpColumnName.Clear();
\r
994 ospColumnName = dbfieldinfo[colIndex].dbFieldOspName ;
\r
995 slpColumnName = dbfieldinfo[colIndex].dbFieldSlpName ;
\r
997 ospColumnName.ToUpper();
\r
998 columnName.ToUpper();
\r
999 if (columnName == ospColumnName)
\r
1001 r = FillColumnsList(colIndex);
\r
1002 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[%s] FillColumnsList Failed.", GetErrorMessage(r));
\r
1006 if (colIndex == maxCols)
\r
1008 r = E_INVALID_ARG;
\r
1009 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[E_INVALID_ARG] invalid column.");
\r
1013 return __pFinalOutList.release();
\r
1016 // returns given column value list in the requested order
\r
1017 Collection::IList*
\r
1018 _ContentSearchImpl::GetValueListN(int pageNo, int countPerPage, int& totalPageCount, int& totalCount, const String& sortColumn, SortOrder sortOrder) const
\r
1020 SysLog(NID_CNT, "pageNo = %d, countPerPage = %d, inputColumn = %ls", pageNo, countPerPage, sortColumn.GetPointer());
\r
1022 ClearLastResult();
\r
1024 result r = E_SUCCESS;
\r
1028 __inputColumnName.Clear();
\r
1029 __inputExpr.Clear();
\r
1031 __inputColumnName = sortColumn;
\r
1032 __inputSortOrder = sortOrder;
\r
1034 String ospColumnName(L"");
\r
1035 String slpColumnName(L"");
\r
1037 String columnName(__inputColumnName);
\r
1039 if ((__inputColumnName.IsEmpty()) && ((__inputSortOrder == SORT_ORDER_ASCENDING) || (__inputSortOrder == SORT_ORDER_DESCENDING)))
\r
1041 SysLog(NID_CNT, "sort column name is empty and sort oder is not none. so,E_INVALID_ARG occured.");
\r
1042 SetLastResult(E_INVALID_ARG);
\r
1047 std::unique_ptr<ArrayList, AllElementsDeleter> pFinalOutList(new (std::nothrow) ArrayList());
\r
1048 SysTryReturn(NID_CNT, pFinalOutList.get() != null, NULL, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to construct ArrayList.");
\r
1050 r = pFinalOutList->Construct();
\r
1051 SysTryReturn(NID_CNT, !IsFailed(r), NULL, r, "[%s] Failed to construct ArrayList.", GetErrorMessage(r));
\r
1053 __pFinalOutList = std::move(pFinalOutList);
\r
1055 switch (__contentType)
\r
1057 case CONTENT_TYPE_OTHER:
\r
1059 case CONTENT_TYPE_IMAGE:
\r
1060 maxCols = MAX_QUERY_COLUMNS_FOR_IMAGE_OTHERS;
\r
1062 case CONTENT_TYPE_VIDEO:
\r
1063 maxCols = MAX_QUERY_COLUMNS_FOR_VIDEO;
\r
1065 case CONTENT_TYPE_AUDIO:
\r
1067 case CONTENT_TYPE_ALL:
\r
1068 maxCols = MAX_QUERY_COLUMNS;
\r
1074 for (colIndex = 0; colIndex < maxCols; colIndex++)
\r
1076 ospColumnName.Clear();
\r
1077 slpColumnName.Clear();
\r
1079 ospColumnName = dbfieldinfo[colIndex].dbFieldOspName ;
\r
1080 slpColumnName = dbfieldinfo[colIndex].dbFieldSlpName ;
\r
1082 ospColumnName.ToUpper();
\r
1083 columnName.ToUpper();
\r
1084 if (columnName == ospColumnName)
\r
1086 r = FillColumnsList(pageNo, countPerPage, totalPageCount, totalCount, colIndex);
\r
1087 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[%s] FillColumnsList Failed.", GetErrorMessage(r));
\r
1091 if (colIndex == maxCols)
\r
1093 r = E_INVALID_ARG;
\r
1094 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[E_INVALID_ARG] invalid column.");
\r
1098 return __pFinalOutList.release();
\r
1101 // prepares query expression to be used in group api. colIndex is mapped to actual group value.
\r
1103 _ContentSearchImpl::GetIndexAndCreateQueryExp(int colIndex) const
\r
1105 media_group_e groupIndex = MEDIA_CONTENT_GROUP_DISPLAY_NAME;;
\r
1108 case 0://"ContentType", "MEDIA_TYPE"
\r
1109 groupIndex = MEDIA_CONTENT_GROUP_TYPE;
\r
1110 __inputExpr = "MEDIA_TYPE IS NOT NULL";
\r
1112 case 1://"ContentFileName", "MEDIA_DISPLAY_NAME"
\r
1113 groupIndex = MEDIA_CONTENT_GROUP_DISPLAY_NAME;
\r
1114 __inputExpr = "MEDIA_DISPLAY_NAME IS NOT NULL";
\r
1116 case 2://"ContentName", "MEDIA_CONTENT_NAME"
\r
1117 groupIndex = MEDIA_CONTENT_GROUP_CONTENT_NAME;
\r
1118 __inputExpr = "MEDIA_CONTENT_NAME IS NOT NULL";
\r
1120 case 3://"Category", "MEDIA_CATEGORY"
\r
1121 groupIndex = MEDIA_CONTENT_GROUP_CATEGORY;
\r
1122 __inputExpr = "MEDIA_CATEGORY IS NOT NULL";
\r
1124 case 4://"Author", "MEDIA_AUTHOR"
\r
1125 groupIndex = MEDIA_CONTENT_GROUP_AUTHOR;
\r
1126 __inputExpr = "MEDIA_AUTHOR IS NOT NULL";
\r
1128 case 5://"keyword", "MEDIA_KEYWORD"
\r
1129 groupIndex = MEDIA_CONTENT_GROUP_KEYWORD;
\r
1130 __inputExpr = "MEDIA_KEYWORD IS NOT NULL";
\r
1132 case 6://"Provider", "MEDIA_PROVIDER"
\r
1133 groupIndex = MEDIA_CONTENT_GROUP_PROVIDER;
\r
1134 __inputExpr = "MEDIA_PROVIDER IS NOT NULL";
\r
1136 case 7://"Rating", "MEDIA_AGE_RATING"
\r
1137 groupIndex = MEDIA_CONTENT_GROUP_AGE_RATING;
\r
1138 __inputExpr = "MEDIA_AGE_RATING IS NOT NULL";
\r
1140 case 8://"LocationTag", "MEDIA_LOCATION_TAG"
\r
1141 groupIndex = MEDIA_CONTENT_GROUP_LOCATION_TAG;
\r
1142 __inputExpr = "MEDIA_LOCATION_TAG IS NOT NULL";
\r
1144 case 9://"ContentSize", "MEDIA_SIZE"
\r
1145 groupIndex = MEDIA_CONTENT_GROUP_SIZE;
\r
1146 __inputExpr = "MEDIA_SIZE IS NOT NULL";
\r
1148 case 10://"DateTime", "MEDIA_ADDED_TIME"
\r
1149 groupIndex = MEDIA_CONTENT_GROUP_ADDED_TIME;
\r
1150 __inputExpr = "MEDIA_ADDED_TIME IS NOT NULL";
\r
1152 case 11://"Latitude", "MEDIA_LATITUDE"
\r
1153 groupIndex = MEDIA_CONTENT_GROUP_LATITUDE;
\r
1154 __inputExpr = "MEDIA_LATITUDE IS NOT NULL";
\r
1156 case 12://"Longitude", "MEDIA_LONGITUDE"
\r
1157 groupIndex = MEDIA_CONTENT_GROUP_LONGITUDE;
\r
1158 __inputExpr = "MEDIA_LONGITUDE IS NOT NULL";
\r
1160 case 13://"Altitude", "MEDIA_ALTITUDE"
\r
1161 groupIndex = MEDIA_CONTENT_GROUP_ALTITUDE;
\r
1162 __inputExpr = "MEDIA_ALTITUDE IS NOT NULL";
\r
1164 case 14://"Title", "MEDIA_TITLE"
\r
1165 groupIndex = MEDIA_CONTENT_GROUP_TITLE;
\r
1166 __inputExpr = "MEDIA_TITLE IS NOT NULL";
\r
1168 case 15://"Artist", "MEDIA_ARTIST"
\r
1169 groupIndex = MEDIA_CONTENT_GROUP_ARTIST;
\r
1170 __inputExpr = "MEDIA_ARTIST IS NOT NULL";
\r
1172 case 16://"Genre", "MEDIA_GENRE"
\r
1173 groupIndex = MEDIA_CONTENT_GROUP_GENRE;
\r
1174 __inputExpr = "MEDIA_GENRE IS NOT NULL";
\r
1176 case 17://"Year", "MEDIA_YEAR"
\r
1177 groupIndex = MEDIA_CONTENT_GROUP_YEAR;
\r
1178 __inputExpr = "MEDIA_YEAR IS NOT NULL";
\r
1180 case 18://"Composer", "MEDIA_COMPOSER"
\r
1181 groupIndex = MEDIA_CONTENT_GROUP_COMPOSER;
\r
1182 __inputExpr = "MEDIA_COMPOSER IS NOT NULL";
\r
1184 case 19://"Album", "MEDIA_ALBUM"
\r
1185 __inputExpr = "MEDIA_ALBUM IS NOT NULL";
\r
1190 return groupIndex;
\r
1193 // Fills given column value list and destroys filter handle
\r
1195 _ContentSearchImpl::FillColumnsList(int colIndex) const
\r
1197 result r = E_SUCCESS;
\r
1198 int ret = MEDIA_CONTENT_ERROR_NONE;
\r
1199 int totalCount = 0;
\r
1200 media_group_e groupIndex = GetIndexAndCreateQueryExp(colIndex);
\r
1202 r = CreateQueryFilter(true);
\r
1203 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "CreateQueryFilter Failed.");
\r
1205 if (colIndex == ALBUM_COLUMN_NUM)
\r
1207 ret = media_album_get_album_count_from_db(*(__pFilterHandle.get()), &totalCount);
\r
1211 ret = media_group_get_group_count_from_db(*(__pFilterHandle.get()), groupIndex, &totalCount);
\r
1213 r = MapCoreErrorToNativeResult(ret);
\r
1214 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "Failed to perform media_album/group count_from_db operation.");
\r
1216 SysLog(NID_CNT, "totalCount = %d for media_album/group count_from_db", totalCount);
\r
1218 if (totalCount > 0)
\r
1220 if (colIndex == ALBUM_COLUMN_NUM)
\r
1222 r = ExecuteAndFillAlbumValues();
\r
1223 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "ExecuteAndFillAlbumValues Failed.");
\r
1227 r = ExecuteAndFillGetValueListN(groupIndex, colIndex);
\r
1228 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "ExecuteAndFillGetValueListN Failed.");
\r
1234 // prepares input expression to be sent for create filter and fills given column value list
\r
1236 _ContentSearchImpl::FillColumnsList(int pageNo, int countPerPage, int& totalPageCount, int& totalCount, int colIndex) const
\r
1238 result r = E_SUCCESS;
\r
1239 int ret = MEDIA_CONTENT_ERROR_NONE;
\r
1241 totalPageCount = 0;
\r
1243 media_group_e groupIndex = GetIndexAndCreateQueryExp(colIndex);
\r
1245 r = CreateQueryFilter(true);
\r
1246 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "CreateQueryFilter Failed.");
\r
1248 if (colIndex == ALBUM_COLUMN_NUM)
\r
1250 ret = media_album_get_album_count_from_db(*(__pFilterHandle.get()), &totalCount);
\r
1254 ret = media_group_get_group_count_from_db(*(__pFilterHandle.get()), groupIndex, &totalCount);
\r
1256 r = MapCoreErrorToNativeResult(ret);
\r
1257 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "Failed to perform media_album/group count_from_db operation.");
\r
1259 SysLog(NID_CNT, "totalCount = %d for media_album/group count_from_db", totalCount);
\r
1261 if (totalCount > 0)
\r
1263 if ((totalCount % countPerPage) == 0)
\r
1265 totalPageCount = totalCount / countPerPage;
\r
1269 totalPageCount = (totalCount / countPerPage) + 1;
\r
1272 if ((pageNo < 1) || (pageNo > totalPageCount))
\r
1274 r = E_INVALID_ARG;
\r
1275 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "(pageNo < 1) || (pageNo > totalPageCount).");
\r
1278 offset = (pageNo * countPerPage) - countPerPage;
\r
1280 SysLog(NID_CNT, "GetValueListN totalCount [%d] totalPageCount[%d] __countPerPage[%d] __pageNo[%d] offset[%d]",
\r
1281 totalCount, totalPageCount, countPerPage, pageNo, offset);
\r
1283 ret = media_filter_set_offset(*(__pFilterHandle.get()),offset,countPerPage);
\r
1284 r = MapCoreErrorToNativeResult(ret);
\r
1285 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "failed to perform media_filter_set_offset operation.");
\r
1287 if (colIndex == ALBUM_COLUMN_NUM)
\r
1289 r = ExecuteAndFillAlbumValues();
\r
1290 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "ExecuteAndFillAlbumValues Failed.");
\r
1294 r = ExecuteAndFillGetValueListN(groupIndex, colIndex);
\r
1295 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "ExecuteAndFillGetValueListN Failed.");
\r
1299 else if (pageNo > 1)
\r
1301 r = E_INVALID_ARG;
\r
1302 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "(pageNo > 1) and (totalcount = 0).");
\r
1308 // fills given column value list for GetValuelistN api
\r
1310 _ContentSearchImpl::ExecuteAndFillGetValueListN(media_group_e groupIndex, int colIndex) const
\r
1312 SysLog(NID_CNT, "Enter\n");
\r
1314 int ret = MEDIA_CONTENT_ERROR_NONE;
\r
1315 result r = E_SUCCESS;
\r
1316 result res = E_SUCCESS;
\r
1317 std::unique_ptr<GList, SearchGListDeleter> pItemList;
\r
1318 GList* pTemp = NULL;
\r
1320 std::unique_ptr<Object> pValue;
\r
1322 DateTime dateTime;
\r
1324 long long contentSize = 0;
\r
1325 long long addedTime = 0;
\r
1328 char *pColumnVal = null;
\r
1329 int contentType = 0;
\r
1331 pTemp = pItemList.get();
\r
1333 ret = media_group_foreach_group_from_db(*(__pFilterHandle.get()), groupIndex, GroupItemCb, &pTemp);
\r
1334 r = MapCoreErrorToNativeResult(ret);
\r
1335 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_group_foreach_group_from_db operation.");
\r
1337 SysTryReturnResult(NID_CNT, pTemp != NULL, r, "media_info_foreach_media_from_db pTemp is null.");
\r
1339 for (int idx = 0; idx < (int)g_list_length(pTemp); idx++)
\r
1341 SysLog(NID_CNT, "idx = %d and (int)g_list_length(pItemList) = %d", idx, (int)g_list_length(pTemp));
\r
1343 pColumnVal = (char *)g_list_nth_data(pTemp, idx);
\r
1345 String strColVal(pColumnVal);
\r
1347 _ContentUtility::DoSafeFree(pColumnVal);
\r
1349 SysLog(NID_CNT, "pColumnVal = %ls", strColVal.GetPointer());
\r
1353 case 0://"ContentType", "MEDIA_TYPE"
\r
1354 if ((strColVal.CompareTo(L"Unknown") != 0) && (!strColVal.IsEmpty()))
\r
1356 res = Integer::Parse(strColVal, contentType);
\r
1357 SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] Integer parse failed.", GetErrorMessage(res));
\r
1359 switch ((media_content_type_e)contentType)
\r
1361 case MEDIA_CONTENT_TYPE_OTHERS:
\r
1362 pValue.reset(new (std::nothrow) String(CONTENT_TYPE_OTHER));
\r
1363 SysLog(NID_CNT, "mediaType = CONTENT_TYPE_OTHER");
\r
1365 case MEDIA_CONTENT_TYPE_IMAGE:
\r
1366 pValue.reset(new (std::nothrow) String(CONTENT_TYPE_IMAGE));
\r
1367 SysLog(NID_CNT, "mediaType = CONTENT_TYPE_IMAGE");
\r
1369 case MEDIA_CONTENT_TYPE_SOUND:
\r
1371 case MEDIA_CONTENT_TYPE_MUSIC:
\r
1372 pValue.reset(new (std::nothrow) String(CONTENT_TYPE_AUDIO));
\r
1373 SysLog(NID_CNT, "mediaType = CONTENT_TYPE_AUDIO");
\r
1375 case MEDIA_CONTENT_TYPE_VIDEO:
\r
1376 pValue.reset(new (std::nothrow) String(CONTENT_TYPE_VIDEO));
\r
1377 SysLog(NID_CNT, "mediaType = CONTENT_TYPE_VIDEO");
\r
1383 case 1://"ContentFileName", "MEDIA_DISPLAY_NAME"
\r
1385 case 2://"ContentName", "MEDIA_CONTENT_NAME"
\r
1387 case 3://"Category", "MEDIA_CATEGORY"
\r
1389 case 4://"Author", "MEDIA_AUTHOR"
\r
1391 case 5://"keyword", "MEDIA_KEYWORD"
\r
1393 case 6://"Provider", "MEDIA_PROVIDER"
\r
1395 case 7://"Rating", "MEDIA_AGE_RATING"
\r
1397 case 8://"LocationTag", "MEDIA_LOCATION_TAG"
\r
1399 case 14://"Title", "MEDIA_TITLE"
\r
1401 case 15://"Artist", "MEDIA_ARTIST"
\r
1403 case 16://"Genre", "MEDIA_GENRE"
\r
1405 case 17://"Year", "MEDIA_YEAR"
\r
1407 case 18://"Composer", "MEDIA_COMPOSER"
\r
1409 pValue.reset(new (std::nothrow) String(strColVal));
\r
1412 case 9://"ContentSize", "MEDIA_SIZE"
\r
1413 if ((strColVal.CompareTo(L"Unknown") != 0) && (!strColVal.IsEmpty()))
\r
1415 res = LongLong::Parse(strColVal, contentSize);
\r
1416 SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] LongLong parse failed.", GetErrorMessage(res));
\r
1419 pValue.reset(new (std::nothrow) LongLong(contentSize));
\r
1421 case 10://"DateTime", "MEDIA_ADDED_TIME"
\r
1422 if ((strColVal.CompareTo(L"Unknown") != 0) && (!strColVal.IsEmpty()))
\r
1424 res = LongLong::Parse(strColVal, addedTime);
\r
1425 SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] LongLong parse failed.", GetErrorMessage(res));
\r
1428 res = dateTime.SetValue(1970, 1, 1);
\r
1429 SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] dateTime.SetValue failed.", GetErrorMessage(res));
\r
1431 res = dateTime.AddSeconds(addedTime);
\r
1432 SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] dateTime.AddSeconds failed.", GetErrorMessage(res));
\r
1434 SysLog(NID_CNT, "DateTime : %ls", dateTime.ToString().GetPointer());
\r
1436 pValue.reset(new (std::nothrow) DateTime(dateTime));
\r
1439 case 11://"Latitude", "MEDIA_LATITUDE"
\r
1441 case 12://"Longitude", "MEDIA_LONGITUDE"
\r
1443 case 13://"Altitude", "MEDIA_ALTITUDE"
\r
1444 if ((strColVal.CompareTo(L"Unknown") != 0) && (!strColVal.IsEmpty()))
\r
1446 res = Double::Parse(strColVal, dVal);
\r
1447 SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] double parse failed.", GetErrorMessage(res));
\r
1449 pValue.reset(new (std::nothrow) Double(dVal));
\r
1452 case 19://"Album", "MEDIA_ALBUM"
\r
1457 if (pValue.get() != NULL)
\r
1459 r = __pFinalOutList->Add(*(pValue.release()));
\r
1460 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform arraylist Add operation.");
\r
1468 _ContentSearchImpl::ExecuteAndFillAlbumValues(void) const
\r
1470 int ret = MEDIA_CONTENT_ERROR_NONE;
\r
1471 result r = E_SUCCESS;
\r
1472 std::unique_ptr<GList, SearchGListDeleter> pItemList;
\r
1473 GList* pTemp = NULL;
\r
1474 std::unique_ptr<media_album_s, AlbumHandleDeleter> pAlbumHandle;
\r
1475 std::unique_ptr<media_album_s, AlbumHandleDeleter> pTempAlbumHandle;
\r
1477 char* pName = NULL;
\r
1478 std::unique_ptr<char, CharDeleter> pAlbumName;
\r
1479 std::unique_ptr< String > pValue;
\r
1480 int lastIndex = 0;
\r
1482 pTemp = pItemList.get();
\r
1484 ret = media_album_foreach_album_from_db(*(__pFilterHandle.get()), AlbumItemCb, &pTemp);
\r
1485 r = MapCoreErrorToNativeResult(ret);
\r
1486 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_album_foreach_album_from_db operation.");
\r
1487 SysTryReturnResult(NID_CNT, pTemp != NULL, r, "media_info_foreach_media_from_db pTemp is null.");
\r
1489 for (int idx = 0; idx < (int)g_list_length(pTemp); idx++)
\r
1491 pAlbumHandle.reset(static_cast<media_album_h>(g_list_nth_data(pTemp, idx)));
\r
1492 ret = media_album_get_name(pAlbumHandle.get(), &pName);
\r
1493 r = MapCoreErrorToNativeResult(ret);
\r
1494 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_album_get_name.");
\r
1496 if (pName != NULL)
\r
1498 SysLog(NID_CNT, "pColumnVal = %s", pName);
\r
1500 pAlbumName.reset(pName);
\r
1501 pValue.reset(new (std::nothrow) String(pAlbumName.get()));
\r
1502 SysTryReturnResult(NID_CNT, pValue != NULL, E_OUT_OF_MEMORY, "media_info_foreach_media_from_db pTemp is null.");
\r
1506 r = __pFinalOutList->Add(pValue.get());
\r
1507 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform arraylist Add operation.");
\r
1512 String* pTempNameList(static_cast< String* >(__pFinalOutList->GetAt(lastIndex)));
\r
1514 if (pValue->CompareTo(*pTempNameList) != 0)
\r
1516 r = __pFinalOutList->Add(pValue.get());
\r
1517 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform arraylist Add operation.");
\r
1530 _ContentSearchImpl::MapCoreErrorToNativeResult(int reason) const
\r
1532 result r = E_SUCCESS;
\r
1536 case MEDIA_CONTENT_ERROR_NONE:
\r
1540 case MEDIA_CONTENT_ERROR_INVALID_PARAMETER:
\r
1541 r = E_INVALID_ARG;
\r
1542 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_INVALID_PARAMETER");
\r
1545 case MEDIA_CONTENT_ERROR_DB_FAILED:
\r
1547 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_DB_FAILED");
\r
1550 case MEDIA_CONTENT_ERROR_OUT_OF_MEMORY:
\r
1551 r = E_OUT_OF_MEMORY;
\r
1552 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_OUT_OF_MEMORY");
\r
1556 SysLog(NID_CNT, "default");
\r
1563 //Callback function registered to each media info details
\r
1564 // all items are appened to the list
\r
1566 MediaItemCb(media_info_h media, void* pUserdata)
\r
1568 int ret = MEDIA_CONTENT_ERROR_NONE;
\r
1569 media_info_h new_media = NULL;
\r
1570 ret = media_info_clone(&new_media, media);
\r
1571 SysTryLog(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, "[E_SYSTEM] Failed to perform media_info_clone");
\r
1573 GList** pList = (GList**)pUserdata;
\r
1574 *pList = g_list_append(*pList, new_media);
\r
1579 //Callback function registered for column values
\r
1580 // all items are appened to the list
\r
1582 GroupItemCb(const char* pGroupName, void* pUserdata)
\r
1584 char* pGrpName = strdup(pGroupName);
\r
1585 GList** pList = (GList**)pUserdata;
\r
1586 *pList = g_list_append(*pList, pGrpName);
\r
1591 //Callback function registered to each media info details
\r
1592 // all items are appened to the list
\r
1594 AlbumItemCb(media_album_h album, void* pUserdata)
\r
1596 int ret = MEDIA_CONTENT_ERROR_NONE;
\r
1597 media_album_h new_album = NULL;
\r
1598 ret = media_album_clone(&new_album, album);
\r
1599 SysTryLog(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, "[E_SYSTEM] Failed to perform media_album_clone");
\r
1601 GList** pList = (GList**)pUserdata;
\r
1602 *pList = g_list_append(*pList, new_album);
\r