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 );
135 if ( i>0 ) searchKey+=
' ';
139 for (
int i = 0; i<d->criterias.size(); i++ ) {
140 const QByteArray key = d->criterias.at( i );
141 if ( i>0 ) searchKey+=
' ';
142 searchKey +=
'(' + key +
')';
146 QByteArray command =
"SEARCH";
148 command =
"UID "+ command;
151 d->tags << d->sessionInternal()->sendCommand( command, searchKey );
154 void SearchJob::handleResponse(
const Message &response )
158 if (handleErrorReplies(response) == NotHandled ) {
159 if ( response.content[0].toString() ==
"+" ) {
160 d->sessionInternal()->sendData( d->contents[d->nextContent] );
162 }
else if ( response.content[1].toString() ==
"SEARCH" ) {
163 for(
int i = 2; i < response.content.size(); i++) {
164 d->results.append(response.content[i].toString().toInt());
171 void SearchJob::setCharset(
const QByteArray &charset )
174 d->charset = charset;
177 QByteArray SearchJob::charset()
const
179 Q_D(
const SearchJob);
183 void SearchJob::setSearchLogic( SearchLogic logic )
189 void SearchJob::addSearchCriteria( SearchCriteria criteria )
208 d->criterias.append(d->criteriaMap[criteria]);
212 kDebug() <<
"Criteria " << d->criteriaMap[criteria] <<
" needs an argument, but none was specified.";
218 void SearchJob::addSearchCriteria( SearchCriteria criteria,
int argument )
224 d->criterias.append(d->criteriaMap[criteria] +
' ' + QByteArray::number(argument));
228 kDebug() <<
"Criteria " << d->criteriaMap[criteria] <<
" doesn't accept an integer as an argument.";
234 void SearchJob::addSearchCriteria( SearchCriteria criteria,
const QByteArray &argument )
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 )
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() );
317 #include "searchjob.moc"