summaryrefslogtreecommitdiffstats
path: root/src/multimedia
diff options
context:
space:
mode:
authorYoann Lopes <yoann.lopes@digia.com>2014-04-09 19:13:45 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-05-09 16:33:12 +0200
commit5339aed040d58f8486205df1525508b8c02faa9c (patch)
tree5c73f5fcd04165f29f37c5a3170145daf9c193a0 /src/multimedia
parent703ee3879bf055787f2219f5b2212053d9535fe9 (diff)
Moved QMediaStorageLocation out of the Android plugin.
It's now a private API in the QtMultimedia library in order to be accessible in other plugins. Change-Id: I63541de1e8c540cebc210f9037646ce74d866c6f Reviewed-by: Christian Stromme <christian.stromme@digia.com>
Diffstat (limited to 'src/multimedia')
-rw-r--r--src/multimedia/multimedia.pro4
-rw-r--r--src/multimedia/qmediastoragelocation.cpp146
-rw-r--r--src/multimedia/qmediastoragelocation_p.h80
3 files changed, 229 insertions, 1 deletions
diff --git a/src/multimedia/multimedia.pro b/src/multimedia/multimedia.pro
index 23cca2537..0f3ced913 100644
--- a/src/multimedia/multimedia.pro
+++ b/src/multimedia/multimedia.pro
@@ -21,7 +21,8 @@ PRIVATE_HEADERS += \
qmediaserviceprovider_p.h \
qmediaresourcepolicyplugin_p.h \
qmediaresourcepolicy_p.h \
- qmediaresourceset_p.h
+ qmediaresourceset_p.h \
+ qmediastoragelocation_p.h
PUBLIC_HEADERS += \
qmediabindableinterface.h \
@@ -47,6 +48,7 @@ SOURCES += \
qmediaresourcepolicyplugin_p.cpp \
qmediaresourcepolicy_p.cpp \
qmediaresourceset_p.cpp \
+ qmediastoragelocation.cpp \
qmultimedia.cpp
include(audio/audio.pri)
diff --git a/src/multimedia/qmediastoragelocation.cpp b/src/multimedia/qmediastoragelocation.cpp
new file mode 100644
index 000000000..877c12138
--- /dev/null
+++ b/src/multimedia/qmediastoragelocation.cpp
@@ -0,0 +1,146 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmediastoragelocation_p.h"
+
+#include <QStandardPaths>
+
+QT_BEGIN_NAMESPACE
+
+QMediaStorageLocation::QMediaStorageLocation()
+{
+}
+
+void QMediaStorageLocation::addStorageLocation(MediaType type, const QString &location)
+{
+ m_customLocations[type].append(location);
+}
+
+QDir QMediaStorageLocation::defaultLocation(MediaType type) const
+{
+ QStringList dirCandidates;
+
+ dirCandidates << m_customLocations.value(type);
+
+ switch (type) {
+ case Movies:
+ dirCandidates << QStandardPaths::writableLocation(QStandardPaths::MoviesLocation);
+ break;
+ case Music:
+ dirCandidates << QStandardPaths::writableLocation(QStandardPaths::MusicLocation);
+ break;
+ case Pictures:
+ dirCandidates << QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
+ default:
+ break;
+ }
+
+ dirCandidates << QDir::homePath();
+ dirCandidates << QDir::currentPath();
+ dirCandidates << QDir::tempPath();
+
+ Q_FOREACH (const QString &path, dirCandidates) {
+ if (QFileInfo(path).isWritable())
+ return QDir(path);
+ }
+
+ return QDir();
+}
+
+QString QMediaStorageLocation::generateFileName(const QString &requestedName,
+ MediaType type,
+ const QString &prefix,
+ const QString &extension) const
+{
+ if (requestedName.isEmpty())
+ return generateFileName(prefix, defaultLocation(type), extension);
+
+ QString path = requestedName;
+
+ if (QFileInfo(path).isRelative())
+ path = defaultLocation(type).absoluteFilePath(path);
+
+ if (QFileInfo(path).isDir())
+ return generateFileName(prefix, QDir(path), extension);
+
+ if (!path.endsWith(extension))
+ path.append(QString(QLatin1String(".%1")).arg(extension));
+
+ return path;
+}
+
+QString QMediaStorageLocation::generateFileName(const QString &prefix,
+ const QDir &dir,
+ const QString &extension) const
+{
+ QMutexLocker lock(&m_mutex);
+
+ const QString lastMediaKey = dir.absolutePath() + QLatin1Char(' ') + prefix + QLatin1Char(' ') + extension;
+ qint64 lastMediaIndex = m_lastUsedIndex.value(lastMediaKey, 0);
+
+ if (lastMediaIndex == 0) {
+ // first run, find the maximum media number during the fist capture
+ Q_FOREACH (const QString &fileName, dir.entryList(QStringList() << QString(QLatin1String("%1*.%2")).arg(prefix).arg(extension))) {
+ const qint64 mediaIndex = fileName.midRef(prefix.length(), fileName.size() - prefix.length() - extension.length() - 1).toInt();
+ lastMediaIndex = qMax(lastMediaIndex, mediaIndex);
+ }
+ }
+
+ // don't just rely on cached lastMediaIndex value,
+ // someone else may create a file after camera started
+ while (true) {
+ const QString name = QString(QLatin1String("%1%2.%3")).arg(prefix)
+ .arg(lastMediaIndex + 1, 8, 10, QLatin1Char('0'))
+ .arg(extension);
+
+ const QString path = dir.absoluteFilePath(name);
+ if (!QFileInfo(path).exists()) {
+ m_lastUsedIndex[lastMediaKey] = lastMediaIndex + 1;
+ return path;
+ }
+
+ lastMediaIndex++;
+ }
+
+ return QString();
+}
+
+QT_END_NAMESPACE
diff --git a/src/multimedia/qmediastoragelocation_p.h b/src/multimedia/qmediastoragelocation_p.h
new file mode 100644
index 000000000..600fb63ff
--- /dev/null
+++ b/src/multimedia/qmediastoragelocation_p.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMEDIASTORAGELOCATION_H
+#define QMEDIASTORAGELOCATION_H
+
+#include <qtmultimediadefs.h>
+#include <QDir>
+#include <QMap>
+#include <QHash>
+#include <QMutex>
+
+QT_BEGIN_NAMESPACE
+
+class Q_MULTIMEDIA_EXPORT QMediaStorageLocation
+{
+public:
+ enum MediaType {
+ Movies,
+ Music,
+ Pictures,
+ Sounds
+ };
+
+ QMediaStorageLocation();
+
+ void addStorageLocation(MediaType type, const QString &location);
+
+ QDir defaultLocation(MediaType type) const;
+
+ QString generateFileName(const QString &requestedName, MediaType type, const QString &prefix, const QString &extension) const;
+ QString generateFileName(const QString &prefix, const QDir &dir, const QString &extension) const;
+
+private:
+ mutable QMutex m_mutex;
+ mutable QHash<QString, qint64> m_lastUsedIndex;
+ QMap<MediaType, QStringList> m_customLocations;
+};
+
+QT_END_NAMESPACE
+
+#endif // QMEDIASTORAGELOCATION_H