summaryrefslogtreecommitdiff
path: root/src/data/mediadata.c
diff options
context:
space:
mode:
authorJehun Lim <jehun.lim@samsung.com>2015-06-25 10:59:09 +0900
committerJehun Lim <jehun.lim@samsung.com>2015-06-26 13:44:53 +0900
commit2ed28c4a6d51095df454ae2ef7f9be1264d5e816 (patch)
treec933c765b49e759ed2a60d8766c731e35a2a9d95 /src/data/mediadata.c
parentc797c6a1d5df48baf0692feff3dcdb3c2de22190 (diff)
downloadair_mediahub-2ed28c4a6d51095df454ae2ef7f9be1264d5e816.tar.gz
air_mediahub-2ed28c4a6d51095df454ae2ef7f9be1264d5e816.tar.bz2
air_mediahub-2ed28c4a6d51095df454ae2ef7f9be1264d5e816.zip
data: add mediadata for creating media list
Change-Id: I65a5626abcbdbe5d62c93367cbbf51bbfbb9ce65 Signed-off-by: Jehun Lim <jehun.lim@samsung.com>
Diffstat (limited to 'src/data/mediadata.c')
-rw-r--r--src/data/mediadata.c246
1 files changed, 246 insertions, 0 deletions
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 <Elementary.h>
+#include <media_content.h>
+#include <app_debug.h>
+#include <app_media.h>
+
+#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);
+}