From 2ed28c4a6d51095df454ae2ef7f9be1264d5e816 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Thu, 25 Jun 2015 10:59:09 +0900 Subject: [PATCH] data: add mediadata for creating media list Change-Id: I65a5626abcbdbe5d62c93367cbbf51bbfbb9ce65 Signed-off-by: Jehun Lim --- CMakeLists.txt | 1 + include/data/mediadata.h | 40 ++++++++ src/data/mediadata.c | 246 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 287 insertions(+) create mode 100644 include/data/mediadata.h create mode 100644 src/data/mediadata.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 27ecebe..15adc8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,6 +55,7 @@ src/layout/gallery.c src/layout/music.c src/util/gridmgr.c src/util/controller.c +src/data/mediadata.c ) SET(TARGET_EDJ "${PROJECT_NAME}.edj") diff --git a/include/data/mediadata.h b/include/data/mediadata.h new file mode 100644 index 0000000..59431b4 --- /dev/null +++ b/include/data/mediadata.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _AIR_MEDIAHUB_MEDIADATA_H__ +#define _AIR_MEDIAHUB_MEDIADATA_H__ + +#include + +struct mediadata; + +enum source_type { + E_SOURCE_INTERNAL = 0, + E_SOURCE_EXTERNAL, + E_SOURCE_ALL, + E_SOURCE_MAX +}; + +struct folderdata { + char *name; + time_t modified_time; + Eina_List *list; +}; + +struct mediadata *mediadata_create(const char *media_type, int source_type); +void mediadata_destroy(struct mediadata *md); + +#endif /* _AIR_MEDIAHUB_MEDIADATA_H__ */ diff --git a/src/data/mediadata.c b/src/data/mediadata.c new file mode 100644 index 0000000..ce8858c --- /dev/null +++ b/src/data/mediadata.c @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +#include "data/mediadata.h" + +enum _filter_type { + E_FILTER_FOLDER = 0, + E_FILTER_MEDIA +}; + +struct mediadata { + Eina_List *list; +}; + +struct _data { + const char *media_type; + int source_type; + Eina_List *item_list; + Eina_List *folder_list; +}; + +static bool _create_filter(struct _data *data, filter_h *filter, int type) +{ + filter_h tmp_filter; + int ret; + char buf[1024]; + + ret = media_filter_create(&tmp_filter); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to create media filter"); + return false; + } + + snprintf(buf, sizeof(buf), "%s", data->media_type); + + if (type == E_FILTER_FOLDER && data->source_type != E_SOURCE_ALL) { + char s[64]; + + snprintf(s, sizeof(s), " AND MEDIA_STORAGE_TYPE=%d", + data->source_type); + strcat(buf, s); + } + + media_filter_set_condition(tmp_filter, buf, + MEDIA_CONTENT_COLLATE_DEFAULT); + media_filter_set_order(tmp_filter, MEDIA_CONTENT_ORDER_DESC, + MEDIA_MODIFIED_TIME, MEDIA_CONTENT_COLLATE_NOCASE); + + *filter = tmp_filter; + + return true; +} + +static void _destroy_medialist(Eina_List *list) +{ + struct folderdata *fd; + app_media *am; + + EINA_LIST_FREE(list, fd) { + free(fd->name); + EINA_LIST_FREE(fd->list, am) + app_media_destroy(am); + fd->list = NULL; + } +} + +static bool _get_each_media_info(media_info_h media_h, void *dt) +{ + app_media *am; + struct _data *data; + + if (!dt) + return false; + + data = dt; + + am = app_media_create(media_h); + if (!am) { + _ERR("failed to create app media"); + return false; + } + + data->item_list = eina_list_append(data->item_list, am); + + return true; +} + +static bool _get_each_folder_info(media_folder_h folder, void *dt) +{ + filter_h filter; + struct _data *data; + struct folderdata *fd; + int ret; + char *uuid; + + if (!dt) + return false; + + data = dt; + + fd = calloc(1, sizeof(*fd)); + if (!fd) { + _ERR("failed to create folderdata"); + return false; + } + + if (media_folder_get_name(folder, &(fd->name)) + != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Media folder id Fetch error"); + goto err; + } + + if (media_folder_get_modified_time(folder, &(fd->modified_time)) + != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Media folder modified time Fetch error"); + goto err; + } + + if (media_folder_get_folder_id(folder, &uuid) + != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to fetch media folder id"); + goto err; + } + + if (!_create_filter(data, &filter, E_FILTER_MEDIA)) { + _ERR("failed to create filter"); + goto err; + } + + ret = media_folder_foreach_media_from_db(uuid, filter, + _get_each_media_info, data); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to get media info"); + goto err; + } + + fd->list = data->item_list; + data->item_list = NULL; + + data->folder_list = eina_list_append(data->folder_list, fd); + + media_filter_destroy(filter); + free(uuid); + + return true; + +err: + media_filter_destroy(filter); + free(uuid); + _destroy_medialist(data->folder_list); + return false; +} + +static bool _get_medialist(struct _data *data) +{ + filter_h filter; + int ret; + + if (!_create_filter(data, &filter, E_FILTER_FOLDER)) { + _ERR("failed to create filter"); + return false; + } + + ret = media_folder_foreach_folder_from_db(filter, + _get_each_folder_info, data); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to get folder info"); + media_filter_destroy(filter); + return false; + } + + media_filter_destroy(filter); + + return true; +} + +struct mediadata *mediadata_create(const char *media_type, int source_type) +{ + struct mediadata *md; + struct _data data; + int ret; + + if (!media_type || source_type < 0 || source_type >= E_SOURCE_MAX) { + _ERR("invalid argument"); + return NULL; + } + + md = calloc(1, sizeof(*md)); + if (!md) { + _ERR("failed to create mediadata"); + return NULL; + } + + ret = media_content_connect(); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to connect to media content"); + free(md); + return NULL; + } + + data.media_type = media_type; + data.source_type = source_type; + data.item_list = NULL; + data.folder_list = NULL; + + if (!_get_medialist(&data)) { + _ERR("failed to get medialist"); + free(md); + media_content_disconnect(); + return NULL; + } + + media_content_disconnect(); + + md->list = data.folder_list; + + return md; +} + +void mediadata_destroy(struct mediadata *md) +{ + if (!md) { + _ERR("failed to get mediadata"); + return; + } + + _destroy_medialist(md->list); +} -- 2.7.4