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))
418 } else if (type == MEDIA_CONTENT_TYPE_VIDEO) {
419 minfo = new CVideoInfo;
421 _ERR("MediaInfo Create Failed");
424 ((CVideoInfo *)minfo)->Create();
426 if (!m_HandleEachVideoInfo(media_h, minfo))
430 minfo->SetType(type);
432 if (media_info_get_media_id(media_h, &buf) !=
433 MEDIA_CONTENT_ERROR_NONE) {
434 _ERR("Media ID Fetch error");
439 if (media_info_get_display_name(media_h, &buf) !=
440 MEDIA_CONTENT_ERROR_NONE) {
441 _ERR("Media display nam))e Fetch error");
446 if (media_info_get_size(media_h, &val) !=
447 MEDIA_CONTENT_ERROR_NONE) {
448 _ERR("Media size Fetch error");
453 if (media_info_get_file_path(media_h, &buf)
454 != MEDIA_CONTENT_ERROR_NONE) {
455 _ERR("Media file path Fetch error");
460 if (media_info_get_thumbnail_path(media_h, &buf) !=
461 MEDIA_CONTENT_ERROR_NONE) {
462 _ERR("Media thumbnail path Fetch error");
465 minfo->SetThumbnailPath(buf);
467 if (media_info_get_modified_time(media_h, (time_t *)&val) !=
468 MEDIA_CONTENT_ERROR_NONE) {
469 _ERR("Media modified time Fetch error");
472 minfo->SetModifiedTime(val);
474 if (media_info_get_modified_time(media_h, (time_t *)&val) !=
475 MEDIA_CONTENT_ERROR_NONE) {
476 _ERR("Media created time Fetch error");
479 minfo->SetCreatedTime(val);
481 if (media_info_get_location_tag(media_h, &buf) !=
482 MEDIA_CONTENT_ERROR_NONE) {
483 _ERR("Media location tag Fetch error");
486 minfo->SetLocationTag(buf);
488 if (media_info_get_storage_type(media_h,
489 (media_content_storage_e *)&val) !=
490 MEDIA_CONTENT_ERROR_NONE) {
491 _ERR("Media location tag Fetch error");
494 minfo->SetSource(val);
496 minfo->SetMediaInfo(media_h);
498 m->folder_medialist = eina_list_append(m->folder_medialist, minfo);
503 _ERR("Erroring in reading mediadata");
505 if (type == MEDIA_CONTENT_TYPE_IMAGE)
506 ((CImageInfo *)minfo)->Destroy();
507 else if (type == MEDIA_CONTENT_TYPE_VIDEO)
508 ((CVideoInfo *)minfo)->Destroy();
515 bool CMediadata::sm_CbEachFolderInfo(media_folder_h folder, void *dt)
517 CMediadata *root = (CMediadata *)dt;
522 return root->m_HandleEachFolderInfo(folder);
525 bool CMediadata::m_HandleEachFolderInfo(media_folder_h folder)
534 finfo = new CFolderInfo;
538 _ERR("FolderInfo Create Failed");
544 m_CreateFilter(&filter, E_FILTER_TYPE_NONE);
546 if (media_folder_get_name(folder, &buf) !=
547 MEDIA_CONTENT_ERROR_NONE) {
548 _ERR("Media folder id Fetch error");
553 if (media_folder_get_modified_time(folder, (time_t *)&val)
554 != MEDIA_CONTENT_ERROR_NONE) {
555 _ERR("Media folder modified time Fetch error");
558 finfo->SetModifiedTime(val);
560 if (media_folder_get_folder_id(folder, &uuid)
561 != MEDIA_CONTENT_ERROR_NONE) {
562 _ERR("Media folder id Fetch error");
566 ret = media_folder_foreach_media_from_db(uuid, filter,
567 sm_CbEachMediaInfo, (void *)this);
568 if (ret != MEDIA_CONTENT_ERROR_NONE) {
569 if (ret == MEDIA_CONTENT_ERROR_DB_FAILED)
570 _ERR("MEDIA CONTENT ERROR DB FAILED");
571 else if (ret == MEDIA_CONTENT_ERROR_DB_BUSY)
572 _ERR("MEDIA CONTENT ERROR DB BUSY");
574 _ERR("MEDIA CONTENT ERROR GENERAL");
578 finfo->SetMediaList(m->folder_medialist);
581 m_DeleteMediaList(E_TYPE_FOLDER_MEDIA);
583 m->folderlist = eina_list_append(m->folderlist, finfo);
585 m_DestroyFilter(filter);
591 _ERR("Error in creating Media list");
592 m_DestroyFilter(filter);
601 bool CMediadata::Initialize(void)
605 if (g_ref_count > 0) {
610 instance = new CMediadata;
614 instance->m = new SMediadata;
616 _ERR("Mediadata init failed");
622 ret = media_content_connect();
623 if (ret != MEDIA_CONTENT_ERROR_NONE) {
624 _ERR("Media Content Connect Failed");
633 void CMediadata::Finalize(void)
635 if (!instance || !instance->m)
640 if (g_ref_count <= 0)
645 if (g_ref_count == 0) {
646 instance->m_DeleteFolderList();
647 instance->m_DeleteEventList();
648 instance->m_DeleteMediaList(E_TYPE_MEDIA);
649 instance->m_DeleteMediaList(E_TYPE_FOLDER_MEDIA);
651 ret = media_content_disconnect();
652 if (ret != MEDIA_CONTENT_ERROR_NONE)
653 _ERR("Media Content Connect Failed");
662 CMediadata *CMediadata::GetInstance()
667 bool CMediadata::CreateMediaList(int source_type, int media)
671 m->source_type = source_type;
674 m_CreateFilter(&m->filter, E_FILTER_TYPE_FOLDER);
676 ret = media_folder_foreach_folder_from_db(m->filter,
677 sm_CbEachFolderInfo, (void *)this);
678 if (ret != MEDIA_CONTENT_ERROR_NONE) {
679 _ERR("Failed to read from folders");
680 m_DestroyFilter(m->filter);
687 m_DestroyFilter(m->filter);
692 CMediaInfo *CMediadata::FindMediaInfo(Eina_List *media_list, const char *path)
698 if (!media_list || !path)
702 EINA_LIST_FOREACH(media_list, l, obj) {
703 minfo = (CMediaInfo *)obj;
705 if (!strcmp(minfo->Path(), path))
712 Eina_List *CMediadata::CreateListforType(Eina_List *media_list, int type)
714 Eina_List *l, *new_list;
722 EINA_LIST_FOREACH(media_list, l, obj) {
723 minfo = (CMediaInfo *)obj;
725 if (type == minfo->Type())
726 new_list = eina_list_append(new_list, minfo);
732 Eina_List *CMediadata::MediaList(void)
740 Eina_List *CMediadata::EventList(void)
748 Eina_List *CMediadata::FolderList(void)
753 return m->folderlist;