changed the error for updating favorite
[framework/api/media-content.git] / src / media_info.c
1 /*\r
2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved\r
3 *\r
4 * Licensed under the Apache License, Version 2.0 (the "License");\r
5 * you may not use this file except in compliance with the License.\r
6 * You may obtain a copy of the License at\r
7 *\r
8 * http://www.apache.org/licenses/LICENSE-2.0\r
9 *\r
10 * Unless required by applicable law or agreed to in writing, software\r
11 * distributed under the License is distributed on an "AS IS" BASIS,\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13 * See the License for the specific language governing permissions and\r
14 * limitations under the License. \r
15 */\r
16 \r
17 \r
18 #include <media_content.h>\r
19 #include <media_info_private.h>\r
20 #include <media-svc.h>\r
21 #include <audio-svc.h>\r
22 #include <audio-svc-error.h>\r
23 #include <audio-svc-types.h>\r
24 \r
25 #include <visual-svc-error.h>\r
26 #include <visual-svc-types.h>\r
27 #include <visual-svc.h>\r
28 \r
29 #include <drm-service.h>\r
30 #include <aul.h>\r
31 \r
32 #include <dlog.h>\r
33 \r
34 #ifdef LOG_TAG\r
35 #undef LOG_TAG\r
36 #endif\r
37 \r
38 #define LOG_TAG "TIZEN_N_MEDIACONTENT"\r
39 \r
40 extern MediaSvcHandle* db_handle;\r
41 \r
42 \r
43 #define SELECT_AUDIO_FROM_MEDIA "select audio_uuid,genre,album,artist,author,year,copyright,description,format,bitrate,track_num,duration,rating,played_count,last_played_time,added_time,size,category from audio_media where audio_uuid='%s' "\r
44 #define SELECT_TAG_LIST_FROM_MEDIA "select t._id, t.tag_name from (select _id, tag_name from visual_tag ORDER BY tag_name ASC ) t, ( select visual_uuid, tag_id from visual_tag_map where visual_uuid='%s' ) tm, ( select visual_uuid, folder_uuid from visual_media) m, ( select folder_uuid, lock_status from visual_folder where valid=1 ) f where tm.tag_id = t._id and m.visual_uuid = tm.visual_uuid and m.folder_uuid = f.folder_uuid and f.lock_status=0; "\r
45 \r
46 int media_info_insert_to_db(media_content_type_e type,const char* path)\r
47 {\r
48         int ret= MEDIA_CONTENT_ERROR_NONE;\r
49         int storage_type;\r
50         int category=0;\r
51         minfo_file_type _type;\r
52         if(path == NULL)\r
53         {\r
54                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
55                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
56         }\r
57 \r
58         switch(type)\r
59         {\r
60                 case MEDIA_CONTENT_TYPE_IMAGE:\r
61                         _type = MINFO_ITEM_IMAGE;\r
62                         ret = minfo_add_media(db_handle, path, _type);\r
63                         ret = _content_error_capi(MEDIA_CONTENT_TYPE, ret);\r
64                 break;\r
65                 case MEDIA_CONTENT_TYPE_VIDEO:\r
66                         _type = MINFO_ITEM_VIDEO;\r
67                         ret = minfo_add_media(db_handle, path, _type);\r
68                         ret = _content_error_capi(MEDIA_CONTENT_TYPE, ret);                     \r
69                 break;\r
70 \r
71                 case MEDIA_CONTENT_TYPE_AUDIO:\r
72                         storage_type = _content_get_storage_type(path);\r
73                         ret = _content_get_audio_category(path,&category);\r
74                         if(ret >= 0)\r
75                         {\r
76                                 ret = audio_svc_insert_item(db_handle, storage_type,path,category);                             \r
77                         }\r
78                         else\r
79                         {\r
80                                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
81                                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;                    \r
82                         }\r
83                 break;\r
84 \r
85                 default:\r
86                 {\r
87                         LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
88                         ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
89                 }\r
90                 break;\r
91 \r
92         }\r
93 \r
94         return ret;\r
95 }\r
96 \r
97 \r
98 \r
99 int media_info_destroy(media_info_h item)\r
100 {\r
101 \r
102         int ret;\r
103         media_info_s* _item = (media_info_s*)item;      \r
104         if(_item) \r
105         {\r
106                 if(_item->item_id)\r
107                 {\r
108                         free(_item->item_id);\r
109                 }\r
110 \r
111                 if(_item->file_path) \r
112                 {\r
113                         free(_item->file_path);\r
114                 }                                               \r
115                 if(_item->display_name) \r
116                 {\r
117                         free(_item->display_name);\r
118                 }                       \r
119                 if(_item->thumbnail) \r
120                 {\r
121                         free(_item->thumbnail);\r
122                 }\r
123                 free(_item);\r
124                 ret = MEDIA_CONTENT_ERROR_NONE;\r
125         }\r
126         else \r
127         {\r
128                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
129                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
130         }\r
131         return ret;\r
132 \r
133 \r
134 \r
135 }\r
136 int media_info_clone(media_info_h* dst, media_info_h src)\r
137 {\r
138         int ret;\r
139         media_info_s* _src = (media_info_s*)src;        \r
140 \r
141 \r
142         if(_src != NULL )\r
143                 {\r
144                 media_info_s* _dst = (media_info_s*)calloc(1,sizeof(media_info_s));             \r
145 \r
146                 if(_dst == NULL)\r
147                 {\r
148                         LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
149                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;       \r
150                 }\r
151                 \r
152                 _dst->item_id = strdup(_src->item_id);\r
153                 if(     _dst->item_id == NULL)\r
154                 {\r
155                         LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
156                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;\r
157                 }\r
158                 _dst->date_modified= _src->date_modified;\r
159                 _dst->favorite = _src->favorite;\r
160                 _dst->media_type = _src->media_type;\r
161                 if((_src->file_path != NULL) && (strlen(_src->file_path) > 0))\r
162                 {\r
163                         _dst->file_path = strdup(_src->file_path);\r
164                         if(_dst->file_path == NULL)\r
165                         {\r
166                                 LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
167                                 media_info_destroy((media_info_h)_dst);\r
168                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;\r
169                         }\r
170                 }\r
171                 if((_src->display_name != NULL) && (strlen(_src->display_name) > 0))\r
172                 {\r
173                         _dst->display_name = strdup(_src->display_name);\r
174                         if(_dst->display_name == NULL)\r
175                         {\r
176                                 LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
177                                 media_info_destroy((media_info_h)_dst);\r
178                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;                       \r
179                         }\r
180                 }\r
181                 if((_src->thumbnail != NULL) && (strlen(_src->thumbnail) > 0))\r
182                 {\r
183                         _dst->thumbnail = strdup(_src->thumbnail);\r
184                         if(_dst->thumbnail == NULL)\r
185                         {\r
186                                 LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
187                                 media_info_destroy((media_info_h)_dst);\r
188                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;                       \r
189                         }\r
190 \r
191                 }               \r
192                 *dst = (media_info_h)_dst;\r
193                 ret = MEDIA_CONTENT_ERROR_NONE;         \r
194         }\r
195         else \r
196         {\r
197                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
198                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
199         }       \r
200                 \r
201         return ret;     \r
202 }\r
203 \r
204 int media_info_get_file_path(media_info_h item, char** path)\r
205 {       \r
206         int ret;\r
207         media_info_s* _item = (media_info_s*)item;      \r
208         \r
209         if(_item) \r
210         {\r
211                 if((_item->file_path != NULL) && (strlen(_item->file_path) > 0))\r
212                 {\r
213                         *path = strdup(_item->file_path);\r
214                         if(*path == NULL)\r
215                         {\r
216                                 LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
217                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;\r
218                         }\r
219                 }\r
220                 else\r
221                 {\r
222                         *path = NULL;\r
223                 }\r
224                 ret = MEDIA_CONTENT_ERROR_NONE;                                 \r
225 \r
226         }\r
227         else \r
228         {\r
229                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
230                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
231         }       \r
232 \r
233         return ret;\r
234 }\r
235         \r
236 \r
237 int media_info_get_display_name(media_info_h item, char** name)\r
238 {       \r
239         int ret;\r
240         media_info_s* _item = (media_info_s*)item;      \r
241         if(_item) \r
242         {\r
243                 if((_item->display_name != NULL) && (strlen(_item->display_name) > 0))\r
244                 {\r
245                         *name = strdup(_item->display_name);\r
246                         if(*name == NULL)\r
247                         {\r
248                                 LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
249                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;                       \r
250                         }\r
251                 }\r
252                 else\r
253                 {\r
254                         *name = NULL;\r
255                 }\r
256                 ret = MEDIA_CONTENT_ERROR_NONE;                                 \r
257 \r
258         }\r
259         else \r
260         {\r
261                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
262                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
263         }       \r
264 \r
265         return ret;\r
266 }\r
267         \r
268 \r
269 int media_info_get_thumbnail_path(media_info_h item, char** path)\r
270 {       \r
271         int ret;\r
272         media_info_s* _item = (media_info_s*)item;      \r
273         if(_item) \r
274         {\r
275                 if((_item->thumbnail != NULL) && (strlen(_item->thumbnail) > 0))\r
276                 {\r
277                         *path = strdup(_item->thumbnail);\r
278                         if(*path == NULL)\r
279                         {\r
280                                 LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
281                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;                               \r
282                         }\r
283                 }\r
284                 else\r
285                 {\r
286                         *path = NULL;\r
287                 }\r
288                 ret = MEDIA_CONTENT_ERROR_NONE;                                 \r
289 \r
290         }\r
291         else \r
292         {\r
293                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
294                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
295         }       \r
296 \r
297         return ret;\r
298 }\r
299         \r
300 \r
301 int media_info_get_date_modified(media_info_h item, time_t* time)\r
302 {\r
303         int ret;\r
304         media_info_s* _item = (media_info_s*)item;      \r
305         if(_item) \r
306         {\r
307                 *time = _item->date_modified;\r
308                 ret = MEDIA_CONTENT_ERROR_NONE; \r
309         }\r
310         else \r
311         {\r
312                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
313                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
314         }       \r
315 \r
316         return ret;\r
317 \r
318 }\r
319 \r
320 int media_info_get_media_type(media_info_h item, int* type)\r
321 {\r
322         int ret;\r
323         media_info_s* _item = (media_info_s*)item;      \r
324         if(_item) \r
325         {\r
326                 *type = _item->media_type;\r
327                 ret = MEDIA_CONTENT_ERROR_NONE; \r
328         }\r
329         else \r
330         {\r
331                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
332                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
333         }       \r
334 \r
335         return ret;\r
336 \r
337 }\r
338 \r
339 int media_info_get_favorite(media_info_h media, int* favorite)\r
340 {\r
341         int ret;\r
342         media_info_s* _media = (media_info_s*)media;\r
343         if(_media)\r
344         {\r
345 \r
346                 *favorite = _media->favorite;\r
347                 ret = MEDIA_CONTENT_ERROR_NONE;\r
348         }\r
349         else\r
350         {\r
351                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
352                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
353         }\r
354 \r
355         return ret;\r
356 \r
357 }\r
358 \r
359 \r
360 int media_info_update_favorite_to_db(media_info_h media, int favorite)\r
361 {\r
362         int ret = MEDIA_CONTENT_ERROR_NONE;\r
363         media_info_s* _media = (media_info_s*)media;\r
364 \r
365         if(media != NULL)\r
366         {\r
367                 if(_media->media_type == MEDIA_CONTENT_TYPE_AUDIO)\r
368                 {\r
369                         if(favorite)\r
370                         {\r
371                                 ret = audio_svc_add_item_to_playlist( db_handle, AUDIO_SVC_FAVORITE_LIST_ID, _media->item_id);\r
372                         }\r
373                         else\r
374                         {\r
375                                 ret = audio_svc_remove_item_from_playlist_by_audio_id(db_handle, AUDIO_SVC_FAVORITE_LIST_ID, _media->item_id);\r
376                         }\r
377                 }\r
378                 else\r
379                 {       \r
380                         ret = minfo_update_media_favorite(db_handle, _media->item_id,favorite);\r
381                 }\r
382                 ret = _content_error_capi(MEDIA_CONTENT_TYPE,ret);\r
383                 if(ret == MEDIA_CONTENT_ERROR_NONE)\r
384                 {\r
385                         _media->favorite = favorite;\r
386                 }\r
387         }\r
388         else\r
389         {\r
390                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
391                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
392 \r
393         }\r
394         return ret;\r
395 \r
396 }\r
397 \r
398 \r
399 \r
400 int media_info_foreach_media_from_db(media_info_filter_h filter,media_info_cb callback, void* user_data)\r
401 {\r
402         int ret= MEDIA_CONTENT_ERROR_NONE;\r
403 \r
404         char limit_query[MIN_QUERY_SIZE];\r
405         char condition_query[DEFAULT_QUERY_SIZE];       \r
406         char search_query[MAX_KEYWORD_SIZE];\r
407         char condition_type[MIN_QUERY_SIZE];\r
408         char select_query[DEFAULT_QUERY_SIZE];  \r
409         char order_query[MIN_QUERY_SIZE];\r
410 \r
411 \r
412         sqlite3_stmt *stmt = NULL;\r
413 \r
414 \r
415         media_info_filter_s* _filter = NULL;\r
416                 \r
417         if( callback == NULL )\r
418         {\r
419                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
420                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
421         }\r
422 \r
423 \r
424 \r
425         if(filter != NULL)\r
426         {\r
427                 _filter = (media_info_filter_s*)filter;\r
428                 \r
429                 if(!(_filter->media_type & (MEDIA_CONTENT_TYPE_IMAGE | MEDIA_CONTENT_TYPE_VIDEO | MEDIA_CONTENT_TYPE_AUDIO)) )\r
430                 {\r
431                         LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
432                         return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
433                 }\r
434         }       \r
435         else\r
436         {\r
437                 ret = media_info_filter_create((media_info_filter_h*)&_filter);\r
438 \r
439                 if(ret != MEDIA_CONTENT_ERROR_NONE)\r
440                 {\r
441                         return ret;\r
442                 }\r
443                                 \r
444                 if(_filter->media_type == 0)\r
445                 {\r
446                         _filter->media_type = (MEDIA_CONTENT_TYPE_IMAGE | MEDIA_CONTENT_TYPE_VIDEO | MEDIA_CONTENT_TYPE_AUDIO); \r
447                 }\r
448         }\r
449 \r
450         memset(order_query,0x00,sizeof(order_query));   \r
451         memset(condition_type,0x00,sizeof(condition_type));             \r
452         memset(condition_query,0x00,sizeof(condition_query));   \r
453         memset(limit_query,0x00,sizeof(limit_query));   \r
454         memset(search_query,0x00,sizeof(search_query));         \r
455         memset(select_query,0x00,sizeof(select_query));         \r
456 \r
457 \r
458         if((_filter->keyword != NULL) && strlen(_filter->keyword) > 0)\r
459         {\r
460                 if(strlen(_filter->keyword) < sizeof(search_query))\r
461                 {\r
462                         snprintf(search_query,sizeof(search_query)," and display_name like '%%%s%%'", _filter->keyword);\r
463                 }\r
464                 else\r
465                 {\r
466                         LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
467                         if((media_info_filter_s*)filter != _filter)\r
468                                 media_info_filter_destroy((media_info_filter_h)_filter);                \r
469                         return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
470                 }\r
471         }\r
472         else\r
473         {\r
474                 search_query[0] = ' ';\r
475         }\r
476 \r
477         snprintf(limit_query,sizeof(limit_query),"%s %d,%d",QUERY_KEYWORD_LIMIT,_filter->offset,_filter->count);\r
478         \r
479 \r
480         if(_filter->media_type & MEDIA_CONTENT_TYPE_IMAGE)\r
481         {\r
482                 strncat(condition_type,CONDITION_TYPE_IMAGE,strlen(CONDITION_TYPE_IMAGE));\r
483         }\r
484         if(_filter->media_type & MEDIA_CONTENT_TYPE_VIDEO)\r
485         {\r
486                 if(strlen(condition_type) > 0 )\r
487                 {\r
488                         strncat(condition_type,QUERY_KEYWORD_SPACE, strlen(QUERY_KEYWORD_SPACE));\r
489                         strncat(condition_type,QUERY_KEYWORD_OR, strlen(QUERY_KEYWORD_OR));\r
490                         strncat(condition_type,QUERY_KEYWORD_SPACE, strlen(QUERY_KEYWORD_SPACE));                       \r
491                 }\r
492                 strncat(condition_type,CONDITION_TYPE_VIDEO,strlen(CONDITION_TYPE_VIDEO));\r
493 \r
494         }\r
495         if(_filter->media_type & MEDIA_CONTENT_TYPE_AUDIO)\r
496         {\r
497                 if(strlen(condition_type) > 0 )\r
498                 {\r
499                         strncat(condition_type,QUERY_KEYWORD_SPACE, strlen(QUERY_KEYWORD_SPACE));               \r
500                         strncat(condition_type,QUERY_KEYWORD_OR, strlen(QUERY_KEYWORD_OR));\r
501                         strncat(condition_type,QUERY_KEYWORD_SPACE, strlen(QUERY_KEYWORD_SPACE));                       \r
502                 }\r
503         \r
504                 strncat(condition_type,CONDITION_TYPE_AUDIO,strlen(CONDITION_TYPE_AUDIO));\r
505         }\r
506 \r
507 \r
508         snprintf(select_query,sizeof(select_query),"%s", SELECT_MEDIA_ITEM);\r
509 \r
510         snprintf(condition_query,sizeof(condition_query), "%s (%s)", QUERY_KEYWORD_AND, condition_type);\r
511 \r
512         if(_filter->order == MEDIA_CONTENT_SORT_BY_NAME_ASC)\r
513         {\r
514                 snprintf(order_query,sizeof(order_query),"%s %s",QUERY_KEYWORD_ORDER_BY,DB_FILED_DISPLAY_NAME);\r
515         }\r
516         else if(_filter->order == MEDIA_CONTENT_SORT_BY_NAME_DESC)\r
517         {\r
518                 snprintf(order_query,sizeof(order_query),"%s %s %s",QUERY_KEYWORD_ORDER_BY,DB_FILED_DISPLAY_NAME,QUERY_KEYWORD_DESC);\r
519         }\r
520         else if(_filter->order == MEDIA_CONTENT_SORT_BY_DATE_ASC)\r
521         {\r
522                 snprintf(order_query,sizeof(order_query),"%s %s",QUERY_KEYWORD_ORDER_BY,DB_FILED_DATE_MODIFIED);\r
523         }\r
524         else if(_filter->order == MEDIA_CONTENT_SORT_BY_DATE_DESC)\r
525         {\r
526                 snprintf(order_query,sizeof(order_query),"%s %s %s",QUERY_KEYWORD_ORDER_BY,DB_FILED_DATE_MODIFIED,QUERY_KEYWORD_DESC);          \r
527         }\r
528 \r
529         \r
530         if((media_info_filter_s*)filter != _filter)\r
531                 media_info_filter_destroy((media_info_filter_h)_filter);                \r
532 \r
533 \r
534         ret = _content_query_prepare(&stmt,select_query,condition_query, search_query,limit_query,order_query);\r
535         if( ret != MEDIA_CONTENT_ERROR_NONE)\r
536                 return ret;\r
537 \r
538         \r
539         while( sqlite3_step(stmt) == SQLITE_ROW)\r
540         {\r
541                 media_info_s* item1 = (media_info_s*)calloc(1,sizeof(media_info_s));\r
542 \r
543                 if(item1 == NULL)\r
544                 {\r
545                         LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
546                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;\r
547                 }\r
548                 _content_item_get_detail(stmt,(media_info_h)item1);\r
549 \r
550                 if( callback((media_info_h)item1,user_data) == false)\r
551                 {\r
552                         media_info_destroy((media_info_h) item1);\r
553                         break;\r
554                 }\r
555                 media_info_destroy((media_info_h) item1);               \r
556         }\r
557         \r
558         if(stmt != NULL)\r
559         {\r
560                 sqlite3_finalize(stmt);\r
561         }\r
562 \r
563         return ret;\r
564 \r
565 }\r
566 \r
567 \r
568 \r
569 int media_info_get_image_from_db(media_info_h item, image_meta_h* image)\r
570 {\r
571         int p_ret;\r
572         int ret = MEDIA_CONTENT_ERROR_NONE;\r
573         Mitem* p_item = NULL;\r
574         image_meta_s* _image = NULL; \r
575         \r
576 \r
577         \r
578         media_info_s* _item = (media_info_s*)item;\r
579 \r
580         if( _item == NULL )\r
581         {\r
582                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
583                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
584         }\r
585 \r
586         if(_item->media_type != MEDIA_CONTENT_TYPE_IMAGE)\r
587         {\r
588                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
589                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
590         }\r
591 \r
592         p_ret = minfo_get_item_by_id(db_handle, _item->item_id,&p_item);\r
593 \r
594         ret =  _content_error_capi(MEDIA_CONTENT_TYPE,p_ret);\r
595         if( (ret == MEDIA_CONTENT_ERROR_NONE) && ( p_item != NULL))\r
596         {\r
597                 ret = minfo_get_meta_info(db_handle, _item->item_id,&(p_item->meta_info));\r
598                 ret =  _content_error_capi(MEDIA_CONTENT_TYPE,p_ret);   \r
599 \r
600                 if( ret != MEDIA_CONTENT_ERROR_NONE)\r
601                 {\r
602                         minfo_destroy_mtype_item(p_item);\r
603                         return ret;\r
604                 }\r
605                 _image = (image_meta_s*)calloc(1, sizeof(image_meta_s));\r
606                 if(_image == NULL)\r
607                 {\r
608                         LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
609                         minfo_destroy_mtype_item(p_item);\r
610                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;               \r
611 \r
612                 }\r
613 \r
614                 _image->image_id = strdup(p_item->uuid);\r
615                 if(p_item->thumb_url != NULL)\r
616                         _image->thumbnail = strdup(p_item->thumb_url);\r
617                 if(p_item->rate > 0)\r
618                         _image->favorite = true;\r
619                 else\r
620                         _image->favorite = false;\r
621 \r
622                 if(p_item->meta_info != NULL)\r
623                 {\r
624                         _image->longitude = p_item->meta_info->longitude;\r
625                         _image->latitude = p_item->meta_info->latitude;\r
626                         _image->width = p_item->meta_info->width;\r
627                         _image->height = p_item->meta_info->height;\r
628                         _image->date_taken  = p_item->meta_info->datetaken;\r
629                         if(p_item->meta_info->description != NULL)\r
630                                 _image->description = strdup(p_item->meta_info->description);           \r
631                 }\r
632                 if((p_item->meta_info != NULL) && (p_item->meta_info->image_info != NULL))\r
633                 {\r
634                         _image->orientation = p_item->meta_info->image_info->orientation;\r
635                 }\r
636                 \r
637                 *image = (image_meta_h)_image;\r
638                 p_ret = minfo_destroy_mtype_item(p_item);\r
639                 ret = _content_error_capi(MEDIA_CONTENT_TYPE,p_ret);\r
640         }\r
641 \r
642         \r
643         return ret;\r
644 }\r
645 \r
646 \r
647 int media_info_get_video_from_db(media_info_h item, video_meta_h* video)\r
648 {\r
649 \r
650         int p_ret;\r
651         int ret = MEDIA_CONTENT_ERROR_NONE;\r
652         Mitem* p_item = NULL;\r
653         video_meta_s* _video = NULL;\r
654 \r
655 \r
656         media_info_s* _item = (media_info_s*)item;      \r
657         if( _item == NULL )\r
658         {\r
659                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
660                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
661         }\r
662 \r
663         if(_item->media_type != MEDIA_CONTENT_TYPE_VIDEO)\r
664         {\r
665                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
666                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
667         }\r
668 \r
669         p_ret = minfo_get_item_by_id(db_handle, _item->item_id,&p_item);\r
670 \r
671 \r
672         ret =  _content_error_capi(MEDIA_CONTENT_TYPE,p_ret);\r
673         if( (ret == MEDIA_CONTENT_ERROR_NONE) && ( p_item != NULL))\r
674         {\r
675                 ret = minfo_get_meta_info(db_handle, _item->item_id,&(p_item->meta_info));\r
676                 ret =  _content_error_capi(MEDIA_CONTENT_TYPE,p_ret);   \r
677                 if( ret != MEDIA_CONTENT_ERROR_NONE)\r
678                 {\r
679                         minfo_destroy_mtype_item(p_item);\r
680                         return ret;\r
681                 }\r
682 \r
683                 _video = (video_meta_s*)calloc(1,sizeof(video_meta_s));\r
684                 if( _video == NULL)\r
685                 {\r
686                         LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
687                         minfo_destroy_mtype_item(p_item);\r
688                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;\r
689                 }\r
690 \r
691                 _video->video_id = strdup(p_item->uuid);\r
692                 if(p_item->thumb_url)\r
693                         _video->thumbnail = strdup(p_item->thumb_url);\r
694                 \r
695                 if(p_item->rate > 0)\r
696                         _video->favorite = true;\r
697                 else\r
698                         _video->favorite = false;\r
699 \r
700 \r
701                 if(p_item->meta_info != NULL)\r
702                 {\r
703                         _video->longitude = p_item->meta_info->longitude;\r
704                         _video->latitude = p_item->meta_info->latitude;\r
705                         _video->width = p_item->meta_info->width; \r
706                         _video->height = p_item->meta_info->height;\r
707                         _video->date_taken = p_item->meta_info->datetaken;\r
708                         if(p_item->meta_info->description)\r
709                                 _video->description = strdup(p_item->meta_info->description);                   \r
710                 }                       \r
711                 if((p_item->meta_info != NULL) && (p_item->meta_info->video_info != NULL))\r
712                 {\r
713                         if(p_item->meta_info->video_info->album_name != NULL)\r
714                         {\r
715                                 _video->album = strdup(p_item->meta_info->video_info->album_name);\r
716                         }\r
717                         if(p_item->meta_info->video_info->artist_name != NULL)\r
718                                 _video->artist = strdup(p_item->meta_info->video_info->artist_name);\r
719                         if(p_item->meta_info->video_info->title != NULL)\r
720                                 _video->title = strdup(p_item->meta_info->video_info->title);\r
721 \r
722                         \r
723                         _video->time_played = p_item->meta_info->video_info->last_played_pos;\r
724                         _video->duration = p_item->meta_info->video_info->duration;\r
725                 }\r
726                 *video = (video_meta_h)_video;\r
727                 p_ret = minfo_destroy_mtype_item(p_item);\r
728                 ret =  _content_error_capi(MEDIA_CONTENT_TYPE,p_ret);\r
729         \r
730         }\r
731         return ret;\r
732 }\r
733 \r
734 int media_info_get_audio_from_db(media_info_h item, audio_meta_h* audio)\r
735 {\r
736         int ret = MEDIA_CONTENT_ERROR_NONE;\r
737         \r
738         media_info_s* _item = (media_info_s*)item;\r
739         \r
740         char select_query[DEFAULT_QUERY_SIZE];\r
741         sqlite3_stmt *stmt = NULL;\r
742 \r
743         if(_item == NULL)\r
744         {\r
745                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
746                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
747         }\r
748 \r
749         if(_item->media_type != MEDIA_CONTENT_TYPE_AUDIO)\r
750         {\r
751                 LOGE("[%s] the type of media is not an audio.",__func__);\r
752                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
753         }\r
754 \r
755         \r
756         memset(select_query,0x00,sizeof(select_query)); \r
757 \r
758         snprintf(select_query,sizeof(select_query), SELECT_AUDIO_FROM_MEDIA,_item->item_id);\r
759 \r
760         ret = _content_query_prepare(&stmt,select_query,NULL,NULL,NULL,NULL);\r
761 \r
762 \r
763         if( ret != MEDIA_CONTENT_ERROR_NONE)\r
764                 return ret;\r
765 \r
766         \r
767         audio_meta_s* _audio = (audio_meta_s*)calloc(1,sizeof(audio_meta_s));\r
768         if(_audio == NULL)\r
769         {\r
770                 LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
771                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;\r
772         }\r
773 \r
774 \r
775         while( sqlite3_step(stmt) == SQLITE_ROW)\r
776         {\r
777                 _audio->audio_id = strdup((const char *)sqlite3_column_text(stmt, 0));\r
778                 _audio->genre = strdup((const char *)sqlite3_column_text(stmt, 1));                             \r
779                 _audio->album = strdup((const char *)sqlite3_column_text(stmt, 2));\r
780                 _audio->artist= strdup((const char *)sqlite3_column_text(stmt, 3));\r
781                 _audio->author= strdup((const char *)sqlite3_column_text(stmt, 4));\r
782                 _audio->year= strdup((const char *)sqlite3_column_text(stmt, 5));\r
783                 _audio->copyright= strdup((const char *)sqlite3_column_text(stmt, 6));\r
784                 _audio->description= strdup((const char *)sqlite3_column_text(stmt, 7));\r
785                 _audio->format= strdup((const char *)sqlite3_column_text(stmt, 8));\r
786                 _audio->bitrate = (int)sqlite3_column_int(stmt,9);\r
787                 _audio->track_num = (int)sqlite3_column_int(stmt,10);\r
788                 _audio->duration = (int)sqlite3_column_int(stmt,11);\r
789                 _audio->rating = (int)sqlite3_column_int(stmt,12);\r
790                 _audio->count_played = (int)sqlite3_column_int(stmt,13);\r
791                 _audio->time_played = (int)sqlite3_column_int(stmt,14);\r
792                 _audio->time_added = (int)sqlite3_column_int(stmt,15);\r
793                 _audio->size = (int)sqlite3_column_int(stmt,16);\r
794                 _audio->category = (int)sqlite3_column_int(stmt,17);\r
795         }\r
796         *audio = (audio_meta_h)_audio;\r
797         if(stmt != NULL)\r
798         {\r
799                 sqlite3_finalize(stmt);\r
800         }\r
801         \r
802 \r
803         return ret;\r
804 }\r
805 \r
806 \r
807 \r
808 int media_info_foreach_tag_from_db(media_info_h item, media_tag_cb callback, void *user_data)\r
809 {\r
810         int ret = MEDIA_CONTENT_ERROR_NONE;\r
811         char select_query[DEFAULT_QUERY_SIZE];\r
812         sqlite3_stmt *stmt = NULL;\r
813 \r
814         media_info_s* _item = (media_info_s*)item;      \r
815         \r
816         if(_item == NULL)\r
817         {\r
818                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
819                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
820         }\r
821         if(callback == NULL)\r
822         {\r
823                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
824                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
825         }\r
826 \r
827         snprintf(select_query,sizeof(select_query),SELECT_TAG_LIST_FROM_MEDIA,_item->item_id);\r
828         ret = _content_query_prepare(&stmt,select_query,NULL,NULL,NULL,NULL);\r
829         if(ret != MEDIA_CONTENT_ERROR_NONE)\r
830                 return ret;\r
831 \r
832         while( sqlite3_step(stmt) == SQLITE_ROW)\r
833         {\r
834                 media_tag_s* _tag = (media_tag_s*)calloc(1,sizeof(media_tag_s));\r
835 \r
836                 if(_tag == NULL)\r
837                 {\r
838                         LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
839                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;       \r
840                 }\r
841 \r
842                 _tag->tag_id = (int)sqlite3_column_int(stmt,0);\r
843                 _tag->name = strdup((const char *)sqlite3_column_text(stmt, 1));        \r
844                 if(callback((media_tag_h)_tag,user_data) == false)\r
845                 {\r
846                         media_tag_destroy((media_tag_h) _tag);\r
847                         break;\r
848                 }\r
849                 media_tag_destroy((media_tag_h) _tag);\r
850                 \r
851         }\r
852 \r
853         if(stmt != NULL)\r
854         {\r
855                 sqlite3_finalize(stmt);\r
856         }\r
857 \r
858         return ret;\r
859 \r
860 }\r
861 \r
862 void _content_item_get_detail(sqlite3_stmt* stmt, media_info_h item)\r
863 {\r
864         //item_id, file_path, display_name, thumbnail, date_modified,content_type, valid\r
865         media_info_s* _item = (media_info_s*)item;\r
866         _item->item_id = strdup((const char *)sqlite3_column_text(stmt, 0));\r
867         _item->file_path= strdup((const char *)sqlite3_column_text(stmt, 1));\r
868         _item->display_name=strdup((const char *)sqlite3_column_text(stmt, 2));\r
869         _item->thumbnail=strdup((const char *)sqlite3_column_text(stmt, 3));    \r
870         _item->date_modified = (int)sqlite3_column_int(stmt,4);\r
871         _item->media_type = (int)sqlite3_column_int(stmt,5);\r
872         _item->media_type = _item->media_type==3?4:_item->media_type;\r
873         _item->favorite = (int)sqlite3_column_int(stmt,6);\r
874 }\r
875 \r
876 int _content_get_storage_type(const char* full_path)\r
877 {\r
878         if (full_path != NULL) {                \r
879                 if (strncmp(full_path, MEDIA_CONTENT_PATH_PHONE , strlen(MEDIA_CONTENT_PATH_PHONE )) == 0) \r
880                 {\r
881                         return MEDIA_CONTENT_STORAGE_INTERNAL;\r
882                 }\r
883                 else if (strncmp(full_path, MEDIA_CONTENT_PATH_MMC , strlen(MEDIA_CONTENT_PATH_MMC )) == 0) \r
884                 {\r
885                         return MEDIA_CONTENT_STORAGE_EXTERNAL;\r
886                 }\r
887         }\r
888         \r
889         return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
890 }\r
891 \r
892 \r
893 #define CONTENT_TYPE_NUM 4\r
894 #define FEX_CATEGORY_UNKNOWN    0x00000000      /**< Default */\r
895 #define FEX_CATEGORY_ETC                0x00000001      /**< ETC category */\r
896 #define FEX_CATEGORY_IMAGE      0x00000002      /**< Image category */\r
897 #define FEX_CATEGORY_VIDEO              0x00000004      /**< Video category */\r
898 #define FEX_CATEGORY_MUSIC      0x00000008      /**< Music category */\r
899 #define FEX_CATEGORY_SOUND      0x00000010      /**< Sound category */\r
900 #define FEX_CATEGORY_DRM                0x00000020      /**< DRM category */\r
901 #define SOUND_MIME_NUM 1\r
902 #define MINE_LENGTH 30\r
903 #define MUSIC_MIME_NUM 12\r
904 \r
905 \r
906 typedef struct\r
907 {\r
908         char content_type[15];\r
909         int  category_by_mime;\r
910 }fex_content_table_t;\r
911 \r
912 static const fex_content_table_t content_category[CONTENT_TYPE_NUM] = {\r
913         {"audio", FEX_CATEGORY_SOUND},\r
914         {"image", FEX_CATEGORY_IMAGE},\r
915         {"video", FEX_CATEGORY_VIDEO},\r
916         {"application", FEX_CATEGORY_ETC},\r
917 };\r
918 \r
919 static const char sound_mime_table[SOUND_MIME_NUM][MINE_LENGTH] = {\r
920         "x-smaf",\r
921 };\r
922 static const char music_mime_table[MUSIC_MIME_NUM][MINE_LENGTH] = {\r
923         "ac3",\r
924         "mp2",\r
925         "mpeg",\r
926         "ogg",\r
927         "vnd.rn-realaudio",\r
928         "x-ape",\r
929         "x-flac",\r
930         "x-flac+ogg",\r
931         "x-matroska",\r
932         "x-ms-asx",\r
933         "x-ms-wma",\r
934         "x-vorbis+ogg",\r
935 };\r
936 \r
937 #define FMS_DRM_CONTENT_TYPE_LENGTH 100\r
938 \r
939 int _content_get_audio_category(const char* file_full_path,int* category)\r
940 {\r
941         int i = 0;\r
942         char mimetype[255] = {0,};\r
943         int result = 0;\r
944         bool is_drm = false;\r
945         drm_content_info_t contentInfo = {0};\r
946 \r
947         if (file_full_path == NULL)\r
948                 return FEX_CATEGORY_UNKNOWN;\r
949 \r
950 \r
951         if (drm_svc_is_drm_file(file_full_path) == DRM_TRUE)\r
952         {\r
953 \r
954                 // 2008.8.13 han. In this case, use drm_svc_get_content_info api.\r
955                 result = drm_svc_get_content_info(file_full_path, &contentInfo);\r
956                 if (result != DRM_RESULT_SUCCESS)\r
957                 {\r
958                         *category = FEX_CATEGORY_UNKNOWN;\r
959                 }\r
960 \r
961                 strncpy(mimetype,  contentInfo.contentType, strlen(contentInfo.contentType)+1);\r
962                 *category = *category | FEX_CATEGORY_DRM;\r
963                 is_drm = true;\r
964         }\r
965         else\r
966         {\r
967                 result = aul_get_mime_from_file(file_full_path, mimetype, sizeof(mimetype));\r
968                 if(result < 0)\r
969                 {\r
970                         *category = FEX_CATEGORY_UNKNOWN;\r
971                 }\r
972 \r
973         }\r
974 \r
975         for(i = 0; i < CONTENT_TYPE_NUM; i ++)\r
976         {\r
977                 if (strstr(mimetype, content_category[i].content_type) != NULL)\r
978                 {\r
979                         *category = (*category | content_category[i].category_by_mime);\r
980                         break;\r
981                 }\r
982         }\r
983         if (*category & FEX_CATEGORY_ETC)\r
984         {\r
985                 int prefix_len = strlen(content_category[0].content_type);\r
986 \r
987                 for(i = 0; i < SOUND_MIME_NUM; i ++)\r
988                 {\r
989                         if (strstr(mimetype+prefix_len, sound_mime_table[i]) != NULL)\r
990                         {\r
991                                 *category = FEX_CATEGORY_SOUND;\r
992                                 break;\r
993                         }\r
994                 }\r
995 \r
996                 if(is_drm)\r
997                         *category = *category | FEX_CATEGORY_DRM;;\r
998         }\r
999 \r
1000         if (!(*category & FEX_CATEGORY_SOUND))\r
1001         {\r
1002                 return result;\r
1003         }\r
1004         else\r
1005         {\r
1006                 if(is_drm) //if sound file is DRM, it is always music file.\r
1007                 {\r
1008                         *category = FEX_CATEGORY_MUSIC;\r
1009                         *category = *category | FEX_CATEGORY_DRM;\r
1010                 }\r
1011                 else //check music file in sound files.\r
1012                 {\r
1013                         int prefix_len = strlen(content_category[0].content_type);\r
1014 \r
1015                         for(i = 0; i < MUSIC_MIME_NUM; i ++)\r
1016                         {\r
1017                                 if (strstr(mimetype+prefix_len, music_mime_table[i]) != NULL)\r
1018                                 {\r
1019                                         *category = FEX_CATEGORY_MUSIC;\r
1020                                         break;\r
1021                                 }\r
1022                         }\r
1023                 }\r
1024         }\r
1025 \r
1026         return result;\r
1027 \r
1028 \r
1029 \r
1030 }\r
1031 \r