00001
00002
00003
00004
00005
#ifdef HAVE_CONFIG_H
00006
#include <config.h>
00007
#endif
00008
00009
#include "kmfiltermgr.h"
00010
00011
00012
#include "kmfilterdlg.h"
00013
#include "kmfolderindex.h"
00014
#include "messageproperty.h"
00015
using KMail::MessageProperty;
00016
00017
00018
#include <kdebug.h>
00019
#include <klocale.h>
00020
#include <kconfig.h>
00021
00022
00023
#include <qregexp.h>
00024
00025
00026
#include <assert.h>
00027
00028
00029
00030 KMFilterMgr::KMFilterMgr(
bool popFilter )
00031 : QPtrList<KMFilter>(),
00032 mEditDialog( 0 ),
00033 bPopFilter( popFilter ),
00034 mShowLater( false ),
00035 mRefCount( 0 )
00036 {
00037
if (bPopFilter)
00038 kdDebug(5006) <<
"pPopFilter set" << endl;
00039 setAutoDelete(TRUE);
00040 }
00041
00042
00043
00044 KMFilterMgr::~KMFilterMgr()
00045 {
00046 deref(
true);
00047 writeConfig(FALSE);
00048 }
00049
00050
00051
00052
void KMFilterMgr::readConfig(
void)
00053 {
00054 KConfig* config = KMKernel::config();
00055
int numFilters;
00056 QString grpName;
00057
00058 clear();
00059
00060 KConfigGroupSaver saver(config,
"General");
00061
00062
if (bPopFilter) {
00063 numFilters = config->readNumEntry(
"popfilters",0);
00064 mShowLater = config->readNumEntry(
"popshowDLmsgs",0);
00065 }
else {
00066 numFilters = config->readNumEntry(
"filters",0);
00067 }
00068
00069
for (
int i=0 ; i < numFilters ; ++i ) {
00070 grpName.sprintf(
"%s #%d", (bPopFilter ?
"PopFilter" :
"Filter") , i);
00071 KConfigGroupSaver saver(config, grpName);
00072 KMFilter * filter =
new KMFilter(config, bPopFilter);
00073 filter->purify();
00074
if ( filter->isEmpty() ) {
00075
#ifndef NDEBUG
00076
kdDebug(5006) <<
"KMFilter::readConfig: filter\n" << filter->asString()
00077 <<
"is empty!" << endl;
00078
#endif
00079
delete filter;
00080 }
else
00081 append(filter);
00082 }
00083 }
00084
00085
00086
00087
void KMFilterMgr::writeConfig(
bool withSync)
00088 {
00089 KConfig* config = KMKernel::config();
00090
00091
00092 QStringList filterGroups =
00093 config->groupList().grep( QRegExp( bPopFilter ?
"PopFilter #\\d+" :
"Filter #\\d+" ) );
00094
for ( QStringList::Iterator it = filterGroups.begin() ;
00095 it != filterGroups.end() ; ++it )
00096 config->deleteGroup( *it );
00097
00098
00099
int i = 0;
00100 QString grpName;
00101
for ( QPtrListIterator<KMFilter> it(*
this) ; it.current() ; ++it )
00102
if ( !(*it)->isEmpty() ) {
00103
if ( bPopFilter )
00104 grpName.sprintf(
"PopFilter #%d", i);
00105
else
00106 grpName.sprintf(
"Filter #%d", i);
00107 KConfigGroupSaver saver(config, grpName);
00108 (*it)->writeConfig(config);
00109 ++i;
00110 }
00111
00112 KConfigGroupSaver saver(config,
"General");
00113
if (bPopFilter) {
00114 config->writeEntry(
"popfilters", i);
00115 config->writeEntry(
"popshowDLmsgs", mShowLater);
00116 }
else
00117 config->writeEntry(
"filters", i);
00118
00119
if (withSync) config->sync();
00120 }
00121
00122
00123
int KMFilterMgr::processPop( KMMessage * msg )
const {
00124
for ( QPtrListIterator<KMFilter> it( *
this ) ; it.current() ; ++it )
00125
if ( (*it)->pattern()->matches( msg ) )
00126
return (*it)->action();
00127
return NoAction;
00128 }
00129
00130
bool KMFilterMgr::beginFiltering(KMMsgBase *msgBase)
const
00131
{
00132
if (MessageProperty::filtering( msgBase ))
00133
return false;
00134 MessageProperty::setFiltering( msgBase,
true );
00135 MessageProperty::setFilterFolder( msgBase, 0 );
00136
return true;
00137 }
00138
00139
int KMFilterMgr::moveMessage(KMMessage *msg)
const
00140
{
00141
if (MessageProperty::filterFolder(msg)->moveMsg( msg ) == 0) {
00142
if ( kmkernel->folderIsTrash( MessageProperty::filterFolder( msg )))
00143
KMFilterAction::sendMDN( msg, KMime::MDN::Deleted );
00144 }
else {
00145 kdDebug(5006) <<
"KMfilterAction - couldn't move msg" << endl;
00146
return 2;
00147 }
00148
return 0;
00149 }
00150
00151
void KMFilterMgr::endFiltering(KMMsgBase *msgBase)
const
00152
{
00153
KMFolder *parent = msgBase->parent();
00154
if ( parent ) {
00155
if ( parent == MessageProperty::filterFolder( msgBase ) ) {
00156 parent->
take( parent->
find( msgBase ) );
00157 }
00158
else if ( ! MessageProperty::filterFolder( msgBase ) ) {
00159
int index = parent->
find( msgBase );
00160 KMMessage *msg = parent->
getMsg( index );
00161 parent->
take( index );
00162 parent->
addMsgKeepUID( msg );
00163 }
00164 }
00165 MessageProperty::setFiltering( msgBase,
false );
00166 }
00167
00168
int KMFilterMgr::process( KMMessage * msg,
const KMFilter * filter ) {
00169
if ( !msg || !filter || !beginFiltering( msg ))
00170
return 1;
00171
bool stopIt =
false;
00172
int result = 1;
00173
if (filter->execActions( msg, stopIt ) == KMFilter::CriticalError)
00174
return 2;
00175
00176
KMFolder *folder = MessageProperty::filterFolder( msg );
00177
00178 endFiltering( msg );
00179
if (folder) {
00180 tempOpenFolder( folder );
00181 result = folder->
moveMsg( msg );
00182 }
00183
return result;
00184 }
00185
00186
int KMFilterMgr::process( KMMessage * msg, FilterSet set ) {
00187
if ( bPopFilter )
00188
return processPop( msg );
00189
00190
if ( set == NoSet ) {
00191 kdDebug(5006) <<
"KMFilterMgr: process() called with not filter set selected"
00192 << endl;
00193
return 1;
00194 }
00195
00196
bool stopIt =
false;
00197
00198
if (!beginFiltering( msg ))
00199
return 1;
00200
for ( QPtrListIterator<KMFilter> it(*
this) ; !stopIt && it.current() ; ++it ) {
00201
00202
if ( ( (set&Outbound) && (*it)->applyOnOutbound() ) ||
00203 ( (set&Inbound) && (*it)->applyOnInbound() ) ||
00204 ( (set&Explicit) && (*it)->applyOnExplicit() ) ) {
00205
00206
00207
if ( (*it)->pattern()->matches( msg ) ) {
00208
00209
00210
if ( (*it)->execActions(msg, stopIt) == KMFilter::CriticalError )
00211
return 2;
00212 }
00213 }
00214 }
00215
00216
KMFolder *folder = MessageProperty::filterFolder( msg );
00217 endFiltering( msg );
00218
if (folder) {
00219 tempOpenFolder( folder );
00220 folder->
moveMsg(msg);
00221
return 0;
00222 }
00223
return 1;
00224 }
00225
00226
00227
00228
void KMFilterMgr::ref(
void)
00229 {
00230 mRefCount++;
00231 }
00232
00233
00234
void KMFilterMgr::deref(
bool force)
00235 {
00236
if (!force)
00237 mRefCount--;
00238
if (mRefCount < 0)
00239 mRefCount = 0;
00240
if (mRefCount && !force)
00241
return;
00242 QPtrListIterator<KMFolder> it(mOpenFolders);
00243
for ( it.toFirst() ; it.current() ; ++it )
00244 (*it)->close();
00245 mOpenFolders.clear();
00246 }
00247
00248
00249
00250
int KMFilterMgr::tempOpenFolder(
KMFolder* aFolder)
00251 {
00252 assert( aFolder );
00253
00254
int rc = aFolder->
open();
00255
if (rc)
return rc;
00256
00257 mOpenFolders.append( aFolder );
00258
return 0;
00259 }
00260
00261
00262
00263
void KMFilterMgr::openDialog( QWidget * )
00264 {
00265
if( !mEditDialog )
00266 {
00267
00268
00269
00270
00271 mEditDialog =
new KMFilterDlg( 0,
"filterdialog", bPopFilter );
00272 }
00273 mEditDialog->show();
00274 }
00275
00276
00277
00278
void KMFilterMgr::createFilter(
const QCString & field,
const QString & value )
00279 {
00280 openDialog( 0 );
00281 mEditDialog->createFilter( field, value );
00282 }
00283
00284
00285
00286
bool KMFilterMgr::folderRemoved(
KMFolder* aFolder,
KMFolder* aNewFolder)
00287 {
00288
bool rem = FALSE;
00289
00290 QPtrListIterator<KMFilter> it(*
this);
00291
for ( it.toFirst() ; it.current() ; ++it )
00292
if ( (*it)->folderRemoved(aFolder, aNewFolder) ) rem=TRUE;
00293
00294
return rem;
00295 }
00296
00297
00298
00299
#ifndef NDEBUG
00300
void KMFilterMgr::dump(
void)
00301 {
00302 QPtrListIterator<KMFilter> it(*
this);
00303
for ( it.toFirst() ; it.current() ; ++it )
00304 {
00305 kdDebug(5006) << (*it)->asString() << endl;
00306 }
00307 }
00308
#endif
00309
00310
00311
void KMFilterMgr::endUpdate(
void)
00312 {
00313 emit filterListUpdated();
00314 }
00315
00316
#include "kmfiltermgr.moc"