You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kftpgrabber/kftpgrabber/src/misc/filter.h

507 lines
13 KiB

/*
* 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 <ntqvariant.h>
#include <ntqvaluelist.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 TQVariant &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.
*/
TQVariant value() const { return m_value; }
/**
* Set condition validation value.
*
* @param value A valid validation value
*/
void setValue(const TQVariant &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;
TQVariant m_value;
};
/**
* This class represents a chain of filter conditions.
*
* @author Jernej Kos
*/
class ConditionChain : public TQPtrList<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 TQVariant &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.
*/
TQVariant value() const { return m_value; }
/**
* Set action parameter.
*
* @param value Parameter value
*/
void setValue(const TQVariant &value) { m_value = value; }
private:
bool m_valid;
Type m_type;
TQVariant m_value;
};
/**
* This class represents a chain of filter actions.
*
* @author Jernej Kos
*/
class ActionChain : public TQPtrList<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 TQString &name);
/**
* Get rule's name.
*/
TQString name() const { return m_name; }
/**
* Set rule's name.
*/
void setName(const TQString &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:
TQString 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 TQPtrList<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, TQValueList<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 TQStringList representing the field names
*/
const TQStringList &getFieldNames() { return m_fieldNames; }
/**
* Get a human readable list of possible action names
*
* @return A TQStringList representing the action names
*/
const TQStringList &getActionNames() { return m_actionNames; }
protected:
/**
* Class constructor.
*/
Filters();
private:
static Filters *m_self;
bool m_enabled;
ActionChain m_emptyActionChain;
TQStringList m_fieldNames;
TQStringList m_actionNames;
};
}
}
#endif