1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 // clang-format off
7 #ifndef _nsImapCore_H_
8 #define _nsImapCore_H_
9 
10 #include "MailNewsTypes.h"
11 #include "nsString.h"
12 
13 /* imap message flags */
14 typedef uint16_t imapMessageFlagsType;
15 
16 /* used for communication between imap thread and event sinks */
17 #define kNoFlags            0x00 /* RFC flags */
18 #define kMarked             0x01
19 #define kUnmarked           0x02
20 #define kNoinferiors        0x04
21 #define kNoselect           0x08
22 #define kImapTrash          0x10     /* Navigator flag */
23 #define kJustExpunged       0x20     /* This update is a post expunge url update. */
24 #define kPersonalMailbox    0x40     /* this mailbox is in the personal namespace */
25 #define kPublicMailbox      0x80     /* this mailbox is in the public namespace */
26 #define kOtherUsersMailbox  0x100    /* this mailbox is in the other users' namespace */
27 #define kNameSpace          0x200    /* this mailbox IS a namespace */
28 #define kNewlyCreatedFolder 0x400    /* this folder was just created */
29 #define kImapDrafts         0x800    /* XLIST says this is the drafts folder */
30 #define kImapSpam           0x1000   /* XLIST says this is the spam folder */
31 #define kImapSent           0x2000   /* XLIST says this is the sent folder */
32 #define kImapInbox          0x4000   /* XLIST says this is the INBOX folder */
33 #define kImapAllMail        0x8000   /* XLIST says this is AllMail (GMail) */
34 #define kImapXListTrash     0x10000  /* XLIST says this is the trash */
35 #define kNonExistent        0x20000  /* RFC 5258, LIST-EXTENDED */
36 #define kSubscribed         0x40000  /* RFC 5258, LIST-EXTENDED */
37 #define kRemote             0x80000  /* RFC 5258, LIST-EXTENDED */
38 #define kHasChildren        0x100000 /* RFC 5258, LIST-EXTENDED */
39 #define kHasNoChildren      0x200000 /* RFC 5258, LIST-EXTENDED */
40 #define kImapArchive        0x400000 /* RFC 5258, LIST-EXTENDED */
41 
42 /* flags for individual messages */
43 /* currently the ui only offers \Seen and \Flagged */
44 #define kNoImapMsgFlag                0x0000
45 #define kImapMsgSeenFlag              0x0001
46 #define kImapMsgAnsweredFlag          0x0002
47 #define kImapMsgFlaggedFlag           0x0004
48 #define kImapMsgDeletedFlag           0x0008
49 #define kImapMsgDraftFlag             0x0010
50 #define kImapMsgRecentFlag            0x0020
51 #define kImapMsgForwardedFlag         0x0040  /* Not always supported, check mailbox folder */
52 #define kImapMsgMDNSentFlag           0x0080  /* Not always supported. check mailbox folder */
53 #define kImapMsgCustomKeywordFlag     0x0100  /* this msg has a custom keyword */
54 #define kImapMsgLabelFlags            0x0E00  /* supports 5 labels only supported if the folder supports keywords */
55 #define kImapMsgSupportMDNSentFlag    0x2000
56 #define kImapMsgSupportForwardedFlag  0x4000
57 /**
58  * We use a separate xlist trash flag so we can prefer the GMail trash
59  * over an existing Trash folder we may have created.
60  */
61 #define kImapMsgSupportUserFlag       0x8000
62 /* This seems to be the most cost effective way of
63 * piggying back the server support user flag info.
64 */
65 
66 /* if a url creator does not know the hierarchyDelimiter, use this */
67 #define kOnlineHierarchySeparatorUnknown '^'
68 #define kOnlineHierarchySeparatorNil '|'
69 
70 #define IMAP_URL_TOKEN_SEPARATOR ">"
71 #define kUidUnknown -1
72 // Special initial value meaning ACLs need to be loaded from DB.
73 #define kAclInvalid ((uint32_t) -1)
74 
75 // this has to do with Mime Parts on Demand. It used to live in net.h
76 // I'm not sure where this will live, but here is OK temporarily
77 typedef enum {
78   IMAP_CONTENT_NOT_MODIFIED = 0,
79   IMAP_CONTENT_MODIFIED_VIEW_INLINE,
80   IMAP_CONTENT_MODIFIED_VIEW_AS_LINKS,
81   IMAP_CONTENT_FORCE_CONTENT_NOT_MODIFIED
82 } IMAP_ContentModifiedType;
83 
84 // I think this should really go in an imap.h equivalent file
85 typedef enum {
86     kPersonalNamespace = 0,
87     kOtherUsersNamespace,
88     kPublicNamespace,
89     kDefaultNamespace,
90     kUnknownNamespace
91 } EIMAPNamespaceType;
92 
93 
94 /**
95  * IMAP server feature, mostly CAPABILITY responses
96  *
97  * one of the cap flags below
98  */
99 typedef uint64_t eIMAPCapabilityFlag;
100 /**
101  * IMAP server features, mostly CAPABILITY responses
102  *
103  * any set of the cap flags below, i.e.
104  * i.e. 0, 1 or more |eIMAPCapabilityFlag|.
105  */
106 typedef uint64_t eIMAPCapabilityFlags;
107 
108 const eIMAPCapabilityFlag kCapabilityUndefined =          0x00000000;
109 const eIMAPCapabilityFlag kCapabilityDefined =            0x00000001;
110 const eIMAPCapabilityFlag kHasAuthLoginCapability =       0x00000002;  /* AUTH LOGIN (not the same as kHasAuthOldLoginCapability) */
111 const eIMAPCapabilityFlag kHasAuthOldLoginCapability =    0x00000004;  /* original IMAP login method */
112 const eIMAPCapabilityFlag kHasXSenderCapability =         0x00000008;
113 const eIMAPCapabilityFlag kIMAP4Capability =              0x00000010;  /* RFC1734 */
114 const eIMAPCapabilityFlag kIMAP4rev1Capability =          0x00000020;  /* RFC2060 */
115 const eIMAPCapabilityFlag kIMAP4other =                   0x00000040;  /* future rev?? */
116 const eIMAPCapabilityFlag kNoHierarchyRename =            0x00000080;  /* no hierarchy rename */
117 const eIMAPCapabilityFlag kACLCapability =                0x00000100;  /* ACL extension */
118 const eIMAPCapabilityFlag kNamespaceCapability =          0x00000200;  /* IMAP4 Namespace Extension */
119 const eIMAPCapabilityFlag kHasIDCapability =              0x00000400;  /* client user agent id extension */
120 const eIMAPCapabilityFlag kXServerInfoCapability =        0x00000800;  /* XSERVERINFO extension for admin urls */
121 const eIMAPCapabilityFlag kHasAuthPlainCapability =       0x00001000;  /* new form of auth plain base64 login */
122 const eIMAPCapabilityFlag kUidplusCapability =            0x00002000;  /* RFC 2359 UIDPLUS extension */
123 const eIMAPCapabilityFlag kLiteralPlusCapability =        0x00004000;  /* RFC 2088 LITERAL+ extension */
124 const eIMAPCapabilityFlag kAOLImapCapability =            0x00008000;  /* aol imap extensions */
125 const eIMAPCapabilityFlag kHasLanguageCapability =        0x00010000;  /* language extensions */
126 const eIMAPCapabilityFlag kHasCRAMCapability =            0x00020000;  /* CRAM auth extension */
127 const eIMAPCapabilityFlag kQuotaCapability =              0x00040000;  /* RFC 2087 quota extension */
128 const eIMAPCapabilityFlag kHasIdleCapability =            0x00080000;  /* RFC 2177 idle extension */
129 const eIMAPCapabilityFlag kHasAuthNTLMCapability =        0x00100000;  /* AUTH NTLM extension */
130 const eIMAPCapabilityFlag kHasAuthMSNCapability =         0x00200000;  /* AUTH MSN extension */
131 const eIMAPCapabilityFlag kHasStartTLSCapability =        0x00400000;  /* STARTTLS support */
132 const eIMAPCapabilityFlag kHasAuthNoneCapability =        0x00800000;  /* needs no login */
133 const eIMAPCapabilityFlag kHasAuthGssApiCapability =      0x01000000;  /* GSSAPI AUTH */
134 const eIMAPCapabilityFlag kHasCondStoreCapability =       0x02000000;  /* RFC 3551 CondStore extension */
135 const eIMAPCapabilityFlag kHasEnableCapability =          0x04000000;  /* RFC 5161 ENABLE extension */
136 const eIMAPCapabilityFlag kHasXListCapability =           0x08000000;  /* XLIST extension */
137 const eIMAPCapabilityFlag kHasCompressDeflateCapability = 0x10000000;  /* RFC 4978 COMPRESS extension */
138 const eIMAPCapabilityFlag kHasAuthExternalCapability =    0x20000000;  /* RFC 2222 SASL AUTH EXTERNAL */
139 const eIMAPCapabilityFlag kHasMoveCapability =            0x40000000;  /* Proposed MOVE RFC */
140 const eIMAPCapabilityFlag kHasHighestModSeqCapability =   0x80000000;  /* Subset of RFC 3551 */
141 // above are 32bit; below start the uint64_t bits 33-64
142 const eIMAPCapabilityFlag kHasListExtendedCapability =    0x100000000LL;  /* RFC 5258 */
143 const eIMAPCapabilityFlag kHasSpecialUseCapability =      0x200000000LL;  /* RFC 6154: Sent, Draft etc. folders */
144 const eIMAPCapabilityFlag kGmailImapCapability =          0x400000000LL;  /* X-GM-EXT-1 capability extension for gmail */
145 const eIMAPCapabilityFlag kHasXOAuth2Capability =         0x800000000LL;  /* AUTH XOAUTH2 extension */
146 const eIMAPCapabilityFlag kHasClientIDCapability =        0x1000000000LL; /* ClientID capability */
147 const eIMAPCapabilityFlag kHasUTF8AcceptCapability =      0x2000000000LL; /* RFC 6855: UTF8=ACCEPT */
148 
149 
150 // this used to be part of the connection object class - maybe we should move it into
151 // something similar
152 typedef enum {
153     kEveryThingRFC822,
154     kEveryThingRFC822Peek,
155     kHeadersRFC822andUid,
156     kUid,
157     kFlags,
158     kRFC822Size,
159     kRFC822HeadersOnly,
160     kMIMEPart,
161     kMIMEHeader,
162     kBodyStart
163 } nsIMAPeFetchFields;
164 
165 typedef struct _utf_name_struct {
166   bool toUtf7Imap;
167   unsigned char *sourceString;
168   unsigned char *convertedString;
169 } utf_name_struct;
170 
171 typedef struct _ProgressInfo {
172   char16_t *message;
173   int32_t currentProgress;
174   int32_t maxProgress;
175 } ProgressInfo;
176 
177 typedef enum {
178   eContinue,
179   eContinueNew,
180   eListMyChildren,
181   eNewServerDirectory,
182   eCancelled
183 } EMailboxDiscoverStatus;
184 
185 typedef enum {
186   kInvalidateQuota,
187   kStoreQuota,
188   kValidateQuota
189 } nsImapQuotaAction;
190 
191 #endif
192 // clang-format on
193