mediadata: add media_list in struct mediadata 86/42586/3
authorJehun Lim <jehun.lim@samsung.com>
Tue, 30 Jun 2015 10:13:30 +0000 (19:13 +0900)
committerJehun Lim <jehun.lim@samsung.com>
Wed, 1 Jul 2015 04:45:22 +0000 (13:45 +0900)
Change-Id: I68f640f2782fb64abdcb8d49e854acda316fcaee
Signed-off-by: Jehun Lim <jehun.lim@samsung.com>
include/data/mediadata.h
src/data/mediadata.c

index 59431b4..0715cc8 100644 (file)
@@ -28,13 +28,20 @@ enum source_type {
        E_SOURCE_MAX
 };
 
-struct folderdata {
+enum sort_type {
+       E_SORT_DATE = 0,
+       E_SORT_NAME,
+       E_SORT_MAX
+};
+
+struct folder_info {
        char *name;
        time_t modified_time;
        Eina_List *list;
 };
 
-struct mediadata *mediadata_create(const char *media_type, int source_type);
+struct mediadata *mediadata_create(const char *media_type,
+                       int source_type, int sort_type);
 void mediadata_destroy(struct mediadata *md);
 
 #endif /* _AIR_MEDIAHUB_MEDIADATA_H__ */
index ce8858c..abef770 100644 (file)
 
 #include "data/mediadata.h"
 
+static int _compare_cb_date(const void *, const void *);
+static int _compare_cb_name(const void *, const void *);
+
 enum _filter_type {
        E_FILTER_FOLDER = 0,
        E_FILTER_MEDIA
 };
 
 struct mediadata {
-       Eina_List *list;
+       Eina_List *folder_list;
+       Eina_List *media_list;
 };
 
 struct _data {
        const char *media_type;
        int source_type;
+       int sort_type;
        Eina_List *item_list;
        Eina_List *folder_list;
+       Eina_List *media_list;
+};
+
+struct _sort_info {
+       int order_type;
+       const char *order_keyword;
+       Eina_Compare_Cb func;
+};
+
+static struct _sort_info g_sort_info[E_SORT_MAX] = {
+       [E_SORT_DATE] = {
+               .order_type = MEDIA_CONTENT_ORDER_DESC,
+               .order_keyword = MEDIA_MODIFIED_TIME,
+               .func = _compare_cb_date,
+       },
+       [E_SORT_NAME] = {
+               .order_type = MEDIA_CONTENT_ORDER_ASC,
+               .order_keyword = MEDIA_TITLE,
+               .func = _compare_cb_name
+       }
 };
 
 static bool _create_filter(struct _data *data, filter_h *filter, int type)
@@ -61,24 +86,73 @@ static bool _create_filter(struct _data *data, filter_h *filter, int type)
 
        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);
+
+       media_filter_set_order(tmp_filter,
+                       g_sort_info[data->sort_type].order_type,
+                       g_sort_info[data->sort_type].order_keyword,
+                       MEDIA_CONTENT_COLLATE_NOCASE);
 
        *filter = tmp_filter;
 
        return true;
 }
 
