summaryrefslogtreecommitdiff
path: root/src/data/mediadata.c
diff options
context:
space:
mode:
authorMinkyu Kang <mk7.kang@samsung.com>2015-07-08 09:54:13 +0900
committerMinkyu Kang <mk7.kang@samsung.com>2015-07-08 09:54:13 +0900
commit1814c4e8d86c1245b452aa30bf14b06e035ebb16 (patch)
tree98d427ed41577b7d9ec4132e9e251af052e6d444 /src/data/mediadata.c
parent5d09fa160d078a397d5381c30a819d6efdb56cce (diff)
downloadair_mediahub-1814c4e8d86c1245b452aa30bf14b06e035ebb16.tar.gz
air_mediahub-1814c4e8d86c1245b452aa30bf14b06e035ebb16.tar.bz2
air_mediahub-1814c4e8d86c1245b452aa30bf14b06e035ebb16.zip
use content time instead of modified time when sorting list
Change-Id: Ia41c816932c184250e03e541425cc6ad42bdd06f Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
Diffstat (limited to 'src/data/mediadata.c')
-rw-r--r--src/data/mediadata.c72
1 files changed, 51 insertions, 21 deletions
diff --git a/src/data/mediadata.c b/src/data/mediadata.c
index 16504bb..554c72f 100644
--- a/src/data/mediadata.c
+++ b/src/data/mediadata.c
@@ -22,6 +22,7 @@
#include "data/mediadata.h"
typedef int (*media_compare)(struct group_info *gi, app_media_info *info);
+typedef void *(*media_compare_data_get)(app_media_info *info);
typedef char *(*group_name_get)(app_media_info *info);
static int _compare_cb_date(const void *, const void *);
@@ -29,8 +30,10 @@ 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 *);
-static int _compare_modified_time(struct group_info *, app_media_info *);
-static char *_get_modified_time(app_media_info *);
+static void *_get_data_title(app_media_info *info);
+static int _compare_time(struct group_info *, app_media_info *);
+static char *_get_time(app_media_info *);
+static void *_get_data_time(app_media_info *info);
enum _filter_type {
E_FILTER_FOLDER = 0,
@@ -59,6 +62,7 @@ struct _sort_info {
struct _list_info {
media_compare media_cmp;
+ media_compare_data_get data_get;
group_name_get name_get;
};
@@ -79,10 +83,12 @@ static struct _list_info g_list_info[E_LIST_MAX] = {
[E_LIST_NAME] = {
.media_cmp = _compare_title,
.name_get = _get_title,
+ .data_get = _get_data_title,
},
[E_LIST_DATE] = {
- .media_cmp = _compare_modified_time,
- .name_get = _get_modified_time,
+ .media_cmp = _compare_time,
+ .name_get = _get_time,
+ .data_get = _get_data_time,
}
};
@@ -121,23 +127,29 @@ static bool _create_filter(struct _data *data, filter_h *filter, int type)
return true;
}
-static char *_get_date_string(time_t time)
+static char *_get_date_string(struct tm *tm)
{
- struct tm tm;
char buf[32];
- localtime_r(&time, &tm);
- strftime(buf, sizeof(buf), "%Y.%m.%d", &tm);
+ strftime(buf, sizeof(buf), "%Y.%m.%d", tm);
return strdup(buf);
}
static int _compare_title(struct group_info *gi, app_media_info *info)
{
- if (!gi || !gi->name || !info->title)
+ if (!gi || !gi->data || !info->title)
return -1;
- return strncasecmp(gi->name, info->title, 1);
+ return strncasecmp(gi->data, info->title, 1);
+}
+
+static void *_get_data_title(app_media_info *info)
+{
+ if (!info->title)
+ return NULL;
+
+ return strdup(info->title);
}
static char *_get_title(app_media_info *info)
@@ -148,32 +160,45 @@ static char *_get_title(app_media_info *info)
return strndup(info->title, 1);
}
-static int _compare_modified_time(struct group_info *gi, app_media_info *info)
+static int _compare_time(struct group_info *gi, app_media_info *info)
{
- char *date;
- int r;
+ struct tm *tm;
- if (!gi || !gi->name)
+ if (!gi || !gi->data)
return -1;
- date = _get_date_string(info->modified_time);
+ tm = gi->data;
- r = strcasecmp(gi->name, date);
+ if (tm->tm_year == info->content_time->tm_year &&
+ tm->tm_yday == info->content_time->tm_yday)
+ return 0;
- free(date);
+ return 1;
+}
- return r;
+static void *_get_data_time(app_media_info *info)
+{
+ struct tm *tm;
+
+ tm = calloc(1, sizeof(*tm));
+ if (!tm)
+ return NULL;
+
+ memcpy(tm, info->content_time, sizeof(*tm));
+
+ return tm;
}
-static char *_get_modified_time(app_media_info *info)
+static char *_get_time(app_media_info *info)
{
- return _get_date_string(info->modified_time);
+ return _get_date_string(info->content_time);
}
static int _compare_cb_date(const void *data1, const void *data2)
{
app_media *am1, *am2;
app_media_info *info1, *info2;
+ time_t tm1, tm2;
am1 = (app_media *)data1;
am2 = (app_media *)data2;
@@ -184,7 +209,10 @@ static int _compare_cb_date(const void *data1, const void *data2)
if (!info1 || !info2)
return -1;
- if (info1->modified_time < info2->modified_time)
+ tm1 = mktime(info1->content_time);
+ tm2 = mktime(info2->content_time);
+
+ if (tm1 < tm2)
return 1;
return -1;
@@ -429,6 +457,7 @@ Eina_List *mediadata_get_list(struct mediadata *md, int list_type)
}
gi->name = g_list_info[list_type].name_get(info);
+ gi->data = g_list_info[list_type].data_get(info);
list = eina_list_append(list, gi);
}
@@ -446,6 +475,7 @@ void mediadata_free_list(Eina_List *list)
EINA_LIST_FOREACH(list, l, gi) {
free(gi->name);
+ free(gi->data);
eina_list_free(gi->list);
free(gi);