20 #include "searchjob.h"
22 #include <KDE/KLocalizedString>
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() { }
93 QList<QByteArray> criterias;
94 QMap<SearchJob::SearchCriteria, QByteArray > criteriaMap;
95 QMap<int, QByteArray> months;
96 SearchJob::SearchLogic logic;
97 QList<QByteArray> contents;
98 QList<qint64> results;
104 using namespace KIMAP;
106 SearchJob::SearchJob( Session *session )
107 : Job( *new SearchJobPrivate( session, i18nc(
"Name of the search job",
"Search" ) ) )
111 SearchJob::~SearchJob()
115 void SearchJob::doStart()
119 QByteArray searchKey;
121 if ( !d->charset.isEmpty() ) {
122 searchKey =
"CHARSET " + d->charset;
125 if ( d->logic == SearchJob::Not ) {
127 }
else if ( d->logic == SearchJob::Or && d->criterias.size() > 1 ) {
131 if ( d->logic == SearchJob::And ) {
132 for (
int i = 0; i < d->criterias.size(); i++ ) {
133 const QByteArray key = d->criterias.at( i );
140 for (
int i = 0; i < d->criterias.size(); i++ ) {
141 const QByteArray key = d->criterias.at( i );
145 searchKey +=
'(' + key +
')';
149 QByteArray command =
"SEARCH";
151 command =
"UID " + command;
154 d->tags << d->sessionInternal()->sendCommand( command, searchKey );
157 void SearchJob::handleResponse(
const Message &response )
161 if ( handleErrorReplies( response ) == NotHandled ) {
162 if ( response.content[0].toString() ==
"+" ) {
163 d->sessionInternal()->sendData( d->contents[d->nextContent] );
165 }
else if ( response.content[1].toString() ==
"SEARCH" ) {
166 for (
int i = 2; i < response.content.size(); i++ ) {
167 d->results.append( response.content[i].toString().toInt() );
173 void SearchJob::setCharset(
const QByteArray &charset )
176 d->charset = charset;
179 QByteArray SearchJob::charset()
const
181 Q_D(
const SearchJob );
185 void SearchJob::setSearchLogic( SearchLogic logic )
191 void SearchJob::addSearchCriteria( SearchCriteria criteria )
195 switch ( criteria ) {
210 d->criterias.append( d->criteriaMap[criteria] );
214 kDebug() <<
"Criteria " << d->criteriaMap[criteria] <<
" needs an argument, but none was specified.";
219 void SearchJob::addSearchCriteria( SearchCriteria criteria,
int argument )
222 switch ( criteria ) {
225 d->criterias.append( d->criteriaMap[criteria] +
' ' + QByteArray::number( argument ) );
229 kDebug() <<
"Criteria " << d->criteriaMap[criteria] <<
" doesn't accept an integer as an argument.";
234 void SearchJob::addSearchCriteria( SearchCriteria criteria,
const QByteArray &argument )
237 switch ( criteria ) {
245 d->contents.append( argument );
246 d->criterias.append( d->criteriaMap[criteria] +
" {" + QByteArray::number( argument.size() ) +
'}' );
252 d->criterias.append( d->criteriaMap[criteria] +
' ' + argument );
256 kDebug() <<
"Criteria " << d->criteriaMap[criteria] <<
" doesn't accept any argument.";
261 void SearchJob::addSearchCriteria( SearchCriteria criteria,
const QDate &argument )
264 switch ( criteria ) {
270 QByteArray date = QByteArray::number( argument.day() ) +
'-';
271 date += d->months[argument.month()] +
'-';
272 date += QByteArray::number( argument.year() );
273 d->criterias.append( d->criteriaMap[criteria] +
" \"" + date +
'\"' );
278 kDebug() <<
"Criteria " << d->criteriaMap[criteria] <<
" doesn't accept a date as argument.";
283 void SearchJob::addSearchCriteria(
const QByteArray &searchCriteria )
286 d->criterias.append( searchCriteria );
289 void SearchJob::setUidBased(
bool uidBased)
292 d->uidBased = uidBased;
295 bool SearchJob::isUidBased()
const
297 Q_D(
const SearchJob );
301 QList<qint64> SearchJob::results()
const
303 Q_D(
const SearchJob );
307 QList<int> SearchJob::foundItems()
309 Q_D(
const SearchJob );
312 qCopy( d->results.begin(), d->results.end(), results.begin() );