data: add mediadata for creating media list 58/42258/5
authorJehun Lim <jehun.lim@samsung.com>
Thu, 25 Jun 2015 01:59:09 +0000 (10:59 +0900)
committerJehun Lim <jehun.lim@samsung.com>
Fri, 26 Jun 2015 04:44:53 +0000 (13:44 +0900)
Change-Id: I65a5626abcbdbe5d62c93367cbbf51bbfbb9ce65
Signed-off-by: Jehun Lim <jehun.lim@samsung.com>
CMakeLists.txt
include/data/mediadata.h [new file with mode: 0644]
src/data/mediadata.c [new file with mode: 0644]

index 27ecebe..15adc8e 100644 (file)
@@ -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 (file)
index 0000000..59431b4
--- /dev/null
@@ -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 <stdbool.h>
+
+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 (file)
index 0000000..ce8858c
--- /dev/null
@@ -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);
+}