[content] Fix bug on ContentDirectory
[platform/framework/native/content.git] / src / FCnt_ContentSearchImpl.cpp
1 //\r
2 // Open Service Platform\r
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.\r
4 //\r
5 // Licensed under the Apache License, Version 2.0 (the License);\r
6 // you may not use this file except in compliance with the License.\r
7 // You may obtain a copy of the License at\r
8 //\r
9 //     http://www.apache.org/licenses/LICENSE-2.0\r
10 //\r
11 // Unless required by applicable law or agreed to in writing, software\r
12 // distributed under the License is distributed on an "AS IS" BASIS,\r
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14 // See the License for the specific language governing permissions and\r
15 // limitations under the License.\r
16 //\r
17 /**\r
18  * @file                FCnt_ContentSearchImpl.cpp\r
19  * @brief               This is the implementation file for the %_ContentSearchImpl class.\r
20  *\r
21  * This file contains implementation of the %_ContentSearchImpl class.\r
22  */\r
23 \r
24 #include <time.h>\r
25 #include <FBaseSysLog.h>\r
26 #include <FBaseInteger.h>\r
27 #include <FBaseLongLong.h>\r
28 #include <FBaseFloat.h>\r
29 #include <FBaseColIList.h>\r
30 #include <FBaseUtilStringTokenizer.h>\r
31 #include <FCntContentSearch.h>\r
32 #include <FCntContentSearchResult.h>\r
33 #include <FBase_StringConverter.h>\r
34 #include <FCnt_ContentUtility.h>\r
35 #include <FCnt_ContentSearchImpl.h>\r
36 \r
37 using namespace Tizen::Base;\r
38 using namespace Tizen::Base::Collection;\r
39 using namespace Tizen::Base::Utility;\r
40 using namespace Tizen::Io;\r
41 \r
42 namespace Tizen { namespace Content\r
43 {\r
44 \r
45 static const int QUERY_LENGTH = 4096;\r
46 \r
47 // Declaration for Callback function registered to each media info details\r
48 bool MediaItemCb(media_info_h media, void* pUserdata);\r
49 // Declaration for Callback function registered to each column details\r
50 bool GroupItemCb(const char* pGroupName, void* pUserdata);\r
51 // Declaration for Callback function registered to each album details\r
52 bool AlbumItemCb(media_album_h album, void* pUserdata);\r
53 \r
54 // Default constructor\r
55 _ContentSearchImpl::_ContentSearchImpl(void)\r
56         : Object()\r
57         , __contentType(CONTENT_TYPE_UNKNOWN)\r
58         , __pFinalOutList(NULL)\r
59         , __inputExpr(L"")\r
60         , __inputColumnName(L"")\r
61         , __inputSortOrder(SORT_ORDER_NONE)\r
62         , __pFilterHandle(0)\r
63 {\r
64         SysLog(NID_CNT, "Enter\n");\r
65 }\r
66 \r
67 \r
68 // Default destructor (disconnects the DB connection)\r
69 _ContentSearchImpl::~_ContentSearchImpl(void)\r
70 {\r
71         SysLog(NID_CNT, "Enter\n");\r
72 \r
73         int ret = MEDIA_CONTENT_ERROR_NONE;\r
74         result r = E_SUCCESS;\r
75 \r
76         ret = media_content_disconnect();\r
77         r = MapCoreErrorToNativeResult(ret);\r
78         SysTryLog(NID_CNT, r == E_SUCCESS, "[%s] Propagated in ~_ContentSearchImpl", GetErrorMessage(r));\r
79 }\r
80 \r
81  _ContentSearchImpl*\r
82  _ContentSearchImpl::GetInstance(ContentSearch& contentSearch)\r
83 {\r
84         return contentSearch.__pImpl;\r
85 }\r
86 \r
87 const _ContentSearchImpl*\r
88 _ContentSearchImpl::GetInstance(const ContentSearch& contentSearch)\r
89 {\r
90         return contentSearch.__pImpl;\r
91 }\r
92 \r
93 //make a connection to DB\r
94 result\r
95 _ContentSearchImpl::Construct(ContentType type)\r
96 {\r
97         SysLog(NID_CNT, "Enter\n");\r
98 \r
99         result r = E_SUCCESS;\r
100         int ret = MEDIA_CONTENT_ERROR_NONE;\r
101 \r
102         ret = media_content_connect();\r
103         SysTryReturnResult(NID_CNT, r == E_SUCCESS , E_SYSTEM, "Failed to perform media_content_connect operation.");\r
104 \r
105         __contentType = type;\r
106 \r
107         return r;\r
108 }\r
109 \r
110 // Creates a filter for the input query string along with content type\r
111 // Initializes filter handle\r
112 // Image - MEDIA_TYPE=0\r
113 // Vide0 - MEDIA_TYPE=1\r
114 // Audio - MEDIA_TYPE=2 or MEDIA_TYPE=3\r
115 // Others - MEDIA_TYPE=4\r
116 // All - none\r
117 // Appends MEDIA_TYPE with "AND" (if the input expression is not empty and content type is not ALL) and  input expression\r
118 // Sets the condition and order.\r
119 // If any argument is not proper E_INVALID_ARG is returned\r
120 result\r
121 _ContentSearchImpl::CreateQueryFilter(bool isAndAppendReq) const\r
122 {\r
123         int ret  = MEDIA_CONTENT_ERROR_NONE;\r
124         result r = E_SUCCESS;\r
125 \r
126         std::unique_ptr<char[]> pInputCond;\r
127         std::unique_ptr<char[]> pSortCol;\r
128 \r
129         String inputCondition;\r
130         String slpColumn;\r
131 \r
132         std::unique_ptr<filter_h, SearchFilterHandleDeleter> pFilterHandle(new (std::nothrow) filter_h);\r
133 \r
134         ret = media_filter_create(pFilterHandle.get());\r
135         SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, E_SYSTEM, "Failed to perform media_filter_create operation.");\r
136 \r
137         switch (__contentType)\r
138         {\r
139                 // Image-0,video-1,sound-2,music-3,other-4\r
140         case CONTENT_TYPE_OTHER:\r
141                 inputCondition = "MEDIA_TYPE=4 ";\r
142                 break;\r
143         case CONTENT_TYPE_IMAGE:\r
144                 inputCondition = "MEDIA_TYPE=0 ";\r
145                 break;\r
146         case CONTENT_TYPE_AUDIO:\r
147                 inputCondition = "(MEDIA_TYPE=2 or MEDIA_TYPE=3) ";\r
148                 break;\r
149         case CONTENT_TYPE_VIDEO:\r
150                 inputCondition = "MEDIA_TYPE=1 ";\r
151                 break;\r
152         case CONTENT_TYPE_ALL:\r
153                 //If content type is CONTENT_TYPE_ALL, then MEDIA_TYPE is empty\r
154                 break;\r
155         default:\r
156                 break;\r
157         }\r
158 \r
159         if (!__inputExpr.IsEmpty())\r
160         {\r
161                 if (isAndAppendReq && (!inputCondition.IsEmpty())) //For CONTENT_TYPE_ALL inputCondition is empty\r
162                 {\r
163                         r = inputCondition.Append("AND ");\r
164                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform append operation.");\r
165                 }\r
166 \r
167                 r = inputCondition.Append(__inputExpr);\r
168                 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform append operation.");\r
169         }\r
170 \r
171         if (!inputCondition.IsEmpty())\r
172         {\r
173                 //CopyToCharArrayN: utility function, converts a osp string to char*\r
174                 pInputCond = std::unique_ptr<char[]>(_StringConverter::CopyToCharArrayN(inputCondition));\r
175                 SysTryReturnResult(NID_CNT, pInputCond, E_OUT_OF_MEMORY, "pInputCond is NULL.");\r
176 \r
177                 SysLog(NID_CNT, "pInputCond = %s", pInputCond.get());\r
178 \r
179                 ret = media_filter_set_condition(*(pFilterHandle.get()), pInputCond.get(), MEDIA_CONTENT_COLLATE_DEFAULT);\r
180                 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, E_SYSTEM, "Failed to perform media_filter_set_condition operation.");\r
181         }\r
182 \r
183         if (!__inputColumnName.IsEmpty()) // SortColumn is optional in case of SearchN\r
184         {\r
185                 //__inputColumnName (osp column name) is replaced with slpColumn (slp column name).\r
186                 r = GetSlpColumnName(slpColumn);\r
187                 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform GetSlpColumnName operation.");\r
188 \r
189                 //CopyToCharArrayN: utility function, converts a osp string to char*\r
190 \r
191                 pSortCol = std::unique_ptr<char[]>(_StringConverter::CopyToCharArrayN(slpColumn));\r
192                 SysTryReturnResult(NID_CNT, pSortCol, E_OUT_OF_MEMORY, "pSortCol is NULL.");\r
193 \r
194                 if (__inputSortOrder == SORT_ORDER_ASCENDING)\r
195                 {\r
196                         ret = media_filter_set_order(*(pFilterHandle.get()), MEDIA_CONTENT_ORDER_ASC, pSortCol.get(), MEDIA_CONTENT_COLLATE_DEFAULT);\r
197                         SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, E_SYSTEM, "Failed to perform media_filter_set_order operation.");\r
198                 }\r
199                 else if (__inputSortOrder == SORT_ORDER_DESCENDING)\r
200                 {\r
201                         ret = media_filter_set_order(*(pFilterHandle.get()), MEDIA_CONTENT_ORDER_DESC, pSortCol.get(), MEDIA_CONTENT_COLLATE_DEFAULT);\r
202                         SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, E_SYSTEM, "Failed to perform media_filter_set_order operation.");\r
203                 }\r
204         }\r
205 \r
206         __pFilterHandle.reset(pFilterHandle.release());\r
207 \r
208         return r;\r
209 }\r
210 \r
211 // Osp column names are mapped with slp column names\r
212 // CONTENT_TYPE_OTHER and CONTENT_TYPE_IMAGE (0 - 13 ) are valid columns\r
213 // CONTENT_TYPE_VIDEO  (0 - 16 ) are valid columns\r
214 // CONTENT_TYPE_ALL and  CONTENT_TYPE_VIDEO (0 - 18 ) are valid columns\r
215 // if the given osp column is out of the specified range of the type, E_INVALID_ARG is retuned.\r
216 result\r
217 _ContentSearchImpl::GetSlpColumnName(String& inputCol) const\r
218 {\r
219         String          ospColumnName(L"");\r
220         String          slpColumnName(L"");\r
221         String          columnName(__inputColumnName);\r
222         result          r = E_SUCCESS;\r
223         int             maxCols = 0;\r
224         switch (__contentType)\r
225         {\r
226         case CONTENT_TYPE_OTHER:\r
227                 //fall through\r
228         case CONTENT_TYPE_IMAGE:\r
229                 maxCols = MAX_QUERY_COLUMNS_FOR_IMAGE_OTHERS;\r
230                 break;\r
231         case CONTENT_TYPE_VIDEO:\r
232                 maxCols = MAX_QUERY_COLUMNS_FOR_VIDEO;\r
233                 break;\r
234         case CONTENT_TYPE_AUDIO:\r
235                 //fall through\r
236         case CONTENT_TYPE_ALL:\r
237                 maxCols = MAX_QUERY_COLUMNS;\r
238                 break;\r
239         default:\r
240                 break;\r
241         }\r
242         for (int colIndex = 0; colIndex < maxCols; colIndex++)\r
243         {\r
244                 ospColumnName.Clear();\r
245                 slpColumnName.Clear();\r
246 \r
247                 ospColumnName = dbfieldinfo[colIndex].dbFieldOspName ;\r
248                 slpColumnName = dbfieldinfo[colIndex].dbFieldSlpName ;\r
249 \r
250                 ospColumnName.ToUpper();\r
251                 columnName.ToUpper();\r
252                 if (columnName == ospColumnName)\r
253                 {\r
254                         inputCol = slpColumnName;\r
255                         return r;\r
256                 }\r
257         }\r
258         return E_INVALID_ARG;\r
259 }\r
260 \r
261 //If the input expression contains any osp column name, it will be replaced with slp column name.\r
262 // only CONTENT_TYPE_AUDIO and CONTENT_TYPE_ALL allowed to use all given columns\r
263 // so, check for invalid column for CONTENT_TYPE_OTHER,CONTENT_TYPE_IMAGE and CONTENT_TYPE_VIDEO.\r
264 // all the osp columns in the expression should be replaced with slp column names.\r
265 // ' is used as a delimeter in parsing user query. so, \\' is saved as a special@apostrophe string.\r
266 // \\' is replaced with '', which considers ' as normal character.\r
267 \r
268 result\r
269 _ContentSearchImpl::ReplaceOspColumnNameWithSlp(void) const\r
270 {\r
271         String          ospColumnName(L"");\r
272         String          slpColumnName(L"");\r
273         String          splApostrophe(L"special@apostrophe");\r
274         result          r = E_SUCCESS;\r
275         int             maxCols = 0;\r
276 \r
277         int indexOf = 0;\r
278         \r
279         String strToBeReplaced(L"\\'");\r
280         int strLen = strToBeReplaced.GetLength();\r
281         int startIndex = 0;\r
282 \r
283         while(E_SUCCESS == __inputExpr.IndexOf(strToBeReplaced,startIndex,indexOf))\r
284         {\r
285                 int lenAfterSubStr = indexOf + strLen;\r
286                 while ((lenAfterSubStr < __inputExpr.GetLength()) && (__inputExpr[lenAfterSubStr] == ' '))\r
287                 {\r
288                         lenAfterSubStr++;\r
289                 }\r
290                 if ((lenAfterSubStr < __inputExpr.GetLength()) && ((__inputExpr[lenAfterSubStr] == '\'') ||\r
291                                 ((!__inputExpr.StartsWith(L"AND ", lenAfterSubStr)) && (!__inputExpr.StartsWith(L"OR ", lenAfterSubStr)))))\r
292                 {\r
293                         r = __inputExpr.Remove(indexOf,strLen);\r
294                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "Failed to perform Remove operation.");\r
295                         r = __inputExpr.Insert(splApostrophe,indexOf);\r
296                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "Failed to perform Insert operation.");\r
297                         startIndex = indexOf + splApostrophe.GetLength();\r
298                 }\r
299                 else\r
300                 {\r
301                         startIndex = lenAfterSubStr;\r
302                 }\r
303         }\r
304 \r
305         SysLog(NID_CNT, "__inputExpr after splApostrophe append = %ls", __inputExpr.GetPointer());\r
306 \r
307         switch (__contentType)\r
308         {\r
309         case CONTENT_TYPE_OTHER:\r
310                 //fall through\r
311         case CONTENT_TYPE_IMAGE:\r
312                 r = CheckInvalidColumnInQuery();\r
313                 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_INVALID_ARG, "Invalid Column In QueryString.");\r
314                 maxCols = MAX_QUERY_COLUMNS_FOR_IMAGE_OTHERS;\r
315                 break;\r
316         case CONTENT_TYPE_VIDEO:\r
317                 r = CheckInvalidColumnInQuery();\r
318                 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_INVALID_ARG, "Invalid Column In QueryString.");\r
319                 maxCols = MAX_QUERY_COLUMNS_FOR_VIDEO;\r
320                 break;\r
321         case CONTENT_TYPE_AUDIO:\r
322                 //fall through\r
323         case CONTENT_TYPE_ALL:\r
324                 maxCols = MAX_QUERY_COLUMNS;\r
325                 break;\r
326         default:\r
327                 break;\r
328         }\r
329         for (int colIndex = 0; colIndex < maxCols; colIndex++)\r
330         {\r
331                 ospColumnName.Clear();\r
332                 slpColumnName.Clear();\r
333 \r
334                 ospColumnName = dbfieldinfo[colIndex].dbFieldOspName ;\r
335                 slpColumnName = dbfieldinfo[colIndex].dbFieldSlpName ;\r
336 \r
337                 ReplaceString(ospColumnName,slpColumnName);\r
338         }\r
339 \r
340         // Append ESCAPE '\' for LIKE query\r
341         r = AppendEscapeKeywordForLikeQuery();\r
342         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "AppendEscapeKeywordForLikeQuery failed.");\r
343 \r
344         r = ReplaceDateTimeStringWithInt();\r
345         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_INVALID_ARG, "ReplaceDateTimeStringWithInt failed.");\r
346 \r
347         // replace splApostrophe string with actual\r
348         r = __inputExpr.Replace(splApostrophe, "''");\r
349         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string Replace failed.");\r
350 \r
351         return r;\r
352 }\r
353 \r
354 //This function is to appened ESCAPE keyword for _ and % special characters in LIKE query.\r
355 \r
356 result\r
357 _ContentSearchImpl::AppendEscapeKeywordForLikeQuery(void) const\r
358 {\r
359         String  delim = L"'"; //Delimeters  is  ' .\r
360         result r = E_SUCCESS;\r
361         bool isCol = true;\r
362         bool isAppendEscape = false;\r
363         String token;\r
364         String tokenUpper;\r
365         String inputExpr = __inputExpr;\r
366 \r
367         // Create a StringTokenizer instance\r
368         StringTokenizer  strTok(inputExpr, delim);\r
369 \r
370         inputExpr.Clear();\r
371 \r
372         while (strTok.HasMoreTokens())\r
373         {\r
374                 r = strTok.GetNextToken(token);\r
375                 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "GetNextToken failed.");\r
376                 if (isCol) //column name\r
377                 {\r
378                         isCol = false;\r
379                         tokenUpper = token;\r
380                         tokenUpper.ToUpper();\r
381                         if (tokenUpper.Contains(" LIKE"))\r
382                         {\r
383                                 isAppendEscape = true;\r
384                         }\r
385                         else\r
386                         {\r
387                                 isAppendEscape = false;\r
388                         }\r
389                         r = inputExpr.Append(token);\r
390                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");\r
391                 }\r
392                 else // value of the column\r
393                 {\r
394                         isCol = true;\r
395                         r = inputExpr.Append("'");\r
396                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");\r
397                         r = inputExpr.Append(token);\r
398                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");\r
399                         r = inputExpr.Append("'");\r
400                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");\r
401 \r
402                         if (isAppendEscape)\r
403                         {\r
404                                 if (token.Contains("\\_") || token.Contains("\\%"))\r
405                                 {\r
406                                         r = inputExpr.Append("ESCAPE'\\'  ");\r
407                                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");\r
408                                 }\r
409                         }\r
410                 }\r
411         }\r
412 \r
413         __inputExpr.Clear();\r
414         r = __inputExpr.Insert(inputExpr, 0);\r
415         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string insert failed.");\r
416 \r
417         return r;\r
418 }\r
419 \r
420 //This function is to replace DateTime value(osp datetime type is string) which is string with int.(SLP dateTime column type is int)\r
421 \r
422 result\r
423 _ContentSearchImpl::ReplaceDateTimeStringWithInt(void) const\r
424 {\r
425         String  delim = L"'"; //Delimeters  is  ' .\r
426         result r = E_SUCCESS;\r
427         bool isCol = true;\r
428         bool isConvertReq = false;\r
429         bool isBetweenExistsInDateTimeQuery = false;\r
430         String token;\r
431         String tokenUpper;\r
432         String inputExpr = __inputExpr;\r
433 \r
434         if(!inputExpr.Contains("MEDIA_ADDED_TIME"))\r
435         {\r
436                 return r;\r
437         }\r
438 \r
439         // Create a StringTokenizer instance\r
440         StringTokenizer  strTok(inputExpr, delim);\r
441 \r
442         inputExpr.Clear();\r
443 \r
444         while (strTok.HasMoreTokens())\r
445         {\r
446                 r = strTok.GetNextToken(token);\r
447                 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "GetNextToken failed.");\r
448                 if (isCol) //column name\r
449                 {\r
450                         isCol = false;\r
451                         tokenUpper = token;\r
452                         tokenUpper.ToUpper();\r
453                         if(isBetweenExistsInDateTimeQuery)\r
454                         {\r
455                                 isBetweenExistsInDateTimeQuery = false;\r
456                                 isConvertReq = true;\r
457                         }\r
458                         else\r
459                         {\r
460                                 if (tokenUpper.Contains("MEDIA_ADDED_TIME"))\r
461                                 {\r
462                                         if (tokenUpper.Contains("BETWEEN"))\r
463                                         {\r
464                                                 isBetweenExistsInDateTimeQuery = true;\r
465                                         }\r
466                                         isConvertReq = true;\r
467                                 }\r
468                                 else\r
469                                 {\r
470                                         isConvertReq = false;\r
471                                 }\r
472                         }\r
473 \r
474                         r = inputExpr.Append(token);\r
475                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string append failed.");\r
476                 }\r
477                 else // value of the column\r
478                 {\r
479                         isCol = true;\r
480                         r = inputExpr.Append("'");\r
481                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string append failed.");\r
482 \r
483                         if (isConvertReq)\r
484                         {\r
485                                 Tizen::Base::DateTime dt;\r
486                                 r = Tizen::Base::DateTime::Parse(token, dt);\r
487                                 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to parse DateTime.");\r
488 \r
489                                 int year = dt.GetYear();\r
490                                 int month = dt.GetMonth(); \r
491                                 int day = dt.GetDay();\r
492                                 int hour = dt.GetHour();\r
493                                 int minute = dt.GetMinute(); \r
494                                 int second = dt.GetSecond();\r
495                                 \r
496                                 time_t rawTime;\r
497                                 struct tm* timeInfo;\r
498 \r
499                                 time(&rawTime);\r
500                                 timeInfo = localtime(&rawTime);\r
501                                 timeInfo->tm_year = year - 1900;\r
502                                 timeInfo->tm_mon = month - 1;\r
503                                 timeInfo->tm_mday = day;\r
504                                 timeInfo->tm_hour = hour;\r
505                                 timeInfo->tm_min = minute;\r
506                                 timeInfo->tm_sec = second;\r
507 \r
508                                 time_t seconds = mktime(timeInfo);\r
509                                 SysTryReturnResult(NID_CNT, seconds != -1, E_INVALID_ARG, "Failed to convert DateTime to broken-down time.");\r
510 \r
511                                 long long ticksInSeconds = (long long)seconds;\r
512 \r
513                                 r = inputExpr.Append(ticksInSeconds);\r
514                                 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string append failed.");\r
515                         }\r
516                         else\r
517                         {\r
518                                 r = inputExpr.Append(token);\r
519                                 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string append failed.");\r
520                         }\r
521 \r
522                         r = inputExpr.Append("'");\r
523                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string append failed.");\r
524                 }\r
525         }\r
526 \r
527         __inputExpr.Clear();\r
528         r = __inputExpr.Insert(inputExpr, 0);\r
529         SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "string insert failed.");\r
530 \r
531         return r;\r
532 }\r
533 \r
534 // CONTENT_TYPE_OTHER and CONTENT_TYPE_IMAGE (0 - 13 ) are valid columns\r
535 // CONTENT_TYPE_VIDEO  (0 - 16 ) are valid columns\r
536 // CONTENT_TYPE_ALL and  CONTENT_TYPE_VIDEO (0 - 18 ) are valid columns\r
537 // This functions checks for invalid column in the given input string (only allowed columns should be used by content type other wise\r
538 // E_INVALID_ARG is returned)\r
539 // StringTokenizer is used to parse input expression, by using delimater "'", to differentiate column and value.\r
540 // As values may also contain column names\r
541 // Ex: 1. where author = syam_author_01 2. where album = jalsa_album_name_01.\r
542 \r
543 result\r
544 _ContentSearchImpl::CheckInvalidColumnInQuery(void) const\r
545 {\r
546         result r = E_SUCCESS;\r
547         int tokenNo = 0;\r
548         String  delim = L"'"; //Delimeters  is  ' .\r
549          bool isColReplaceReq = true;\r
550         String token;\r
551         String inputExpr = __inputExpr;\r
552 \r
553         // Create a StringTokenizer instance\r
554         StringTokenizer  strTok(inputExpr, delim);\r
555 \r
556         inputExpr.Clear();\r
557 \r
558         while (strTok.HasMoreTokens())\r
559         {\r
560                 r = strTok.GetNextToken(token);\r
561                 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "strTok GetNextToken failed.");\r
562 \r
563                 SysLog(NID_CNT, "In CheckInvalidColumnInQuery token[%d] = %ls", ++tokenNo, token.GetPointer());\r
564 \r
565                 if (isColReplaceReq)\r
566                 {\r
567                         isColReplaceReq = false;\r
568                         r = inputExpr.Append(token);\r
569                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");\r
570                         token.ToUpper();\r
571                         switch (__contentType)\r
572                         {\r
573                         case CONTENT_TYPE_OTHER:\r
574                                 //fall through\r
575                         case CONTENT_TYPE_IMAGE:\r
576                                 if ((token.Contains("TITLE")) || (token.Contains("ARTIST")) || (token.Contains("GENRE")))\r
577                                 {\r
578                                         SysLog(NID_CNT, "Title or Artist or Genre are not valid cloumns for this content type");\r
579                                         return E_INVALID_ARG;\r
580                                 }\r
581                                 //fall through\r
582                         case CONTENT_TYPE_VIDEO:\r
583                                 if ((token.Contains("COMPOSER")) || (token.Contains("ALBUM")))\r
584                                 {\r
585                                         SysLog(NID_CNT, "Composer or Album  are not valid cloumns for this content type");\r
586                                         return E_INVALID_ARG;\r
587                                 }\r
588                                 break;\r
589                         default:\r
590                                 break;\r
591                         }\r
592                 }\r
593                 else\r
594                 {\r
595                         isColReplaceReq = true;\r
596                         r = inputExpr.Append("'");\r
597                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");\r
598                         r = inputExpr.Append(token);\r
599                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");\r
600                         r = inputExpr.Append("'");\r
601                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");\r
602                 }\r
603         }\r
604         return r;\r
605 }\r
606 \r
607 // It replaces osp column name with slp column name.\r
608 // StringTokenizer is used to parse input expression, by using delimater "'", to differentiate column and value.\r
609 // As values may also contain column names\r
610 // Only column names are replaced but not values(values may contain column names)\r
611 // Ex: 1. where author = syam_author_01 2. where album = jalsa_album_name_01.\r
612 \r
613 result\r
614 _ContentSearchImpl::ReplaceString(String ospColumnName, String slpColumnName) const\r
615 {\r
616         String  delim = L"'"; //Delimeters  is  ' .\r
617         result r = E_SUCCESS;\r
618          bool isColReplaceReq = true;\r
619         String token;\r
620         String inputExpr = __inputExpr;\r
621 \r
622         // Create a StringTokenizer instance\r
623         StringTokenizer  strTok(inputExpr, delim);\r
624 \r
625         inputExpr.Clear();\r
626 \r
627         while (strTok.HasMoreTokens())\r
628         {\r
629                 r = strTok.GetNextToken(token);         // Osp, StringTokenizer, Sample, code\r
630                 SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string GetNextToken() failed.");\r
631                 if (isColReplaceReq) //column name\r
632                 {\r
633                         isColReplaceReq = false;\r
634                         r = token.Replace(ospColumnName, slpColumnName);\r
635                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string replace() failed.");\r
636                         r = inputExpr.Append(token);\r
637                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");\r
638                 }\r
639                 else // value of the column\r
640                 {\r
641                         isColReplaceReq = true;\r
642                         r = inputExpr.Append("'");\r
643                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");\r
644                         r = inputExpr.Append(token);\r
645                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");\r
646                         r = inputExpr.Append("'");\r
647                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string append failed.");\r
648                 }\r
649         }\r
650         __inputExpr.Clear();\r
651         r = __inputExpr.Insert(inputExpr, 0);\r
652         SysTryReturnResult(NID_CNT, r == E_SUCCESS, E_SYSTEM, "string insert() failed.");\r
653 \r
654         return r;\r
655 }\r
656 \r
657 //Retuns list of search result for the given expression and content type.\r
658 Collection::IList*\r
659 _ContentSearchImpl::SearchN(int pageNo, int countPerPage, int& totalPageCount, int& totalCount, const String& whereExpr, const String& sortColumn, SortOrder sortOrder) const\r
660 {\r
661         SysLog(NID_CNT, "pageNo = %d, countPerPage = %d, whereExpr = %ls", pageNo, countPerPage, whereExpr.GetPointer());\r
662 \r
663         ClearLastResult();\r
664 \r
665         result r        = E_SUCCESS;\r
666         int ret         = MEDIA_CONTENT_ERROR_NONE;\r
667         int offset      = 0;\r
668 \r
669         __inputColumnName.Clear();\r
670         __inputExpr.Clear();\r
671         __inputColumnName = sortColumn;\r
672         __inputSortOrder = sortOrder;\r
673         totalPageCount = 0;\r
674         totalCount = 0;\r
675 \r
676         if (!whereExpr.IsEmpty()) // copy whereExpr if not empty to class variable __inputExpr\r
677         {\r
678                 //r = __inputExpr.Format(QUERY_LENGTH, L"%ls", whereExpr.GetPointer());\r
679                 r = __inputExpr.Append(whereExpr);\r
680                 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[%s] __inputExpr.Append Failed as whereExpr is not empty.", GetErrorMessage(r));\r
681 \r
682                 r = ReplaceOspColumnNameWithSlp();\r
683                 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[%s] ReplaceOspColumnNameWithSlp for InputExpr Failed.", GetErrorMessage(r));\r
684 \r
685                 SysLog(NID_CNT, "After replace __inputExpr = %ls", __inputExpr.GetPointer());\r
686         }\r
687         if ((__inputColumnName.IsEmpty()) && ((__inputSortOrder == SORT_ORDER_ASCENDING) || (__inputSortOrder == SORT_ORDER_DESCENDING)))\r
688         {\r
689                 SysLog(NID_CNT, "sort column name is empty and sort oder is not none. so,E_INVALID_ARG occured.");\r
690                 SetLastResult(E_INVALID_ARG);\r
691                 return null;\r
692         }\r
693         else\r
694         {\r
695                 std::unique_ptr<ArrayList, AllElementsDeleter> pFinalOutList(new (std::nothrow) ArrayList());\r
696                 SysTryReturn(NID_CNT, pFinalOutList.get() != null, NULL, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to construct ArrayList.");\r
697 \r
698                 r = pFinalOutList->Construct();\r
699                 SysTryReturn(NID_CNT, !IsFailed(r), NULL, r, "[%s] Failed to construct ArrayList.", GetErrorMessage(r));\r
700 \r
701                 __pFinalOutList = std::move(pFinalOutList);\r
702 \r
703                 r = CreateQueryFilter(true);\r
704                 SysTryReturn(NID_CNT, !IsFailed(r), NULL, r, "[%s] Failed to perform CreateQueryFilter operation.", GetErrorMessage(r));\r
705 \r
706                 ret = media_info_get_media_count_from_db(*(__pFilterHandle.get()), &totalCount);\r
707                 r = MapCoreErrorToNativeResult(ret);\r
708                 SysTryReturn(NID_CNT, r == E_SUCCESS , NULL, r, "[%s] Failed to perform media_info_get_media_count_from_db operation.", GetErrorMessage(r));\r
709 \r
710                 SysLog(NID_CNT, "totalCount is [%d] for media_info_get_media_count_from_db", totalCount);\r
711 \r
712                 if (totalCount > 0)\r
713                 {\r
714                         if ((totalCount % countPerPage) == 0)\r
715                         {\r
716                                 totalPageCount = totalCount / countPerPage;\r
717                         }\r
718                         else\r
719                         {\r
720                                 totalPageCount = (totalCount / countPerPage) + 1;\r
721                         }\r
722 \r
723                         SysTryReturn(NID_CNT, ((pageNo >= 1) && (pageNo <= totalPageCount)) , NULL, E_INVALID_ARG, "[E_INVALID_ARG] (pageNo < 1) || (pageNo > totalPageCount).");\r
724 \r
725                         offset = (pageNo * countPerPage) - countPerPage;\r
726 \r
727                         SysLog(NID_CNT, " SearchN   totalCount [%d] totalPageCount[%d] __countPerPage[%d] __pageNo[%d] offset[%d]",\r
728                                         totalCount, totalPageCount, countPerPage, pageNo, offset);\r
729 \r
730                         ret = media_filter_set_offset(*(__pFilterHandle.get()), offset, countPerPage);\r
731                         r = MapCoreErrorToNativeResult(ret);\r
732                         SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r,\r
733                         "[%s] Failed to perform media_filter_set_offset operation.", GetErrorMessage(r));\r
734 \r
735                         r = ExecuteAndFillFinalOutList();\r
736                         SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, E_SYSTEM, "[E_SYSTEM] ExecuteAndFillFinalOutList Failed.");\r
737                 }\r
738                 else if (pageNo > 1)\r
739                 {\r
740                         r = E_INVALID_ARG;\r
741                         SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[E_INVALID_ARG] (pageNo > 1) and  (totalcount = 0).");\r
742                 }\r
743         }\r
744         SetLastResult(r);\r
745         return __pFinalOutList.release();\r
746 }\r
747 \r
748 // Fills final result list\r
749 result\r
750 _ContentSearchImpl::ExecuteAndFillFinalOutList(void) const\r
751 {\r
752         SysLog(NID_CNT, "Enter\n");\r
753 \r
754         int ret                                         = MEDIA_CONTENT_ERROR_NONE;\r
755         result r                                        = E_SUCCESS;\r
756 \r
757         std::unique_ptr<GList, SearchGListDeleter> pItemList;\r
758         GList* pTemp = NULL;\r
759         std::unique_ptr<media_info_s, SearchMediaHandleDeleter> pMediaHandle;\r
760 \r
761         ContentInfo::_ContentData* pContentData = null;\r
762         ImageContentInfo::_ImageContentData* pImageContentData = null;\r
763         AudioContentInfo::_AudioContentData* pAudioContentData = null;\r
764         VideoContentInfo::_VideoContentData* pVideoContentData = null;\r
765 \r
766         std::unique_ptr<ImageContentInfo> pImageContentInfo;\r
767         std::unique_ptr<AudioContentInfo> pAudioContentInfo;\r
768         std::unique_ptr<VideoContentInfo> pVideoContentInfo;\r
769         std::unique_ptr<OtherContentInfo> pOtherContentInfo;\r
770 \r
771         std::unique_ptr<ContentSearchResult> pContentSearchResult;\r
772 \r
773         pTemp = pItemList.get();\r
774 \r
775         ret = media_info_foreach_media_from_db(*(__pFilterHandle.get()), MediaItemCb, &pTemp);\r
776         r = MapCoreErrorToNativeResult(ret);\r
777         SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_info_foreach_media_from_db operation.");\r
778 \r
779         SysTryReturnResult(NID_CNT, pTemp != NULL, r, "media_info_foreach_media_from_db pTemp is null.");\r
780 \r
781         media_content_type_e mediaType = MEDIA_CONTENT_TYPE_OTHERS;\r
782 \r
783         for (int idx = 0; idx < (int)g_list_length(pTemp); idx++)\r
784         {\r
785                 pMediaHandle.reset(static_cast<media_info_h>(g_list_nth_data(pTemp, idx)));\r
786 \r
787                 ret = media_info_get_media_type(pMediaHandle.get(), &mediaType);\r
788                 r = MapCoreErrorToNativeResult(ret);\r
789                 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_info_get_media_type.");\r
790 \r
791                 switch (mediaType)\r
792                 {\r
793                 case MEDIA_CONTENT_TYPE_OTHERS:\r
794                         //memset(&contentData, 0, sizeof(contentData));\r
795 \r
796                         pOtherContentInfo = std::unique_ptr<OtherContentInfo>(new (std::nothrow) OtherContentInfo);\r
797                         SysTryReturnResult(NID_CNT, pOtherContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pOtherContentInfo.");\r
798 \r
799                         pContentData = pOtherContentInfo->GetContentData();\r
800                         SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");\r
801 \r
802                         r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);\r
803                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");\r
804 \r
805 \r
806                         pContentSearchResult = std::unique_ptr<ContentSearchResult>(new (std::nothrow) ContentSearchResult);\r
807                         SysTryReturnResult(NID_CNT, pContentSearchResult.get() != null, E_OUT_OF_MEMORY, "Failed to create pContentSearchResult.");\r
808 \r
809                         pContentSearchResult->SetContentType(CONTENT_TYPE_OTHER);\r
810                         pContentSearchResult->SetContentInfo(pOtherContentInfo.release());\r
811 \r
812                         // Shallow copy, adds just the pointer: not the element\r
813 \r
814                         r = __pFinalOutList->Add(*(pContentSearchResult.release()));\r
815                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");\r
816 \r
817                         //pOtherContentInfo = null;\r
818                         //pContentSearchResult = null;\r
819                         //_ContentUtility::DeleteContentData(&contentData);\r
820                         break;\r
821                 case MEDIA_CONTENT_TYPE_IMAGE:\r
822                         //memset(&contentData, 0, sizeof(contentData));\r
823                         //memset(&imageContentData, 0, sizeof(imageContentData));\r
824 \r
825                         pImageContentInfo = std::unique_ptr<ImageContentInfo>(new (std::nothrow) ImageContentInfo);\r
826                         SysTryReturnResult(NID_CNT, pImageContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pImageContentInfo.");\r
827 \r
828                         pContentData = pImageContentInfo->GetContentData();\r
829                         SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");\r
830 \r
831                         pImageContentData = pImageContentInfo->GetImageContentData();\r
832                         SysTryReturnResult(NID_CNT, pImageContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");\r
833 \r
834                         r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);\r
835                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");\r
836 \r
837                         r = _ContentUtility::FillImageContentData(pMediaHandle.get(), pImageContentData);\r
838                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform GetDataFromImageTable operation.");\r
839 \r
840                         pContentSearchResult = std::unique_ptr<ContentSearchResult>(new (std::nothrow) ContentSearchResult);\r
841                         SysTryReturnResult(NID_CNT, pContentSearchResult.get() != null, E_OUT_OF_MEMORY, "Failed to create pContentSearchResult.");\r
842 \r
843                         pContentSearchResult->SetContentType(CONTENT_TYPE_IMAGE);\r
844                         pContentSearchResult->SetContentInfo(pImageContentInfo.release());\r
845 \r
846                         // Shallow copy, adds just the pointer: not the element\r
847 \r
848                         r = __pFinalOutList->Add(*(pContentSearchResult.release()));\r
849                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");\r
850                         //pImageContentInfo = null;\r
851                         //pContentSearchResult = null;\r
852                         //_ContentUtility::DeleteContentData(&contentData);\r
853                         break;\r
854                 case MEDIA_CONTENT_TYPE_MUSIC:\r
855                         //fall through\r
856                 case MEDIA_CONTENT_TYPE_SOUND:\r
857                         //memset(&contentData, 0, sizeof(contentData));\r
858                         //memset(&audioContentData, 0, sizeof(audioContentData));\r
859 \r
860                         pAudioContentInfo = std::unique_ptr<AudioContentInfo>(new (std::nothrow) AudioContentInfo);\r
861                         SysTryReturnResult(NID_CNT, pAudioContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pAudioContentInfo.");\r
862 \r
863                         pContentData = pAudioContentInfo->GetContentData();\r
864                         SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");\r
865 \r
866                         pAudioContentData = pAudioContentInfo->GetAudioContentData();\r
867                         SysTryReturnResult(NID_CNT, pAudioContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");\r
868 \r
869                         r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);\r
870                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");\r
871 \r
872                         r = _ContentUtility::FillAudioContentData(pMediaHandle.get(), pAudioContentData);\r
873                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillAudioContentData operation.");\r
874 \r
875                         pContentSearchResult = std::unique_ptr<ContentSearchResult>(new (std::nothrow) ContentSearchResult);\r
876                         SysTryReturnResult(NID_CNT, pContentSearchResult.get() != null, E_OUT_OF_MEMORY, "Failed to create pContentSearchResult.");\r
877 \r
878                         pContentSearchResult->SetContentType(CONTENT_TYPE_AUDIO);\r
879                         pContentSearchResult->SetContentInfo(pAudioContentInfo.release());\r
880 \r
881                         // Shallow copy, adds just the pointer: not the element\r
882 \r
883                         r = __pFinalOutList->Add(*(pContentSearchResult.release()));\r
884                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");\r
885 \r
886                         //pAudioContentInfo = null;\r
887                         //pContentSearchResult = null;\r
888                         //_ContentUtility::DeleteContentData(&contentData);\r
889                         //_ContentUtility::DeleteAudioContentData(&audioContentData);\r
890                         break;\r
891                 case MEDIA_CONTENT_TYPE_VIDEO:\r
892                         //memset(&contentData, 0, sizeof(contentData));\r
893                         //memset(&videoContentData, 0, sizeof(videoContentData));\r
894 \r
895                         pVideoContentInfo = std::unique_ptr<VideoContentInfo>(new (std::nothrow) VideoContentInfo);\r
896                         SysTryReturnResult(NID_CNT, pVideoContentInfo.get() != null, E_OUT_OF_MEMORY, "Failed to create pVideoContentInfo.");\r
897 \r
898                         pContentData = pVideoContentInfo->GetContentData();\r
899                         SysTryReturnResult(NID_CNT, pContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");\r
900 \r
901                         pVideoContentData = pVideoContentInfo->GetVideoContentData();\r
902                         SysTryReturnResult(NID_CNT, pVideoContentData != null, E_OUT_OF_MEMORY, "The memory is insufficient.");\r
903 \r
904                         r = _ContentUtility::FillContentData(pMediaHandle.get(), pContentData);\r
905                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillContentData operation.");\r
906 \r
907                         r = _ContentUtility::FillVideoContentData(pMediaHandle.get(), pVideoContentData);\r
908                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform FillVideoContentData operation.");\r
909 \r
910                         pContentSearchResult = std::unique_ptr<ContentSearchResult>(new (std::nothrow) ContentSearchResult);\r
911                         SysTryReturnResult(NID_CNT, pContentSearchResult.get() != null, E_OUT_OF_MEMORY, "Failed to create pContentSearchResult.");\r
912 \r
913                         pContentSearchResult->SetContentType(CONTENT_TYPE_VIDEO);\r
914                         pContentSearchResult->SetContentInfo(pVideoContentInfo.release());\r
915 \r
916                         // Shallow copy, adds just the pointer: not the element\r
917 \r
918                         r = __pFinalOutList->Add(*(pContentSearchResult.release()));\r
919                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform Add operation for ArrayList.");\r
920 \r
921                         //pVideoContentInfo = null;\r
922                         //pContentSearchResult = null;\r
923                         //_ContentUtility::DeleteContentData(&contentData);\r
924                         //_ContentUtility::DeleteVideoContentData(&videoContentData);\r
925                         break;\r
926                 default:\r
927                         break;\r
928                 }\r
929         }\r
930         return r;\r
931 }\r
932 \r
933 // returns  given column value list in the requested order\r
934 Collection::IList*\r
935 _ContentSearchImpl::GetValueListN(const String& sortColumn, SortOrder sortOrder)\r
936 {\r
937         SysLog(NID_CNT, "inputColumn = %ls", sortColumn.GetPointer());\r
938         ClearLastResult();\r
939 \r
940         result r        = E_SUCCESS;\r
941         int colIndex    = 0;\r
942         int maxCols     = 0;\r
943 \r
944         __inputColumnName.Clear();\r
945         __inputExpr.Clear();\r
946 \r
947         __inputColumnName = sortColumn;\r
948         __inputSortOrder  = sortOrder;\r
949 \r
950         String          ospColumnName(L"");\r
951         String          slpColumnName(L"");\r
952 \r
953         String          columnName(__inputColumnName);\r
954 \r
955         if ((__inputColumnName.IsEmpty()) && ((__inputSortOrder == SORT_ORDER_ASCENDING) || (__inputSortOrder == SORT_ORDER_DESCENDING)))\r
956         {\r
957                 SysLog(NID_CNT, "sort column name is empty and sort oder is not none. so,E_INVALID_ARG occured.");\r
958                 SetLastResult(E_INVALID_ARG);\r
959                 return null;\r
960         }\r
961         else\r
962         {\r
963                 std::unique_ptr<ArrayList, AllElementsDeleter> pFinalOutList(new (std::nothrow) ArrayList());\r
964                 SysTryReturn(NID_CNT, pFinalOutList.get() != null, NULL, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to construct ArrayList.");\r
965 \r
966                 r = pFinalOutList->Construct();\r
967                 SysTryReturn(NID_CNT, !IsFailed(r), NULL, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to construct ArrayList.");\r
968 \r
969                 __pFinalOutList = std::move(pFinalOutList);\r
970 \r
971                 switch (__contentType)\r
972                 {\r
973                 case CONTENT_TYPE_OTHER:\r
974                         //fall through\r
975                 case CONTENT_TYPE_IMAGE:\r
976                         maxCols = MAX_QUERY_COLUMNS_FOR_IMAGE_OTHERS;\r
977                         break;\r
978                 case CONTENT_TYPE_VIDEO:\r
979                         maxCols = MAX_QUERY_COLUMNS_FOR_VIDEO;\r
980                         break;\r
981                 case CONTENT_TYPE_AUDIO:\r
982                         //fall through\r
983                 case CONTENT_TYPE_ALL:\r
984                         maxCols = MAX_QUERY_COLUMNS;\r
985                         break;\r
986                 default:\r
987                         break;\r
988                 }\r
989 \r
990                 for (colIndex = 0; colIndex < maxCols; colIndex++)\r
991                 {\r
992                         ospColumnName.Clear();\r
993                         slpColumnName.Clear();\r
994 \r
995                         ospColumnName = dbfieldinfo[colIndex].dbFieldOspName ;\r
996                         slpColumnName = dbfieldinfo[colIndex].dbFieldSlpName ;\r
997 \r
998                         ospColumnName.ToUpper();\r
999                         columnName.ToUpper();\r
1000                         if (columnName == ospColumnName)\r
1001                         {\r
1002                                 r = FillColumnsList(colIndex);\r
1003                                 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[%s] FillColumnsList Failed.", GetErrorMessage(r));\r
1004                                 break;\r
1005                         }\r
1006                 }\r
1007                 if (colIndex == maxCols)\r
1008                 {\r
1009                         r = E_INVALID_ARG;\r
1010                         SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[E_INVALID_ARG] invalid column.");\r
1011                 }\r
1012         }\r
1013         SetLastResult(r);\r
1014         return __pFinalOutList.release();\r
1015 }\r
1016 \r
1017 // returns  given column value list in the requested order\r
1018 Collection::IList*\r
1019 _ContentSearchImpl::GetValueListN(int pageNo, int countPerPage, int& totalPageCount, int& totalCount, const String& sortColumn, SortOrder sortOrder) const\r
1020 {\r
1021         SysLog(NID_CNT, "pageNo = %d, countPerPage = %d, inputColumn = %ls", pageNo, countPerPage, sortColumn.GetPointer());\r
1022 \r
1023         ClearLastResult();\r
1024 \r
1025         result r        = E_SUCCESS;\r
1026         int colIndex    = 0;\r
1027         int maxCols     = 0;\r
1028 \r
1029         __inputColumnName.Clear();\r
1030         __inputExpr.Clear();\r
1031 \r
1032         __inputColumnName = sortColumn;\r
1033         __inputSortOrder  = sortOrder;\r
1034 \r
1035         String          ospColumnName(L"");\r
1036         String          slpColumnName(L"");\r
1037 \r
1038         String          columnName(__inputColumnName);\r
1039 \r
1040         if ((__inputColumnName.IsEmpty()) && ((__inputSortOrder == SORT_ORDER_ASCENDING) || (__inputSortOrder == SORT_ORDER_DESCENDING)))\r
1041         {\r
1042                 SysLog(NID_CNT, "sort column name is empty and sort oder is not none. so,E_INVALID_ARG occured.");\r
1043                 SetLastResult(E_INVALID_ARG);\r
1044                 return null;\r
1045         }\r
1046         else\r
1047         {\r
1048                 std::unique_ptr<ArrayList, AllElementsDeleter> pFinalOutList(new (std::nothrow) ArrayList());\r
1049                 SysTryReturn(NID_CNT, pFinalOutList.get() != null, NULL, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to construct ArrayList.");\r
1050 \r
1051                 r = pFinalOutList->Construct();\r
1052                 SysTryReturn(NID_CNT, !IsFailed(r), NULL, r, "[%s] Failed to construct ArrayList.", GetErrorMessage(r));\r
1053 \r
1054                 __pFinalOutList = std::move(pFinalOutList);\r
1055 \r
1056                 switch (__contentType)\r
1057                 {\r
1058                 case CONTENT_TYPE_OTHER:\r
1059                         //fall through\r
1060                 case CONTENT_TYPE_IMAGE:\r
1061                         maxCols = MAX_QUERY_COLUMNS_FOR_IMAGE_OTHERS;\r
1062                         break;\r
1063                 case CONTENT_TYPE_VIDEO:\r
1064                         maxCols = MAX_QUERY_COLUMNS_FOR_VIDEO;\r
1065                         break;\r
1066                 case CONTENT_TYPE_AUDIO:\r
1067                         //fall through\r
1068                 case CONTENT_TYPE_ALL:\r
1069                         maxCols = MAX_QUERY_COLUMNS;\r
1070                         break;\r
1071                 default:\r
1072                         break;\r
1073                 }\r
1074 \r
1075                 for (colIndex = 0; colIndex < maxCols; colIndex++)\r
1076                 {\r
1077                         ospColumnName.Clear();\r
1078                         slpColumnName.Clear();\r
1079 \r
1080                         ospColumnName = dbfieldinfo[colIndex].dbFieldOspName ;\r
1081                         slpColumnName = dbfieldinfo[colIndex].dbFieldSlpName ;\r
1082 \r
1083                         ospColumnName.ToUpper();\r
1084                         columnName.ToUpper();\r
1085                         if (columnName == ospColumnName)\r
1086                         {\r
1087                                 r = FillColumnsList(pageNo, countPerPage, totalPageCount, totalCount, colIndex);\r
1088                                 SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[%s] FillColumnsList Failed.", GetErrorMessage(r));\r
1089                                 break;\r
1090                         }\r
1091                 }\r
1092                 if (colIndex == maxCols)\r
1093                 {\r
1094                         r = E_INVALID_ARG;\r
1095                         SysTryReturn(NID_CNT, r == E_SUCCESS, NULL, r, "[E_INVALID_ARG] invalid column.");\r
1096                 }\r
1097         }\r
1098         SetLastResult(r);\r
1099         return __pFinalOutList.release();\r
1100 }\r
1101 \r
1102 // prepares query expression to be used in group api. colIndex is mapped to actual group value.\r
1103 media_group_e\r
1104 _ContentSearchImpl::GetIndexAndCreateQueryExp(int colIndex) const\r
1105 {\r
1106         media_group_e groupIndex = MEDIA_CONTENT_GROUP_DISPLAY_NAME;;\r
1107         switch (colIndex)\r
1108         {\r
1109         case 0://"ContentType", "MEDIA_TYPE"\r
1110                 groupIndex = MEDIA_CONTENT_GROUP_TYPE;\r
1111                 __inputExpr = "MEDIA_TYPE IS NOT NULL";\r
1112                 break;\r
1113         case 1://"ContentFileName", "MEDIA_DISPLAY_NAME"\r
1114                 groupIndex = MEDIA_CONTENT_GROUP_DISPLAY_NAME;\r
1115                 __inputExpr = "MEDIA_DISPLAY_NAME IS NOT NULL";\r
1116                 break;\r
1117         case 2://"ContentName", "MEDIA_CONTENT_NAME"\r
1118                 groupIndex = MEDIA_CONTENT_GROUP_CONTENT_NAME;\r
1119                 __inputExpr = "MEDIA_CONTENT_NAME IS NOT NULL";\r
1120                 break;\r
1121         case 3://"Category", "MEDIA_CATEGORY"\r
1122                 groupIndex = MEDIA_CONTENT_GROUP_CATEGORY;\r
1123                 __inputExpr = "MEDIA_CATEGORY IS NOT NULL";\r
1124                 break;\r
1125         case 4://"Author", "MEDIA_AUTHOR"\r
1126                 groupIndex = MEDIA_CONTENT_GROUP_AUTHOR;\r
1127                 __inputExpr = "MEDIA_AUTHOR IS NOT NULL";\r
1128                 break;\r
1129         case 5://"keyword", "MEDIA_KEYWORD"\r
1130                 groupIndex = MEDIA_CONTENT_GROUP_KEYWORD;\r
1131                 __inputExpr = "MEDIA_KEYWORD IS NOT NULL";\r
1132                 break;\r
1133         case 6://"Provider", "MEDIA_PROVIDER"\r
1134                 groupIndex = MEDIA_CONTENT_GROUP_PROVIDER;\r
1135                 __inputExpr = "MEDIA_PROVIDER IS NOT NULL";\r
1136                 break;\r
1137         case 7://"Rating", "MEDIA_AGE_RATING"\r
1138                 groupIndex = MEDIA_CONTENT_GROUP_AGE_RATING;\r
1139                 __inputExpr = "MEDIA_AGE_RATING IS NOT NULL";\r
1140                 break;\r
1141         case 8://"LocationTag", "MEDIA_LOCATION_TAG"\r
1142                 groupIndex = MEDIA_CONTENT_GROUP_LOCATION_TAG;\r
1143                 __inputExpr = "MEDIA_LOCATION_TAG IS NOT NULL";\r
1144                 break;\r
1145         case 9://"ContentSize", "MEDIA_SIZE"\r
1146                 groupIndex = MEDIA_CONTENT_GROUP_SIZE;\r
1147                 __inputExpr = "MEDIA_SIZE IS NOT NULL";\r
1148                 break;\r
1149         case 10://"DateTime", "MEDIA_ADDED_TIME"\r
1150                 groupIndex = MEDIA_CONTENT_GROUP_ADDED_TIME;\r
1151                 __inputExpr = "MEDIA_ADDED_TIME IS NOT NULL";\r
1152                 break;\r
1153         case 11://"Latitude", "MEDIA_LATITUDE"\r
1154                 groupIndex = MEDIA_CONTENT_GROUP_LATITUDE;\r
1155                 __inputExpr = "MEDIA_LATITUDE IS NOT NULL";\r
1156                 break;\r
1157         case 12://"Longitude", "MEDIA_LONGITUDE"\r
1158                 groupIndex = MEDIA_CONTENT_GROUP_LONGITUDE;\r
1159                 __inputExpr = "MEDIA_LONGITUDE IS NOT NULL";\r
1160                 break;\r
1161         case 13://"Altitude", "MEDIA_ALTITUDE"\r
1162                 groupIndex = MEDIA_CONTENT_GROUP_ALTITUDE;\r
1163                 __inputExpr = "MEDIA_ALTITUDE IS NOT NULL";\r
1164                 break;\r
1165         case 14://"Title", "MEDIA_TITLE"\r
1166                 groupIndex = MEDIA_CONTENT_GROUP_TITLE;\r
1167                 __inputExpr = "MEDIA_TITLE IS NOT NULL";\r
1168                 break;\r
1169         case 15://"Artist", "MEDIA_ARTIST"\r
1170                 groupIndex = MEDIA_CONTENT_GROUP_ARTIST;\r
1171                 __inputExpr = "MEDIA_ARTIST IS NOT NULL";\r
1172                 break;\r
1173         case 16://"Genre", "MEDIA_GENRE"\r
1174                 groupIndex = MEDIA_CONTENT_GROUP_GENRE;\r
1175                 __inputExpr = "MEDIA_GENRE IS NOT NULL";\r
1176                 break;\r
1177         case 17://"Year", "MEDIA_YEAR"\r
1178                 groupIndex = MEDIA_CONTENT_GROUP_YEAR;\r
1179                 __inputExpr = "MEDIA_YEAR IS NOT NULL";\r
1180                 break;\r
1181         case 18://"Composer", "MEDIA_COMPOSER"\r
1182                 groupIndex = MEDIA_CONTENT_GROUP_COMPOSER;\r
1183                 __inputExpr = "MEDIA_COMPOSER IS NOT NULL";\r
1184                 break;\r
1185         case 19://"Album", "MEDIA_ALBUM"\r
1186                 __inputExpr = "MEDIA_ALBUM IS NOT NULL";\r
1187                 break;\r
1188         default:\r
1189                 break;\r
1190         }\r
1191         return groupIndex;\r
1192 }\r
1193 \r
1194 // Fills  given column value list and destroys filter handle\r
1195 result\r
1196 _ContentSearchImpl::FillColumnsList(int colIndex) const\r
1197 {\r
1198         result r        = E_SUCCESS;\r
1199         int ret         = MEDIA_CONTENT_ERROR_NONE;\r
1200         int totalCount  = 0;\r
1201         media_group_e groupIndex = GetIndexAndCreateQueryExp(colIndex);\r
1202 \r
1203         r = CreateQueryFilter(true);\r
1204         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "CreateQueryFilter Failed.");\r
1205 \r
1206         if (colIndex == ALBUM_COLUMN_NUM)\r
1207         {\r
1208                 ret = media_album_get_album_count_from_db(*(__pFilterHandle.get()), &totalCount);\r
1209         }\r
1210         else\r
1211         {\r
1212                 ret = media_group_get_group_count_from_db(*(__pFilterHandle.get()), groupIndex, &totalCount);\r
1213         }\r
1214         r = MapCoreErrorToNativeResult(ret);\r
1215         SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "Failed to perform media_album/group count_from_db operation.");\r
1216 \r
1217         SysLog(NID_CNT, "totalCount = %d for media_album/group count_from_db", totalCount);\r
1218 \r
1219         if (totalCount > 0)\r
1220         {\r
1221                 if (colIndex == ALBUM_COLUMN_NUM)\r
1222                 {\r
1223                         r = ExecuteAndFillAlbumValues();\r
1224                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "ExecuteAndFillAlbumValues Failed.");\r
1225                 }\r
1226                 else\r
1227                 {\r
1228                         r = ExecuteAndFillGetValueListN(groupIndex, colIndex);\r
1229                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "ExecuteAndFillGetValueListN Failed.");\r
1230                 }\r
1231         }\r
1232         return r;\r
1233 }\r
1234 \r
1235 // prepares input expression to be sent for create filter and fills  given column value list\r
1236 result\r
1237 _ContentSearchImpl::FillColumnsList(int pageNo, int countPerPage, int& totalPageCount, int& totalCount, int colIndex) const\r
1238 {\r
1239         result r        = E_SUCCESS;\r
1240         int ret         = MEDIA_CONTENT_ERROR_NONE;\r
1241         int offset      = 0;\r
1242         totalPageCount = 0;\r
1243         totalCount = 0;\r
1244         media_group_e groupIndex = GetIndexAndCreateQueryExp(colIndex);\r
1245 \r
1246         r = CreateQueryFilter(true);\r
1247         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "CreateQueryFilter Failed.");\r
1248 \r
1249         if (colIndex == ALBUM_COLUMN_NUM)\r
1250         {\r
1251                 ret = media_album_get_album_count_from_db(*(__pFilterHandle.get()), &totalCount);\r
1252         }\r
1253         else\r
1254         {\r
1255                 ret = media_group_get_group_count_from_db(*(__pFilterHandle.get()), groupIndex, &totalCount);\r
1256         }\r
1257         r = MapCoreErrorToNativeResult(ret);\r
1258         SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "Failed to perform media_album/group count_from_db operation.");\r
1259 \r
1260         SysLog(NID_CNT, "totalCount = %d for media_album/group count_from_db", totalCount);\r
1261 \r
1262         if (totalCount > 0)\r
1263         {\r
1264                 if ((totalCount % countPerPage) == 0)\r
1265                 {\r
1266                         totalPageCount = totalCount / countPerPage;\r
1267                 }\r
1268                 else\r
1269                 {\r
1270                         totalPageCount = (totalCount / countPerPage) + 1;\r
1271                 }\r
1272 \r
1273                 if ((pageNo < 1) || (pageNo > totalPageCount))\r
1274                 {\r
1275                         r = E_INVALID_ARG;\r
1276                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "(pageNo < 1) || (pageNo > totalPageCount).");\r
1277                 }\r
1278 \r
1279                 offset = (pageNo * countPerPage) - countPerPage;\r
1280 \r
1281                 SysLog(NID_CNT, "GetValueListN totalCount [%d] totalPageCount[%d] __countPerPage[%d] __pageNo[%d] offset[%d]",\r
1282                                 totalCount, totalPageCount, countPerPage, pageNo, offset);\r
1283 \r
1284                 ret = media_filter_set_offset(*(__pFilterHandle.get()),offset,countPerPage);\r
1285                 r = MapCoreErrorToNativeResult(ret);\r
1286                 SysTryReturnResult(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, r, "failed to perform media_filter_set_offset operation.");\r
1287 \r
1288                 if (colIndex == ALBUM_COLUMN_NUM)\r
1289                 {\r
1290                         r = ExecuteAndFillAlbumValues();\r
1291                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "ExecuteAndFillAlbumValues Failed.");\r
1292                 }\r
1293                 else\r
1294                 {\r
1295                         r = ExecuteAndFillGetValueListN(groupIndex, colIndex);\r
1296                         SysTryReturnResult(NID_CNT, !IsFailed(r), r, "ExecuteAndFillGetValueListN Failed.");\r
1297                 }\r
1298 \r
1299         }\r
1300         else if (pageNo > 1)\r
1301         {\r
1302                 r = E_INVALID_ARG;\r
1303                 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "(pageNo > 1) and  (totalcount = 0).");\r
1304         }\r
1305 \r
1306         return r;\r
1307 }\r
1308 \r
1309 //  fills  given column value list for GetValuelistN api\r
1310 result\r
1311 _ContentSearchImpl::ExecuteAndFillGetValueListN(media_group_e groupIndex, int colIndex) const\r
1312 {\r
1313         SysLog(NID_CNT, "Enter\n");\r
1314 \r
1315         int ret                     = MEDIA_CONTENT_ERROR_NONE;\r
1316         result r                    = E_SUCCESS;\r
1317         result res                  = E_SUCCESS;\r
1318         std::unique_ptr<GList, SearchGListDeleter> pItemList;\r
1319         GList* pTemp = NULL;\r
1320 \r
1321         std::unique_ptr<Object> pValue;\r
1322 \r
1323         DateTime dateTime;\r
1324 \r
1325         long long contentSize = 0;\r
1326         long long addedTime     = 0;\r
1327 \r
1328         double dVal     = 0;\r
1329         char *pColumnVal = null;\r
1330         int contentType = 0;\r
1331 \r
1332         pTemp = pItemList.get();\r
1333 \r
1334         ret = media_group_foreach_group_from_db(*(__pFilterHandle.get()), groupIndex, GroupItemCb, &pTemp);\r
1335         r = MapCoreErrorToNativeResult(ret);\r
1336         SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_group_foreach_group_from_db operation.");\r
1337 \r
1338         SysTryReturnResult(NID_CNT, pTemp != NULL, r, "media_info_foreach_media_from_db pTemp is null.");\r
1339 \r
1340         for (int idx = 0; idx < (int)g_list_length(pTemp); idx++)\r
1341         {\r
1342                 SysLog(NID_CNT, "idx = %d and (int)g_list_length(pItemList) = %d", idx, (int)g_list_length(pTemp));\r
1343 \r
1344                 pColumnVal = (char *)g_list_nth_data(pTemp, idx);\r
1345 \r
1346                 String strColVal(pColumnVal);\r
1347 \r
1348                 _ContentUtility::DoSafeFree(pColumnVal);\r
1349 \r
1350                 SysLog(NID_CNT, "pColumnVal = %ls", strColVal.GetPointer());\r
1351 \r
1352                 switch (colIndex)\r
1353                 {\r
1354                 case 0://"ContentType", "MEDIA_TYPE"\r
1355                         if ((strColVal.CompareTo(L"Unknown") != 0) && (!strColVal.IsEmpty()))\r
1356                         {\r
1357                                 res = Integer::Parse(strColVal, contentType);\r
1358                                 SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] Integer parse failed.", GetErrorMessage(res));\r
1359                         }\r
1360                         switch ((media_content_type_e)contentType)\r
1361                         {\r
1362                         case MEDIA_CONTENT_TYPE_OTHERS:\r
1363                                 pValue.reset(new (std::nothrow) String(CONTENT_TYPE_OTHER));\r
1364                                 SysLog(NID_CNT, "mediaType = CONTENT_TYPE_OTHER");\r
1365                                 break;\r
1366                         case MEDIA_CONTENT_TYPE_IMAGE:\r
1367                                 pValue.reset(new (std::nothrow) String(CONTENT_TYPE_IMAGE));\r
1368                                 SysLog(NID_CNT, "mediaType = CONTENT_TYPE_IMAGE");\r
1369                                 break;\r
1370                         case MEDIA_CONTENT_TYPE_SOUND:\r
1371                                 //fall through\r
1372                         case MEDIA_CONTENT_TYPE_MUSIC:\r
1373                                 pValue.reset(new (std::nothrow) String(CONTENT_TYPE_AUDIO));\r
1374                                 SysLog(NID_CNT, "mediaType = CONTENT_TYPE_AUDIO");\r
1375                                 break;\r
1376                         case MEDIA_CONTENT_TYPE_VIDEO:\r
1377                                 pValue.reset(new (std::nothrow) String(CONTENT_TYPE_VIDEO));\r
1378                                 SysLog(NID_CNT, "mediaType = CONTENT_TYPE_VIDEO");\r
1379                                 break;\r
1380                         default:\r
1381                                 break;\r
1382                         }\r
1383                         break;\r
1384                 case 1://"ContentFileName", "MEDIA_DISPLAY_NAME"\r
1385                 //fall through\r
1386                 case 2://"ContentName", "MEDIA_CONTENT_NAME"\r
1387                 //fall through\r
1388                 case 3://"Category", "MEDIA_CATEGORY"\r
1389                 //fall through\r
1390                 case 4://"Author", "MEDIA_AUTHOR"\r
1391                 //fall through\r
1392                 case 5://"keyword", "MEDIA_KEYWORD"\r
1393                 //fall through\r
1394                 case 6://"Provider", "MEDIA_PROVIDER"\r
1395                 //fall through\r
1396                 case 7://"Rating", "MEDIA_AGE_RATING"\r
1397                 //fall through\r
1398                 case 8://"LocationTag", "MEDIA_LOCATION_TAG"\r
1399                 //fall through\r
1400                 case 14://"Title", "MEDIA_TITLE"\r
1401                 //fall through\r
1402                 case 15://"Artist", "MEDIA_ARTIST"\r
1403                 //fall through\r
1404                 case 16://"Genre", "MEDIA_GENRE"\r
1405                 //fall through\r
1406                 case 17://"Year", "MEDIA_YEAR"\r
1407                 //fall through\r
1408                 case 18://"Composer", "MEDIA_COMPOSER"\r
1409 \r
1410                         pValue.reset(new (std::nothrow) String(strColVal));\r
1411                         break;\r
1412 \r
1413                 case 9://"ContentSize", "MEDIA_SIZE" \r
1414                         if ((strColVal.CompareTo(L"Unknown") != 0) && (!strColVal.IsEmpty()))\r
1415                         {\r
1416                                 res = LongLong::Parse(strColVal, contentSize);\r
1417                                 SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] LongLong parse failed.", GetErrorMessage(res));\r
1418                         }\r
1419 \r
1420                         pValue.reset(new (std::nothrow) LongLong(contentSize));\r
1421                         break;\r
1422                 case 10://"DateTime", "MEDIA_ADDED_TIME" \r
1423                         if ((strColVal.CompareTo(L"Unknown") != 0) && (!strColVal.IsEmpty()))\r
1424                         {\r
1425                                 res = LongLong::Parse(strColVal, addedTime);\r
1426                                 SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] LongLong parse failed.", GetErrorMessage(res));\r
1427                         }\r
1428 \r
1429                         res = dateTime.SetValue(1970, 1, 1);\r
1430                         SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] dateTime.SetValue failed.", GetErrorMessage(res));\r
1431 \r
1432                         res = dateTime.AddSeconds(addedTime);\r
1433                         SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] dateTime.AddSeconds failed.", GetErrorMessage(res));\r
1434 \r
1435                         SysLog(NID_CNT, "DateTime : %ls", dateTime.ToString().GetPointer());\r
1436 \r
1437                         pValue.reset(new (std::nothrow) DateTime(dateTime));\r
1438 \r
1439                         break;\r
1440                 case 11://"Latitude", "MEDIA_LATITUDE"\r
1441                         //fall through\r
1442                 case 12://"Longitude", "MEDIA_LONGITUDE"\r
1443                         //fall through\r
1444                 case 13://"Altitude", "MEDIA_ALTITUDE"\r
1445                         if ((strColVal.CompareTo(L"Unknown") != 0) && (!strColVal.IsEmpty()))\r
1446                         {\r
1447                                 res = Double::Parse(strColVal, dVal);\r
1448                                 SysTryLog(NID_CNT, res == E_SUCCESS, "[%s] double parse failed.", GetErrorMessage(res));\r
1449                         }\r
1450                         pValue.reset(new (std::nothrow) Double(dVal));\r
1451                         break;\r
1452 \r
1453                 case 19://"Album", "MEDIA_ALBUM"\r
1454                         break;\r
1455                 default:\r
1456                         break;\r
1457                 }\r
1458                 if (pValue.get() != NULL)\r
1459                 {\r
1460                         r = __pFinalOutList->Add(*(pValue.release()));\r
1461                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform arraylist Add operation.");\r
1462                 }\r
1463         }\r
1464 \r
1465         return r;\r
1466 }\r
1467 \r
1468 result\r
1469 _ContentSearchImpl::ExecuteAndFillAlbumValues(void) const\r
1470 {\r
1471         int ret = MEDIA_CONTENT_ERROR_NONE;\r
1472         result r = E_SUCCESS;\r
1473         std::unique_ptr<GList, SearchGListDeleter> pItemList;\r
1474         GList* pTemp = NULL;\r
1475         std::unique_ptr<media_album_s, AlbumHandleDeleter> pAlbumHandle;\r
1476         std::unique_ptr<media_album_s, AlbumHandleDeleter> pTempAlbumHandle;\r
1477 \r
1478         char* pName = NULL;\r
1479         std::unique_ptr<char, CharDeleter> pAlbumName;\r
1480         std::unique_ptr< String > pValue;\r
1481         int lastIndex = 0;\r
1482 \r
1483         pTemp = pItemList.get();\r
1484 \r
1485         ret = media_album_foreach_album_from_db(*(__pFilterHandle.get()), AlbumItemCb, &pTemp);\r
1486         r = MapCoreErrorToNativeResult(ret);\r
1487         SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform media_album_foreach_album_from_db operation.");\r
1488         SysTryReturnResult(NID_CNT, pTemp != NULL, r, "media_info_foreach_media_from_db pTemp is null.");\r
1489 \r
1490         for (int idx = 0; idx < (int)g_list_length(pTemp); idx++)\r
1491         {\r
1492                 pAlbumHandle.reset(static_cast<media_album_h>(g_list_nth_data(pTemp, idx)));\r
1493                 ret = media_album_get_name(pAlbumHandle.get(), &pName);\r
1494                 r = MapCoreErrorToNativeResult(ret);\r
1495                 SysTryReturnResult(NID_CNT, !IsFailed(r), r, "Failed to perform media_album_get_name.");\r
1496                 \r
1497                 if (pName != NULL)\r
1498                 {\r
1499                         SysLog(NID_CNT, "pColumnVal = %s", pName);\r
1500 \r
1501                         pAlbumName.reset(pName);\r
1502                         pValue.reset(new (std::nothrow) String(pAlbumName.get()));\r
1503                         SysTryReturnResult(NID_CNT, pValue != NULL, E_OUT_OF_MEMORY, "media_info_foreach_media_from_db pTemp is null.");\r
1504 \r
1505                         if (idx == 0)\r
1506                         {\r
1507                                 r = __pFinalOutList->Add(pValue.get());\r
1508                                 SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform arraylist Add operation.");\r
1509                                 pValue.release();\r
1510                         }\r
1511                         else\r
1512                         {\r
1513                                 String* pTempNameList(static_cast< String* >(__pFinalOutList->GetAt(lastIndex)));\r
1514 \r
1515                                 if (pValue->CompareTo(*pTempNameList) != 0)\r
1516                                 {\r
1517                                         r = __pFinalOutList->Add(pValue.get());\r
1518                                         SysTryReturnResult(NID_CNT, r == E_SUCCESS, r, "Failed to perform arraylist Add operation.");\r
1519 \r
1520                                         pValue.release();\r
1521                                         lastIndex++;\r
1522                                 }\r
1523                         }\r
1524                 }\r
1525         }\r
1526 \r
1527         return r;\r
1528 }\r
1529 \r
1530 result\r
1531 _ContentSearchImpl::MapCoreErrorToNativeResult(int reason) const\r
1532 {\r
1533         result r = E_SUCCESS;\r
1534 \r
1535         switch (reason)\r
1536         {\r
1537         case MEDIA_CONTENT_ERROR_NONE:\r
1538                 r = E_SUCCESS;\r
1539                 break;\r
1540 \r
1541         case MEDIA_CONTENT_ERROR_INVALID_PARAMETER:\r
1542                 r = E_INVALID_ARG;\r
1543                 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_INVALID_PARAMETER");\r
1544                 break;\r
1545 \r
1546         case MEDIA_CONTENT_ERROR_DB_FAILED:\r
1547                 r = E_SYSTEM;\r
1548                 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_DB_FAILED");\r
1549                 break;\r
1550 \r
1551         case MEDIA_CONTENT_ERROR_OUT_OF_MEMORY:\r
1552                 r = E_OUT_OF_MEMORY;\r
1553                 SysLog(NID_CNT, "MEDIA_CONTENT_ERROR_OUT_OF_MEMORY");\r
1554                 break;\r
1555 \r
1556         default:\r
1557                 SysLog(NID_CNT, "default");\r
1558                 r = E_SYSTEM;\r
1559                 break;\r
1560         }\r
1561         return r;\r
1562 }\r
1563 \r
1564 //Callback function registered to each media info details\r
1565 // all items are appened to the list\r
1566 bool\r
1567 MediaItemCb(media_info_h media, void* pUserdata)\r
1568 {\r
1569         int ret  = MEDIA_CONTENT_ERROR_NONE;\r
1570         media_info_h new_media = NULL;\r
1571         ret = media_info_clone(&new_media, media);\r
1572         SysTryLog(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, "[E_SYSTEM] Failed to perform media_info_clone");\r
1573 \r
1574         GList** pList = (GList**)pUserdata;\r
1575         *pList = g_list_append(*pList, new_media);\r
1576 \r
1577         return true;\r
1578 }\r
1579 \r
1580 //Callback function registered for column values\r
1581 // all items are appened to the list\r
1582 bool\r
1583 GroupItemCb(const char* pGroupName, void* pUserdata)\r
1584 {\r
1585         char* pGrpName = strdup(pGroupName);\r
1586         GList** pList = (GList**)pUserdata;\r
1587         *pList = g_list_append(*pList, pGrpName);\r
1588 \r
1589         return true;\r
1590 }\r
1591 \r
1592 //Callback function registered to each media info details\r
1593 // all items are appened to the list\r
1594 bool\r
1595 AlbumItemCb(media_album_h album, void* pUserdata)\r
1596 {\r
1597         int ret  = MEDIA_CONTENT_ERROR_NONE;\r
1598         media_album_h new_album = NULL;\r
1599         ret = media_album_clone(&new_album, album);\r
1600         SysTryLog(NID_CNT, ret == MEDIA_CONTENT_ERROR_NONE, "[E_SYSTEM] Failed to perform media_album_clone");\r
1601 \r
1602         GList** pList = (GList**)pUserdata;\r
1603         *pList = g_list_append(*pList, new_album);\r
1604 \r
1605         return true;\r
1606 }\r
1607 \r
1608 }}\r