From b81aa668ac86b55ccfcc5ac6d67c5a1a20487b61 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Wed, 1 Jul 2015 16:09:39 +0900 Subject: [PATCH] mediadata: add function to create list with media name Change-Id: Idbfeb52c19bd52deb461b2917e4ce546e664bf59 Signed-off-by: Jehun Lim --- include/data/mediadata.h | 11 ++++- src/data/mediadata.c | 123 ++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 114 insertions(+), 20 deletions(-) diff --git a/include/data/mediadata.h b/include/data/mediadata.h index 0715cc8..006eaac 100644 --- a/include/data/mediadata.h +++ b/include/data/mediadata.h @@ -34,9 +34,13 @@ enum sort_type { E_SORT_MAX }; -struct folder_info { +enum list_type { + E_LIST_NAME = 0, + E_LIST_MAX +}; + +struct group_info { char *name; - time_t modified_time; Eina_List *list; }; @@ -44,4 +48,7 @@ struct mediadata *mediadata_create(const char *media_type, int source_type, int sort_type); void mediadata_destroy(struct mediadata *md); +Eina_List *mediadata_get_list(struct mediadata *md, int list_type); +void mediadata_free_list(Eina_List *list); + #endif /* _AIR_MEDIAHUB_MEDIADATA_H__ */ diff --git a/src/data/mediadata.c b/src/data/mediadata.c index abef770..04556b0 100644 --- a/src/data/mediadata.c +++ b/src/data/mediadata.c @@ -21,9 +21,15 @@ #include "data/mediadata.h" +typedef int (*media_compare)(struct group_info *gi, app_media_info *info); +typedef char *(*group_name_get)(app_media_info *info); + static int _compare_cb_date(const void *, const void *); static int _compare_cb_name(const void *, const void *); +static int _compare_title(struct group_info *, app_media_info *); +static char *_get_title(app_media_info *); + enum _filter_type { E_FILTER_FOLDER = 0, E_FILTER_MEDIA @@ -49,6 +55,11 @@ struct _sort_info { Eina_Compare_Cb func; }; +struct _list_info { + media_compare media_cmp; + group_name_get name_get; +}; + static struct _sort_info g_sort_info[E_SORT_MAX] = { [E_SORT_DATE] = { .order_type = MEDIA_CONTENT_ORDER_DESC, @@ -58,7 +69,14 @@ static struct _sort_info g_sort_info[E_SORT_MAX] = { [E_SORT_NAME] = { .order_type = MEDIA_CONTENT_ORDER_ASC, .order_keyword = MEDIA_TITLE, - .func = _compare_cb_name + .func = _compare_cb_name, + } +}; + +static struct _list_info g_list_info[E_LIST_MAX] = { + [E_LIST_NAME] = { + .media_cmp = _compare_title, + .name_get = _get_title, } }; @@ -97,6 +115,22 @@ static bool _create_filter(struct _data *data, filter_h *filter, int type) return true; } +static int _compare_title(struct group_info *gi, app_media_info *info) +{ + if (!gi || !gi->name || !info->title) + return -1; + + return strncasecmp(gi->name, info->title, 1); +} + +static char *_get_title(app_media_info *info) +{ + if (!info->title) + return NULL; + + return strndup(info->title, 1); +} + static int _compare_cb_date(const void *data1, const void *data2) { app_media *am1, *am2; @@ -145,14 +179,14 @@ static Eina_List *_sort_list(Eina_List *list, int sort) static void _destroy_folderlist(Eina_List *list) { - struct folder_info *fi; + struct group_info *gi; app_media *am; - EINA_LIST_FREE(list, fi) { - free(fi->name); - EINA_LIST_FREE(fi->list, am) + EINA_LIST_FREE(list, gi) { + free(gi->name); + EINA_LIST_FREE(gi->list, am) app_media_destroy(am); - free(fi); + free(gi); } } @@ -181,7 +215,7 @@ static bool _get_each_folder_info(media_folder_h folder, void *dt) { filter_h filter; struct _data *data; - struct folder_info *fi; + struct group_info *gi; int ret; char *uuid; @@ -190,24 +224,18 @@ static bool _get_each_folder_info(media_folder_h folder, void *dt) data = dt; - fi = calloc(1, sizeof(*fi)); - if (!fi) { + gi = calloc(1, sizeof(*gi)); + if (!gi) { _ERR("failed to create folderdata"); return false; } - if (media_folder_get_name(folder, &(fi->name)) + if (media_folder_get_name(folder, &(gi->name)) != MEDIA_CONTENT_ERROR_NONE) { _ERR("Media folder id Fetch error"); goto err; } - if (media_folder_get_modified_time(folder, &(fi->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"); @@ -226,11 +254,11 @@ static bool _get_each_folder_info(media_folder_h folder, void *dt) goto err; } - fi->list = eina_list_clone(data->item_list); + gi->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, fi); + data->folder_list = eina_list_append(data->folder_list, gi); media_filter_destroy(filter); free(uuid); @@ -325,3 +353,62 @@ void mediadata_destroy(struct mediadata *md) _destroy_folderlist(md->folder_list); eina_list_free(md->media_list); } + +Eina_List *mediadata_get_list(struct mediadata *md, int list_type) +{ + Eina_List *list, *l; + struct group_info *gi; + app_media *am; + app_media_info *info; + + if (!md) { + _ERR("failed to get mediadata"); + return NULL; + } + + if (list_type < 0 || list_type >= E_LIST_MAX) { + _ERR("invalid argument"); + return NULL; + } + + gi = NULL; + list = NULL; + EINA_LIST_FOREACH(md->media_list, l, am) { + info = app_media_get_info(am); + if (!info) { + _ERR("failed to get media info"); + mediadata_free_list(list); + return NULL; + } + + if (g_list_info[list_type].media_cmp(gi, info)) { + gi = calloc(1, sizeof(*gi)); + if (!gi) { + _ERR("failed to create group info"); + mediadata_free_list(list); + return NULL; + } + + gi->name = g_list_info[list_type].name_get(info); + + list = eina_list_append(list, gi); + } + + gi->list = eina_list_append(gi->list, am); + } + + return list; +} + +void mediadata_free_list(Eina_List *list) +{ + Eina_List *l; + struct group_info *gi; + + EINA_LIST_FOREACH(list, l, gi) { + free(gi->name); + eina_list_free(gi->list); + + free(gi); + } +} -- 2.7.4