summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorABBAPOH <ABBAPOH@nextmail.ru>2011-06-05 12:00:18 +0400
committerABBAPOH <ABBAPOH@nextmail.ru>2011-06-05 12:00:18 +0400
commit2552a0dcee1f45162e582bcae99d71b8081a6d68 (patch)
tree5c5500207bf3504786383715f979c7b73cdb7a71
parente3eace7ef6666f8885d34e8cd8ab20c934fb055f (diff)
Rewritten parser and ruler logic
-rw-r--r--TODO.txt4
-rw-r--r--src/magicmatcher.cpp9
-rw-r--r--src/mimetypeparser.cpp56
-rw-r--r--tests/qmime/tst_qmimetest.cpp2
4 files changed, 50 insertions, 21 deletions
diff --git a/TODO.txt b/TODO.txt
index 7d4ea18..778f50c 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -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());