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.
21 #include <media_content.h>
26 #include "AppCommon.h"
28 #include "ExtNameInfo.h"
30 #include "DirectoryInfo.h"
31 #include "Mediadata.h"
32 #include "MediadataImpl.h"
34 struct SMediadataImpl {
42 bool CMediadataImpl::m_CreateFilter(int source_type, int media_type)
52 { E_TV, "(MEDIA_STORAGE_TYPE=0)" },
53 { E_USB, "(MEDIA_STORAGE_TYPE=1)" }
55 ASSERT(source_condn[E_ALL].source == E_ALL &&
56 source_condn[E_TV].source == E_TV &&
57 source_condn[E_USB].source == E_USB);
64 { E_GRP_PHOTO, "(MEDIA_TYPE=0)" },
65 { E_GRP_VIDEO, "(MEDIA_TYPE=1)" },
66 { E_GRP_MUSIC, "(MEDIA_TYPE=3)" }
68 ASSERT(media_condn[E_GRP_ALL].groups == E_GRP_ALL &&
69 media_condn[E_GRP_PHOTO].groups == E_GRP_PHOTO &&
70 media_condn[E_GRP_VIDEO].groups == E_GRP_VIDEO &&
71 media_condn[E_GRP_MUSIC].groups == E_GRP_MUSIC);
73 ret = media_filter_create(&m->filter);
74 if (ret != MEDIA_CONTENT_ERROR_NONE) {
75 _ERR("Media Filter Creation Failed");
79 _DBG("media: %d, source: %d", media_type, source_type);
80 if (media_type == E_GRP_ALL) {
81 if (source_type == E_ALL)
84 snprintf(buf, sizeof(buf), "%s", source_condn[source_type].string);
87 if (source_type == E_ALL)
88 snprintf(buf, sizeof(buf), "%s", media_condn[media_type].string);
90 snprintf(buf, sizeof(buf), "%s AND %s", source_condn[source_type].string, media_condn[media_type].string);
93 media_filter_set_condition(m->filter, buf, MEDIA_CONTENT_COLLATE_RTRIM);
98 void CMediadataImpl::m_DestroyFilter(filter_h filter)
103 int r = media_filter_destroy(filter);
104 ASSERT(r == MEDIA_CONTENT_ERROR_NONE);
107 bool CMediadataImpl::sm_CbMediaInfo(media_info_h media, void *dt)
109 CMediadataImpl* root = (CMediadataImpl*)dt;
113 ret = root->m_OnMediaInfo(media);
118 bool CMediadataImpl::m_OnMediaInfo(media_info_h media)
120 CFileInfo *pInfo = NULL;
123 _CHECK(pInfo = new CFileInfo)
124 _CHECK(pInfo->Create())
125 _CHECK(pInfo->SetLoadInfo(media))
126 _CHECK(pInfo->Load())
128 m->filelist = eina_list_append(m->filelist, pInfo);
132 _CHECK_FAIL{ pInfo->Destroy(); }
133 _CHECK_FAIL{ delete pInfo; pInfo = NULL; }
134 }_CREATE_END_AND_CATCH{ return false; }
139 bool CMediadataImpl::sm_CbFolderInfo(media_folder_h folder, void* data)
141 CMediadataImpl* root = (CMediadataImpl*)data;
143 _DBG("root: %x, m: %x", root, root->m);
146 ret = root->m_OnFolderInfo(folder);
151 bool CMediadataImpl::m_OnFolderInfo(media_folder_h folder)
153 CDirectoryInfo *pDir = NULL;
156 _CHECK(pDir = new CDirectoryInfo)
157 _CHECK(pDir->Create())
158 _CHECK(pDir->SetLoadInfo(m->filter, folder))
161 Add(m->media_type, pDir);
165 _CHECK_FAIL{ pDir->Destroy(); }
166 _CHECK_FAIL{ delete pDir; pDir = NULL; }
167 }_CREATE_END_AND_CATCH{ return false; }
172 bool CMediadataImpl::m_GetMediaList(const char *folderid)
174 t_Remove(&m->filelist);
176 int r = media_folder_foreach_media_from_db(folderid, m->filter, sm_CbMediaInfo, this);
177 if (r != MEDIA_CONTENT_ERROR_NONE) {
178 _ERR("Media folder foreach folder from db failed");
180 return r == MEDIA_CONTENT_ERROR_NONE ? true : false;
183 void CMediadataImpl::m_GetFolderList(void)
186 _DBG("START: this: 0x%x", this);
187 r = media_folder_foreach_folder_from_db(m->filter, sm_CbFolderInfo, this);
188 if (r != MEDIA_CONTENT_ERROR_NONE)
189 _ERR("Media folder foreach folder from db failed");
193 void CMediadataImpl::m_UpdateFolderLists(void)
199 for (type = E_GRP_ALL; type <= E_GRP_MUSIC; type++) {
200 _DBG("==================================================");
201 m->media_type = type;
203 bool r = m_CreateFilter(m->source_type, m->media_type);
205 _ERR("Media Filter Creation Failed");
211 m_DestroyFilter(m->filter);
213 _DBG("==================================================");
217 bool CMediadataImpl::Create(void)
223 _CHECK(m = new SMediadataImpl)
224 _CHECK(media_content_connect() == MEDIA_CONTENT_ERROR_NONE)
228 _CHECK_FAIL{ media_content_disconnect(); }
229 _CHECK_FAIL{ delete m; m = NULL; }
230 } _CREATE_END_AND_CATCH{ return false; }
232 m->source_type = E_GRP_NONE;
233 m->media_type = E_GRP_ALL;
239 void CMediadataImpl::Destroy(void)
244 _DBG("#########################");
246 t_Remove(&m->filelist);
250 r = media_content_disconnect();
251 if (r != MEDIA_CONTENT_ERROR_NONE)
252 _ERR("Media Content Connect Failed");
258 bool CMediadataImpl::GetMediaList(const char* folderid, int media_type, int source_type, Eina_List **list)
260 ASSERT(0 <= media_type && media_type <= t_Max());
266 m->media_type = media_type;
267 m->source_type = source_type;
269 bool r = m_CreateFilter(m->source_type, m->media_type);
271 _ERR("Media Filter Creation Failed");
275 r = m_GetMediaList(folderid);
277 m_DestroyFilter(m->filter);
281 *list = eina_list_clone(m->filelist);
288 bool CMediadataImpl::GetFolderList(int media_type, int source_type, Eina_List **list)
290 ASSERT(0 <= media_type && media_type <= t_Max());
295 _DBG("sourceType: %d, m->source_Type: %d", source_type, m->source_type);
297 if (source_type != m->source_type) {
298 m->source_type = source_type;
299 m_UpdateFolderLists();
302 *list = Clone(media_type);