6 #include "kmmessagetag.h"
7 //#include "kmmsgpart.h" // for encode
13 #include <mimelib/datetime.h>
16 /** The old status format, only one at a time possible. Needed
17 for upgrade path purposes. */
20 KMLegacyMsgStatusUnknown
=' ',
21 KMLegacyMsgStatusNew
='N',
22 KMLegacyMsgStatusUnread
='U',
23 KMLegacyMsgStatusRead
='R',
24 KMLegacyMsgStatusOld
='O',
25 KMLegacyMsgStatusDeleted
='D',
26 KMLegacyMsgStatusReplied
='A',
27 KMLegacyMsgStatusForwarded
='F',
28 KMLegacyMsgStatusQueued
='Q',
29 KMLegacyMsgStatusSent
='S',
30 KMLegacyMsgStatusFlag
='G'
34 class KMMsgInfo::KMMsgInfoPrivate
38 SUBJECT_SET
= 0x01, TO_SET
= 0x02, REPLYTO_SET
= 0x04, MSGID_SET
=0x08,
39 DATE_SET
= 0x10, OFFSET_SET
= 0x20, SIZE_SET
= 0x40, SIZESERVER_SET
= 0x80,
40 XMARK_SET
=0x100, FROM_SET
=0x200, FILE_SET
=0x400, ENCRYPTION_SET
=0x800,
41 SIGNATURE_SET
=0x1000, MDN_SET
=0x2000, REPLYTOAUX_SET
= 0x4000,
42 STRIPPEDSUBJECT_SET
= 0x8000, UID_SET
= 0x10000,
44 ALL_SET
= 0xFFFFFF, NONE_SET
= 0x000000
47 QString subject
, from
, to
, replyToIdMD5
, replyToAuxIdMD5
,
48 strippedSubjectMD5
, msgIdMD5
, xmark
, file
;
50 size_t msgSize
, msgSizeServer
;
52 KMMsgEncryptionState encryptionState
;
53 KMMsgSignatureState signatureState
;
54 KMMsgMDNSentState mdnSentState
;
57 KMMsgInfoPrivate() : modifiers(NONE_SET
) { }
58 KMMsgInfoPrivate
& operator=(const KMMsgInfoPrivate
& other
) {
60 if (other
.modifiers
& SUBJECT_SET
) {
61 modifiers
|= SUBJECT_SET
;
62 subject
= other
.subject
;
64 if (other
.modifiers
& STRIPPEDSUBJECT_SET
) {
65 modifiers
|= STRIPPEDSUBJECT_SET
;
66 strippedSubjectMD5
= other
.strippedSubjectMD5
;
68 if (other
.modifiers
& FROM_SET
) {
69 modifiers
|= FROM_SET
;
72 if (other
.modifiers
& FILE_SET
) {
73 modifiers
|= FILE_SET
;
76 if (other
.modifiers
& TO_SET
) {
80 if (other
.modifiers
& REPLYTO_SET
) {
81 modifiers
|= REPLYTO_SET
;
82 replyToIdMD5
= other
.replyToIdMD5
;
84 if (other
.modifiers
& REPLYTOAUX_SET
) {
85 modifiers
|= REPLYTOAUX_SET
;
86 replyToAuxIdMD5
= other
.replyToAuxIdMD5
;
89 if(other
.modifiers
& MSGID_SET
) {
90 modifiers
|= MSGID_SET
;
91 msgIdMD5
= other
.msgIdMD5
;
93 if(other
.modifiers
& XMARK_SET
) {
94 modifiers
|= XMARK_SET
;
97 if(other
.modifiers
& OFFSET_SET
) {
98 modifiers
|= OFFSET_SET
;
99 folderOffset
= other
.folderOffset
;
101 if(other
.modifiers
& SIZE_SET
) {
102 modifiers
|= SIZE_SET
;
103 msgSize
= other
.msgSize
;
105 if(other
.modifiers
& DATE_SET
) {
106 modifiers
|= DATE_SET
;
109 if(other
.modifiers
& ENCRYPTION_SET
) {
110 modifiers
|= ENCRYPTION_SET
;
111 encryptionState
= other
.encryptionState
;
113 if(other
.modifiers
& SIGNATURE_SET
) {
114 modifiers
|= SIGNATURE_SET
;
115 signatureState
= other
.signatureState
;
117 if(other
.modifiers
& MDN_SET
) {
118 modifiers
|= MDN_SET
;
119 mdnSentState
= other
.mdnSentState
;
121 if(other
.modifiers
& SIZESERVER_SET
) {
122 modifiers
|= SIZESERVER_SET
;
123 msgSizeServer
= other
.msgSizeServer
;
125 if(other
.modifiers
& UID_SET
) {
126 modifiers
|= UID_SET
;
133 //-----------------------------------------------------------------------------
134 #ifdef KMAIL_SQLITE_INDEX
135 KMMsgInfo::KMMsgInfo(KMFolder
* p
, char* data
, short len
, sqlite_int64 dbId
) :
136 KMMsgBase(p
, data
, len
, dbId
),
138 KMMsgInfo::KMMsgInfo(KMFolder
* p
, off_t off
, short len
) :
139 KMMsgBase(p
, off
, len
),
147 //-----------------------------------------------------------------------------
148 KMMsgInfo::~KMMsgInfo()
154 #if 0 // currently unused
155 //-----------------------------------------------------------------------------
156 KMMsgInfo
& KMMsgInfo::operator=(const KMMsgInfo
& other
)
158 KMMsgBase::assign(&other
);
161 kd
= new KMMsgInfoPrivate
;
167 mStatus
= other
.status();
172 //-----------------------------------------------------------------------------
173 KMMsgInfo
& KMMsgInfo::operator=(const KMMessage
& msg
)
175 KMMsgBase::assign(&msg
.toMsgBase());
177 kd
= new KMMsgInfoPrivate
;
178 kd
->modifiers
= KMMsgInfoPrivate::ALL_SET
;
179 kd
->subject
= msg
.subject();
180 kd
->from
= msg
.fromStrip();
181 kd
->to
= msg
.toStrip();
182 kd
->replyToIdMD5
= msg
.replyToIdMD5();
183 kd
->replyToAuxIdMD5
= msg
.replyToAuxIdMD5();
184 kd
->strippedSubjectMD5
= msg
.strippedSubjectMD5();
185 kd
->msgIdMD5
= msg
.msgIdMD5();
186 kd
->xmark
= msg
.xmark();
187 mStatus
= msg
.messageStatus();
188 kd
->folderOffset
= msg
.folderOffset();
189 kd
->msgSize
= msg
.msgSize();
190 kd
->date
= msg
.date();
191 kd
->file
= msg
.fileName();
192 kd
->encryptionState
= msg
.encryptionState();
193 kd
->signatureState
= msg
.signatureState();
194 kd
->mdnSentState
= msg
.mdnSentState();
195 kd
->msgSizeServer
= msg
.msgSizeServer();
197 if ( msg
.tagList() ) {
199 mTagList
= new KMMessageTagList();
200 *mTagList
= *msg
.tagList();
208 //-----------------------------------------------------------------------------
209 void KMMsgInfo::init(const QByteArray
& aSubject
, const QByteArray
& aFrom
,
210 const QByteArray
& aTo
, time_t aDate
,
211 const MessageStatus
& aStatus
, const QByteArray
& aXMark
,
212 const QByteArray
& replyToId
, const QByteArray
& replyToAuxId
,
213 const QByteArray
& msgId
,
214 KMMsgEncryptionState encryptionState
,
215 KMMsgSignatureState signatureState
,
216 KMMsgMDNSentState mdnSentState
,
217 const QByteArray
& prefCharset
,
218 off_t aFolderOffset
, size_t aMsgSize
,
219 size_t aMsgSizeServer
, ulong aUID
)
221 #ifdef KMAIL_SQLITE_INDEX
228 kd
= new KMMsgInfoPrivate
;
229 kd
->modifiers
= KMMsgInfoPrivate::ALL_SET
;
230 kd
->subject
= decodeRFC2047String( aSubject
, prefCharset
);
231 kd
->from
= decodeRFC2047String( KMMessage::stripEmailAddr( aFrom
),
233 kd
->to
= decodeRFC2047String( KMMessage::stripEmailAddr( aTo
),
235 kd
->replyToIdMD5
= base64EncodedMD5( replyToId
);
236 kd
->replyToAuxIdMD5
= base64EncodedMD5( replyToAuxId
);
237 kd
->strippedSubjectMD5
= base64EncodedMD5( KMMessage::stripOffPrefixes( kd
->subject
), true /*utf8*/ );
238 kd
->msgIdMD5
= base64EncodedMD5( msgId
);
240 kd
->folderOffset
= aFolderOffset
;
242 kd
->msgSize
= aMsgSize
;
245 kd
->encryptionState
= encryptionState
;
246 kd
->signatureState
= signatureState
;
247 kd
->mdnSentState
= mdnSentState
;
248 kd
->msgSizeServer
= aMsgSizeServer
;
253 void KMMsgInfo::init(const QByteArray
& aSubject
, const QByteArray
& aFrom
,
254 const QByteArray
& aTo
, time_t aDate
,
255 const MessageStatus
& aStatus
, const QByteArray
& aXMark
,
256 const QByteArray
& replyToId
, const QByteArray
& replyToAuxId
,
257 const QByteArray
& msgId
,
258 const QByteArray
& aFileName
,
259 KMMsgEncryptionState encryptionState
,
260 KMMsgSignatureState signatureState
,
261 KMMsgMDNSentState mdnSentState
,
262 const QByteArray
&prefCharset
,
264 size_t aMsgSizeServer
, ulong aUID
)
266 // use the "normal" init for most stuff
267 init( aSubject
, aFrom
, aTo
, aDate
, aStatus
, aXMark
, replyToId
, replyToAuxId
,
268 msgId
, encryptionState
, signatureState
, mdnSentState
, prefCharset
,
269 (unsigned long)0, aMsgSize
, aMsgSizeServer
, aUID
);
270 kd
->file
= aFileName
;
274 //-----------------------------------------------------------------------------
275 QString
KMMsgInfo::subject(void) const
277 if (kd
&& kd
->modifiers
& KMMsgInfoPrivate::SUBJECT_SET
)
279 return getStringPart(MsgSubjectPart
);
283 //-----------------------------------------------------------------------------
284 QString
KMMsgInfo::fromStrip(void) const
286 if (kd
&& kd
->modifiers
& KMMsgInfoPrivate::FROM_SET
)
288 return getStringPart(MsgFromPart
);
291 //-----------------------------------------------------------------------------
292 QString
KMMsgInfo::fileName(void) const
294 if (kd
&& kd
->modifiers
& KMMsgInfoPrivate::FILE_SET
)
296 return getStringPart(MsgFilePart
);
299 //-----------------------------------------------------------------------------
300 QString
KMMsgInfo::tagString( void ) const
302 return tagList()->join( "," );
304 KMMessageTagList
* KMMsgInfo::tagList( void ) const
308 mTagList
= new KMMessageTagList( KMMessageTagList::split( ",",
309 getStringPart( MsgTagPart
) ) );
310 mTagList
->prioritySort();
314 //-----------------------------------------------------------------------------
315 QString
KMMsgInfo::toStrip(void) const
317 if (kd
&& kd
->modifiers
& KMMsgInfoPrivate::TO_SET
)
319 return getStringPart(MsgToPart
);
322 //-----------------------------------------------------------------------------
323 QString
KMMsgInfo::xmark(void) const
325 if (kd
&& kd
->modifiers
& KMMsgInfoPrivate::XMARK_SET
)
327 return getStringPart(MsgXMarkPart
);
331 //-----------------------------------------------------------------------------
332 QString
KMMsgInfo::replyToIdMD5(void) const
334 if (kd
&& kd
->modifiers
& KMMsgInfoPrivate::REPLYTO_SET
)
335 return kd
->replyToIdMD5
;
336 return getStringPart(MsgReplyToIdMD5Part
);
339 //-----------------------------------------------------------------------------
340 QString
KMMsgInfo::replyToAuxIdMD5() const
342 if( kd
&& kd
->modifiers
& KMMsgInfoPrivate::REPLYTOAUX_SET
)
343 return kd
->replyToAuxIdMD5
;
344 return getStringPart( MsgReplyToAuxIdMD5Part
);
347 //-----------------------------------------------------------------------------
348 QString
KMMsgInfo::strippedSubjectMD5() const
350 if( kd
&& kd
->modifiers
& KMMsgInfoPrivate::STRIPPEDSUBJECT_SET
)
351 return kd
->strippedSubjectMD5
;
352 return getStringPart( MsgStrippedSubjectMD5Part
);
356 //-----------------------------------------------------------------------------
357 bool KMMsgInfo::subjectIsPrefixed() const
359 return strippedSubjectMD5() != base64EncodedMD5( subject().trimmed(), true /*utf8*/ );
362 //-----------------------------------------------------------------------------
363 QString
KMMsgInfo::msgIdMD5(void) const
365 if (kd
&& kd
->modifiers
& KMMsgInfoPrivate::MSGID_SET
)
367 return getStringPart(MsgIdMD5Part
);
371 //-----------------------------------------------------------------------------
372 void KMMsgInfo::setSubject(const QString
& aSubject
)
374 if(aSubject
== subject())
378 kd
= new KMMsgInfoPrivate
;
379 kd
->modifiers
|= KMMsgInfoPrivate::SUBJECT_SET
;
380 kd
->subject
= aSubject
;
385 //-----------------------------------------------------------------------------
386 void KMMsgInfo::setXMark(const QString
& aXMark
)
388 if (aXMark
== xmark())
392 kd
= new KMMsgInfoPrivate
;
393 kd
->modifiers
|= KMMsgInfoPrivate::XMARK_SET
;
399 //-----------------------------------------------------------------------------
400 void KMMsgInfo::setReplyToIdMD5(const QString
& aReplyToIdMD5
)
402 if (aReplyToIdMD5
== replyToIdMD5())
406 kd
= new KMMsgInfoPrivate
;
407 kd
->modifiers
|= KMMsgInfoPrivate::REPLYTO_SET
;
408 kd
->replyToIdMD5
= aReplyToIdMD5
;
413 //-----------------------------------------------------------------------------
414 void KMMsgInfo::setReplyToAuxIdMD5( const QString
& aReplyToAuxIdMD5
)
416 if( aReplyToAuxIdMD5
== replyToAuxIdMD5() )
420 kd
= new KMMsgInfoPrivate
;
421 kd
->modifiers
|= KMMsgInfoPrivate::REPLYTOAUX_SET
;
422 kd
->replyToAuxIdMD5
= aReplyToAuxIdMD5
;
427 //-----------------------------------------------------------------------------
428 void KMMsgInfo::initStrippedSubjectMD5()
430 if( kd
&& kd
->modifiers
& KMMsgInfoPrivate::STRIPPEDSUBJECT_SET
)
432 QString rawSubject
= KMMessage::stripOffPrefixes( subject() );
433 QString subjectMD5
= base64EncodedMD5( rawSubject
, true /*utf8*/ );
435 kd
= new KMMsgInfoPrivate
;
436 kd
->modifiers
|= KMMsgInfoPrivate::STRIPPEDSUBJECT_SET
;
437 kd
->strippedSubjectMD5
= subjectMD5
;
442 //-----------------------------------------------------------------------------
443 void KMMsgInfo::setMsgIdMD5(const QString
& aMsgIdMD5
)
445 if (aMsgIdMD5
== msgIdMD5())
449 kd
= new KMMsgInfoPrivate
;
450 kd
->modifiers
|= KMMsgInfoPrivate::MSGID_SET
;
451 kd
->msgIdMD5
= aMsgIdMD5
;
455 //-----------------------------------------------------------------------------
456 void KMMsgInfo::setEncryptionState( const KMMsgEncryptionState s
, int idx
)
458 if (s
== encryptionState())
462 kd
= new KMMsgInfoPrivate
;
463 kd
->modifiers
|= KMMsgInfoPrivate::ENCRYPTION_SET
;
464 kd
->encryptionState
= s
;
465 KMMsgBase::setEncryptionState(s
, idx
); //base does more "stuff"
469 //-----------------------------------------------------------------------------
470 void KMMsgInfo::setSignatureState( const KMMsgSignatureState s
, int idx
)
472 if (s
== signatureState())
476 kd
= new KMMsgInfoPrivate
;
477 kd
->modifiers
|= KMMsgInfoPrivate::SIGNATURE_SET
;
478 kd
->signatureState
= s
;
479 KMMsgBase::setSignatureState(s
, idx
); //base does more "stuff"
483 //-----------------------------------------------------------------------------
484 void KMMsgInfo::setMDNSentState( const KMMsgMDNSentState s
, int idx
)
486 if (s
== mdnSentState())
490 kd
= new KMMsgInfoPrivate
;
491 kd
->modifiers
|= KMMsgInfoPrivate::MDN_SET
;
492 kd
->mdnSentState
= s
;
493 KMMsgBase::setMDNSentState(s
, idx
); //base does more "stuff"
497 //-----------------------------------------------------------------------------
498 MessageStatus
& KMMsgInfo::status() const
500 if ( mStatus
.isOfUnknownStatus() ) {
501 mStatus
.fromQInt32( getLongPart( MsgStatusPart
) );
502 if ( mStatus
.isOfUnknownStatus() ) {
503 // We are opening an old index for the first time, get the legacy
504 // status and merge it in.
505 // This is kept to provide an upgrade path from the old single
506 // status to the new multiple status scheme.
507 KMLegacyMsgStatus legacyMsgStatus
= (KMLegacyMsgStatus
)getLongPart(MsgLegacyStatusPart
);
509 switch (legacyMsgStatus
) {
510 case KMLegacyMsgStatusUnknown
:
513 case KMLegacyMsgStatusNew
:
516 case KMLegacyMsgStatusUnread
:
519 case KMLegacyMsgStatusRead
:
522 case KMLegacyMsgStatusOld
:
525 case KMLegacyMsgStatusDeleted
:
526 mStatus
.setDeleted();
528 case KMLegacyMsgStatusReplied
:
529 mStatus
.setReplied();
531 case KMLegacyMsgStatusForwarded
:
532 mStatus
.setForwarded();
534 case KMLegacyMsgStatusQueued
:
537 case KMLegacyMsgStatusSent
:
540 case KMLegacyMsgStatusFlag
:
541 mStatus
.setImportant();
553 //-----------------------------------------------------------------------------
554 KMMsgEncryptionState
KMMsgInfo::encryptionState() const
556 if (kd
&& kd
->modifiers
& KMMsgInfoPrivate::ENCRYPTION_SET
)
557 return kd
->encryptionState
;
558 unsigned long encState
= getLongPart(MsgCryptoStatePart
) & 0x0000FFFF;
559 return encState
? (KMMsgEncryptionState
)encState
: KMMsgEncryptionStateUnknown
;
563 KMMsgSignatureState
KMMsgInfo::signatureState() const
565 if (kd
&& kd
->modifiers
& KMMsgInfoPrivate::SIGNATURE_SET
)
566 return kd
->signatureState
;
567 unsigned long sigState
= getLongPart(MsgCryptoStatePart
) >> 16;
568 return sigState
? (KMMsgSignatureState
)sigState
: KMMsgSignatureStateUnknown
;
571 KMMsgMDNSentState
KMMsgInfo::mdnSentState() const {
572 if (kd
&& kd
->modifiers
& KMMsgInfoPrivate::MDN_SET
)
573 return kd
->mdnSentState
;
574 unsigned long mdnState
= getLongPart(MsgMDNSentPart
);
575 return mdnState
? (KMMsgMDNSentState
)mdnState
: KMMsgMDNStateUnknown
;
579 //-----------------------------------------------------------------------------
580 off_t
KMMsgInfo::folderOffset(void) const
582 if (kd
&& kd
->modifiers
& KMMsgInfoPrivate::OFFSET_SET
)
583 return kd
->folderOffset
;
584 return getLongPart(MsgOffsetPart
);
587 //-----------------------------------------------------------------------------
588 size_t KMMsgInfo::msgSize(void) const
590 if (kd
&& kd
->modifiers
& KMMsgInfoPrivate::SIZE_SET
)
592 return getLongPart(MsgSizePart
);
595 //-----------------------------------------------------------------------------
596 time_t KMMsgInfo::date(void) const
599 if (kd
&& kd
->modifiers
& KMMsgInfoPrivate::DATE_SET
)
602 res
= getLongPart(MsgDatePart
);
606 //-----------------------------------------------------------------------------
607 size_t KMMsgInfo::msgSizeServer(void) const
609 if (kd
&& kd
->modifiers
& KMMsgInfoPrivate::SIZESERVER_SET
)
610 return kd
->msgSizeServer
;
611 return getLongPart(MsgSizeServerPart
);
614 //-----------------------------------------------------------------------------
615 ulong
KMMsgInfo::UID(void) const
617 if (kd
&& kd
->modifiers
& KMMsgInfoPrivate::UID_SET
)
619 return getLongPart(MsgUIDPart
);
622 //-----------------------------------------------------------------------------
623 void KMMsgInfo::setMsgSize(size_t sz
)
629 kd
= new KMMsgInfoPrivate
;
630 kd
->modifiers
|= KMMsgInfoPrivate::SIZE_SET
;
635 //-----------------------------------------------------------------------------
636 void KMMsgInfo::setMsgSizeServer(size_t sz
)
638 if (sz
== msgSizeServer())
642 kd
= new KMMsgInfoPrivate
;
643 kd
->modifiers
|= KMMsgInfoPrivate::SIZESERVER_SET
;
644 kd
->msgSizeServer
= sz
;
648 //-----------------------------------------------------------------------------
649 void KMMsgInfo::setUID(ulong uid
)
655 kd
= new KMMsgInfoPrivate
;
656 kd
->modifiers
|= KMMsgInfoPrivate::UID_SET
;
661 //-----------------------------------------------------------------------------
662 void KMMsgInfo::setFolderOffset(off_t offs
)
664 if (folderOffset() == offs
)
668 kd
= new KMMsgInfoPrivate
;
669 kd
->modifiers
|= KMMsgInfoPrivate::OFFSET_SET
;
670 kd
->folderOffset
= offs
;
674 //-----------------------------------------------------------------------------
675 void KMMsgInfo::setFileName(const QString
& file
)
677 if (fileName() == file
)
681 kd
= new KMMsgInfoPrivate
;
682 kd
->modifiers
|= KMMsgInfoPrivate::FILE_SET
;
687 //-----------------------------------------------------------------------------
688 void KMMsgInfo::setStatus(const MessageStatus
& aStatus
, int idx
)
690 if( aStatus
== mStatus
)
692 KMMsgBase::setStatus( aStatus
, idx
); //base does more "stuff"
695 //-----------------------------------------------------------------------------
696 void KMMsgInfo::setDate(time_t aUnixTime
)
698 if(aUnixTime
== date())
702 kd
= new KMMsgInfoPrivate
;
703 kd
->modifiers
|= KMMsgInfoPrivate::DATE_SET
;
704 kd
->date
= aUnixTime
;
708 //--- For compatibility with old index files
709 void KMMsgInfo::compat_fromOldIndexString(const QByteArray
& str
, bool toUtf8
)
711 const char *start
, *offset
;
714 kd
= new KMMsgInfoPrivate
;
715 kd
->modifiers
= KMMsgInfoPrivate::ALL_SET
;
716 kd
->xmark
= str
.mid(33, 3).trimmed();
717 kd
->folderOffset
= str
.mid(2,9).toULong();
718 kd
->msgSize
= str
.mid(12,9).toULong();
719 kd
->date
= (time_t)str
.mid(22,10).toULong();
720 mStatus
.setStatusFromStr( str
);
722 kd
->subject
= str
.mid(37, 100).trimmed();
723 kd
->from
= str
.mid(138, 50).trimmed();
724 kd
->to
= str
.mid(189, 50).trimmed();
726 start
= offset
= str
.data() + 37;
727 while (*start
== ' ' && start
- offset
< 100) start
++;
728 kd
->subject
= QString::fromUtf8(str
.mid(start
- str
.data(),
729 100 - (start
- offset
)), 100 - (start
- offset
));
730 start
= offset
= str
.data() + 138;
731 while (*start
== ' ' && start
- offset
< 50) start
++;
732 kd
->from
= QString::fromUtf8(str
.mid(start
- str
.data(),
733 50 - (start
- offset
)), 50 - (start
- offset
));
734 start
= offset
= str
.data() + 189;
735 while (*start
== ' ' && start
- offset
< 50) start
++;
736 kd
->to
= QString::fromUtf8(str
.mid(start
- str
.data(),
737 50 - (start
- offset
)), 50 - (start
- offset
));
739 kd
->replyToIdMD5
= str
.mid(240, 22).trimmed();
740 kd
->msgIdMD5
= str
.mid(263, 22).trimmed();
744 bool KMMsgInfo::dirty(void) const
746 if( KMMsgBase::dirty() )
748 return kd
&& kd
->modifiers
!= KMMsgInfoPrivate::NONE_SET
;