]> gitweb.hamatoma.de Git - reqt/commitdiff
ReListMatcher + ReIncludeExcludeMatcher
authorhama <hama@siduction.net>
Tue, 15 Sep 2015 21:52:48 +0000 (23:52 +0200)
committerhama <hama@siduction.net>
Tue, 15 Sep 2015 21:52:48 +0000 (23:52 +0200)
base/ReQStringUtils.cpp
base/ReQStringUtils.hpp
os/ReFileSystem.cpp
os/ReFileSystem.hpp

index 65dabff0b34309cdfae6bb7e77658efaf79294c1..a31bc7256cf3525ca93855500a7845fdd78225b9 100644 (file)
@@ -106,7 +106,7 @@ ReString ReQStringUtils::extensionOf(const ReString& filename) {
  *                  otherwise: the length of the integer
  */
 int ReQStringUtils::lengthOfUInt64(const ReString& text, int start, int radix,
-    quint64* pValue) {
+       quint64* pValue) {
        int inputLength = text.size();
        int64_t value = 0;
        int ix = start;
@@ -141,7 +141,7 @@ int ReQStringUtils::lengthOfUInt64(const ReString& text, int start, int radix,
                }
        } else {
                throw ReException("ReQStringUtil::lengthOfInt(): wrong radix: %d",
-                   radix);
+                       radix);
        }
        if (pValue != NULL)
                *pValue = value;
