summaryrefslogtreecommitdiffstats
path: root/src/multimedia/playback/qplaylistfileparser.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-12-15 17:24:21 +0100
committerLars Knoll <lars.knoll@qt.io>2021-01-20 15:11:26 +0000
commit3fcc619cb4300e2e07b3615b0b887938532c22cc (patch)
treec82b97737e9a6c141692744ec43c8763d8b8b461 /src/multimedia/playback/qplaylistfileparser.cpp
parent1aceb4feb8ffab96773d919fa49408af8dc24e12 (diff)
Clean up playlist handling
Remove the whole plugin infrastructure and all the complexity that came with it and some other architectural decisions. Change-Id: I86bc2f1a5bddf5ba90881990c5cf49463d12ed65 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/multimedia/playback/qplaylistfileparser.cpp')
-rw-r--r--src/multimedia/playback/qplaylistfileparser.cpp52
1 files changed, 33 insertions, 19 deletions
diff --git a/src/multimedia/playback/qplaylistfileparser.cpp b/src/multimedia/playback/qplaylistfileparser.cpp
index c1a423308..0ea920f9e 100644
--- a/src/multimedia/playback/qplaylistfileparser.cpp
+++ b/src/multimedia/playback/qplaylistfileparser.cpp
@@ -102,7 +102,7 @@ protected:
void newItemFound(const QVariant& content) { Q_EMIT m_parent->newItem(content); }
-private:
+protected:
QPlaylistFileParser *m_parent;
bool m_aborted;
};
@@ -165,7 +165,9 @@ public:
m_extendedFormat = true;
}
} else {
- m_extraInfo[QLatin1String("url")] = expandToFullPath(root, line);
+ QUrl url = expandToFullPath(root, line);
+ m_extraInfo[QLatin1String("url")] = url;
+ m_parent->playlist.append(url);
newItemFound(QVariant(m_extraInfo));
m_extraInfo.clear();
}
@@ -251,7 +253,9 @@ Version=2
if (value.isEmpty())
return true;
- newItemFound(expandToFullPath(root, value));
+ QUrl path = expandToFullPath(root, value);
+ m_parent->playlist.append(path);
+ newItemFound(path);
return true;
}
@@ -294,7 +298,7 @@ public:
QNetworkAccessManager m_mgr;
QString m_mimeType;
QPlaylistFileParser *q_ptr;
- QIODevice *m_stream;
+ QPointer<QIODevice> m_stream;
QPlaylistFileParser::FileType m_type;
struct ParserJob
{
@@ -324,13 +328,15 @@ bool QPlaylistFileParserPrivate::processLine(int startIndex, int length)
if (!m_currentParser) {
const QString urlString = m_root.toString();
const QString &suffix = !urlString.isEmpty() ? QFileInfo(urlString).suffix() : urlString;
- const QString &mimeType = m_source->header(QNetworkRequest::ContentTypeHeader).toString();
+ QString mimeType;
+ if (m_source)
+ mimeType = m_source->header(QNetworkRequest::ContentTypeHeader).toString();
m_type = QPlaylistFileParser::findPlaylistType(suffix, !mimeType.isEmpty() ? mimeType : m_mimeType, m_buffer.constData(), quint32(m_buffer.size()));
switch (m_type) {
case QPlaylistFileParser::UNKNOWN:
- emit q->error(QPlaylistFileParser::FormatError,
- QPlaylistFileParser::tr("%1 playlist type is unknown").arg(m_root.toString()));
+ emit q->error(QMediaPlaylist::FormatError,
+ QMediaPlaylist::tr("%1 playlist type is unknown").arg(m_root.toString()));
q->abort();
return false;
case QPlaylistFileParser::M3U:
@@ -365,10 +371,10 @@ bool QPlaylistFileParserPrivate::processLine(int startIndex, int length)
void QPlaylistFileParserPrivate::handleData()
{
Q_Q(QPlaylistFileParser);
- while (m_source->bytesAvailable() && !m_aborted) {
- int expectedBytes = qMin(READ_LIMIT, int(qMin(m_source->bytesAvailable(),
+ while (m_stream->bytesAvailable() && !m_aborted) {
+ int expectedBytes = qMin(READ_LIMIT, int(qMin(m_stream->bytesAvailable(),
qint64(LINE_LIMIT - m_buffer.size()))));
- m_buffer.push_back(m_source->read(expectedBytes));
+ m_buffer.push_back(m_stream->read(expectedBytes));
int processedBytes = 0;
while (m_scanIndex < m_buffer.length() && !m_aborted) {
char s = m_buffer[m_scanIndex];
@@ -379,7 +385,7 @@ void QPlaylistFileParserPrivate::handleData()
break;
}
processedBytes = m_scanIndex + 1;
- if (!m_source) {
+ if (!m_stream) {
//some error happened, so exit parsing
return;
}
@@ -391,12 +397,12 @@ void QPlaylistFileParserPrivate::handleData()
break;
if (m_buffer.length() - processedBytes >= LINE_LIMIT) {
- emit q->error(QPlaylistFileParser::FormatError, QPlaylistFileParser::tr("invalid line in playlist file"));
+ emit q->error(QMediaPlaylist::FormatError, QMediaPlaylist::tr("invalid line in playlist file"));
q->abort();
break;
}
- if (m_source->isFinished() && !m_source->bytesAvailable()) {
+ if (!m_stream->bytesAvailable() && (!m_source || !m_source->isFinished())) {
//last line
processLine(processedBytes, -1);
break;
@@ -489,6 +495,10 @@ QPlaylistFileParser::FileType QPlaylistFileParser::findPlaylistType(const QStrin
if (mimeType != UNKNOWN)
return mimeType;
+ mimeType = findBySuffixType(mime);
+ if (mimeType != UNKNOWN)
+ return mimeType;
+
FileType suffixType = findBySuffixType(suffix);
if (suffixType != UNKNOWN)
return suffixType;
@@ -513,7 +523,7 @@ void QPlaylistFileParser::start(QIODevice *stream, const QString &mimeType)
const bool validStream = stream ? (stream->isOpen() && stream->isReadable()) : false;
if (!validStream) {
- Q_EMIT error(ResourceError, tr("Invalid stream"));
+ Q_EMIT error(QMediaPlaylist::AccessDeniedError, QMediaPlaylist::tr("Invalid stream"));
return;
}
@@ -523,10 +533,11 @@ void QPlaylistFileParser::start(QIODevice *stream, const QString &mimeType)
return;
}
+ playlist.clear();
d->reset();
d->m_mimeType = mimeType;
d->m_stream = stream;
- connect(d->m_stream, SIGNAL(readyRead()), this, SLOT(_q_handleData()));
+ connect(d->m_stream, SIGNAL(readyRead()), this, SLOT(handleData()));
d->handleData();
}
@@ -536,7 +547,7 @@ void QPlaylistFileParser::start(const QNetworkRequest& request, const QString &m
const QUrl &url = request.url();
if (url.isLocalFile() && !QFile::exists(url.toLocalFile())) {
- emit error(ResourceError, QString(tr("%1 does not exist")).arg(url.toString()));
+ emit error(QMediaPlaylist::AccessDeniedError, QString(QMediaPlaylist::tr("%1 does not exist")).arg(url.toString()));
return;
}
@@ -550,6 +561,7 @@ void QPlaylistFileParser::start(const QNetworkRequest& request, const QString &m
d->m_root = url;
d->m_mimeType = mimeType;
d->m_source.reset(d->m_mgr.get(request));
+ d->m_stream = d->m_source.get();
connect(d->m_source.data(), SIGNAL(readyRead()), this, SLOT(handleData()));
connect(d->m_source.data(), SIGNAL(finished()), this, SLOT(handleData()));
connect(d->m_source.data(), SIGNAL(errorOccurred(QNetworkReply::NetworkError)), this, SLOT(handleError()));
@@ -568,6 +580,8 @@ void QPlaylistFileParser::abort()
if (d->m_stream)
disconnect(d->m_stream, SIGNAL(readyRead()), this, SLOT(handleData()));
+
+ playlist.clear();
}
void QPlaylistFileParser::handleData()
@@ -581,7 +595,7 @@ void QPlaylistFileParserPrivate::handleParserFinished()
Q_Q(QPlaylistFileParser);
const bool isParserValid = !m_currentParser.isNull();
if (!isParserValid && !m_aborted)
- emit q->error(QPlaylistFileParser::FormatNotSupportedError, QPlaylistFileParser::tr("Empty file provided"));
+ emit q->error(QMediaPlaylist::FormatNotSupportedError, QMediaPlaylist::tr("Empty file provided"));
if (isParserValid && !m_aborted) {
m_currentParser.reset();
@@ -612,7 +626,7 @@ void QPlaylistFileParserPrivate::reset()
m_buffer.clear();
m_root.clear();
m_mimeType.clear();
- m_stream = 0;
+ m_stream = nullptr;
m_type = QPlaylistFileParser::UNKNOWN;
m_scanIndex = 0;
m_lineIndex = -1;
@@ -625,7 +639,7 @@ void QPlaylistFileParser::handleError()
{
Q_D(QPlaylistFileParser);
const QString &errorString = d->m_source->errorString();
- Q_EMIT error(QPlaylistFileParser::NetworkError, errorString);
+ Q_EMIT error(QMediaPlaylist::NetworkError, errorString);
abort();
}