diff options
author | Michael Goddard <michael.goddard@nokia.com> | 2011-06-29 13:38:46 +1000 |
---|---|---|
committer | Michael Goddard <michael.goddard@nokia.com> | 2011-06-29 13:38:46 +1000 |
commit | 2a34e88c1e1ced28e75c487cd13402e1c9cf9fa3 (patch) | |
tree | e6c1b770c5c47212792a1f9344fa034ea3e54c44 /src/plugins/m3u | |
download | qtmultimedia-2a34e88c1e1ced28e75c487cd13402e1c9cf9fa3.tar.gz |
Initial copy of QtMultimediaKit.
Comes from original repo, with SHA1:
2c82d5611655e5967f5c5095af50c0991c4378b2
Diffstat (limited to 'src/plugins/m3u')
-rw-r--r-- | src/plugins/m3u/m3u.pro | 23 | ||||
-rw-r--r-- | src/plugins/m3u/main.cpp | 47 | ||||
-rw-r--r-- | src/plugins/m3u/qm3uhandler.cpp | 237 | ||||
-rw-r--r-- | src/plugins/m3u/qm3uhandler.h | 70 |
4 files changed, 377 insertions, 0 deletions
diff --git a/src/plugins/m3u/m3u.pro b/src/plugins/m3u/m3u.pro new file mode 100644 index 000000000..f639445ee --- /dev/null +++ b/src/plugins/m3u/m3u.pro @@ -0,0 +1,23 @@ +load(qt_module) + +TARGET = qtmultimediakit_m3u +QT += multimediakit-private +PLUGIN_TYPE=playlistformats + +load(qt_plugin) +DESTDIR = $$QT.multimediakit.plugins/$${PLUGIN_TYPE} + + +HEADERS += qm3uhandler.h +SOURCES += main.cpp \ + qm3uhandler.cpp +symbian { + TARGET.UID3 = 0x2002BFC7 + TARGET.CAPABILITY = ALL -TCB + TARGET.EPOCALLOWDLLDATA = 1 + + #make a sis package from plugin + stub (plugin) + pluginDep.sources = $${TARGET}.dll + pluginDep.path = $${QT_PLUGINS_BASE_DIR}/$${PLUGIN_TYPE} + DEPLOYMENT += pluginDep +} diff --git a/src/plugins/m3u/main.cpp b/src/plugins/m3u/main.cpp new file mode 100644 index 000000000..4fd78d7dd --- /dev/null +++ b/src/plugins/m3u/main.cpp @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** 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, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qm3uhandler.h" +#include <qstringlist.h> + + +Q_EXPORT_STATIC_PLUGIN(QM3uPlaylistPlugin) +Q_EXPORT_PLUGIN2(qtmultimediakit_m3u, QM3uPlaylistPlugin) diff --git a/src/plugins/m3u/qm3uhandler.cpp b/src/plugins/m3u/qm3uhandler.cpp new file mode 100644 index 000000000..69e86a1a9 --- /dev/null +++ b/src/plugins/m3u/qm3uhandler.cpp @@ -0,0 +1,237 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** 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, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qm3uhandler.h" +#include <qmediaresource.h> +#include <QtCore/qiodevice.h> +#include <QtCore/qfileinfo.h> +#include <QtCore/qtextstream.h> +#include <QFile> +#include <QUrl> + + +class QM3uPlaylistReader : public QMediaPlaylistReader +{ +public: + QM3uPlaylistReader(QIODevice *device) + :m_ownDevice(false), m_device(device), m_textStream(new QTextStream(m_device)) + { + readItem(); + } + + QM3uPlaylistReader(const QUrl& location) + :m_location(location), m_ownDevice(true) + { + QFile *f = new QFile(location.toLocalFile()); + if (f->open(QIODevice::ReadOnly | QIODevice::Text)) { + m_device = f; + m_textStream = new QTextStream(m_device); + readItem(); + } else { + delete f; + m_device = 0; + m_textStream = 0; + } + } + + virtual ~QM3uPlaylistReader() + { + if (m_ownDevice) { + delete m_device; + } + delete m_textStream; + } + + virtual bool atEnd() const + { + //we can't just use m_textStream->atEnd(), + //for files with empty lines/comments at end + return nextResource.isNull(); + } + + virtual QMediaContent readItem() + { + QMediaContent item; + if (!nextResource.isNull()) + item = QMediaContent(nextResource); + + nextResource = QMediaContent(); + + while (m_textStream && !m_textStream->atEnd()) { + QString line = m_textStream->readLine().trimmed(); + if (line.isEmpty() || line[0] == '#' || line.size() > 4096) + continue; + + QUrl fileUrl = QUrl::fromLocalFile(line); + QUrl url(line); + + //m3u may contain url encoded entries or absolute/relative file names + //prefer existing file if any + QList<QUrl> candidates; + if (!m_location.isEmpty()) { + candidates << m_location.resolved(fileUrl); + candidates << m_location.resolved(url); + } + candidates << fileUrl; + candidates << url; + + foreach (const QUrl &candidate, candidates) { + if (QFile::exists(candidate.toLocalFile())) { + nextResource = candidate; + break; + } + } + + if (nextResource.isNull()) { + //assume the relative urls are file names, not encoded urls if m3u is local file + if (!m_location.isEmpty() && url.isRelative()) { + if (m_location.scheme() == QLatin1String("file")) + nextResource = m_location.resolved(fileUrl); + else + nextResource = m_location.resolved(url); + } else { + nextResource = QMediaContent(QUrl::fromUserInput(line)); + } + } + + break; + } + + return item; + } + + virtual void close() + { + } + +private: + QUrl m_location; + bool m_ownDevice; + QIODevice *m_device; + QTextStream *m_textStream; + QMediaContent nextResource; +}; + +class QM3uPlaylistWriter : public QMediaPlaylistWriter +{ +public: + QM3uPlaylistWriter(QIODevice *device) + :m_device(device), m_textStream(new QTextStream(m_device)) + { + } + + virtual ~QM3uPlaylistWriter() + { + delete m_textStream; + } + + virtual bool writeItem(const QMediaContent& item) + { + *m_textStream << item.canonicalUrl().toString() << endl; + return true; + } + + virtual void close() + { + } + +private: + QIODevice *m_device; + QTextStream *m_textStream; +}; + + +QM3uPlaylistPlugin::QM3uPlaylistPlugin(QObject *parent) + :QMediaPlaylistIOPlugin(parent) +{ +} + +QM3uPlaylistPlugin::~QM3uPlaylistPlugin() +{ +} + +bool QM3uPlaylistPlugin::canRead(QIODevice *device, const QByteArray &format) const +{ + return device->isReadable() && (format == "m3u" || format.isEmpty()); +} + +bool QM3uPlaylistPlugin::canRead(const QUrl& location, const QByteArray &format) const +{ + if (!QFileInfo(location.toLocalFile()).isReadable()) + return false; + + if (format == "m3u") + return true; + + if (!format.isEmpty()) + return false; + else + return location.toLocalFile().toLower().endsWith(QLatin1String("m3u")); +} + +bool QM3uPlaylistPlugin::canWrite(QIODevice *device, const QByteArray &format) const +{ + return device->isOpen() && device->isWritable() && format == "m3u"; +} + +QStringList QM3uPlaylistPlugin::keys() const +{ + return QStringList() << QLatin1String("m3u"); +} + +QMediaPlaylistReader *QM3uPlaylistPlugin::createReader(QIODevice *device, const QByteArray &format) +{ + Q_UNUSED(format); + return new QM3uPlaylistReader(device); +} + +QMediaPlaylistReader *QM3uPlaylistPlugin::createReader(const QUrl& location, const QByteArray &format) +{ + Q_UNUSED(format); + return new QM3uPlaylistReader(location); +} + +QMediaPlaylistWriter *QM3uPlaylistPlugin::createWriter(QIODevice *device, const QByteArray &format) +{ + Q_UNUSED(format); + return new QM3uPlaylistWriter(device); +} + diff --git a/src/plugins/m3u/qm3uhandler.h b/src/plugins/m3u/qm3uhandler.h new file mode 100644 index 000000000..18d088ddd --- /dev/null +++ b/src/plugins/m3u/qm3uhandler.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** 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, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QM3UHANDLER_H +#define QM3UHANDLER_H + +#include "qmediaplaylistioplugin.h" +#include <QObject> + +QT_USE_NAMESPACE + +class QM3uPlaylistPlugin : public QMediaPlaylistIOPlugin +{ +Q_OBJECT +public: + explicit QM3uPlaylistPlugin(QObject *parent = 0); + virtual ~QM3uPlaylistPlugin(); + + virtual bool canRead(QIODevice *device, const QByteArray &format = QByteArray() ) const; + virtual bool canRead(const QUrl& location, const QByteArray &format = QByteArray()) const; + + virtual bool canWrite(QIODevice *device, const QByteArray &format) const; + + virtual QStringList keys() const; + + virtual QMediaPlaylistReader *createReader(QIODevice *device, const QByteArray &format = QByteArray()); + virtual QMediaPlaylistReader *createReader(const QUrl& location, const QByteArray &format = QByteArray()); + + virtual QMediaPlaylistWriter *createWriter(QIODevice *device, const QByteArray &format); +}; + +#endif // QM3UHANDLER_H |