20 #include "searchjob.h"
22 #include <KDE/KLocale>
25 #include <QtCore/QDate>
28 #include "message_p.h"
29 #include "session_p.h"
35 class SearchJobPrivate :
public JobPrivate
38 SearchJobPrivate( Session *session,
const QString& name ) : JobPrivate( session, name ), logic( SearchJob::And ) {
39 criteriaMap[SearchJob::All] =
"ALL";
40 criteriaMap[SearchJob::Answered] =
"ANSWERED";
41 criteriaMap[SearchJob::BCC] =
"BCC";
42 criteriaMap[SearchJob::Before] =
"BEFORE";
43 criteriaMap[SearchJob::Body] =
"BODY";
44 criteriaMap[SearchJob::CC] =
"CC";
45 criteriaMap[SearchJob::Deleted] =
"DELETED";
46 criteriaMap[SearchJob::Draft] =
"DRAFT";
47 criteriaMap[SearchJob::Flagged] =
"FLAGGED";
48 criteriaMap[SearchJob::From] =
"FROM";
49 criteriaMap[SearchJob::Header] =
"HEADER";
50 criteriaMap[SearchJob::Keyword] =
"KEYWORD";
51 criteriaMap[SearchJob::Larger] =
"LARGER";
52 criteriaMap[SearchJob::New] =
"NEW";
53 criteriaMap[SearchJob::Old] =
"OLD";
54 criteriaMap[SearchJob::On] =
"ON";
55 criteriaMap[SearchJob::Recent] =
"RECENT";
56 criteriaMap[SearchJob::Seen] =
"SEEN";
57 criteriaMap[SearchJob::SentBefore] =
"SENTBEFORE";
58 criteriaMap[SearchJob::SentOn] =
"SENTON";
59 criteriaMap[SearchJob::SentSince] =
"SENTSINCE";
60 criteriaMap[SearchJob::Since] =
"SINCE";
61 criteriaMap[SearchJob::Smaller] =
"SMALLER";
62 criteriaMap[SearchJob::Subject] =
"SUBJECT";
63 criteriaMap[SearchJob::Text] =
"TEXT";
64 criteriaMap[SearchJob::To] =
"TO";
65 criteriaMap[SearchJob::Uid] =
"UID";
66 criteriaMap[SearchJob::Unanswered] =
"UNANSWERED";
67 criteriaMap[SearchJob::Undeleted] =
"UNDELETED";
68 criteriaMap[SearchJob::Undraft] =
"UNDRAFT";
69 criteriaMap[SearchJob::Unflagged] =
"UNFLAGGED";
70 criteriaMap[SearchJob::Unkeyword] =
"UNKEYWORD";
71 criteriaMap[SearchJob::Unseen] =
"UNSEEN";
90 ~SearchJobPrivate() { }
94 QList<QByteArray> criterias;
95 QMap<SearchJob::SearchCriteria, QByteArray > criteriaMap;
96 QMap<int, QByteArray> months;
97 SearchJob::SearchLogic logic;
98 QList<QByteArray> contents;
99 QList<qint64> results;
105 using namespace KIMAP;
107 SearchJob::SearchJob( Session *session )
108 : Job( *new SearchJobPrivate( session, i18nc(
"Name of the search job",
"Search" ) ) )
112 SearchJob::~SearchJob()
116 void SearchJob::doStart()
120 QByteArray searchKey;
122 if ( !d->charset.isEmpty() ) {
123 searchKey =
"CHARSET " + d->charset;
126 if ( d->logic == SearchJob::Not ) {
128 }
else if ( d->logic == SearchJob::Or ) {
132 if ( d->logic == SearchJob::And ) {
133 for (
int i = 0; i < d->criterias.size(); i++ ) {
134 const QByteArray key = d->criterias.at( i );
141 for (
int i = 0; i < d->criterias.size(); i++ ) {
142 const QByteArray key = d->criterias.at( i );
146 searchKey +=
'(' + key +
')';
150 QByteArray command =
"SEARCH";
152 command =
"UID " + command;
155 d->tags << d->sessionInternal()->sendCommand( command, searchKey );
158 void SearchJob::handleResponse(
const Message &response )
162 if ( handleErrorReplies( response ) == NotHandled ) {
163 if ( response.content[0].toString() ==
"+" ) {
164 d->sessionInternal()->sendData( d->contents[d->nextContent] );
166 }
else if ( response.content[1].toString() ==
"SEARCH" ) {
167 for (
int i = 2; i < response.content.size(); i++ ) {
168 d->results.append( response.content[i].toString().toInt() );
175 void SearchJob::setCharset(
const QByteArray &charset )
178 d->charset = charset;
181 QByteArray SearchJob::charset()
const
183 Q_D(
const SearchJob );
187 void SearchJob::setSearchLogic( SearchLogic logic )
193 void SearchJob::addSearchCriteria( SearchCriteria criteria )
197 switch ( criteria ) {
212 d->criterias.append( d->criteriaMap[criteria] );
216 kDebug() <<
"Criteria " << d->criteriaMap[criteria] <<
" needs an argument, but none was specified.";
221 void SearchJob::addSearchCriteria( SearchCriteria criteria,
int argument )
224 switch ( criteria ) {
227 d->criterias.append( d->criteriaMap[criteria] +
' ' + QByteArray::number( argument ) );
231 kDebug() <<
"Criteria " << d->criteriaMap[criteria] <<
" doesn't accept an integer as an argument.";
236 void SearchJob::addSearchCriteria( SearchCriteria criteria,
const QByteArray &argument )
239 switch ( criteria ) {
247 d->contents.append( argument );
248 d->criterias.append( d->criteriaMap[criteria] +
" {" + QByteArray::number( argument.size() ) +
'}' );
254 d->criterias.append( d->criteriaMap[criteria] +
' ' + argument );
258 kDebug() <<
"Criteria " << d->criteriaMap[criteria] <<
" doesn't accept any argument.";
263 void SearchJob::addSearchCriteria( SearchCriteria criteria,
const QDate &argument )
266 switch ( criteria ) {
272 QByteArray date = QByteArray::number( argument.day() ) +
'-';
273 date += d->months[argument.month()] +
'-';
274 date += QByteArray::number( argument.year() );
275 d->criterias.append( d->criteriaMap[criteria] +
" \"" + date +
'\"' );
280 kDebug() <<
"Criteria " << d->criteriaMap[criteria] <<
" doesn't accept a date as argument.";
285 void SearchJob::addSearchCriteria(
const QByteArray &searchCriteria )
288 d->criterias.append( searchCriteria );
291 void SearchJob::setUidBased(
bool uidBased)
294 d->uidBased = uidBased;
297 bool SearchJob::isUidBased()
const
299 Q_D(
const SearchJob );
303 QList<qint64> SearchJob::results()
const
305 Q_D(
const SearchJob );
309 QList<int> SearchJob::foundItems()
311 Q_D(
const SearchJob );
314 qCopy( d->results.begin(), d->results.end(), results.begin() );