diff options
author | Lars Knoll <lars.knoll@qt.io> | 2020-12-15 17:24:21 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-01-20 15:11:26 +0000 |
commit | 3fcc619cb4300e2e07b3615b0b887938532c22cc (patch) | |
tree | c82b97737e9a6c141692744ec43c8763d8b8b461 /src/multimedia/playback/qplaylistfileparser.cpp | |
parent | 1aceb4feb8ffab96773d919fa49408af8dc24e12 (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.cpp | 52 |
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(); } |