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.
kshowmail/kshowmail/filteritem.cpp

167 lines
5.3 KiB

//
// C++ Implementation: filteritem
//
// Description:
//
//
// Author: Ulrich Weigelt <ulrich.weigelt@gmx.de>, (C) 2007
//
// Copyright: See COPYING file that comes with this distribution
//
//
#include "filteritem.h"
FilterItem::FilterItem( uint filterNr )
{
//get the application config object
config = TDEApplication::kApplication()->config();
//save number
filterNumber = filterNr;
//set config group
config->setGroup( TQString( "%1%2" ).arg( CONFIG_GROUP_FILTER ).arg( filterNr ) );
//get name
name = config->readEntry( CONFIG_ENTRY_FILTER_NAME );
//get number of criterias
numberCriterias = config->readNumEntry( CONFIG_ENTRY_FILTER_CRITERIA_NUMBER );
//get criteria linkage
switch( config->readNumEntry( CONFIG_ENTRY_FILTER_CRITERIA_LINKAGE, DEFAULT_FILTER_CRITERIA_LINKAGE ) )
{
case CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ALL : linkage = LinkAll; break;
case CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ANY : linkage = LinkAny; break;
default : kdError() << "FilterItem::FilterItem(): Unknown linkage value read. Set ALL. ( Filter " << filterNumber << ")" << endl;
linkage = LinkAll;
break;
}
//get action
switch( config->readNumEntry( CONFIG_ENTRY_FILTER_ACTION, DEFAULT_FILTER_ACTION ) )
{
case CONFIG_VALUE_FILTER_ACTION_PASS : action = FActPass; break;
case CONFIG_VALUE_FILTER_ACTION_DELETE : action = FActDelete; break;
case CONFIG_VALUE_FILTER_ACTION_MARK : action = FActMark; break;
case CONFIG_VALUE_FILTER_ACTION_MOVE : action = FActMove; break;
case CONFIG_VALUE_FILTER_ACTION_IGNORE : action = FActIgnore; break;
case CONFIG_VALUE_FILTER_ACTION_SPAMCHECK : action = FActSpamcheck; break;
default : kdError() << "FilterItem::FilterItem(): Unknown filter action read. Set PASS. (Filter " << filterNumber << ")" << endl;
action = FActPass;
break;
}
//get mailbox name if filter action is move
if( action == FActMove )
{
mailbox = config->readEntry( CONFIG_ENTRY_FILTER_MOVE_MAILBOX );
if( mailbox.isNull() || mailbox.isEmpty() )
{
kdWarning() << "Filter " << filterNumber << ": No mailbox name found. Set default: " << DEFAULT_FILTER_ACTION_MOVE_MAILBOX << endl;
mailbox = TQString( DEFAULT_FILTER_ACTION_MOVE_MAILBOX );
}
}
//now we get the criterias
criterias.setAutoDelete( true ); //the list shall delete all criterias if it will be deleted itself
for( uint critNr = 1; critNr <= numberCriterias; critNr++ )
{
criterias.append( new FilterItemCriteria( filterNr, critNr ) ); //a new created criteria loads its settings itself
}
}
FilterItem::~FilterItem()
{
}
FilterAction_Type FilterItem::check( TQString from, TQString to, uint size, TQString subject, TQString header, TQString account, TQString& mailboxName ) const
{
bool match = false; //TRUE, if filter matches
//return NONE if no criterias available
if( criterias.isEmpty() ) return FActNone;
//get iterator
TQPtrListIterator<FilterItemCriteria> it( criterias );
FilterItemCriteria* crit;
//check criterias
if( linkage == LinkAll )
{
match = true;
while( ( crit = it.current() ) != NULL && match )
{
++it;
match = match && crit->check( from, to, size, subject, header, account );
}
}
else if( linkage == LinkAny )
{
match = false;
while( ( crit = it.current() ) != NULL && !match )
{
++it;
match = crit->check( from, to, size, subject, header, account );
}
}
else
kdError() << "FilterItem::check(): Unknown linkage (Filter " << filterNumber << ")" << endl;
//return action if filter matches
if( match )
{
//set mailbox name if neccessary
if( action == FActMove )
{
mailboxName.remove( 0, mailboxName.length() );
mailboxName.append( mailbox );
}
return action;
}
//default return value, filter doesn't match
return FActNone;
}
void FilterItem::print( ) const
{
kdDebug() << "Settings of filter " << filterNumber << ":" << endl;
kdDebug() << "Name: " << name << endl;
kdDebug() << "Number of criterias: " << numberCriterias << endl;
switch( linkage )
{
case LinkAll : kdDebug() << "Criteria Linkage: ALL (AND)" << endl; break;
case LinkAny : kdDebug() << "Criteria Linkage: ANY (OR)" << endl; break;
default : kdDebug() << "Unknown Criteria LInkage" << endl; break;
}
switch( action )
{
case FActPass : kdDebug() << "Action: PASS" << endl; break;
case FActDelete : kdDebug() << "Action: DELETE" << endl; break;
case FActMark : kdDebug() << "Action: MARK" << endl; break;
case FActMove : kdDebug() << "Action: MOVE to " << mailbox << endl; break;
case FActSpamcheck : kdDebug() << "Action: SPAMCHECK" << endl; break;
case FActIgnore : kdDebug() << "Action: IGNORE" << endl; break;
default : kdDebug() << "Unknown Action" << endl; break;
}
kdDebug() << "Criterias:" << endl;
TQPtrListIterator<FilterItemCriteria> it( criterias );
FilterItemCriteria* crit;
while( ( crit = it.current() ) != NULL )
{
++it;
crit->print();
}
}