#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)
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);
}
}
{
filter_h filter;
struct _data *data;
- struct folderdata *fd;
+ struct folder_info *fi;
int ret;
char *uuid;
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;
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);
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;
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;
}
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;
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;
}
return;
}
- _destroy_medialist(md->list);
+ _destroy_folderlist(md->folder_list);
+ eina_list_free(md->media_list);
}