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.
22 #include <AppCommon.h>
26 #include "DirectoryInfo.h"
27 #include "Mediadata.h"
28 #include "MediadataImpl.h"
30 struct SMediadataImpl {
38 bool CMediadataImpl::m_CreateFilter(int source_type, int media_type)
48 { E_TV, "(MEDIA_STORAGE_TYPE=0)" },
49 { E_USB, "(MEDIA_STORAGE_TYPE=1)" }
51 ASSERT(source_condn[E_ALL].source == E_ALL &&
52 source_condn[E_TV].source == E_TV &&
53 source_condn[E_USB].source == E_USB);
60 { E_GRP_PHOTO, "(MEDIA_TYPE=0)" },
61 { E_GRP_VIDEO, "(MEDIA_TYPE=1)" },
62 { E_GRP_MUSIC, "(MEDIA_TYPE=3)" }
64 ASSERT(media_condn[E_GRP_ALL].groups == E_GRP_ALL &&
65 media_condn[E_GRP_PHOTO].groups == E_GRP_PHOTO &&
66 media_condn[E_GRP_VIDEO].groups == E_GRP_VIDEO &&
67 media_condn[E_GRP_MUSIC].groups == E_GRP_MUSIC);
69 ret = media_filter_create(&m->filter);
70 if (ret != MEDIA_CONTENT_ERROR_NONE) {
71 _ERR("Media Filter Creation Failed");
75 _DBG("media: %d, source: %d", media_type, source_type);
76 if (media_type == E_GRP_ALL) {
77 if (source_type == E_ALL)
80 snprintf(buf, sizeof(buf), "%s", source_condn[source_type].string);
83 if (source_type == E_ALL)
84 snprintf(buf, sizeof(buf), "%s", media_condn[media_type].string);
86 snprintf(buf, sizeof(buf), "%s AND %s", source_condn[source_type].string, media_condn[media_type].string);
89 media_filter_set_condition(m->filter, buf, MEDIA_CONTENT_COLLATE_RTRIM);
94 void CMediadataImpl::m_DestroyFilter(filter_h filter)
99 int r = media_filter_destroy(filter);
100 ASSERT(r == MEDIA_CONTENT_ERROR_NONE);
103 bool CMediadataImpl::sm_CbMediaInfo(media_info_h media, void *dt)
105 CMediadataImpl* root = (CMediadataImpl*)dt;
109 ret = root->m_OnMediaInfo(media);
114 bool CMediadataImpl::m_OnMediaInfo(media_info_h media)
116 CFileInfo *pInfo = NULL;
119 _CHECK(pInfo = new CFileInfo)
120 _CHECK(pInfo->Create())
121 _CHECK(pInfo->SetLoadInfo(media))
122 _CHECK(pInfo->Load())
124 m->filelist = eina_list_append(m->filelist, pInfo);
128 _CHECK_FAIL{ pInfo->Destroy(); }
129 _CHECK_FAIL{ delete pInfo; pInfo = NULL; }
130 }_CREATE_END_AND_CATCH{ return false; }
135 bool CMediadataImpl::sm_CbFolderInfo(media_folder_h folder, void* data)
137 CMediadataImpl* root = (CMediadataImpl*)data;
139 _DBG("root: %x, m: %x", root, root->m);
142 ret = root->m_OnFolderInfo(folder);
147 bool CMediadataImpl::m_OnFolderInfo(media_folder_h folder)
149 CDirectoryInfo *pDir = NULL;
152 _CHECK(pDir = new CDirectoryInfo)
153 _CHECK(pDir->Create())
154 _CHECK(pDir->SetLoadInfo(m->filter, folder))
157 Add(m->media_type, pDir);
161 _CHECK_FAIL{ pDir->Destroy(); }
162 _CHECK_FAIL{ delete pDir; pDir = NULL; }
163 }_CREATE_END_AND_CATCH{ return false; }
168 bool CMediadataImpl::m_GetMediaList(const char *folderid)
170 t_Remove(&m->filelist);
172 int r = media_folder_foreach_media_from_db(folderid, m->filter, sm_CbMediaInfo, this);
173 if (r != MEDIA_CONTENT_ERROR_NONE) {
174 _ERR("Media folder foreach folder from db failed");
176 return r == MEDIA_CONTENT_ERROR_NONE ? true : false;
179 void CMediadataImpl::m_GetFolderList(void)
182 _DBG("START: this: 0x%x", this);
183 r = media_folder_foreach_folder_from_db(m->filter, sm_CbFolderInfo, this);
184 if (r != MEDIA_CONTENT_ERROR_NONE)
185 _ERR("Media folder foreach folder from db failed");
189 void CMediadataImpl::m_UpdateFolderLists(void)
195 for (type = E_GRP_ALL; type <= E_GRP_MUSIC; type++) {
196 _DBG("==================================================");
197 m->media_type = type;
199 bool r = m_CreateFilter(m->source_type, m->media_type);
201 _ERR("Media Filter Creation Failed");
207 m_DestroyFilter(m->filter);
209 _DBG("==================================================");
213 bool CMediadataImpl::Create(void)
219 _CHECK(m = new SMediadataImpl)
220 _CHECK(media_content_connect() == MEDIA_CONTENT_ERROR_NONE)
224 _CHECK_FAIL{ media_content_disconnect(); }
225 _CHECK_FAIL{ delete m; m = NULL; }
226 } _CREATE_END_AND_CATCH{ return false; }
228 m->source_type = E_GRP_NONE;
229 m->media_type = E_GRP_ALL;
235 void CMediadataImpl::Destroy(void)
240 _DBG("#########################");
242 t_Remove(&m->filelist);
246 r = media_content_disconnect();
247 if (r != MEDIA_CONTENT_ERROR_NONE)
248 _ERR("Media Content Connect Failed");
254 bool CMediadataImpl::GetMediaList(const char* folderid, int media_type, int source_type, Eina_List **list)
256 ASSERT(0 <= media_type && media_type <= t_Max());
262 m->media_type = media_type;
263 m->source_type = source_type;
265 bool r = m_CreateFilter(m->source_type, m->media_type);
267 _ERR("Media Filter Creation Failed");
271 r = m_GetMediaList(folderid);
273 m_DestroyFilter(m->filter);
277 *list = eina_list_clone(m->filelist);
284 bool CMediadataImpl::GetFolderList(int media_type, int source_type, Eina_List **list)
286 ASSERT(0 <= media_type && media_type <= t_Max());
291 _DBG("sourceType: %d, m->source_Type: %d", source_type, m->source_type);
293 if (source_type != m->source_type) {
294 m->source_type = source_type;
295 m_UpdateFolderLists();
298 *list = Clone(media_type);