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