diff options
Diffstat (limited to 'src/multimedia/playback/playlistfileparser.cpp')
-rw-r--r-- | src/multimedia/playback/playlistfileparser.cpp | 102 |
1 files changed, 10 insertions, 92 deletions
diff --git a/src/multimedia/playback/playlistfileparser.cpp b/src/multimedia/playback/playlistfileparser.cpp index 97c551c97..374d3fa0c 100644 --- a/src/multimedia/playback/playlistfileparser.cpp +++ b/src/multimedia/playback/playlistfileparser.cpp @@ -181,27 +181,9 @@ class PLSParser : public ParserBase public: PLSParser(QObject *parent) : ParserBase(parent) - , m_state(Header) - , m_count(0) - , m_readFlags(0) { } - enum ReadFlags - { - FileRead = 0x1, - TitleRead = 0x2, - LengthRead = 0x4, - All = FileRead | TitleRead | LengthRead - }; - - enum State - { - Header, - Track, - Footer - }; - /* * The format is essentially that of an INI file structured as follows: @@ -240,89 +222,25 @@ NumberOfEntries=2 Version=2 */ - inline bool containsFlag(const ReadFlags& flag) + void parseLine(int, const QString &line, const QUrl &root) { - return (m_readFlags & int(flag)) == flag; - } + // We ignore everything but 'File' entries, since that's the only thing we care about. + if (!line.startsWith(QLatin1String("File"))) + return; - inline void setFlag(const ReadFlags& flag) - { - m_readFlags |= int(flag); - } + QString value = getValue(line); + if (value.isEmpty()) + return; - void parseLine(int lineIndex, const QString &line, const QUrl &root) - { - switch (m_state) { - case Header: - if (line == QLatin1String("[playlist]")) { - m_state = Track; - setCount(1); - } - break; - case Track: - if (!containsFlag(FileRead) && line.startsWith(m_fileName)) { - m_item[QLatin1String("url")] = expandToFullPath(root, getValue(lineIndex, line)); - setFlag(FileRead); - } else if (!containsFlag(TitleRead) && line.startsWith(m_titleName)) { - m_item[QMediaMetaData::Title] = getValue(lineIndex, line); - setFlag(TitleRead); - } else if (!containsFlag(LengthRead) && line.startsWith(m_lengthName)) { - //convert from seconds to miliseconds - int length = getValue(lineIndex, line).toInt(); - if (length > 0) - m_item[QMediaMetaData::Duration] = length * 1000; - setFlag(LengthRead); - } else if (line.startsWith(QLatin1String("NumberOfEntries"))) { - m_state = Footer; - int entries = getValue(lineIndex, line).toInt(); - int count = m_readFlags == 0 ? (m_count - 1) : m_count; - if (entries != count) { - emit error(QPlaylistFileParser::FormatError, tr("Error parsing playlist: %1, expected count = %2"). - arg(line, QString::number(count))); - } - break; - } - if (m_readFlags == int(All)) { - emit newItem(m_item); - setCount(m_count + 1); - } - break; - case Footer: - if (line.startsWith(QLatin1String("Version"))) { - int version = getValue(lineIndex, line).toInt(); - if (version != 2) - emit error(QPlaylistFileParser::FormatError, QString(tr("Error parsing playlist at line[%1], expected version = 2")).arg(line)); - } - break; - } + emit newItem(expandToFullPath(root, value)); } - QString getValue(int lineIndex, const QString& line) { + QString getValue(const QString& line) { int start = line.indexOf('='); - if (start < 0) { - emit error(QPlaylistFileParser::FormatError, QString(tr("Error parsing playlist at line[%1]:%2")).arg(QString::number(lineIndex), line)); + if (start < 0) return QString(); - } return line.midRef(start + 1).trimmed().toString(); } - - void setCount(int count) { - m_count = count; - m_fileName = QStringLiteral("File%1").arg(count); - m_titleName = QStringLiteral("Title%1").arg(count); - m_lengthName = QStringLiteral("Length%1").arg(count); - m_item.clear(); - m_readFlags = 0; - } - -private: - State m_state; - int m_count; - QString m_titleName; - QString m_fileName; - QString m_lengthName; - QVariantMap m_item; - int m_readFlags; }; } |