/*
 * Copyright 2006 Robert Shearman for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "imnact.idl";

interface IInternetTransport;
interface ISMTPTransport;
interface IPOP3Transport;

/* CLSIDs */

cpp_quote("DEFINE_GUID(CLSID_IInternetMessageUrl, 0xca30cc91, 0xb1b3, 0x11d0, 0x85, 0xd0, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("DEFINE_GUID(CLSID_ISMTPTransport, 0xfd853ce6, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("DEFINE_GUID(CLSID_IPOP3Transport, 0xfd853ce7, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("DEFINE_GUID(CLSID_INNTPTransport, 0xfd853ce8, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("DEFINE_GUID(CLSID_IRASTransport, 0xfd853ce9, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("DEFINE_GUID(CLSID_IRangeList, 0xfd853cea, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("DEFINE_GUID(CLSID_IIMAPTransport, 0xfd853ceb, 0x7f86, 0x11d0, 0x82, 0x52, 0x00, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("DEFINE_GUID(CLSID_IHTTPMailTransport, 0x5a580c11, 0xe5eb, 0x11d1, 0xa8, 0x6e, 0x00, 0x00, 0xf8, 0x08, 0x4f, 0x96);")
cpp_quote("DEFINE_GUID(CLSID_IPropFindRequest, 0xbb847b8a, 0x054a, 0x11d2, 0xa8, 0x94, 0x00, 0x00, 0xf8, 0x08, 0x4f, 0x96);")
cpp_quote("DEFINE_GUID(CLSID_IPropPatchRequest, 0xea678830, 0x235d, 0x11d2, 0xa8, 0xb6, 0x00, 0x00, 0xf8, 0x08, 0x4f, 0x96);")

/* Error Codes */

cpp_quote("#ifndef HR_E")
cpp_quote("#define HR_E(n) MAKE_SCODE(SEVERITY_ERROR, FACILITY_INTERNET, n)")
cpp_quote("#endif")
cpp_quote("#ifndef HR_S")
cpp_quote("#define HR_S(n) MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_INTERNET, n)")
cpp_quote("#endif")

/* General Error Codes */
cpp_quote("#define IXP_E_LOAD_SICILY_FAILED     HR_E(0xCC00)")
cpp_quote("#define IXP_E_INVALID_CERT_CN        HR_E(0xCC01)")
cpp_quote("#define IXP_E_INVALID_CERT_DATE      HR_E(0xCC02)")
cpp_quote("#define IXP_E_ALREADY_CONNECTED      HR_E(0xCC03)")
cpp_quote("#define IXP_E_CONN                   HR_E(0xCC04)")
cpp_quote("#define IXP_E_NOT_CONNECTED          HR_E(0xCC05)")
cpp_quote("#define IXP_E_CONN_SEND              HR_E(0xCC06)")
cpp_quote("#define IXP_E_WOULD_BLOCK            HR_E(0xCC07)")
cpp_quote("#define IXP_E_INVALID_STATE          HR_E(0xCC08)")
cpp_quote("#define IXP_E_CONN_RECV              HR_E(0xCC09)")
cpp_quote("#define IXP_E_INCOMPLETE             HR_E(0xCC0A)")
cpp_quote("#define IXP_E_BUSY                   HR_E(0xCC0B)")
cpp_quote("#define IXP_E_NOT_INIT               HR_E(0xCC0C)")
cpp_quote("#define IXP_E_CANT_FIND_HOST         HR_E(0xCC0D)")
cpp_quote("#define IXP_E_FAILED_TO_CONNECT      HR_E(0xCC0E)")
cpp_quote("#define IXP_E_CONNECTION_DROPPED     HR_E(0xCC0F)")
cpp_quote("#define IXP_E_INVALID_ADDRESS        HR_E(0xCC10)")
cpp_quote("#define IXP_E_INVALID_ADDRESS_LIST   HR_E(0xCC11)")
cpp_quote("#define IXP_E_SOCKET_READ_ERROR      HR_E(0xCC12)")
cpp_quote("#define IXP_E_SOCKET_WRITE_ERROR     HR_E(0xCC13)")
cpp_quote("#define IXP_E_SCOKET_INIT_ERROR      HR_E(0xCC14)")
cpp_quote("#define IXP_E_SOCKET_CONNECT_ERROR   HR_E(0xCC15)")
cpp_quote("#define IXP_E_INVALID_ACCOUNT        HR_E(0xCC16)")
cpp_quote("#define IXP_E_USER_CANCEL            HR_E(0xCC17)")
cpp_quote("#define IXP_E_SICILY_LOGON_FAILED    HR_E(0xCC18)")
cpp_quote("#define IXP_E_TIMEOUT                HR_E(0xCC19)")
cpp_quote("#define IXP_E_SECURE_CONNECT_FAILED  HR_E(0xCC1A)")

/* SMTP Failure Statuses */
cpp_quote("#define IXP_E_SMTP_RESPONSE_ERROR            HR_E(0xCC60)")
cpp_quote("#define IXP_E_SMTP_UNKNOWN_RESPONSE_CODE     HR_E(0xCC61)")
cpp_quote("#define IXP_E_SMTP_500_SYNTAX_ERROR          HR_E(0xCC62)")
cpp_quote("#define IXP_E_SMTP_501_PARAM_SYNTAX          HR_E(0xCC63)")
cpp_quote("#define IXP_E_SMTP_502_COMMAND_NOTIMPL       HR_E(0xCC64)")
cpp_quote("#define IXP_E_SMTP_503_COMMAND_SEQ           HR_E(0xCC65)")
cpp_quote("#define IXP_E_SMTP_504_COMMAND_PARAM_NOTIMPL HR_E(0xCC66)")
cpp_quote("#define IXP_E_SMTP_421_NOT_AVAILABLE         HR_E(0xCC67)")
cpp_quote("#define IXP_E_SMTP_450_MAILBOX_BUSY          HR_E(0xCC68)")
cpp_quote("#define IXP_E_SMTP_550_MAILBOX_NOT_FOUND     HR_E(0xCC69)")
cpp_quote("#define IXP_E_SMTP_451_ERROR_PROCESSING      HR_E(0xCC6A)")
cpp_quote("#define IXP_E_SMTP_551_USER_NOT_LOCAL        HR_E(0xCC6B)")
cpp_quote("#define IXP_E_SMTP_452_NO_SYSTEM_STORAGE     HR_E(0xCC6C)")
cpp_quote("#define IXP_E_SMTP_552_STORAGE_OVERFLOW      HR_E(0xCC6D)")
cpp_quote("#define IXP_E_SMTP_553_MAILBOX_NAME_SYNTAX   HR_E(0xCC6E)")
cpp_quote("#define IXP_E_SMTP_554_TRANSACT_FAILED       HR_E(0xCC6F)")

/* SMTP Success Statuses */
cpp_quote("#define IXP_E_SMTP_211_SYSTEM_STATUS         HR_S(0xCC70)")
cpp_quote("#define IXP_E_SMTP_214_HELP_MESSAGE          HR_S(0xCC71)")
cpp_quote("#define IXP_E_SMTP_220_READY                 HR_S(0xCC72)")
cpp_quote("#define IXP_E_SMTP_221_CLOSING               HR_S(0xCC73)")
cpp_quote("#define IXP_E_SMTP_250_MAIL_ACTION_OKAY      HR_S(0xCC74)")
cpp_quote("#define IXP_E_SMTP_251_FORWARDING_MAIL       HR_S(0xCC75)")
cpp_quote("#define IXP_E_SMTP_354_START_MAIL_INPUT      HR_S(0xCC76)")
cpp_quote("#define IXP_E_SMTP_CONTINUE                  HR_S(0xCC77)")
cpp_quote("#define IXP_E_SMTP_334_AUTH_READY_RESPONSE   HR_S(0xCC78)")
cpp_quote("#define IXP_E_SMTP_245_AUTH_SUCCESS          HR_S(0xCC79)")

/* More SMTP Failure Statuses */
cpp_quote("#define IXP_E_SMTP_REJECTED_SENDER           HR_E(0xCC78)")
cpp_quote("#define IXP_E_SMTP_REJECTED_RECIPIENTS       HR_E(0xCC79)")
cpp_quote("#define IXP_E_SMTP_NO_SENDER                 HR_E(0xCC7A)")
cpp_quote("#define IXP_E_SMTP_NO_RECIPIENTS             HR_E(0xCC7B)")
cpp_quote("#define IXP_E_SMTP_530_STARTTLS_REQUIRED     HR_E(0xCC7C)")
cpp_quote("#define IXP_E_SMTP_NO_STARTTLS_SUPPORT       HR_E(0xCC7D)")
cpp_quote("#define IXP_E_SMTP_NO_DSN_SUPPORT            HR_E(0xCC7E)")
cpp_quote("#define IXP_E_SMTP_454_STARTTLS_FAILED       HR_E(0xCC7F)")

const SHORT CCHMAX_DOMAIN = 256;
const SHORT CCHMAX_PHONE_NUMBER = 128;

const DWORD DEFAULT_IMAP_PORT = 143;
const DWORD DEFAULT_POP3_PORT = 110;
const DWORD DEFAULT_SMTP_PORT = 25;
const DWORD DEFAULT_NNTP_PORT = 119;

typedef enum tagINETADDRTYPE
{
    ADDR_TO,
    ADDR_FROM,
    ADDR_DSN_NEVER = 16,
    ADDR_DSN_SUCCESS = 32,
    ADDR_DSN_FAILURE = 64,
    ADDR_DSN_DELAY = 128
} INETADDRTYPE;

const DWORD ADDR_TOFROM_MASK = 0x1;
const DWORD ADDR_DSN_MASK = 0xf0;

typedef enum tagDSNRET
{
    DSNRET_DEFAULT,
    DSNRET_HDRS,
    DSNRET_FULL,
} DSNRET;

typedef struct tagINETADDR
{
    INETADDRTYPE addrtype;
    CHAR szEmail[CCHMAX_EMAIL_ADDRESS];
} INETADDR, *LPINETADDR;

typedef struct tagINETADDRLIST
{
    ULONG cAddress;
    LPINETADDR prgAddress;
} INETADDRLIST, *LPINETADDRLIST;

typedef enum tagRASCONNTYPE
{
    RAS_CONNECT_LAN,
    RAS_CONNECT_MANUAL,
    RAS_CONNECT_RAS
} RASCONNTYPE;

typedef enum tagHTTPMAILPROPTYPE
{
    HTTPMAIL_PROP_INVALID,
    HTTPMAIL_PROP_ADBAR,
    HTTPMAIL_PROP_CONTACTS,
    HTTPMAIL_PROP_INBOX,
    HTTPMAIL_PROP_OUTBOX,
    HTTPMAIL_PROP_SENDMSG,
    HTTPMAIL_PROP_SENTITEMS,
    HTTPMAIL_PROP_DELETEDITEMS,
    HTTPMAIL_PROP_DRAFTS,
    HTTPMAIL_PROP_MSGFOLDERROOT,
    HTTPMAIL_PROP_SIG,
    HTTPMAIL_PROP_LAST
} HTTPMAILPROPTYPE;

typedef enum tagHTTPMAILSPECIALFOLDER
{
    HTTPMAIL_SF_NONE,
    HTTPMAIL_SF_UNRECOGNIZED,
    HTTPMAIL_SF_INBOX,
    HTTPMAIL_SF_DELETEDITEMS,
    HTTPMAIL_SF_DRAFTS,
    HTTPMAIL_SF_OUTBOX,
    HTTPMAIL_SF_SENTITEMS,
    HTTPMAIL_SF_CONTACTS,
    HTTPMAIL_SF_CALENDAR,
    HTTPMAIL_SF_MSNPROMO,
    HTTPMAIL_SF_LAST
} HTTPMAILSPECIALFOLDER;

typedef enum tagHTTPMAILCONTACTTYPE
{
    HTTPMAIL_CT_CONTACT,
    HTTPMAIL_CT_GROUP,
    HTTPMAIL_CT_LAST
} HTTPMAILCONTACTTYPE;

const DWORD DAVNAMESPACE_UNKNOWN = 0xFFFFFFFF;
const DWORD DAVNAMESPACE_DAV = 0;
const DWORD DAVNAMESPACE_HOTMAIL = 1;
const DWORD DAVNAMESPACE_HTTPMAIL = 2;
const DWORD DAVNAMESPACE_MAIL = 3;
const DWORD DAVNAMESPACE_CONTACTS = 4;

cpp_quote("#define ISF_SMTP_USEIPFORHELO        0x01")
cpp_quote("#define ISF_ALWAYSPROMPTFORPASSWORD  0x02")
/* for SMTP - send EHLO and use STARTTLS if available: */
cpp_quote("#define ISF_SSLONSAMEPORT            0x04")
cpp_quote("#define ISF_QUERYDSNSUPPORT          0x08")
/* for SMTP - send EHLO and use AUTH if available: */
cpp_quote("#define ISF_QUERYAUTHSUPPORT         0x10")

typedef struct INETSERVER
{
    CHAR szAccount[CCHMAX_ACCOUNT_NAME];
    CHAR szUserName[CCHMAX_USERNAME];
    CHAR szPassword[CCHMAX_PASSWORD];
    CHAR szServerName[CCHMAX_SERVER_NAME];
    CHAR szConnectoid[CCHMAX_CONNECTOID];
    RASCONNTYPE rasconntype;
    DWORD dwPort;
    BOOL fSSL;
    BOOL fTrySicily;
    DWORD dwTimeout;
    DWORD dwFlags;
} INETSERVER, *LPINETSERVER;

typedef enum tagIXPTYPE
{
    IXP_NNTP,
    IXP_SMTP,
    IXP_POP3,
    IXP_IMAP,
    IXP_RAS,
    IXP_HTTPMail
} IXPTYPE;

typedef enum tagIXPSTATUS
{
    IXP_FINDINGHOST,
    IXP_CONNECTING,
    IXP_SECURING,
    IXP_CONNECTED,
    IXP_AUTHORIZING,
    IXP_AUTHRETRY,
    IXP_AUTHORIZED,
    IXP_DISCONNECTING,
    IXP_DISCONNECTED,
    IXP_LAST
} IXPSTATUS;

const DWORD DEPTH_INFINITY = 0xFFFFFFFE;

typedef DWORD MEMBERINFOFLAGS;

const MEMBERINFOFLAGS HTTP_MEMBERINFO_COMMONPROPS = 0x0;
const MEMBERINFOFLAGS HTTP_MEMBERINFO_FOLDERPROPS = 0x1;
const MEMBERINFOFLAGS HTTP_MEMBERINFO_MESSAGEPROPS = 0x2;
const MEMBERINFOFLAGS HTTP_MEMBERINFO_ALLPROPS = HTTP_MEMBERINFO_FOLDERPROPS | HTTP_MEMBERINFO_MESSAGEPROPS;

typedef DWORD IMAP_MSGFLAGS;

const IMAP_MSGFLAGS IMAP_MSG_NOFLAGS = 0x00;
const IMAP_MSGFLAGS IMAP_MSG_ANSWERED = 0x01;
const IMAP_MSGFLAGS IMAP_MSG_FLAGGED = 0x02;
const IMAP_MSGFLAGS IMAP_MSG_DELETED = 0x04;
const IMAP_MSGFLAGS IMAP_MSG_SEEN = 0x08;
const IMAP_MSGFLAGS IMAP_MSG_DRAFT = 0x10;
const IMAP_MSGFLAGS IMAP_MSG_ALLFLAGS = 0x1f;

[
    object,
    uuid(CA30F3FF-C9AC-11D1-9A3A-00C04FA309D4),
    local
]
interface ITransportCallbackService : IUnknown
{
    HRESULT GetParentWindow(
        [in]    DWORD dwReserved,
        [out]   HWND *phwndParent);

    HRESULT GetAccount(
        [out]   LPDWORD pdwServerType,
        [out]   IImnAccount **ppAccount);
}

[
    object,
    uuid(0DF2C7E1-3435-11D0-81D0-00C04FD85AB4),
    local
]
interface ITransportCallback : IUnknown
{
    typedef struct tagIXPRESULT
    {
        HRESULT hrResult;
        LPSTR pszResponse;
        UINT uiServerError;
        HRESULT hrServerError;
        DWORD dwSocketError;
        LPSTR pszProblem;
    } IXPRESULT, *LPIXPRESULT;

    typedef enum tagCMDTYPE
    {
        CMD_SEND,
        CMD_RESP
    } CMDTYPE;

    HRESULT OnTimeout(
        [in,out]    DWORD *pdwTimeout,
        [in]        IInternetTransport *pTransport);

    HRESULT OnLogonPrompt(
        [in,out]    LPINETSERVER pInetServer,
        [in]        IInternetTransport *pTransport);

    INT OnPrompt(
        [in]    HRESULT hrError,
        [in]    LPCSTR pszText,
        [in]    LPCSTR pszCaption,
        [in]    UINT uType,
        [in]    IInternetTransport *pTransport);

    HRESULT OnStatus(
        [in]    IXPSTATUS ixpstatus,
        [in]    IInternetTransport *pTransport);

    HRESULT OnError(
        [in]    IXPSTATUS ixpstatus,
        [in]    LPIXPRESULT pResult,
        [in]    IInternetTransport *pTransport);

    HRESULT OnCommand(
        [in]    CMDTYPE cmdtype,
        [in]    LPSTR pszLine,
        [in]    HRESULT hrResponse,
        [in]    IInternetTransport *pTransport);
}

[
    object,
    uuid(1F636C01-364E-11D0-81D3-00C04FD85AB4),
    local
]
interface IInternetTransport : IUnknown
{
    const boolean iitAUTHENTICATE = TRUE;
    const boolean iitDONT_AUTHENTICATe = FALSE;
    const boolean iitENABLE_ONCOMMAND = TRUE;
    const boolean iitDISABLE_ONCOMMAND = FALSE;

    typedef enum tagIXPISSTATE
    {
        IXP_IS_CONNECTED,
        IXP_IS_BUSY,
        IXP_IS_READY,
        IXP_IS_AUTHENTICATED
    } IXPISSTATE;

    HRESULT GetServerInfo(
        [in,out]    LPINETSERVER pInetServer);

    IXPTYPE GetIXPType();

    HRESULT IsState(
        [in]    IXPISSTATE isstate);

    HRESULT InetServerFromAccount(
        [in]        IImnAccount *pAccount,
        [in,out]    LPINETSERVER pInetServer);

    HRESULT Connect(
        [in]    LPINETSERVER pInetServer,
        [in]    boolean fAuthenticate,
        [in]    boolean fCommandLogging);

    HRESULT HandsOffCallback();

    HRESULT Disconnect();

    HRESULT DropConnection();

    HRESULT GetStatus(
        [out]   IXPSTATUS *pCurrentStatus);
}

[
    object,
    uuid(1F636C02-364E-11D0-81D3-00C04FD85AB4),
    local
]
interface ISMTPCallback : ITransportCallback
{
    typedef enum tagSMTPCOMMAND
    {
        SMTP_NONE,
        SMTP_BANNER,
        SMTP_CONNECTED,
        SMTP_SEND_MESSAGE,
        SMTP_AUTH,
        SMTP_EHLO,
        SMTP_HELO,
        SMTP_MAIL,
        SMTP_RCPT,
        SMTP_RSET,
        SMTP_QUIT,
        SMTP_DATA,
        SMTP_DOT,
        SMTP_SEND_STREAM,
        SMTP_CUSTOM
    } SMTPCOMMAND;

    typedef struct tagSMTPSTREAM
    {
        DWORD cbIncrement;
        DWORD cbCurrent;
        DWORD cbTotal;
    } SMTPSTREAM, *LPSMTPSTREAM;

    typedef struct tagSMTPRESPONSE
    {
        SMTPCOMMAND command;
        BOOL fDone;
        IXPRESULT rIxpResult;
        ISMTPTransport *pTransport;

        [switch_type(SMTPCOMMAND), switch_is(command)]
        union
        {
        [case(SMTP_SEND_STREAM)]    SMTPSTREAM rStreamInfo;
        [default];
        } DUMMYUNIONNAME;
    } SMTPRESPONSE, *LPSMTPRESPONSE;

    HRESULT OnResponse(
        [in] LPSMTPRESPONSE pResponse);
}

[
    object,
    uuid(0DF2C7E2-3435-11D0-81D0-00C04FD85AB4),
    local
]
interface ISMTPTransport : IInternetTransport
{
    typedef struct tagSMTPMESSAGE
    {
        ULONG cbSize;
        LPSTREAM pstmMsg;
        INETADDRLIST rAddressList;
    } SMTPMESSAGE, *LPSMTPMESSAGE;

    HRESULT InitNew(
        [in]    LPSTR pszLogFilePath,
        [in]    ISMTPCallback *pCallback);

cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
cpp_quote("#undef SendMessage")
cpp_quote("#endif")

    HRESULT SendMessage(
        [in]    LPSMTPMESSAGE pMessage);

    HRESULT CommandMAIL(
        [in]    LPSTR pszEmailFrom);

    HRESULT CommandRCPT(
        [in]    LPSTR pszEmailTo);

    HRESULT CommandEHLO();

    HRESULT CommandHELO();

    HRESULT CommandAUTH(
        [in]    LPSTR pszAuthType);

    HRESULT CommandQUIT();

    HRESULT CommandRSET();

    HRESULT CommandDATA();

    HRESULT CommandDOT();

    HRESULT SendDataStream(
        [in]    IStream *pStream,
        [in]    ULONG cbSize);
}

[
    object,
    uuid(0DF2C7EC-3435-11D0-81D0-00C04FD85AB4),
    local
]
interface ISMTPTransport2 : ISMTPTransport
{
    typedef struct tagSMTPMESSAGE2
    {
        SMTPMESSAGE smtpMsg;
        LPSTR pszDSNENVID;
        DSNRET dsnRet;
        DWORD dwReserved;
        DWORD dwReserved2;
    } SMTPMESSAGE2, *LPSMTPMESSAGE2;

    HRESULT SetWindow();

    HRESULT ResetWindow();

    HRESULT SendMessage2(
        [in]    LPSMTPMESSAGE2 pMessage);

    HRESULT CommandRCPT2(
        [in]    LPSTR pszEmailTo,
        [in]    INETADDRTYPE atDSN);
}

/* FIXME: IDAVNamespaceArbiter, IPropPatchRequest, IPropFindRequest, IPropFindMultiResponse, IPropFindResponse, IHTTPMailCallback, IHTTPMailTransport */

[
    object,
    uuid(0DF2C7E3-3435-11D0-81D0-00C04FD85AB4),
    local
]
interface IPOP3Callback : ITransportCallback
{
    typedef enum tagPOP3COMMAND
    {
        POP3_NONE,
        POP3_BANNER,
        POP3_CONNECTED,
        POP3_USER,
        POP3_PASS,
        POP3_AUTH,
        POP3_UIDL,
        POP3_STAT,
        POP3_LIST,
        POP3_DELE,
        POP3_RETR,
        POP3_TOP,
        POP3_NOOP,
        POP3_QUIT,
        POP3_RSET,
        POP3_CUSTOM
    } POP3COMMAND;

    typedef struct tagPOP3RETR
    {
        BOOL fHeader;
        BOOL fBody;
        DWORD dwPopId;
        DWORD cbSoFar;
        LPSTR pszLines;
        ULONG cbLines;
    } POP3RETR, *LPPOP3RETR;

    typedef struct tagPOP3TOP
    {
        BOOL fHeader;
        BOOL fBody;
        DWORD dwPopId;
        DWORD cPreviewLines;
        DWORD cbSoFar;
        LPSTR pszLines;
        ULONG cbLines;
    } POP3TOP, *LPPOP3TOP;

    typedef struct tagPOP3LIST
    {
        DWORD dwPopId;
        DWORD cbSize;
    } POP3LIST, *LPPOP3LIST;

    typedef struct tagPOP3UIDL
    {
        DWORD dwPopId;
        LPSTR pszUidl;
    } POP3UIDL, *LPPOP3UIDL;

    typedef struct tagPOP3STAT
    {
        DWORD cMessages;
        DWORD cbMessages;
    } POP3STAT, *LPPOP3STAT;

    typedef struct tagPOP3RESPONSE
    {
        POP3COMMAND command;
        BOOL fDone;
        IXPRESULT rIxpResult;
        IPOP3Transport *pTransport;
        BOOL fValidInfo;
        [switch_type(POP3COMMAND), switch_is(command)]
        union
        {
        [case(POP3_UIDL)] POP3UIDL rUidlInfo;
        [case(POP3_STAT)] POP3STAT rStatInfo;
        [case(POP3_LIST)] POP3LIST rListInfo;
        [case(POP3_DELE)] DWORD dwPopId;
        [case(POP3_RETR)] POP3RETR rRetrInfo;
        [case(POP3_TOP)]  POP3TOP rTopInfo;
        [default];
        } DUMMYUNIONNAME;
    } POP3RESPONSE, *LPPOP3RESPONSE;

    HRESULT OnResponse(
        [in]    LPPOP3RESPONSE pResponse);
}

[
    object,
    uuid(0DF2C7E4-3435-11D0-81D0-00C04FD85AB4),
    local
]
interface IPOP3Transport : IInternetTransport
{
    typedef enum tagPOP3CMDTYPE
    {
        POP3CMD_GET_POPID,
        POP3CMD_GET_MARKED,
        POP3CMD_GET_ALL
    } POP3CMDTYPE;

    typedef enum tagPOP3MARKTYPE
    {
        POP3_MARK_FOR_TOP = 0x01,
        POP3_MARK_FOR_RETR = 0x02,
        POP3_MARK_FOR_DELE = 0x04,
        POP3_MARK_FOR_UIDL = 0x08,
        POP3_MARK_FOR_LIST = 0x10
    } POP3MARKTYPE;

    HRESULT InitNew(
        [in]    LPSTR pszLogFilePath,
        [in]    IPOP3Callback *pCallback);

    HRESULT MarkItem(
        [in]    POP3MARKTYPE marktype,
        [in]    DWORD dwPopId,
        [in]    boolean fMarked);

    HRESULT CommandAUTH(
        [in]    LPSTR pszAuthType);

    HRESULT CommandUSER(
        [in]    LPSTR pszUserName);

    HRESULT CommandPASS(
        [in]    LPSTR pszPassword);

    HRESULT CommandLIST(
        [in]    POP3CMDTYPE cmdtype,
        [in]    DWORD dwPopId);

    HRESULT CommandTOP(
        [in]    POP3CMDTYPE cmdtype,
        [in]    DWORD dwPopId,
        [in]    DWORD cPreviewLines);

    HRESULT CommandQUIT();

    HRESULT CommandSTAT();

    HRESULT CommandNOOP();

    HRESULT CommandRSET();

    HRESULT CommandUIDL(
        [in]    POP3CMDTYPE cmdtype,
        [in]    DWORD dwPopId);

    HRESULT CommandDELE(
        [in]    POP3CMDTYPE cmdtype,
        [in]    DWORD dwPopId);

    HRESULT CommandRETR(
        [in]    POP3CMDTYPE cmdtype,
        [in]    DWORD dwPopId);
}

/* FIXME: INNTPCallback, INNTPTransport */

/* FIXME: IRangeList */

/* FIXME: IIMAPCallback, IIMAPTransport */

#if 0
cpp_quote("HRESULT WINAPI CreateRASTransport(IRASTransport **ppTransport);")
cpp_quote("HRESULT WINAPI CreateNNTPTransport(INNTPTransport **ppTransport);")
cpp_quote("HRESULT WINAPI CreateIMAPTransport(IIMAPTransport **ppTransport);")
cpp_quote("HRESULT WINAPI CreateIMAPTransport2(IIMAPTransport2 **ppTransport);")
cpp_quote("HRESULT WINAPI CreateRangeList(IRangeList **ppRangeList);")
#endif
cpp_quote("HRESULT WINAPI CreateSMTPTransport(ISMTPTransport **ppTransport);")
cpp_quote("HRESULT WINAPI CreatePOP3Transport(IPOP3Transport **ppTransport);")
