2 * Copyright (c) 2011 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.
18 * @author Wojciech Bielawski (w.bielawski@samsung.com)
23 #include <commons/Exception.h>
24 #include <API/Filesystem/INode.h>
25 #include <API/Filesystem/Enums.h>
30 using namespace WrtPlugins::Api::Gallery;
31 using namespace WrtPlugins::Api::Filesystem;
33 namespace WrtPlugins {
35 using namespace Filesystem;
38 //Map file extension to IMediaItem type
39 map<string, IMediaItem::MediaType> &createExtToTypeMap()
41 static map<string, IMediaItem::MediaType> retMap;
42 retMap["jpg"] = IMediaItem::IMAGE;
43 retMap["jpeg"] = IMediaItem::IMAGE;
44 retMap["gif"] = IMediaItem::IMAGE;
45 retMap["bmp"] = IMediaItem::IMAGE;
46 retMap["png"] = IMediaItem::IMAGE;
47 retMap["wav"] = IMediaItem::AUDIO;
48 retMap["mp3"] = IMediaItem::AUDIO;
49 retMap["wmv"] = IMediaItem::VIDEO;
50 retMap["3gp"] = IMediaItem::VIDEO;
54 //Map file extension to MIME type
55 map<string, string> &createExtToMimeMap()
57 static map<string, string> retMap;
58 retMap["jpg"] = "image/jpeg";
59 retMap["jpeg"] = "image/jpeg";
60 retMap["gif"] = "image/gif";
61 retMap["bmp"] = "image/bmp";
62 retMap["png"] = "image/png";
63 retMap["wav"] = "audio/wav";
64 retMap["mp3"] = "audio/mpeg3";
65 retMap["wmv"] = "video/x - ms - wmv";
66 retMap["3gp"] = "video/3gpp";
70 bool compareByFilename(const IMediaItemPtr &lpm,
71 const IMediaItemPtr &rpm)
73 return lpm->getFileName().compare(rpm->getFileName()) < 0;
76 bool compareByFileDate(const IMediaItemPtr &lpm,
77 const IMediaItemPtr &rpm)
79 return lpm->getDate() < rpm->getDate();
82 bool compareByType(const IMediaItemPtr &lpm,
83 const IMediaItemPtr &rpm)
85 return lpm->getType() < rpm->getType();
93 SearchIdObj(unsigned long id) : m_id(id)
95 bool operator ()(const IMediaItemPtr &elem)
97 return elem->getId() == m_id;
100 } //private namespace
103 IMediaItem::MediaType> &Gallery::m_extensionToType = createExtToTypeMap();
104 map<string, string> &Gallery::m_extensionToMime = createExtToMimeMap();
106 unsigned int Gallery::getNumberOfItems() const
109 Throw(Commons::PlatformWrongStateException);
111 //if gallery is opened m_view always stores an object
112 return m_view->size();
115 std::string Gallery::getName() const
117 LogDebug("Gallery name: " << m_name);
124 Throw(Commons::PlatformWrongStateException);
126 m_mediaItems.clear();
129 SharedPtr<INode> node(Node::resolve(path));
130 node->setPermissions(PERM_READ);
132 //Destroy previous view and store new one
133 m_view = IMediaItemsSetPtr(new IMediaItemsSet(m_mediaItems));
135 LogDebug("Gallery contains " << m_mediaItems.size() << " items");
138 void Gallery::searchFiles(const SharedPtr<INode> &node)
140 if (Api::Filesystem::NT_FILE == node->getType()) {
141 string fileName = node->getPath().getName();
142 size_t dotPos = fileName.find_last_of(".");
143 if (dotPos == string::npos) {
147 string fileExt = fileName.substr(dotPos + 1);
148 //Check if file has supported type
149 map<string, string>::iterator it = m_extensionToMime.find(fileExt);
150 if (it != m_extensionToMime.end()) {
151 IMediaItemPtr mediaItem(new IMediaItem());
152 mediaItem->setId(getFreeId());
153 mediaItem->setFileName(fileName);
154 mediaItem->setType(m_extensionToType[fileExt]);
155 mediaItem->setMimeType(m_extensionToMime[fileExt]);
156 mediaItem->setDate(node->getCreated());
157 m_mediaItems.push_back(mediaItem);
162 //else get recurrent on NT_DIRECTORY
163 NodeList nodes = node->getChildNodes();
164 NodeList::iterator it = nodes.begin(), end = nodes.end();
166 //Warning: '*it' element will be deleted after out of scope (next
168 (*it)->setPermissions(PERM_READ);
169 searchFiles(SharedPtr<INode>(*it));
174 unsigned long Gallery::getFreeId()
179 bool Gallery::isOpen() const
184 void Gallery::close()
187 Throw(Commons::PlatformWrongStateException);
189 m_mediaItems.clear();
195 void Gallery::refresh()
198 Throw(Commons::PlatformWrongStateException);
200 m_mediaItems.clear();
204 SharedPtr<Node> node(Node::resolve(path));
205 node->setPermissions(PERM_READ);
206 searchFiles(DynamicPointerCast<INode>(node));
207 changeView(m_viewProperties);
208 LogDebug("Gallery contains " << m_mediaItems.size() << " items");
211 void Gallery::changeView(const IViewProperties &props)
214 Throw(Commons::PlatformWrongStateException);
216 m_viewProperties = props;
219 //Copy elements within date period to view struct
220 for (IMediaItemsSetIterator it = m_mediaItems.begin(),
221 end = m_mediaItems.end();
224 if ((m_viewProperties.getStartDate() <= (*it)->getDate()) &&
225 ((*it)->getDate() <= m_viewProperties.getEndDate()))
227 m_view->push_back(*it);
232 IViewProperties::SortOrder sortOrder[] = {
233 m_viewProperties.getSecondarySortOrder(),
234 m_viewProperties.getPrimarySortOrder()
236 for (size_t i = 0; i < (sizeof(sortOrder) / sizeof(sortOrder[0])); ++i) {
237 switch (sortOrder[i]) {
238 case IViewProperties::BY_FILEDATE:
239 m_view->sort(compareByFileDate);
241 case IViewProperties::BY_FILENAME:
242 m_view->sort(compareByFilename);
244 case IViewProperties::BY_TYPE:
245 m_view->sort(compareByType);
252 //reverse order if necessary
253 if (IViewProperties::DESCENDING == m_viewProperties.getSortOrder()) {
256 LogDebug("View contains " << m_view->size() << " items");
259 const IMediaItemsSetPtr Gallery::getMediaItems() const
262 Throw(Commons::PlatformWrongStateException);
264 LogError("View contains " << m_view->size() << " entries");
268 const IMediaItemPtr Gallery::getMediaItemById(unsigned long id) const
271 Throw(Commons::PlatformWrongStateException);
273 SearchIdObj searchObj(id);
274 IMediaItemsSetConstIterator elem = find_if(
275 m_mediaItems.begin(), m_mediaItems.end(), searchObj);
276 if (elem == m_mediaItems.end()) {
277 Throw(Commons::InvalidArgumentException);