2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <Elementary.h>
18 #include <media_content.h>
19 #include <app_debug.h>
20 #include <app_media.h>
22 #include "data/mediadata.h"
24 typedef int (*media_compare)(struct group_info *gi, app_media_info *info);
25 typedef char *(*group_name_get)(app_media_info *info);
27 static int _compare_cb_date(const void *, const void *);
28 static int _compare_cb_name(const void *, const void *);
30 static int _compare_title(struct group_info *, app_media_info *);
31 static char *_get_title(app_media_info *);
32 static int _compare_modified_time(struct group_info *, app_media_info *);
33 static char *_get_modified_time(app_media_info *);
41 Eina_List *folder_list;
42 Eina_List *media_list;
46 const char *media_type;
50 Eina_List *folder_list;
51 Eina_List *media_list;
56 const char *order_keyword;
61 media_compare media_cmp;
62 group_name_get name_get;
65 static struct _sort_info g_sort_info[E_SORT_MAX] = {
67 .order_type = MEDIA_CONTENT_ORDER_DESC,
68 .order_keyword = MEDIA_MODIFIED_TIME,
69 .func = _compare_cb_date,
72 .order_type = MEDIA_CONTENT_ORDER_ASC,
73 .order_keyword = MEDIA_TITLE,
74 .func = _compare_cb_name,
78 static struct _list_info g_list_info[E_LIST_MAX] = {
80 .media_cmp = _compare_title,
81 .name_get = _get_title,
84 .media_cmp = _compare_modified_time,
85 .name_get = _get_modified_time,
89 static bool _create_filter(struct _data *data, filter_h *filter, int type)
95 ret = media_filter_create(&tmp_filter);
96 if (ret != MEDIA_CONTENT_ERROR_NONE) {
97 _ERR("failed to create media filter");
101 snprintf(buf, sizeof(buf), "%s", data->media_type);
103 if (type == E_FILTER_FOLDER && data->source_type != E_SOURCE_ALL) {
106 snprintf(s, sizeof(s), " AND MEDIA_STORAGE_TYPE=%d",
111 media_filter_set_condition(tmp_filter, buf,
112 MEDIA_CONTENT_COLLATE_DEFAULT);
114 media_filter_set_order(tmp_filter,
115 g_sort_info[data->sort_type].order_type,
116 g_sort_info[data->sort_type].order_keyword,
117 MEDIA_CONTENT_COLLATE_NOCASE);
119 *filter = tmp_filter;
124 static char *_get_date_string(time_t time)
129 localtime_r(&time, &tm);
130 strftime(buf, sizeof(buf), "%Y.%m.%d", &tm);
135 static int _compare_title(struct group_info *gi, app_media_info *info)
137 if (!gi || !gi->name || !info->title)
140 return strncasecmp(gi->name, info->title, 1);
143 static char *_get_title(app_media_info *info)
148 return strndup(info->title, 1);
151 static int _compare_modified_time(struct group_info *gi, app_media_info *info)
156 if (!gi || !gi->name)
159 date = _get_date_string(info->modified_time);
161 r = strcasecmp(gi->name, date);
168 static char *_get_modified_time(app_media_info *info)
170 return _get_date_string(info->modified_time);
173 static int _compare_cb_date(const void *data1, const void *data2)
175 app_media *am1, *am2;
176 app_media_info *info1, *info2;
178 am1 = (app_media *)data1;
179 am2 = (app_media *)data2;
181 info1 = app_media_get_info(am1);
182 info2 = app_media_get_info(am2);
184 if (!info1 || !info2)
187 if (info1->modified_time < info2->modified_time)
193 static int _compare_cb_name(const void *data1, const void *data2)
195 app_media *am1, *am2;
196 app_media_info *info1, *info2;
198 am1 = (app_media *)data1;
199 am2 = (app_media *)data2;
201 info1 = app_media_get_info(am1);
202 info2 = app_media_get_info(am2);
204 if (!info1 || !info2 || !info1->display_name || !info2->display_name)
207 return strcasecmp(info1->display_name, info2->display_name);
210 static Eina_List *_sort_list(Eina_List *list, int sort)
212 Eina_List *sorted_list;
214 sorted_list = eina_list_sort(list, 0, g_sort_info[sort].func);
219 static void _destroy_folderlist(Eina_List *list)
221 struct group_info *gi;
224 EINA_LIST_FREE(list, gi) {
226 EINA_LIST_FREE(gi->list, am)
227 app_media_destroy(am);
232 static bool _get_each_media_info(media_info_h media_h, void *dt)
242 am = app_media_create(media_h);
244 _ERR("failed to create app media");
248 data->item_list = eina_list_append(data->item_list, am);
253 static bool _get_each_folder_info(media_folder_h folder, void *dt)
257 struct group_info *gi;
266 gi = calloc(1, sizeof(*gi));
268 _ERR("failed to create folderdata");
272 if (media_folder_get_name(folder, &(gi->name))
273 != MEDIA_CONTENT_ERROR_NONE) {
274 _ERR("Media folder id Fetch error");
278 if (media_folder_get_folder_id(folder, &uuid)
279 != MEDIA_CONTENT_ERROR_NONE) {
280 _ERR("failed to fetch media folder id");
284 if (!_create_filter(data, &filter, E_FILTER_MEDIA)) {
285 _ERR("failed to create filter");
289 ret = media_folder_foreach_media_from_db(uuid, filter,
290 _get_each_media_info, data);
291 if (ret != MEDIA_CONTENT_ERROR_NONE) {
292 _ERR("failed to get media info");
296 gi->list = eina_list_clone(data->item_list);
297 data->media_list = eina_list_merge(data->media_list, data->item_list);
298 data->item_list = NULL;
300 data->folder_list = eina_list_append(data->folder_list, gi);
302 media_filter_destroy(filter);
308 media_filter_destroy(filter);
310 _destroy_folderlist(data->folder_list);
314 static bool _get_folderlist(struct _data *data)
319 if (!_create_filter(data, &filter, E_FILTER_FOLDER)) {
320 _ERR("failed to create filter");
324 ret = media_folder_foreach_folder_from_db(filter,
325 _get_each_folder_info, data);
326 if (ret != MEDIA_CONTENT_ERROR_NONE) {
327 _ERR("failed to get folder info");
328 media_filter_destroy(filter);
332 media_filter_destroy(filter);
337 struct mediadata *mediadata_create(const char *media_type,
338 int source_type, int sort_type)
340 struct mediadata *md;
344 if (!media_type || source_type < 0 || source_type >= E_SOURCE_MAX
345 || sort_type < 0 || sort_type >= E_SORT_MAX) {
346 _ERR("invalid argument");
350 md = calloc(1, sizeof(*md));
352 _ERR("failed to create mediadata");
356 ret = media_content_connect();
357 if (ret != MEDIA_CONTENT_ERROR_NONE) {
358 _ERR("failed to connect to media content");
363 data.media_type = media_type;
364 data.source_type = source_type;
365 data.sort_type = sort_type;
366 data.item_list = NULL;
367 data.folder_list = NULL;
368 data.media_list = NULL;
370 if (!_get_folderlist(&data)) {
371 _ERR("failed to get folderlist");
373 media_content_disconnect();
377 media_content_disconnect();
379 md->folder_list = data.folder_list;
380 md->media_list = _sort_list(data.media_list, data.sort_type);
385 void mediadata_destroy(struct mediadata *md)
388 _ERR("failed to get mediadata");
392 _destroy_folderlist(md->folder_list);
393 eina_list_free(md->media_list);
396 Eina_List *mediadata_get_list(struct mediadata *md, int list_type)
399 struct group_info *gi;
401 app_media_info *info;
404 _ERR("failed to get mediadata");
408 if (list_type < 0 || list_type >= E_LIST_MAX) {
409 _ERR("invalid argument");
415 EINA_LIST_FOREACH(md->media_list, l, am) {
416 info = app_media_get_info(am);
418 _ERR("failed to get media info");
419 mediadata_free_list(list);
423 if (g_list_info[list_type].media_cmp(gi, info)) {
424 gi = calloc(1, sizeof(*gi));
426 _ERR("failed to create group info");
427 mediadata_free_list(list);
431 gi->name = g_list_info[list_type].name_get(info);
433 list = eina_list_append(list, gi);
436 gi->list = eina_list_append(gi->list, am);
442 void mediadata_free_list(Eina_List *list)
445 struct group_info *gi;
447 EINA_LIST_FOREACH(list, l, gi) {
449 eina_list_free(gi->list);