00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "filteritemcriteria.h"
00019
00020 FilterItemCriteria::FilterItemCriteria( uint FilterNr, uint CritNr )
00021 {
00022
00023 FilterNumber = FilterNr;
00024 CriteriaNumber = CritNr;
00025
00026
00027
00028
00029
00030 KConfigGroup* config = new KConfigGroup( KGlobal::config(), QString( "%1%2" ).arg( CONFIG_GROUP_FILTER ).arg( FilterNr ) );
00031
00032
00033 switch( config->readEntry( QString( "%1%2" ).arg( CONFIG_ENTRY_FILTER_CRITERIA_SOURCE ).arg( CritNr ), DEFAULT_FILTER_CRITERIA_SOURCE ) )
00034 {
00035 case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_FROM : source = SrcFrom; break;
00036 case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_TO : source = SrcTo; break;
00037 case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_SUBJECT : source = SrcSubject; break;
00038 case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_SIZE : source = SrcSize; break;
00039 case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_HEADER : source = SrcHeader; break;
00040 case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_ACCOUNT : source = SrcAccount; break;
00041 default : source = SrcFrom; break;
00042 }
00043
00044
00045 if( source == SrcSize )
00046 {
00047 switch( config->readEntry( QString( "%1%2" ).arg( CONFIG_ENTRY_FILTER_CRITERIA_CONDITION ).arg( CritNr ), DEFAULT_FILTER_CRITERIA_COND_NUM ) )
00048 {
00049 case CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_EQUAL : numCondition = NumCondEqual; break;
00050 case CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_NOT_EQUAL : numCondition = NumCondNotEqual; break;
00051 case CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_GREATER : numCondition = NumCondGreater; break;
00052 case CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_GREATER_EQUAL : numCondition = NumCondGreaterEqual; break;
00053 case CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_LESS : numCondition = NumCondLess; break;
00054 case CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_LESS_EQUAL : numCondition = NumCondLessEqual; break;
00055 default : numCondition = NumCondGreater; break;
00056 }
00057 }
00058 else
00059 {
00060 switch( config->readEntry( QString( "%1%2" ).arg( CONFIG_ENTRY_FILTER_CRITERIA_CONDITION ).arg( CritNr ), DEFAULT_FILTER_CRITERIA_COND_TEXT ) )
00061 {
00062 case CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_CONTAINS : txtCondition = TxtCondContains; break;
00063 case CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_NOT_CONTAINS : txtCondition = TxtCondNotContains; break;
00064 case CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_EQUALS : txtCondition = TxtCondEqual; break;
00065 case CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_NOT_EQUALS : txtCondition = TxtCondNotEqual; break;
00066 case CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_REGEXPR : txtCondition = TxtCondRegExpr; break;
00067 case CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_NOT_REGEXPR : txtCondition = TxtCondNotRegExpr; break;
00068 default : txtCondition = TxtCondContains; break;
00069 }
00070
00071 cs = config->readEntry( QString( "%1%2" ).arg( CONFIG_ENTRY_FILTER_CRITERIA_CASESENSITIVE ).arg( CritNr ), DEFAULT_FILTER_CRITERIA_CASE_SENSITIVE );
00072 }
00073
00074
00075 if( source == SrcSize )
00076 {
00077 numValue = config->readEntry( QString( "%1%2" ).arg( CONFIG_ENTRY_FILTER_CRITERIA_VALUE ).arg( CritNr ), 0 );
00078 }
00079 else
00080 {
00081 txtValue = config->readEntry( QString( "%1%2" ).arg( CONFIG_ENTRY_FILTER_CRITERIA_VALUE ).arg( CritNr ) );
00082 }
00083
00084 }
00085
00086 FilterItemCriteria::~FilterItemCriteria()
00087 {
00088 }
00089
00090 bool FilterItemCriteria::check( QString from, QString to, uint size, QString subject, QStringList header, QString account ) const
00091 {
00092 switch( source )
00093 {
00094 case SrcFrom : return checkText( from ); break;
00095 case SrcTo : return checkText( to ); break;
00096 case SrcHeader : return checkTextList( header ); break;
00097 case SrcSize : return checkNum( size ); break;
00098 case SrcSubject : return checkText( subject ); break;
00099 case SrcAccount : return checkText( account ); break;
00100 default : return false;
00101 }
00102
00103
00104 return false;
00105 }
00106
00107 bool FilterItemCriteria::checkTextList( QStringList list ) const
00108 {
00109
00110 if( source != SrcHeader )
00111 {
00112 kdError() << "FilterItemCriteria::checkTextList: The source is not the header. (Filter " << FilterNumber << ", Criteria " << CriteriaNumber << ")" << endl;
00113 return false;
00114 }
00115
00116
00117 if( list.isEmpty() )
00118 {
00119 kdError() << "FilterItemCriteria::checkTextList: The given value is empty. (Filter " << FilterNumber << ", Criteria " << CriteriaNumber << ")" << endl;
00120 return false;
00121 }
00122
00123
00124 if( txtValue.isEmpty() || txtValue.isNull() )
00125 {
00126 kdWarning() << "There is no value for Filter " << FilterNumber << "/Criteria " << CriteriaNumber << endl;
00127 }
00128
00129 switch( txtCondition )
00130 {
00131 case TxtCondContains : {
00132 QStringList result = list.filter( txtValue, cs ? Qt::CaseSensitive : Qt::CaseInsensitive );
00133 return !result.isEmpty();
00134 }
00135
00136 case TxtCondNotContains : {
00137 QStringList result = list.filter( txtValue, cs ? Qt::CaseSensitive : Qt::CaseInsensitive );
00138 return result.isEmpty();
00139 }
00140
00141 case TxtCondEqual : return list.contains( txtValue, cs ? Qt::CaseSensitive : Qt::CaseInsensitive );
00142
00143 case TxtCondNotEqual : return !list.contains( txtValue, cs ? Qt::CaseSensitive : Qt::CaseInsensitive );
00144
00145 case TxtCondRegExpr : {
00146 QStringList result = list.filter( QRegExp( txtValue ) );
00147 return !result.isEmpty();
00148 }
00149
00150 case TxtCondNotRegExpr : {
00151 QStringList result = list.filter( QRegExp( txtValue ) );
00152 return result.isEmpty();
00153 }
00154
00155 default : return false;
00156
00157 }
00158
00159 }
00160
00161 bool FilterItemCriteria::checkText( QString value ) const
00162 {
00163
00164 if( source != SrcFrom && source != SrcTo && source != SrcSubject && source != SrcAccount )
00165 {
00166 kdError() << "FilterItemCriteria::checkText: The source is not text. (Filter " << FilterNumber << ", Criteria " << CriteriaNumber << ")" << endl;
00167 return false;
00168 }
00169
00170
00171 if( value.isNull() || value.isEmpty() )
00172 {
00173 kdError() << "FilterItemCriteria::checkText: The given value is empty or null. (Filter " << FilterNumber << ", Criteria " << CriteriaNumber << ")" << endl;
00174 return false;
00175 }
00176
00177
00178 if( txtValue.isEmpty() || txtValue.isNull() )
00179 {
00180 kdWarning() << "There is no value for Filter " << FilterNumber << "/Criteria " << CriteriaNumber << endl;
00181 }
00182
00183 switch( txtCondition )
00184 {
00185 case TxtCondContains : return value.contains( txtValue, cs ? Qt::CaseSensitive : Qt::CaseInsensitive ); break;
00186
00187 case TxtCondNotContains : return !value.contains( txtValue, cs ? Qt::CaseSensitive : Qt::CaseInsensitive ); break;
00188
00189 case TxtCondEqual : if( cs )
00190 {
00191 return value.localeAwareCompare( txtValue ) == 0;
00192 }
00193 else
00194 {
00195 return QString::localeAwareCompare( txtValue.toUpper(), value.toUpper() ) == 0;
00196 }
00197 break;
00198
00199 case TxtCondNotEqual : if( cs )
00200 return value.localeAwareCompare( txtValue ) != 0;
00201 else
00202 return value.localeAwareCompare( txtValue.toUpper(), value.toUpper() ) != 0;
00203 break;
00204
00205 case TxtCondRegExpr : return value.indexOf( QRegExp( txtValue ) ) != -1; break;
00206
00207 case TxtCondNotRegExpr : return value.indexOf( QRegExp( txtValue ) ) == -1; break;
00208
00209 default : return false;
00210 }
00211
00212
00213 return false;
00214 }
00215
00216 bool FilterItemCriteria::checkNum( uint value ) const
00217 {
00218
00219 if ( source != SrcSize )
00220 {
00221 kdError() << "FilterItemCriteria::checkNum: The source is not numeric." << endl;
00222 return false;
00223 }
00224
00225 switch( numCondition )
00226 {
00227 case NumCondEqual : return value == numValue; break;
00228 case NumCondNotEqual : return value != numValue; break;
00229 case NumCondGreater : return value > numValue; break;
00230 case NumCondGreaterEqual : return value >= numValue; break;
00231 case NumCondLess : return value < numValue; break;
00232 case NumCondLessEqual : return value <= numValue; break;
00233 default : kdError() << "FilterItemCriteria::checkNum: Unknown numeric condiction. Return false." << endl;
00234 }
00235
00236
00237 return false;
00238 }
00239
00240 void FilterItemCriteria::print( ) const
00241 {
00242 QString output;
00243
00244 output.append( QString( "Criteria %1 of Filter %2: Source: " ).arg( CriteriaNumber ).arg( FilterNumber ) );
00245
00246 switch( source )
00247 {
00248 case SrcFrom : output.append( "From" ); break;
00249 case SrcTo : output.append( "To" ); break;
00250 case SrcAccount : output.append( "Account" ); break;
00251 case SrcHeader : output.append( "Header" ); break;
00252 case SrcSize : output.append( "Size" ); break;
00253 case SrcSubject : output.append( "Subject" ); break;
00254 default : output.append( "unknown" ); break;
00255 }
00256
00257 output.append( "; Condition: " );
00258
00259 if( source == SrcSize )
00260 {
00261 switch( numCondition )
00262 {
00263 case NumCondEqual : output.append( QString( "equals %1" ).arg( numValue ) ); break;
00264 case NumCondGreater : output.append( QString( "greater than %1" ).arg( numValue ) ); break;
00265 case NumCondGreaterEqual : output.append( QString( "greater than or equals %1" ).arg( numValue ) ); break;
00266 case NumCondLess : output.append( QString( "less than %1" ).arg( numValue ) ); break;
00267 case NumCondLessEqual : output.append( QString( "less than or equals %1" ).arg( numValue ) ); break;
00268 case NumCondNotEqual : output.append( QString( "not equals %1" ).arg( numValue ) ); break;
00269 default : output.append( QString( "unknown; Value: %1" ).arg( numValue ) ); break;
00270 }
00271 }
00272 else
00273 {
00274 switch( txtCondition )
00275 {
00276 case TxtCondContains : output.append( QString( "contains %1" ).arg( txtValue ) ); break;
00277 case TxtCondEqual : output.append( QString( "equals %1" ).arg( txtValue ) ); break;
00278 case TxtCondNotContains : output.append( QString( "not contains %1" ).arg( txtValue ) ); break;
00279 case TxtCondNotEqual : output.append( QString( "not equals %1" ).arg( txtValue ) ); break;
00280 case TxtCondRegExpr : output.append( QString( "matches to regular expression %1" ).arg( txtValue ) ); break;
00281 case TxtCondNotRegExpr : output.append( QString( "doesn't match to regular expression %1" ).arg( txtValue ) ); break;
00282 default : output.append( QString( "unknown; Value: %1" ).arg( txtValue ) ); break;
00283 }
00284
00285 if( txtCondition != TxtCondRegExpr && txtCondition != TxtCondNotRegExpr )
00286 {
00287 if( cs )
00288 output.append( " (case sensitive)" );
00289 else
00290 output.append( " (not case sensitive)" );
00291 }
00292 }
00293
00294 kdDebug() << output << endl;
00295 }
00296
00297
00298