summaryrefslogtreecommitdiffstats
path: root/kftpgrabber/src/misc/filter.h
diff options
context:
space:
mode:
Diffstat (limited to 'kftpgrabber/src/misc/filter.h')
-rw-r--r--kftpgrabber/src/misc/filter.h506
1 files changed, 506 insertions, 0 deletions
diff --git a/kftpgrabber/src/misc/filter.h b/kftpgrabber/src/misc/filter.h
new file mode 100644
index 0000000..8c7ac36
--- /dev/null
+++ b/kftpgrabber/src/misc/filter.h
@@ -0,0 +1,506 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPCORE_FILTERFILTERS_H
+#define KFTPCORE_FILTERFILTERS_H
+
+#include <qvariant.h>
+#include <qvaluelist.h>
+
+#include "engine/directorylisting.h"
+
+namespace KFTPCore {
+
+namespace Filter {
+
+/**
+ * Possible filter fields.
+ */
+enum Field {
+ Filename = 0,
+ EntryType = 1,
+ Size = 2
+};
+
+/**
+ * A filter condition class of different types.
+ *
+ * @author Jernej Kos
+ */
+class Condition {
+public:
+ /**
+ * Condition type.
+ *
+ * The following types are valid:
+ * - None: this rule never validates
+ * - Contains: field contains a given substring
+ * - ContainsNot: field does not contain a given substring
+ * - Is: field is equal to the given value
+ * - IsNot: field is not equal to the given value
+ * - Matches: field matches a given regular expression
+ * - MatchesNot: field doesn't match a given regular expression
+ * - Greater: field's integer value is greater than the given value
+ * - Smaller: field's integer value is smaller than the given value
+ */
+ enum Type {
+ None = -1,
+ Contains = 0,
+ ContainsNot = 1,
+ Is = 2,
+ IsNot = 3,
+ Matches = 4,
+ MatchesNot = 5,
+ Greater = 6,
+ Smaller = 7
+ };
+
+ /**
+ * Class constructor. The constructed condition is invalid.
+ */
+ Condition() {}
+
+ /**
+ * Class constructor.
+ *
+ * @param field Field to check
+ * @param type Condition type
+ * @param value Value to check against
+ */
+ Condition(Field field, Type type, const QVariant &value);
+
+ /**
+ * Returns the field this condition operates on.
+ */
+ Field field() const { return m_field; }
+
+ /**
+ * Set condition field.
+ *
+ * @param field A valid condition field
+ */
+ void setField(Field field) { m_field = field; }
+
+ /**
+ * Returns the type of this condition.
+ */
+ Type type() const { return m_type; }
+
+ /**
+ * Set condition type.
+ *
+ * @param type A valid condition type
+ */
+ void setType(Type type) { m_type = type; }
+
+ /**
+ * Returns the value this condition validates the field with.
+ */
+ QVariant value() const { return m_value; }
+
+ /**
+ * Set condition validation value.
+ *
+ * @param value A valid validation value
+ */
+ void setValue(const QVariant &value) { m_value = value; }
+
+ /**
+ * Does the specified entry match this condition ?
+ *
+ * @param entry Directory entry to compare
+ * @return True if the entry matches this condition, false otherwise
+ */
+ bool matches(const KFTPEngine::DirectoryEntry &entry) const;
+private:
+ Field m_field;
+ Type m_type;
+ QVariant m_value;
+};
+
+/**
+ * This class represents a chain of filter conditions.
+ *
+ * @author Jernej Kos
+ */
+class ConditionChain : public QPtrList<Condition> {
+public:
+ /**
+ * Chain type.
+ *
+ * The following types are valid:
+ * - All: all conditions must match
+ * - Any: any condition can match
+ */
+ enum Type {
+ All = 0,
+ Any = 1
+ };
+
+ /**
+ * Class constructor.
+ */
+ ConditionChain();
+
+ /**
+ * Class constructor.
+ */
+ ConditionChain(Type type);
+
+ /**
+ * Returns condition chain match type.
+ */
+ Type type() const { return m_type; }
+
+ /**
+ * Set condition chain match type.
+ *
+ * @param type A valid type
+ */
+ void setType(Type type) { m_type = type; }
+
+ /**
+ * Does the specified entry match this condition chain ? The actual
+ * matching depends on chain type.
+ *
+ * @param entry Directory entry to compare
+ * @return True if the entry matches this chain, false otherwise
+ */
+ bool matches(const KFTPEngine::DirectoryEntry &entry) const;
+private:
+ Type m_type;
+};
+
+/**
+ * This class represents a single action to take.
+ */
+class Action {
+public:
+ /**
+ * Action type.
+ *
+ * These are the valid types:
+ * - Priority: when queuing files, their priority should be changed
+ * - Skip: do not queue such files
+ * - Colorize: change font color in the list view
+ * - Hide: do not display such files in the list view
+ * - Lowercase: lowercase the destination filename when queuing
+ */
+ enum Type {
+ None = 0,
+ Priority = 1,
+ Skip = 2,
+ Colorize = 3,
+ Hide = 4,
+ Lowercase = 5
+ };
+
+ /**
+ * Class constructor. The resulting action is invalid.
+ */
+ Action();
+
+ /**
+ * Class constructor.
+ *
+ * @param type Action type
+ * @param value Action parameters
+ */
+ Action(Type type, const QVariant &value);
+
+ /**
+ * Returns true if the action is valid.
+ */
+ bool isValid() const { return m_valid; }
+
+ /**
+ * Get action's type.
+ */
+ Type type() const { return m_type; }
+
+ /**
+ * Set the action type.
+ *
+ * @param type A valid action type
+ */
+ void setType(Type type) { m_type = type; }
+
+ /**
+ * Get action's parameters.
+ */
+ QVariant value() const { return m_value; }
+
+ /**
+ * Set action parameter.
+ *
+ * @param value Parameter value
+ */
+ void setValue(const QVariant &value) { m_value = value; }
+private:
+ bool m_valid;
+ Type m_type;
+ QVariant m_value;
+};
+
+/**
+ * This class represents a chain of filter actions.
+ *
+ * @author Jernej Kos
+ */
+class ActionChain : public QPtrList<Action> {
+public:
+ /**
+ * Class constructor.
+ */
+ ActionChain();
+
+ /**
+ * Get an action of the specified type.
+ *
+ * @param type Action type to search for
+ * @return A valid Action or null if there is none
+ */
+ const Action *getAction(Action::Type type) const;
+};
+
+/**
+ * This class represents a single filter rule consiting of a condition chain
+ * and an action chain.
+ *
+ * @author Jernej Kos
+ */
+class Rule {
+public:
+ /**
+ * Class constructor.
+ */
+ Rule();
+
+ /**
+ * Class copy constructor. Creates a duplicate deep copy of the provided
+ * rule.
+ *
+ * @param rule The rule to copy
+ */
+ Rule(const Rule *rule);
+
+ /**
+ * Class constructor.
+ *
+ * @param name Human readable rule name
+ */
+ Rule(const QString &name);
+
+ /**
+ * Get rule's name.
+ */
+ QString name() const { return m_name; }
+
+ /**
+ * Set rule's name.
+ */
+ void setName(const QString &name) { m_name = name; }
+
+ /**
+ * Is this rule enabled or not ?
+ *
+ * @return True if the rule is enabled, false otherwise
+ */
+ bool isEnabled() const { return m_enabled; }
+
+ /**
+ * Enable or disable this rule.
+ *
+ * @param value True if the rule is enabled, false otherwise
+ */
+ void setEnabled(bool value) { m_enabled = value; }
+
+ /**
+ * Get the condition chain reference.
+ */
+ const ConditionChain *conditions() const { return &m_conditionChain; }
+
+ /**
+ * Get the action chain reference.
+ */
+ const ActionChain *actions() const { return &m_actionChain; }
+private:
+ QString m_name;
+ bool m_enabled;
+ ConditionChain m_conditionChain;
+ ActionChain m_actionChain;
+};
+
+/**
+ * This class contains all the currently loaded rules.
+ *
+ * @author Jernej Kos
+ */
+class Filters : public QPtrList<Rule> {
+public:
+ /**
+ * Get the global rule chain.
+ */
+ static Filters *self();
+
+ /**
+ * Class destructor.
+ */
+ ~Filters();
+
+ /**
+ * Load the rules from a file.
+ */
+ void load();
+
+ /**
+ * Serialize the rules and save them to a file.
+ */
+ void save();
+
+ /**
+ * Is filtering enabled or not ?
+ *
+ * @return True if filtering is enabled, false otherwise
+ */
+ bool isEnabled() const { return m_enabled; }
+
+ /**
+ * Enable or disable filtering.
+ *
+ * @param value True if filtering is enabled, false otherwise
+ */
+ void setEnabled(bool value) { m_enabled = value; }
+
+ /**
+ * Process the specified entry and return an action chain that matched
+ * first.
+ *
+ * @param entry The entry to process
+ * @return An ActionChain reference (might be empty if nothing matched)
+ */
+ const ActionChain *process(const KFTPEngine::DirectoryEntry &entry) const;
+
+ /**
+ * Process the specified entry and return an action to use. This will
+ * go trough all loaded rules and attempt to process each one by one.
+ * The first one that succeeds is returned.
+ *
+ * @param entry The entry to process
+ * @param types Only return the action of this type
+ * @return An Action reference (might be invalid if nothing matched)
+ */
+ const Action *process(const KFTPEngine::DirectoryEntry &entry, QValueList<Action::Type> types) const;
+
+ /**
+ * Process the specified entry and return an action to use. This will
+ * go trough all loaded rules and attempt to process each one by one.
+ * The first one that succeeds is returned.
+ *
+ * @param entry The entry to process
+ * @param filter Only return the action of this type
+ * @return An Action reference (might be invalid if nothing matched)
+ */
+ const Action *process(const KFTPEngine::DirectoryEntry &entry, Action::Type filter) const;
+
+ /**
+ * This method is provided for convienience. It behaves just like the
+ * above method.
+ *
+ * @param url File's URL
+ * @param size File's size
+ * @param directory True if the entry is a directory
+ * @param filter Only return the action of this type
+ * @return An Action reference (might be invalid if nothing matched)
+ */
+ const Action *process(const KURL &url, filesize_t size, bool directory, Action::Type filter) const;
+
+ /**
+ * Process the specified entry and return an action chain that matched
+ * first.
+ *
+ * @param url File's URL
+ * @param size File's size
+ * @param directory True if the entry is a directory
+ * @return An ActionChain reference (might be invalid if nothing matched)
+ */
+ const ActionChain *process(const KURL &url, filesize_t size, bool directory) const;
+
+ /**
+ * This method is provided for convienience. It behaves just like the
+ * above method.
+ *
+ * Note that 0 will be used for filesize and this may affect the filter
+ * process!
+ *
+ * @param url File's URL
+ * @param filter Only return the action of this type
+ * @return An Action reference (might be invalid if nothing matched)
+ */
+ const Action *process(const KURL &url, Action::Type filter) const;
+
+ /**
+ * Get a human readable list of possible field names.
+ *
+ * @return A QStringList representing the field names
+ */
+ const QStringList &getFieldNames() { return m_fieldNames; }
+
+ /**
+ * Get a human readable list of possible action names
+ *
+ * @return A QStringList representing the action names
+ */
+ const QStringList &getActionNames() { return m_actionNames; }
+protected:
+ /**
+ * Class constructor.
+ */
+ Filters();
+private:
+ static Filters *m_self;
+
+ bool m_enabled;
+ ActionChain m_emptyActionChain;
+
+ QStringList m_fieldNames;
+ QStringList m_actionNames;
+};
+
+}
+
+}
+
+#endif