-static void _destroy_medialist(Eina_List *list)
+static int _compare_cb_date(const void *data1, const void *data2)
+{
+       app_media *am1, *am2;
+       app_media_info *info1, *info2;
+
+       am1 = (app_media *)data1;
+       am2 = (app_media *)data2;
+
+       info1 = app_media_get_info(am1);
+       info2 = app_media_get_info(am2);
+
+       if (!info1 || !info2)
+               return -1;
+
+       if (info1->modified_time > info2->modified_time)
+               return 1;
+
+       return -1;
+}
+
+static int _compare_cb_name(const void *data1, const void *data2)
+{
+       app_media *am1, *am2;
+       app_media_info *info1, *info2;
+
+       am1 = (app_media *)data1;
+       am2 = (app_media *)data2;
+
+       info1 = app_media_get_info(am1);
+       info2 = app_media_get_info(am2);
+
+       if (!info1 || !info2 || !info1->display_name || !info2->display_name)
+               return -1;
+
+       return strcasecmp(info1->display_name, info2->display_name);
+}
+
+static Eina_List *_sort_list(Eina_List *list, int sort)
+{
+       Eina_List *sorted_list;
+
+       sorted_list = eina_list_sort(list, 0, g_sort_info[sort].func);
+
+       return sorted_list;
+}
+
+static void _destroy_folderlist(Eina_List *list)
 {
-       struct folderdata *fd;
+       struct folder_info *fi;
        app_media *am;
 
-       EINA_LIST_FREE(list, fd) {
-               free(fd->name);
-               EINA_LIST_FREE(fd->list, am)
+       EINA_LIST_FREE(list, fi) {
+               free(fi->name);
+               EINA_LIST_FREE(fi->list, am)
                        app_media_destroy(am);
-               fd->list = NULL;
+               free(fi);
        }
 }
 
@@ -107,7 +181,7 @@ static bool _get_each_folder_info(media_folder_h folder, void *dt)
 {
        filter_h filter;
        struct _data *data;
-       struct folderdata *fd;
+       struct folder_info *fi;
        int ret;
        char *uuid;
 
@@ -116,19 +190,19 @@ static bool _get_each_folder_info(media_folder_h folder, void *dt)
 
        data = dt;
 
-       fd = calloc(1, sizeof(*fd));
-       if (!fd) {
+       fi = calloc(1, sizeof(*fi));
+       if (!fi) {
                _ERR("failed to create folderdata");
                return false;
        }
 
-       if (media_folder_get_name(folder, &(fd->name))
+       if (media_folder_get_name(folder, &(fi->name))
                        != MEDIA_CONTENT_ERROR_NONE) {
                _ERR("Media folder id Fetch error");
                goto err;
        }
 
-       if (media_folder_get_modified_time(folder, &(fd->modified_time))
+       if (media_folder_get_modified_time(folder, &(fi->modified_time))
                        != MEDIA_CONTENT_ERROR_NONE) {
                _ERR("Media folder modified time Fetch error");
                goto err;
@@ -152,10 +226,11 @@ static bool _get_each_folder_info(media_folder_h folder, void *dt)
                goto err;
        }
 
-       fd->list = data->item_list;
+       fi->list = eina_list_clone(data->item_list);
+       data->media_list = eina_list_merge(data->media_list, data->item_list);
        data->item_list = NULL;
 
-       data->folder_list = eina_list_append(data->folder_list, fd);
+       data->folder_list = eina_list_append(data->folder_list, fi);
 
        media_filter_destroy(filter);
        free(uuid);
@@ -165,11 +240,11 @@ static bool _get_each_folder_info(media_folder_h folder, void *dt)
 err:
        media_filter_destroy(filter);
        free(uuid);
-       _destroy_medialist(data->folder_list);
+       _destroy_folderlist(data->folder_list);
        return false;
 }
 
-static bool _get_medialist(struct _data *data)
+static bool _get_folderlist(struct _data *data)
 {
        filter_h filter;
        int ret;
@@ -192,13 +267,15 @@ static bool _get_medialist(struct _data *data)
        return true;
 }
 
-struct mediadata *mediadata_create(const char *media_type, int source_type)
+struct mediadata *mediadata_create(const char *media_type,
+                       int source_type, int sort_type)
 {
        struct mediadata *md;
        struct _data data;
        int ret;
 
-       if (!media_type || source_type < 0 || source_type >= E_SOURCE_MAX) {
+       if (!media_type || source_type < 0 || source_type >= E_SOURCE_MAX
+               || sort_type < 0 || sort_type >= E_SORT_MAX) {
                _ERR("invalid argument");
                return NULL;
        }
@@ -218,11 +295,13 @@ struct mediadata *mediadata_create(const char *media_type, int source_type)
 
        data.media_type = media_type;
        data.source_type = source_type;
+       data.sort_type = sort_type;
        data.item_list = NULL;
        data.folder_list = NULL;
+       data.media_list = NULL;
 
-       if (!_get_medialist(&data)) {
-               _ERR("failed to get medialist");
+       if (!_get_folderlist(&data)) {
+               _ERR("failed to get folderlist");
                free(md);
                media_content_disconnect();
                return NULL;
@@ -230,7 +309,8 @@ struct mediadata *mediadata_create(const char *media_type, int source_type)
 
        media_content_disconnect();
 
-       md->list = data.folder_list;
+       md->folder_list = data.folder_list;
+       md->media_list = _sort_list(data.media_list, data.sort_type);
 
        return md;
 }
@@ -242,5 +322,6 @@ void mediadata_destroy(struct mediadata *md)
                return;
        }
 
-       _destroy_medialist(md->list);
+       _destroy_folderlist(md->folder_list);
+       eina_list_free(md->media_list);
 }