2 * Copyright 2012 Samsung Electronics Co., Ltd
\r
4 * Licensed under the Flora License, Version 1.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
8 * http://www.tizenopensource.org/license
\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
18 #include <media_content.h>
\r
21 #include "ge-local-data.h"
\r
22 #include "ge-debug.h"
\r
24 typedef struct _ge_transfer_data_t ge_transfer_data_s;
\r
26 struct _ge_transfer_data_t {
\r
33 static int __ge_local_data_create_filter(ge_filter_s *condition, filter_h *filter)
\r
35 GE_CHECK_VAL(filter, -1);
\r
36 GE_CHECK_VAL(condition, -1);
\r
38 filter_h tmp_filter = NULL;
\r
40 ret = media_filter_create(&tmp_filter);
\r
41 if(ret != MEDIA_CONTENT_ERROR_NONE) {
\r
42 ge_dbgE("Fail to create filter!");
\r
46 if (strlen(condition->cond) > 0) {
\r
47 ret = media_filter_set_condition(tmp_filter, condition->cond,
\r
48 condition->collate_type);
\r
49 if(ret != MEDIA_CONTENT_ERROR_NONE) {
\r
50 ge_dbgE("Fail to set condition!");
\r
51 goto GE_LOCAL_FAILED;
\r
55 if (strlen(condition->sort_keyword) > 0) {
\r
56 ret = media_filter_set_order(tmp_filter, condition->sort_type,
\r
57 condition->sort_keyword,
\r
58 condition->collate_type);
\r
59 if(ret != MEDIA_CONTENT_ERROR_NONE) {
\r
60 ge_dbgE("Fail to set order!");
\r
61 goto GE_LOCAL_FAILED;
\r
65 ge_dbg("offset: %d, count: %d", condition->offset, condition->count);
\r
66 if (condition->offset != -1 && condition->count != -1 &&
\r
67 condition->count > 0) {
\r
68 ret = media_filter_set_offset(tmp_filter, condition->offset,
\r
70 if(ret != MEDIA_CONTENT_ERROR_NONE) {
\r
71 ge_dbgE("Fail to set offset!");
\r
72 goto GE_LOCAL_FAILED;
\r
76 *filter = tmp_filter;
\r
82 media_filter_destroy(*filter);
\r
89 static int __ge_local_data_destroy_filter(filter_h filter)
\r
91 GE_CHECK_VAL(filter, -1);
\r
93 if (media_filter_destroy(filter) != MEDIA_CONTENT_ERROR_NONE) {
\r
94 ge_dbgE("Failed to destroy filter!");
\r
101 static bool __ge_local_data_get_album_list_cb(media_folder_h folder,
\r
104 GE_CHECK_FALSE(data);
\r
105 ge_transfer_data_s *tmp_data = (ge_transfer_data_s *)data;
\r
106 GE_CHECK_FALSE(tmp_data->userdata);
\r
107 GE_CHECK_FALSE(tmp_data->filter);
\r
108 GE_CHECK_FALSE(folder);
\r
110 Eina_List **elist = (Eina_List **)(tmp_data->userdata);
\r
111 ge_album_s *album = NULL;
\r
113 album = (ge_album_s *)calloc(1, sizeof(ge_album_s));
\r
114 GE_CHECK_FALSE(album);
\r
115 album->gtype = GE_TYPE_ALBUM;
\r
117 if (media_folder_clone(&(album->folder_h), folder) != MEDIA_CONTENT_ERROR_NONE) {
\r
118 ge_dbgE("Clone folder handle error");
\r
119 goto GE_LOCAL_FAILED;
\r
122 if (media_folder_get_folder_id(folder, &(album->uuid)) != MEDIA_CONTENT_ERROR_NONE) {
\r
123 ge_dbgE("Get folder id error");
\r
124 goto GE_LOCAL_FAILED;
\r
127 if (media_folder_get_modified_time(folder, &(album->mtime)) != MEDIA_CONTENT_ERROR_NONE) {
\r
128 ge_dbgE("Get modified time error");
\r
129 goto GE_LOCAL_FAILED;
\r
132 if (media_folder_get_storage_type(folder, (media_content_storage_e *)&(album->type)) != MEDIA_CONTENT_ERROR_NONE) {
\r
133 ge_dbgE("Get storage type error");
\r
134 goto GE_LOCAL_FAILED;
\r
137 if (media_folder_get_name(folder, &(album->display_name)) != MEDIA_CONTENT_ERROR_NONE) {
\r
138 ge_dbgE("Get folder name error");
\r
139 goto GE_LOCAL_FAILED;
\r
142 if (media_folder_get_path(folder, &(album->path)) != MEDIA_CONTENT_ERROR_NONE) {
\r
143 ge_dbgE("Get folder name error");
\r
144 goto GE_LOCAL_FAILED;
\r
147 if (media_folder_get_media_count_from_db(album->uuid, tmp_data->filter, &(album->count)) != MEDIA_CONTENT_ERROR_NONE) {
\r
148 ge_dbgE("Get media count error, %d", album->count);
\r
149 goto GE_LOCAL_FAILED;
\r
152 *elist = eina_list_append(*elist, album);
\r
158 _ge_data_type_free_geitem((void **)(&album));
\r
162 static bool __ge_local_data_get_media_list_cb(media_info_h media, void *data)
\r
164 GE_CHECK_FALSE(data);
\r
165 ge_transfer_data_s *tmp_data = (ge_transfer_data_s *)data;
\r
166 GE_CHECK_FALSE(tmp_data->userdata);
\r
167 GE_CHECK_FALSE(media);
\r
168 ge_media_s *item = NULL;
\r
169 ge_image_s *image_info = NULL;
\r
170 ge_video_s *video_info = NULL;
\r
171 image_meta_h image_handle = NULL;
\r
172 video_meta_h video_handle = NULL;
\r
175 Eina_List **elist = (Eina_List **)(tmp_data->userdata);
\r
177 item = (ge_media_s *)calloc(1, sizeof(ge_media_s));
\r
178 GE_CHECK_FALSE(item);
\r
179 item->gtype = GE_TYPE_MEDIA;
\r
181 if (media_info_clone(&(item->media_h), media) != MEDIA_CONTENT_ERROR_NONE) {
\r
182 ge_dbgE("Clone media handle error");
\r
183 goto GE_LOCAL_FAILED;
\r
186 if (media_info_get_media_id(media, &(item->uuid)) != MEDIA_CONTENT_ERROR_NONE) {
\r
187 ge_dbgE("Get media id error");
\r
188 goto GE_LOCAL_FAILED;
\r
191 if (media_info_get_display_name(media, &(item->display_name)) != MEDIA_CONTENT_ERROR_NONE) {
\r
192 ge_dbgE("Get media display name error");
\r
193 goto GE_LOCAL_FAILED;
\r
195 if (media_info_get_file_path(media, &(item->file_url)) != MEDIA_CONTENT_ERROR_NONE) {
\r
196 ge_dbgE("Get media file path error");
\r
197 goto GE_LOCAL_FAILED;
\r
200 if (media_info_get_media_type(media, (media_content_type_e *)&(item->type)) != MEDIA_CONTENT_ERROR_NONE) {
\r
201 ge_dbgE("Get media type error");
\r
202 goto GE_LOCAL_FAILED;
\r
205 if (media_info_get_thumbnail_path(media, &(item->thumb_url)) != MEDIA_CONTENT_ERROR_NONE) {
\r
206 ge_dbgE("Get media thumbnail path error");
\r
207 goto GE_LOCAL_FAILED;
\r
209 ge_dbg("thumb_url: %s", item->thumb_url);
\r
211 if (media_info_get_modified_time(media, &(item->mtime)) != MEDIA_CONTENT_ERROR_NONE) {
\r
212 ge_dbgE("Get media modified time error");
\r
213 goto GE_LOCAL_FAILED;
\r
217 if (!tmp_data->with_meta)
\r
218 goto GE_LOCAL_SUCCESS;
\r
220 if (item->type == MEDIA_CONTENT_TYPE_IMAGE) {
\r
221 ret = media_info_get_image(media, &image_handle);
\r
222 if (ret != MEDIA_CONTENT_ERROR_NONE || image_handle == NULL) {
\r
223 ge_dbgE("Failed to get image handle[%d]!", ret);
\r
224 goto GE_LOCAL_FAILED;
\r
227 image_info = (ge_image_s *)calloc(1, sizeof(ge_image_s));
\r
228 if (NULL == image_info){
\r
229 ge_dbgE("calloc failed!");
\r
230 goto GE_LOCAL_FAILED;
\r
232 item->image_info = image_info;
\r
234 if (image_meta_clone(&(image_info->image_h), image_handle) != MEDIA_CONTENT_ERROR_NONE) {
\r
235 ge_dbgE("Clone image handle error");
\r
236 goto GE_LOCAL_FAILED;
\r
239 if (image_meta_get_media_id(image_handle, &(image_info->media_uuid)) != MEDIA_CONTENT_ERROR_NONE) {
\r
240 ge_dbgE("Get image id error");
\r
241 goto GE_LOCAL_FAILED;
\r
244 if (image_meta_get_orientation(image_handle, &(image_info->orientation)) != 0) {
\r
245 ge_dbgE("Get image orientation error");
\r
246 goto GE_LOCAL_FAILED;
\r
249 if (image_meta_destroy(image_handle) != MEDIA_CONTENT_ERROR_NONE) {
\r
250 ge_dbgE("Destroy image handle error");
\r
251 goto GE_LOCAL_FAILED;
\r
253 } else if (item->type == MEDIA_CONTENT_TYPE_VIDEO) {
\r
254 ret = media_info_get_video(media, &video_handle);
\r
255 if (ret != MEDIA_CONTENT_ERROR_NONE || video_handle == NULL) {
\r
256 ge_dbgE("Failed to get video handle[%d]!", ret);
\r
257 goto GE_LOCAL_FAILED;
\r
260 video_info = (ge_video_s *)calloc(1, sizeof(ge_video_s));
\r
261 if (NULL == video_info) {
\r
262 goto GE_LOCAL_FAILED;
\r
265 item->video_info = video_info;
\r
266 if (video_meta_clone(&(video_info->video_h), video_handle) != MEDIA_CONTENT_ERROR_NONE) {
\r
267 ge_dbgE("Clone video handle error");
\r
268 goto GE_LOCAL_FAILED;
\r
270 if (video_meta_get_media_id(video_handle, &(video_info->media_uuid)) != MEDIA_CONTENT_ERROR_NONE) {
\r
271 ge_dbgE("Get video id error");
\r
272 goto GE_LOCAL_FAILED;
\r
274 if (video_meta_get_title(video_handle, &(video_info->title)) != MEDIA_CONTENT_ERROR_NONE) {
\r
275 ge_dbgE("Get video title error");
\r
276 goto GE_LOCAL_FAILED;
\r
278 if (video_meta_get_duration(video_handle, &(video_info->duration)) != MEDIA_CONTENT_ERROR_NONE) {
\r
279 ge_dbgE("Get video duration error");
\r
280 goto GE_LOCAL_FAILED;
\r
282 if (video_meta_get_played_time(video_handle, &(video_info->last_played_pos)) != MEDIA_CONTENT_ERROR_NONE) {
\r
283 ge_dbgE("Get video last played position error");
\r
284 goto GE_LOCAL_FAILED;
\r
287 if (video_meta_destroy(video_handle) != MEDIA_CONTENT_ERROR_NONE) {
\r
288 ge_dbgE("Destroy video handle error");
\r
289 goto GE_LOCAL_FAILED;
\r
292 /* Get bookmar elist in case of video */
\r
293 if (video_info->media_uuid) {
\r
294 video_info->bookmarks = 0;
\r
296 ret = media_info_get_bookmark_count_from_db(video_info->media_uuid,
\r
299 if (ret != MEDIA_CONTENT_ERROR_NONE)
\r
300 ge_dbgE("Failed to get bookmark[%d]", ret);
\r
302 video_info->bookmarks = count;
\r
308 if (tmp_data->album_id)
\r
309 item->album_uuid = strdup(tmp_data->album_id);
\r
311 item->album_uuid = NULL;
\r
313 *elist = eina_list_append(*elist, item);
\r
319 image_meta_destroy(image_handle);
\r
321 video_meta_destroy(video_handle);
\r
323 _ge_data_type_free_geitem((void **)(&item));
\r
327 int _ge_local_data_connect(void)
\r
331 ret = media_content_connect();
\r
332 if(ret == MEDIA_CONTENT_ERROR_NONE) {
\r
333 ge_dbg("DB connection is success");
\r
336 ge_dbgE("DB connection is failed!");
\r
341 int _ge_local_data_disconnect(void)
\r
345 ret = media_content_disconnect();
\r
346 if(ret == MEDIA_CONTENT_ERROR_NONE) {
\r
347 ge_dbg("DB disconnection is success");
\r
350 ge_dbgE("DB disconnection is failed!");
\r
355 int _ge_local_data_get_album_list(ge_filter_s *condition, Eina_List **elilst)
\r
357 GE_CHECK_VAL(elilst, -1);
\r
358 GE_CHECK_VAL(condition, -1);
\r
360 filter_h filter = NULL;
\r
362 ret = __ge_local_data_create_filter(condition, &filter);
\r
364 ge_dbgE("Create filter failed[%d]!", ret);
\r
368 filter_h media_filter = NULL;
\r
369 ge_filter_s media_condition;
\r
370 memset(&media_condition, 0x00, sizeof(ge_filter_s));
\r
371 g_strlcpy(media_condition.cond, GE_CONDITION_IMAGE_VIDEO,
\r
373 media_condition.sort_type = MEDIA_CONTENT_ORDER_DESC;
\r
374 g_strlcpy(media_condition.sort_keyword, MEDIA_MODIFIED_TIME,
\r
376 media_condition.collate_type = MEDIA_CONTENT_COLLATE_DEFAULT;
\r
377 media_condition.offset = -1;
\r
378 media_condition.count = -1;
\r
379 media_condition.with_meta = false;
\r
381 ret = __ge_local_data_create_filter(&media_condition, &media_filter);
\r
383 __ge_local_data_destroy_filter(filter);
\r
384 ge_dbgE("Create filter failed[%d]!", ret);
\r
388 ge_transfer_data_s tran_data;
\r
389 memset(&tran_data, 0x00, sizeof(ge_transfer_data_s));
\r
390 tran_data.userdata = (void **)elilst;
\r
391 tran_data.filter = media_filter;
\r
392 tran_data.album_id = NULL;
\r
393 tran_data.with_meta = false;
\r
395 ge_dbg("Get folders--start");
\r
396 ret = media_folder_foreach_folder_from_db(filter,
\r
397 __ge_local_data_get_album_list_cb,
\r
399 ge_dbg("Get folders--over");
\r
401 __ge_local_data_destroy_filter(media_filter);
\r
402 __ge_local_data_destroy_filter(filter);
\r
404 if (ret != MEDIA_CONTENT_ERROR_NONE) {
\r
405 ge_dbgE("Get folders failed[%d]!", ret);
\r
412 int _ge_local_data_get_media_count(const char *cluster_id, ge_filter_s *condition,
\r
414 GE_CHECK_VAL(cluster_id, -1);
\r
415 GE_CHECK_VAL(condition, -1);
\r
416 GE_CHECK_VAL(item_cnt, -1);
\r
418 filter_h filter = NULL;
\r
420 ret = __ge_local_data_create_filter(condition, &filter);
\r
422 ge_dbgE("Create filter failed[%d]!", ret);
\r
426 ge_dbg("Get media count--start");
\r
427 ret = media_folder_get_media_count_from_db(cluster_id, filter,
\r
429 ge_dbg("Get media count--over");
\r
431 __ge_local_data_destroy_filter(filter);
\r
433 if (ret != MEDIA_CONTENT_ERROR_NONE) {
\r
434 ge_dbgE("Get media count failed[d]!", ret);
\r
441 int _ge_local_data_get_all_media_count(ge_filter_s *condtion, int *item_cnt)
\r
443 GE_CHECK_VAL(condtion, -1);
\r
444 GE_CHECK_VAL(item_cnt, -1);
\r
446 filter_h filter = NULL;
\r
448 ret = __ge_local_data_create_filter(condtion, &filter);
\r
450 ge_dbgE("Create filter failed[%d]!", ret);
\r
454 ge_dbg("Get media count--start");
\r
455 ret = media_info_get_media_count_from_db(filter, item_cnt);
\r
456 ge_dbg("Get media count--over");
\r
458 __ge_local_data_destroy_filter(filter);
\r
460 if (ret != MEDIA_CONTENT_ERROR_NONE) {
\r
461 ge_dbgE("Get media count failed[d]!", ret);
\r
468 int _ge_local_data_get_media(const char *media_id, ge_media_s **mitem)
\r
470 GE_CHECK_VAL(mitem, -1);
\r
472 if (media_id == NULL) {
\r
473 ge_dbg("Create a empty media");
\r
474 _ge_data_type_new_media(mitem);
\r
479 Eina_List *list = NULL;
\r
480 ge_media_s *_mitem = NULL;
\r
483 ge_dbg("media id: %s", media_id);
\r
484 media_info_h media_h = NULL;
\r
486 ret = media_info_get_media_from_db(media_id, &media_h);
\r
487 if (ret != MEDIA_CONTENT_ERROR_NONE) {
\r
488 ge_dbgE("Get media handle failed[%d]!", ret);
\r
492 ge_transfer_data_s tran_data;
\r
493 memset(&tran_data, 0x00, sizeof(ge_transfer_data_s));
\r
494 tran_data.userdata = (void **)&list;
\r
495 tran_data.filter = NULL;
\r
496 tran_data.album_id = NULL;
\r
497 tran_data.with_meta = false;
\r
499 ge_dbg("Get media list--start");
\r
500 bool b_ret = __ge_local_data_get_media_list_cb(media_h, &tran_data);
\r
501 ge_dbg("Get media list--over");
\r
503 media_info_destroy(media_h);
\r
505 if (b_ret && list) {
\r
506 *mitem = eina_list_nth(list, 0);
\r
510 ge_dbgE("Failed to get media list!");
\r
514 /* Free other items */
\r
516 int len = eina_list_count(list);
\r
517 ge_dbg("len: %d", len);
\r
519 for(; i < len; i++) {
\r
520 _mitem = eina_list_nth(list, i);
\r
521 _ge_data_type_free_geitem((void **)(&_mitem));
\r
524 eina_list_free(list);
\r
530 int _ge_local_data_get_album_media_list(char *album_id, ge_filter_s *condition,
\r
533 GE_CHECK_VAL(elist, -1);
\r
534 GE_CHECK_VAL(album_id, -1);
\r
535 GE_CHECK_VAL(condition, -1);
\r
537 filter_h filter = NULL;
\r
539 ret = __ge_local_data_create_filter(condition, &filter);
\r
541 ge_dbgE("Create filter failed!");
\r
545 ge_transfer_data_s tran_data;
\r
546 memset(&tran_data, 0x00, sizeof(ge_transfer_data_s));
\r
547 tran_data.userdata = (void **)elist;
\r
548 tran_data.filter = NULL;
\r
549 tran_data.album_id = album_id;
\r
550 tran_data.with_meta = condition->with_meta;
\r
552 ge_dbg("Get medias--start");
\r
553 ret = media_folder_foreach_media_from_db(album_id, filter,
\r
554 __ge_local_data_get_media_list_cb,
\r
556 ge_dbg("Get medias--over");
\r
558 __ge_local_data_destroy_filter(filter);
\r
560 if (ret != MEDIA_CONTENT_ERROR_NONE) {
\r
561 ge_dbgE("Get medias failed[d]!", ret);
\r
568 int _ge_local_data_get_all_albums_media_list(ge_filter_s *condition,
\r
571 GE_CHECK_VAL(elist, -1);
\r
572 GE_CHECK_VAL(condition, -1);
\r
574 filter_h filter = NULL;
\r
576 ret = __ge_local_data_create_filter(condition, &filter);
\r
578 ge_dbgE("Create filter failed!");
\r
582 ge_transfer_data_s tran_data;
\r
583 memset(&tran_data, 0x00, sizeof(ge_transfer_data_s));
\r
584 tran_data.userdata = (void **)elist;
\r
585 tran_data.filter = NULL;
\r
586 tran_data.album_id = NULL;
\r
587 tran_data.with_meta = condition->with_meta;
\r
589 ge_dbg("Get all medias--start");
\r
590 ret = media_info_foreach_media_from_db(filter,
\r
591 __ge_local_data_get_media_list_cb,
\r
593 ge_dbg("Get all medias--over");
\r
595 __ge_local_data_destroy_filter(filter);
\r
597 if (ret != MEDIA_CONTENT_ERROR_NONE) {
\r
598 ge_dbgE("Get all medias failed[d]!", ret);
\r