@@ -159,7 +159,7 @@ int ReQStringUtils::lengthOfUInt64(const ReString& text, int start, int radix,
  *                  otherwise: the length of the integer
  */
 int ReQStringUtils::lengthOfUInt(const ReString& text, int start, int radix,
-    uint* pValue) {
+       uint* pValue) {
        quint64 value;
        int rc = lengthOfUInt64(text, start, radix, &value);
        if (pValue != NULL)
@@ -180,7 +180,7 @@ int ReQStringUtils::lengthOfUInt(const ReString& text, int start, int radix,
  *              otherwise: the length of the date in the string
  */
 int ReQStringUtils::lengthOfDate(const ReString& text, int start,
-    QDate* value) {
+       QDate* value) {
        uint day = 0;
        uint month = 0;
        uint year = 0;
@@ -228,7 +228,7 @@ int ReQStringUtils::lengthOfDate(const ReString& text, int start,
                }
        }
        if (day < 1 || day > 31 || month < 1 || month > 12 || year < 1970
-           || year > 2100)
+               || year > 2100)
                length = 0;
        if (length != 0 && value != NULL)
                *value = QDate(year, month, day);
@@ -250,7 +250,7 @@ int ReQStringUtils::lengthOfDate(const ReString& text, int start,
  *                      otherwise: the length of the date in the string
  */
 int ReQStringUtils::lengthOfDateTime(const ReString& text, int start,
-    bool allowDateOnly, bool allowTimeOnly, QDateTime* value) {
+       bool allowDateOnly, bool allowTimeOnly, QDateTime* value) {
        QDate date;
        QTime time;
        int length = lengthOfDate(text, start, &date);
@@ -292,7 +292,7 @@ int ReQStringUtils::lengthOfDateTime(const ReString& text, int start,
  *          otherwise: the length of the date in the string
  */
 int ReQStringUtils::lengthOfTime(const ReString& text, int start,
-    QTime* value) {
+       QTime* value) {
        uint hour = 0;
        uint minute = 0;
        uint sec = 0;
@@ -336,7 +336,7 @@ int ReQStringUtils::lengthOfTime(const ReString& text, int start,
  *                  otherwise: the length of the floating point number
  */
 int ReQStringUtils::lengthOfReal(const ReString& text, int start,
-    qreal* pValue) {
+       qreal* pValue) {
        int inputLength = text.size();
        qreal value = 0.0;
        int cc;
@@ -450,7 +450,7 @@ QString ReQStringUtils::pathAppend(const QString& base, const QString& path) {
  */
 
 QString ReQStringUtils::replaceExtension(const QString& path,
-    const QString& ext) {
+       const QString& ext) {
        QString oldExt = extensionOf(path);
        QString rc;
        if (oldExt.isEmpty())
@@ -471,7 +471,7 @@ QString ReQStringUtils::replaceExtension(const QString& path,
  *                      <code>false</code>: unknown name found (not replaced)
  */
 bool ReQStringUtils::replacePlaceholders(QString& text,
-    const QMap<QString, QString>& placeholders, QString* error) {
+       const QMap<QString, QString>& placeholders, QString* error) {
        int start = 0;
        bool rc = true;
        QString name;
@@ -510,7 +510,7 @@ bool ReQStringUtils::replacePlaceholders(QString& text,
  *                  otherwise: the length is incremented
  */
 void ReQStringUtils::skipExpected(const ReString& text, QChar expected,
-    int& index, int& length) {
+       int& index, int& length) {
        if (length == 0) {
                // error state, do nothing
        } else if (index >= text.length() || text[index] != expected) {
@@ -533,7 +533,7 @@ void ReQStringUtils::skipExpected(const ReString& text, QChar expected,
  * @return              <code>buffer</code>
  */
 char*ReQStringUtils::utf8(const ReString& source, char buffer[],
-    size_t bufferSize) {
+       size_t bufferSize) {
        QByteArray val = source.toUtf8();
        if (val.length() < (int) bufferSize)
                bufferSize = val.length() + 1;
@@ -545,8 +545,8 @@ char*ReQStringUtils::utf8(const ReString& source, char buffer[],
 class ReParserException: public ReException {
 public:
        ReParserException(const QString& message) :
-                   ReException(),
-                   m_message(message) {
+                       ReException(),
+                       m_message(message) {
        }
 public:
        QString m_message;
@@ -559,11 +559,11 @@ public:
  *                   example: "kibyte:1024;kbyte:1000;mibyte:1048576;mbyte:1000000"
  */
 ReUnitParser::ReUnitParser(const QString& expr, const char* unitList,
-    bool parseAtOnce) :
-           m_result(0),
-           m_expr(expr),
-           m_message(),
-           m_unitList(unitList) {
+       bool parseAtOnce) :
+               m_result(0),
+               m_expr(expr),
+               m_message(),
+               m_unitList(unitList) {
        normalize();
        if (parseAtOnce)
                parse();
@@ -632,7 +632,7 @@ void ReUnitParser::normalize() {
        // This makes the syntax easier to parse: only one sum operator ('+').
        for (int ii = m_expr.length() - 1; ii > 0; ii--) {
                if (m_expr[ii] == '-' && m_expr[ii - 1] != '+'
-                   && m_expr[ii - 1] != '*') {
+                       && m_expr[ii - 1] != '*') {
                        m_expr.insert(ii, '+');
                }
        }
@@ -654,8 +654,8 @@ void ReUnitParser::parse() {
                                QStringList powerOperands = it2->split("^");
                                if (powerOperands.count() > 2)
                                        throw ReParserException(
-                                           QObject::tr(
-                                               "more than 2 power operators, e.g. '2^3^4'"));
+                                               QObject::tr(
+                                                       "more than 2 power operators, e.g. '2^3^4'"));
                                QStringList::const_iterator it3 = powerOperands.begin();
                                QString op = *it3;
                                bool isNeg = op.startsWith("-");
@@ -667,8 +667,8 @@ void ReUnitParser::parse() {
                                        uint64_t exponent = valueOf(*++it3);
                                        if (qLn(value) * qLn(exponent) >= qLn(qPow(2.0, 64)))
                                                throw ReParserException(
-                                                   QObject::tr(
-                                                       "number overflow while power operation"));
+                                                       QObject::tr(
+                                                               "number overflow while power operation"));
                                        for (int ii = 1; ii < (int) exponent; ii++)
                                                value = value * fac;
                                }
@@ -707,12 +707,12 @@ uint64_t ReUnitParser::valueOf(const QString& value) const {
                        QStringList pair = it->split(":");
                        if (pair.count() == 0)
                                throw ReParserException(
-                                   QObject::tr(
-                                       "missing ':' in unit definition, e.g. 'k:1000': ")
-                                       + *it);
+                                       QObject::tr(
+                                               "missing ':' in unit definition, e.g. 'k:1000': ")
+                                               + *it);
                        if (pair.count() > 2)
                                throw ReParserException(
-                                   QObject::tr("too many  ':' in unit definition: ") + *it);
+                                       QObject::tr("too many  ':' in unit definition: ") + *it);
                        bool ok = false;
                        QString unit2 = *pair.begin();
                        QString factor = *++pair.begin();
@@ -727,8 +727,8 @@ uint64_t ReUnitParser::valueOf(const QString& value) const {
                }
                if (!found)
                        throw ReParserException(
-                           QObject::tr("unknown unit '$1'. Allowed: ").arg(unit)
-                               + QString(m_unitList));
+                               QObject::tr("unknown unit '$1'. Allowed: ").arg(unit)
+                                       + QString(m_unitList));
        }
        return rc;
 }
@@ -739,10 +739,10 @@ uint64_t ReUnitParser::valueOf(const QString& value) const {
  * @param expr       an expression, e.g. "10*1024kByte+5MiByte"
  */
 ReSizeParser::ReSizeParser(const QString& expr) :
-           ReUnitParser(expr, "byte:1;kbyte:1000;kibyte:1024;"
-                   "mbyte:1000000;mibyte:1048576;"
-                   "gbyte:1000000000;gibyte:1073741824;"
-                   "tbyte:1000000000000;tibyte:1099511627776") {
+               ReUnitParser(expr, "byte:1;kbyte:1000;kibyte:1024;"
+                       "mbyte:1000000;mibyte:1048576;"
+                       "gbyte:1000000000;gibyte:1073741824;"
+                       "tbyte:1000000000000;tibyte:1099511627776") {
 }
 /**
  * Constructor.
@@ -750,7 +750,7 @@ ReSizeParser::ReSizeParser(const QString& expr) :
  * @param expr     an expression, e.g. "3*3days-5min+3weeks"
  */
 ReDateTimeParser::ReDateTimeParser(const QString& expr) :
-           ReUnitParser("", "minutes:60;hours:3600;days:86400;weeks:604800", false) {
+               ReUnitParser("", "minutes:60;hours:3600;days:86400;weeks:604800", false) {
        parseDateTime(expr);
 }
 
@@ -786,7 +786,7 @@ QDateTime ReDateTimeParser::parseDateTime(const QString& expr) {
                if (m_expr.startsWith("now", Qt::CaseInsensitive)) {
                        m_expr.remove(0, 3);
                } else if ((length2 = ReQStringUtils::lengthOfDateTime(m_expr, 0, true,
-                   true, &dateTime)) > 0) {
+                       true, &dateTime)) > 0) {
                        rc = dateTime;
                        m_expr.remove(0, length2);
                } else {
@@ -806,7 +806,7 @@ QDateTime ReDateTimeParser::parseDateTime(const QString& expr) {
                }
        }
        rc.setMSecsSinceEpoch(
-           isValid() ? rc.toMSecsSinceEpoch() + 1000 * relativeSeconds : 0);
+               isValid() ? rc.toMSecsSinceEpoch() + 1000 * relativeSeconds : 0);
        m_dateTime = rc;
        return rc;
 }
@@ -814,17 +814,20 @@ QDateTime ReDateTimeParser::parseDateTime(const QString& expr) {
 /**
  * Constructor.
  *
- * @param pattern      a pattern with wildcards '*' (any string)
- * @param anchored     <code>true<code>: the pattern starts at the strings start<br>
- *                                     <code>false<code>: the pattern can start anywhere in the string<br>
+ * @param pattern                      a pattern with wildcards '*' (any string)
+ * @param caseSensitivity      caseSensitive or caseInsensitive
+ * @param anchored                     <code>true<code>: the pattern starts at the strings
+ *                                                     start<br>
+ *                                                     <code>false<code>: the pattern can start anywhere in
+ *                                                     the string
  */
 
 ReMatcher::ReMatcher(const QString& pattern, Qt::CaseSensitivity caseSensivity,
-    bool anchored) :
-           m_needles(),
-           m_restLengths(),
-           m_anchored(anchored),
-           m_caseSensivitiy(caseSensivity) {
+       bool anchored) :
+               m_needles(),
+               m_restLengths(),
+               m_anchored(anchored),
+               m_caseSensivitiy(caseSensivity) {
        setPattern(pattern);
 }
 
@@ -838,8 +841,8 @@ bool ReMatcher::matches(const QString& text) {
        bool found = m_needles.size() == 0;
        if (!found) {
                found =
-                   m_anchored ?
-                       text.startsWith(m_needles.at(0), m_caseSensivitiy) : true;
+                       m_anchored ?
+                               text.startsWith(m_needles.at(0), m_caseSensivitiy) : true;
                if (found) {
                        int startIx = m_anchored ? 1 : 0;
                        int textIndex = m_anchored ? m_needles.at(0).length() : 0;
@@ -847,7 +850,7 @@ bool ReMatcher::matches(const QString& text) {
                                found = text.size() - textIndex >= m_restLengths.at(ix);
                                if (found)
                                        found = (textIndex = text.indexOf(m_needles.at(ix),
-                                           textIndex, m_caseSensivitiy)) >= 0;
+                                               textIndex, m_caseSensivitiy)) >= 0;
                        }
                }
        }
@@ -877,3 +880,83 @@ void ReMatcher::setPattern(const QString& pattern) {
 
 }
 
+/**
+ * Constructor.
+ *
+ * @param patterns                     a list of patterns with wildcards '*' (any string)
+ * @param caseSensitivity      caseSensitive or caseInsensitive
+ * @param anchored                     <code>true<code>: the pattern starts at the strings
+ *                                                     start<br>
+ *                                                     <code>false<code>: the pattern can start anywhere in
+ *                                                     the string
+ */
+ReListMatcher::ReListMatcher(const QStringList& patterns,
+                                                        Qt::CaseSensitivity caseSensitivty, bool anchored) :
+       m_patternList(patterns.size())
+{
+       QStringList::const_iterator it;
+       for (it = patterns.constBegin(); it != patterns.cend(); ++it){
+               m_list.append(new ReMatcher(*it, caseSensitivty, anchored));
+       }
+}
+/**
+  * Destructor.
+  */
+ReListMatcher::~ReListMatcher(){
+       QList<ReMatcher*>::const_iterator it;
+       for (it = m_list.constBegin(); it != patterns.cend(); ++it){
+               delete *it;
+       }
+       m_list.clear();
+}
+/**
+ * Tests whether at least one pattern of the list matches the given text
+ * @param text text to test
+ * @return             <code>true</code>: one of the stored patterns matches the text<br>
+ *                             <code>false</code>: none of the patterns matches
+ */
+bool ReListMatcher::matches(const QString& text)
+{
+       QList<ReMatcher*>::const_iterator it;
+       bool rc = false;
+       for (it = m_list.constBegin(); ! rc && it != patterns.cend(); ++it){
+               rc = it->matches(text);
+       }
+       return rc;
+}
+
+/**
+ * Constructor.
+ *
+ * @param includes                     a list of include patterns
+ * @param excludes                     a list of exclude patterns
+ * @param caseSensitivity      caseSensitive or caseInsensitive
+ * @param anchored                     <code>true<code>: the pattern starts at the strings
+ *                                                     start<br>
+ *                                                     <code>false<code>: the pattern can start anywhere in
+ *                                                     the string
+ */
+ReIncludeExcludeMatcher::ReIncludeExcludeMatcher(const QStringList& includes,
+       const QStringList& excludes, Qt::CaseSensitivity caseSensitivty,
+       bool anchored) :
+       m_includes(includes, caseSensitivty, anchored),
+       m_excludes(excludes, caseSensitivty, anchored)
+{
+}
+
+/**
+ * Tests whether a text matches the include patterns and does not match the
+ * exclude patterns.
+ *
+ * @param text                 text to test
+ * @param excludeToo   <code>true</code>: the exclude patterns will be tested
+ * @return                             <code>true</code>: at least one of the include patterns
+ *                                             matches and none of the exclude patterns matches
+ */
+bool ReIncludeExcludeMatcher::matches(const QString& text, bool excludeToo)
+{
+       bool rc = m_includes.matches(text);
+       if (rc && excludeToo && m_excludes.size() > 0)
+               rc = ! m_excludes.matches(text);
+       return rc;
+}
index 443620c836fc804a00b8b515e083b26b06f9031f..5afb71d8a280ae0ed78e2a9b5ed622f80a0d60a3 100644 (file)
@@ -12,6 +12,9 @@
 #ifndef RPLQSTRING_HPP
 #define RPLQSTRING_HPP
 
+/**
+ * Some useful static functions handling <code>QString</code> instances.
+ */
 class ReQStringUtils {
 public:
        static ReString chomp(const ReString& text);
@@ -19,18 +22,18 @@ public:
        static QString& ensureLastChar(QString& value, QChar lastChar);
        static ReString extensionOf(const ReString& filename);
        static int lengthOfDate(const ReString& text, int start = 0, QDate* value =
-           NULL);
+               NULL);
        static int lengthOfDateTime(const ReString& text, int start = 0,
-           bool allowDateOnly = true, bool allowTimeOnly = true, QDateTime* value =
-               NULL);
+               bool allowDateOnly = true, bool allowTimeOnly = true, QDateTime* value =
+                       NULL);
        static int lengthOfReal(const ReString& text, int start = 0, qreal* value =
-           NULL);
+               NULL);
        static int lengthOfTime(const ReString& text, int start = 0, QTime* value =
-           NULL);
+               NULL);
        static int lengthOfUInt64(const ReString& text, int start = 0, int radix =
-           10, uint64_t* value = NULL);
+               10, uint64_t* value = NULL);
        static int lengthOfUInt(const ReString& text, int start, int radix,
-           uint* pValue);
+               uint* pValue);
        static bool match(const QString& heap, const QStringList& needles);
        /**
         * Returns the path with native path separators.
@@ -49,9 +52,9 @@ public:
        static QString pathAppend(const QString& base, const QString& path);
        static QString replaceExtension(const QString& path, const QString& ext);
        static bool replacePlaceholders(QString& text,
-           const QMap<QString, QString>& placeholders, QString* error);
+               const QMap<QString, QString>& placeholders, QString* error);
        static void skipExpected(const ReString& text, QChar expected, int& index,
-           int& length);
+               int& length);
        /**
         * @brief Returns the value of a hexadecimal digit.
         *
@@ -61,16 +64,24 @@ public:
         */
        inline static int valueOfHexDigit(int digit) {
                return digit >= '0' && digit <= '9' ? digit - '0' :
-                      digit >= 'A' && digit <= 'F' ? digit - 'A' + 10 :
-                      digit >= 'a' && digit <= 'f' ? digit - 'a' + 10 : -1;
+                          digit >= 'A' && digit <= 'F' ? digit - 'A' + 10 :
+                          digit >= 'a' && digit <= 'f' ? digit - 'a' + 10 : -1;
        }
        static char* utf8(const ReString& source, char buffer[], size_t bufferSize);
 };
 
+/**
+ * Calculates expressions with simple arithmetic and units.
+ *
+ * Allowed operators are '+', '-', '*', '/' and '^'.
+ * Parenthesis are not allowed.
+ *
+ * Example: 3*7k+8 means 21008
+ */
 class ReUnitParser {
 public:
        ReUnitParser(const QString& expr, const char* unitList, bool parseAtOnce =
-           true);
+               true);
 public:
        bool isValid() const;
        const QString& errorMessage() const;
@@ -93,6 +104,13 @@ public:
        ReSizeParser(const QString& expr);
 };
 
+/**
+ * Calculates time expressions.
+ *
+ * Syntax: { "now" | <date> [<time>] | <time> } [ { '+' | '-' } <second expr>]
+ *          | <second expr>
+ * Example: now+3weeks-5*30days
+ */
 class ReDateTimeParser: public ReUnitParser {
 public:
        ReDateTimeParser(const QString& expr);
@@ -103,10 +121,13 @@ private:
        QDateTime m_dateTime;
 };
 
+/**
+ * Processor for efficient test whether a text matches a pattern ('*' for any string).
+ */
 class ReMatcher {
 public:
        ReMatcher(const QString& pattern, Qt::CaseSensitivity caseSensitivty =
-           Qt::CaseSensitive, bool anchored = false);
+               Qt::CaseSensitive, bool anchored = false);
 public:
        bool matches(const QString& text);
        void setPattern(const QString& pattern);
@@ -118,4 +139,34 @@ protected:
        Qt::CaseSensitivity m_caseSensivitiy;
 };
 
+/**
+ * Processor for efficient test whether a text matches a list of patterns.
+ */
+class ReListMatcher {
+public:
+       ReListMatcher(const QStringList& patterns, Qt::CaseSensitivity caseSensitivty =
+                       Qt::CaseSensitive, bool anchored = false);
+       ~ReListMatcher();
+public:
+       bool matches(const QString& text);
+protected:
+       QList<ReMatcher*> m_list;
+};
+
+/**
+ * Processor for efficient test whether a text matches an include pattern list
+ * and not an exclude pattern list.
+ */
+class ReIncludeExcludeMatcher{
+public:
+       ReIncludeExcludeMatcher(const QStringList& includes, const QStringList& excludes,
+                       Qt::CaseSensitivity caseSensitivty = Qt::CaseSensitive,
+                       bool anchored = false);
+public:
+       bool matches(const QString& text, bool excludeToo = true);
+protected:
+       ReListMatcher m_includes;
+       ReListMatcher m_excludes;
+};
+
 #endif // RPLQSTRING_HPP
index 2d9e14b34dc509bc7ba098378a98b2fe19719b79..05496d4f59a6e42629413f8b9477b53cbaea2f6e 100644 (file)
@@ -32,16 +32,38 @@ ReFileSystem::~ReFileSystem()
 
 }
 
-bool ReFileSystem::getWriteable() const
+/**
+ * Returns whether the filesystem is writeable.
+ *
+ * @return     <code>true</code>: modification in the filesystem are possible
+ *                     <code>false</code>: read only filesystem
+ */
+bool ReFileSystem::writeable() const
 {
        return m_writeable;
 }
 
+/**
+ * Sets the filesystem to writeable or readonly.
+ *
+ * @param writeable    <code>true</code>: the filesystem is writeable
+ */
 void ReFileSystem::setWriteable(bool writeable)
 {
        m_writeable = writeable;
 }
 
+/**
+ * Tests whether a node matches at least one entry of a pattern list.
+ * @param patterns     the list of patterns to test
+ * @param node         the filename to test
+ * @return                     <code>true</code>: at least one entry pattern matches
+ */
+bool ReFileSystem::match(const QStringList& patterns, const QString& node)
+{
+       QStringUtils::
+}
+
 /**
  * Constructor.
  */
@@ -85,16 +107,31 @@ const QString&ReLinuxFS::directory() const
  *                                     Can contain wildcard '*' (for any string)
  * @return                     a list of the files matching the patterns
  */
-QList<ReFileMetaData*> ReLinuxFS::listInfos(const QString& pattern)
+QList<ReFileMetaData*> ReLinuxFS::listInfos(const QString& pattern,
+       const QStringList& excludePatterns)
 {
        QList<ReFileMetaData*> rc;
-       m_dir.setNameFilters(patterns);
-       QFileInfoList list = m_dir.entryInfoList();
-       QFileInfoList::const_iterator it;
+       QStringList list = pattern.size() == 0 ? m_dir.entryList()
+                                                                                  : m_dir.entryList(pattern);
+       QStringList::const_iterator it;
+       QByteArray full = m_currentPath.toUtf8();
+       full.append(OS_SEPARATOR);
+       int pathLength = full.length();
+       struct stat info;
        for (it = list.cbegin(); it != list.cend(); it++){
-               const QFileInfo& info = *it;
-               ReFileMetaData* meta = new ReFileMetaData(info.fileName());
-
+               QString node = *it;
+               full.resize(pathLength);
+               full.append(node.toUtf8());
+               if (stat(full.constData(), &info) == 0){
+                       ReFileMetaData* meta = new ReFileMetaData(node);
+                       meta->m_modified = QDateTime::fromTime_t(info.st_mtim);
+                       meta->m_created = QDateTime::fromTime_t(info.st_ctim);
+                       meta->m_group = info.st_gid;
+                       meta->m_owner = info.st_uid;
+                       meta->m_mode = info.st_mode;
+                       rc.append(meta);
+               }
        }
+       return rc;
 }
 
index 4f7a51e7137690bae7aa328fb918a1634def1f3b..0ce2fc72b8d1f85214256675e0551c7adf8d1b54 100644 (file)
@@ -26,6 +26,14 @@ public:
 };
 
 class ReFileSystem {
+       enum ListOption {
+               LO_UNDEF = 0,
+               LO_FILES = 1,
+               LO_DIRS = 2,
+               LO_EXCLUDE_MATCH_FILES = 4,
+               LO_EXCLUDE_MATCH_DIRS = 8
+       };
+
        enum ErrorCode {
                EC_SUCCESS,
                EC_PATH_NOT_FOUND,
@@ -50,13 +58,17 @@ public:
        /** Returns a list of the file infos of the current directory.
         * @param patterns      only files matching these patterns will be in the result
         *                                      Can contain wildcard '*' (for any string)
+        * @param excludePatterns       only files not matching this patterns
+        *                                                      can be in the result list
         * @return                      a list of the files matching the patterns
         */
-       virtual QList<ReFileMetaData*> listInfos(const QStringList& patterns) = 0;
+       virtual QList<ReFileMetaData*> listInfos(const QStringList& patterns,
+               const QStringList& excludePatterns) = 0;
 public:
        bool getWriteable() const;
        void setWriteable(bool writeable);
-
+public:
+       static bool match(const QStringList& patterns, const QString& node);
 protected:
        QString m_name;
        QString m_directory;
@@ -71,7 +83,8 @@ public:
 public:
        ErrorCode setDirectory(const QString& path);
        const QString& directory() const;
-       QList<ReFileMetaData*> listInfos(const QStringList& patterns);
+       QList<ReFileMetaData*> listInfos(const QStringList& patterns,
+               const QStringList& excludePatterns);
 protected:
        QString m_basePath;
        QString m_currentPath;