akregator/src

articlefilter.h
00001 /*
00002  * articlefilter.h
00003  *
00004  * Copyright (c) 2004, 2005 Frerich Raabe <raabe@kde.org>
00005  *               2005 Frank Osterfeld <frank.osterfeld@kdemail.net>
00006  *
00007  * Redistribution and use in source and binary forms, with or without
00008  * modification, are permitted provided that the following conditions
00009  * are met:
00010  *
00011  * 1. Redistributions of source code must retain the above copyright
00012  *    notice, this list of conditions and the following disclaimer.
00013  * 2. Redistributions in binary form must reproduce the above copyright
00014  *    notice, this list of conditions and the following disclaimer in the
00015  *    documentation and/or other materials provided with the distribution.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
00018  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00019  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00020  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
00021  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
00022  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00023  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00024  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00025  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00026  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00027  */
00028 #ifndef ARTICLEFILTER_H
00029 #define ARTICLEFILTER_H
00030 
00031 #include <tqstring.h>
00032 #include <tqvaluelist.h>
00033 #include <tqvariant.h>
00034 
00035 class TDEConfig;
00036 
00037 namespace Akregator {
00038 
00039 class Article;
00040 
00041 namespace Filters {
00042 
00043 class AbstractAction;
00044 class AbstractMatcher;
00045 class Criterion;
00046 
00050 class ArticleFilter
00051 {
00052     public:
00053 
00054         ArticleFilter();
00055         ArticleFilter(const AbstractMatcher& matcher, const AbstractAction& action);
00056         ArticleFilter(const ArticleFilter& other);
00057 
00058         virtual ~ArticleFilter();
00059 
00061         void applyTo(Article& article) const;
00062 
00063         
00064         
00066         const TQString& name() const;
00067         void setName(const TQString& name);
00068 
00069         int id() const;
00070 
00071         AbstractMatcher* matcher() const;
00072         void setMatcher(const AbstractMatcher& matcher);
00073 
00074         AbstractAction* action() const;
00075         void setAction(const AbstractAction& action);
00076 
00077         ArticleFilter& operator=(const ArticleFilter& other);
00078         bool operator==(const ArticleFilter& other) const;
00079 
00080         void writeConfig(TDEConfig* config) const;
00081         void readConfig(TDEConfig* config);
00082 
00083     private:
00084         class ArticleFilterPrivate;
00085         ArticleFilterPrivate* d;
00086     
00087 };
00088 
00089 class ArticleFilterList : public TQValueList<ArticleFilter>
00090 {
00091 public:
00092     
00093     void writeConfig(TDEConfig* config) const;
00094     void readConfig(TDEConfig* config);
00095 };
00096 
00100 class AbstractMatcher
00101 {
00102     public:
00103 
00104         virtual ~AbstractMatcher() {}
00106         virtual AbstractMatcher* clone() const = 0;
00107 
00108         virtual bool matches(const Article& article) const = 0;
00109 
00110         virtual void writeConfig(TDEConfig* config) const = 0;
00111         virtual void readConfig(TDEConfig* config) = 0;
00112 
00113         virtual bool operator==(const AbstractMatcher&) const = 0;
00114         virtual bool operator!=(const AbstractMatcher &other) const = 0;
00115 };
00116 
00117 class TagMatcher : public AbstractMatcher
00118 {
00119     public:
00120 
00121         TagMatcher();
00122         TagMatcher(const TQString& tagID);
00123         TagMatcher(const TagMatcher& other);
00124         
00125         virtual ~TagMatcher();
00126         
00127 
00128         virtual bool matches(const Article& article) const;
00129 
00130         virtual TagMatcher* clone() const;
00131 
00132         virtual void writeConfig(TDEConfig* config) const;
00133         virtual void readConfig(TDEConfig* config);
00134 
00135         TagMatcher& operator=(const TagMatcher& other);
00136         virtual bool operator==(const AbstractMatcher&) const;
00137         virtual bool operator!=(const AbstractMatcher &other) const;
00138         
00139     private:
00140     
00141          class TagMatcherPrivate;
00142          TagMatcherPrivate* d;
00143 };
00144 
00145 class AbstractAction
00146 {
00147     public:
00148         AbstractAction() {}
00149         virtual ~AbstractAction() {}
00150 
00151     public:
00152         virtual void exec(Article& article) = 0;
00153 
00154         virtual void writeConfig(TDEConfig* config) const = 0;
00155         virtual void readConfig(TDEConfig* config) = 0;
00156 
00157         virtual AbstractAction* clone() const = 0;
00158         virtual bool operator==(const AbstractAction& other) = 0;
00159 };
00160 
00161 class DeleteAction : public AbstractAction
00162 {
00163     public:
00164         virtual void exec(Article& article);
00165         
00166         virtual void writeConfig(TDEConfig* config) const;
00167         virtual void readConfig(TDEConfig* config);
00168 
00169         virtual DeleteAction* clone() const { return new DeleteAction; }
00170         virtual bool operator==(const AbstractAction& other);
00171 };
00172 
00173 class SetStatusAction : public AbstractAction
00174 {
00175     public:
00176         SetStatusAction(int status=0);
00177         
00178         virtual void exec(Article& article);
00179         
00180         int status() const;
00181         void setStatus(int status);
00182 
00183         virtual void writeConfig(TDEConfig* config) const;
00184         virtual void readConfig(TDEConfig* config);
00185 
00186         virtual SetStatusAction* clone() const { return new SetStatusAction(*this); }
00187         virtual bool operator==(const AbstractAction& other);
00188 
00189     private:
00190         int m_status;
00191 };
00192 
00193 class AssignTagAction : public AbstractAction
00194 {
00195     public:
00196 
00197         AssignTagAction(const TQString& tagID=TQString());
00198         virtual void exec(Article& article);
00199                 
00200         const TQString& tagID() const;
00201         void setTagID(const TQString& tagID);
00202 
00203         virtual void writeConfig(TDEConfig* config) const;
00204         virtual void readConfig(TDEConfig* config);
00205 
00206         virtual AssignTagAction* clone() const { return new AssignTagAction(*this); }
00207         virtual bool operator==(const AbstractAction& other);
00208 
00209     private:
00210         TQString m_tagID;
00211 };
00212 
00216 class ArticleMatcher : public AbstractMatcher
00217 {
00218     public:
00219 
00220         enum Association {
00221             None, LogicalAnd, LogicalOr
00222         };
00223 
00224         ArticleMatcher();
00225         ArticleMatcher( const TQValueList<Criterion> &criteria, Association assoc);
00226         
00227         ArticleMatcher(const ArticleMatcher& other);
00228         virtual ~ArticleMatcher();
00229 
00234         virtual bool matchesAll() const;
00235         
00236         ArticleMatcher& operator=(const ArticleMatcher& other);
00237         virtual ArticleMatcher* clone() const;
00238         virtual bool matches(const Article &article) const;
00239         virtual bool operator==(const AbstractMatcher &other) const;
00240         virtual bool operator!=(const AbstractMatcher &other) const;
00241         
00242         
00243         virtual void writeConfig(TDEConfig* config) const;
00244         virtual void readConfig(TDEConfig* config);
00245 
00246     private:
00247 
00248         static Association stringToAssociation(const TQString& assocStr);
00249         static TQString associationToString(Association association);
00250 
00251         bool anyCriterionMatches( const Article &a ) const;
00252         bool allCriteriaMatch( const Article &a ) const;
00253 
00254         TQValueList<Criterion> m_criteria;
00255         Association m_association;
00256 };
00257 
00261 class Criterion
00262 {
00263     public:
00264 
00265         enum Subject {
00266             Title, Description, Author, Link, Status, KeepFlag
00267         };
00268 
00269         static TQString subjectToString(Subject subj);
00270         static Subject stringToSubject(const TQString& subjStr);
00271 
00272         enum Predicate {
00273             Contains = 0x01,
00274             Equals = 0x02,
00275             Matches = 0x03,
00276             Negation = 0x80
00277         };
00278 
00279         static TQString predicateToString(Predicate pred);
00280         static Predicate stringToPredicate(const TQString& predStr);
00281     
00282         Criterion();
00283         Criterion( Subject subject, Predicate predicate, const TQVariant &object );
00284         
00285         bool satisfiedBy( const Article &article ) const;
00286 
00287         virtual void writeConfig(TDEConfig* config) const;
00288         virtual void readConfig(TDEConfig* config);
00289 
00290         Subject subject() const;
00291         Predicate predicate() const;
00292         TQVariant object() const;
00293         bool operator==(const Criterion& other) const
00294         { return m_subject == other.m_subject && m_predicate == other.m_predicate && m_object == other.m_object; }
00295         
00296     private:
00297         Subject m_subject;
00298         Predicate m_predicate;
00299         TQVariant m_object;
00300 };
00301 
00302 } // namespace Filters
00303 } // namespace Akregator
00304 
00305 #endif