00001
00002
00003
00004
00005
00006
00007
00008
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
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
00219 if (current_block) {
00220 current_block->applyTo(res);
00221 res = current_block->getResult();
00222
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
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
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
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 }