2 * Copyright (c) 2000-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <media_content.h>
20 #include <media_info.h>
23 #include "ge-data-util.h"
24 #include "ge-local-data.h"
27 static bool __ge_local_data_clone_album(media_folder_h folder, bool b_path,
30 GE_CHECK_FALSE(folder);
31 GE_CHECK_FALSE(palbum);
32 ge_album_s *album = NULL;
34 album = (ge_album_s *)calloc(1, sizeof(ge_album_s));
36 ge_dbgE("Failed to calloc!");
39 album->gtype = GE_TYPE_ALBUM;
42 if (media_folder_get_path(folder, &(album->path)) != MEDIA_CONTENT_ERROR_NONE) {
43 ge_dbgE("Get folder path failed!");
47 if (media_folder_get_folder_id(folder, &(album->uuid)) != MEDIA_CONTENT_ERROR_NONE) {
48 ge_dbgE("Get folder id failed!");
51 if (media_folder_get_modified_time(folder, &(album->mtime)) != MEDIA_CONTENT_ERROR_NONE) {
52 ge_dbgE("Get modified time failed!");
56 media_content_storage_e storage_type;
57 if (media_folder_get_storage_type(folder, &storage_type) != MEDIA_CONTENT_ERROR_NONE) {
58 ge_dbgE("Get storage type failed!");
62 if (storage_type == MEDIA_CONTENT_STORAGE_INTERNAL) { /* The device's internal storage */
63 album->type = GE_PHONE;
64 } else if (storage_type == MEDIA_CONTENT_STORAGE_EXTERNAL) { /* The device's external storage */
67 ge_dbgE("Undefined mode[%d]!", storage_type);
70 if (media_folder_get_name(folder, &(album->display_name)) != MEDIA_CONTENT_ERROR_NONE) {
71 ge_dbgE("Get folder name failed!");
80 _ge_data_type_free_geitem((void **)(&album));
85 static bool __ge_local_data_get_album_list_cb(media_folder_h folder,
89 ge_transfer_data_s *tmp_data = (ge_transfer_data_s *)data;
90 GE_CHECK_FALSE(tmp_data->userdata);
91 GE_CHECK_FALSE(folder);
92 Eina_List **elist = (Eina_List **)(tmp_data->userdata);
93 ge_album_s *album = NULL;
96 if (media_folder_get_path(folder, &path) != MEDIA_CONTENT_ERROR_NONE) {
97 ge_dbgE("Get folder path failed!");
100 GE_CHECK_FALSE(path);
102 if (tmp_data->list_type != GE_ALBUM_LIST_PATH) {
103 if (!g_strcmp0(GE_CAMERA_PATH_PHONE, path) ||
104 !g_strcmp0(GE_CAMERA_PATH_MMC, path) ||
105 !g_strcmp0(GE_DOWNLOADS_PATH, path)) {
106 ge_dbgW("Camera or Downloads!");
112 __ge_local_data_clone_album(folder, false, &album);
115 ge_dbgE("Failed clone album!");
120 *elist = eina_list_append(*elist, album);
124 static bool __ge_local_data_get_media_list_cb(media_info_h media, void *data)
126 GE_CHECK_FALSE(data);
127 ge_transfer_data_s *td = (ge_transfer_data_s *)data;
128 GE_CHECK_FALSE(td->userdata);
129 GE_CHECK_FALSE(media);
130 ge_media_s *item = NULL;
132 Eina_List **elist = (Eina_List **)(td->userdata);
134 if (_ge_data_util_clone_media(media, &item, td->with_meta)) {
135 *elist = eina_list_append(*elist, item);
142 static bool __ge_local_data_get_cover_cb(media_info_h media, void *data)
144 GE_CHECK_FALSE(data);
145 GE_CHECK_FALSE(media);
146 Eina_List **elist = (Eina_List **)data;
147 ge_media_s *item = NULL;
149 item = (ge_media_s *)calloc(1, sizeof(ge_media_s));
150 GE_CHECK_FALSE(item);
151 item->gtype = GE_TYPE_MEDIA;
153 if (media_info_clone(&(item->media_h), media) != MEDIA_CONTENT_ERROR_NONE) {
154 ge_dbgE("Clone media handle error");
155 goto GE_LOCAL_FAILED;
157 if (media_info_get_file_path(media, &(item->file_url)) != MEDIA_CONTENT_ERROR_NONE) {
158 ge_dbgE("Get media file path error");
159 goto GE_LOCAL_FAILED;
161 if (media_info_get_media_type(media, (media_content_type_e *)&(item->type)) != MEDIA_CONTENT_ERROR_NONE) {
162 ge_dbgE("Get media type error");
163 goto GE_LOCAL_FAILED;
165 if (media_info_get_thumbnail_path(media, &(item->thumb_url)) != MEDIA_CONTENT_ERROR_NONE) {
166 ge_dbgE("Get media thumbnail path error");
167 goto GE_LOCAL_FAILED;
169 ge_sdbg("thumb_url: %s", item->thumb_url);
170 *elist = eina_list_append(*elist, item);
175 _ge_data_type_free_geitem((void **)(&item));
179 int _ge_local_data_connect(void)
183 ret = media_content_connect();
184 if (ret == MEDIA_CONTENT_ERROR_NONE) {
185 ge_dbg("DB connection is success");
188 ge_dbgE("DB connection is failed!");
193 int _ge_local_data_disconnect(void)
197 ret = media_content_disconnect();
198 if (ret == MEDIA_CONTENT_ERROR_NONE) {
199 ge_dbg("DB disconnection is success");
202 ge_dbgE("DB disconnection is failed!");
207 int _ge_local_data_get_media_by_id(char *media_id, ge_media_s **mitem)
209 GE_CHECK_VAL(mitem, -1);
211 if (media_id == NULL) {
212 //ge_dbg("Create a empty media");
213 _ge_data_type_new_media(mitem);
218 Eina_List *list = NULL;
219 ge_media_s *_mitem = NULL;
220 media_info_h media_h = NULL;
222 ge_sdbg("media id: %s", media_id);
224 ret = media_info_get_media_from_db(media_id, &media_h);
225 if (ret != MEDIA_CONTENT_ERROR_NONE || media_h == NULL) {
226 ge_dbgE("Failed to get media handle[%d]!", ret);
228 media_info_destroy(media_h);
232 ge_transfer_data_s tran_data;
233 memset(&tran_data, 0x00, sizeof(ge_transfer_data_s));
234 tran_data.userdata = (void **)&list;
235 tran_data.album_id = NULL;
236 tran_data.with_meta = false;
238 bool b_ret = __ge_local_data_get_media_list_cb(media_h, &tran_data);
240 media_info_destroy(media_h);
243 *mitem = eina_list_nth(list, 0);
247 ge_dbgE("Failed to get media list!");
251 /* Free other items */
253 int len = eina_list_count(list);
254 ge_dbg("len: %d", len);
256 for (; i < len; i++) {
257 _mitem = eina_list_nth(list, i);
258 _ge_data_type_free_geitem((void **)(&_mitem));
261 eina_list_free(list);
267 int _ge_local_data_get_album_by_path(char *path, ge_album_s **album)
269 GE_CHECK_VAL(path, -1);
270 GE_CHECK_VAL(album, -1);
272 Eina_List *list = NULL;
273 ge_filter_s condition;
274 ge_album_s *_item = NULL;
277 if (strlen(path) <=0) {
278 ge_dbgE("Invalid path!");
281 ge_dbg("path: %s", path);
283 memset(&condition, 0x00, sizeof(ge_filter_s));
284 condition.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;
285 condition.sort_type = MEDIA_CONTENT_ORDER_DESC;
286 condition.offset = -1;
287 condition.count = -1;
288 condition.with_meta = false;
289 condition.list_type = GE_ALBUM_LIST_PATH;
291 snprintf(condition.cond, CONDITION_LENGTH, "%s AND %s=\'%s\'",
292 GE_CONDITION_IMAGE_VIDEO, FOLDER_PATH, path);
294 ret = _ge_local_data_get_album_list(&condition, &list);
295 if (ret != 0 || NULL == list) {
296 ge_dbgE("Failed to get album list[%d]!", ret);
298 } else if (NULL != list) {
299 *album = eina_list_nth(list, 0);
304 /* Free other items */
306 int len = eina_list_count(list);
307 ge_dbg("len: %d", len);
309 for (; i < len; i++) {
310 _item = eina_list_nth(list, i);
311 _ge_data_type_free_geitem((void **)(&_item));
314 eina_list_free(list);
320 int _ge_local_data_get_album_list(ge_filter_s *condition, Eina_List **elilst)
322 GE_CHECK_VAL(elilst, -1);
323 GE_CHECK_VAL(condition, -1);
325 filter_h filter = NULL;
327 ret = _ge_data_util_create_filter(condition, &filter);
329 ge_dbgE("Create filter failed[%d]!", ret);
333 ge_transfer_data_s tran_data;
334 memset(&tran_data, 0x00, sizeof(ge_transfer_data_s));
335 tran_data.userdata = (void **)elilst;
336 tran_data.album_id = NULL;
337 tran_data.with_meta = false;
338 tran_data.list_type = condition->list_type;
340 ge_dbg("Get folders--start");
341 ret = media_folder_foreach_folder_from_db(filter,
342 __ge_local_data_get_album_list_cb,
344 ge_dbg("Get folders--over");
346 _ge_data_util_destroy_filter(filter);
348 if (ret != MEDIA_CONTENT_ERROR_NONE) {
349 ge_dbgE("Get folders failed[%d]!", ret);
356 int _ge_local_data_get_media_count(const char *cluster_id, ge_filter_s *condition,
359 GE_CHECK_VAL(cluster_id, -1);
360 GE_CHECK_VAL(condition, -1);
361 GE_CHECK_VAL(item_cnt, -1);
363 filter_h filter = NULL;
365 ret = _ge_data_util_create_filter(condition, &filter);
367 ge_dbgE("Create filter failed[%d]!", ret);
371 ge_dbg("Get media count--start");
372 ret = media_folder_get_media_count_from_db(cluster_id, filter,
374 ge_dbg("Get media count--over");
376 _ge_data_util_destroy_filter(filter);
378 if (ret != MEDIA_CONTENT_ERROR_NONE) {
379 ge_dbgE("Get media count failed[d]!", ret);
386 int _ge_local_data_get_all_media_count(ge_filter_s *condtion, int *item_cnt)
388 GE_CHECK_VAL(condtion, -1);
389 GE_CHECK_VAL(item_cnt, -1);
391 filter_h filter = NULL;
393 ret = _ge_data_util_create_filter(condtion, &filter);
395 ge_dbgE("Create filter failed[%d]!", ret);
399 ge_dbg("Get media count--start");
400 ret = media_info_get_media_count_from_db(filter, item_cnt);
401 ge_dbg("Get media count--over");
403 _ge_data_util_destroy_filter(filter);
405 if (ret != MEDIA_CONTENT_ERROR_NONE) {
406 ge_dbgE("Get media count failed[d]!", ret);
413 int _ge_local_data_get_media(const char *media_id, ge_media_s **mitem)
415 GE_CHECK_VAL(mitem, -1);
417 if (media_id == NULL) {
418 ge_dbg("Create a empty media");
419 _ge_data_type_new_media(mitem);
424 Eina_List *list = NULL;
425 ge_media_s *_mitem = NULL;
428 ge_sdbg("media id: %s", media_id);
429 media_info_h media_h = NULL;
431 ret = media_info_get_media_from_db(media_id, &media_h);
432 if (ret != MEDIA_CONTENT_ERROR_NONE) {
433 ge_dbgE("Get media handle failed[%d]!", ret);
435 media_info_destroy(media_h);
439 ge_transfer_data_s tran_data;
440 memset(&tran_data, 0x00, sizeof(ge_transfer_data_s));
441 tran_data.userdata = (void **)&list;
442 tran_data.album_id = NULL;
443 tran_data.with_meta = false;
445 ge_dbg("Get media list--start");
446 bool b_ret = __ge_local_data_get_media_list_cb(media_h, &tran_data);
447 ge_dbg("Get media list--over");
449 media_info_destroy(media_h);
452 *mitem = eina_list_nth(list, 0);
456 ge_dbgE("Failed to get media list!");
460 /* Free other items */
462 int len = eina_list_count(list);
463 ge_dbg("len: %d", len);
465 for (; i < len; i++) {
466 _mitem = eina_list_nth(list, i);
467 _ge_data_type_free_geitem((void **)(&_mitem));
470 eina_list_free(list);
476 int _ge_local_data_get_album_cover(char *album_id, ge_filter_s *condition,
479 GE_CHECK_VAL(elist, -1);
480 GE_CHECK_VAL(album_id, -1);
481 GE_CHECK_VAL(condition, -1);
483 filter_h filter = NULL;
485 ret = _ge_data_util_create_filter(condition, &filter);
487 ge_dbgE("Create filter failed!");
491 ge_dbg("Get medias--start");
492 ret = media_folder_foreach_media_from_db(album_id, filter,
493 __ge_local_data_get_cover_cb,
495 ge_dbg("Get medias--over");
497 _ge_data_util_destroy_filter(filter);
499 if (ret != MEDIA_CONTENT_ERROR_NONE) {
500 ge_dbgE("Get medias failed[d]!", ret);
507 int _ge_local_data_get_all_albums_cover(ge_filter_s *condition,
510 GE_CHECK_VAL(elist, -1);
511 GE_CHECK_VAL(condition, -1);
513 filter_h filter = NULL;
515 ret = _ge_data_util_create_filter(condition, &filter);
517 ge_dbgE("Create filter failed!");
521 ge_dbg("Get all medias--start");
522 ret = media_info_foreach_media_from_db(filter,
523 __ge_local_data_get_cover_cb,
525 ge_dbg("Get all medias--over");
527 _ge_data_util_destroy_filter(filter);
529 if (ret != MEDIA_CONTENT_ERROR_NONE) {
530 ge_dbgE("Get all medias failed[d]!", ret);
537 int _ge_local_data_get_album_media_list(char *album_id, ge_filter_s *condition,
540 GE_CHECK_VAL(elist, -1);
541 GE_CHECK_VAL(album_id, -1);
542 GE_CHECK_VAL(condition, -1);
544 filter_h filter = NULL;
546 ret = _ge_data_util_create_filter(condition, &filter);
548 ge_dbgE("Create filter failed!");
552 ge_transfer_data_s tran_data;
553 memset(&tran_data, 0x00, sizeof(ge_transfer_data_s));
554 tran_data.userdata = (void **)elist;
555 tran_data.album_id = album_id;
556 tran_data.with_meta = condition->with_meta;
558 ge_dbg("Get medias--start");
559 ret = media_folder_foreach_media_from_db(album_id, filter,
560 __ge_local_data_get_media_list_cb,
562 ge_dbg("Get medias--over");
564 _ge_data_util_destroy_filter(filter);
566 if (ret != MEDIA_CONTENT_ERROR_NONE) {
567 ge_dbgE("Get medias failed[d]!", ret);
574 int _ge_local_data_get_all_albums_media_list(ge_filter_s *condition,
577 GE_CHECK_VAL(elist, -1);
578 GE_CHECK_VAL(condition, -1);
580 filter_h filter = NULL;
582 ret = _ge_data_util_create_filter(condition, &filter);
584 ge_dbgE("Create filter failed!");
588 ge_transfer_data_s tran_data;
589 memset(&tran_data, 0x00, sizeof(ge_transfer_data_s));
590 tran_data.userdata = (void **)elist;
591 tran_data.album_id = NULL;
592 tran_data.with_meta = condition->with_meta;
594 ge_dbg("Get all medias--start");
595 ret = media_info_foreach_media_from_db(filter,
596 __ge_local_data_get_media_list_cb,
598 ge_dbg("Get all medias--over");
600 _ge_data_util_destroy_filter(filter);
602 if (ret != MEDIA_CONTENT_ERROR_NONE) {
603 ge_dbgE("Get all medias failed[d]!", ret);
610 int _ge_local_data_get_album_by_id(char *album_id, ge_album_s **cluster)
612 GE_CHECK_VAL(cluster, -1);
613 GE_CHECK_VAL(album_id, -1);
614 media_folder_h folder_h = NULL;
616 if (media_folder_get_folder_from_db(album_id, &folder_h) != MEDIA_CONTENT_ERROR_NONE) {
617 ge_sdbgE("Failed to get album[%s]!", album_id);
619 media_folder_destroy(folder_h);
622 if (folder_h == NULL)
624 if (!__ge_local_data_clone_album(folder_h, true, cluster)) {
625 ge_sdbgE("Failed to clone album[%s]!", album_id);
626 media_folder_destroy(folder_h);
629 media_folder_destroy(folder_h);
633 int _ge_local_data_get_duration(media_info_h media, int *duration)
635 GE_CHECK_VAL(duration, -1);
636 GE_CHECK_VAL(media, -1);
637 video_meta_h video_handle = NULL;
640 ret = media_info_get_video(media, &video_handle);
641 if (ret != MEDIA_CONTENT_ERROR_NONE) {
642 ge_dbgE("Failed to get video handle[%d]!", ret);
646 ret = video_meta_get_duration(video_handle, duration);
647 if (ret != MEDIA_CONTENT_ERROR_NONE) {
648 ge_dbgE("Get video duration failed[%d]!", ret);
649 video_meta_destroy(video_handle);
653 video_meta_destroy(video_handle);