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