[content] Change sort mode
[platform/framework/native/content.git] / src / FCnt_ContentSearchImpl.cpp
1 //\r
2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.\r
3 //\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
7 //\r
8 //     http://www.apache.org/licenses/LICENSE-2.0\r
9 //\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
15 //\r
16 /**\r
17  * @file                FCnt_ContentSearchImpl.cpp\r
18  * @brief               This is the implementation file for the %_ContentSearchImpl class.\r
19  *\r
20  * This file contains implementation of the %_ContentSearchImpl class.\r
21  */\r
22 \r
23 #include <time.h>\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
35 \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
40 \r
41 namespace Tizen { namespace Content\r
42 {\r
43 \r
44 static const int QUERY_LENGTH = 4096;\r
45 \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
52 \r
53 // Default constructor\r
54 _ContentSearchImpl::_ContentSearchImpl(void)\r
55         : Object()\r
56         , __contentType(CONTENT_TYPE_UNKNOWN)\r
57         , __pFinalOutList(NULL)\r
58         , __inputExpr(L"")\r
59         , __inputColumnName(L"")\r
60         , __inputSortOrder(SORT_ORDER_NONE)\r
61         , __pFilterHandle(0)\r
62 {\r
63         SysLog(NID_CNT, "Enter\n");\r
64 }\r
65 \r
66 \r
67 // Default destructor (disconnects the DB connection)\r
68 _ContentSearchImpl::~_ContentSearchImpl(void)\r
69 {\r
70         SysLog(NID_CNT, "Enter\n");\r
71 \r
72         int ret = MEDIA_CONTENT_ERROR_NONE;\r
73         result r = E_SUCCESS;\r
74 \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
78 }\r
79 \r
80  _ContentSearchImpl*\r
81  _ContentSearchImpl::GetInstance(ContentSearch& contentSearch)\r
82 {\r
83         return contentSearch.__pImpl;\r
84 }\r
85 \r
86 const _ContentSearchImpl*\r
87 _ContentSearchImpl::GetInstance(const ContentSearch& contentSearch)\r
88 {\r
89         return contentSearch.__pImpl;\r
90 }\r
91 \r
92 //make a connection to DB\r
93 result\r
94 _ContentSearchImpl::Construct(ContentType type)\r
95 {\r
96         SysLog(NID_CNT, "Enter\n");\r
97 \r
98         result r = E_SUCCESS;\r
99         int ret = MEDIA_CONTENT_ERROR_NONE;\r
100 \r
101         ret = media_content_connect();\r
102         SysTryReturnResult(NID_CNT, r == E_SUCCESS , E_SYSTEM, "Failed to perform media_content_connect operation.");\r
103 \r
104         __contentType = type;\r
105 \r
106         return r;\r
107 }\r
108 \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
115 // All - none\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
119 result\r
120 _ContentSearchImpl::CreateQueryFilter(bool isAndAppendReq) const\r
121 {\r
122         int ret  = MEDIA_CONTENT_ERROR_NONE;\r
123         result r = E_SUCCESS;\r
124 \r
125         std::unique_ptr<char[]> pInputCond;\r
126         std::unique_ptr<char[]> pSortCol;\r
127 \r
128         String inputCondition;\r
129         String slpColumn;\r
130 \r
131         std::unique_ptr<filter_h, SearchFilterHandleDeleter> pFilterHandle(new (std::nothrow) filter_h);\r
132 \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
135 \r
136         switch (__contentType)\r
137         {\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
141                 break;\r
142         case CONTENT_TYPE_IMAGE:\r
143                 inputCondition = "MEDIA_TYPE=0 ";\r
144                 break;\r
145         case CONTENT_TYPE_AUDIO:\r
146                 inputCondition = "(MEDIA_TYPE=2 or MEDIA_TYPE=3) ";\r
147                 break;\r
148         case CONTENT_TYPE_VIDEO:\r
149                 inputCondition = "MEDIA_TYPE=1 ";\r
150                 break;\r
151         case CONTENT_TYPE_ALL:\r
152                 //If content type is CONTENT_TYPE_ALL, then MEDIA_TYPE is empty\r
153                 break;\r
154         default:\r
155                 break;\r
156         }\r
157 \r
158         if (!__inputExpr.IsEmpty())\r
159         {\r
160                 if (isAndAppendReq && (!inputCondition.IsEmpty())) //For CONTENT_TYPE_ALL inputCondition is empty\r
161                 {\r
162                         r = inputCondition.Append("AND ");\r
163                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform append operation.");\r
164                 }\r
165 \r
166                 r = inputCondition.Append(__inputExpr);\r
167                 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform append operation.");\r
168         }\r
169 \r
170         if (!inputCondition.IsEmpty())\r
171         {\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
175 \r
176                 SysLog(NID_CNT, "pInputCond = %s", pInputCond.get());\r
177 \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
180         }\r
181 \r
182         if (!__inputColumnName.IsEmpty()) // SortColumn is optional in case of SearchN\r
183         {\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
187 \r
188                 //CopyToCharArrayN: utility function, converts a osp string to char*\r
189 \r
190                 pSortCol = std::unique_ptr<char[]>(_StringConverter::CopyToCharArrayN(slpColumn));\r
191                 SysTryReturnResult(NID_CNT, pSortCol, E_OUT_OF_MEMORY, "pSortCol is NULL.");\r
192 \r
193                 if (__inputSortOrder == SORT_ORDER_ASCENDING)\r
194                 {\r
195                         ret = media_filter_set_order(*(pFilterHandle.get()), MEDIA_CONTENT_ORDER_ASC, pSortCol.get(), MEDIA_CONTENT_COLLATE_NOCASE);\r
196                         SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, E_SYSTEM, "Failed to perform media_filter_set_order operation.");\r
197                 }\r
198                 else if (__inputSortOrder == SORT_ORDER_DESCENDING)\r
199                 {\r
200                         ret = media_filter_set_order(*(pFilterHandle.get()), MEDIA_CONTENT_ORDER_DESC, pSortCol.get(), MEDIA_CONTENT_COLLATE_NOCASE);\r
201                         SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, E_SYSTEM, "Failed to perform media_filter_set_order operation.");\r
202                 }\r
203         }\r
204 \r
205         __pFilterHandle.reset(pFilterHandle.release());\r
206 \r
207         return r;\r
208 }\r
209 \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
215 result\r
216 _ContentSearchImpl::GetSlpColumnName(String& inputCol) const\r
217 {\r
218         String          ospColumnName(L"");\r
219         String          slpColumnName(L"");\r
220         String          columnName(__inputColumnName);\r
221         result          r = E_SUCCESS;\r
222         int             maxCols = 0;\r
223         switch (__contentType)\r
224         {\r
225         case CONTENT_TYPE_OTHER:\r
226                 //fall through\r
227         case CONTENT_TYPE_IMAGE:\r
228                 maxCols = MAX_QUERY_COLUMNS_FOR_IMAGE_OTHERS;\r
229                 break;\r
230         case CONTENT_TYPE_VIDEO:\r
231                 maxCols = MAX_QUERY_COLUMNS_FOR_VIDEO;\r
232                 break;\r
233         case CONTENT_TYPE_AUDIO:\r
234                 //fall through\r
235         case CONTENT_TYPE_ALL:\r
236                 maxCols = MAX_QUERY_COLUMNS;\r
237                 break;\r
238         default:\r
239                 break;\r
240         }\r
241         for (int colIndex = 0; colIndex < maxCols; colIndex++)\r
242         {\r
243                 ospColumnName.Clear();\r
244                 slpColumnName.Clear();\r
245 \r
246                 ospColumnName = dbfieldinfo[colIndex].dbFieldOspName ;\r
247                 slpColumnName = dbfieldinfo[colIndex].dbFieldSlpName ;\r
248 \r
249                 ospColumnName.ToUpper();\r
250                 columnName.ToUpper();\r
251                 if (columnName == ospColumnName)\r
252                 {\r
253                         inputCol = slpColumnName;\r
254                         return r;\r
255                 }\r
256         }\r
257         return E_INVALID_ARG;\r
258 }\r
259 \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
266 \r
267 result\r
268 _ContentSearchImpl::ReplaceOspColumnNameWithSlp(void) const\r
269 {\r
270         String          ospColumnName(L"");\r
271         String          slpColumnName(L"");\r
272         String          splApostrophe(L"special@apostrophe");\r
273         result          r = E_SUCCESS;\r
274         int             maxCols = 0;\r
275 \r
276         int indexOf = 0;\r
277         \r
278         String strToBeReplaced(L"\\'");\r
279         int strLen = strToBeReplaced.GetLength();\r
280         int startIndex = 0;\r
281 \r
282         while(E_SUCCESS == __inputExpr.IndexOf(strToBeReplaced,startIndex,indexOf))\r
283         {\r
284                 int lenAfterSubStr = indexOf + strLen;\r
285                 while ((lenAfterSubStr < __inputExpr.GetLength()) && (__inputExpr[lenAfterSubStr] == ' '))\r
286                 {\r
287                         lenAfterSubStr++;\r
288                 }\r
289                 if ((lenAfterSubStr < __inputExpr.GetLength()) && ((__inputExpr[lenAfterSubStr] == '\'') ||\r
290                                 ((!__inputExpr.StartsWith(L"AND ", lenAfterSubStr)) && (!__inputExpr.StartsWith(L"OR ", lenAfterSubStr)))))\r
291                 {\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
297                 }\r
298                 else\r
299                 {\r
300                         startIndex = lenAfterSubStr;\r
301                 }\r
302         }\r
303 \r
304         SysLog(NID_CNT, "__inputExpr after splApostrophe append = %ls", __inputExpr.GetPointer());\r
305 \r
306         switch (__contentType)\r
307         {\r
308         case CONTENT_TYPE_OTHER:\r
309                 //fall through\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
314                 break;\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
319                 break;\r
320         case CONTENT_TYPE_AUDIO:\r
321                 //fall through\r
322         case CONTENT_TYPE_ALL:\r
323                 maxCols = MAX_QUERY_COLUMNS;\r
324                 break;\r
325         default:\r
326                 break;\r
327         }\r
328         for (int colIndex = 0; colIndex < maxCols; colIndex++)\r
329         {\r
330                 ospColumnName.Clear();\r
331                 slpColumnName.Clear();\r
332 \r
333                 ospColumnName = dbfieldinfo[colIndex].dbFieldOspName ;\r
334                 slpColumnName = dbfieldinfo[colIndex].dbFieldSlpName ;\r
335 \r
336                 ReplaceString(ospColumnName,slpColumnName);\r
337         }\r
338 \r
339         // Append ESCAPE '\' for LIKE query\r
340         r = AppendEscapeKeywordForLikeQuery();\r
341         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "AppendEscapeKeywordForLikeQuery failed.");\r
342 \r
343         r = ReplaceDateTimeStringWithInt();\r
344         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_INVALID_ARG, "ReplaceDateTimeStringWithInt failed.");\r
345 \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
349 \r
350         return r;\r
351 }\r
352 \r
353 //This function is to appened ESCAPE keyword for _ and % special characters in LIKE query.\r
354 \r
355 result\r
356 _ContentSearchImpl::AppendEscapeKeywordForLikeQuery(void) const\r
357 {\r
358         String  delim = L"'"; //Delimeters  is  ' .\r
359         result r = E_SUCCESS;\r
360         bool isCol = true;\r
361         bool isAppendEscape = false;\r
362         String token;\r
363         String tokenUpper;\r
364         String inputExpr = __inputExpr;\r
365 \r
366         // Create a StringTokenizer instance\r
367         StringTokenizer  strTok(inputExpr, delim);\r
368 \r
369         inputExpr.Clear();\r
370 \r
371         while (strTok.HasMoreTokens())\r
372         {\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
376                 {\r
377                         isCol = false;\r
378                         tokenUpper = token;\r
379                         tokenUpper.ToUpper();\r
380                         if (tokenUpper.Contains(" LIKE"))\r
381                         {\r
382                                 isAppendEscape = true;\r
383                         }\r
384                         else\r
385                         {\r
386                                 isAppendEscape = false;\r
387                         }\r
388                         r = inputExpr.Append(token);\r
389                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");\r
390                 }\r
391                 else // value of the column\r
392                 {\r
393                         isCol = true;\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
400 \r
401                         if (isAppendEscape)\r
402                         {\r
403                                 if (token.Contains("\\_") || token.Contains("\\%"))\r
404                                 {\r
405                                         r = inputExpr.Append("ESCAPE'\\'  ");\r
406                                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");\r
407                                 }\r
408                         }\r
409                 }\r
410         }\r
411 \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
415 \r
416         return r;\r
417 }\r
418 \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
420 \r
421 result\r
422 _ContentSearchImpl::ReplaceDateTimeStringWithInt(void) const\r
423 {\r
424         String  delim = L"'"; //Delimeters  is  ' .\r
425         result r = E_SUCCESS;\r
426         bool isCol = true;\r
427         bool isConvertReq = false;\r
428         bool isBetweenExistsInDateTimeQuery = false;\r
429         String token;\r
430         String tokenUpper;\r
431         String inputExpr = __inputExpr;\r
432 \r
433         if(!inputExpr.Contains("MEDIA_ADDED_TIME"))\r
434         {\r
435                 return r;\r
436         }\r
437 \r
438         // Create a StringTokenizer instance\r
439         StringTokenizer  strTok(inputExpr, delim);\r
440 \r
441         inputExpr.Clear();\r
442 \r
443         while (strTok.HasMoreTokens())\r
444         {\r
445                 r = strTok.GetNextToken(token);\r
446                 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "GetNextToken failed.");\r
447                 if (isCol) //column name\r
448                 {\r
449                         isCol = false;\r
450                         tokenUpper = token;\r
451                         tokenUpper.ToUpper();\r
452                         if(isBetweenExistsInDateTimeQuery)\r
453                         {\r
454                                 isBetweenExistsInDateTimeQuery = false;\r
455                                 isConvertReq = true;\r
456                         }\r
457                         else\r
458                         {\r
459                                 if (tokenUpper.Contains("MEDIA_ADDED_TIME"))\r
460                                 {\r
461                                         if (tokenUpper.Contains("BETWEEN"))\r
462                                         {\r
463                                                 isBetweenExistsInDateTimeQuery = true;\r
464                                         }\r
465                                         isConvertReq = true;\r
466                                 }\r
467                                 else\r
468                                 {\r
469                                         isConvertReq = false;\r
470                                 }\r
471                         }\r
472 \r
473                         r = inputExpr.Append(token);\r
474                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string append failed.");\r
475                 }\r
476                 else // value of the column\r
477                 {\r
478                         isCol = true;\r
479                         r = inputExpr.Append("'");\r
480                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string append failed.");\r
481 \r
482                         if (isConvertReq)\r
483                         {\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
487 \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
494                                 \r
495                                 time_t rawTime;\r
496                                 struct tm* timeInfo;\r
497 \r
498                                 time(&rawTime);\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
506 \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
509 \r
510                                 long long ticksInSeconds = (long long)seconds;\r
511 \r
512                                 r = inputExpr.Append(ticksInSeconds);\r
513                                 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string append failed.");\r
514                         }\r
515                         else\r
516                         {\r
517                                 r = inputExpr.Append(token);\r
518                                 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string append failed.");\r
519                         }\r
520 \r
521                         r = inputExpr.Append("'");\r
522                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string append failed.");\r
523                 }\r
524         }\r
525 \r
526         __inputExpr.Clear();\r
527         r = __inputExpr.Insert(inputExpr, 0);\r
528         SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string insert failed.");\r
529 \r
530         return r;\r
531 }\r
532 \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
541 \r
542 result\r
543 _ContentSearchImpl::CheckInvalidColumnInQuery(void) const\r
544 {\r
545         result r = E_SUCCESS;\r
546         int tokenNo = 0;\r
547         String  delim = L"'"; //Delimeters  is  ' .\r
548          bool isColReplaceReq = true;\r
549         String token;\r
550         String inputExpr = __inputExpr;\r
551 \r
552         // Create a StringTokenizer instance\r
553         StringTokenizer  strTok(inputExpr, delim);\r
554 \r
555         inputExpr.Clear();\r
556 \r
557         while (strTok.HasMoreTokens())\r
558         {\r
559                 r = strTok.GetNextToken(token);\r
560                 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "strTok GetNextToken failed.");\r
561 \r
562                 SysLog(NID_CNT, "In CheckInvalidColumnInQuery token[%d] = %ls", ++tokenNo, token.GetPointer());\r
563 \r
564                 if (isColReplaceReq)\r
565                 {\r
566                         isColReplaceReq = false;\r
567                         r = inputExpr.Append(token);\r
568                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");\r
569                         token.ToUpper();\r
570                         switch (__contentType)\r
571                         {\r
572                         case CONTENT_TYPE_OTHER:\r
573                                 //fall through\r
574                         case CONTENT_TYPE_IMAGE:\r
575                                 if ((token.Contains("TITLE")) || (token.Contains("ARTIST")) || (token.Contains("GENRE")))\r
576                                 {\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
579                                 }\r
580                                 //fall through\r
581                         case CONTENT_TYPE_VIDEO:\r
582                                 if ((token.Contains("COMPOSER")) || (token.Contains("ALBUM")))\r
583                                 {\r
584                                         SysLog(NID_CNT, "Composer or Album  are not valid cloumns for this content type");\r
585                                         return E_INVALID_ARG;\r
586                                 }\r
587                                 break;\r
588                         default:\r
589                                 break;\r
590                         }\r
591                 }\r
592                 else\r
593                 {\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
601                 }\r
602         }\r
603         return r;\r
604 }\r
605 \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
611 \r
612 result\r
613 _ContentSearchImpl::ReplaceString(String ospColumnName, String slpColumnName) const\r
614 {\r
615         String  delim = L"'"; //Delimeters  is  ' .\r
616         result r = E_SUCCESS;\r
617          bool isColReplaceReq = true;\r
618         String token;\r
619         String inputExpr = __inputExpr;\r
620 \r
621         // Create a StringTokenizer instance\r
622         StringTokenizer  strTok(inputExpr, delim);\r
623 \r
624         inputExpr.Clear();\r
625 \r
626         while (strTok.HasMoreTokens())\r
627         {\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
631                 {\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
637                 }\r
638                 else // value of the column\r
639                 {\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
647                 }\r
648         }\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
652 \r
653         return r;\r
654 }\r
655 \r
656 //Retuns list of search result for the given expression and content type.\r
657 Collection::IList*\r
658 _ContentSearchImpl::SearchN(int pageNo, int countPerPage, int& totalPageCount, int& totalCount, const String& whereExpr, const String& sortColumn, SortOrder sortOrder) const\r
659 {\r
660         SysLog(NID_CNT, "pageNo = %d, countPerPage = %d, whereExpr = %ls", pageNo, countPerPage, whereExpr.GetPointer());\r
661 \r
662         ClearLastResult();\r
663 \r
664         result r        = E_SUCCESS;\r
665         int ret         = MEDIA_CONTENT_ERROR_NONE;\r
666         int offset      = 0;\r
667 \r
668         __inputColumnName.Clear();\r
669         __inputExpr.Clear();\r
670         __inputColumnName = sortColumn;\r
671         __inputSortOrder = sortOrder;\r
672         totalPageCount = 0;\r
673         totalCount = 0;\r
674 \r
675         if (!whereExpr.IsEmpty()) // copy whereExpr if not empty to class variable __inputExpr\r
676         {\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
680 \r
681                 r = ReplaceOspColumnNameWithSlp();\r
682                 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[%s] ReplaceOspColumnNameWithSlp for InputExpr Failed.", GetErrorMessage(r));\r
683 \r
684                 SysLog(NID_CNT, "After replace __inputExpr = %ls", __inputExpr.GetPointer());\r
685         }\r
686         if ((__inputColumnName.IsEmpty()) && ((__inputSortOrder == SORT_ORDER_ASCENDING) || (__inputSortOrder == SORT_ORDER_DESCENDING)))\r
687         {\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
690                 return null;\r
691         }\r
692         else\r
693         {\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
696 \r
697                 r = pFinalOutList->Construct();\r
698                 SysTryReturn(NID_CNT, !IsFailed(r), NULL, r, "[%s] Failed to construct ArrayList.", GetErrorMessage(r));\r
699 \r
700                 __pFinalOutList = std::move(pFinalOutList);\r
701 \r
702                 r = CreateQueryFilter(true);\r
703                 SysTryReturn(NID_CNT, !IsFailed(r), NULL, r, "[%s] Failed to perform CreateQueryFilter operation.", GetErrorMessage(r));\r
704 \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
708 \r
709                 SysLog(NID_CNT, "totalCount is [%d] for media_info_get_media_count_from_db", totalCount);\r
710 \r
711                 if (totalCount > 0)\r
712                 {\r
713                         if ((totalCount % countPerPage) == 0)\r
714                         {\r
715                                 totalPageCount = totalCount / countPerPage;\r
716                         }\r
717                         else\r
718                         {\r
719                                 totalPageCount = (totalCount / countPerPage) + 1;\r
720                         }\r
721 \r
722                         SysTryReturn(NID_CNT, ((pageNo >= 1) && (pageNo <= totalPageCount)) , NULL, E_INVALID_ARG, "[E_INVALID_ARG] (pageNo < 1) || (pageNo > totalPageCount).");\r
723 \r
724                         offset = (pageNo * countPerPage) - countPerPage;\r
725 \r
726                         SysLog(NID_CNT, " SearchN   totalCount [%d] totalPageCount[%d] __countPerPage[%d] __pageNo[%d] offset[%d]",\r
727                                         totalCount, totalPageCount, countPerPage, pageNo, offset);\r
728 \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
733 \r
734                         r = ExecuteAndFillFinalOutList();\r
735                         SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, E_SYSTEM, "[E_SYSTEM] ExecuteAndFillFinalOutList Failed.");\r
736                 }\r
737                 else if (pageNo > 1)\r
738                 {\r
739                         r = E_INVALID_ARG;\r
740                         SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[E_INVALID_ARG] (pageNo > 1) and  (totalcount = 0).");\r
741                 }\r
742         }\r
743         SetLastResult(r);\r
744         return __pFinalOutList.release();\r
745 }\r
746 \r
747 // Fills final result list\r
748 result\r
749 _ContentSearchImpl::ExecuteAndFillFinalOutList(void) const\r
750 {\r
751         SysLog(NID_CNT, "Enter\n");\r
752 \r
753         int ret                                         = MEDIA_CONTENT_ERROR_NONE;\r
754         result r                                        = E_SUCCESS;\r
755 \r
756         std::unique_ptr<GList, SearchGListDeleter> pItemList;\r
757         GList* pTemp = NULL;\r
758         std::unique_ptr<media_info_s, SearchMediaHandleDeleter> pMediaHandle;\r
759 \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
764 \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
769 \r
770         std::unique_ptr<ContentSearchResult> pContentSearchResult;\r
771 \r
772         pTemp = pItemList.get();\r
773 \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
777 \r
778         SysTryReturnResult(NID_CNT, pTemp != NULL, r, "media_info_foreach_media_from_db pTemp is null.");\r
779 \r
780         media_content_type_e mediaType = MEDIA_CONTENT_TYPE_OTHERS;\r
781 \r
782         for (int idx = 0; idx < (int)g_list_length(pTemp); idx++)\r
783         {\r
784                 pMediaHandle.reset(static_cast<media_info_h>(g_list_nth_data(pTemp, idx)));\r
785 \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
789 \r
790                 switch (mediaType)\r
791                 {\r
792                 case MEDIA_CONTENT_TYPE_OTHERS:\r
793                         //memset(&contentData, 0, sizeof(contentData));\r
794 \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
797 \r
798                         pContentData = pOtherContentInfo->GetContentData();\r
799                         SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");\r
800 \r
801                         r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);\r
802                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");\r
803 \r
804 \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
807 \r
808                         pContentSearchResult->SetContentType(CONTENT_TYPE_OTHER);\r
809                         pContentSearchResult->SetContentInfo(pOtherContentInfo.release());\r
810 \r
811                         // Shallow copy, adds just the pointer: not the element\r
812 \r
813                         r = __pFinalOutList->Add(*(pContentSearchResult.release()));\r
814                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");\r
815 \r
816                         //pOtherContentInfo = null;\r
817                         //pContentSearchResult = null;\r
818                         //_ContentUtility::DeleteContentData(&contentData);\r
819                         break;\r
820                 case MEDIA_CONTENT_TYPE_IMAGE:\r
821                         //memset(&contentData, 0, sizeof(contentData));\r
822                         //memset(&imageContentData, 0, sizeof(imageContentData));\r
823 \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
826 \r
827                         pContentData = pImageContentInfo->GetContentData();\r
828                         SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");\r
829 \r
830                         pImageContentData = pImageContentInfo->GetImageContentData();\r
831                         SysTryReturnResult(NID_CNT, pImageContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");\r
832 \r
833                         r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);\r
834                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");\r
835 \r
836                         r = _ContentUtility::FillImageContentData(pMediaHandle.get(), pImageContentData);\r
837                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform GetDataFromImageTable operation.");\r
838 \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
841 \r
842                         pContentSearchResult->SetContentType(CONTENT_TYPE_IMAGE);\r
843                         pContentSearchResult->SetContentInfo(pImageContentInfo.release());\r
844 \r
845                         // Shallow copy, adds just the pointer: not the element\r
846 \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
852                         break;\r
853                 case MEDIA_CONTENT_TYPE_MUSIC:\r
854                         //fall through\r
855                 case MEDIA_CONTENT_TYPE_SOUND:\r
856                         //memset(&contentData, 0, sizeof(contentData));\r
857                         //memset(&audioContentData, 0, sizeof(audioContentData));\r
858 \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
861 \r
862                         pContentData = pAudioContentInfo->GetContentData();\r
863                         SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");\r
864 \r
865                         pAudioContentData = pAudioContentInfo->GetAudioContentData();\r
866                         SysTryReturnResult(NID_CNT, pAudioContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");\r
867 \r
868                         r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);\r
869                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");\r
870 \r
871                         r = _ContentUtility::FillAudioContentData(pMediaHandle.get(), pAudioContentData);\r
872                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillAudioContentData operation.");\r
873 \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
876 \r
877                         pContentSearchResult->SetContentType(CONTENT_TYPE_AUDIO);\r
878                         pContentSearchResult->SetContentInfo(pAudioContentInfo.release());\r
879 \r
880                         // Shallow copy, adds just the pointer: not the element\r
881 \r
882                         r = __pFinalOutList->Add(*(pContentSearchResult.release()));\r
883                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");\r
884 \r
885                         //pAudioContentInfo = null;\r
886                         //pContentSearchResult = null;\r
887                         //_ContentUtility::DeleteContentData(&contentData);\r
888                         //_ContentUtility::DeleteAudioContentData(&audioContentData);\r
889                         break;\r
890                 case MEDIA_CONTENT_TYPE_VIDEO:\r
891                         //memset(&contentData, 0, sizeof(contentData));\r
892                         //memset(&videoContentData, 0, sizeof(videoContentData));\r
893 \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
896 \r
897                         pContentData = pVideoContentInfo->GetContentData();\r
898                         SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");\r
899 \r
900                         pVideoContentData = pVideoContentInfo->GetVideoContentData();\r
901                         SysTryReturnResult(NID_CNT, pVideoContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");\r
902 \r
903                         r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);\r
904                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");\r
905 \r
906                         r = _ContentUtility::FillVideoContentData(pMediaHandle.get(), pVideoContentData);\r
907                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillVideoContentData operation.");\r
908 \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
911 \r
912                         pContentSearchResult->SetContentType(CONTENT_TYPE_VIDEO);\r
913                         pContentSearchResult->SetContentInfo(pVideoContentInfo.release());\r
914 \r
915                         // Shallow copy, adds just the pointer: not the element\r
916 \r
917                         r = __pFinalOutList->Add(*(pContentSearchResult.release()));\r
918                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");\r
919 \r
920                         //pVideoContentInfo = null;\r
921                         //pContentSearchResult = null;\r
922                         //_ContentUtility::DeleteContentData(&contentData);\r
923                         //_ContentUtility::DeleteVideoContentData(&videoContentData);\r
924                         break;\r
925                 default:\r
926                         break;\r
927                 }\r
928         }\r
929         return r;\r
930 }\r
931 \r
932 // returns  given column value list in the requested order\r
933 Collection::IList*\r
934 _ContentSearchImpl::GetValueListN(const String& sortColumn, SortOrder sortOrder)\r
935 {\r
936         SysLog(NID_CNT, "inputColumn = %ls", sortColumn.GetPointer());\r
937         ClearLastResult();\r
938 \r
939         result r        = E_SUCCESS;\r
940         int colIndex    = 0;\r
941         int maxCols     = 0;\r
942 \r
943         __inputColumnName.Clear();\r
944         __inputExpr.Clear();\r
945 \r
946         __inputColumnName = sortColumn;\r
947         __inputSortOrder  = sortOrder;\r
948 \r
949         String          ospColumnName(L"");\r
950         String          slpColumnName(L"");\r
951 \r
952         String          columnName(__inputColumnName);\r
953 \r
954         if ((__inputColumnName.IsEmpty()) && ((__inputSortOrder == SORT_ORDER_ASCENDING) || (__inputSortOrder == SORT_ORDER_DESCENDING)))\r
955         {\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
958                 return null;\r
959         }\r
960         else\r
961         {\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
964 \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
967 \r
968                 __pFinalOutList = std::move(pFinalOutList);\r
969 \r
970                 switch (__contentType)\r
971                 {\r
972                 case CONTENT_TYPE_OTHER:\r
973                         //fall through\r
974                 case CONTENT_TYPE_IMAGE:\r
975                         maxCols = MAX_QUERY_COLUMNS_FOR_IMAGE_OTHERS;\r
976                         break;\r
977                 case CONTENT_TYPE_VIDEO:\r
978                         maxCols = MAX_QUERY_COLUMNS_FOR_VIDEO;\r
979                         break;\r
980                 case CONTENT_TYPE_AUDIO:\r
981                         //fall through\r
982                 case CONTENT_TYPE_ALL:\r
983                         maxCols = MAX_QUERY_COLUMNS;\r
984                         break;\r
985                 default:\r
986                         break;\r
987                 }\r
988 \r
989                 for (colIndex = 0; colIndex < maxCols; colIndex++)\r
990                 {\r
991                         ospColumnName.Clear();\r
992                         slpColumnName.Clear();\r
993 \r
994                         ospColumnName = dbfieldinfo[colIndex].dbFieldOspName ;\r
995                         slpColumnName = dbfieldinfo[colIndex].dbFieldSlpName ;\r
996 \r
997                         ospColumnName.ToUpper();\r
998                         columnName.ToUpper();\r
999                         if (columnName == ospColumnName)\r
1000                         {\r
1001                                 r = FillColumnsList(colIndex);\r
1002                                 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[%s] FillColumnsList Failed.", GetErrorMessage(r));\r
1003                                 break;\r
1004                         }\r
1005                 }\r
1006                 if (colIndex == maxCols)\r
1007                 {\r
1008                         r = E_INVALID_ARG;\r
1009                         SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[E_INVALID_ARG] invalid column.");\r
1010                 }\r
1011         }\r
1012         SetLastResult(r);\r
1013         return __pFinalOutList.release();\r
1014 }\r
1015 \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
1019 {\r
1020         SysLog(NID_CNT, "pageNo = %d, countPerPage = %d, inputColumn = %ls", pageNo, countPerPage, sortColumn.GetPointer());\r
1021 \r
1022         ClearLastResult();\r
1023 \r
1024         result r        = E_SUCCESS;\r
1025         int colIndex    = 0;\r
1026         int maxCols     = 0;\r
1027 \r
1028         __inputColumnName.Clear();\r
1029         __inputExpr.Clear();\r
1030 \r
1031         __inputColumnName = sortColumn;\r
1032         __inputSortOrder  = sortOrder;\r
1033 \r
1034         String          ospColumnName(L"");\r
1035         String          slpColumnName(L"");\r
1036 \r
1037         String          columnName(__inputColumnName);\r
1038 \r
1039         if ((__inputColumnName.IsEmpty()) && ((__inputSortOrder == SORT_ORDER_ASCENDING) || (__inputSortOrder == SORT_ORDER_DESCENDING)))\r
1040         {\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
1043                 return null;\r
1044         }\r
1045         else\r
1046         {\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
1049 \r
1050                 r = pFinalOutList->Construct();\r
1051                 SysTryReturn(NID_CNT, !IsFailed(r), NULL, r, "[%s] Failed to construct ArrayList.", GetErrorMessage(r));\r
1052 \r
1053                 __pFinalOutList = std::move(pFinalOutList);\r
1054 \r
1055                 switch (__contentType)\r
1056                 {\r
1057                 case CONTENT_TYPE_OTHER:\r
1058                         //fall through\r
1059                 case CONTENT_TYPE_IMAGE:\r
1060                         maxCols = MAX_QUERY_COLUMNS_FOR_IMAGE_OTHERS;\r
1061                         break;\r
1062                 case CONTENT_TYPE_VIDEO:\r
1063                         maxCols = MAX_QUERY_COLUMNS_FOR_VIDEO;\r
1064                         break;\r
1065                 case CONTENT_TYPE_AUDIO:\r
1066                         //fall through\r
1067                 case CONTENT_TYPE_ALL:\r
1068                         maxCols = MAX_QUERY_COLUMNS;\r
1069                         break;\r
1070                 default:\r
1071                         break;\r
1072                 }\r
1073 \r
1074                 for (colIndex = 0; colIndex < maxCols; colIndex++)\r
1075                 {\r
1076                         ospColumnName.Clear();\r
1077                         slpColumnName.Clear();\r
1078 \r
1079                         ospColumnName = dbfieldinfo[colIndex].dbFieldOspName ;\r
1080                         slpColumnName = dbfieldinfo[colIndex].dbFieldSlpName ;\r
1081 \r
1082                         ospColumnName.ToUpper();\r
1083                         columnName.ToUpper();\r
1084                         if (columnName == ospColumnName)\r
1085                         {\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
1088                                 break;\r
1089                         }\r
1090                 }\r
1091                 if (colIndex == maxCols)\r
1092                 {\r
1093                         r = E_INVALID_ARG;\r
1094                         SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[E_INVALID_ARG] invalid column.");\r
1095                 }\r
1096         }\r
1097         SetLastResult(r);\r
1098         return __pFinalOutList.release();\r
1099 }\r
1100 \r
1101 // prepares query expression to be used in group api. colIndex is mapped to actual group value.\r
1102 media_group_e\r
1103 _ContentSearchImpl::GetIndexAndCreateQueryExp(int colIndex) const\r
1104 {\r
1105         media_group_e groupIndex = MEDIA_CONTENT_GROUP_DISPLAY_NAME;;\r
1106         switch (colIndex)\r
1107         {\r
1108         case 0://"ContentType", "MEDIA_TYPE"\r
1109                 groupIndex = MEDIA_CONTENT_GROUP_TYPE;\r
1110                 __inputExpr = "MEDIA_TYPE IS NOT NULL";\r
1111                 break;\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
1115                 break;\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
1119                 break;\r
1120         case 3://"Category", "MEDIA_CATEGORY"\r
1121                 groupIndex = MEDIA_CONTENT_GROUP_CATEGORY;\r
1122                 __inputExpr = "MEDIA_CATEGORY IS NOT NULL";\r
1123                 break;\r
1124         case 4://"Author", "MEDIA_AUTHOR"\r
1125                 groupIndex = MEDIA_CONTENT_GROUP_AUTHOR;\r
1126                 __inputExpr = "MEDIA_AUTHOR IS NOT NULL";\r
1127                 break;\r
1128         case 5://"keyword", "MEDIA_KEYWORD"\r
1129                 groupIndex = MEDIA_CONTENT_GROUP_KEYWORD;\r
1130                 __inputExpr = "MEDIA_KEYWORD IS NOT NULL";\r
1131                 break;\r
1132         case 6://"Provider", "MEDIA_PROVIDER"\r
1133                 groupIndex = MEDIA_CONTENT_GROUP_PROVIDER;\r
1134                 __inputExpr = "MEDIA_PROVIDER IS NOT NULL";\r
1135                 break;\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
1139                 break;\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
1143                 break;\r
1144         case 9://"ContentSize", "MEDIA_SIZE"\r
1145                 groupIndex = MEDIA_CONTENT_GROUP_SIZE;\r
1146                 __inputExpr = "MEDIA_SIZE IS NOT NULL";\r
1147                 break;\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
1151                 break;\r
1152         case 11://"Latitude", "MEDIA_LATITUDE"\r
1153                 groupIndex = MEDIA_CONTENT_GROUP_LATITUDE;\r
1154                 __inputExpr = "MEDIA_LATITUDE IS NOT NULL";\r
1155                 break;\r
1156         case 12://"Longitude", "MEDIA_LONGITUDE"\r
1157                 groupIndex = MEDIA_CONTENT_GROUP_LONGITUDE;\r
1158                 __inputExpr = "MEDIA_LONGITUDE IS NOT NULL";\r
1159                 break;\r
1160         case 13://"Altitude", "MEDIA_ALTITUDE"\r
1161                 groupIndex = MEDIA_CONTENT_GROUP_ALTITUDE;\r
1162                 __inputExpr = "MEDIA_ALTITUDE IS NOT NULL";\r
1163                 break;\r
1164         case 14://"Title", "MEDIA_TITLE"\r
1165                 groupIndex = MEDIA_CONTENT_GROUP_TITLE;\r
1166                 __inputExpr = "MEDIA_TITLE IS NOT NULL";\r
1167                 break;\r
1168         case 15://"Artist", "MEDIA_ARTIST"\r
1169                 groupIndex = MEDIA_CONTENT_GROUP_ARTIST;\r
1170                 __inputExpr = "MEDIA_ARTIST IS NOT NULL";\r
1171                 break;\r
1172         case 16://"Genre", "MEDIA_GENRE"\r
1173                 groupIndex = MEDIA_CONTENT_GROUP_GENRE;\r
1174                 __inputExpr = "MEDIA_GENRE IS NOT NULL";\r
1175                 break;\r
1176         case 17://"Year", "MEDIA_YEAR"\r
1177                 groupIndex = MEDIA_CONTENT_GROUP_YEAR;\r
1178                 __inputExpr = "MEDIA_YEAR IS NOT NULL";\r
1179                 break;\r
1180         case 18://"Composer", "MEDIA_COMPOSER"\r
1181                 groupIndex = MEDIA_CONTENT_GROUP_COMPOSER;\r
1182                 __inputExpr = "MEDIA_COMPOSER IS NOT NULL";\r
1183                 break;\r
1184         case 19://"Album", "MEDIA_ALBUM"\r
1185                 __inputExpr = "MEDIA_ALBUM IS NOT NULL";\r
1186                 break;\r
1187         default:\r
1188                 break;\r
1189         }\r
1190         return groupIndex;\r
1191 }\r
1192 \r
1193 // Fills  given column value list and destroys filter handle\r
1194 result\r
1195 _ContentSearchImpl::FillColumnsList(int colIndex) const\r
1196 {\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
1201 \r
1202         r = CreateQueryFilter(true);\r
1203         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "CreateQueryFilter Failed.");\r
1204 \r
1205         if (colIndex == ALBUM_COLUMN_NUM)\r
1206         {\r
1207                 ret = media_album_get_album_count_from_db(*(__pFilterHandle.get()), &totalCount);\r
1208         }\r
1209         else\r
1210         {\r
1211                 ret = media_group_get_group_count_from_db(*(__pFilterHandle.get()), groupIndex, &totalCount);\r
1212         }\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
1215 \r
1216         SysLog(NID_CNT, "totalCount = %d for media_album/group count_from_db", totalCount);\r
1217 \r
1218         if (totalCount > 0)\r
1219         {\r
1220                 if (colIndex == ALBUM_COLUMN_NUM)\r
1221                 {\r
1222                         r = ExecuteAndFillAlbumValues();\r
1223                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "ExecuteAndFillAlbumValues Failed.");\r
1224                 }\r
1225                 else\r
1226                 {\r
1227                         r = ExecuteAndFillGetValueListN(groupIndex, colIndex);\r
1228                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "ExecuteAndFillGetValueListN Failed.");\r
1229                 }\r
1230         }\r
1231         return r;\r
1232 }\r
1233 \r
1234 // prepares input expression to be sent for create filter and fills  given column value list\r
1235 result\r
1236 _ContentSearchImpl::FillColumnsList(int pageNo, int countPerPage, int& totalPageCount, int& totalCount, int colIndex) const\r
1237 {\r
1238         result r        = E_SUCCESS;\r
1239         int ret         = MEDIA_CONTENT_ERROR_NONE;\r
1240         int offset      = 0;\r
1241         totalPageCount = 0;\r
1242         totalCount = 0;\r
1243         media_group_e groupIndex = GetIndexAndCreateQueryExp(colIndex);\r
1244 \r
1245         r = CreateQueryFilter(true);\r
1246         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "CreateQueryFilter Failed.");\r
1247 \r
1248         if (colIndex == ALBUM_COLUMN_NUM)\r
1249         {\r
1250                 ret = media_album_get_album_count_from_db(*(__pFilterHandle.get()), &totalCount);\r
1251         }\r
1252         else\r
1253         {\r
1254                 ret = media_group_get_group_count_from_db(*(__pFilterHandle.get()), groupIndex, &totalCount);\r
1255         }\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
1258 \r
1259         SysLog(NID_CNT, "totalCount = %d for media_album/group count_from_db", totalCount);\r
1260 \r
1261         if (totalCount > 0)\r
1262         {\r
1263                 if ((totalCount % countPerPage) == 0)\r
1264                 {\r
1265                         totalPageCount = totalCount / countPerPage;\r
1266                 }\r
1267                 else\r
1268                 {\r
1269                         totalPageCount = (totalCount / countPerPage) + 1;\r
1270                 }\r
1271 \r
1272                 if ((pageNo < 1) || (pageNo > totalPageCount))\r
1273                 {\r
1274                         r = E_INVALID_ARG;\r
1275                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "(pageNo < 1) || (pageNo > totalPageCount).");\r
1276                 }\r
1277 \r
1278                 offset = (pageNo * countPerPage) - countPerPage;\r
1279 \r
1280                 SysLog(NID_CNT, "GetValueListN totalCount [%d] totalPageCount[%d] __countPerPage[%d] __pageNo[%d] offset[%d]",\r
1281                                 totalCount, totalPageCount, countPerPage, pageNo, offset);\r
1282 \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
1286 \r
1287                 if (colIndex == ALBUM_COLUMN_NUM)\r
1288                 {\r
1289                         r = ExecuteAndFillAlbumValues();\r
1290                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "ExecuteAndFillAlbumValues Failed.");\r
1291                 }\r
1292                 else\r
1293                 {\r
1294                         r = ExecuteAndFillGetValueListN(groupIndex, colIndex);\r
1295                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "ExecuteAndFillGetValueListN Failed.");\r
1296                 }\r
1297 \r
1298         }\r
1299         else if (pageNo > 1)\r
1300         {\r
1301                 r = E_INVALID_ARG;\r
1302                 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "(pageNo > 1) and  (totalcount = 0).");\r
1303         }\r
1304 \r
1305         return r;\r
1306 }\r
1307 \r
1308 //  fills  given column value list for GetValuelistN api\r
1309 result\r
1310 _ContentSearchImpl::ExecuteAndFillGetValueListN(media_group_e groupIndex, int colIndex) const\r
1311 {\r
1312         SysLog(NID_CNT, "Enter\n");\r
1313 \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
1319 \r
1320         std::unique_ptr<Object> pValue;\r
1321 \r
1322         DateTime dateTime;\r
1323 \r
1324         long long contentSize = 0;\r
1325         long long addedTime     = 0;\r
1326 \r
1327         double dVal     = 0;\r
1328         char *pColumnVal = null;\r
1329         int contentType = 0;\r
1330 \r
1331         pTemp = pItemList.get();\r
1332 \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
1336 \r
1337         SysTryReturnResult(NID_CNT, pTemp != NULL, r, "media_info_foreach_media_from_db pTemp is null.");\r
1338 \r
1339         for (int idx = 0; idx < (int)g_list_length(pTemp); idx++)\r
1340         {\r
1341                 SysLog(NID_CNT, "idx = %d and (int)g_list_length(pItemList) = %d", idx, (int)g_list_length(pTemp));\r
1342 \r
1343                 pColumnVal = (char *)g_list_nth_data(pTemp, idx);\r
1344 \r
1345                 String strColVal(pColumnVal);\r
1346 \r
1347                 _ContentUtility::DoSafeFree(pColumnVal);\r
1348 \r
1349                 SysLog(NID_CNT, "pColumnVal = %ls", strColVal.GetPointer());\r
1350 \r
1351                 switch (colIndex)\r
1352                 {\r
1353                 case 0://"ContentType", "MEDIA_TYPE"\r
1354                         if ((strColVal.CompareTo(L"Unknown") != 0) && (!strColVal.IsEmpty()))\r
1355                         {\r
1356                                 res = Integer::Parse(strColVal, contentType);\r
1357                                 SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] Integer parse failed.", GetErrorMessage(res));\r
1358                         }\r
1359                         switch ((media_content_type_e)contentType)\r
1360                         {\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
1364                                 break;\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
1368                                 break;\r
1369                         case MEDIA_CONTENT_TYPE_SOUND:\r
1370                                 //fall through\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
1374                                 break;\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
1378                                 break;\r
1379                         default:\r
1380                                 break;\r
1381                         }\r
1382                         break;\r
1383                 case 1://"ContentFileName", "MEDIA_DISPLAY_NAME"\r
1384                 //fall through\r
1385                 case 2://"ContentName", "MEDIA_CONTENT_NAME"\r
1386                 //fall through\r
1387                 case 3://"Category", "MEDIA_CATEGORY"\r
1388                 //fall through\r
1389                 case 4://"Author", "MEDIA_AUTHOR"\r
1390                 //fall through\r
1391                 case 5://"keyword", "MEDIA_KEYWORD"\r
1392                 //fall through\r
1393                 case 6://"Provider", "MEDIA_PROVIDER"\r
1394                 //fall through\r
1395                 case 7://"Rating", "MEDIA_AGE_RATING"\r
1396                 //fall through\r
1397                 case 8://"LocationTag", "MEDIA_LOCATION_TAG"\r
1398                 //fall through\r
1399                 case 14://"Title", "MEDIA_TITLE"\r
1400                 //fall through\r
1401                 case 15://"Artist", "MEDIA_ARTIST"\r
1402                 //fall through\r
1403                 case 16://"Genre", "MEDIA_GENRE"\r
1404                 //fall through\r
1405                 case 17://"Year", "MEDIA_YEAR"\r
1406                 //fall through\r
1407                 case 18://"Composer", "MEDIA_COMPOSER"\r
1408 \r
1409                         pValue.reset(new (std::nothrow) String(strColVal));\r
1410                         break;\r
1411 \r
1412                 case 9://"ContentSize", "MEDIA_SIZE" \r
1413                         if ((strColVal.CompareTo(L"Unknown") != 0) && (!strColVal.IsEmpty()))\r
1414                         {\r
1415                                 res = LongLong::Parse(strColVal, contentSize);\r
1416                                 SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] LongLong parse failed.", GetErrorMessage(res));\r
1417                         }\r
1418 \r
1419                         pValue.reset(new (std::nothrow) LongLong(contentSize));\r
1420                         break;\r
1421                 case 10://"DateTime", "MEDIA_ADDED_TIME" \r
1422                         if ((strColVal.CompareTo(L"Unknown") != 0) && (!strColVal.IsEmpty()))\r
1423                         {\r
1424                                 res = LongLong::Parse(strColVal, addedTime);\r
1425                                 SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] LongLong parse failed.", GetErrorMessage(res));\r
1426                         }\r
1427 \r
1428                         res = dateTime.SetValue(1970, 1, 1);\r
1429                         SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] dateTime.SetValue failed.", GetErrorMessage(res));\r
1430 \r
1431                         res = dateTime.AddSeconds(addedTime);\r
1432                         SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] dateTime.AddSeconds failed.", GetErrorMessage(res));\r
1433 \r
1434                         SysLog(NID_CNT, "DateTime : %ls", dateTime.ToString().GetPointer());\r
1435 \r
1436                         pValue.reset(new (std::nothrow) DateTime(dateTime));\r
1437 \r
1438                         break;\r
1439                 case 11://"Latitude", "MEDIA_LATITUDE"\r
1440                         //fall through\r
1441                 case 12://"Longitude", "MEDIA_LONGITUDE"\r
1442                         //fall through\r
1443                 case 13://"Altitude", "MEDIA_ALTITUDE"\r
1444                         if ((strColVal.CompareTo(L"Unknown") != 0) && (!strColVal.IsEmpty()))\r
1445                         {\r
1446                                 res = Double::Parse(strColVal, dVal);\r
1447                                 SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] double parse failed.", GetErrorMessage(res));\r
1448                         }\r
1449                         pValue.reset(new (std::nothrow) Double(dVal));\r
1450                         break;\r
1451 \r
1452                 case 19://"Album", "MEDIA_ALBUM"\r
1453                         break;\r
1454                 default:\r
1455                         break;\r
1456                 }\r
1457                 if (pValue.get() != NULL)\r
1458                 {\r
1459                         r = __pFinalOutList->Add(*(pValue.release()));\r
1460                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform arraylist Add operation.");\r
1461                 }\r
1462         }\r
1463 \r
1464         return r;\r
1465 }\r
1466 \r
1467 result\r
1468 _ContentSearchImpl::ExecuteAndFillAlbumValues(void) const\r
1469 {\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
1476 \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
1481 \r
1482         pTemp = pItemList.get();\r
1483 \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
1488 \r
1489         for (int idx = 0; idx < (int)g_list_length(pTemp); idx++)\r
1490         {\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
1495                 \r
1496                 if (pName != NULL)\r
1497                 {\r
1498                         SysLog(NID_CNT, "pColumnVal = %s", pName);\r
1499 \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
1503 \r
1504                         if (idx == 0)\r
1505                         {\r
1506                                 r = __pFinalOutList->Add(pValue.get());\r
1507                                 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform arraylist Add operation.");\r
1508                                 pValue.release();\r
1509                         }\r
1510                         else\r
1511                         {\r
1512                                 String* pTempNameList(static_cast< String* >(__pFinalOutList->GetAt(lastIndex)));\r
1513 \r
1514                                 if (pValue->CompareTo(*pTempNameList) != 0)\r
1515                                 {\r
1516                                         r = __pFinalOutList->Add(pValue.get());\r
1517                                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform arraylist Add operation.");\r
1518 \r
1519                                         pValue.release();\r
1520                                         lastIndex++;\r
1521                                 }\r
1522                         }\r
1523                 }\r
1524         }\r
1525 \r
1526         return r;\r
1527 }\r
1528 \r
1529 result\r
1530 _ContentSearchImpl::MapCoreErrorToNativeResult(int reason) const\r
1531 {\r
1532         result r = E_SUCCESS;\r
1533 \r
1534         switch (reason)\r
1535         {\r
1536         case MEDIA_CONTENT_ERROR_NONE:\r
1537                 r = E_SUCCESS;\r
1538                 break;\r
1539 \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
1543                 break;\r
1544 \r
1545         case MEDIA_CONTENT_ERROR_DB_FAILED:\r
1546                 r = E_SYSTEM;\r
1547                 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_DB_FAILED");\r
1548                 break;\r
1549 \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
1553                 break;\r
1554 \r
1555         default:\r
1556                 SysLog(NID_CNT, "default");\r
1557                 r = E_SYSTEM;\r
1558                 break;\r
1559         }\r
1560         return r;\r
1561 }\r
1562 \r
1563 //Callback function registered to each media info details\r
1564 // all items are appened to the list\r
1565 bool\r
1566 MediaItemCb(media_info_h media, void* pUserdata)\r
1567 {\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
1572 \r
1573         GList** pList = (GList**)pUserdata;\r
1574         *pList = g_list_append(*pList, new_media);\r
1575 \r
1576         return true;\r
1577 }\r
1578 \r
1579 //Callback function registered for column values\r
1580 // all items are appened to the list\r
1581 bool\r
1582 GroupItemCb(const char* pGroupName, void* pUserdata)\r
1583 {\r
1584         char* pGrpName = strdup(pGroupName);\r
1585         GList** pList = (GList**)pUserdata;\r
1586         *pList = g_list_append(*pList, pGrpName);\r
1587 \r
1588         return true;\r
1589 }\r
1590 \r
1591 //Callback function registered to each media info details\r
1592 // all items are appened to the list\r
1593 bool\r
1594 AlbumItemCb(media_album_h album, void* pUserdata)\r
1595 {\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
1600 \r
1601         GList** pList = (GList**)pUserdata;\r
1602         *pList = g_list_append(*pList, new_album);\r
1603 \r
1604         return true;\r
1605 }\r
1606 \r
1607 }}\r