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 <AppCommon.h>
25 #include "DirectoryInfo.h"
26 #include "Mediadata.h"
27 #include "MediadataImpl.h"
29 struct SMediadataImpl {
37 bool CMediadataImpl::m_CreateFilter(int source_type, int media_type)
47 { E_TV, "(MEDIA_STORAGE_TYPE=0)" },
48 { E_USB, "(MEDIA_STORAGE_TYPE=1)" }
50 ASSERT(source_condn[E_ALL].source == E_ALL &&
51 source_condn[E_TV].source == E_TV &&
52 source_condn[E_USB].source == E_USB);
59 { E_GRP_PHOTO, "(MEDIA_TYPE=0)" },
60 { E_GRP_VIDEO, "(MEDIA_TYPE=1)" },
61 { E_GRP_MUSIC, "(MEDIA_TYPE=3)" }
63 ASSERT(media_condn[E_GRP_ALL].groups == E_GRP_ALL &&
64 media_condn[E_GRP_PHOTO].groups == E_GRP_PHOTO &&
65 media_condn[E_GRP_VIDEO].groups == E_GRP_VIDEO &&
66 media_condn[E_GRP_MUSIC].groups == E_GRP_MUSIC);
68 ret = media_filter_create(&m->filter);
69 if (ret != MEDIA_CONTENT_ERROR_NONE) {
70 _ERR("Media Filter Creation Failed");
74 _DBG("media: %d, source: %d", media_type, source_type);
75 if (media_type == E_GRP_ALL) {
76 if (source_type == E_ALL)
79 snprintf(buf, sizeof(buf), "%s", source_condn[source_type].string);
82 if (source_type == E_ALL)
83 snprintf(buf, sizeof(buf), "%s", media_condn[media_type].string);
85 snprintf(buf, sizeof(buf), "%s AND %s", source_condn[source_type].string, media_condn[media_type].string);
88 media_filter_set_condition(m->filter, buf, MEDIA_CONTENT_COLLATE_RTRIM);
93 void CMediadataImpl::m_DestroyFilter(filter_h filter)
98 int r = media_filter_destroy(filter);
99 ASSERT(r == MEDIA_CONTENT_ERROR_NONE);
102 bool CMediadataImpl::sm_CbMediaInfo(media_info_h media, void *dt)
104 CMediadataImpl* root = (CMediadataImpl*)dt;
108 ret = root->m_OnMediaInfo(media);
113 bool CMediadataImpl::m_OnMediaInfo(media_info_h media)
115 CFileInfo *pInfo = NULL;
118 _CHECK(pInfo = new CFileInfo)
119 _CHECK(pInfo->Create())
120 _CHECK(pInfo->SetLoadInfo(media))
121 _CHECK(pInfo->Load())
123 m->filelist = eina_list_append(m->filelist, pInfo);
127 _CHECK_FAIL{ pInfo->Destroy(); }
128 _CHECK_FAIL{ delete pInfo; pInfo = NULL; }
129 }_CREATE_END_AND_CATCH{ return false; }
134 bool CMediadataImpl::sm_CbFolderInfo(media_folder_h folder, void* data)
136 CMediadataImpl* root = (CMediadataImpl*)data;
138 _DBG("root: %x, m: %x", root, root->m);
141 ret = root->m_OnFolderInfo(folder);
146 bool CMediadataImpl::m_OnFolderInfo(media_folder_h folder)
148 CDirectoryInfo *pDir = NULL;
151 _CHECK(pDir = new CDirectoryInfo)
152 _CHECK(pDir->Create())
153 _CHECK(pDir->SetLoadInfo(m->filter, folder))
156 Add(m->media_type, pDir);
160 _CHECK_FAIL{ pDir->Destroy(); }
161 _CHECK_FAIL{ delete pDir; pDir = NULL; }
162 }_CREATE_END_AND_CATCH{ return false; }
167 bool CMediadataImpl::m_GetMediaList(const char *folderid)
169 t_Remove(&m->filelist);
171 int r = media_folder_foreach_media_from_db(folderid, m->filter, sm_CbMediaInfo, this);
172 if (r != MEDIA_CONTENT_ERROR_NONE) {
173 _ERR("Media folder foreach folder from db failed");
175 return r == MEDIA_CONTENT_ERROR_NONE ? true : false;
178 void CMediadataImpl::m_GetFolderList(void)
181 _DBG("START: this: 0x%x", this);
182 r = media_folder_foreach_folder_from_db(m->filter, sm_CbFolderInfo, this);
183 if (r != MEDIA_CONTENT_ERROR_NONE)
184 _ERR("Media folder foreach folder from db failed");
188 void CMediadataImpl::m_UpdateFolderLists(void)
194 for (type = E_GRP_ALL; type <= E_GRP_MUSIC; type++) {
195 _DBG("==================================================");
196 m->media_type = type;
198 bool r = m_CreateFilter(m->source_type, m->media_type);
200 _ERR("Media Filter Creation Failed");
206 m_DestroyFilter(m->filter);
208 _DBG("==================================================");
212 bool CMediadataImpl::Create(void)
218 _CHECK(m = new SMediadataImpl)
219 _CHECK(media_content_connect() == MEDIA_CONTENT_ERROR_NONE)
223 _CHECK_FAIL{ media_content_disconnect(); }
224 _CHECK_FAIL{ delete m; m = NULL; }
225 } _CREATE_END_AND_CATCH{ return false; }
227 m->source_type = E_GRP_NONE;
228 m->media_type = E_GRP_ALL;
234 void CMediadataImpl::Destroy(void)
239 _DBG("#########################");
241 t_Remove(&m->filelist);
245 r = media_content_disconnect();
246 if (r != MEDIA_CONTENT_ERROR_NONE)
247 _ERR("Media Content Connect Failed");
253 bool CMediadataImpl::GetMediaList(const char* folderid, int media_type, int source_type, Eina_List **list)
255 ASSERT(0 <= media_type && media_type <= t_Max());
261 m->media_type = media_type;
262 m->source_type = source_type;
264 bool r = m_CreateFilter(m->source_type, m->media_type);
266 _ERR("Media Filter Creation Failed");
270 r = m_GetMediaList(folderid);
272 m_DestroyFilter(m->filter);
276 *list = eina_list_clone(m->filelist);
283 bool CMediadataImpl::GetFolderList(int media_type, int source_type, Eina_List **list)
285 ASSERT(0 <= media_type && media_type <= t_Max());
290 _DBG("sourceType: %d, m->source_Type: %d", source_type, m->source_type);
292 if (source_type != m->source_type) {
293 m->source_type = source_type;
294 m_UpdateFolderLists();
297 *list = Clone(media_type);