diff options
author | ABBAPOH <ABBAPOH@nextmail.ru> | 2011-06-05 12:00:18 +0400 |
---|---|---|
committer | ABBAPOH <ABBAPOH@nextmail.ru> | 2011-06-05 12:00:18 +0400 |
commit | 2552a0dcee1f45162e582bcae99d71b8081a6d68 (patch) | |
tree | 5c5500207bf3504786383715f979c7b73cdb7a71 | |
parent | e3eace7ef6666f8885d34e8cd8ab20c934fb055f (diff) |
Rewritten parser and ruler logic
-rw-r--r-- | TODO.txt | 4 | ||||
-rw-r--r-- | src/magicmatcher.cpp | 9 | ||||
-rw-r--r-- | src/mimetypeparser.cpp | 56 | ||||
-rw-r--r-- | tests/qmime/tst_qmimetest.cpp | 2 |
4 files changed, 50 insertions, 21 deletions
@@ -1,8 +1,8 @@ To be done: --fix bug with wrong xml/docbook ++fix bug with wrong xml/docbook -fix bug when determining match on low level with low priority (when best match on higher level) -add normal glob patterns (not via regexp) -rewrite parser -add binary parser -explore user-modified types --add support fot AND magics ++add support fot AND magics diff --git a/src/magicmatcher.cpp b/src/magicmatcher.cpp index 7d05abd..372573a 100644 --- a/src/magicmatcher.cpp +++ b/src/magicmatcher.cpp @@ -162,10 +162,13 @@ IMagicMatcher::Type MagicRuleMatcher::type() const bool MagicRuleMatcher::matches(const QByteArray &data) const { + if (m_list.isEmpty()) + return false; +// qDebug() << this->magicRules(); for (int i = 0; i < m_list.size(); i++) - if ( m_list.at(i).matches(data)) - return true; - return false; + if ( !m_list.at(i).matches(data)) + return false; + return true; } int MagicRuleMatcher::priority() const diff --git a/src/mimetypeparser.cpp b/src/mimetypeparser.cpp index c9d3095..6241fdc 100644 --- a/src/mimetypeparser.cpp +++ b/src/mimetypeparser.cpp @@ -27,6 +27,7 @@ #include <QtCore/QDebug> #include <QtCore/QXmlStreamReader> #include <QtCore/QXmlStreamWriter> +#include <QtCore/QStack> /*! \class BaseMimeTypeParser @@ -121,7 +122,7 @@ static bool parseNumber(const QString &n, int *target, QString *errorMessage) // <match value="0x9501" type="big16" offset="0:64"/> static bool addMagicMatchRule(const QXmlStreamAttributes &atts, const MagicRuleMatcherPtr &ruleMatcher, - QString *errorMessage) + QString *errorMessage, QMimeMagicRule *&rule) { const QString type = atts.value(QLatin1String(matchTypeAttributeC)).toString(); QMimeMagicRule::Type magicType = QMimeMagicRule::stringToType(type.toLatin1()); @@ -145,7 +146,8 @@ static bool addMagicMatchRule(const QXmlStreamAttributes &atts, if (debugMimeDB) qDebug() << Q_FUNC_INFO << value << startPos << endPos; - ruleMatcher->add(QMimeMagicRule(magicType, value, startPos, endPos)); +// ruleMatcher->add(QMimeMagicRule(magicType, value, startPos, endPos)); + rule = new QMimeMagicRule(magicType, value, startPos, endPos); return true; } @@ -153,6 +155,8 @@ bool BaseMimeTypeParser::parse(QIODevice *dev, const QString &fileName, QString { QMimeTypeData data; MagicRuleMatcherPtr ruleMatcher; + int priority = 0; + QList<QMimeMagicRule> rules; QXmlStreamReader reader(dev); ParseStage ps = ParseBeginning; QXmlStreamAttributes atts; @@ -200,25 +204,35 @@ bool BaseMimeTypeParser::parse(QIODevice *dev, const QString &fileName, QString } break; case ParseMagic: { - int priority = 0; +// int priority = 0; + priority = 0; const QString priorityS = atts.value(QLatin1String(priorityAttributeC)).toString(); if (!priorityS.isEmpty()) { if (!parseNumber(priorityS, &priority, errorMessage)) return false; } - ruleMatcher = MagicRuleMatcherPtr(new MagicRuleMatcher); - ruleMatcher->setPriority(priority); +// ruleMatcher = MagicRuleMatcherPtr(new MagicRuleMatcher); +// ruleMatcher->setPriority(priority); } break; - case ParseMagicMatchRule: - if (ruleMatcher.isNull()) { - qWarning() << "BaseMimeTypeParser::parse : ruleMatcher unexpectedly null"; - return false; + case ParseMagicMatchRule: { +// if (ruleMatcher.isNull()) { +// qWarning() << "BaseMimeTypeParser::parse : ruleMatcher unexpectedly null"; +// return false; +// } + if (!ruleMatcher) { + ruleMatcher = MagicRuleMatcherPtr(new MagicRuleMatcher); + ruleMatcher->setPriority(priority); } - if (!addMagicMatchRule(atts, ruleMatcher, errorMessage)) + + QMimeMagicRule *rule = 0; + if (!addMagicMatchRule(atts, ruleMatcher, errorMessage, rule)) return false; + rules.append(*rule); + delete rule; break; + } case ParseError: reader.raiseError(QString::fromLatin1("Unexpected element <%1>"). arg(reader.name().toString())); @@ -235,13 +249,23 @@ bool BaseMimeTypeParser::parse(QIODevice *dev, const QString &fileName, QString data.clear(); } else { // Finished a match sequence - if (reader.name() == QLatin1String(magicTagC)) { - if (ruleMatcher.isNull()) { - qWarning() << "BaseMimeTypeParser::parse : ruleMatcher unexpectedly null"; - return false; +// if (reader.name() == QLatin1String(magicTagC)) { +// if (ruleMatcher.isNull()) { +// qWarning() << "BaseMimeTypeParser::parse : ruleMatcher unexpectedly null"; +// return false; +// } +// data.magicMatchers.push_back(ruleMatcher); +// ruleMatcher = MagicRuleMatcherPtr(); +// } + + // Finished a match sequence + if (reader.name() == QLatin1String(matchTagC)) { + if (!ruleMatcher.isNull()) { + ruleMatcher->add(rules); + data.magicMatchers.push_back(ruleMatcher); + ruleMatcher = MagicRuleMatcherPtr(); } - data.magicMatchers.push_back(ruleMatcher); - ruleMatcher = MagicRuleMatcherPtr(); + rules.takeLast(); } } break; diff --git a/tests/qmime/tst_qmimetest.cpp b/tests/qmime/tst_qmimetest.cpp index 854c59f..fa6dcb6 100644 --- a/tests/qmime/tst_qmimetest.cpp +++ b/tests/qmime/tst_qmimetest.cpp @@ -83,6 +83,8 @@ void QmimeTest::testFindByFile() QString mimetype = list.at(1); file.prepend(SRCDIR"testfiles/"); + qDebug() << file << database.findByFile(QFileInfo(file)).type() << database.findByType(mimetype).type(); + if (failByFileData) { QEXPECT_FAIL("", "Should fail", Continue); QCOMPARE(database.findByFile(QFileInfo(file)).type(), database.findByType(mimetype).type()); |