Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

MtpFilter.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2002 by Yann Hodique                                    *
00003  *   Yann.Hodique@lifl.fr                                                  *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  ***************************************************************************/
00010 
00011 #include "MtpFilter.h"
00012 #include "MtpContext.h"
00013 #include "domutil.h"
00014 
00015 #include <iostream>
00016 
00017 #include <qdom.h>
00018 
00019 MtpFilter::MtpFilter(QDomDocument* dom, MtpContext* context) {
00020     current_block = 0;
00021     m_dom = dom;
00022     m_context = context;
00023     obsolete = false;
00024     
00025     QStringList filters;
00026     
00027     filters = DomUtil::readListEntry(*m_dom,"/general/filters/input","filter");
00028     for(QStringList::Iterator it = filters.begin(); it != filters.end(); ++it) {
00029   InputFilter* f = new InputFilter(*it,DomUtil::readBoolEntry(*m_dom,"/filters/" + *it + "/memorize",false),m_context);
00030   f->setRegExp(DomUtil::readEntry(*m_dom,"/filters/" + *it + "/regexp"));
00031   f->setResultPattern(DomUtil::readEntry(*m_dom,"/filters/" + *it + "/result"));
00032   f->setPolicy((Filter::Policy)DomUtil::readIntEntry(*m_dom,"/filters/" + *it + "/policy",Filter::Transient));
00033   f->setEnabled(DomUtil::readBoolEntry(*m_dom,"/filters/" + *it + "/active",true));
00034   
00035   addInputFilter(f);
00036     }
00037     
00038     filters = DomUtil::readListEntry(*m_dom,"/general/filters/item","filter");
00039     for(QStringList::Iterator it = filters.begin(); it != filters.end(); ++it) {
00040   ItemFilter* f = new ItemFilter(*it,m_context);
00041   f->setRegExp(DomUtil::readEntry(*m_dom,"/filters/" + *it + "/regexp"));
00042   f->setResultPattern(DomUtil::readEntry(*m_dom,"/filters/" + *it + "/result"));
00043   f->setPolicy((Filter::Policy)DomUtil::readIntEntry(*m_dom,"/filters/" + *it + "/policy",Filter::Transient));
00044   f->setEnabled(DomUtil::readBoolEntry(*m_dom,"/filters/" + *it + "/active",true));
00045   
00046   addItemFilter(f);
00047     }
00048     
00049     filters = DomUtil::readListEntry(*m_dom,"/general/filters/line","filter");
00050     for(QStringList::Iterator it = filters.begin(); it != filters.end(); ++it) {
00051   LineFilter* f = new LineFilter(*it,m_context);
00052   f->setRegExp(DomUtil::readEntry(*m_dom,"/filters/" + *it + "/regexp"));
00053   f->setResultPattern(DomUtil::readEntry(*m_dom,"/filters/" + *it + "/result"));
00054   f->setPolicy((Filter::Policy)DomUtil::readIntEntry(*m_dom,"/filters/" + *it + "/policy",Filter::Transient));
00055   f->setEnabled(DomUtil::readBoolEntry(*m_dom,"/filters/" + *it + "/active",true));
00056   
00057   addLineFilter(f);
00058     }
00059     
00060     filters = DomUtil::readListEntry(*m_dom,"/general/filters/block","filter");
00061     for(QStringList::Iterator it = filters.begin(); it != filters.end(); ++it) {
00062   BlockFilter* f = new BlockFilter(*it,m_context);
00063   f->setBeginRegExp(DomUtil::readEntry(*m_dom,"/filters/" + *it + "/begin"));
00064   f->setEndRegExp(DomUtil::readEntry(*m_dom,"/filters/" + *it + "/end"));
00065   f->setResultPattern(DomUtil::readEntry(*m_dom,"/filters/" + *it + "/result"));
00066   f->setPolicy((Filter::Policy)DomUtil::readIntEntry(*m_dom,"/filters/" + *it + "/policy",Filter::Transient));
00067   f->setEnabled(DomUtil::readBoolEntry(*m_dom,"/filters/" + *it + "/active",true));
00068   
00069   QString dep = DomUtil::readEntry(*m_dom,"/filters/" + *it + "/depend",QString::null);
00070   if(!dep.isNull()) {
00071       for(std::vector<InputFilter*>::iterator iter = input.begin(); iter != input.end(); ++iter)
00072     if((*iter)->getName() == dep) {
00073         f->setInputDependency(*iter);
00074         break;
00075     }
00076   }
00077   addBlockFilter(f);
00078     }
00079     
00080     filters = DomUtil::readListEntry(*m_dom,"/general/filters/global","filter");
00081     for(QStringList::Iterator it = filters.begin(); it != filters.end(); ++it) {
00082   GlobalFilter* f = new GlobalFilter(*it,m_context);
00083   f->setResultPattern(DomUtil::readEntry(*m_dom,"/filters/" + *it + "/result"));
00084   f->setPolicy((Filter::Policy)DomUtil::readIntEntry(*m_dom,"/filters/" + *it + "/policy",Filter::Transient));
00085   f->setEnabled(DomUtil::readBoolEntry(*m_dom,"/filters/" + *it + "/active",true));
00086   
00087   addGlobalFilter(f);
00088     }
00089 }
00090 
00091 
00092 MtpFilter::~MtpFilter() {
00093 
00094     if(!obsolete) {
00095   QDomElement child = DomUtil::elementByPath(*m_dom,"/filters");
00096   if(!child.isNull()) child.parentNode().removeChild(child);
00097     }
00098 
00099     QStringList filters;
00100 
00101     for (std::vector<GlobalFilter*>::iterator it = global.begin(); it != global.end(); ++it) {
00102   if(!obsolete) {
00103       QString name((*it)->getName());
00104       DomUtil::writeBoolEntry(*m_dom,"/filters/" + name + "/active",(*it)->isEnabled());
00105       DomUtil::writeIntEntry(*m_dom,"/filters/" + name + "/policy",(*it)->policy());
00106       DomUtil::writeEntry(*m_dom,"/filters/" + name + "/result",(*it)->getResultPattern());
00107       filters << name;
00108   }
00109         delete *it;
00110     }
00111     if(!obsolete) {
00112   DomUtil::writeListEntry(*m_dom,"/general/filters/global","filter",filters);
00113   filters.clear();
00114     }
00115     
00116     for (std::vector<BlockFilter*>::iterator it = block.begin(); it != block.end(); ++it) {
00117   if(!obsolete) {
00118       QString name((*it)->getName());
00119       DomUtil::writeBoolEntry(*m_dom,"/filters/" + name + "/active",(*it)->isEnabled());
00120       DomUtil::writeIntEntry(*m_dom,"/filters/" + name + "/policy",(*it)->policy());
00121       DomUtil::writeEntry(*m_dom,"/filters/" + name + "/result",(*it)->getResultPattern());
00122       DomUtil::writeEntry(*m_dom,"/filters/" + name + "/begin",(*it)->getBeginRegExp());
00123       DomUtil::writeEntry(*m_dom,"/filters/" + name + "/end",(*it)->getEndRegExp());
00124       if((*it)->getInputDependency())
00125     DomUtil::writeEntry(*m_dom,"/filters/" + name + "/depend",(*it)->getInputDependency()->getName());
00126       filters << name;
00127   }
00128         delete *it;
00129     }
00130     if(!obsolete) {
00131   DomUtil::writeListEntry(*m_dom,"/general/filters/block","filter",filters);
00132   filters.clear();
00133     }
00134     
00135     for (std::vector<LineFilter*>::iterator it = line.begin(); it != line.end(); ++it) {
00136   if(!obsolete) {
00137       QString name((*it)->getName());
00138       DomUtil::writeBoolEntry(*m_dom,"/filters/" + name + "/active",(*it)->isEnabled());
00139       DomUtil::writeIntEntry(*m_dom,"/filters/" + name + "/policy",(*it)->policy());
00140       DomUtil::writeEntry(*m_dom,"/filters/" + name + "/result",(*it)->getResultPattern());
00141       DomUtil::writeEntry(*m_dom,"/filters/" + name + "/regexp",(*it)->getRegExp());
00142       filters << name;
00143   }
00144         delete *it;
00145     }
00146     if(!obsolete) {
00147   DomUtil::writeListEntry(*m_dom,"/general/filters/line","filter",filters);
00148   filters.clear();
00149     }
00150     
00151     for (std::vector<ItemFilter*>::iterator it = item.begin(); it != item.end(); ++it) {
00152   if(!obsolete) { 
00153       QString name((*it)->getName());
00154       DomUtil::writeBoolEntry(*m_dom,"/filters/" + name + "/active",(*it)->isEnabled());
00155       DomUtil::writeIntEntry(*m_dom,"/filters/" + name + "/policy",(*it)->policy());
00156       DomUtil::writeEntry(*m_dom,"/filters/" + name + "/result",(*it)->getResultPattern());
00157       DomUtil::writeEntry(*m_dom,"/filters/" + name + "/regexp",(*it)->getRegExp());
00158       filters << name;
00159   }
00160         delete *it;
00161     }
00162     if(!obsolete) {
00163   DomUtil::writeListEntry(*m_dom,"/general/filters/item","filter",filters);
00164   filters.clear();
00165     }
00166     
00167     for (std::vector<InputFilter*>::iterator it = input.begin(); it != input.end(); ++it) {
00168   if(!obsolete) { 
00169       QString name((*it)->getName());
00170       DomUtil::writeBoolEntry(*m_dom,"/filters/" + name + "/active",(*it)->isEnabled());
00171       DomUtil::writeIntEntry(*m_dom,"/filters/" + name + "/policy",(*it)->policy());
00172       DomUtil::writeEntry(*m_dom,"/filters/" + name + "/result",(*it)->getResultPattern());
00173       DomUtil::writeEntry(*m_dom,"/filters/" + name + "/regexp",(*it)->getRegExp());
00174       DomUtil::writeBoolEntry(*m_dom,"/filters/" + name + "/memorize",(*it)->memorize());
00175       filters << name;
00176   }
00177         delete *it;
00178     }
00179     if(!obsolete) {
00180   DomUtil::writeListEntry(*m_dom,"/general/filters/input","filter",filters);
00181   filters.clear();
00182     }
00183     
00184     for (std::vector<InputFilter*>::iterator it = queue.begin(); it != queue.end(); ++it)
00185         delete *it;
00186 }
00187 
00188 QString MtpFilter::filterIn(const QString & arg) {
00189     QString res(arg);
00190 
00191     for (std::vector<InputFilter*>::iterator it = input.begin(); it != input.end(); ++it) {
00192         if ((*it)->isEnabled()) {
00193             if ((*it)->applyTo(res)) {
00194                 res = (*it)->getResult();
00195                 if ((*it)->memorize())
00196                     queue.push_back(*it);
00197             }
00198         }
00199     }
00200     return res;
00201 }
00202 
00203 QString MtpFilter::filterOut(const QString & arg) {
00204 
00205     QString res(arg);
00206 
00207     // Global Filter
00208     for (std::vector<GlobalFilter*>::iterator it = global.begin(); it != global.end(); ++it) {
00209         if ((*it)->isEnabled() && (*it)->applyTo(res)) {
00210             res = (*it)->getResult();
00211             if ((*it)->policy() == Filter::Final)
00212                 return res;
00213             else
00214                 break;
00215         }
00216     }
00217 
00218     // Block Filter
00219     if (current_block) {
00220         current_block->applyTo(res);
00221         res = current_block->getResult();
00222         //std::cerr << res << std::endl;
00223         bool stop = (current_block->policy() == Filter::Final);
00224         if (current_block->isFinished())
00225             current_block = 0;
00226         if (stop)
00227             return res;
00228     } else
00229         for (std::vector<BlockFilter*>::iterator it = block.begin(); it != block.end(); ++it) {
00230             if ((*it)->isEnabled()) {
00231                 InputFilter * in;
00232                 if ((!(in = (*it)->getInputDependency())) || ((!queue.empty()) && (queue[0] == in))) {
00233                     if ((*it)->applyTo(res,BlockFilter::BEGIN)) {
00234                         //std::cout << "Beginning of Block" << std::endl;
00235                         current_block = *it;
00236                         if (in)
00237                             queue.erase(queue.begin());
00238                         res = (*it)->getResult();
00239                         if ((*it)->policy() == Filter::Final)
00240                             return res;
00241                         else
00242                             break;
00243                     }
00244                 }
00245             }
00246         }
00247 
00248     // Line Filter
00249     for (std::vector<LineFilter*>::iterator it = line.begin(); it != line.end(); ++it) {
00250         if ((*it)->isEnabled() && (*it)->applyTo(res)) {
00251             res = (*it)->getResult();
00252             if ((*it)->policy() == Filter::Final)
00253                 return res;
00254             else
00255                 break;
00256         }
00257     }
00258 
00259     // Item Filter
00260     for (std::vector<ItemFilter*>::iterator it = item.begin(); it != item.end(); ++it) {
00261         if ((*it)->isEnabled() && (*it)->applyTo(res)) {
00262             res = (*it)->getResult();
00263         }
00264     }
00265 
00266     return res;
00267 }
00268 
00269 void MtpFilter::addGlobalFilter(GlobalFilter * f) {
00270     global.push_back(f);
00271 }
00272 
00273 void MtpFilter::addBlockFilter(BlockFilter * f) {
00274     block.push_back(f);
00275 }
00276 
00277 void MtpFilter::addLineFilter(LineFilter * f) {
00278     line.push_back(f);
00279 }
00280 
00281 void MtpFilter::addItemFilter(ItemFilter * f) {
00282     item.push_back(f);
00283 }
00284 
00285 void MtpFilter::addInputFilter(InputFilter * f) {
00286     input.push_back(f);
00287 }
00288 
00289 InputFilter* MtpFilter::getInputFilter(const QString& name) {
00290     for(std::vector<InputFilter*>::iterator it = input.begin(); it != input.end(); ++it)
00291         if ((*it)->getName() == name)
00292             return (*it);
00293     return 0;
00294 }

Generated on Sat May 10 15:09:27 2003 for qnet by doxygen1.3