include: Add a generic red-black tree.
[wine] / include / imnxport.idl
1 /*
2  * Copyright 2006 Robert Shearman for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 import "imnact.idl";
20
21 interface IInternetTransport;
22 interface ISMTPTransport;
23 interface IPOP3Transport;
24 interface IIMAPTransport;
25
26 /* CLSIDs */
27
28 cpp_quote("DEFINE_GUID(CLSID_IInternetMessageUrl, 0xca30cc91, 0xb1b3, 0x11d0, 0x85, 0xd0, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
29 cpp_quote("DEFINE_GUID(CLSID_ISMTPTransport, 0xfd853ce6, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
30 cpp_quote("DEFINE_GUID(CLSID_ISMTPTransport2, 0xdf2c7eC, 0x3435, 0x11d0, 0x81, 0xd0, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
31 cpp_quote("DEFINE_GUID(CLSID_IPOP3Transport, 0xfd853ce7, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
32 cpp_quote("DEFINE_GUID(CLSID_INNTPTransport, 0xfd853ce8, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
33 cpp_quote("DEFINE_GUID(CLSID_IRASTransport, 0xfd853ce9, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
34 cpp_quote("DEFINE_GUID(CLSID_IRangeList, 0xfd853cea, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
35 cpp_quote("DEFINE_GUID(CLSID_IIMAPTransport, 0xfd853ceb, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
36 cpp_quote("DEFINE_GUID(CLSID_IHTTPMailTransport, 0x5a580c11, 0xe5eb, 0x11d1, 0xa8, 0x6e, 0x00, 0x00, 0xf8, 0x08, 0x4f, 0x96);")
37 cpp_quote("DEFINE_GUID(CLSID_IPropFindRequest, 0xbb847b8a, 0x054a, 0x11d2, 0xa8, 0x94, 0x00, 0x00, 0xf8, 0x08, 0x4f, 0x96);")
38 cpp_quote("DEFINE_GUID(CLSID_IPropPatchRequest, 0xea678830, 0x235d, 0x11d2, 0xa8, 0xb6, 0x00, 0x00, 0xf8, 0x08, 0x4f, 0x96);")
39
40 /* Error Codes */
41
42 cpp_quote("#ifndef HR_E")
43 cpp_quote("#define HR_E(n) MAKE_SCODE(SEVERITY_ERROR, FACILITY_INTERNET, n)")
44 cpp_quote("#endif")
45 cpp_quote("#ifndef HR_S")
46 cpp_quote("#define HR_S(n) MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_INTERNET, n)")
47 cpp_quote("#endif")
48
49 /* General Error Codes */
50 cpp_quote("#define IXP_E_LOAD_SICILY_FAILED     HR_E(0xCC00)")
51 cpp_quote("#define IXP_E_INVALID_CERT_CN        HR_E(0xCC01)")
52 cpp_quote("#define IXP_E_INVALID_CERT_DATE      HR_E(0xCC02)")
53 cpp_quote("#define IXP_E_ALREADY_CONNECTED      HR_E(0xCC03)")
54 cpp_quote("#define IXP_E_CONN                   HR_E(0xCC04)")
55 cpp_quote("#define IXP_E_NOT_CONNECTED          HR_E(0xCC05)")
56 cpp_quote("#define IXP_E_CONN_SEND              HR_E(0xCC06)")
57 cpp_quote("#define IXP_E_WOULD_BLOCK            HR_E(0xCC07)")
58 cpp_quote("#define IXP_E_INVALID_STATE          HR_E(0xCC08)")
59 cpp_quote("#define IXP_E_CONN_RECV              HR_E(0xCC09)")
60 cpp_quote("#define IXP_E_INCOMPLETE             HR_E(0xCC0A)")
61 cpp_quote("#define IXP_E_BUSY                   HR_E(0xCC0B)")
62 cpp_quote("#define IXP_E_NOT_INIT               HR_E(0xCC0C)")
63 cpp_quote("#define IXP_E_CANT_FIND_HOST         HR_E(0xCC0D)")
64 cpp_quote("#define IXP_E_FAILED_TO_CONNECT      HR_E(0xCC0E)")
65 cpp_quote("#define IXP_E_CONNECTION_DROPPED     HR_E(0xCC0F)")
66 cpp_quote("#define IXP_E_INVALID_ADDRESS        HR_E(0xCC10)")
67 cpp_quote("#define IXP_E_INVALID_ADDRESS_LIST   HR_E(0xCC11)")
68 cpp_quote("#define IXP_E_SOCKET_READ_ERROR      HR_E(0xCC12)")
69 cpp_quote("#define IXP_E_SOCKET_WRITE_ERROR     HR_E(0xCC13)")
70 cpp_quote("#define IXP_E_SCOKET_INIT_ERROR      HR_E(0xCC14)")
71 cpp_quote("#define IXP_E_SOCKET_CONNECT_ERROR   HR_E(0xCC15)")
72 cpp_quote("#define IXP_E_INVALID_ACCOUNT        HR_E(0xCC16)")
73 cpp_quote("#define IXP_E_USER_CANCEL            HR_E(0xCC17)")
74 cpp_quote("#define IXP_E_SICILY_LOGON_FAILED    HR_E(0xCC18)")
75 cpp_quote("#define IXP_E_TIMEOUT                HR_E(0xCC19)")
76 cpp_quote("#define IXP_E_SECURE_CONNECT_FAILED  HR_E(0xCC1A)")
77
78 /* SMTP Failure Statuses */
79 cpp_quote("#define IXP_E_SMTP_RESPONSE_ERROR            HR_E(0xCC60)")
80 cpp_quote("#define IXP_E_SMTP_UNKNOWN_RESPONSE_CODE     HR_E(0xCC61)")
81 cpp_quote("#define IXP_E_SMTP_500_SYNTAX_ERROR          HR_E(0xCC62)")
82 cpp_quote("#define IXP_E_SMTP_501_PARAM_SYNTAX          HR_E(0xCC63)")
83 cpp_quote("#define IXP_E_SMTP_502_COMMAND_NOTIMPL       HR_E(0xCC64)")
84 cpp_quote("#define IXP_E_SMTP_503_COMMAND_SEQ           HR_E(0xCC65)")
85 cpp_quote("#define IXP_E_SMTP_504_COMMAND_PARAM_NOTIMPL HR_E(0xCC66)")
86 cpp_quote("#define IXP_E_SMTP_421_NOT_AVAILABLE         HR_E(0xCC67)")
87 cpp_quote("#define IXP_E_SMTP_450_MAILBOX_BUSY          HR_E(0xCC68)")
88 cpp_quote("#define IXP_E_SMTP_550_MAILBOX_NOT_FOUND     HR_E(0xCC69)")
89 cpp_quote("#define IXP_E_SMTP_451_ERROR_PROCESSING      HR_E(0xCC6A)")
90 cpp_quote("#define IXP_E_SMTP_551_USER_NOT_LOCAL        HR_E(0xCC6B)")
91 cpp_quote("#define IXP_E_SMTP_452_NO_SYSTEM_STORAGE     HR_E(0xCC6C)")
92 cpp_quote("#define IXP_E_SMTP_552_STORAGE_OVERFLOW      HR_E(0xCC6D)")
93 cpp_quote("#define IXP_E_SMTP_553_MAILBOX_NAME_SYNTAX   HR_E(0xCC6E)")
94 cpp_quote("#define IXP_E_SMTP_554_TRANSACT_FAILED       HR_E(0xCC6F)")
95
96 /* SMTP Success Statuses */
97 cpp_quote("#define IXP_E_SMTP_211_SYSTEM_STATUS         HR_S(0xCC70)")
98 cpp_quote("#define IXP_E_SMTP_214_HELP_MESSAGE          HR_S(0xCC71)")
99 cpp_quote("#define IXP_E_SMTP_220_READY                 HR_S(0xCC72)")
100 cpp_quote("#define IXP_E_SMTP_221_CLOSING               HR_S(0xCC73)")
101 cpp_quote("#define IXP_E_SMTP_250_MAIL_ACTION_OKAY      HR_S(0xCC74)")
102 cpp_quote("#define IXP_E_SMTP_251_FORWARDING_MAIL       HR_S(0xCC75)")
103 cpp_quote("#define IXP_E_SMTP_354_START_MAIL_INPUT      HR_S(0xCC76)")
104 cpp_quote("#define IXP_E_SMTP_CONTINUE                  HR_S(0xCC77)")
105 cpp_quote("#define IXP_E_SMTP_334_AUTH_READY_RESPONSE   HR_S(0xCC78)")
106 cpp_quote("#define IXP_E_SMTP_245_AUTH_SUCCESS          HR_S(0xCC79)")
107
108 /* More SMTP Failure Statuses */
109 cpp_quote("#define IXP_E_SMTP_REJECTED_SENDER           HR_E(0xCC78)")
110 cpp_quote("#define IXP_E_SMTP_REJECTED_RECIPIENTS       HR_E(0xCC79)")
111 cpp_quote("#define IXP_E_SMTP_NO_SENDER                 HR_E(0xCC7A)")
112 cpp_quote("#define IXP_E_SMTP_NO_RECIPIENTS             HR_E(0xCC7B)")
113 cpp_quote("#define IXP_E_SMTP_530_STARTTLS_REQUIRED     HR_E(0xCC7C)")
114 cpp_quote("#define IXP_E_SMTP_NO_STARTTLS_SUPPORT       HR_E(0xCC7D)")
115 cpp_quote("#define IXP_E_SMTP_NO_DSN_SUPPORT            HR_E(0xCC7E)")
116 cpp_quote("#define IXP_E_SMTP_454_STARTTLS_FAILED       HR_E(0xCC7F)")
117
118 const SHORT CCHMAX_DOMAIN = 256;
119 const SHORT CCHMAX_PHONE_NUMBER = 128;
120
121 const DWORD DEFAULT_IMAP_PORT = 143;
122 const DWORD DEFAULT_POP3_PORT = 110;
123 const DWORD DEFAULT_SMTP_PORT = 25;
124 const DWORD DEFAULT_NNTP_PORT = 119;
125
126 typedef enum tagINETADDRTYPE
127 {
128     ADDR_TO,
129     ADDR_FROM,
130     ADDR_DSN_NEVER = 16,
131     ADDR_DSN_SUCCESS = 32,
132     ADDR_DSN_FAILURE = 64,
133     ADDR_DSN_DELAY = 128
134 } INETADDRTYPE;
135
136 const DWORD ADDR_TOFROM_MASK = 0x1;
137 const DWORD ADDR_DSN_MASK = 0xf0;
138
139 typedef enum tagDSNRET
140 {
141     DSNRET_DEFAULT,
142     DSNRET_HDRS,
143     DSNRET_FULL,
144 } DSNRET;
145
146 typedef struct tagINETADDR
147 {
148     INETADDRTYPE addrtype;
149     CHAR szEmail[CCHMAX_EMAIL_ADDRESS];
150 } INETADDR, *LPINETADDR;
151
152 typedef struct tagINETADDRLIST
153 {
154     ULONG cAddress;
155     LPINETADDR prgAddress;
156 } INETADDRLIST, *LPINETADDRLIST;
157
158 typedef enum tagRASCONNTYPE
159 {
160     RAS_CONNECT_LAN,
161     RAS_CONNECT_MANUAL,
162     RAS_CONNECT_RAS
163 } RASCONNTYPE;
164
165 typedef enum tagHTTPMAILPROPTYPE
166 {
167     HTTPMAIL_PROP_INVALID,
168     HTTPMAIL_PROP_ADBAR,
169     HTTPMAIL_PROP_CONTACTS,
170     HTTPMAIL_PROP_INBOX,
171     HTTPMAIL_PROP_OUTBOX,
172     HTTPMAIL_PROP_SENDMSG,
173     HTTPMAIL_PROP_SENTITEMS,
174     HTTPMAIL_PROP_DELETEDITEMS,
175     HTTPMAIL_PROP_DRAFTS,
176     HTTPMAIL_PROP_MSGFOLDERROOT,
177     HTTPMAIL_PROP_SIG,
178     HTTPMAIL_PROP_LAST
179 } HTTPMAILPROPTYPE;
180
181 typedef enum tagHTTPMAILSPECIALFOLDER
182 {
183     HTTPMAIL_SF_NONE,
184     HTTPMAIL_SF_UNRECOGNIZED,
185     HTTPMAIL_SF_INBOX,
186     HTTPMAIL_SF_DELETEDITEMS,
187     HTTPMAIL_SF_DRAFTS,
188     HTTPMAIL_SF_OUTBOX,
189     HTTPMAIL_SF_SENTITEMS,
190     HTTPMAIL_SF_CONTACTS,
191     HTTPMAIL_SF_CALENDAR,
192     HTTPMAIL_SF_MSNPROMO,
193     HTTPMAIL_SF_LAST
194 } HTTPMAILSPECIALFOLDER;
195
196 typedef enum tagHTTPMAILCONTACTTYPE
197 {
198     HTTPMAIL_CT_CONTACT,
199     HTTPMAIL_CT_GROUP,
200     HTTPMAIL_CT_LAST
201 } HTTPMAILCONTACTTYPE;
202
203 const DWORD DAVNAMESPACE_UNKNOWN = 0xFFFFFFFF;
204 const DWORD DAVNAMESPACE_DAV = 0;
205 const DWORD DAVNAMESPACE_HOTMAIL = 1;
206 const DWORD DAVNAMESPACE_HTTPMAIL = 2;
207 const DWORD DAVNAMESPACE_MAIL = 3;
208 const DWORD DAVNAMESPACE_CONTACTS = 4;
209
210 cpp_quote("#define ISF_SMTP_USEIPFORHELO        0x01")
211 cpp_quote("#define ISF_ALWAYSPROMPTFORPASSWORD  0x02")
212 /* for SMTP - send EHLO and use STARTTLS if available: */
213 cpp_quote("#define ISF_SSLONSAMEPORT            0x04")
214 cpp_quote("#define ISF_QUERYDSNSUPPORT          0x08")
215 /* for SMTP - send EHLO and use AUTH if available: */
216 cpp_quote("#define ISF_QUERYAUTHSUPPORT         0x10")
217
218 typedef struct INETSERVER
219 {
220     CHAR szAccount[CCHMAX_ACCOUNT_NAME];
221     CHAR szUserName[CCHMAX_USERNAME];
222     CHAR szPassword[CCHMAX_PASSWORD];
223     CHAR szServerName[CCHMAX_SERVER_NAME];
224     CHAR szConnectoid[CCHMAX_CONNECTOID];
225     RASCONNTYPE rasconntype;
226     DWORD dwPort;
227     BOOL fSSL;
228     BOOL fTrySicily;
229     DWORD dwTimeout;
230     DWORD dwFlags;
231 } INETSERVER, *LPINETSERVER;
232
233 typedef enum tagIXPTYPE
234 {
235     IXP_NNTP,
236     IXP_SMTP,
237     IXP_POP3,
238     IXP_IMAP,
239     IXP_RAS,
240     IXP_HTTPMail
241 } IXPTYPE;
242
243 typedef enum tagIXPSTATUS
244 {
245     IXP_FINDINGHOST,
246     IXP_CONNECTING,
247     IXP_SECURING,
248     IXP_CONNECTED,
249     IXP_AUTHORIZING,
250     IXP_AUTHRETRY,
251     IXP_AUTHORIZED,
252     IXP_DISCONNECTING,
253     IXP_DISCONNECTED,
254     IXP_LAST
255 } IXPSTATUS;
256
257 const DWORD DEPTH_INFINITY = 0xFFFFFFFE;
258
259 typedef DWORD MEMBERINFOFLAGS;
260
261 const MEMBERINFOFLAGS HTTP_MEMBERINFO_COMMONPROPS = 0x0;
262 const MEMBERINFOFLAGS HTTP_MEMBERINFO_FOLDERPROPS = 0x1;
263 const MEMBERINFOFLAGS HTTP_MEMBERINFO_MESSAGEPROPS = 0x2;
264 const MEMBERINFOFLAGS HTTP_MEMBERINFO_ALLPROPS = HTTP_MEMBERINFO_FOLDERPROPS | HTTP_MEMBERINFO_MESSAGEPROPS;
265
266 typedef DWORD IMAP_MSGFLAGS;
267
268 const IMAP_MSGFLAGS IMAP_MSG_NOFLAGS = 0x00;
269 const IMAP_MSGFLAGS IMAP_MSG_ANSWERED = 0x01;
270 const IMAP_MSGFLAGS IMAP_MSG_FLAGGED = 0x02;
271 const IMAP_MSGFLAGS IMAP_MSG_DELETED = 0x04;
272 const IMAP_MSGFLAGS IMAP_MSG_SEEN = 0x08;
273 const IMAP_MSGFLAGS IMAP_MSG_DRAFT = 0x10;
274 const IMAP_MSGFLAGS IMAP_MSG_ALLFLAGS = 0x1f;
275
276 [
277     object,
278     uuid(CA30F3FF-C9AC-11D1-9A3A-00C04FA309D4),
279     local
280 ]
281 interface ITransportCallbackService : IUnknown
282 {
283     HRESULT GetParentWindow(
284         [in]    DWORD dwReserved,
285         [out]   HWND *phwndParent);
286
287     HRESULT GetAccount(
288         [out]   LPDWORD pdwServerType,
289         [out]   IImnAccount **ppAccount);
290 }
291
292 [
293     object,
294     uuid(0DF2C7E1-3435-11D0-81D0-00C04FD85AB4),
295     local
296 ]
297 interface ITransportCallback : IUnknown
298 {
299     typedef struct tagIXPRESULT
300     {
301         HRESULT hrResult;
302         LPSTR pszResponse;
303         UINT uiServerError;
304         HRESULT hrServerError;
305         DWORD dwSocketError;
306         LPSTR pszProblem;
307     } IXPRESULT, *LPIXPRESULT;
308
309     typedef enum tagCMDTYPE
310     {
311         CMD_SEND,
312         CMD_RESP
313     } CMDTYPE;
314
315     HRESULT OnTimeout(
316         [in,out]    DWORD *pdwTimeout,
317         [in]        IInternetTransport *pTransport);
318
319     HRESULT OnLogonPrompt(
320         [in,out]    LPINETSERVER pInetServer,
321         [in]        IInternetTransport *pTransport);
322
323     INT OnPrompt(
324         [in]    HRESULT hrError,
325         [in]    LPCSTR pszText,
326         [in]    LPCSTR pszCaption,
327         [in]    UINT uType,
328         [in]    IInternetTransport *pTransport);
329
330     HRESULT OnStatus(
331         [in]    IXPSTATUS ixpstatus,
332         [in]    IInternetTransport *pTransport);
333
334     HRESULT OnError(
335         [in]    IXPSTATUS ixpstatus,
336         [in]    LPIXPRESULT pResult,
337         [in]    IInternetTransport *pTransport);
338
339     HRESULT OnCommand(
340         [in]    CMDTYPE cmdtype,
341         [in]    LPSTR pszLine,
342         [in]    HRESULT hrResponse,
343         [in]    IInternetTransport *pTransport);
344 }
345
346 [
347     object,
348     uuid(1F636C01-364E-11D0-81D3-00C04FD85AB4),
349     local
350 ]
351 interface IInternetTransport : IUnknown
352 {
353     const boolean iitAUTHENTICATE = TRUE;
354     const boolean iitDONT_AUTHENTICATe = FALSE;
355     const boolean iitENABLE_ONCOMMAND = TRUE;
356     const boolean iitDISABLE_ONCOMMAND = FALSE;
357
358     typedef enum tagIXPISSTATE
359     {
360         IXP_IS_CONNECTED,
361         IXP_IS_BUSY,
362         IXP_IS_READY,
363         IXP_IS_AUTHENTICATED
364     } IXPISSTATE;
365
366     HRESULT GetServerInfo(
367         [in,out]    LPINETSERVER pInetServer);
368
369     IXPTYPE GetIXPType();
370
371     HRESULT IsState(
372         [in]    IXPISSTATE isstate);
373
374     HRESULT InetServerFromAccount(
375         [in]        IImnAccount *pAccount,
376         [in,out]    LPINETSERVER pInetServer);
377
378     HRESULT Connect(
379         [in]    LPINETSERVER pInetServer,
380         [in]    boolean fAuthenticate,
381         [in]    boolean fCommandLogging);
382
383     HRESULT HandsOffCallback();
384
385     HRESULT Disconnect();
386
387     HRESULT DropConnection();
388
389     HRESULT GetStatus(
390         [out]   IXPSTATUS *pCurrentStatus);
391 }
392
393 [
394     object,
395     uuid(1F636C02-364E-11D0-81D3-00C04FD85AB4),
396     local
397 ]
398 interface ISMTPCallback : ITransportCallback
399 {
400     typedef enum tagSMTPCOMMAND
401     {
402         SMTP_NONE,
403         SMTP_BANNER,
404         SMTP_CONNECTED,
405         SMTP_SEND_MESSAGE,
406         SMTP_AUTH,
407         SMTP_EHLO,
408         SMTP_HELO,
409         SMTP_MAIL,
410         SMTP_RCPT,
411         SMTP_RSET,
412         SMTP_QUIT,
413         SMTP_DATA,
414         SMTP_DOT,
415         SMTP_SEND_STREAM,
416         SMTP_CUSTOM
417     } SMTPCOMMAND;
418
419     typedef struct tagSMTPSTREAM
420     {
421         DWORD cbIncrement;
422         DWORD cbCurrent;
423         DWORD cbTotal;
424     } SMTPSTREAM, *LPSMTPSTREAM;
425
426     typedef struct tagSMTPRESPONSE
427     {
428         SMTPCOMMAND command;
429         BOOL fDone;
430         IXPRESULT rIxpResult;
431         ISMTPTransport *pTransport;
432
433         [switch_type(SMTPCOMMAND), switch_is(command)]
434         union
435         {
436         [case(SMTP_SEND_STREAM)]    SMTPSTREAM rStreamInfo;
437         [default];
438         } DUMMYUNIONNAME;
439     } SMTPRESPONSE, *LPSMTPRESPONSE;
440
441     HRESULT OnResponse(
442         [in] LPSMTPRESPONSE pResponse);
443 }
444
445 [
446     object,
447     uuid(0DF2C7E2-3435-11D0-81D0-00C04FD85AB4),
448     local
449 ]
450 interface ISMTPTransport : IInternetTransport
451 {
452     typedef struct tagSMTPMESSAGE
453     {
454         ULONG cbSize;
455         LPSTREAM pstmMsg;
456         INETADDRLIST rAddressList;
457     } SMTPMESSAGE, *LPSMTPMESSAGE;
458
459     HRESULT InitNew(
460         [in]    LPSTR pszLogFilePath,
461         [in]    ISMTPCallback *pCallback);
462
463 cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
464 cpp_quote("#undef SendMessage")
465 cpp_quote("#endif")
466
467     HRESULT SendMessage(
468         [in]    LPSMTPMESSAGE pMessage);
469
470     HRESULT CommandMAIL(
471         [in]    LPSTR pszEmailFrom);
472
473     HRESULT CommandRCPT(
474         [in]    LPSTR pszEmailTo);
475
476     HRESULT CommandEHLO();
477
478     HRESULT CommandHELO();
479
480     HRESULT CommandAUTH(
481         [in]    LPSTR pszAuthType);
482
483     HRESULT CommandQUIT();
484
485     HRESULT CommandRSET();
486
487     HRESULT CommandDATA();
488
489     HRESULT CommandDOT();
490
491     HRESULT SendDataStream(
492         [in]    IStream *pStream,
493         [in]    ULONG cbSize);
494 }
495
496 [
497     object,
498     uuid(0DF2C7EC-3435-11D0-81D0-00C04FD85AB4),
499     local
500 ]
501 interface ISMTPTransport2 : ISMTPTransport
502 {
503     typedef struct tagSMTPMESSAGE2
504     {
505         SMTPMESSAGE smtpMsg;
506         LPSTR pszDSNENVID;
507         DSNRET dsnRet;
508         DWORD dwReserved;
509         DWORD dwReserved2;
510     } SMTPMESSAGE2, *LPSMTPMESSAGE2;
511
512     HRESULT SetWindow();
513
514     HRESULT ResetWindow();
515
516     HRESULT SendMessage2(
517         [in]    LPSMTPMESSAGE2 pMessage);
518
519     HRESULT CommandRCPT2(
520         [in]    LPSTR pszEmailTo,
521         [in]    INETADDRTYPE atDSN);
522 }
523
524 /* FIXME: IDAVNamespaceArbiter, IPropPatchRequest, IPropFindRequest, IPropFindMultiResponse, IPropFindResponse, IHTTPMailCallback, IHTTPMailTransport */
525
526 [
527     object,
528     uuid(0DF2C7E3-3435-11D0-81D0-00C04FD85AB4),
529     local
530 ]
531 interface IPOP3Callback : ITransportCallback
532 {
533     typedef enum tagPOP3COMMAND
534     {
535         POP3_NONE,
536         POP3_BANNER,
537         POP3_CONNECTED,
538         POP3_USER,
539         POP3_PASS,
540         POP3_AUTH,
541         POP3_UIDL,
542         POP3_STAT,
543         POP3_LIST,
544         POP3_DELE,
545         POP3_RETR,
546         POP3_TOP,
547         POP3_NOOP,
548         POP3_QUIT,
549         POP3_RSET,
550         POP3_CUSTOM
551     } POP3COMMAND;
552
553     typedef struct tagPOP3RETR
554     {
555         BOOL fHeader;
556         BOOL fBody;
557         DWORD dwPopId;
558         DWORD cbSoFar;
559         LPSTR pszLines;
560         ULONG cbLines;
561     } POP3RETR, *LPPOP3RETR;
562
563     typedef struct tagPOP3TOP
564     {
565         BOOL fHeader;
566         BOOL fBody;
567         DWORD dwPopId;
568         DWORD cPreviewLines;
569         DWORD cbSoFar;
570         LPSTR pszLines;
571         ULONG cbLines;
572     } POP3TOP, *LPPOP3TOP;
573
574     typedef struct tagPOP3LIST
575     {
576         DWORD dwPopId;
577         DWORD cbSize;
578     } POP3LIST, *LPPOP3LIST;
579
580     typedef struct tagPOP3UIDL
581     {
582         DWORD dwPopId;
583         LPSTR pszUidl;
584     } POP3UIDL, *LPPOP3UIDL;
585
586     typedef struct tagPOP3STAT
587     {
588         DWORD cMessages;
589         DWORD cbMessages;
590     } POP3STAT, *LPPOP3STAT;
591
592     typedef struct tagPOP3RESPONSE
593     {
594         POP3COMMAND command;
595         BOOL fDone;
596         IXPRESULT rIxpResult;
597         IPOP3Transport *pTransport;
598         BOOL fValidInfo;
599         [switch_type(POP3COMMAND), switch_is(command)]
600         union
601         {
602         [case(POP3_UIDL)] POP3UIDL rUidlInfo;
603         [case(POP3_STAT)] POP3STAT rStatInfo;
604         [case(POP3_LIST)] POP3LIST rListInfo;
605         [case(POP3_DELE)] DWORD dwPopId;
606         [case(POP3_RETR)] POP3RETR rRetrInfo;
607         [case(POP3_TOP)]  POP3TOP rTopInfo;
608         [default];
609         } DUMMYUNIONNAME;
610     } POP3RESPONSE, *LPPOP3RESPONSE;
611
612     HRESULT OnResponse(
613         [in]    LPPOP3RESPONSE pResponse);
614 }
615
616 [
617     object,
618     uuid(0DF2C7E4-3435-11D0-81D0-00C04FD85AB4),
619     local
620 ]
621 interface IPOP3Transport : IInternetTransport
622 {
623     typedef enum tagPOP3CMDTYPE
624     {
625         POP3CMD_GET_POPID,
626         POP3CMD_GET_MARKED,
627         POP3CMD_GET_ALL
628     } POP3CMDTYPE;
629
630     typedef enum tagPOP3MARKTYPE
631     {
632         POP3_MARK_FOR_TOP = 0x01,
633         POP3_MARK_FOR_RETR = 0x02,
634         POP3_MARK_FOR_DELE = 0x04,
635         POP3_MARK_FOR_UIDL = 0x08,
636         POP3_MARK_FOR_LIST = 0x10
637     } POP3MARKTYPE;
638
639     HRESULT InitNew(
640         [in]    LPSTR pszLogFilePath,
641         [in]    IPOP3Callback *pCallback);
642
643     HRESULT MarkItem(
644         [in]    POP3MARKTYPE marktype,
645         [in]    DWORD dwPopId,
646         [in]    boolean fMarked);
647
648     HRESULT CommandAUTH(
649         [in]    LPSTR pszAuthType);
650
651     HRESULT CommandUSER(
652         [in]    LPSTR pszUserName);
653
654     HRESULT CommandPASS(
655         [in]    LPSTR pszPassword);
656
657     HRESULT CommandLIST(
658         [in]    POP3CMDTYPE cmdtype,
659         [in]    DWORD dwPopId);
660
661     HRESULT CommandTOP(
662         [in]    POP3CMDTYPE cmdtype,
663         [in]    DWORD dwPopId,
664         [in]    DWORD cPreviewLines);
665
666     HRESULT CommandQUIT();
667
668     HRESULT CommandSTAT();
669
670     HRESULT CommandNOOP();
671
672     HRESULT CommandRSET();
673
674     HRESULT CommandUIDL(
675         [in]    POP3CMDTYPE cmdtype,
676         [in]    DWORD dwPopId);
677
678     HRESULT CommandDELE(
679         [in]    POP3CMDTYPE cmdtype,
680         [in]    DWORD dwPopId);
681
682     HRESULT CommandRETR(
683         [in]    POP3CMDTYPE cmdtype,
684         [in]    DWORD dwPopId);
685 }
686
687 /* FIXME: INNTPCallback, INNTPTransport */
688
689 [
690     object,
691     uuid(8C438160-4EF6-11d0-874F-00AA00530EE9),
692     local,
693 ]
694 interface IRangeList : IUnknown
695 {
696     const ULONG RL_RANGE_ERROR = ((ULONG)-1);
697     const ULONG RL_LAST_MESSAGE = ((ULONG)-1);
698
699     HRESULT Clear();
700
701     HRESULT IsInRange(
702         [in]    const ULONG value);
703
704     HRESULT Min(
705         [out]   ULONG *pulMin);
706
707     HRESULT Max(
708         [out]   ULONG *pulMax);
709
710     HRESULT Save(
711         [out]   byte **ppbDestination,
712         [out]   ULONG *pulSizeOfDestination);
713
714     HRESULT Load(
715         [in, size_is(ulSizeOfSource)]   byte *pbSource,
716         [in]    const ULONG ulSizeOfSource);
717
718     HRESULT AddRange(
719         [in]    const ULONG low,
720         [in]    const ULONG high);
721
722     HRESULT AddSingleValue(
723         [in]    const ULONG value);
724
725     HRESULT AddRangeList(
726         [in]    const IRangeList *prl);
727
728     HRESULT DeleteRange(
729         [in]    const ULONG low,
730         [in]    const ULONG high);
731
732     HRESULT DeleteSingleValue(
733         [in]    const ULONG value);
734
735     HRESULT DeleteRangeList(
736         [in]    const IRangeList *prl);
737
738     HRESULT MinOfRange(
739         [in]    const ULONG value,
740         [out]   ULONG *pulMinOfRange);
741
742     HRESULT MaxOfRange(
743         [in]    const ULONG value,
744         [out]   ULONG *pulMaxOfRange);
745
746     HRESULT RangeToIMAPString(
747         [out]   LPSTR *ppszDestination,
748         [out]   LPDWORD pdwLengthOfDestination);
749
750     HRESULT Next(
751         [in]    const ULONG current,
752         [out]   ULONG *pulNext);
753
754     HRESULT Prev(
755         [in]    const ULONG current,
756         [out]   ULONG *pulPrev);
757
758     HRESULT Cardinality(
759         [out]   ULONG *pulCardinality);
760
761     HRESULT CardinalityFrom(
762         [in]    const ULONG ulStartPoint,
763         [out]   ULONG *pulCardinalityFrom);
764 }
765
766 [
767     object,
768     uuid(E9E9D8A3-4EDD-11d0-874F-00AA00530EE9),
769     local
770 ]
771 interface IIMAPCallback : ITransportCallback
772 {
773     typedef DWORD IMAP_MBOXFLAGS;
774     const IMAP_MBOXFLAGS IMAP_MBOX_NOFLAGS = 0x0;
775     const IMAP_MBOXFLAGS IMAP_MBOX_MARKED = 0x1;
776     const IMAP_MBOXFLAGS IMAP_MBOX_NOINFERIORS = 0x2;
777     const IMAP_MBOXFLAGS IMAP_MBOX_NOSELECT = 0x4;
778     const IMAP_MBOXFLAGS IMAP_MBOX_UNMARKED = 0x8;
779     const IMAP_MBOXFLAGS IMAP_MBOX_ALLFLAGS = 0xf;
780
781     typedef enum tagIMAP_RESPONSE_TYPE
782     {
783         irtERROR_NOTIFICATION,
784         irtCOMMAND_COMPLETION,
785         irtSERVER_ALERT,
786         irtPARSE_ERROR,
787         irtMAILBOX_UPDATE,
788         irtDELETED_MSG,
789         irtFETCH_BODY,
790         irtUPDATE_MSG,
791         irtAPPLICABLE_FLAGS,
792         irtPERMANENT_FLAGS,
793         irtUIDVALIDITY,
794         irtREADWRITE_STATUS,
795         irtTRYCREATE,
796         irtSEARCH,
797         irtMAILBOX_LISTING,
798         irtMAILBOX_STATUS,
799         irtAPPEND_PROGRESS,
800         irtUPDATE_MSG_EX
801     } IMAP_RESPONSE_TYPE;
802
803     typedef struct tagFETCH_BODY_PART
804     {
805         DWORD dwMsgSeqNum;
806         LPSTR pszBodyTag;
807         DWORD dwTotalBytes;
808         DWORD dwSizeOfData;
809         DWORD dwOffset;
810         BOOL fDone;
811         LPSTR pszData;
812         LPARAM lpFetchCookie1;
813         LPARAM lpFetchCookie2;
814     } FETCH_BODY_PART;
815
816     typedef struct tagFETCH_CMD_RESULTS
817     {
818         DWORD dwMsgSeqNum;
819         BOOL bMsgFlags;
820         IMAP_MSGFLAGS mfMsgFlags;
821         BOOL bRFC822Size;
822         DWORD dwRFC822Size;
823         BOOL bUID;
824         DWORD dwUID;
825         BOOL bInternalDate;
826         FILETIME ftInternalDate;
827         LPARAM lpFetchCookie1;
828         LPARAM lpFetchCookie2;
829     } FETCH_CMD_RESULTS;
830
831     typedef struct tagIMAPADDR
832     {
833         LPSTR pszName;
834         LPSTR pszADL;
835         LPSTR pszMailbox;
836         LPSTR pszHost;
837         struct tagIMAPADDR *pNext;
838     } IMAPADDR;
839
840     typedef struct tagFETCH_CMD_RESULTS_EX
841     {
842         DWORD dwMsgSeqNum;
843         BOOL bMsgFlags;
844         IMAP_MSGFLAGS mfMsgFlags;
845         BOOL bRFC822Size;
846         DWORD dwRFC822Size;
847         BOOL bUID;
848         DWORD dwUID;
849         BOOL bInternalDate;
850         FILETIME ftInternalDate;
851         LPARAM lpFetchCookie1;
852         LPARAM lpFetchCookie2;
853         BOOL bEnvelope;
854         FILETIME ftENVDate;
855         LPSTR pszENVSubject;
856         IMAPADDR *piaENVFrom;
857         IMAPADDR *piaENVSender;
858         IMAPADDR *piaENVReplyTo;
859         IMAPADDR *piaENVTo;
860         IMAPADDR *piaENVCc;
861         IMAPADDR *piaENVBcc;
862         LPSTR pszENVInReplyTo;
863         LPSTR pszENVMessageID;
864         DWORD dwReserved1;
865         DWORD dwReserved2;
866         DWORD dwReserved3;
867     } FETCH_CMD_RESULTS_EX;
868
869     typedef struct tagMBOX_MSGCOUNT
870     {
871         BOOL bGotExistsResponse;
872         DWORD dwExists;
873         BOOL bGotRecentResponse;
874         DWORD dwRecent;
875         BOOL bGotUnseenResponse;
876         DWORD dwUnseen;
877     } MBOX_MSGCOUNT;
878
879     typedef struct tagIMAP_LISTLSUB_RESPONSE
880     {
881         LPSTR pszMailboxName;
882         IMAP_MBOXFLAGS imfMboxFlags;
883         char cHierarchyChar;
884     } IMAP_LISTLSUB_RESPONSE;
885
886     typedef struct tagIMAP_STATUS_RESPONSE
887     {
888         LPSTR pszMailboxName;
889         BOOL fMessages;
890         DWORD dwMessages;
891         BOOL fRecent;
892         DWORD dwRecent;
893         BOOL fUIDNext;
894         DWORD dwUIDNext;
895         BOOL fUIDValidity;
896         DWORD dwUIDValidity;
897         BOOL fUnseen;
898         DWORD dwUnseen;
899     } IMAP_STATUS_RESPONSE;
900
901     typedef struct tagAPPEND_PROGRESS
902     {
903         DWORD dwUploaded;
904         DWORD dwTotal;
905     } APPEND_PROGRESS;
906
907     typedef [switch_type(IMAP_RESPONSE_TYPE)] union tagIMAP_RESPONSE_DATA
908     {
909         [case (irtMAILBOX_UPDATE)] MBOX_MSGCOUNT *pmcMsgCount;
910         [case (irtDELETED_MSG)] DWORD dwDeletedMsgSeqNum;
911         [case (irtFETCH_BODY)] FETCH_BODY_PART *pFetchBodyPart;
912         [case (irtUPDATE_MSG)] FETCH_CMD_RESULTS *pFetchResults;
913         [case (irtAPPLICABLE_FLAGS, irtPERMANENT_FLAGS)] IMAP_MSGFLAGS imfImapMessageFlags;
914         [case (irtUIDVALIDITY)] DWORD dwUIDValidity;
915         [case (irtREADWRITE_STATUS)] BOOL bReadWrite;
916         [case (irtSEARCH)] IRangeList *prlSearchResults;
917         [case (irtMAILBOX_LISTING)] IMAP_LISTLSUB_RESPONSE illrdMailboxListing;
918         [case (irtMAILBOX_STATUS)] IMAP_STATUS_RESPONSE *pisrStatusResponse;
919         [case (irtAPPEND_PROGRESS)] APPEND_PROGRESS *papAppendProgress;
920         [case (irtUPDATE_MSG_EX)] FETCH_CMD_RESULTS_EX *pFetchResultsEx;
921     } IMAP_RESPONSE_DATA;
922
923     typedef struct tagIMAP_RESPONSE
924     {
925         WPARAM wParam;
926         LPARAM lParam;
927         HRESULT hrResult;
928         LPSTR lpszResponseText;
929         IMAP_RESPONSE_TYPE irtResponseType;
930         [switch_is(irtResponseType)] IMAP_RESPONSE_DATA irdResponseData;
931     } IMAP_RESPONSE;
932
933     HRESULT OnResponse([in] const IMAP_RESPONSE *pirIMAPResponse);
934 }
935
936 [
937 object,
938 uuid(E9E9D8A8-4EDD-11d0-874F-00AA00530EE9),
939 local,
940 ]
941 interface IIMAPTransport : IInternetTransport
942 {
943     const DWORD IMAP_CAPABILITY_IMAP4 = 0x1;
944     const DWORD IMAP_CAPABILITY_IMAP4rev1 = 0x2;
945     const DWORD IMAP_CAPABILITY_IDLE = 0x4;
946     const DWORD IMAP_CAPABILITY_ALLFLAGS = 0x7;
947
948     HRESULT InitNew(
949         [in]    LPSTR pszLogFilePath,
950         [in]    IIMAPCallback *pCBHandler);
951
952     HRESULT NewIRangeList(
953         [out]   IRangeList **pprlNewRangeList);
954
955     HRESULT Capability(
956         [out]   DWORD *pdwCapabilityFlags);
957
958     HRESULT Select(
959         [in]    WPARAM wParam,
960         [in]    LPARAM lParam,
961         [in]    IIMAPCallback *pCBHandler,
962         [in]    LPSTR lpszMailboxName);
963
964     HRESULT Examine(
965         [in]    WPARAM wParam,
966         [in]    LPARAM lParam,
967         [in]    IIMAPCallback *pCBHandler,
968         [in]    LPSTR lpszMailboxName);
969
970     HRESULT Create(
971         [in]    WPARAM wParam,
972         [in]    LPARAM lParam,
973         [in]    IIMAPCallback *pCBHandler,
974         [in]    LPSTR lpszMailboxName);
975
976     HRESULT Delete(
977         [in]    WPARAM wParam,
978         [in]    LPARAM lParam,
979         [in]    IIMAPCallback *pCBHandler,
980         [in]    LPSTR lpszMailboxName);
981
982     HRESULT Rename(
983         [in]    WPARAM wParam,
984         [in]    LPARAM lParam,
985         [in]    IIMAPCallback *pCBHandler,
986         [in]    LPSTR lpszMailboxName,
987         [in]    LPSTR lpszNewMailboxName);
988
989     HRESULT Subscribe(
990         [in]    WPARAM wParam,
991         [in]    LPARAM lParam,
992         [in]    IIMAPCallback *pCBHandler,
993         [in]    LPSTR lpszMailboxName);
994
995     HRESULT Unsubscribe(
996         [in]    WPARAM wParam,
997         [in]    LPARAM lParam,
998         [in]    IIMAPCallback *pCBHandler,
999         [in]    LPSTR lpszMailboxName);
1000
1001     HRESULT List(
1002         [in]    WPARAM wParam,
1003         [in]    LPARAM lParam,
1004         [in]    IIMAPCallback *pCBHandler,
1005         [in]    LPSTR lpszMailboxNameReference,
1006         [in]    LPSTR lpszMailboxNamePattern);
1007
1008     HRESULT Lsub(
1009         [in]    WPARAM wParam,
1010         [in]    LPARAM lParam,
1011         [in]    IIMAPCallback *pCBHandler,
1012         [in]    LPSTR lpszMailboxNameReference,
1013         [in]    LPSTR lpszMailboxNamePattern);
1014
1015     HRESULT Append(
1016         [in]    WPARAM wParam,
1017         [in]    LPARAM lParam,
1018         [in]    IIMAPCallback *pCBHandler,
1019         [in]    LPSTR lpszMailboxName,
1020         [in]    LPSTR lpszMessageFlags,
1021         [in]    FILETIME ftMessageDateTime,
1022         [in]    LPSTREAM lpstmMessageToSave);
1023
1024     HRESULT Close(
1025         [in]    WPARAM wParam,
1026         [in]    LPARAM lParam,
1027         [in]    IIMAPCallback *pCBHandler);
1028
1029     HRESULT Expunge(
1030         [in]    WPARAM wParam,
1031         [in]    LPARAM lParam,
1032         [in]    IIMAPCallback *pCBHandler);
1033
1034     HRESULT Search(
1035         [in]    WPARAM wParam,
1036         [in]    LPARAM lParam,
1037         [in]    IIMAPCallback *pCBHandler,
1038         [in]    LPSTR lpszSearchCriteria,
1039         [in]    boolean bReturnUIDs,
1040         [in]    IRangeList *pMsgRange,
1041         [in]    boolean bUIDRangeList);
1042
1043     HRESULT Fetch(
1044         [in]    WPARAM wParam,
1045         [in]    LPARAM lParam,
1046         [in]    IIMAPCallback *pCBHandler,
1047         [in]    IRangeList *pMsgRange,
1048         [in]    boolean bUIDMsgRange,
1049         [in]    LPSTR lpszFetchArgs);
1050
1051     HRESULT Store(
1052         [in]    WPARAM wParam,
1053         [in]    LPARAM lParam,
1054         [in]    IIMAPCallback *pCBHandler,
1055         [in]    IRangeList *pMsgRange,
1056         [in]    boolean bUIDRangeList,
1057         [in]    LPSTR lpszStoreArgs);
1058
1059     HRESULT Copy(
1060         [in]    WPARAM wParam,
1061         [in]    LPARAM lParam,
1062         [in]    IIMAPCallback *pCBHandler,
1063         [in]    IRangeList *pMsgRange,
1064         [in]    boolean bUIDRangeList,
1065         [in]    LPSTR lpszMailboxName);
1066
1067     HRESULT Noop(
1068         [in]    WPARAM wParam,
1069         [in]    LPARAM lParam,
1070         [in]    IIMAPCallback *pCBHandler);
1071
1072     HRESULT ResizeMsgSeqNumTable(
1073         [in]    DWORD dwSizeOfMbox);
1074
1075     HRESULT UpdateSeqNumToUID(
1076         [in]    DWORD dwMsgSeqNum,
1077         [in]    DWORD dwUID);
1078
1079     HRESULT RemoveSequenceNum(
1080         [in]    DWORD dwDeletedMsgSeqNum);
1081
1082     HRESULT MsgSeqNumToUID(
1083         [in]    DWORD dwMsgSeqNum,
1084         [out]   DWORD *pdwUID);
1085
1086     HRESULT GetMsgSeqNumToUIDArray(
1087         [out]   DWORD **ppdwMsgSeqNumToUIDArray,
1088         [out]   DWORD *pdwNumberOfElements);
1089
1090     HRESULT GetHighestMsgSeqNum(
1091         [out]   DWORD *pdwHighestMSN);
1092
1093     HRESULT ResetMsgSeqNumToUID();
1094
1095     HRESULT SetDefaultCBHandler(
1096         [in]    IIMAPCallback *pCBHandler);
1097
1098     HRESULT Status(
1099         [in]    WPARAM wParam,
1100         [in]    LPARAM lParam,
1101         [in]    IIMAPCallback *pCBHandler,
1102         [in]    LPSTR pszMailboxName,
1103         [in]    LPSTR pszStatusCmdArgs);
1104 }
1105
1106 #if 0
1107 cpp_quote("HRESULT WINAPI CreateRASTransport(IRASTransport **ppTransport);")
1108 cpp_quote("HRESULT WINAPI CreateNNTPTransport(INNTPTransport **ppTransport);")
1109 cpp_quote("HRESULT WINAPI CreateIMAPTransport2(IIMAPTransport2 **ppTransport);")
1110 #endif
1111 cpp_quote("HRESULT WINAPI CreateRangeList(IRangeList **ppRangeList);")
1112 cpp_quote("HRESULT WINAPI CreateSMTPTransport(ISMTPTransport **ppTransport);")
1113 cpp_quote("HRESULT WINAPI CreatePOP3Transport(IPOP3Transport **ppTransport);")
1114 cpp_quote("HRESULT WINAPI CreateIMAPTransport(IIMAPTransport **ppTransport);")