2 This file is part of KDEPIM.
3 Copyright (c) 2003 Andreas Gungl <a.gungl@gmx.de>
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
21 #include "messagestatus.h"
28 /** The message status format. These can be or'd together.
29 Note, that the KMMsgStatusIgnored implies the
30 status to be Read even if the flags are set
31 to Unread or New. This is done in isRead()
32 and related getters. So we can preserve the state
33 when switching a thread to Ignored and back. */
35 KMMsgStatusUnknown
= 0x00000000,
36 KMMsgStatusNew
= 0x00000001,
37 KMMsgStatusUnread
= 0x00000002,
38 KMMsgStatusRead
= 0x00000004,
39 KMMsgStatusOld
= 0x00000008,
40 KMMsgStatusDeleted
= 0x00000010,
41 KMMsgStatusReplied
= 0x00000020,
42 KMMsgStatusForwarded
= 0x00000040,
43 KMMsgStatusQueued
= 0x00000080,
44 KMMsgStatusSent
= 0x00000100,
45 KMMsgStatusFlag
= 0x00000200, // flag means important
46 KMMsgStatusWatched
= 0x00000400,
47 KMMsgStatusIgnored
= 0x00000800, // forces isRead()
48 KMMsgStatusToAct
= 0x00001000,
49 KMMsgStatusSpam
= 0x00002000,
50 KMMsgStatusHam
= 0x00004000,
51 KMMsgStatusHasAttach
= 0x00008000
54 MessageStatus::MessageStatus()
56 mStatus
= KMMsgStatusUnknown
;
59 MessageStatus
&MessageStatus::operator = ( const MessageStatus
&other
)
61 mStatus
= other
.mStatus
;
65 bool MessageStatus::operator == ( const MessageStatus
&other
) const
67 return ( mStatus
== other
.mStatus
);
70 bool MessageStatus::operator != ( const MessageStatus
&other
) const
72 return ( mStatus
!= other
.mStatus
);
75 bool MessageStatus::operator & ( const MessageStatus
&other
) const
77 return ( mStatus
& other
.mStatus
);
80 void MessageStatus::clear()
82 mStatus
= KMMsgStatusUnknown
;
85 void MessageStatus::set( const MessageStatus
&other
)
87 // Those stati are exclusive, but we have to lock at the
88 // internal representation because Ignored can manipulate
89 // the result of the getter methods.
90 if ( other
.mStatus
& KMMsgStatusNew
) {
93 if ( other
.mStatus
& KMMsgStatusUnread
) {
96 if ( other
.mStatus
& KMMsgStatusRead
) {
99 if ( other
.mStatus
& KMMsgStatusOld
) {
103 if ( other
.isDeleted() ) {
106 if ( other
.isReplied() ) {
109 if ( other
.isForwarded() ) {
112 if ( other
.isQueued() ) {
115 if ( other
.isSent() ) {
118 if ( other
.isImportant() ) {
122 if ( other
.isWatched() ) {
125 if ( other
.isIgnored() ) {
128 if ( other
.isToAct() ) {
131 if ( other
.isSpam() ) {
134 if ( other
.isHam() ) {
137 if ( other
.hasAttachment() ) {
142 void MessageStatus::toggle( const MessageStatus
&other
)
144 if ( other
.isDeleted() ) {
145 setDeleted( !( mStatus
& KMMsgStatusDeleted
) );
147 if ( other
.isReplied() ) {
148 setReplied( !( mStatus
& KMMsgStatusReplied
) );
150 if ( other
.isForwarded() ) {
151 setForwarded( !( mStatus
& KMMsgStatusForwarded
) );
153 if ( other
.isQueued() ) {
154 setQueued( !( mStatus
& KMMsgStatusQueued
) );
156 if ( other
.isSent() ) {
157 setSent( !( mStatus
& KMMsgStatusSent
) );
159 if ( other
.isImportant() ) {
160 setImportant( !( mStatus
& KMMsgStatusFlag
) );
163 if ( other
.isWatched() ) {
164 setWatched( !( mStatus
& KMMsgStatusWatched
) );
166 if ( other
.isIgnored() ) {
167 setIgnored( !( mStatus
& KMMsgStatusIgnored
) );
169 if ( other
.isToAct() ) {
170 setToAct( !( mStatus
& KMMsgStatusToAct
) );
172 if ( other
.isSpam() ) {
173 setSpam( !( mStatus
& KMMsgStatusSpam
) );
175 if ( other
.isHam() ) {
176 setHam( !( mStatus
& KMMsgStatusHam
) );
178 if ( other
.hasAttachment() ) {
179 setHasAttachment( !( mStatus
& KMMsgStatusHasAttach
) );
183 bool MessageStatus::isOfUnknownStatus() const
185 return ( mStatus
== KMMsgStatusUnknown
);
188 bool MessageStatus::isNew() const
190 return ( mStatus
& KMMsgStatusNew
&& !( mStatus
& KMMsgStatusIgnored
) );
193 bool MessageStatus::isUnread() const
195 return ( mStatus
& KMMsgStatusUnread
&& !( mStatus
& KMMsgStatusIgnored
) );
198 bool MessageStatus::isRead() const
200 return ( mStatus
& KMMsgStatusRead
|| mStatus
& KMMsgStatusIgnored
);
203 bool MessageStatus::isOld() const
205 return ( mStatus
& KMMsgStatusOld
);
208 bool MessageStatus::isDeleted() const
210 return ( mStatus
& KMMsgStatusDeleted
);
213 bool MessageStatus::isReplied() const
215 return ( mStatus
& KMMsgStatusReplied
);
218 bool MessageStatus::isForwarded() const
220 return ( mStatus
& KMMsgStatusForwarded
);
223 bool MessageStatus::isQueued() const
225 return ( mStatus
& KMMsgStatusQueued
);
228 bool MessageStatus::isSent() const
230 return ( mStatus
& KMMsgStatusSent
);
233 bool MessageStatus::isImportant() const
235 return ( mStatus
& KMMsgStatusFlag
);
238 bool MessageStatus::isWatched() const
240 return ( mStatus
& KMMsgStatusWatched
);
243 bool MessageStatus::isIgnored() const
245 return ( mStatus
& KMMsgStatusIgnored
);
248 bool MessageStatus::isToAct() const
250 return ( mStatus
& KMMsgStatusToAct
);
253 bool MessageStatus::isSpam() const
255 return ( mStatus
& KMMsgStatusSpam
);
258 bool MessageStatus::isHam() const
260 return ( mStatus
& KMMsgStatusHam
);
263 bool MessageStatus::hasAttachment() const
265 return ( mStatus
& KMMsgStatusHasAttach
);
268 void MessageStatus::setNew()
270 // new overrides old and read
271 mStatus
&= ~KMMsgStatusOld
;
272 mStatus
&= ~KMMsgStatusRead
;
273 mStatus
&= ~KMMsgStatusUnread
;
274 mStatus
|= KMMsgStatusNew
;
277 void MessageStatus::setUnread()
279 // unread overrides read
280 mStatus
&= ~KMMsgStatusOld
;
281 mStatus
&= ~KMMsgStatusRead
;
282 mStatus
&= ~KMMsgStatusNew
;
283 mStatus
|= KMMsgStatusUnread
;
286 void MessageStatus::setRead()
288 // Unset unread and new, set read
289 mStatus
&= ~KMMsgStatusUnread
;
290 mStatus
&= ~KMMsgStatusNew
;
291 mStatus
|= KMMsgStatusRead
;
294 void MessageStatus::setOld()
296 // old can't be new or unread
297 mStatus
&= ~KMMsgStatusNew
;
298 mStatus
&= ~KMMsgStatusUnread
;
299 mStatus
|= KMMsgStatusOld
;
302 void MessageStatus::setDeleted( bool deleted
)
305 mStatus
|= KMMsgStatusDeleted
;
307 mStatus
&= ~KMMsgStatusDeleted
;
311 void MessageStatus::setReplied( bool replied
)
314 mStatus
|= KMMsgStatusReplied
;
316 mStatus
&= ~KMMsgStatusReplied
;
320 void MessageStatus::setForwarded( bool forwarded
)
323 mStatus
|= KMMsgStatusForwarded
;
325 mStatus
&= ~KMMsgStatusForwarded
;
329 void MessageStatus::setQueued( bool queued
)
332 mStatus
|= KMMsgStatusQueued
;
334 mStatus
&= ~KMMsgStatusQueued
;
338 void MessageStatus::setSent( bool sent
)
341 mStatus
&= ~KMMsgStatusQueued
;
342 // FIXME to be discussed if sent messages are Read
343 mStatus
&= ~KMMsgStatusUnread
;
344 mStatus
&= ~KMMsgStatusNew
;
345 mStatus
|= KMMsgStatusSent
;
347 mStatus
&= ~KMMsgStatusSent
;
351 void MessageStatus::setImportant( bool important
)
354 mStatus
|= KMMsgStatusFlag
;
356 mStatus
&= ~KMMsgStatusFlag
;
360 // Watched and ignored are mutually exclusive
361 void MessageStatus::setWatched( bool watched
)
364 mStatus
&= ~KMMsgStatusIgnored
;
365 mStatus
|= KMMsgStatusWatched
;
367 mStatus
&= ~KMMsgStatusWatched
;
371 void MessageStatus::setIgnored( bool ignored
)
374 mStatus
&= ~KMMsgStatusWatched
;
375 mStatus
|= KMMsgStatusIgnored
;
377 mStatus
&= ~KMMsgStatusIgnored
;
381 void MessageStatus::setToAct( bool toAct
)
384 mStatus
|= KMMsgStatusToAct
;
386 mStatus
&= ~KMMsgStatusToAct
;
390 // Ham and Spam are mutually exclusive
391 void MessageStatus::setSpam( bool spam
)
394 mStatus
&= ~KMMsgStatusHam
;
395 mStatus
|= KMMsgStatusSpam
;
397 mStatus
&= ~KMMsgStatusSpam
;
401 void MessageStatus::setHam( bool ham
)
404 mStatus
&= ~KMMsgStatusSpam
;
405 mStatus
|= KMMsgStatusHam
;
407 mStatus
&= ~KMMsgStatusHam
;
411 void MessageStatus::setHasAttachment( bool withAttachment
)
413 if ( withAttachment
) {
414 mStatus
|= KMMsgStatusHasAttach
;
416 mStatus
&= ~KMMsgStatusHasAttach
;
420 qint32
MessageStatus::toQInt32() const
425 void MessageStatus::fromQInt32( qint32 status
)
430 QString
MessageStatus::getStatusStr() const
433 if ( mStatus
& KMMsgStatusNew
) {
436 if ( mStatus
& KMMsgStatusUnread
) {
439 if ( mStatus
& KMMsgStatusOld
) {
442 if ( mStatus
& KMMsgStatusRead
) {
445 if ( mStatus
& KMMsgStatusDeleted
) {
448 if ( mStatus
& KMMsgStatusReplied
) {
451 if ( mStatus
& KMMsgStatusForwarded
) {
454 if ( mStatus
& KMMsgStatusQueued
) {
457 if ( mStatus
& KMMsgStatusToAct
) {
460 if ( mStatus
& KMMsgStatusSent
) {
463 if ( mStatus
& KMMsgStatusFlag
) {
466 if ( mStatus
& KMMsgStatusWatched
) {
469 if ( mStatus
& KMMsgStatusIgnored
) {
472 if ( mStatus
& KMMsgStatusSpam
) {
475 if ( mStatus
& KMMsgStatusHam
) {
478 if ( mStatus
& KMMsgStatusHasAttach
) {
485 void MessageStatus::setStatusFromStr( const QString
& aStr
)
487 mStatus
= KMMsgStatusUnknown
;
489 if ( aStr
.contains( 'N' ) ) {
492 if ( aStr
.contains( 'U' ) ) {
495 if ( aStr
.contains( 'O' ) ) {
498 if ( aStr
.contains( 'R' ) ) {
501 if ( aStr
.contains( 'D' ) ) {
504 if ( aStr
.contains( 'A' ) ) {
507 if ( aStr
.contains( 'F' ) ) {
510 if ( aStr
.contains( 'Q' ) ) {
513 if ( aStr
.contains( 'K' ) ) {
516 if ( aStr
.contains( 'S' ) ) {
519 if ( aStr
.contains( 'G' ) ) {
522 if ( aStr
.contains( 'W' ) ) {
525 if ( aStr
.contains( 'I' ) ) {
528 if ( aStr
.contains( 'P' ) ) {
531 if ( aStr
.contains( 'H' ) ) {
534 if ( aStr
.contains( 'T' ) ) {
537 if ( aStr
.contains( 'C' ) ) {
538 setHasAttachment( false );
542 QString
MessageStatus::getSortRank() const
544 QString sstr
= "bcbbbbbbbb";
546 // put watched ones first, then normal ones, ignored ones last
547 if ( mStatus
& KMMsgStatusWatched
) {
550 if ( mStatus
& KMMsgStatusIgnored
) {
554 // Second level. One of new, old, read, unread
555 if ( mStatus
& KMMsgStatusNew
) {
558 if ( mStatus
& KMMsgStatusUnread
) {
561 //if ( mStatus & KMMsgStatusOld ) {
564 //if ( mStatus & KMMsgStatusRead ) {
568 // Third level. In somewhat arbitrary order.
569 if ( mStatus
& KMMsgStatusDeleted
) {
572 if ( mStatus
& KMMsgStatusFlag
) {
575 if ( mStatus
& KMMsgStatusReplied
) {
578 if ( mStatus
& KMMsgStatusForwarded
) {
581 if ( mStatus
& KMMsgStatusQueued
) {
584 if ( mStatus
& KMMsgStatusSent
) {
587 if ( mStatus
& KMMsgStatusHam
) {
590 if ( mStatus
& KMMsgStatusSpam
) {
593 if ( mStatus
& KMMsgStatusToAct
) {
600 QSet
<QByteArray
> MessageStatus::getStatusFlags() const
602 QSet
<QByteArray
> flags
;
604 // Non handled status:
605 // * KMMsgStatusQueued
609 // * KMMsgStatusHasAttach
611 if ( mStatus
& KMMsgStatusDeleted
) {
614 if ( mStatus
& ( KMMsgStatusOld
| KMMsgStatusRead
) )
616 if ( mStatus
& KMMsgStatusReplied
)
617 flags
+= "\\ANSWERED ";
618 if ( mStatus
& KMMsgStatusFlag
)
619 flags
+= "\\FLAGGED ";
620 // non standard flags
621 if ( mStatus
& KMMsgStatusForwarded
)
622 flags
+= "$FORWARDED ";
623 if ( mStatus
& KMMsgStatusToAct
)
625 if ( mStatus
& KMMsgStatusWatched
)
627 if ( mStatus
& KMMsgStatusIgnored
)
634 void MessageStatus::setStatusFromFlags( const QSet
<QByteArray
> &flags
)
636 mStatus
= KMMsgStatusUnknown
;
639 // Non handled status:
640 // * KMMsgStatusQueued
644 // * KMMsgStatusHasAttach
646 foreach ( const QByteArray
&flag
, flags
) {
647 if ( flag
.toUpper() == QByteArray( "\\DELETED" ) ) {
649 } else if ( flag
.toUpper() == QByteArray( "\\SEEN" ) ) {
651 } else if ( flag
.toUpper() == QByteArray( "\\ANSWERED" ) ) {
653 } else if ( flag
.toUpper() == QByteArray( "\\FLAGGED" ) ) {
656 // non standard flags
657 } else if ( flag
.toUpper() == QByteArray( "$FORWARDED" ) ) {
659 } else if ( flag
.toUpper() == QByteArray( "$TODO" ) ) {
661 } else if ( flag
.toUpper() == QByteArray( "$WATCHED" ) ) {
663 } else if ( flag
.toUpper() == QByteArray( "$IGNORED" ) ) {
666 kWarning() << "Unknown flag:" << flag
;
671 MessageStatus
MessageStatus::statusNew()
678 MessageStatus
MessageStatus::statusRead()
685 MessageStatus
MessageStatus::statusUnread()
692 MessageStatus
MessageStatus::statusNewAndUnread()
695 // set the "new and unread" pseudo status; we have to set the internal
696 // representation directly because new and unread are mutually exclusive
697 st
.fromQInt32( statusNew().toQInt32() | statusUnread().toQInt32() );
701 MessageStatus
MessageStatus::statusOld()
708 MessageStatus
MessageStatus::statusDeleted()
715 MessageStatus
MessageStatus::statusReplied()
722 MessageStatus
MessageStatus::statusForwarded()
729 MessageStatus
MessageStatus::statusQueued()
736 MessageStatus
MessageStatus::statusSent()
743 MessageStatus
MessageStatus::statusImportant()
750 MessageStatus
MessageStatus::statusWatched()
757 MessageStatus
MessageStatus::statusIgnored()
764 MessageStatus
MessageStatus::statusToAct()
771 MessageStatus
MessageStatus::statusSpam()
778 MessageStatus
MessageStatus::statusHam()
785 MessageStatus
MessageStatus::statusHasAttachment()
788 st
.setHasAttachment();