2 * Copyright (c) 2014 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 <AppCommon.h>
19 #include "mediainfo.h"
20 #include "eventinfo.h"
21 #include "folderinfo.h"
22 #include "imageinfo.h"
23 #include "videoinfo.h"
24 #include "mediadata.h"
28 #define MEDIA_CONDITION_IMAGE_VIDEO "(MEDIA_TYPE=0 OR MEDIA_TYPE=1)"
29 #define MEDIA_CONDITION_IMAGE "(MEDIA_TYPE=0)"
30 #define MEDIA_CONDITION_VIDEO "(MEDIA_TYPE=1)"
34 Eina_List *folderlist;
35 Eina_List *folder_medialist;
42 memset(this, 0, sizeof(SMediadata));
47 E_FILTER_TYPE_FOLDER = 0,
56 CMediadata *CMediadata::instance = NULL;
57 int CMediadata::g_ref_count = 0;
59 void CMediadata::m_DeleteFolderList(void)
65 EINA_LIST_FREE(m->folderlist, obj) {
66 finfo = (CFolderInfo *)obj;
74 void CMediadata::m_DeleteEventList(void)
80 EINA_LIST_FREE(m->eventlist, obj) {
81 einfo = (CEventInfo *)obj;
89 void CMediadata::m_DeleteMediaList(int type)
95 if (type == E_TYPE_MEDIA)
96 medialist = m->medialist;
97 else if (type == E_TYPE_FOLDER_MEDIA)
98 medialist = m->folder_medialist;
100 _ERR("Wrong MediaInfo Type");
105 EINA_LIST_FREE(medialist, obj) {
106 minfo = (CMediaInfo *)obj;
108 if (minfo->Type() == E_MEDIA_IMAGE)
109 ((CImageInfo *)minfo)->Destroy();
110 else if (minfo->Type() == E_MEDIA_VIDEO)
111 ((CVideoInfo *)minfo)->Destroy();
116 if (type == E_TYPE_MEDIA)
118 else if (type == E_TYPE_FOLDER_MEDIA)
119 m->folder_medialist = NULL;
122 void CMediadata::DestroyMediaList(void)
125 m_DeleteFolderList();
131 m_DeleteMediaList(E_TYPE_MEDIA);
133 if (m->folder_medialist)
134 m_DeleteMediaList(E_TYPE_FOLDER_MEDIA);
137 bool CMediadata::m_CreateFilter(filter_h *filter, int type)
140 media_content_order_e order;
143 const char *mediatype;
145 int ret = media_filter_create(&tmp_filter);
146 if (ret != MEDIA_CONTENT_ERROR_NONE) {
147 _ERR("Media Filter Creation Failed");
151 if (m->media == E_MEDIA_IMAGE)
152 mediatype = MEDIA_CONDITION_IMAGE;
153 else if (m->media == E_MEDIA_VIDEO)
154 mediatype = MEDIA_CONDITION_VIDEO;
156 mediatype = MEDIA_CONDITION_IMAGE_VIDEO;
158 switch (m->source_type) {
160 snprintf(buf, sizeof(buf), "%s AND (MEDIA_STORAGE_TYPE=0)",
165 snprintf(buf, sizeof(buf), "%s AND (MEDIA_STORAGE_TYPE=1)",
171 snprintf(buf, sizeof(buf), "%s", mediatype);
176 if (type == E_FILTER_TYPE_FOLDER) {
177 media_filter_set_condition(tmp_filter, buf,
178 MEDIA_CONTENT_COLLATE_DEFAULT);
181 media_filter_set_condition(tmp_filter,
183 MEDIA_CONTENT_COLLATE_DEFAULT);
186 order = MEDIA_CONTENT_ORDER_DESC;
187 keyword = MEDIA_MODIFIED_TIME;
189 media_filter_set_order(tmp_filter, order,
190 keyword, MEDIA_CONTENT_COLLATE_NOCASE);
192 *filter = tmp_filter;
197 bool CMediadata::m_DestroyFilter(filter_h filter)
199 if (media_filter_destroy(filter) != MEDIA_CONTENT_ERROR_NONE) {
200 _ERR("Filter destroy failed");
207 void CMediadata::m_GetMediaList(void)
209 CMediaInfo *minfo, *nminfo;
214 EINA_LIST_FOREACH(m->folder_medialist, l, obj) {
215 minfo = (CMediaInfo *)obj;
217 if (minfo->Type() == E_MEDIA_IMAGE) {
218 nminfo = new CImageInfo;
219 ((CImageInfo *)nminfo)->Create();
220 ((CImageInfo *)nminfo)->Duplicate(minfo);
221 } else if (minfo->Type() == E_MEDIA_VIDEO) {
222 nminfo = new CVideoInfo;
223 ((CVideoInfo *)nminfo)->Create();
224 ((CVideoInfo *)nminfo)->Duplicate(minfo);
227 m->medialist = eina_list_append(m->medialist, nminfo);
231 void CMediadata::m_GetEventList(void)
236 Eina_List *eventlist;
246 EINA_LIST_FOREACH(m->medialist, l1, obj) {
247 minfo = (CMediaInfo *)obj;
250 timeval = minfo->Time();
252 localtime_r(&timeval, &tm);
253 strftime(buf, sizeof(buf), "%Y.%m.%d", &tm);
254 date_taken = strdup(buf);
258 einfo = new CEventInfo;
263 einfo->SetType(E_TYPE_EVENT_NO_INFO);
264 einfo->SetName(NULL);
265 einfo->SetModifiedTime(0);
266 einfo->SetMediaInfo(minfo);
268 eventlist = eina_list_append(eventlist, einfo);
271 bevent_found = false;
272 EINA_LIST_FOREACH(eventlist, l2, obj2) {
273 einfo = (CEventInfo *)obj2;
275 if (!strcmp(einfo->Name(), date_taken)) {
276 einfo->SetMediaInfo(minfo);
283 einfo = new CEventInfo;
288 einfo->SetType(E_TYPE_EVENT_INFO);
289 einfo->SetName(date_taken);
290 einfo->SetModifiedTime(timeval);
291 einfo->SetMediaInfo(minfo);
293 eventlist = eina_list_append(eventlist, einfo);
299 m->eventlist = eventlist;
308 bool CMediadata::m_HandleEachImageInfo(media_info_h media_h, CMediaInfo *minfo)
311 image_meta_h image_h;
313 if (media_info_get_image(media_h, &image_h) !=
314 MEDIA_CONTENT_ERROR_NONE) {
315 _ERR("Media Image Handle Fetch Error");
319 if (image_meta_get_width(image_h, &val) !=
320 MEDIA_CONTENT_ERROR_NONE) {
321 _ERR("Image meta get width error");
324 ((CImageInfo *)minfo)->SetWidth(val);
326 if (image_meta_get_height(image_h, &val) !=
327 MEDIA_CONTENT_ERROR_NONE) {
328 _ERR("Image meta get height error");
331 ((CImageInfo *)minfo)->SetHeight(val);
333 if (image_meta_get_orientation(image_h,
334 (media_content_orientation_e *)&val) !=
335 MEDIA_CONTENT_ERROR_NONE) {
336 _ERR("Image meta get orientation error");
339 ((CImageInfo *)minfo)->SetOrientation(val);
341 if (image_meta_destroy(image_h) != MEDIA_CONTENT_ERROR_NONE) {
342 _ERR("Image meta destroy error");
349 bool CMediadata::m_HandleEachVideoInfo(media_info_h media_h, CMediaInfo *minfo)
352 video_meta_h video_h;
354 if (media_info_get_video(media_h, &video_h) !=
355 MEDIA_CONTENT_ERROR_NONE || !video_h) {
356 _ERR("Media video handle fetch error");
360 if (video_meta_get_duration(video_h, &val) !=
361 MEDIA_CONTENT_ERROR_NONE) {
362 _ERR("video meta get duration error");
365 ((CVideoInfo *)minfo)->SetDuration(val);
367 if (video_meta_get_played_position(video_h, &val) !=
368 MEDIA_CONTENT_ERROR_NONE) {
369 _ERR("video meta get played position error");
372 ((CVideoInfo *)minfo)->SetPlayedPosition(val);
374 if (video_meta_destroy(video_h) != MEDIA_CONTENT_ERROR_NONE) {
375 _ERR("video meta destroy error");
382 bool CMediadata::sm_CbEachMediaInfo(media_info_h media_h, void *dt)
384 CMediadata *root = (CMediadata *)dt;
389 return root->m_HandleEachMediaInfo(media_h);
392 bool CMediadata::m_HandleEachMediaInfo(media_info_h media_h)
397 unsigned long long val;
401 if (media_info_get_media_type(media_h,
402 (media_content_type_e *)&type) !=
403 MEDIA_CONTENT_ERROR_NONE) {
404 _ERR("Media type Fetch error");
408 if (type == MEDIA_CONTENT_TYPE_IMAGE) {
409 minfo = new CImageInfo;
411 _ERR("MediaInfo Create Failed");
414 ((CImageInfo *)minfo)->Create();
416 if (!m_HandleEachImageInfo(media_h, minfo))
419 else if (type == MEDIA_CONTENT_TYPE_VIDEO) {
420 minfo = new CVideoInfo;
422 _ERR("MediaInfo Create Failed");
425 ((CVideoInfo *)minfo)->Create();
427 if (!m_HandleEachVideoInfo(media_h, minfo))
431 minfo->SetType(type);
433 if (media_info_get_media_id(media_h, &buf) !=
434 MEDIA_CONTENT_ERROR_NONE) {
435 _ERR("Media ID Fetch error");
440 if (media_info_get_display_name(media_h, &buf) !=
441 MEDIA_CONTENT_ERROR_NONE) {
442 _ERR("Media display nam))e Fetch error");
447 if (media_info_get_size(media_h, &val) !=
448 MEDIA_CONTENT_ERROR_NONE) {
449 _ERR("Media size Fetch error");
454 if (media_info_get_file_path(media_h, &buf)
455 != MEDIA_CONTENT_ERROR_NONE) {
456 _ERR("Media file path Fetch error");
461 if (media_info_get_thumbnail_path(media_h, &buf) !=
462 MEDIA_CONTENT_ERROR_NONE) {
463 _ERR("Media thumbnail path Fetch error");
466 minfo->SetThumbnailPath(buf);
468 if (media_info_get_modified_time(media_h, (time_t *)&val) !=
469 MEDIA_CONTENT_ERROR_NONE) {
470 _ERR("Media modified time Fetch error");
473 minfo->SetModifiedTime(val);
475 if (media_info_get_modified_time(media_h, (time_t *)&val) !=
476 MEDIA_CONTENT_ERROR_NONE) {
477 _ERR("Media created time Fetch error");
480 minfo->SetCreatedTime(val);
482 if (media_info_get_location_tag(media_h, &buf) !=
483 MEDIA_CONTENT_ERROR_NONE) {
484 _ERR("Media location tag Fetch error");
487 minfo->SetLocationTag(buf);
489 if (media_info_get_storage_type(media_h,
490 (media_content_storage_e *)&val) !=
491 MEDIA_CONTENT_ERROR_NONE) {
492 _ERR("Media location tag Fetch error");
495 minfo->SetSource(val);
497 m->folder_medialist = eina_list_append(m->folder_medialist, minfo);
502 _ERR("Erroring in reading mediadata");
504 if (type == MEDIA_CONTENT_TYPE_IMAGE)
505 ((CImageInfo *)minfo)->Destroy();
506 else if (type == MEDIA_CONTENT_TYPE_VIDEO)
507 ((CVideoInfo *)minfo)->Destroy();
514 bool CMediadata::sm_CbEachFolderInfo(media_folder_h folder, void *dt)
516 CMediadata *root = (CMediadata *)dt;
521 return root->m_HandleEachFolderInfo(folder);
524 bool CMediadata::m_HandleEachFolderInfo(media_folder_h folder)
533 finfo = new CFolderInfo;
537 _ERR("FolderInfo Create Failed");
543 m_CreateFilter(&filter, E_FILTER_TYPE_NONE);
545 if (media_folder_get_name(folder, &buf) !=
546 MEDIA_CONTENT_ERROR_NONE) {
547 _ERR("Media folder id Fetch error");
552 if (media_folder_get_modified_time(folder, (time_t *)&val)
553 != MEDIA_CONTENT_ERROR_NONE) {
554 _ERR("Media folder modified time Fetch error");
557 finfo->SetModifiedTime(val);
559 if (media_folder_get_folder_id(folder, &uuid)
560 != MEDIA_CONTENT_ERROR_NONE) {
561 _ERR("Media folder id Fetch error");
565 ret = media_folder_foreach_media_from_db(uuid, filter,
566 sm_CbEachMediaInfo, (void *)this);
567 if (ret != MEDIA_CONTENT_ERROR_NONE) {
568 if (ret == MEDIA_CONTENT_ERROR_DB_FAILED)
569 _ERR("MEDIA CONTENT ERROR DB FAILED");
570 else if (ret == MEDIA_CONTENT_ERROR_DB_BUSY)
571 _ERR("MEDIA CONTENT ERROR DB BUSY");
573 _ERR("MEDIA CONTENT ERROR GENERAL");
577 finfo->SetMediaList(m->folder_medialist);
580 m_DeleteMediaList(E_TYPE_FOLDER_MEDIA);
582 m->folderlist = eina_list_append(m->folderlist, finfo);
584 m_DestroyFilter(filter);
590 _ERR("Error in creating Media list");
591 m_DestroyFilter(filter);
600 bool CMediadata::Initialize(void)
604 if (g_ref_count > 0) {
609 instance = new CMediadata;
613 instance->m = new SMediadata;
615 _ERR("Mediadata init failed");
621 ret = media_content_connect();
622 if (ret != MEDIA_CONTENT_ERROR_NONE) {
623 _ERR("Media Content Connect Failed");
632 void CMediadata::Finalize(void)
634 if (!instance || !instance->m)
639 if (g_ref_count <= 0)
644 if (g_ref_count == 0) {
645 instance->m_DeleteFolderList();
646 instance->m_DeleteEventList();
647 instance->m_DeleteMediaList(E_TYPE_MEDIA);
648 instance->m_DeleteMediaList(E_TYPE_FOLDER_MEDIA);
650 ret = media_content_disconnect();
651 if (ret != MEDIA_CONTENT_ERROR_NONE)
652 _ERR("Media Content Connect Failed");
661 CMediadata *CMediadata::GetInstance()
666 bool CMediadata::CreateMediaList(int source_type, int media)
670 m->source_type = source_type;
673 m_CreateFilter(&m->filter, E_FILTER_TYPE_FOLDER);
675 ret = media_folder_foreach_folder_from_db(m->filter,
676 sm_CbEachFolderInfo, (void *)this);
677 if (ret != MEDIA_CONTENT_ERROR_NONE) {
678 _ERR("Failed to read from folders");
679 m_DestroyFilter(m->filter);
686 m_DestroyFilter(m->filter);
691 CMediaInfo *CMediadata::FindMediaInfo(Eina_List *media_list, const char *path)
697 if (!media_list || !path)
701 EINA_LIST_FOREACH(media_list, l, obj) {
702 minfo = (CMediaInfo *)obj;
704 if (!strcmp(minfo->Path(), path))
711 Eina_List *CMediadata::CreateListforType(Eina_List *media_list, int type)
713 Eina_List *l, *new_list;
721 EINA_LIST_FOREACH(media_list, l, obj) {
722 minfo = (CMediaInfo *)obj;
724 if (type == minfo->Type())
725 new_list = eina_list_append(new_list, minfo);
731 Eina_List *CMediadata::MediaList(void)
739 Eina_List *CMediadata::EventList(void)
747 Eina_List *CMediadata::FolderList(void)
752 return m->folderlist;