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();
92 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 iteration)
167 (*it)->setPermissions(PERM_READ);
168 searchFiles(SharedPtr<INode>(*it));
173 unsigned long Gallery::getFreeId()
178 bool Gallery::isOpen() const
183 void Gallery::close()
186 Throw(Commons::PlatformWrongStateException);
188 m_mediaItems.clear();
194 void Gallery::refresh()
197 Throw(Commons::PlatformWrongStateException);
199 m_mediaItems.clear();
203 SharedPtr<Node> node(Node::resolve(path));
204 node->setPermissions(PERM_READ);
205 searchFiles(DynamicPointerCast<INode>(node));
206 changeView(m_viewProperties);
207 LogDebug("Gallery contains " << m_mediaItems.size() << " items");
210 void Gallery::changeView(const IViewProperties &props)
213 Throw(Commons::PlatformWrongStateException);
215 m_viewProperties = props;
218 //Copy elements within date period to view struct
219 for (IMediaItemsSetIterator it = m_mediaItems.begin(),
220 end = m_mediaItems.end();
222 if ((m_viewProperties.getStartDate() <= (*it)->getDate()) &&
223 ((*it)->getDate() <= m_viewProperties.getEndDate())) {
224 m_view->push_back(*it);
229 IViewProperties::SortOrder sortOrder[] = {
230 m_viewProperties.getSecondarySortOrder(),
231 m_viewProperties.getPrimarySortOrder()
233 for (size_t i = 0; i < (sizeof(sortOrder) / sizeof(sortOrder[0])); ++i) {
234 switch (sortOrder[i]) {
235 case IViewProperties::BY_FILEDATE:
236 m_view->sort(compareByFileDate);
238 case IViewProperties::BY_FILENAME:
239 m_view->sort(compareByFilename);
241 case IViewProperties::BY_TYPE:
242 m_view->sort(compareByType);
249 //reverse order if necessary
250 if (IViewProperties::DESCENDING == m_viewProperties.getSortOrder()) {
253 LogDebug("View contains " << m_view->size() << " items");
256 const IMediaItemsSetPtr Gallery::getMediaItems() const
259 Throw(Commons::PlatformWrongStateException);
261 LogError("View contains " << m_view->size() << " entries");
265 const IMediaItemPtr Gallery::getMediaItemById(unsigned long id) const
268 Throw(Commons::PlatformWrongStateException);
270 SearchIdObj searchObj(id);
271 IMediaItemsSetConstIterator elem = find_if(
272 m_mediaItems.begin(), m_mediaItems.end(), searchObj);
273 if (elem == m_mediaItems.end()) {
274 Throw(Commons::InvalidArgumentException);