You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4969 lines
220 KiB
4969 lines
220 KiB
// --------------------------------------------------------------------------------
|
|
// IMNXPORT.IDL
|
|
// Copyright (c)1993-1998 Microsoft Corporation, All Rights Reserved
|
|
//
|
|
// Authors:
|
|
// Steven J. Bailey (sbailey)
|
|
// Steve Serdy (steveser)
|
|
// Raymond Cheng (raych)
|
|
// Greg Friedman (gregfrie)
|
|
//
|
|
// Date: 11/12/96
|
|
// --------------------------------------------------------------------------------
|
|
import "imnact.idl";
|
|
interface IInternetTransport;
|
|
interface ISMTPTransport;
|
|
interface IPOP3Transport;
|
|
interface INNTPTransport;
|
|
interface IRASTransport;
|
|
interface IIMAPTransport;
|
|
interface IHTTPMailTransport;
|
|
interface IPropFindResponse;
|
|
|
|
cpp_quote("//--------------------------------------------------------------------------------")
|
|
cpp_quote("// IMNXPORT.H")
|
|
cpp_quote("//--------------------------------------------------------------------------------")
|
|
cpp_quote("// (C) Copyright 1995-1998 Microsoft Corporation. All Rights Reserved.")
|
|
cpp_quote("//")
|
|
cpp_quote("// THIS CODE AND INFORMATION IS PROVIDED \"AS IS\" WITHOUT WARRANTY OF")
|
|
cpp_quote("// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO")
|
|
cpp_quote("// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A")
|
|
cpp_quote("// PARTICULAR PURPOSE.")
|
|
cpp_quote("//--------------------------------------------------------------------------------")
|
|
cpp_quote("")
|
|
cpp_quote("#pragma comment(lib,\"uuid.lib\")")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// Dependencies")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("#include <ras.h>")
|
|
cpp_quote("#include <raserror.h>")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// GUIDS")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// {CA30CC91-B1B3-11d0-85D0-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(CLSID_IInternetMessageUrl, 0xca30cc91, 0xb1b3, 0x11d0, 0x85, 0xd0, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("")
|
|
cpp_quote("// {0DF2C7E1-3435-11d0-81D0-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(IID_ITransportCallback, 0xdf2c7e1, 0x3435, 0x11d0, 0x81, 0xd0, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("")
|
|
cpp_quote("// {1F636C01-364E-11d0-81D3-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(IID_IInternetTransport, 0x1f636c01, 0x364e, 0x11d0, 0x81, 0xd3, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("")
|
|
cpp_quote("// {1F636C02-364E-11d0-81D3-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(IID_ISMTPCallback, 0x1f636c02, 0x364e, 0x11d0, 0x81, 0xd3, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("")
|
|
cpp_quote("// {FD853CE6-7F86-11d0-8252-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(CLSID_ISMTPTransport, 0xfd853ce6, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("// {0DF2C7E2-3435-11d0-81D0-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(IID_ISMTPTransport, 0xdf2c7e2, 0x3435, 0x11d0, 0x81, 0xd0, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("// {0DF2C7EC-3435-11d0-81D0-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(IID_ISMTPTransport2, 0xdf2c7eC, 0x3435, 0x11d0, 0x81, 0xd0, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("")
|
|
cpp_quote("// {0DF2C7E3-3435-11d0-81D0-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(IID_IPOP3Callback, 0xdf2c7e3, 0x3435, 0x11d0, 0x81, 0xd0, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("")
|
|
cpp_quote("// {FD853CE7-7F86-11d0-8252-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(CLSID_IPOP3Transport, 0xfd853ce7, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("// {0DF2C7E4-3435-11d0-81D0-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(IID_IPOP3Transport, 0xdf2c7e4, 0x3435, 0x11d0, 0x81, 0xd0, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("")
|
|
cpp_quote("// {0DF2C7E5-3435-11d0-81D0-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(IID_INNTPCallback, 0xdf2c7e5, 0x3435, 0x11d0, 0x81, 0xd0, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("")
|
|
cpp_quote("// {FD853CE8-7F86-11d0-8252-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(CLSID_INNTPTransport, 0xfd853ce8, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("// {0DF2C7E6-3435-11d0-81D0-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(IID_INNTPTransport, 0xdf2c7e6, 0x3435, 0x11d0, 0x81, 0xd0, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("// {0DF2C7ED-3435-11d0-81D0-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(IID_INNTPTransport2, 0xdf2c7eD, 0x3435, 0x11d0, 0x81, 0xd0, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("")
|
|
cpp_quote("// {36D88911-3CD6-11d0-81DF-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(IID_IRASCallback, 0x36d88911, 0x3cd6, 0x11d0, 0x81, 0xdf, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("")
|
|
cpp_quote("// {FD853CE9-7F86-11d0-8252-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(CLSID_IRASTransport, 0xfd853ce9, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("// {8A950001-3CCF-11d0-81DF-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(IID_IRASTransport, 0x8a950001, 0x3ccf, 0x11d0, 0x81, 0xdf, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("")
|
|
cpp_quote("// {FD853CEA-7F86-11d0-8252-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(CLSID_IRangeList, 0xfd853cea, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("// {8C438160-4EF6-11d0-874F-00AA00530EE9}")
|
|
cpp_quote("DEFINE_GUID(IID_IRangeList, 0x8c438160, 0x4ef6, 0x11d0, 0x87, 0x4f, 0x0, 0xaa, 0x0, 0x53, 0xe, 0xe9);")
|
|
cpp_quote("")
|
|
cpp_quote("// {E9E9D8A3-4EDD-11d0-874F-00AA00530EE9}")
|
|
cpp_quote("DEFINE_GUID(IID_IIMAPCallback, 0xe9e9d8a3, 0x4edd, 0x11d0, 0x87, 0x4f, 0x0, 0xaa, 0x0, 0x53, 0xe, 0xe9);")
|
|
cpp_quote("")
|
|
cpp_quote("// {FD853CEB-7F86-11d0-8252-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(CLSID_IIMAPTransport, 0xfd853ceb, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("// {E9E9D8A8-4EDD-11d0-874F-00AA00530EE9}")
|
|
cpp_quote("DEFINE_GUID(IID_IIMAPTransport, 0xe9e9d8a8, 0x4edd, 0x11d0, 0x87, 0x4f, 0x0, 0xaa, 0x0, 0x53, 0xe, 0xe9);")
|
|
cpp_quote("")
|
|
cpp_quote("// {DA8283C0-37C5-11d2-ACD9-0080C7B6E3C5}")
|
|
cpp_quote("DEFINE_GUID(IID_IIMAPTransport2, 0xda8283c0, 0x37c5, 0x11d2, 0xac, 0xd9, 0x0, 0x80, 0xc7, 0xb6, 0xe3, 0xc5);")
|
|
cpp_quote("")
|
|
cpp_quote("// {07849A11-B520-11d0-85D5-00C04FD85AB4}")
|
|
cpp_quote("DEFINE_GUID(IID_IBindMessageStream, 0x7849a11, 0xb520, 0x11d0, 0x85, 0xd5, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
|
|
cpp_quote("")
|
|
cpp_quote("// {CA30F3FF-C9AC-11d1-9A3A-00C04FA309D4}")
|
|
cpp_quote("DEFINE_GUID(IID_ITransportCallbackService, 0xca30f3ff, 0xc9ac, 0x11d1, 0x9a, 0x3a, 0x0, 0xc0, 0x4f, 0xa3, 0x9, 0xd4);")
|
|
cpp_quote("")
|
|
cpp_quote("// {19F6481C-E5F0-11d1-A86E-0000F8084F96}")
|
|
cpp_quote("DEFINE_GUID(IID_IHTTPMailCallback, 0x19f6481c, 0xe5f0, 0x11d1, 0xa8, 0x6e, 0x0, 0x0, 0xf8, 0x8, 0x4f, 0x96);")
|
|
cpp_quote("")
|
|
cpp_quote("// {5A580C11-E5EB-11d1-A86E-0000F8084F96}")
|
|
cpp_quote("DEFINE_GUID(CLSID_IHTTPMailTransport,0x5a580c11, 0xe5eb, 0x11d1, 0xa8, 0x6e, 0x0, 0x0, 0xf8, 0x8, 0x4f, 0x96);")
|
|
cpp_quote("// {B8BDE03C-E548-11d1-A86E-0000F8084F96}")
|
|
cpp_quote("DEFINE_GUID(IID_IHTTPMailTransport, 0xb8bde03c, 0xe548, 0x11d1, 0xa8, 0x6e, 0x0, 0x0, 0xf8, 0x8, 0x4f, 0x96);")
|
|
cpp_quote("")
|
|
cpp_quote("// {BB847B8A-054A-11d2-A894-0000F8084F96}")
|
|
cpp_quote("DEFINE_GUID(CLSID_IPropFindRequest, 0xbb847b8a, 0x54a, 0x11d2, 0xa8, 0x94, 0x0, 0x0, 0xf8, 0x8, 0x4f, 0x96);")
|
|
cpp_quote("// {5CFC6308-0544-11d2-A894-0000F8084F96}")
|
|
cpp_quote("DEFINE_GUID(IID_IPropFindRequest, 0x5cfc6308, 0x544, 0x11d2, 0xa8, 0x94, 0x0, 0x0, 0xf8, 0x8, 0x4f, 0x96);")
|
|
cpp_quote("")
|
|
cpp_quote("// {0DEE87DE-0547-11d2-A894-0000F8084F96}")
|
|
cpp_quote("DEFINE_GUID(IID_IPropFindMultiResponse, 0xdee87de, 0x547, 0x11d2, 0xa8, 0x94, 0x0, 0x0, 0xf8, 0x8, 0x4f, 0x96);")
|
|
cpp_quote("")
|
|
cpp_quote("// {8A523716-0548-11d2-A894-0000F8084F96}")
|
|
cpp_quote("DEFINE_GUID(IID_IPropFindResponse, 0x8a523716, 0x548, 0x11d2, 0xa8, 0x94, 0x0, 0x0, 0xf8, 0x8, 0x4f, 0x96);")
|
|
cpp_quote("")
|
|
cpp_quote("// {72A58FF8-227D-11d2-A8B5-0000F8084F96}")
|
|
cpp_quote("DEFINE_GUID(IID_IDAVNamespaceArbiter, 0x72a58ff8, 0x227d, 0x11d2, 0xa8, 0xb5, 0x0, 0x0, 0xf8, 0x8, 0x4f, 0x96);")
|
|
cpp_quote("")
|
|
cpp_quote("// {EA678830-235D-11d2-A8B6-0000F8084F96}")
|
|
cpp_quote("DEFINE_GUID(CLSID_IPropPatchRequest, 0xea678830, 0x235d, 0x11d2, 0xa8, 0xb6, 0x0, 0x0, 0xf8, 0x8, 0x4f, 0x96);")
|
|
cpp_quote("// {AB8B8D2A-227F-11d2-A8B5-0000F8084F96}")
|
|
cpp_quote("DEFINE_GUID(IID_IPropPatchRequest, 0xab8b8d2a, 0x227f, 0x11d2, 0xa8, 0xb5, 0x0, 0x0, 0xf8, 0x8, 0x4f, 0x96);")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// Errors")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
//;begin_internal
|
|
//
|
|
// NOTE: All inetcomm error codes must reside between CC00 and CFFF (a 1k block).
|
|
// This has been approved by Johann Posch (johannp)
|
|
// We further subdivide this range as follows:
|
|
// CC00-CCFF IMNXPORT results
|
|
// CD00-CDFF IMNACCT results
|
|
// CE00-CEFF MIMEOLE results
|
|
// CF00-CFFF undefined, do not use
|
|
// (t-erikne 03/24/97)
|
|
//
|
|
//;end_internal
|
|
cpp_quote("#ifndef FACILITY_INTERNET")
|
|
cpp_quote("#define FACILITY_INTERNET 12")
|
|
cpp_quote("#endif")
|
|
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")
|
|
cpp_quote("#ifndef HR_CODE")
|
|
cpp_quote("#define HR_CODE(hr) (INT)(hr & 0xffff)")
|
|
cpp_quote("#endif")
|
|
cpp_quote("")
|
|
//;begin_internal
|
|
// HRESULTS are even further subdivided in this file
|
|
// NOTE: you should never progammatically rely on this ordering
|
|
// it simply gives you a visual cue in the DOUTs
|
|
// CC00-CC2F General
|
|
// CC30-CC3F HTTPMail (first range)
|
|
// CC40-CC5F WINSOCK
|
|
// CC60-CC8F SMTP
|
|
// CC90-CC9F POP3
|
|
// CCA0-CCBF NNTP
|
|
// CCC0-CCCF RAS
|
|
// CCD0-CCEF IMAP
|
|
// CCF0-CCFF HTTPMail (second range)
|
|
//;end_internal
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// General Imnxport Return Values")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("#define IXP_E_LOAD_SICILY_FAILED HR_E(0xCC00)") // hrFailedToLoadSicily
|
|
cpp_quote("#define IXP_E_INVALID_CERT_CN HR_E(0xCC01)") // hrInvalidCertCN
|
|
cpp_quote("#define IXP_E_INVALID_CERT_DATE HR_E(0xCC02)") // hrInvalidCertDate
|
|
cpp_quote("#define IXP_E_ALREADY_CONNECTED HR_E(0xCC03)") // hrAlreadyConnected
|
|
cpp_quote("#define IXP_E_CONN HR_E(0xCC04)") // hrConn
|
|
cpp_quote("#define IXP_E_NOT_CONNECTED HR_E(0xCC05)") // hrNotConnected
|
|
cpp_quote("#define IXP_E_CONN_SEND HR_E(0xCC06)") // hrConnSend
|
|
cpp_quote("#define IXP_E_WOULD_BLOCK HR_E(0xCC07)") // hrWouldBlock
|
|
cpp_quote("#define IXP_E_INVALID_STATE HR_E(0xCC08)") // hrInvalidState
|
|
cpp_quote("#define IXP_E_CONN_RECV HR_E(0xCC09)") // hrConnRecv
|
|
cpp_quote("#define IXP_E_INCOMPLETE HR_E(0xCC0A)") // hrIncomplete
|
|
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_SOCKET_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)") // hrSicilyLogonFailed
|
|
cpp_quote("#define IXP_E_TIMEOUT HR_E(0xCC19)")
|
|
cpp_quote("#define IXP_E_SECURE_CONNECT_FAILED HR_E(0xCC1A)")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// WINSOCK Errors")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("#define IXP_E_WINSOCK_WSASYSNOTREADY HR_E(0xCC40)")
|
|
cpp_quote("#define IXP_E_WINSOCK_WSAVERNOTSUPPORTED HR_E(0xCC41)")
|
|
cpp_quote("#define IXP_E_WINSOCK_WSAEPROCLIM HR_E(0xCC42)")
|
|
cpp_quote("#define IXP_E_WINSOCK_WSAEFAULT HR_E(0xCC43)")
|
|
cpp_quote("#define IXP_E_WINSOCK_FAILED_WSASTARTUP HR_E(0xCC44)")
|
|
cpp_quote("#define IXP_E_WINSOCK_WSAEINPROGRESS HR_E(0xCC45)")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// SMTP Command Response Values")
|
|
cpp_quote("//--------------------------------------------------------------------------------")
|
|
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)")
|
|
cpp_quote("")
|
|
cpp_quote("#define IXP_S_SMTP_211_SYSTEM_STATUS HR_S(0xCC70)")
|
|
cpp_quote("#define IXP_S_SMTP_214_HELP_MESSAGE HR_S(0xCC71)")
|
|
cpp_quote("#define IXP_S_SMTP_220_READY HR_S(0xCC72)")
|
|
cpp_quote("#define IXP_S_SMTP_221_CLOSING HR_S(0xCC73)")
|
|
cpp_quote("#define IXP_S_SMTP_250_MAIL_ACTION_OKAY HR_S(0xCC74)")
|
|
cpp_quote("#define IXP_S_SMTP_251_FORWARDING_MAIL HR_S(0xCC75)")
|
|
cpp_quote("#define IXP_S_SMTP_354_START_MAIL_INPUT HR_S(0xCC76)")
|
|
cpp_quote("#define IXP_S_SMTP_CONTINUE HR_S(0xCC77)")
|
|
cpp_quote("#define IXP_S_SMTP_334_AUTH_READY_RESPONSE HR_S(0xCC78)")
|
|
cpp_quote("#define IXP_S_SMTP_245_AUTH_SUCCESS HR_S(0xCC79)")
|
|
cpp_quote("")
|
|
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_S_SMTP_NO_DSN_SUPPORT HR_E(0xCC7E)")
|
|
cpp_quote("#define IXP_E_SMTP_454_STARTTLS_FAILED HR_E(0xCC7F)")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// POP3 Command Response Values")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("#define IXP_E_POP3_RESPONSE_ERROR HR_E(0xCC90)")
|
|
cpp_quote("#define IXP_E_POP3_INVALID_USER_NAME HR_E(0xCC91)") // hrPOP3BadUserName
|
|
cpp_quote("#define IXP_E_POP3_INVALID_PASSWORD HR_E(0xCC92)") // hrPOP3BadPassword
|
|
cpp_quote("#define IXP_E_POP3_PARSE_FAILURE HR_E(0xCC93)")
|
|
cpp_quote("#define IXP_E_POP3_NEED_STAT HR_E(0xCC94)")
|
|
cpp_quote("#define IXP_E_POP3_NO_MESSAGES HR_E(0xCC95)")
|
|
cpp_quote("#define IXP_E_POP3_NO_MARKED_MESSAGES HR_E(0xCC96)")
|
|
cpp_quote("#define IXP_E_POP3_POPID_OUT_OF_RANGE HR_E(0xCC97)")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// NNTP Command Response Values")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("#define IXP_E_NNTP_RESPONSE_ERROR HR_E(0xCCA0)") // hrInvalidResponse
|
|
cpp_quote("#define IXP_E_NNTP_NEWGROUPS_FAILED HR_E(0xCCA1)")
|
|
cpp_quote("#define IXP_E_NNTP_LIST_FAILED HR_E(0xCCA2)")
|
|
cpp_quote("#define IXP_E_NNTP_LISTGROUP_FAILED HR_E(0xCCA3)")
|
|
cpp_quote("#define IXP_E_NNTP_GROUP_FAILED HR_E(0xCCA4)")
|
|
cpp_quote("#define IXP_E_NNTP_GROUP_NOTFOUND HR_E(0xCCA5)")
|
|
cpp_quote("#define IXP_E_NNTP_ARTICLE_FAILED HR_E(0xCCA6)")
|
|
cpp_quote("#define IXP_E_NNTP_HEAD_FAILED HR_E(0xCCA7)")
|
|
cpp_quote("#define IXP_E_NNTP_BODY_FAILED HR_E(0xCCA8)")
|
|
cpp_quote("#define IXP_E_NNTP_POST_FAILED HR_E(0xCCA9)")
|
|
cpp_quote("#define IXP_E_NNTP_NEXT_FAILED HR_E(0xCCAA)")
|
|
cpp_quote("#define IXP_E_NNTP_DATE_FAILED HR_E(0xCCAB)")
|
|
cpp_quote("#define IXP_E_NNTP_HEADERS_FAILED HR_E(0xCCAC)")
|
|
cpp_quote("#define IXP_E_NNTP_XHDR_FAILED HR_E(0xCCAD)")
|
|
cpp_quote("#define IXP_E_NNTP_INVALID_USERPASS HR_E(0xCCAE)")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// NNTP Server Response Values")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("#define IXP_NNTP_DATE_RESPONSE 111")
|
|
cpp_quote("#define IXP_NNTP_POST_ALLOWED 200")
|
|
cpp_quote("#define IXP_NNTP_POST_NOTALLOWED 201")
|
|
cpp_quote("#define IXP_NNTP_GROUP_SELECTED 211")
|
|
cpp_quote("#define IXP_NNTP_LIST_DATA_FOLLOWS 215")
|
|
cpp_quote("#define IXP_NNTP_ARTICLE_FOLLOWS 220")
|
|
cpp_quote("#define IXP_NNTP_HEAD_FOLLOWS 221")
|
|
cpp_quote("#define IXP_NNTP_BODY_FOLLOWS 222")
|
|
cpp_quote("#define IXP_NNTP_ARTICLE_RETRIEVED 223")
|
|
cpp_quote("#define IXP_NNTP_OVERVIEW_FOLLOWS 224")
|
|
cpp_quote("#define IXP_NNTP_NEWNEWSGROUPS_FOLLOWS 231")
|
|
cpp_quote("#define IXP_NNTP_ARTICLE_POSTED_OK 240")
|
|
cpp_quote("#define IXP_NNTP_AUTHORIZATION_ACCEPTED 250")
|
|
cpp_quote("#define IXP_NNTP_AUTH_OK 281")
|
|
cpp_quote("#define IXP_NNTP_SEND_ARTICLE_TO_POST 340")
|
|
cpp_quote("#define IXP_NNTP_CONTINUE_AUTHORIZATION 350")
|
|
cpp_quote("#define IXP_NNTP_PASSWORD_REQUIRED 381")
|
|
cpp_quote("#define IXP_NNTP_NO_SUCH_NEWSGROUP 411")
|
|
cpp_quote("#define IXP_NNTP_NO_NEXT_ARTICLE 421")
|
|
cpp_quote("#define IXP_NNTP_NO_PREV_ARTICLE 422")
|
|
cpp_quote("#define IXP_NNTP_NO_SUCH_ARTICLE_NUM 423")
|
|
cpp_quote("#define IXP_NNTP_NO_SUCH_ARTICLE_FOUND 430")
|
|
cpp_quote("#define IXP_NNTP_POSTING_NOT_ALLOWED 441")
|
|
cpp_quote("#define IXP_NNTP_PROTOCOLS_SUPPORTED 485")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// RAS Errors")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("#define IXP_S_RAS_NOT_NEEDED HR_S(0xCCC0)")
|
|
cpp_quote("#define IXP_S_RAS_USING_CURRENT HR_S(0xCCC1)")
|
|
cpp_quote("#define IXP_E_RAS_NOT_INSTALLED HR_E(0xCCC2)")
|
|
cpp_quote("#define IXP_E_RAS_PROCS_NOT_FOUND HR_E(0xCCC3)")
|
|
cpp_quote("#define IXP_E_RAS_ERROR HR_E(0xCCC4)")
|
|
cpp_quote("#define IXP_E_RAS_INVALID_CONNECTOID HR_E(0xCCC5)")
|
|
cpp_quote("#define IXP_E_RAS_GET_DIAL_PARAMS HR_E(0xCCC6)")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// IMAP Return Codes")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("#define IXP_S_IMAP_UNRECOGNIZED_RESP HR_S(0xCCD0) // Did not recognize IMAP response CODE")
|
|
cpp_quote("#define IXP_S_IMAP_VERBATIM_MBOX HR_S(0xCCE1) // Could not xlate mbox to target CP (or it's disabled): copying verbatim")
|
|
cpp_quote("")
|
|
cpp_quote("#define IXP_E_IMAP_LOGINFAILURE HR_E(0xCCD1) // LOGIN cmd failed")
|
|
cpp_quote("#define IXP_E_IMAP_TAGGED_NO_RESPONSE HR_E(0xCCD2) // Received tagged NO response")
|
|
cpp_quote("#define IXP_E_IMAP_BAD_RESPONSE HR_E(0xCCD3) // Received tagged BAD response")
|
|
cpp_quote("#define IXP_E_IMAP_SVR_SYNTAXERR HR_E(0xCCD4) // Syntax error in svr response")
|
|
cpp_quote("#define IXP_E_IMAP_NOTIMAPSERVER HR_E(0xCCD5) // This is not an IMAP server")
|
|
cpp_quote("#define IXP_E_IMAP_BUFFER_OVERFLOW HR_E(0xCCD6) // Buffer overflow occurred")
|
|
cpp_quote("#define IXP_E_IMAP_RECVR_ERROR HR_E(0xCCD7) // An error occurred in the recvr code")
|
|
cpp_quote("#define IXP_E_IMAP_INCOMPLETE_LINE HR_E(0xCCD8) // Received incomplete line")
|
|
cpp_quote("#define IXP_E_IMAP_CONNECTION_REFUSED HR_E(0xCCD9) // Received BYE on greeting")
|
|
cpp_quote("#define IXP_E_IMAP_UNRECOGNIZED_RESP HR_E(0xCCDA) // Did not recognize IMAP response")
|
|
cpp_quote("#define IXP_E_IMAP_CHANGEDUID HR_E(0xCCDB) // UID changed unexpectedly!")
|
|
cpp_quote("#define IXP_E_IMAP_UIDORDER HR_E(0xCCDC) // UIDs not strictly ascending!")
|
|
cpp_quote("#define IXP_E_IMAP_UNSOLICITED_BYE HR_E(0xCCDD) // Server issued UNSOLICITED BYE")
|
|
cpp_quote("#define IXP_E_IMAP_IMPROPER_SVRSTATE HR_E(0xCCDE) // eg, Attempt to send FETCH before SELECT finishes")
|
|
cpp_quote("#define IXP_E_IMAP_AUTH_NOT_POSSIBLE HR_E(0xCCDF) // No common authentication methods btwn client/svr")
|
|
cpp_quote("#define IXP_E_IMAP_OUT_OF_AUTH_METHODS HR_E(0xCCE0) // We tried >= 1 auth method, no more left to try")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// HTTPMail Return Codes")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// http errors are discontiguous.")
|
|
cpp_quote("#define IXP_E_HTTP_USE_PROXY HR_E(0xCC30) // http status 305")
|
|
cpp_quote("#define IXP_E_HTTP_BAD_REQUEST HR_E(0xCC31) // http status 400")
|
|
cpp_quote("#define IXP_E_HTTP_UNAUTHORIZED HR_E(0xCC32) // http status 401")
|
|
cpp_quote("#define IXP_E_HTTP_FORBIDDEN HR_E(0xCC33) // http status 403")
|
|
cpp_quote("#define IXP_E_HTTP_NOT_FOUND HR_E(0xCC34) // http status 404")
|
|
cpp_quote("#define IXP_E_HTTP_METHOD_NOT_ALLOW HR_E(0xCC35) // http status 405")
|
|
cpp_quote("#define IXP_E_HTTP_NOT_ACCEPTABLE HR_E(0xCC36) // http status 406")
|
|
cpp_quote("#define IXP_E_HTTP_PROXY_AUTH_REQ HR_E(0xCC37) // http status 407")
|
|
cpp_quote("#define IXP_E_HTTP_REQUEST_TIMEOUT HR_E(0xCC38) // http status 408")
|
|
cpp_quote("#define IXP_E_HTTP_CONFLICT HR_E(0xCC39) // http status 409")
|
|
cpp_quote("#define IXP_E_HTTP_GONE HR_E(0xCC3A) // http status 410")
|
|
cpp_quote("#define IXP_E_HTTP_LENGTH_REQUIRED HR_E(0xCC3B) // http status 411")
|
|
cpp_quote("#define IXP_E_HTTP_PRECOND_FAILED HR_E(0xCC3C) // http status 412")
|
|
cpp_quote("#define IXP_E_HTTP_INTERNAL_ERROR HR_E(0xCC3D) // http status 500")
|
|
cpp_quote("#define IXP_E_HTTP_NOT_IMPLEMENTED HR_E(0xCC3E) // http status 501")
|
|
cpp_quote("#define IXP_E_HTTP_BAD_GATEWAY HR_E(0xCC3F) // http status 502")
|
|
cpp_quote("// begin second range")
|
|
cpp_quote("#define IXP_E_HTTP_SERVICE_UNAVAIL HR_E(0xCCF0) // http status 503")
|
|
cpp_quote("#define IXP_E_HTTP_GATEWAY_TIMEOUT HR_E(0xCCF1) // http status 504")
|
|
cpp_quote("#define IXP_E_HTTP_VERS_NOT_SUP HR_E(0xCCF2) // http status 505")
|
|
cpp_quote("#define IXP_E_HTTP_INSUFFICIENT_STORAGE HR_E(0xCCF3) // http status 425 or 507")
|
|
cpp_quote("#define IXP_E_HTTP_ROOT_PROP_NOT_FOUND HR_E(0xCCF4) // see IHTTPMailTransport::GetProperty")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// String Length Constants")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("")
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// All of the transports in this file work in an asyncronous mode. It is assumed that
|
|
// the client application has a message pump on the thread in which a transport object
|
|
// is created.
|
|
// ---------------------------------------------------------------------------------------
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// String Lengths
|
|
// ---------------------------------------------------------------------------------------
|
|
const SHORT CCHMAX_DOMAIN = 256;
|
|
const SHORT CCHMAX_PHONE_NUMBER = 128; // RAS_MaxPhoneNumber
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// Default Port Numbers
|
|
// ---------------------------------------------------------------------------------------
|
|
const DWORD DEFAULT_IMAP_PORT = 143;
|
|
const DWORD DEFAULT_POP3_PORT = 110;
|
|
const DWORD DEFAULT_SMTP_PORT = 25;
|
|
const DWORD DEFAULT_NNTP_PORT = 119;
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// Internet Address Type
|
|
//
|
|
// There are only two address types because the SMTP protocol only distinguishes
|
|
// between a sender (ADDR_FROM) and recipients. ADDR_TO should include all Bcc, Cc and
|
|
// To recipients.
|
|
//
|
|
// additional DSN flags may be anded in and will result in a DSN request only if the
|
|
// SMTP server supports DSNs (rfc1891) and the transport connected with an EHLO command
|
|
// ---------------------------------------------------------------------------------------
|
|
typedef enum tagINETADDRTYPE {
|
|
ADDR_TO, // Recipient of the message (To, CC, Bcc, etc)
|
|
ADDR_FROM, // Sender of the message
|
|
ADDR_DSN_NEVER = 16, // suppress all delivery status notification
|
|
ADDR_DSN_SUCCESS = 32, // request DSN on successful delivery
|
|
ADDR_DSN_FAILURE = 64, // request DSN on delivery failure
|
|
ADDR_DSN_DELAY = 128 // request DSN if delivery is delayed
|
|
} INETADDRTYPE;
|
|
|
|
const DWORD ADDR_TOFROM_MASK = 0x1; // INETADDRTYPE & ADDR_TOFROM_MASK gives raw type
|
|
const DWORD ADDR_DSN_MASK = 0xf0;
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// DSNRET
|
|
// controls what whether full message or headers only will be returned with DSNs
|
|
// ---------------------------------------------------------------------------------------
|
|
typedef enum tagDSNRET {
|
|
DSNRET_DEFAULT, // use SMTP server default
|
|
DSNRET_HDRS, // return 822 headers only
|
|
DSNRET_FULL, // return full message - headers + body
|
|
} DSNRET;
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// Internet Address
|
|
// ---------------------------------------------------------------------------------------
|
|
typedef struct tagINETADDR {
|
|
INETADDRTYPE addrtype;
|
|
CHAR szEmail[CCHMAX_EMAIL_ADDRESS]; // A person's e-mail address
|
|
} INETADDR, *LPINETADDR;
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// Internet Address List
|
|
// ---------------------------------------------------------------------------------------
|
|
typedef struct tagINETADDRLIST {
|
|
ULONG cAddress; // Number of elements in prgInetAddr
|
|
LPINETADDR prgAddress; // Array of internet addresses
|
|
} INETADDRLIST, *LPINETADDRLIST;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// RAS Connection Type
|
|
// -----------------------------------------------------------------------------------
|
|
typedef enum tagRASCONNTYPE {
|
|
RAS_CONNECT_LAN,
|
|
RAS_CONNECT_MANUAL,
|
|
RAS_CONNECT_RAS
|
|
} RASCONNTYPE;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPMAIL Root Property Types
|
|
// -----------------------------------------------------------------------------------
|
|
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;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPMAIL Special Folder Types
|
|
// -----------------------------------------------------------------------------------
|
|
typedef enum tagHTTPMAILSPECIALFOLDER {
|
|
HTTPMAIL_SF_NONE = 0,
|
|
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;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPMAIL Contact Types
|
|
// -----------------------------------------------------------------------------------
|
|
typedef enum tagHTTPMAILCONTACTTYPE {
|
|
HTTPMAIL_CT_CONTACT = 0, // default
|
|
HTTPMAIL_CT_GROUP,
|
|
HTTPMAIL_CT_LAST
|
|
} HTTPMAILCONTACTTYPE;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// DAV Namespaces
|
|
// -----------------------------------------------------------------------------------
|
|
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;
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// Internet Server Flags...
|
|
// ---------------------------------------------------------------------------------------
|
|
cpp_quote("#define ISF_SMTP_USEIPFORHELO 0x00000001 // For HELO or EHLO Command")
|
|
cpp_quote("#define ISF_ALWAYSPROMPTFORPASSWORD 0x00000002 // For HELO or EHLO Command") // Never save password (boolean)
|
|
cpp_quote("#define ISF_SSLONSAMEPORT 0x00000004 // For SMTP Only - use STARTTLS") // For STARTTLS Support
|
|
cpp_quote("#define ISF_QUERYDSNSUPPORT 0x00000008 // For SMTP Only - issue EHLO on connect and check for DSN")
|
|
cpp_quote("#define ISF_QUERYAUTHSUPPORT 0x00000010 // For SMTP Only - issue EHLO on connect and check for AUTH")
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// Internet Server Information...
|
|
// ---------------------------------------------------------------------------------------
|
|
typedef struct INETSERVER {
|
|
CHAR szAccount[CCHMAX_ACCOUNT_NAME]; // IMN Account Name
|
|
CHAR szUserName[CCHMAX_USERNAME]; // User's connection name
|
|
CHAR szPassword[CCHMAX_PASSWORD]; // User's password
|
|
CHAR szServerName[CCHMAX_SERVER_NAME]; // Server name (or IP address string)
|
|
CHAR szConnectoid[CCHMAX_CONNECTOID]; // RAS Connection Name
|
|
RASCONNTYPE rasconntype; // RAS connection type
|
|
DWORD dwPort; // Port name
|
|
BOOL fSSL; // Using SSL
|
|
BOOL fTrySicily; // Try using sicily authentication
|
|
DWORD dwTimeout; // Timeout in seconds
|
|
DWORD dwFlags; // ISF_xxx Flags (above)
|
|
} INETSERVER, *LPINETSERVER;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// Internet Transport Types
|
|
// -----------------------------------------------------------------------------------
|
|
typedef enum tagIXPTYPE {
|
|
IXP_NNTP, // NNTP (News)
|
|
IXP_SMTP, // SMTP (Send)
|
|
IXP_POP3, // POP3 (Recv)
|
|
IXP_IMAP, // IMAP (Recv / remote store)
|
|
IXP_RAS,
|
|
IXP_HTTPMail // HTTPMail (Recv / remote store)
|
|
} IXPTYPE;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// IXPSTATUS - Transport Status Types
|
|
//
|
|
// These values are returned in the ITransportCallback::OnStatus callback method
|
|
// and in the IInternetTransport::GetStatus member.
|
|
// -----------------------------------------------------------------------------------
|
|
typedef enum tagIXPSTATUS
|
|
{
|
|
IXP_FINDINGHOST, // Attempting to find host (IP/host name resolution)
|
|
IXP_CONNECTING, // TCP/IP connection is in progress
|
|
IXP_SECURING, // TCP/IP socket connection has been established, securing an SSL connection
|
|
IXP_CONNECTED, // TCP/IP socket connection has been established, waiting for protcol response
|
|
IXP_AUTHORIZING, // Performing authorization with the server
|
|
IXP_AUTHRETRY, // Retrying authorization
|
|
IXP_AUTHORIZED, // Authorization successful (transient state, heads directly to IXP_CONNECTED after)
|
|
IXP_DISCONNECTING, // The connection is being closed
|
|
IXP_DISCONNECTED, // The transport has been disconnected from the server
|
|
IXP_LAST // Last status value (for boundschecking purposes)
|
|
} IXPSTATUS;
|
|
|
|
|
|
// DEPTH_INFINITY : this constant can be passed to any member of IHTTPMailTransport
|
|
// that takes a DWORD parameter to specify depth in a propfind request.
|
|
|
|
const DWORD DEPTH_INFINITY = 0xFFFFFFFE;
|
|
|
|
// IHTTPMailTransport::MemberInfo Flags.
|
|
|
|
typedef DWORD MEMBERINFOFLAGS;
|
|
const MEMBERINFOFLAGS HTTP_MEMBERINFO_COMMONPROPS = 0x00000000;
|
|
const MEMBERINFOFLAGS HTTP_MEMBERINFO_FOLDERPROPS = 0x00000001; // common props and folder props
|
|
const MEMBERINFOFLAGS HTTP_MEMBERINFO_MESSAGEPROPS = 0x00000002; // common props and message props
|
|
|
|
const MEMBERINFOFLAGS HTTP_MEMBERINFO_ALLPROPS = (HTTP_MEMBERINFO_FOLDERPROPS | HTTP_MEMBERINFO_MESSAGEPROPS);
|
|
|
|
// ***NB: You have to be careful when changing IMAP_MSGFLAGS.
|
|
// The function, IMAPMsgFlagsToARF in imapfldr.cpp will have to be updated.
|
|
typedef DWORD IMAP_MSGFLAGS; // Message flags returned by FLAGS response,
|
|
// PERMANENTFLAGS response code and FETCH
|
|
const IMAP_MSGFLAGS IMAP_MSG_NOFLAGS = 0x00000000;
|
|
const IMAP_MSGFLAGS IMAP_MSG_ANSWERED = 0x00000001;
|
|
const IMAP_MSGFLAGS IMAP_MSG_FLAGGED = 0x00000002;
|
|
const IMAP_MSGFLAGS IMAP_MSG_DELETED = 0x00000004;
|
|
const IMAP_MSGFLAGS IMAP_MSG_SEEN = 0x00000008;
|
|
const IMAP_MSGFLAGS IMAP_MSG_DRAFT = 0x00000010;
|
|
const IMAP_MSGFLAGS IMAP_MSG_ALLFLAGS = 0x0000001F; // Keep this updated
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_ITransportCallbackService
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(CA30F3FF-C9AC-11d1-9A3A-00C04FA309D4),
|
|
local,
|
|
]
|
|
interface ITransportCallbackService : IUnknown
|
|
{
|
|
HRESULT GetParentWindow(
|
|
[in] DWORD dwReserved,
|
|
[out] HWND *phwndParent);
|
|
|
|
HRESULT GetAccount(
|
|
[out] LPDWORD pdwServerType, // SRV_xxx Bit
|
|
[out] IImnAccount **ppAccount);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_ITransportCallback
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(0DF2C7E1-3435-11d0-81D0-00C04FD85AB4),
|
|
helpstring("Base Transport Callback Interface"),
|
|
local,
|
|
]
|
|
interface ITransportCallback : IUnknown
|
|
{
|
|
// -----------------------------------------------------------------------------------
|
|
// IXPRESULT
|
|
//
|
|
// This structure holds information about a server response or a transport result /
|
|
// error.
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagIXPRESULT {
|
|
HRESULT hrResult; // Error Code
|
|
LPSTR pszResponse; // Last server response
|
|
UINT uiServerError; // Server generated error number
|
|
HRESULT hrServerError; // Associated HRESULT of server error
|
|
DWORD dwSocketError; // Socket error as defined in winsock.h
|
|
LPSTR pszProblem; // Additional information
|
|
} IXPRESULT, *LPIXPRESULT;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// OnTimeout
|
|
//
|
|
// Description:
|
|
// This method is called by a transport when a timeout period has expired. A timeout
|
|
// is defined as a period of time in which no activity has occurred. A client
|
|
// can specify a timeout in the INETSERVER structure that is passed to the
|
|
// IInternetTransport::Connect method.
|
|
//
|
|
// When this method is called, the client MUST return a value that indicates
|
|
// whether the transport should wait another dwTimeout (seconds), or should
|
|
// terminate the connection to the server.
|
|
//
|
|
// Parameters:
|
|
// pdwTimeout Specifies the current timeout value in seconds. A
|
|
// client can reset this value to a new timeout value,
|
|
// and return S_OK in which case the client will
|
|
// continue waiting for the new timeout period.
|
|
// pTransport The transport that generated the timeout
|
|
//
|
|
// Returns:
|
|
// S_OK Tells the transport to wait another timeout period
|
|
// as specified by the value of *pdwTimeout (seconds).
|
|
// S_FALSE Tells the transport to terminate it's connection and
|
|
// return to the disconnected state.
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT OnTimeout(
|
|
[in,out]
|
|
DWORD *pdwTimeout,
|
|
[in]
|
|
IInternetTransport *pTransport);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// OnLogonPrompt
|
|
//
|
|
// Description:
|
|
// This method is called when the transport requires logon information. The client
|
|
// is expected to prompt the user and fill the szUserName, szPassword fields of
|
|
// the INETSERVER structure passed in. The client should not attempt to change
|
|
// any other fields in this structure, they should be used only for display.
|
|
//
|
|
// Parameters:
|
|
// pInetServer Information about the current internet server.
|
|
// pTransport The transport that generated the timeout
|
|
//
|
|
// Returns:
|
|
// S_OK The user entered new logon information and the
|
|
// transport should try to re-connect.
|
|
// S_FALSE The user wants to cancel the current logon attempt.
|
|
// If this value is returned, the transport returns
|
|
// to the disconnected state.
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT OnLogonPrompt(
|
|
[in,out]
|
|
LPINETSERVER pInetServer,
|
|
[in]
|
|
IInternetTransport *pTransport);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// OnPrompt
|
|
//
|
|
// Description:
|
|
// This method is called when the transport requires user input. This method is called
|
|
// in the following cases:
|
|
//
|
|
// 1) hrError == IXP_E_INVALID_CERT_CN, Invalid certificate, SSL error
|
|
// 2) hrError == IXP_E_INVALID_CERT_DATE, Invalid certificate date, SSL error
|
|
//
|
|
// Parameters:
|
|
// hrError HRESULT of reason for user prompt, usually an error
|
|
// pszText Suggested text of question to be displayed
|
|
// pszCaption Suggested caption of messagebox
|
|
// uType Same parameter as passed into MessageBox (Yes, no, etc)
|
|
// pTransport The transport object that generated the OnPrompt
|
|
//
|
|
// Returns
|
|
// INT This method should return the same value as the
|
|
// standard windows MessageBox API function.
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
INT OnPrompt(
|
|
[in]
|
|
HRESULT hrError,
|
|
[in]
|
|
LPCTSTR pszText,
|
|
[in]
|
|
LPCTSTR pszCaption,
|
|
[in]
|
|
UINT uType,
|
|
[in]
|
|
IInternetTransport *pTransport);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// OnStatus
|
|
//
|
|
// Description:
|
|
// This method is called to allow the client to provide a user with a high level
|
|
// progress indicator.
|
|
//
|
|
// Parameters:
|
|
// ixpstatus Current status of the transport, described above
|
|
// pTransport Transport object that generated the OnStatus call
|
|
//
|
|
// Returns:
|
|
// HRESULT A client should always return S_OK
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT OnStatus(
|
|
[in]
|
|
IXPSTATUS ixpstatus,
|
|
[in]
|
|
IInternetTransport *pTransport);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// OnError
|
|
//
|
|
// Description:
|
|
// This method is called when a transport encounters a fatal error that will most
|
|
// likely result is a disconnection from the server. Normal protocol errors are
|
|
// returned through each transports OnResponse metho. This method is used to handle
|
|
// high-level errors such eas TCP/IP and connection failures.
|
|
//
|
|
// Parameters:
|
|
// ixpstatus Current status of the transport (described above)
|
|
// pResult Error information
|
|
// pTransport Transport object that generated the OnError call
|
|
//
|
|
// Return Values:
|
|
// HRESULT A client should always return S_OK
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT OnError(
|
|
[in]
|
|
IXPSTATUS ixpstatus,
|
|
[in]
|
|
LPIXPRESULT pResult,
|
|
[in]
|
|
IInternetTransport *pTransport);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// OnCommand
|
|
//
|
|
// Description:
|
|
// This method is called for every command send to the server and for every respsonse
|
|
// received from the server. This method is provided ONLY for logging and debugging
|
|
// purposes. If you pass FALSE for fCommandLogging in the call to
|
|
// IInternetTransport::Connect, this method will not be called. There is a small
|
|
// amount of overhead when this function is called.
|
|
//
|
|
// Parameters:
|
|
// cmdtype Is this a Send Line or a Response Line
|
|
// pszLine Data send to or received from the server
|
|
// hrResponse HRESULT of response code (see codes above). If this
|
|
// is a failure code, then it indicates that the
|
|
// transport just received an error from the server
|
|
// and the current operation is going to fail, possible.
|
|
// pTransport Transport that generated the call to OnCommand
|
|
//
|
|
// Returns:
|
|
// S_OK The client should always return S_OK
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
typedef enum tagCMDTYPE {
|
|
CMD_SEND,
|
|
CMD_RESP
|
|
} CMDTYPE;
|
|
|
|
HRESULT OnCommand(
|
|
[in]
|
|
CMDTYPE cmdtype,
|
|
[in]
|
|
LPSTR pszLine,
|
|
[in]
|
|
HRESULT hrResponse,
|
|
[in]
|
|
IInternetTransport *pTransport);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_IInternetTransport
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(1F636C01-364E-11d0-81D3-00C04FD85AB4),
|
|
helpstring("Internet Transport Interface"),
|
|
local,
|
|
]
|
|
interface IInternetTransport : IUnknown
|
|
{
|
|
|
|
// Interface Constants
|
|
const boolean iitAUTHENTICATE = TRUE;
|
|
const boolean iitDONT_AUTHENTICATE = FALSE;
|
|
const boolean iitENABLE_ONCOMMAND = TRUE;
|
|
const boolean iitDISABLE_ONCOMMAND = FALSE;
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// GetServerInfo
|
|
//
|
|
// Description:
|
|
// Allows the client to retreive server information for the transport. The data in
|
|
// this structure is valid only after a call to IInternetTransport::Connect.
|
|
//
|
|
// Parameters:
|
|
// pInetServer Current server information for the transport
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG pInetServer is NULL
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT GetServerInfo(
|
|
[in,out]
|
|
LPINETSERVER pInetServer);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// GetIXPType
|
|
//
|
|
// Description:
|
|
// This method returns the IXPTYPE of the transport.
|
|
//
|
|
// Parameters:
|
|
// None
|
|
//
|
|
// Returns:
|
|
// IXPTYPE Internet Transport Type
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
IXPTYPE GetIXPType(void);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// IsState
|
|
//
|
|
// Description:
|
|
// This method allows a client to query the transport for validity of different states.
|
|
//
|
|
// Parameters:
|
|
// isstate The State in which to query
|
|
//
|
|
// Returns:
|
|
// IXP_E_NOT_INIT The transport has not been initialized
|
|
// IXP_E_NOT_CONNECTED The transport is not connected (return if isstate != IXP_IS_CONNECTED)
|
|
// S_OK The IXP_IS_xxx state is true
|
|
// S_FALSE The IXP_IS_xxx state is false
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
typedef enum tagIXPISSTATE {
|
|
IXP_IS_CONNECTED, // Is the transport currently connected
|
|
IXP_IS_BUSY, // Is the transport currently processing a command
|
|
IXP_IS_READY, // Is the transport ready for input
|
|
IXP_IS_AUTHENTICATED, // Has the transport performed authentication
|
|
} IXPISSTATE;
|
|
|
|
HRESULT IsState(
|
|
[in]
|
|
IXPISSTATE isstate);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// InetServerFromAccount
|
|
//
|
|
// Description:
|
|
// This method takes an Internet Mail and News Account object and returns a filled
|
|
// INETSERVER structure.
|
|
//
|
|
// Parameters:
|
|
// pAccount Internet Mail and News Account
|
|
// pInetServer Upon successful return contains server information
|
|
// required to call IInternetTransport::Connect.
|
|
//
|
|
// Return Values:
|
|
// E_INVALIDARG pAccount is NULL or pInetServer is NULL
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT InetServerFromAccount(
|
|
[in]
|
|
IImnAccount *pAccount,
|
|
[in,out]
|
|
LPINETSERVER pInetServer);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// Connect
|
|
//
|
|
// Description:
|
|
// Connects the transport to the server specified in pInetServer struct. This call
|
|
// is asyncronous. Each transport defines that terminal connect state. For example,
|
|
// for SMTP, the connect state (::Connect is done) is defined by the SMTP_CONNECTED,
|
|
// state.
|
|
//
|
|
// Parameters:
|
|
// pInetServer Internet Server connection information.
|
|
// fAuthenticate Tells the transport whether of or not to perform
|
|
// authentication with the server. If you client
|
|
// passes FALSE, it is responsible for authentication.
|
|
// fCommandLogging If you pass FALSE, the ITransportCallback::OnCommand
|
|
// method will never be called.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG pInetServer is NULL, or a member of it is invalid
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
// E_FAIL Socket initialization or connection failed.
|
|
// IXP_E_ALREADY_CONNECTED The transport is currently connected and busy
|
|
// IXP_E_NOT_INIT The transport has not been Initialized
|
|
// IXP_E_SOCKET_INIT_ERROR Unable to initilize the TCP/IP socket connection
|
|
// IXP_E_SOCKET_CONNECT_ERROR Unable to connect the TCP/IP socket
|
|
//
|
|
// In general this function succeeds, even if the server does not exist. If the
|
|
// server can not be found, the client will receive error information through
|
|
// ITransportCallback::OnError, and the terminal connection state can be detected
|
|
// when ITransportCallback::OnStatus(IXP_DISCONNECTED) is called.
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT Connect(
|
|
[in]
|
|
LPINETSERVER pInetServer,
|
|
[in]
|
|
boolean fAuthenticate,
|
|
[in]
|
|
boolean fCommandLogging);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HandsOffCallback
|
|
//
|
|
// Description:
|
|
// This method forces the Transport to release the callback interface that was
|
|
// passed into the InitNew method of the transport. After this method is called,
|
|
// no more calls will be made to the callback function. This method is provided
|
|
// so that clients can resolve possible circurlar references.
|
|
//
|
|
// Parameters:
|
|
// None
|
|
//
|
|
// Returns:
|
|
// S_OK The callback was release
|
|
// S_FALSE There is currently no callback registered
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT HandsOffCallback(void);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// Disconnect
|
|
//
|
|
// Description:
|
|
// This method disconnects the transport. This method may cause the transport to
|
|
// send a command, such as the QUIT command, to the server. This is the clean
|
|
// method of terminating the connection to the server, as opposed to DropConnection.
|
|
//
|
|
// Parameters:
|
|
// None
|
|
//
|
|
// Returns:
|
|
// S_OK The connection has been dropped.
|
|
// IXP_E_NOT_INIT The transport has not been Initialized
|
|
// IXP_E_NOT_CONNECTED The transport is not connected.
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT Disconnect(void);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// DropConnection
|
|
//
|
|
// Description:
|
|
// This method disconnects the transport. This is an un-clean way, but guaranteed
|
|
// method of dropping the connection between the client and the server. To allow
|
|
// the protocol to shutdown in a normal fashion, call Disconnect.
|
|
//
|
|
// Parameters:
|
|
// None
|
|
//
|
|
// Returns:
|
|
// S_OK The connection has been dropped.
|
|
// IXP_E_NOT_INIT The transport has not been Initialized
|
|
// IXP_E_NOT_CONNECTED The transport is not connected.
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT DropConnection(void);
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// GetStatus
|
|
//
|
|
// Description:
|
|
// This function returns the current status of the transport.
|
|
//
|
|
// Parameters:
|
|
// IXPSTATUS *pCurrentStatus [out] - current status of the transport is returned here.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT GetStatus([out]IXPSTATUS *pCurrentStatus);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_ISMTPCallback
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(1F636C02-364E-11d0-81D3-00C04FD85AB4),
|
|
helpstring("SMTP Callback Interface"),
|
|
local,
|
|
]
|
|
interface ISMTPCallback : ITransportCallback
|
|
{
|
|
// -----------------------------------------------------------------------------------
|
|
// SMTPCOMMAND
|
|
// -----------------------------------------------------------------------------------
|
|
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;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// SMTPSTREAM return OnResponse - command == SMTP_SEND_STREAM
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagSMTPSTREAM {
|
|
DWORD cbIncrement;
|
|
DWORD cbCurrent;
|
|
DWORD cbTotal;
|
|
} SMTPSTREAM, *LPSMTPSTREAM;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// SMTPRESPONSE
|
|
//
|
|
// Description:
|
|
// command SMTPCOMMAND that generated the response
|
|
// fDone Is the command finished. If TRUE, the client
|
|
// can issue another command through ISMTPTransport,
|
|
// otherwise, the client should continue to pump
|
|
// messages until fDone = TRUE is received.
|
|
// rIxpResult Result Information for the response. If
|
|
// rIxpResult::hrResult specifies a FAILED result,
|
|
// the structure contains other information.
|
|
// pTransport Transport that generated the OnResponse call.
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagSMTPRESPONSE {
|
|
SMTPCOMMAND command; // Command in which the response was generated for
|
|
BOOL fDone; // Is this an SMTP continuation response?
|
|
IXPRESULT rIxpResult; // Result Information
|
|
ISMTPTransport *pTransport; // Pointer to the SMTP transport that generated the response
|
|
|
|
// This is a union of response information based on the command
|
|
[switch_type(SMTPCOMMAND), switch_is((SMTPCOMMAND)command)]
|
|
union {
|
|
[case(SMTP_SEND_STREAM)] SMTPSTREAM rStreamInfo;
|
|
[default];
|
|
};
|
|
} SMTPRESPONSE, *LPSMTPRESPONSE;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// OnResponse
|
|
//
|
|
// Description:
|
|
// Called by ISMTPTransport when a command response is received from the SMTP server.
|
|
//
|
|
// Parameters:
|
|
// pResponse Response information
|
|
//
|
|
// Return Values:
|
|
// S_OK The client should always return S_OK
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT OnResponse(
|
|
[in]
|
|
LPSMTPRESPONSE pResponse);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_ISMTPTransport
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(0DF2C7E2-3435-11d0-81D0-00C04FD85AB4),
|
|
helpstring("SMTP Transport Interface"),
|
|
local,
|
|
]
|
|
interface ISMTPTransport : IInternetTransport
|
|
{
|
|
// -----------------------------------------------------------------------------------
|
|
// SMTPMESSAGE
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagSMTPMESSAGE {
|
|
ULONG cbSize; // Size of the message in bytes
|
|
LPSTREAM pstmMsg; // Stream containing ANSI MIME/rfc822 message stream
|
|
INETADDRLIST rAddressList; // Internet Address List containing sender and recipients
|
|
} SMTPMESSAGE, *LPSMTPMESSAGE;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// InitNew
|
|
//
|
|
// Description:
|
|
// This method Initializes the internet transport. This method be called before
|
|
// the transport can doing anything.
|
|
//
|
|
// Parameters:
|
|
// pszLogFilePath Full file path in which to log the protocol commands.
|
|
// NULL is a valid value (no logging)
|
|
// pCallback(required) Specifies the Transport callback interface.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG An invalid parameter was passed in
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT InitNew(
|
|
[in]
|
|
LPSTR pszLogFilePath,
|
|
[in]
|
|
ISMTPCallback *pCallback);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// SendMessage
|
|
//
|
|
// Description:
|
|
// This method initiates the sending process. IInternetTransport::Connect must have
|
|
// been called before this method is called (i.e. the transport must be in the
|
|
// ready state). This method calls OnProgress throughout the transmission of
|
|
// pMessage->pstmMsg so that the client can display progress. When the message is
|
|
// fisnished, or if an error ocurrs, ITransportCallback::OnComplete is called.
|
|
//
|
|
// Parameters:
|
|
// pMessage(required) Contains the information for the message to send. This
|
|
// method duplicates the contents of pMessage and AddRefs,
|
|
// pMessage->pstmMsg so that the client can free pMessage
|
|
// immediately after calling this method.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG pMessage is invalid or one of its members is invalid
|
|
// E_OUTOFMEMORY A memory allocation failed
|
|
// IXP_E_BUSY The transport is busy
|
|
// IXP_E_INVALID_ADDRESS_LIST SMTPMESSAGE::rInetAddrList contains invalid entries
|
|
// IXP_E_NOT_CONNECTED IInternetTransport::Connect has not been called, or
|
|
// the current connection has been lost. The transport
|
|
// will not automatically re-connect.
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT SendMessage(
|
|
[in]
|
|
LPSMTPMESSAGE pMessage);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandMAIL
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandMAIL(
|
|
[in]
|
|
LPSTR pszEmailFrom);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandRCPT
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandRCPT(
|
|
[in]
|
|
LPSTR pszEmailTo);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandEHLO
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandEHLO(void);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandHELO
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandHELO(void);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandHELO
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandAUTH(
|
|
[in]
|
|
LPSTR pszAuthType);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandQUIT
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandQUIT(void);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandRSET
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandRSET(void);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandDATA
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandDATA(void);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandDOT
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandDOT(void);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// SendDataStream - This method does a CommandDOT when it is finished.
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT SendDataStream(
|
|
[in]
|
|
IStream *pStream,
|
|
[in]
|
|
ULONG cbSize);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_ISMTPTransport2
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(0DF2C7EC-3435-11d0-81D0-00C04FD85AB4),
|
|
helpstring("SMTP Transport Interface"),
|
|
local,
|
|
]
|
|
interface ISMTPTransport2 : ISMTPTransport
|
|
{
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// SMTPMESSAGE2
|
|
//
|
|
// Adds DSN (rfc1891) support. To receive DSNs the SMTP server must implement rfc1891
|
|
// and the SMTP transport must be initialized with an EHLO command
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagSMTPMESSAGE2 {
|
|
SMTPMESSAGE smtpMsg; // SMTPMESSAGE structure
|
|
LPSTR pszDSNENVID; // value for MAIL ENVID paramter
|
|
DSNRET dsnRet; // value for MAIL RET parameter
|
|
DWORD dwReserved;
|
|
DWORD dwReserved2;
|
|
} SMTPMESSAGE2, *LPSMTPMESSAGE2;
|
|
|
|
//***************************************************************************
|
|
// Function: SetWindow
|
|
//
|
|
// Purpose:
|
|
// This function creates a new window for async winsock processing
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT SetWindow(void);
|
|
|
|
//***************************************************************************
|
|
// Function: ResetWindow
|
|
//
|
|
// Purpose:
|
|
// This function closes a window for async winsock processing
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT ResetWindow(void);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// SendMessage2
|
|
//
|
|
// Description:
|
|
// This method initiates the sending process. IInternetTransport::Connect must have
|
|
// been called before this method is called (i.e. the transport must be in the
|
|
// ready state). This method calls OnProgress throughout the transmission of
|
|
// pMessage->pstmMsg so that the client can display progress. When the message is
|
|
// fisnished, or if an error ocurrs, ITransportCallback::OnComplete is called.
|
|
//
|
|
// Parameters:
|
|
// pMessage(required) Contains the information for the message to send. This
|
|
// method duplicates the contents of pMessage and AddRefs,
|
|
// pMessage->pstmMsg so that the client can free pMessage
|
|
// immediately after calling this method.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG pMessage is invalid or one of its members is invalid
|
|
// E_OUTOFMEMORY A memory allocation failed
|
|
// IXP_E_BUSY The transport is busy
|
|
// IXP_E_INVALID_ADDRESS_LIST SMTPMESSAGE::rInetAddrList contains invalid entries
|
|
// IXP_E_NOT_CONNECTED IInternetTransport::Connect has not been called, or
|
|
// the current connection has been lost. The transport
|
|
// will not automatically re-connect.
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT SendMessage2(
|
|
[in]
|
|
LPSMTPMESSAGE2 pMessage);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandRCPT2
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandRCPT2(
|
|
[in]
|
|
LPSTR pszEmailTo,
|
|
[in]
|
|
INETADDRTYPE atDSN);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_IDAVNamespaceArbiter
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(72A58FF8-227D-11d2-A8B5-0000F8084F96),
|
|
helpstring("DAV Namespace Arbiter"),
|
|
local,
|
|
]
|
|
interface IDAVNamespaceArbiter : IUnknown
|
|
{
|
|
HRESULT AddNamespace(
|
|
[in]
|
|
LPCSTR pszNamespace,
|
|
[out]
|
|
DWORD *pdwNamespaceID);
|
|
|
|
HRESULT GetNamespaceID(
|
|
[in]
|
|
LPCSTR pszNamespace,
|
|
[out]
|
|
DWORD *pdwNamespaceID);
|
|
|
|
HRESULT GetNamespacePrefix(
|
|
[in]
|
|
DWORD dwNamespaceID,
|
|
[out]
|
|
LPSTR *ppszNamespacePrefix);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_IPropPatchRequest
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(AB8B8D2A-227F-11d2-A8B5-0000F8084F96),
|
|
helpstring("DAV PropPatch Request"),
|
|
local,
|
|
]
|
|
interface IPropPatchRequest : IDAVNamespaceArbiter
|
|
{
|
|
HRESULT SetProperty(
|
|
[in]
|
|
DWORD dwNamespaceID,
|
|
[in]
|
|
LPCSTR pszPropertyName,
|
|
[in]
|
|
LPCSTR pszNewValue);
|
|
|
|
HRESULT RemoveProperty(
|
|
[in]
|
|
DWORD dwNamespaceID,
|
|
[in]
|
|
LPCSTR pszPropertyName);
|
|
|
|
HRESULT GenerateXML(
|
|
[out]
|
|
LPSTR *pszXML);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_IPropFindRequest
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(5CFC6308-0544-11d2-A894-0000F8084F96),
|
|
helpstring("DAV PropFind Request"),
|
|
local,
|
|
]
|
|
interface IPropFindRequest : IDAVNamespaceArbiter
|
|
{
|
|
HRESULT AddProperty(
|
|
[in]
|
|
DWORD dwNamespaceID,
|
|
[in]
|
|
LPCSTR pszPropertyName);
|
|
|
|
HRESULT GenerateXML(
|
|
[out]
|
|
LPSTR *pszXML);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_IPropFindMultiResponse
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(0DEE87DE-0547-11d2-A894-0000F8084F96),
|
|
helpstring("DAV PropFind MultiResponse"),
|
|
local,
|
|
]
|
|
interface IPropFindMultiResponse : IUnknown
|
|
{
|
|
BOOL IsComplete(void);
|
|
|
|
HRESULT GetLength(
|
|
[out]
|
|
ULONG *pulLength);
|
|
|
|
HRESULT GetResponse(
|
|
[in]
|
|
ULONG ulIndex,
|
|
[out]
|
|
IPropFindResponse **ppResponse);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_IPropFindResponse
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(8A523716-0548-11d2-A894-0000F8084F96),
|
|
helpstring("DAV PropFind Response"),
|
|
local,
|
|
]
|
|
interface IPropFindResponse : IUnknown
|
|
{
|
|
BOOL IsComplete(void);
|
|
|
|
HRESULT GetHref(
|
|
[out]
|
|
LPSTR *ppszHref);
|
|
|
|
HRESULT GetProperty(
|
|
[in]
|
|
DWORD dwNamespaceID,
|
|
[in]
|
|
LPCSTR pszPropertyName,
|
|
[out]
|
|
LPSTR *ppszPropertyValue);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_IHTTPMailCallback
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(19F6481C-E5F0-11d1-A86E-0000F8084F96),
|
|
helpstring("HTTPMail Callback Interface"),
|
|
local,
|
|
]
|
|
interface IHTTPMailCallback : ITransportCallback
|
|
{
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPMAILCOMMAND
|
|
// -----------------------------------------------------------------------------------
|
|
typedef enum tagHTTPMAILCOMMAND
|
|
{
|
|
HTTPMAIL_NONE,
|
|
HTTPMAIL_GETPROP,
|
|
HTTPMAIL_GET,
|
|
HTTPMAIL_PUT,
|
|
HTTPMAIL_POST,
|
|
HTTPMAIL_DELETE,
|
|
HTTPMAIL_BDELETE,
|
|
HTTPMAIL_PROPFIND,
|
|
HTTPMAIL_PROPPATCH,
|
|
HTTPMAIL_MKCOL,
|
|
HTTPMAIL_COPY,
|
|
HTTPMAIL_BCOPY,
|
|
HTTPMAIL_MOVE,
|
|
HTTPMAIL_BMOVE,
|
|
HTTPMAIL_MEMBERINFO,
|
|
HTTPMAIL_FINDFOLDERS,
|
|
HTTPMAIL_MARKREAD,
|
|
HTTPMAIL_SENDMESSAGE,
|
|
HTTPMAIL_LISTCONTACTS,
|
|
HTTPMAIL_CONTACTINFO,
|
|
HTTPMAIL_POSTCONTACT,
|
|
HTTPMAIL_PATCHCONTACT
|
|
} HTTPMAILCOMMAND;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPMAILGETPROP
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagHTTPMAILGETPROP
|
|
{
|
|
HTTPMAILPROPTYPE type;
|
|
LPSTR pszProp;
|
|
} HTTPMAILGETPROP, *LPHTTPMAILGETPROP;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPMAILGET
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagHTTPMAILGET
|
|
{
|
|
BOOL fTotalKnown; // server provided a content-length (cbTotal is valid)
|
|
DWORD cbIncrement; // bytes in this response
|
|
DWORD cbCurrent; // bytes downloaded so far
|
|
DWORD cbTotal; // total bytes in the response (if fTotalKnown == TRUE)
|
|
LPVOID pvBody; // content bytes
|
|
LPSTR pszContentType;
|
|
} HTTPMAILGET, *LPHTTPMAILGET;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPMAILPOST
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagHTTPMAILPOST
|
|
{
|
|
LPSTR pszLocation;
|
|
BOOL fResend;
|
|
DWORD cbIncrement;
|
|
DWORD cbCurrent;
|
|
DWORD cbTotal;
|
|
} HTTPMAILPOST, *LPHTTPMAILPOST;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPMAILPROPFIND
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagHTTPMAILPROPFIND
|
|
{
|
|
IPropFindMultiResponse *pMultiResponse; // parsed propfind response
|
|
} HTTPMAILPROPFIND, *LPHTTPMAILPROPFIND;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPMAILLOCATION
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagHTTPMAILLOCATION
|
|
{
|
|
LPSTR pszLocation;
|
|
} HTTPMAILLOCATION, *LPHTTPMAILLOCATION;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPMAILBCOPYMOVE
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagHTTPMAILBCOPYMOVE
|
|
{
|
|
LPSTR pszHref;
|
|
LPSTR pszLocation;
|
|
HRESULT hrResult;
|
|
} HTTPMAILBCOPYMOVE, *LPHTTPMAILBCOPYMOVE;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPMAILBCOPYMOVELIST
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagHTTPMAILBCOPYMOVELIST
|
|
{
|
|
ULONG cBCopyMove;
|
|
LPHTTPMAILBCOPYMOVE prgBCopyMove;
|
|
} HTTPMAILBCOPYMOVELIST, *LPHTTPMAILBCOPYMOVELIST;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPMAILMEMBERINFO
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagHTTPMEMBERINFO
|
|
{
|
|
// common properties
|
|
|
|
LPSTR pszHref;
|
|
BOOL fIsFolder;
|
|
|
|
// folder properties
|
|
|
|
LPSTR pszDisplayName;
|
|
BOOL fHasSubs;
|
|
BOOL fNoSubs;
|
|
DWORD dwUnreadCount;
|
|
DWORD dwVisibleCount;
|
|
HTTPMAILSPECIALFOLDER tySpecial;
|
|
|
|
// message properties
|
|
|
|
BOOL fRead;
|
|
BOOL fHasAttachment;
|
|
LPSTR pszTo;
|
|
LPSTR pszFrom;
|
|
LPSTR pszSubject;
|
|
LPSTR pszDate;
|
|
DWORD dwContentLength;
|
|
} HTTPMEMBERINFO, *LPHTTPMEMBERINFO;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPMEMBERINFOLIST
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagHTTPMEMBERINFOLIST
|
|
{
|
|
ULONG cMemberInfo; // count of elements in prgMemberInfo
|
|
LPHTTPMEMBERINFO prgMemberInfo; // array of HTTPMEMBERINFO
|
|
} HTTPMEMBERINFOLIST, *LPHTTPMEMBERINFOLIST;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPMEMBERERROR
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagHTTPMEMBERERROR
|
|
{
|
|
LPSTR pszHref;
|
|
HRESULT hrResult;
|
|
} HTTPMEMBERERROR, *LPHTTPMEMBERERROR;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPMEMBERERRORLIST
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagHTTPMEMBERERRORLIST
|
|
{
|
|
ULONG cMemberError;
|
|
LPHTTPMEMBERERROR prgMemberError;
|
|
} HTTPMEMBERERRORLIST, *LPHTTPMEMBERERRORLIST;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPCONTACTID
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagHTTPCONTACTID
|
|
{
|
|
LPSTR pszHref;
|
|
LPSTR pszId;
|
|
HTTPMAILCONTACTTYPE tyContact;
|
|
LPSTR pszModified;
|
|
} HTTPCONTACTID, *LPHTTPCONTACTID;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPCONTACTIDLIST
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagHTTPCONTACTIDLIST
|
|
{
|
|
ULONG cContactId; // number of elements in prgContactId
|
|
LPHTTPCONTACTID prgContactId; // array cf contact ids
|
|
} HTTPCONTACTIDLIST, *LPHTTPCONTACTIDLIST;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPCONTACTINFO
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagHTTPCONTACTINFO
|
|
{
|
|
LPSTR pszHref;
|
|
LPSTR pszId;
|
|
HTTPMAILCONTACTTYPE tyContact;
|
|
LPSTR pszModified;
|
|
LPSTR pszDisplayName;
|
|
LPSTR pszGivenName;
|
|
LPSTR pszSurname;
|
|
LPSTR pszNickname;
|
|
LPSTR pszEmail;
|
|
LPSTR pszHomeStreet;
|
|
LPSTR pszHomeCity;
|
|
LPSTR pszHomeState;
|
|
LPSTR pszHomePostalCode;
|
|
LPSTR pszHomeCountry;
|
|
LPSTR pszCompany;
|
|
LPSTR pszWorkStreet;
|
|
LPSTR pszWorkCity;
|
|
LPSTR pszWorkState;
|
|
LPSTR pszWorkPostalCode;
|
|
LPSTR pszWorkCountry;
|
|
LPSTR pszHomePhone;
|
|
LPSTR pszHomeFax;
|
|
LPSTR pszWorkPhone;
|
|
LPSTR pszWorkFax;
|
|
LPSTR pszMobilePhone;
|
|
LPSTR pszOtherPhone;
|
|
LPSTR pszBday;
|
|
LPSTR pszPager;
|
|
} HTTPCONTACTINFO, *LPHTTPCONTACTINFO;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPCONTACTINFOLIST
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagHTTPCONTACTINFOLIST
|
|
{
|
|
ULONG cContactInfo;
|
|
LPHTTPCONTACTINFO prgContactInfo;
|
|
} HTTPCONTACTINFOLIST, *LPHTTPCONTACTINFOLIST;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// HTTPMAILRESPONSE
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagHTTPMAILRESPONSE
|
|
{
|
|
HTTPMAILCOMMAND command; // Command for which the response was generated
|
|
DWORD dwContext; // Client context
|
|
BOOL fDone; // Is this the last response for the command
|
|
IXPRESULT rIxpResult; // Result information
|
|
IHTTPMailTransport *pTransport; // Pointer to the HTTPMail transport that generated the response
|
|
|
|
// This is a union of response information based on the command
|
|
[switch_type(HTTPMAILCOMMAND), switch_is((HTTPMAILCOMMAND)command)]
|
|
union
|
|
{
|
|
[case(HTTPMAIL_GETPROP)] HTTPMAILGETPROP rGetPropInfo;
|
|
[case(HTTPMAIL_GET)] HTTPMAILGET rGetInfo;
|
|
[case(HTTPMAIL_PUT)] HTTPMAILPOST rPutInfo;
|
|
[case(HTTPMAIL_POST)] HTTPMAILPOST rPostInfo;
|
|
[case(HTTPMAIL_PROPFIND)] HTTPMAILPROPFIND rPropFindInfo;
|
|
[case(HTTPMAIL_MKCOL)]HTTPMAILLOCATION rMkColInfo;
|
|
[case(HTTPMAIL_COPY)]HTTPMAILLOCATION rCopyMoveInfo;
|
|
[case(HTTPMAIL_BCOPY)]HTTPMAILBCOPYMOVELIST rBCopyMoveList;
|
|
[case(HTTPMAIL_MEMBERINFO)] HTTPMEMBERINFOLIST rMemberInfoList; // response for MemberInfo, FindFolders
|
|
[case(HTTPMAIL_MARKREAD)] HTTPMEMBERERRORLIST rMemberErrorList; // response for MarkRead, BDELETE
|
|
[case(HTTPMAIL_SENDMESSAGE)] HTTPMAILPOST rSendMessageInfo;
|
|
[case(HTTPMAIL_LISTCONTACTS)] HTTPCONTACTIDLIST rContactIdList;
|
|
[case(HTTPMAIL_CONTACTINFO)] HTTPCONTACTINFOLIST rContactInfoList;
|
|
[case(HTTPMAIL_POSTCONTACT)] HTTPCONTACTID rPostContactInfo;
|
|
[case(HTTPMAIL_PATCHCONTACT)] HTTPCONTACTID rPatchContactInfo;
|
|
[default];
|
|
};
|
|
} HTTPMAILRESPONSE, *LPHTTPMAILRESPONSE;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// OnResponse
|
|
//
|
|
// Description
|
|
// Called by IHTTPMailTransport when a command response is received from the HTTP server
|
|
//
|
|
// Paramters
|
|
// pResponse Response information
|
|
//
|
|
// Return values:
|
|
// S_OK The client should always return S_OK
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT OnResponse(
|
|
[in]
|
|
LPHTTPMAILRESPONSE pResponse);
|
|
|
|
HRESULT GetParentWindow(
|
|
[out]
|
|
HWND *phwndParent);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_IHTTPMailTransport
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(B8BDE03C-E548-11d1-A86E-0000F8084F96),
|
|
helpstring("HTTPMail Internet Transport Interface"),
|
|
local,
|
|
]
|
|
interface IHTTPMailTransport : IInternetTransport
|
|
{
|
|
typedef struct tagHTTPTARGETLIST
|
|
{
|
|
ULONG cTarget;
|
|
LPCSTR *prgTarget;
|
|
} HTTPTARGETLIST, *LPHTTPTARGETLIST;
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// InitNew
|
|
//
|
|
// Description:
|
|
// This method Initializes the internet transport. This method be called before
|
|
// the transport can doing anything.
|
|
//
|
|
// Parameters:
|
|
// pszUserAgent User agent string sent in http queries
|
|
//
|
|
// pszLogFilePath Full file path in which to log the protocol commands.
|
|
// NULL is a valid value (no logging)
|
|
// pCallback(required) Specifies the Transport callback interface.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG An invalid parameter was passed in
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT InitNew(
|
|
[in]
|
|
LPCSTR pszUserAgent,
|
|
[in]
|
|
LPCSTR pszLogFilePath,
|
|
[in]
|
|
IHTTPMailCallback *pCallback);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandGET
|
|
// rgszAcceptTypes is a null terminated list of accept types.
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandGET(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
LPCSTR *rgszAcceptTypes,
|
|
[in]
|
|
BOOL fTranslate,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandPUT
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandPUT(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
LPVOID lpvData,
|
|
[in]
|
|
ULONG cbSize,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandPOST
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandPOST(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
IStream *pStream,
|
|
[in]
|
|
LPCSTR pszContentType,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandDELETE
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandDELETE(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandBDELETE
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandBDELETE(
|
|
[in]
|
|
LPCSTR pszSourceCollection,
|
|
[in]
|
|
LPHTTPTARGETLIST pTargets,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandPROPFIND
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandPROPFIND(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
IPropFindRequest *pRequest,
|
|
[in]
|
|
DWORD dwDepth,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandPROPPATCH
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandPROPPATCH(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
IPropPatchRequest *pRequest,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandMKCOL
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandMKCOL(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandCOPY
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandCOPY(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
LPCSTR pszDestination,
|
|
[in]
|
|
BOOL fAllowRename,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandBCOPY
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandBCOPY(
|
|
[in]
|
|
LPCSTR pszSourceCollection,
|
|
[in]
|
|
LPHTTPTARGETLIST pTargets,
|
|
[in]
|
|
LPCSTR pszDestCollection,
|
|
[in]
|
|
LPHTTPTARGETLIST pDestinations,
|
|
[in]
|
|
BOOL fAllowRename,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandMOVE
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandMOVE(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
LPCSTR pszDestination,
|
|
[in]
|
|
BOOL fAllowRename,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandBMOVE
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandBMOVE(
|
|
[in]
|
|
LPCSTR pszSourceCollection,
|
|
[in]
|
|
LPHTTPTARGETLIST pTargets,
|
|
[in]
|
|
LPCSTR pszDestCollection,
|
|
[in]
|
|
LPHTTPTARGETLIST pDestinations,
|
|
[in]
|
|
BOOL fAllowRename,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// GetProperty
|
|
// Retrieves the requested account property synchronously or asynchronously.
|
|
// If the property is immediately available, it is returned synchronously,
|
|
// and the result of the function is S_OK. In the sync case, it is the caller's
|
|
// responsibility to free the property string by calling CoTaskMemFree.
|
|
// If the property is not available immediately, the function result is
|
|
// E_PENDING, and the result is returned via a call to the callback's
|
|
// OnResponse method.
|
|
//
|
|
// The caller can force the call to return async by passing a null ppszProp.
|
|
// The call CANNOT force the call to return sync.
|
|
//
|
|
// Returns: if requesting the root props succeeded, and the server returned
|
|
// xml that did not contain the specific root property requested by the client,
|
|
// the return value will be IXP_E_HTTP_ROOT_PROP_NOT_FOUND.
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT GetProperty(
|
|
[in]
|
|
HTTPMAILPROPTYPE proptype,
|
|
[out]
|
|
LPSTR *ppszProp);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// MemberInfo
|
|
//
|
|
// Description:
|
|
// This method is called to discover folders, messages, and specific properties
|
|
// of folders and messages.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pszPath null terminated string that is the complete path
|
|
// to the resource (or collection)
|
|
// examples:
|
|
// a message: "http://www.hotmail.com/inbox/msg12345
|
|
// a folder: "http://www.hotmail.com/inbox/"
|
|
// MEMBERINFOFLAGS flags that define which properties should be requested
|
|
// dwDepth maps to the DAV depth header. Can be an integer or the
|
|
// constant DEPTH_INFINITY. A depth of 0 means request
|
|
// properties on the resource at pszPath. A depth of
|
|
// 1 means request properties on the resource at pszPath
|
|
// and at all of its first-level children, etc.
|
|
// fIncludeRoot boolean indicating whether or not to include the item
|
|
// at pszPath in the response. Maps to the "noroot" token
|
|
// optionally included in the DAV depth header. To request
|
|
// properties on all of the first-level members of a
|
|
// resource, and omit the resource itself from the response,
|
|
// set dwDepth = 1 and fIncludeRoot = FALSE.
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT MemberInfo(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
MEMBERINFOFLAGS flags,
|
|
[in]
|
|
DWORD dwDepth,
|
|
[in]
|
|
BOOL fIncludeRoot,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// FindFolders
|
|
//
|
|
// Description:
|
|
// This method is called to discover the collection hierarchy that exists underneath
|
|
// the pszPath URL. The response is identical to the MemberInfo response. This method
|
|
// causes a non-DAV 1.0 verb (SEARCH) to be sent to the server. Callers should be
|
|
// prepared to fallback to other forms of folder discovery if this method fails.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pszPath null terminated string that is the complete path
|
|
// to the root of the folder hiearchy. The collection at
|
|
// pszPath will not be included in the response.
|
|
//
|
|
// dwContext context provided by caller.
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT FindFolders(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// MarkRead
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT MarkRead(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
LPHTTPTARGETLIST pTargets,
|
|
[in]
|
|
BOOL fMarkRead,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// SendMessage:
|
|
// Send a message using an http server that supports the http-based RFC821
|
|
// send protocol.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pszPath "sendmsg" url. server url that can receive
|
|
// "POST" commands with request bodies that
|
|
// conform to the http mail spec.
|
|
// pszFrom The "from" address associated with the outbound
|
|
// mail. This address must be of the form:
|
|
// [email protected]
|
|
// pTargets List of e-mail address that will receive
|
|
// copies of the message. This list should include
|
|
// all direct recipients as well as "cc" and "bcc"
|
|
// recipients. Addresses must be of the form:
|
|
// [email protected]
|
|
// fSaveInSent Indicates whether or not the server should save
|
|
// a copy of the outbound message in the users
|
|
// "Sent Items" folder. It is up to the server
|
|
// to determine the specific behavior associated
|
|
// with saving an outboundmessage.
|
|
// pMessageStream A stream that contains an rfc822 compliant
|
|
// message. The contents of this stream are not
|
|
// validated by this API. It is the responsibility
|
|
// of the caller to insure that the message is
|
|
// rfc822 compliant.
|
|
// dwContext A dword which indentifies the specific request.
|
|
// This dword will be included in all async responses,
|
|
// and enables the caller to uniquely identify the request.
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT SendMessage(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
LPCSTR pszFrom,
|
|
[in]
|
|
LPHTTPTARGETLIST pTargets,
|
|
[in]
|
|
BOOL fSaveInSent,
|
|
[in]
|
|
IStream *pMessageStream,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// ListContacts
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT ListContacts(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// ListContactInfos : temporary method. pszPath is assumed to be a collection.
|
|
// returns all contacts in the specified collection. this method will go away
|
|
// when the hotmail server supports bpropfind. response is contained in the
|
|
// rContactInfoList and the command is the same as ContactInfo.
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT ListContactInfos(
|
|
[in]
|
|
LPCSTR pszCollectionPath,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// ContactInfo
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT ContactInfo(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// PostContact
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT PostContact(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
LPHTTPCONTACTINFO pciInfo,
|
|
[in]
|
|
DWORD dwContext);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// PatchContact
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT PatchContact(
|
|
[in]
|
|
LPCSTR pszPath,
|
|
[in]
|
|
LPHTTPCONTACTINFO pciInfo,
|
|
[in]
|
|
DWORD dwContext);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_IPOP3Callback
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(0DF2C7E3-3435-11d0-81D0-00C04FD85AB4),
|
|
helpstring("POP3 Callback Interface"),
|
|
local,
|
|
]
|
|
interface IPOP3Callback : ITransportCallback
|
|
{
|
|
// -----------------------------------------------------------------------------------
|
|
// POP3COMMAND
|
|
// -----------------------------------------------------------------------------------
|
|
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;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// POP3RETR
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagPOP3RETR {
|
|
BOOL fHeader; // The full rfc/mime header has been downloaded.
|
|
BOOL fBody; // The body has been downloaded.
|
|
DWORD dwPopId; // POP session message id
|
|
DWORD cbSoFar; // Number of bytes downloaded since start of download
|
|
LPSTR pszLines; // Lines of the message (do not free this).
|
|
ULONG cbLines; // Number of bytes in pszLines
|
|
} POP3RETR, *LPPOP3RETR;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// POP3TOP
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagPOP3TOP {
|
|
BOOL fHeader; // The header has been downloaded.
|
|
BOOL fBody; // The body has been downloaded.
|
|
DWORD dwPopId; // POP session message id
|
|
DWORD cPreviewLines; // Number of lines being previewed
|
|
DWORD cbSoFar; // Number of bytes downloaded since start of download
|
|
LPSTR pszLines; // Header lines
|
|
ULONG cbLines; // Number of bytes in pszLines
|
|
} POP3TOP, *LPPOP3TOP;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// POP3LIST
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagPOP3LIST {
|
|
DWORD dwPopId; // POP session message id
|
|
DWORD cbSize; // Message Size
|
|
} POP3LIST, *LPPOP3LIST;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// POP3UIDL
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagPOP3UIDL {
|
|
DWORD dwPopId; // POP session message id
|
|
LPSTR pszUidl; // POP UIDL
|
|
} POP3UIDL, *LPPOP3UIDL;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// POP3STAT
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagPOP3STAT {
|
|
DWORD cMessages; // Number of messages on the server
|
|
DWORD cbMessages; // Number of bytes of messages on the server
|
|
} POP3STAT, *LPPOP3STAT;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// POP3RESPONSE
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagPOP3RESPONSE {
|
|
POP3COMMAND command; // Command in which the response was generated for
|
|
BOOL fDone; // Was this the last response for this command
|
|
IXPRESULT rIxpResult; // Result Information
|
|
IPOP3Transport *pTransport; // Pointer to the POP3 transport that generated the response
|
|
BOOL fValidInfo; // The data in the union below is valid. This can be FALSE due to the
|
|
// fact that the fDone == TRUE response can be received with
|
|
// no data.
|
|
|
|
// This is a union of response information based on the command
|
|
[switch_type(POP3COMMAND), switch_is((POP3COMMAND)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];
|
|
};
|
|
} POP3RESPONSE, *LPPOP3RESPONSE;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// OnResponse
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT OnResponse(
|
|
[in]
|
|
LPPOP3RESPONSE pResponse);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_IPOP3Transport
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(0DF2C7E4-3435-11d0-81D0-00C04FD85AB4),
|
|
helpstring("POP3 Internet Transport Interface"),
|
|
local,
|
|
]
|
|
interface IPOP3Transport : IInternetTransport
|
|
{
|
|
// -----------------------------------------------------------------------------------
|
|
// POP3 Group/List/Single Item commands
|
|
// -----------------------------------------------------------------------------------
|
|
typedef enum tagPOP3CMDTYPE {
|
|
POP3CMD_GET_POPID,
|
|
POP3CMD_GET_MARKED,
|
|
POP3CMD_GET_ALL
|
|
} POP3CMDTYPE;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// InitNew
|
|
//
|
|
// Description:
|
|
// This method Initializes the internet transport. This method be called before
|
|
// the transport can doing anything.
|
|
//
|
|
// Parameters:
|
|
// pszLogFilePath Full file path in which to log the protocol commands.
|
|
// NULL is a valid value (no logging)
|
|
// pCallback(required) Specifies the Transport callback interface.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG An invalid parameter was passed in
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT InitNew(
|
|
[in]
|
|
LPSTR pszLogFilePath,
|
|
[in]
|
|
IPOP3Callback *pCallback);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// MarkItem
|
|
// -----------------------------------------------------------------------------------
|
|
typedef enum tagPOP3MARKTYPE {
|
|
POP3_MARK_FOR_TOP = 0x00000001,
|
|
POP3_MARK_FOR_RETR = 0x00000002,
|
|
POP3_MARK_FOR_DELE = 0x00000004,
|
|
POP3_MARK_FOR_UIDL = 0x00000008,
|
|
POP3_MARK_FOR_LIST = 0x00000010
|
|
} POP3MARKTYPE;
|
|
|
|
HRESULT MarkItem(
|
|
[in]
|
|
POP3MARKTYPE marktype,
|
|
[in]
|
|
DWORD dwPopId,
|
|
[in]
|
|
boolean fMarked);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandAUTH
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandAUTH(
|
|
[in]
|
|
LPSTR pszAuthType);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandUSER
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandUSER(
|
|
[in]
|
|
LPSTR pszUserName);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandPass
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandPASS(
|
|
[in]
|
|
LPSTR pszPassword);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandLIST
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandLIST(
|
|
[in]
|
|
POP3CMDTYPE cmdtype,
|
|
[in]
|
|
DWORD dwPopId);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandTOP
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandTOP(
|
|
[in]
|
|
POP3CMDTYPE cmdtype,
|
|
[in]
|
|
DWORD dwPopId,
|
|
[in]
|
|
DWORD cPreviewLines);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandQUIT
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandQUIT(void);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandSTAT
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandSTAT(void);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandNOOP
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandNOOP(void);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandRSET
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandRSET(void);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandUIDL
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandUIDL(
|
|
[in]
|
|
POP3CMDTYPE cmdtype,
|
|
[in]
|
|
DWORD dwPopId);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandDELE
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandDELE(
|
|
[in]
|
|
POP3CMDTYPE cmdtype,
|
|
[in]
|
|
DWORD dwPopId);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandRETR
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandRETR(
|
|
[in]
|
|
POP3CMDTYPE cmdtype,
|
|
[in]
|
|
DWORD dwPopId);
|
|
}
|
|
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_INNTPCallback
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(0DF2C7E6-3435-11d0-81D0-00C04FD85AB4),
|
|
helpstring("NNTP Callback Interface"),
|
|
local,
|
|
]
|
|
interface INNTPCallback : ITransportCallback
|
|
{
|
|
// -----------------------------------------------------------------------------------
|
|
// NNTPSTATE - These are the various states the NNTP Transport can be in. These
|
|
// states are also used to determine which type of data is being returned
|
|
// in the client's OnResponse() callback.
|
|
// -----------------------------------------------------------------------------------
|
|
typedef enum tagNNTPSTATE {
|
|
NS_DISCONNECTED, // not connected
|
|
NS_CONNECT, // awaiting connect response
|
|
NS_AUTHINFO, // awaiting authorization
|
|
NS_POST, // awaiting CommandPOST() to complete
|
|
NS_IDLE, // connected (& authorized if necessary)
|
|
NS_LIST, // awaiting LIST data
|
|
NS_LISTGROUP, // awaiting LISTGROUP data
|
|
NS_NEWGROUPS, // awaiting NEWGROUPS data
|
|
NS_GROUP, // awaiting GROUP response
|
|
NS_LAST, // awaiting LAST response
|
|
NS_NEXT, // awaiting NEXT response
|
|
NS_STAT, // awaiting STAT response
|
|
NS_ARTICLE, // awaiting ARTICLE data
|
|
NS_HEAD, // awaiting HEAD data
|
|
NS_BODY, // awaiting BODY data
|
|
NS_DATE, // awaiting DATE response
|
|
NS_MODE, // awaiting MODE response
|
|
NS_QUIT, // awaiting QUIT response
|
|
NS_HEADERS, // awaiting XOVER or XHDR data from GetHeaders()
|
|
NS_XHDR // awaiting XHDR data
|
|
} NNTPSTATE;
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// NNTPGROUP - This is the response from the CommandGROUP() function. The data is
|
|
// the current status of the group that was switched to.
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagNNTPGROUP {
|
|
DWORD dwCount; // Estimated number of articles in the group
|
|
DWORD dwFirst; // First article number in the group
|
|
DWORD dwLast; // Last article number in the group
|
|
LPSTR pszGroup; // Name of the group
|
|
} NNTPGROUP, *LPNNTPGROUP;
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// NNTPNEXT - This structure will be used for the response from CommandNEXT(),
|
|
// CommandLAST(), and CommandSTAT(). The data returned is the article
|
|
// number and message id for the article that is selected by the command
|
|
// that was issued.
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagNNTPNEXT {
|
|
DWORD dwArticleNum; // Article number
|
|
LPSTR pszMessageId; // Message ID
|
|
} NNTPNEXT, *LPNNTPNEXT;
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// NNTPARTICLE - This structure returns the data from a CommandARTICLE() function.
|
|
// Depending on the size of the article being retrieved, the callback
|
|
// may recieve multiple calls for a single article. When fDone is TRUE
|
|
// then all of the article data has been retrieved. pszLines is not
|
|
// accumulated over all of the callbacks, it is the client's
|
|
// responsibility to assemble all of the pszLines that are returned to
|
|
// build the message.
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagNNTPARTICLE {
|
|
DWORD dwArticleNum; // Article number
|
|
LPSTR pszMessageId; // Message ID
|
|
LPSTR pszLines; // Lines of the message
|
|
ULONG cbLines; // Number of bytes in pszLines
|
|
ULONG cLines; // Number of lines in pszLines
|
|
DWORD dwReserved; // Reserved for system use
|
|
} NNTPARTICLE, *LPNNTPARTICLE;
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// NNTPLIST - This structure is the data returned from the CommandLIST() function.
|
|
// Since the NNTP LIST command can have multiple extensions, the data
|
|
// returned is relatively unparsed to provide greater flexibility to the
|
|
// client. The data is returned in array of NULL terminated strings that
|
|
// contain the lines returned from the server. When fDone is TRUE, then
|
|
// all of the data has been retrieved. rgszLines is not accumulated by
|
|
// the transport between calls to OnResponse(). It is the client's
|
|
// responsibility to store this information as it comes in.
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagNNTPLIST {
|
|
DWORD cLines; // Number of lines returned
|
|
LPSTR *rgszLines; // Array of lines returned by the LIST command. The
|
|
// number of lines in rgszLines is cLines. The recipient
|
|
// must call INNTPCallback::FreeListResponse() to free
|
|
// this structure.
|
|
} NNTPLIST, *LPNNTPLIST;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// NNTPLISTGROUP - This structure is sent in response to a CommandLISTGROUP() call.
|
|
// rgArticles is an array of article numbers that are contained in
|
|
// the newsgroup. Since there can be quite a few articles,
|
|
// OnResponse() may be called multiple times with the data as it
|
|
// arrives. rgArticles is not accumulated between calls to
|
|
// OnResponse() so it is up to the client to store this information
|
|
// as it arrives. fDone will be TRUE when all the information has
|
|
// been returned.
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagNNTPLISTGROUP {
|
|
DWORD cArticles; // Number of article numbers in rgArticles
|
|
DWORD *rgArticles; // Array of article numbers available in the group
|
|
} NNTPLISTGROUP, *LPNNTPLISTGROUP;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// NNTPHEADER - This structure contains the parsed information for a single header
|
|
// returned from the GetHeaders() command. An array of these headers
|
|
// is contained in the NNTPHEADERRESP struct.
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagNNTPHEADER {
|
|
DWORD dwArticleNum; // Article number
|
|
LPSTR pszSubject; // Article subject
|
|
LPSTR pszFrom; // Who the article is from
|
|
LPSTR pszDate; // Date the article was posted
|
|
LPSTR pszMessageId; // Message id
|
|
LPSTR pszReferences; // References
|
|
DWORD dwBytes; // Size of the message in bytes (might not be filled in)
|
|
DWORD dwLines; // Size of the message in lines
|
|
LPSTR pszXref; // XREF: header for cross post managment
|
|
} NNTPHEADER, *LPNNTPHEADER;
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// NNTPHEADERRESP - This structure will be returned in response to the GetHeaders()
|
|
// command. Since the number of headers requested may be large,
|
|
// OnResponse() may be called multiple times in response to this
|
|
// command. rgHeaders is not accumulated by the transport between
|
|
// calls to OnResponse() therefore it is the responsibility of the
|
|
// caller to store this information as it is retrieved. When all
|
|
// the data is retrieved, then fDone will be set to TRUE. Since
|
|
// not all servers provide the XREF: header in their XOVER records,
|
|
// fSupportsXRef will be set to TRUE if the pszXref field in
|
|
// NNTPHEADER is valid. If this is FALSE, the client can retrieve
|
|
// this header with a call to CommandXHDR().
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagNNTPHEADERRESP {
|
|
DWORD cHeaders; // Number of headers in rgHeaders
|
|
LPNNTPHEADER rgHeaders; // Array of header structures
|
|
BOOL fSupportsXRef; // TRUE if the headers have a valid pszXref value.
|
|
// Otherwise, the client needs to issue an XHdr to
|
|
// retrieve that value if they're interested.
|
|
DWORD dwReserved; // Reserved for system use
|
|
} NNTPHEADERRESP, *LPNNTPHEADERRESP;
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// NNTPXHDR - An array of these structures will be returned in the NNTPXHDRRESP
|
|
// structure.
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagNNTPXHDR {
|
|
DWORD dwArticleNum; // Article number this header is for
|
|
LPSTR pszHeader; // Requested article header for this article
|
|
} NNTPXHDR, *LPNNTPXHDR;
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// NNTPXHDRRESP - This will be returned in response to a CommandXHDR() call. Since
|
|
// the number of headers returned is potentially large, OnResponse()
|
|
// may be called multiple times in response to this command. rgHeaders
|
|
// is not accumulated between calls to OnResponse(), therefore it is
|
|
// up to the client to store this data as it arrives. fDone will be
|
|
// set to TRUE when all of the headers have been returned.
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagNNTPXHDRRESP {
|
|
DWORD cHeaders; // Number of header values in rgHeaders
|
|
LPNNTPXHDR rgHeaders; // Array of NNTPXHDR structs containing the requested headers
|
|
DWORD dwReserved; // Reserved for system use
|
|
} NNTPXHDRRESP, *LPNNTPXHDRRESP;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// NNTPRESPONSE - This structure is the general holder for all of the data returned
|
|
// from the INNTPTransport commands. The state member tells the
|
|
// receiver which command this data is in response to. If fMustRelease
|
|
// is TRUE, then when the client is done with this data, it should
|
|
// call INNTPTransport::ReleaseResponse() to free that memory. See
|
|
// the explanation of the various structures to see the details on
|
|
// each type of response.
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagNNTPRESPONSE {
|
|
NNTPSTATE state; // Command in which the response was generated for
|
|
BOOL fMustRelease; // TRUE if the data contained within this struct must be
|
|
// freed with a call to INNTPTransport::ReleaseResponse()
|
|
BOOL fDone; // TRUE when there is no more data that will arrive for this
|
|
// command
|
|
IXPRESULT rIxpResult; // Result Information
|
|
INNTPTransport *pTransport; // Pointer to the NNTP transport that generated the response
|
|
|
|
// This is a union of response information based on the command
|
|
[switch_type(NNTPSTATE), switch_is((NNTPSTATE) state)]
|
|
union {
|
|
[case(NS_GROUP)] NNTPGROUP rGroup;
|
|
[case(NS_LAST)] NNTPNEXT rLast;
|
|
[case(NS_NEXT)] NNTPNEXT rNext;
|
|
[case(NS_STAT)] NNTPNEXT rStat;
|
|
[case(NS_ARTICLE)] NNTPARTICLE rArticle;
|
|
[case(NS_HEAD)] NNTPARTICLE rHead;
|
|
[case(NS_BODY)] NNTPARTICLE rBody;
|
|
[case(NS_LIST)] NNTPLIST rList;
|
|
[case(NS_LISTGROUP)] NNTPLISTGROUP rListGroup;
|
|
[case(NS_NEWGROUPS)] NNTPLIST rNewgroups;
|
|
[case(NS_DATE)] SYSTEMTIME rDate;
|
|
[case(NS_HEADERS)] NNTPHEADERRESP rHeaders;
|
|
[case(NS_XHDR)] NNTPXHDRRESP rXhdr;
|
|
[default];
|
|
};
|
|
} NNTPRESPONSE, *LPNNTPRESPONSE;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// OnResponse
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT OnResponse(
|
|
[in]
|
|
LPNNTPRESPONSE pResponse);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_INNTPTransport
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(0DF2C7E5-3435-11d0-81D0-00C04FD85AB4),
|
|
helpstring("NNTP Internet Transport Interface"),
|
|
local,
|
|
]
|
|
interface INNTPTransport : IInternetTransport
|
|
{
|
|
// -----------------------------------------------------------------------------------
|
|
// AUTHTYPE
|
|
// -----------------------------------------------------------------------------------
|
|
typedef enum tagAUTHTYPE {
|
|
AUTHTYPE_USERPASS,
|
|
AUTHTYPE_SIMPLE,
|
|
AUTHTYPE_SASL
|
|
} AUTHTYPE;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// AUTHINFO - This structure is used to specify the type of authentication to use
|
|
// in the CommandAUTHINFO() command. For AUTHTYPE_USERPASS and
|
|
// AUTHTYPE_SIMPLE, pszUser and pszPass are the user name and password
|
|
// to send with the command.
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagNNTPAUTHINFO {
|
|
AUTHTYPE authtype;
|
|
LPSTR pszUser;
|
|
LPSTR pszPass;
|
|
} NNTPAUTHINFO, *LPNNTPAUTHINFO;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// ARTICLEIDTYPE
|
|
// -----------------------------------------------------------------------------------
|
|
typedef enum tagARTICLEIDTYPE {
|
|
AID_MSGID,
|
|
AID_ARTICLENUM
|
|
} ARTICLEIDTYPE;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// ARTICLEID
|
|
//
|
|
// This structure is used to specify an article id to the various NNTP commands that
|
|
// require one (i.e. ARTICLE, BODY, STAT). These commands accept either a message-id
|
|
// or if the user is current in a the context of a newsgroup the article number within
|
|
// that group. When filling in this structure the user should set idType to either
|
|
// AID_MSGID of pszMessageId is valid, or AID_ARTICLENUM if dwArticleNum.
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct ARTICLEID {
|
|
ARTICLEIDTYPE idType;
|
|
[switch_type(ARTICLEIDTYPE), switch_is((ARTICLEIDTYPE)idType)]
|
|
union {
|
|
[case(AID_MSGID)]
|
|
LPSTR pszMessageId;
|
|
[case(AID_ARTICLENUM)]
|
|
DWORD dwArticleNum;
|
|
[default];
|
|
};
|
|
} ARTICLEID, *LPARTICLEID;
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// NNTPMESSAGE
|
|
//
|
|
// This structure provides the information needed to post a message to the news server
|
|
// using the POST command.
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagNNTPMESSAGE {
|
|
ULONG cbSize; // Size of the message in bytes
|
|
LPSTREAM pstmMsg; // Stream containing a ANSI MIME/rfc822/rfc1036 message stream
|
|
} NNTPMESSAGE, *LPNNTPMESSAGE;
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// RANGE
|
|
//
|
|
// The range structure allows the caller to provide arguments for commands that allow
|
|
// a range of headers to be retrieved. The range structure can be used to specify a
|
|
// single number (ie XOVER 2010), or bounded range (ie XOVER 2000-2010) to request all
|
|
// of the headers within that range [inclusive]. Use the idType field to specify
|
|
// which range you are requesting.
|
|
// -----------------------------------------------------------------------------------
|
|
typedef enum tagRANGETYPE {
|
|
RT_SINGLE, // num
|
|
RT_RANGE, // num-num
|
|
} RANGETYPE;
|
|
|
|
typedef struct tagRANGE {
|
|
RANGETYPE idType;
|
|
DWORD dwFirst;
|
|
DWORD dwLast;
|
|
} RANGE, *LPRANGE;
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// InitNew
|
|
//
|
|
// Description:
|
|
// This method Initializes the internet transport. This method be called before
|
|
// the transport can doing anything.
|
|
//
|
|
// Parameters:
|
|
// pszLogFilePath Full file path in which to log the protocol commands.
|
|
// NULL is a valid value (no logging)
|
|
// pCallback(required) Specifies the Transport callback interface.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG An invalid parameter was passed in
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT InitNew(
|
|
[in]
|
|
LPSTR pszLogFilePath,
|
|
[in]
|
|
INNTPCallback *pCallback);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandAUTHINFO
|
|
//
|
|
// Description:
|
|
// The function issues an NNTPAUTHINFO command to the server along with the information
|
|
// provided in the pszAuth parameter. RFC 977 provides the following formats as
|
|
// valid AUTHINFO commands:
|
|
//
|
|
// AUTHINFO USER name|PASS password
|
|
// AUTHINFO SIMPLE
|
|
// user password
|
|
//
|
|
//
|
|
// Parameters:
|
|
// pAuthInfo
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG An invalid parameter was passed in
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandAUTHINFO(
|
|
[in]
|
|
LPNNTPAUTHINFO pAuthInfo);
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandGROUP
|
|
//
|
|
// Description:
|
|
// The function issues an GROUP command to the server. The server's response string
|
|
// will be returned to the INNTPCallback::OnResponse().
|
|
//
|
|
// Parameters:
|
|
// pszGroup Name of the newsgroup to enter.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG pszGroup is not a valid string pointer
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandGROUP(
|
|
[in]
|
|
LPSTR pszGroup);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandLAST
|
|
//
|
|
// Description:
|
|
// This function issues the LAST command to the server. This has the effect of
|
|
// moving the current article pointer to the article immediately preceeding the
|
|
// current article pointer in the newsgroup. This command is only valid if a GROUP
|
|
// command has been issued previously. The article number and message-id pointed to
|
|
// by the new current article pointer are returned in INNTPCallback::OnResponse().
|
|
//
|
|
// Returns:
|
|
// S_OK
|
|
// E_OUTOFMEMORY
|
|
// IXP_E_NOT_INIT
|
|
// IXP_E_NOT_CONNECTED
|
|
// IXP_E_BUSY
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandLAST(void);
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandNEXT
|
|
//
|
|
// Description:
|
|
// This function issues the NEXT command to the server. This has the effect of
|
|
// moving the current article pointer to the article immediately after the current
|
|
// article pointer in the newsgroup. This command is only valid if a GROUP command
|
|
// has been issued previously. The article number and message-id pointed to by the
|
|
// new current article pointer are returned in INNTPCallback::OnResponse().
|
|
//
|
|
// Returns:
|
|
// S_OK
|
|
// E_OUTOFMEMORY
|
|
// IXP_E_NOT_INIT
|
|
// IXP_E_NOT_CONNECTED
|
|
// IXP_E_BUSY
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandNEXT(void);
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandSTAT
|
|
//
|
|
// Description:
|
|
// The function issues a STAT command to the server. If an article is specified
|
|
// then this command has the effect of moving the current article pointer to the
|
|
// specified message and returns the article number and message-id of the new current
|
|
// article. Otherwise, the function will return the article number and message-id
|
|
// of the current article.
|
|
//
|
|
// Parameters:
|
|
// pArticleId (optional) Article number or message-id of the article to
|
|
// retrieve status for. If a message-id is specified
|
|
// the current article pointer will NOT be updated.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG pArticleId is not valid
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
// IXP_E_NOT_INIT
|
|
// IXP_E_NOT_CONNECTED
|
|
// IXP_E_BUSY
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandSTAT(
|
|
[in]
|
|
LPARTICLEID pArticleId);
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandARTICLE
|
|
//
|
|
// Description:
|
|
// This function is used to request an article from the server. If the caller has
|
|
// previously issued a GROUP command then the article can be specified by either
|
|
// article number or message-id. If the GROUP command has not been issued, then the
|
|
// article can only be requested by message-id.
|
|
//
|
|
// Parameters:
|
|
// pArticleId Either the article number or message-id of the article
|
|
// to retrieve.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG An invalid parameter was passed in
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandARTICLE(
|
|
[in]
|
|
LPARTICLEID pArticleId);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandHEAD
|
|
//
|
|
// Description:
|
|
// This function retrieves just the header for the requested article. If the caller
|
|
// has previously issued a GROUP command, then the article can be specified by either
|
|
// article number or message-id. Otherwise, the article must be requested by
|
|
// message-id. The provided stream will be filled and returned to the caller in
|
|
// INNTPCallback::OnResponse().
|
|
//
|
|
// Parameters:
|
|
// pArticleId Structure specifying the article to retreive the
|
|
// header for.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG An invalid parameter was passed in
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandHEAD(
|
|
[in]
|
|
LPARTICLEID pArticleId);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandBODY
|
|
//
|
|
// Description:
|
|
// This function retrieves just the body for the requested article. If the caller
|
|
// has previously issued a GROUP command, then the article can be specified by either
|
|
// article number or message-id. Otherwise, the article must be requested by
|
|
// message-id. The provided stream will be filled and returned to the caller in
|
|
// INNTPCallback::OnResponse().
|
|
//
|
|
// Parameters:
|
|
// pArticleId Structure specifying the article to retreive the
|
|
// body for.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG An invalid parameter was passed in
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandBODY(
|
|
[in]
|
|
LPARTICLEID pArticleId);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandPOST
|
|
//
|
|
// Description:
|
|
// Posts the specified message to the server.
|
|
//
|
|
// Parameters:
|
|
// pMessage Specifies a stream that contains a valid RFC1036
|
|
// message.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG An invalid parameter was passed in
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandPOST(
|
|
[in]
|
|
LPNNTPMESSAGE pMessage);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandLIST
|
|
//
|
|
// Description:
|
|
// Sends a LIST command to the news server. If pszArgs is NULL, then the command will
|
|
// retrieve a list of newsgroups available on the news server. The pszArgs parameter
|
|
// can be used to issue one of the various extensions to the LIST command, ie.
|
|
// LIST NEWSGROUPS, LIST ACTIVE, LIST OVERVIEW.FMT, or LIST SUBSCRIPTIONS. See
|
|
// RFC 977 at http://ds.internic.net/rfc/rfc977.txt for a full list of extensions.
|
|
//
|
|
// Parameters:
|
|
// pszArgs Any optional parameters that the user wants to
|
|
// send with the LIST command. See the "Description"
|
|
// above for more details.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG An invalid parameter was passed in
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandLIST(
|
|
[in]
|
|
LPSTR pszArgs);
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandLISTGROUP
|
|
//
|
|
// Description:
|
|
// Retrieves a list of all the article numbers in a particular news group. If the
|
|
// caller specifies a newsgroup name, then the articles are listed for the specified
|
|
// newsgroup. Otherwise, the currently selected newsgroup is listed. NOTE - this
|
|
// command will reset the current article pointer is reset to the first article in
|
|
// the newsgroup that was specified.
|
|
//
|
|
// Parameters:
|
|
// pszGroup Optional newsgroup name to list articles for.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG An invalid parameter was passed in
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandLISTGROUP(
|
|
[in]
|
|
LPSTR pszGroup);
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandNEWGROUPS
|
|
//
|
|
// Description:
|
|
// Retrieves the list of newsgroups which have been added to the server since the
|
|
// date specified in stLast. The caller can restrict the list by specifying a list
|
|
// of distributions in pszDist. For example:
|
|
//
|
|
// CommandNEWGROUPS(&stLast, "alt.tv")
|
|
//
|
|
// will return the list of newsgroups that begin with "alt.tv" that have been added
|
|
// to the server since the time in stLast.
|
|
//
|
|
// Parameters:
|
|
// pstLast The time to specify as the last time groups were checked.
|
|
// pszDist Distributions to check. This can be a single dist
|
|
// such as "alt" or a list of dists such as "alt.tv,comp".
|
|
// The list of distributions must be separated by commas.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG An invalid parameter was passed in
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandNEWGROUPS(
|
|
[in]
|
|
SYSTEMTIME *pstLast,
|
|
[in]
|
|
LPSTR pszDist);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandDATE
|
|
//
|
|
// Description:
|
|
// Retrieves the date and time from the news server.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG An invalid parameter was passed in
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandDATE(void);
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandMODE
|
|
//
|
|
// Description:
|
|
// Issues a MODE command to the server. pszMode is a required argument, an example
|
|
// of which are "MODE READER" to tell the server that the connection is for a user
|
|
// instead of another server. Refer to RFC977 for more details.
|
|
//
|
|
// Parameters:
|
|
// pszMode Required argument to the MODE command.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG An invalid parameter was passed in
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandMODE(
|
|
[in]
|
|
LPSTR pszMode);
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandXHDR
|
|
//
|
|
// Description:
|
|
// Issues an XHDR command to the server. This command can specify a range of
|
|
// messages or a single message to retrieve the header from. If pRange is NULL and
|
|
// pszMessageId is NULL the the header is retrieved from the message pointed to by
|
|
// the server's current message pointer (see STAT, NEXT, LAST).
|
|
//
|
|
// Parameters:
|
|
// pszHeader Which header to retrieve. IE "subject" or "xref"
|
|
// pRange (optional) Range of messages to retrieve the header from
|
|
// pszMessageId (optional) Message ID of the mesage to retrieve the header from
|
|
//
|
|
// Returns:
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandXHDR(
|
|
[in]
|
|
LPSTR pszHeader,
|
|
[in]
|
|
LPRANGE pRange,
|
|
[in]
|
|
LPSTR pszMessageId);
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// CommandQUIT()
|
|
//
|
|
// Description:
|
|
// Issues a QUIT command to the server and terminates the connect.
|
|
//
|
|
// Returns:
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT CommandQUIT(void);
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// GetHeaders
|
|
//
|
|
// Description:
|
|
// Retrieves an array of headers from the server. If a GROUP command has not been
|
|
// previously sent this command is not valid.
|
|
//
|
|
// This function will first try to retrieve the specifed range of headers using
|
|
// the XOVER command. If the server doesn't support XOVER, then the function will
|
|
// try other methods such as a series of XHDR commands.
|
|
//
|
|
// Parameters:
|
|
// pRange The range of headers to request. See the
|
|
// documentation for the RANGE structure above to see
|
|
// how to specify a range.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG An invalid parameter was passed in
|
|
// E_OUTOFMEMORY An memory allocation failed
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT GetHeaders(
|
|
[in]
|
|
LPRANGE pRange);
|
|
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// ReleaseResponse()
|
|
//
|
|
// Description:
|
|
// This function is used to free data returned to the client's OnResponse() callback.
|
|
//
|
|
// Parameters:
|
|
// pResponse A pointer to the NNTPRESPONSE structure passed to the
|
|
// OnResponse() callback.
|
|
//
|
|
// Returns:
|
|
// E_INVALIDARG An invalid parameter was passed in
|
|
//
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT ReleaseResponse(
|
|
[in]
|
|
LPNNTPRESPONSE pResponse);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_INNTPTransport2
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(0DF2C7ED-3435-11d0-81D0-00C04FD85AB4),
|
|
helpstring("NNTP Transport 2 Interface"),
|
|
local,
|
|
]
|
|
interface INNTPTransport2 : INNTPTransport
|
|
{
|
|
//***************************************************************************
|
|
// Function: SetWindow
|
|
//
|
|
// Purpose:
|
|
// This function creates a new window for async winsock processing
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT SetWindow(void);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: ResetWindow
|
|
//
|
|
// Purpose:
|
|
// This function closes a window for async winsock processing
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT ResetWindow(void);
|
|
}
|
|
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_IRASCallback
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(36D88911-3CD6-11d0-81DF-00C04FD85AB4),
|
|
helpstring("RAS Callback Interface"),
|
|
local,
|
|
]
|
|
interface IRASCallback : IUnknown
|
|
{
|
|
// -----------------------------------------------------------------------------------
|
|
// OnReconnect
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT OnReconnect(
|
|
[in]
|
|
LPSTR pszCurrentConnectoid,
|
|
[in]
|
|
LPSTR pszNewConnectoid,
|
|
[in]
|
|
IRASTransport *pTransport);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// OnLogonPrompt
|
|
// -----------------------------------------------------------------------------------
|
|
typedef struct tagIXPRASLOGON {
|
|
CHAR szConnectoid[CCHMAX_CONNECTOID];
|
|
CHAR szUserName[CCHMAX_USERNAME];
|
|
CHAR szPassword[CCHMAX_PASSWORD];
|
|
CHAR szDomain[CCHMAX_DOMAIN];
|
|
CHAR szPhoneNumber[CCHMAX_PHONE_NUMBER];
|
|
BOOL fSavePassword;
|
|
} IXPRASLOGON, *LPIXPRASLOGON;
|
|
|
|
HRESULT OnLogonPrompt(
|
|
[in,out]
|
|
LPIXPRASLOGON pRasLogon,
|
|
[in]
|
|
IRASTransport *pTransport);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// OnRasDialStatus
|
|
// -----------------------------------------------------------------------------------
|
|
cpp_quote("#ifndef RASCONNSTATE")
|
|
typedef DWORD RASCONNSTATE;
|
|
cpp_quote("#endif")
|
|
HRESULT OnRasDialStatus(
|
|
[in]
|
|
RASCONNSTATE rasconnstate,
|
|
[in]
|
|
DWORD dwError,
|
|
[in]
|
|
IRASTransport *pTransport);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// OnDisconnect
|
|
//
|
|
// Description:
|
|
// This method allows the client to decide if the current RAS connection should
|
|
// be hungup. This is useful, especially on application shutdown, in which case
|
|
// the user may want to leave their RAS connection established even after the
|
|
// application using the connection goes away. This client could show UI on this
|
|
// callback to prompt the user.
|
|
//
|
|
// Parameters:
|
|
// pTransport The RAS transport that generated the OnDisconnect call
|
|
//
|
|
// Returns:
|
|
// S_OK The client can return S_OK to "hangup" the current
|
|
// RAS connnection.
|
|
// S_FALSE The client can return S_FALSE to leave the connection
|
|
// established.
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT OnDisconnect(
|
|
[in]
|
|
LPSTR pszCurrentConnectoid,
|
|
[in]
|
|
boolean fConnectionOwner,
|
|
[in]
|
|
IRASTransport *pTransport);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_IRASTransport
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(8A950001-3CCF-11d0-81DF-00C04FD85AB4),
|
|
helpstring("RAS Transport Interface"),
|
|
local,
|
|
]
|
|
interface IRASTransport : IInternetTransport
|
|
{
|
|
// -----------------------------------------------------------------------------------
|
|
// InitNew
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT InitNew(
|
|
[in]
|
|
IRASCallback *pCallback);
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
// GetCurrentConnectoid - Returns Connectoid name of the current RAS Connection.
|
|
// If not connected, IXP_E_NOT_CONNECTED is returned. cchMax must be greater than or
|
|
// equal to CCHMAX_CONNECTOID, or E_INVALIDARG will be returned.
|
|
// -----------------------------------------------------------------------------------
|
|
HRESULT GetCurrentConnectoid(
|
|
[in,ref]
|
|
LPSTR pszConnectoid,
|
|
[in]
|
|
ULONG cchMax);
|
|
|
|
// ----------------------------------------------------------
|
|
// GetRasErrorString
|
|
// ----------------------------------------------------------
|
|
HRESULT GetRasErrorString (
|
|
[in]
|
|
UINT uRasErrorValue,
|
|
[in,ref]
|
|
LPSTR pszErrorString,
|
|
[in]
|
|
ULONG cchMax,
|
|
[out]
|
|
DWORD *pdwRASResult);
|
|
|
|
// ----------------------------------------------------------
|
|
// FillConnectoidCombo
|
|
// ----------------------------------------------------------
|
|
HRESULT FillConnectoidCombo(
|
|
[in]
|
|
HWND hwndComboBox,
|
|
[in]
|
|
boolean fUpdateOnly,
|
|
[out]
|
|
DWORD *pdwRASResult);
|
|
|
|
// ----------------------------------------------------------
|
|
// EditConnectoid
|
|
// ----------------------------------------------------------
|
|
HRESULT EditConnectoid(
|
|
[in]
|
|
HWND hwndParent,
|
|
[in]
|
|
LPSTR pszConnectoid,
|
|
[out]
|
|
DWORD *pdwRASResult);
|
|
|
|
// ----------------------------------------------------------
|
|
// CreateConnectoid
|
|
// ----------------------------------------------------------
|
|
HRESULT CreateConnectoid(
|
|
[in]
|
|
HWND hwndParent,
|
|
[out]
|
|
DWORD *pdwRASResult);
|
|
}
|
|
|
|
|
|
|
|
// ***************************************************************************************
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_IRangeList
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(8C438160-4EF6-11d0-874F-00AA00530EE9),
|
|
helpstring("Rangelist Interface: used to represent a range of messages."),
|
|
local,
|
|
]
|
|
interface IRangeList : IUnknown
|
|
{
|
|
// ----------------------------------
|
|
// IID_IRangeList Interface Constants
|
|
// ----------------------------------
|
|
const ULONG RL_RANGE_ERROR = ((ULONG)-1); // [out] Indicates that no match could be found
|
|
const ULONG RL_LAST_MESSAGE = ((ULONG)-1); // [in] Equivalent to "*" in an IMAP range list
|
|
|
|
|
|
// ----------------------------------
|
|
// IID_IRangeList Interface Functions
|
|
// ----------------------------------
|
|
|
|
//***********************************************************************
|
|
// Function: Clear
|
|
// Purpose: Clears all entries in the rangelist. Note that no memory
|
|
// is freed by this operation.
|
|
// Returns: S_OK. This function cannot fail.
|
|
//***********************************************************************
|
|
HRESULT Clear(void);
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: IsInRange
|
|
// Purpose: Determines whether the given value is in the rangelist.
|
|
// Arguments:
|
|
// [in] const ULONG value - the value to test against the rangelist.
|
|
//
|
|
// Returns: S_OK if given value is in the rangelist, else S_FALSE.
|
|
//***********************************************************************
|
|
HRESULT IsInRange([in] const ULONG value);
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: Min
|
|
// Arguments:
|
|
// [out] ULONG *pulMin - the minimum value in the rangelist is returned
|
|
// here. For example, for the rangelist "10-20,31,44,50-65", this
|
|
// function returns 10. If the rangelist is empty, a value of
|
|
// RL_RANGE_ERROR is returned.
|
|
// Returns: S_OK. This function cannot fail.
|
|
//***********************************************************************
|
|
HRESULT Min([out] ULONG *pulMin);
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: Max
|
|
// Arguments:
|
|
// [out] ULONG *pulMax - the maximum value in the rangelist is returned
|
|
// here. For example, for the rangelist "10-20,31,44,50-65", this
|
|
// function returns 65. If the rangelist is empty, a value of
|
|
// RL_RANGE_ERROR is returned.
|
|
// Returns: S_OK. This function cannot fail.
|
|
//***********************************************************************
|
|
HRESULT Max([out] ULONG *pulMax); // return the maximum in-range value
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: Save
|
|
// Purpose: This function returns a copy of the internal rangelist
|
|
// representation which may be loaded later via the Load() function.
|
|
// NOTE THAT THE INTERNAL RANGELIST REPRESENTATION IS NOT SUITABLE FOR
|
|
// NETWORK TRANSMITTAL.
|
|
// Arguments:
|
|
// [out] byte **ppbDestination - if successful, this function returns
|
|
// a pointer to a copy of the internal rangelist representation
|
|
// suitable for use with the Load() command (but not for
|
|
// network transmittal).
|
|
// [out] ULONG *pulSizeOfDestination - if successful, this function
|
|
// returns the size of the data pointed to by *ppbDestination.
|
|
//
|
|
// Returns: HRESULT indicating success or failure. Failure to allocate
|
|
// memory is typically the reason for failure.
|
|
//***********************************************************************
|
|
HRESULT Save([out] byte **ppbDestination,
|
|
[out] ULONG *pulSizeOfDestination);
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: Load
|
|
// Purpose: This function loads the given internal rangelist
|
|
// representation, obtained via the Save() function, thus restoring
|
|
// the rangelist which was saved.
|
|
// Arguments:
|
|
// [in] byte *pbSource - a pointer to the internal rangelist
|
|
// representation obtained using the Save() function.
|
|
// [in] ULONG ulSizeOfSource - the size of the data pointed to by
|
|
// pbSource.
|
|
//
|
|
// Returns: HRESULT indicating success or failure.
|
|
//***********************************************************************
|
|
HRESULT Load([in, size_is(ulSizeOfSource)] byte *pbSource,
|
|
[in] const ULONG ulSizeOfSource);
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: AddRange
|
|
// Purpose: This function adds a range of values to the rangelist.
|
|
// For example, to add 19-99 to the rangelist, call AddRange(19,99).
|
|
// Arguments:
|
|
// [in] ULONG low - low number of the range to add to the rangelist.
|
|
// [in] ULONG high - high number of the range to add to the rangelist.
|
|
//
|
|
// Returns: HRESULT indicating success or failure.
|
|
//***********************************************************************
|
|
HRESULT AddRange([in] const ULONG low,
|
|
[in] const ULONG high);
|
|
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: AddSingleValue
|
|
// Purpose: This function adds a single value to the rangelist.
|
|
// For example, to add 69 to the rangelist, call AddRange(69).
|
|
// Arguments:
|
|
// [in] ULONG value - the single value to add to the rangelist.
|
|
//
|
|
// Returns: HRESULT indicating success or failure.
|
|
//***********************************************************************
|
|
HRESULT AddSingleValue([in] const ULONG value);
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: AddRangeList
|
|
// Purpose: This function adds a rangelist to the rangelist.
|
|
// Arguments:
|
|
// [in] IRangeList *prl - the rangelist to add to the rangelist.
|
|
//
|
|
// Returns: HRESULT indicating success or failure.
|
|
//***********************************************************************
|
|
HRESULT AddRangeList([in] const IRangeList *prl);
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: DeleteRange
|
|
// Purpose: This function deletes a range of values from the rangelist.
|
|
// For example, to remove 7-11 from the rangelist, call DeleteRange(7,11).
|
|
// Arguments:
|
|
// [in] ULONG low - low number of the range to remove from the rangelist.
|
|
// [in] ULONG high - high number of the range to remove from the rangelist.
|
|
//
|
|
// Returns: HRESULT indicating success or failure.
|
|
//***********************************************************************
|
|
HRESULT DeleteRange([in] const ULONG low,
|
|
[in] const ULONG high);
|
|
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: DeleteSingleValue
|
|
// Purpose: This function removes a single value from the rangelist.
|
|
// For example, to remove 42 to the rangelist, call DeleteRange(42).
|
|
// Arguments:
|
|
// [in] ULONG value - the single value to remove from the rangelist.
|
|
//
|
|
// Returns: HRESULT indicating success or failure.
|
|
//***********************************************************************
|
|
HRESULT DeleteSingleValue([in] const ULONG value);
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: DeleteRangeList
|
|
// Purpose: This function removes a rangelist from the rangelist.
|
|
// Arguments:
|
|
// [in] IRangeList *prl - the rangelist to remove from the rangelist.
|
|
//
|
|
// Returns: HRESULT indicating success or failure.
|
|
//***********************************************************************
|
|
HRESULT DeleteRangeList([in] const IRangeList *prl);
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: MinOfRange
|
|
// Purpose: This function finds the range that the given value belongs
|
|
// to, and returns the minimum of that range. For example, for the
|
|
// rangelist "10-20,30,40-50", MinOfRange(45) returns 40.
|
|
// Arguments:
|
|
// [in] ULONG value - a value in the range for which you would like to
|
|
// find the minimum.
|
|
// [out] ULONG *pulMinOfRange - the minimum value in the range of which
|
|
// "value" is a member is returned here. If "value" is not in
|
|
// the rangelist, a value of RL_RANGE_ERROR is returned.
|
|
// Returns: S_OK. This function cannot fail.
|
|
//***********************************************************************
|
|
HRESULT MinOfRange([in] const ULONG value,
|
|
[out] ULONG *pulMinOfRange);
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: MaxOfRange
|
|
// Purpose: This function finds the range that the given value belongs
|
|
// to, and returns the maximum of that range. For example, for the
|
|
// rangelist "10-20,30,40-50", MaxOfRange(15) returns 20.
|
|
// Arguments:
|
|
// [in] ULONG value - a value in the range for which you would like to
|
|
// find the maximum.
|
|
// [out] ULONG *pulMaxOfRange - the maximum value in the range of which
|
|
// "value" is a member is returned here. If "value" is not in the
|
|
// rangelist, a value of RL_RANGE_ERROR is returned.
|
|
// Returns: S_OK. This function cannot fail.
|
|
//***********************************************************************
|
|
HRESULT MaxOfRange([in] const ULONG value,
|
|
[out] ULONG *pulMaxOfRange);
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: RangeToIMAPString
|
|
// Purpose: This function outputs the rangelist as an IMAP message set,
|
|
// as specified by the "set" terminal in RFC 1730/2060 (IMAP).
|
|
// Arguments:
|
|
// [out] LPSTR *ppszDestination - an IMAP message set string is
|
|
// returned here. It is the responsibility of the caller to CoTaskMemFree
|
|
// this buffer when he is done with it. Pass in NULL if not interested.
|
|
// [out] LPDWORD pdwLengthOfDestination - the length of the IMAP
|
|
// message set string returned by this function (does not include
|
|
// null-terminator). Pass in NULL if not interested.
|
|
// Returns: HRESULT indicating success or failure.
|
|
//***********************************************************************
|
|
HRESULT RangeToIMAPString([out] LPSTR *ppszDestination,
|
|
[out] LPDWORD pdwLengthOfDestination);
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: Next
|
|
// Purpose: This function returns the smallest value in the rangelist
|
|
// which is greater than the given value. For instance, for a rangelist
|
|
// 5-10, the call Next(7) would return 8.
|
|
// Arguments:
|
|
// [in] ULONG current - the value for which you'd like to find the next
|
|
// number in the rangelist.
|
|
// [out] ULONG *pulNext - the smallest number in the rangelist greater
|
|
// than "value" is returned here, or RL_RANGE_ERROR if no such
|
|
// number could be found.
|
|
// Returns: S_OK. This function cannot fail.
|
|
//***********************************************************************
|
|
HRESULT Next([in] const ULONG current, [out] ULONG *pulNext);
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: Prev
|
|
// Purpose: This function returns the largest value in the rangelist
|
|
// which is smaller than the given value. For instance, for a rangelist
|
|
// 5-10, the call Prev(7) would return 6.
|
|
// Arguments:
|
|
// [in] ULONG current - the value for which you'd like to find the
|
|
// previous number in the rangelist.
|
|
// [out] ULONG *pulPrev - the largest number in the rangelist smaller
|
|
// than "value" is returned here, or RL_RANGE_ERROR if no such
|
|
// number could be found.
|
|
// Returns: S_OK. This function cannot fail.
|
|
//***********************************************************************
|
|
HRESULT Prev([in] const ULONG current, [out] ULONG *pulPrev);
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: Cardinality
|
|
// Purpose: This function counts the members in the rangelist set. For
|
|
// example, for the rangelist 1-11, Cardinality() returns 11.
|
|
// Arguments:
|
|
// [out] ULONG *pulCardinality - The number of members in the
|
|
// rangelist set is returned here.
|
|
// Returns: S_OK. This function cannot fail.
|
|
//***********************************************************************
|
|
HRESULT Cardinality(ULONG *pulCardinality);
|
|
|
|
|
|
//***********************************************************************
|
|
// Function: CardinalityFrom
|
|
// Purpose: This function counts the members in the rangelist set which
|
|
// are larger than the given starting point. For example, for the
|
|
// rangelist 1-11, Cardinality(10) returns 2.
|
|
// Arguments:
|
|
// [in] ULONG ulStartPoint - represents 1 less than the lowest number
|
|
// which should be considered in the cardinality count.
|
|
// [out] ULONG *pulCardinalityFrom - The number of members in the
|
|
// rangelist set which are larger than the given starting point
|
|
// is returned here.
|
|
// Returns: S_OK. This function cannot fail.
|
|
//***********************************************************************
|
|
HRESULT CardinalityFrom([in] const ULONG ulStartPoint,
|
|
[out] ULONG *pulCardinalityFrom);
|
|
|
|
} // interface IRangeList
|
|
|
|
|
|
|
|
// ***************************************************************************************
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_IIMAPCallback
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(E9E9D8A3-4EDD-11d0-874F-00AA00530EE9),
|
|
helpstring("IMAP Callback Interface: used to notify an IID_IIMAPTransport client of IMAP server events."),
|
|
local,
|
|
]
|
|
interface IIMAPCallback : ITransportCallback
|
|
{
|
|
|
|
// -------------------------------------
|
|
// IID_IIMAPCallback Interface Constants
|
|
// -------------------------------------
|
|
typedef DWORD IMAP_MBOXFLAGS; // Mailbox flags returned by the LIST/LSUB command
|
|
const IMAP_MBOXFLAGS IMAP_MBOX_NOFLAGS = 0x00000000;
|
|
const IMAP_MBOXFLAGS IMAP_MBOX_MARKED = 0x00000001;
|
|
const IMAP_MBOXFLAGS IMAP_MBOX_NOINFERIORS = 0x00000002;
|
|
const IMAP_MBOXFLAGS IMAP_MBOX_NOSELECT = 0x00000004;
|
|
const IMAP_MBOXFLAGS IMAP_MBOX_UNMARKED = 0x00000008;
|
|
const IMAP_MBOXFLAGS IMAP_MBOX_ALLFLAGS = 0x0000000F; // Keep this updated
|
|
|
|
|
|
// --------------------------------------
|
|
// IID_IIMAPCallback Interface Data Types
|
|
// --------------------------------------
|
|
// The following enumeration identifies the types of IMAP_RESPONSE structures
|
|
typedef enum tagIMAP_RESPONSE_TYPE {
|
|
irtERROR_NOTIFICATION, // Indicates an error has been encountered during response parsing
|
|
irtCOMMAND_COMPLETION, // Indicates this IMAP command is completed
|
|
irtSERVER_ALERT, // ALERT response (see IMAP spec)
|
|
irtPARSE_ERROR, // PARSE response (see IMAP spec)
|
|
irtMAILBOX_UPDATE, // EXISTS, RECENT, or UNSEEN responses (see IMAP spec)
|
|
irtDELETED_MSG, // EXPUNGE response (see IMAP spec)
|
|
irtFETCH_BODY, // Partial body from a message, returned via FETCH
|
|
irtUPDATE_MSG, // FETCH response (see IMAP spec)
|
|
irtAPPLICABLE_FLAGS, // FLAGS response (see IMAP spec)
|
|
irtPERMANENT_FLAGS, // PERMANENTFLAGS response code (see IMAP spec)
|
|
irtUIDVALIDITY, // UIDVALIDITY response code (see IMAP spec)
|
|
irtREADWRITE_STATUS, // READ-WRITE or READ-ONLY response code (see IMAP spec)
|
|
irtTRYCREATE, // TRYCREATE response code (see IMAP spec)
|
|
irtSEARCH, // SEARCH response (see IMAP spec)
|
|
irtMAILBOX_LISTING, // LIST or LSUB response (see IMAP spec)
|
|
irtMAILBOX_STATUS, // STATUS response (see IMAP spec)
|
|
irtAPPEND_PROGRESS, // Progress of APPEND stream upload
|
|
irtUPDATE_MSG_EX // Extended FETCH response (see IMAP spec)
|
|
} IMAP_RESPONSE_TYPE;
|
|
|
|
|
|
// Fetch body part - body parts requested by the client are returned piece-by-piece
|
|
// as they are received from the server, using this structure. After the entire FETCH
|
|
// response is received, the client will also receive a FETCH_CMD_RESULTS structure
|
|
// (see below) with the remaining requested information.
|
|
typedef struct tagFETCH_BODY_PART {
|
|
DWORD dwMsgSeqNum; // Message sequence number to which this FETCH resp applies
|
|
|
|
LPSTR pszBodyTag; // Pointer to the IMAP tag identifying this body part (eg,
|
|
// "RFC822.PEEK", or "BODY[2.2]<0.2048>"). NOTE that we terminate
|
|
// the tag at the FIRST SPACE. This means that even though you sent
|
|
// "BODY[HEADER.FIELDS (foo bar)]", the tag returned will only be
|
|
// "BODY[HEADER.FIELDS".
|
|
|
|
DWORD dwTotalBytes; // Total number of bytes expected for this body part
|
|
DWORD dwSizeOfData; // The number of bytes pointed to by pszData
|
|
DWORD dwOffset; // Offset of the start of this data buffer
|
|
BOOL fDone; // TRUE when this is the last data buffer
|
|
LPSTR pszData; // A pointer to the body part data
|
|
|
|
LPARAM lpFetchCookie1; // User-settable values, initially set to 0. These will persist
|
|
LPARAM lpFetchCookie2; // throughout the FETCH response, ie, for all FETCH_BODY_PART
|
|
// responses (even if multiple body parts are fetched), and for
|
|
// the final FETCH_CMD_RESULTS structure.
|
|
} FETCH_BODY_PART;
|
|
|
|
|
|
// Fetch results structure - holds data from a FETCH response. Since FETCH
|
|
// responses can be unsolicited, the recipient must check that a data item is
|
|
// valid before attempting to use it.
|
|
typedef struct tagFETCH_CMD_RESULTS {
|
|
DWORD dwMsgSeqNum; // Message sequence number to which this FETCH resp applies
|
|
|
|
BOOL bMsgFlags; // TRUE if MsgFlags (below) contains valid data
|
|
IMAP_MSGFLAGS mfMsgFlags; // Used to return the FLAGS tag of a FETCH response
|
|
|
|
BOOL bRFC822Size; // TRUE if dwRFC822Size (below) contains valid data
|
|
DWORD dwRFC822Size; // Used to return the RFC822.SIZE tag of a FETCH response
|
|
|
|
BOOL bUID; // TRUE if dwUID (below) contains valid data
|
|
DWORD dwUID; // Used to return the UID tag of a FETCH response
|
|
|
|
BOOL bInternalDate; // TRUE if ftInternalDate (below) contains valid data
|
|
FILETIME ftInternalDate; // Used to return the INTERNALDATE tag of a FETCH response
|
|
|
|
LPARAM lpFetchCookie1; // User-settable values. These will persist throughout
|
|
LPARAM lpFetchCookie2; // the FETCH, ie, for all FETCH_BODY_PART responses (even
|
|
// if multiple body parts are fetched), and for the final
|
|
// FETCH_CMD_RESULTS structure.
|
|
} FETCH_CMD_RESULTS;
|
|
|
|
|
|
typedef struct tagIMAPADDR {
|
|
LPSTR pszName; // See formal syntax for "addr_name", RFC2060
|
|
LPSTR pszADL; // See formal syntax for "addr_adl", RFC2060
|
|
LPSTR pszMailbox; // See formal syntax for "addr_mailbox", RFC2060
|
|
LPSTR pszHost; // See formal syntax for "addr_host", RFC2060
|
|
struct tagIMAPADDR *pNext; // Pointer to next address
|
|
} IMAPADDR;
|
|
|
|
|
|
typedef struct tagFETCH_CMD_RESULTS_EX {
|
|
// *** First part of this structure is exactly like FETCH_CMD_RESULTS ***
|
|
DWORD dwMsgSeqNum; // Message sequence number to which this FETCH resp applies
|
|
|
|
BOOL bMsgFlags; // TRUE if MsgFlags (below) contains valid data
|
|
IMAP_MSGFLAGS mfMsgFlags; // Used to return the FLAGS tag of a FETCH response
|
|
|
|
BOOL bRFC822Size; // TRUE if dwRFC822Size (below) contains valid data
|
|
DWORD dwRFC822Size; // Used to return the RFC822.SIZE tag of a FETCH response
|
|
|
|
BOOL bUID; // TRUE if dwUID (below) contains valid data
|
|
DWORD dwUID; // Used to return the UID tag of a FETCH response
|
|
|
|
BOOL bInternalDate; // TRUE if ftInternalDate (below) contains valid data
|
|
FILETIME ftInternalDate; // Used to return the INTERNALDATE tag of a FETCH response
|
|
|
|
LPARAM lpFetchCookie1; // User-settable values. These will persist throughout
|
|
LPARAM lpFetchCookie2; // the FETCH, ie, for all FETCH_BODY_PART responses (even
|
|
// if multiple body parts are fetched), and for the final
|
|
// FETCH_CMD_RESULTS structure.
|
|
|
|
|
|
// *** Second part of this structure contains the extensions ***
|
|
BOOL bEnvelope; // TRUE if we received an ENVELOPE response
|
|
FILETIME ftENVDate; // Date returned via ENVELOPE
|
|
LPSTR pszENVSubject; // "Subject" returned via ENVELOPE
|
|
IMAPADDR *piaENVFrom; // "From" addresses returned via ENVELOPE
|
|
IMAPADDR *piaENVSender; // "Sender" addresses returned via ENVELOPE
|
|
IMAPADDR *piaENVReplyTo; // "ReplyTo" addresses returned via ENVELOPE
|
|
IMAPADDR *piaENVTo; // "To" addresses returned via ENVELOPE
|
|
IMAPADDR *piaENVCc; // "Cc" addresses returned via ENVELOPE
|
|
IMAPADDR *piaENVBcc; // "Bcc" addresses returned via ENVELOPE
|
|
LPSTR pszENVInReplyTo; // "InReplyTo" returned via ENVELOPE
|
|
LPSTR pszENVMessageID; // "MessageID" returned via ENVELOPE
|
|
|
|
DWORD dwReserved1;
|
|
DWORD dwReserved2;
|
|
DWORD dwReserved3;
|
|
} FETCH_CMD_RESULTS_EX;
|
|
|
|
|
|
// The following structure is used to track and communicate EXISTS,
|
|
// RECENT and UNSEEN responses from the IMAP server
|
|
typedef struct tagMBOX_MSGCOUNT {
|
|
BOOL bGotExistsResponse;
|
|
DWORD dwExists;
|
|
|
|
BOOL bGotRecentResponse;
|
|
DWORD dwRecent;
|
|
|
|
BOOL bGotUnseenResponse;
|
|
DWORD dwUnseen;
|
|
} MBOX_MSGCOUNT;
|
|
|
|
// The following structure returns the results of a LIST or LSUB response
|
|
typedef struct tagIMAP_LISTLSUB_RESPONSE {
|
|
LPSTR pszMailboxName;
|
|
IMAP_MBOXFLAGS imfMboxFlags;
|
|
char cHierarchyChar;
|
|
} IMAP_LISTLSUB_RESPONSE;
|
|
|
|
// The following structure returns the results of a STATUS response
|
|
typedef struct tagIMAP_STATUS_RESPONSE {
|
|
LPSTR pszMailboxName;
|
|
|
|
BOOL fMessages;
|
|
DWORD dwMessages;
|
|
BOOL fRecent;
|
|
DWORD dwRecent;
|
|
BOOL fUIDNext;
|
|
DWORD dwUIDNext;
|
|
BOOL fUIDValidity;
|
|
DWORD dwUIDValidity;
|
|
BOOL fUnseen;
|
|
DWORD dwUnseen;
|
|
} IMAP_STATUS_RESPONSE;
|
|
|
|
|
|
// The following structure returns the progress of the current APPEND command
|
|
typedef struct tagAPPEND_PROGRESS {
|
|
DWORD dwUploaded;
|
|
DWORD dwTotal;
|
|
} APPEND_PROGRESS;
|
|
|
|
|
|
// The following union can hold the results of many types of IMAP responses
|
|
typedef [switch_type(IMAP_RESPONSE_TYPE)] union tagIMAP_RESPONSE_DATA {
|
|
[case (irtMAILBOX_UPDATE)] MBOX_MSGCOUNT *pmcMsgCount; // For mailbox update (EXISTS, RECENT, UNSEEN) data
|
|
[case (irtDELETED_MSG)] DWORD dwDeletedMsgSeqNum; // For EXPUNGE response data
|
|
[case (irtFETCH_BODY)] FETCH_BODY_PART *pFetchBodyPart; // For body parts (eg, RFC822) retrieved via FETCH
|
|
[case (irtUPDATE_MSG)] FETCH_CMD_RESULTS *pFetchResults; // For message update (FETCH) data
|
|
[case (irtAPPLICABLE_FLAGS, irtPERMANENT_FLAGS)]
|
|
IMAP_MSGFLAGS imfImapMessageFlags; // For FLAGS response or PERMANENTFLAGS response code data
|
|
[case (irtUIDVALIDITY)] DWORD dwUIDValidity; // For UIDVALIDITY response code data
|
|
[case (irtREADWRITE_STATUS)] BOOL bReadWrite; // For READ-WRITE or READ-ONLY response code data
|
|
[case (irtSEARCH)] IRangeList *prlSearchResults; // For SEARCH response data
|
|
[case (irtMAILBOX_LISTING)]
|
|
IMAP_LISTLSUB_RESPONSE illrdMailboxListing; // For LIST or LSUB response data
|
|
[case (irtMAILBOX_STATUS)]
|
|
IMAP_STATUS_RESPONSE *pisrStatusResponse; // For STATUS response data
|
|
[case (irtAPPEND_PROGRESS)]
|
|
APPEND_PROGRESS *papAppendProgress;
|
|
[case (irtUPDATE_MSG_EX)] FETCH_CMD_RESULTS_EX
|
|
*pFetchResultsEx; // For message update (FETCH) data
|
|
} IMAP_RESPONSE_DATA;
|
|
|
|
// The following structure is used to represent all IMAP responses
|
|
typedef struct tagIMAP_RESPONSE {
|
|
WPARAM wParam; // This is 0 if unsolicited response or unresolvable
|
|
LPARAM lParam; // This is 0 if unsolicited response or unresolvable
|
|
HRESULT hrResult;
|
|
LPSTR lpszResponseText;
|
|
IMAP_RESPONSE_TYPE irtResponseType;
|
|
[switch_is(irtResponseType)] IMAP_RESPONSE_DATA irdResponseData;
|
|
} IMAP_RESPONSE;
|
|
|
|
|
|
//-----------------------------------------------------------------------
|
|
// IID_IIMAPCallback Interface Functions
|
|
//-----------------------------------------------------------------------
|
|
|
|
//***********************************************************************
|
|
// Function: OnResponse
|
|
// Purpose: This function is used to report IMAP server responses to
|
|
// IMAP commands (or unsolicited responses).
|
|
// Arguments:
|
|
// [in] IMAP_RESPONSE *pirIMAPResponse - a pointer to an IMAP response
|
|
// structure is returned to the IID_IIMAPTransport user via
|
|
// this callback.
|
|
// Returns: This function should always return S_OK.
|
|
//***********************************************************************
|
|
HRESULT OnResponse([in] const IMAP_RESPONSE *pirIMAPResponse);
|
|
|
|
} // interface IIMAPCallback
|
|
|
|
|
|
|
|
// ***************************************************************************************
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_IIMAPTransport
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(E9E9D8A8-4EDD-11d0-874F-00AA00530EE9),
|
|
helpstring("IMAP Transport Interface: used to send IMAP commands to an IMAP server."),
|
|
local,
|
|
]
|
|
interface IIMAPTransport : IInternetTransport
|
|
{
|
|
// -------------------------------------
|
|
// IID_IIMAPTransport Interface Constants
|
|
// -------------------------------------
|
|
// The following DWORDs are returned by IIMAPTransport::Capability
|
|
const DWORD IMAP_CAPABILITY_IMAP4 = 0x00000001;
|
|
const DWORD IMAP_CAPABILITY_IMAP4rev1 = 0x00000002;
|
|
const DWORD IMAP_CAPABILITY_IDLE = 0x00000004;
|
|
const DWORD IMAP_CAPABILITY_ALLFLAGS = 0x00000007; // Keep this updated
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------
|
|
// IID_IIMAPTransport Interface Functions
|
|
//-----------------------------------------------------------------------
|
|
//***************************************************************************
|
|
// Function: InitNew
|
|
//
|
|
// Purpose:
|
|
// This function initializes the CImap4Agent class. This function
|
|
// must be the next function called after instantiating the CImap4Agent class.
|
|
//
|
|
// Arguments:
|
|
// LPSTR pszLogFilePath [in] - path to a log file (where all input and
|
|
// output is logged), if the caller wishes to log IMAP transactions.
|
|
// IIMAPCallback *pCBHandler [in] - pointer to a IIMAPCallback object.
|
|
// This object allows the CImap4Agent class to report all IMAP response
|
|
// results to its user.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT InitNew([in] LPSTR pszLogFilePath,
|
|
[in] IIMAPCallback *pCBHandler);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: NewIRangeList
|
|
//
|
|
// Purpose:
|
|
// This function returns a pointer to an IRangeList. Its purpose is to
|
|
// allow full functionality from an IIMAPTransport pointer without needing
|
|
// to resort to CoCreateInstance to get an IRangeList.
|
|
//
|
|
// Arguments:
|
|
// IRangeList **pprlNewRangeList [out] - if successful, the function
|
|
// returns a pointer to the new IRangeList.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT NewIRangeList([out] IRangeList **pprlNewRangeList);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Capability
|
|
//
|
|
// Purpose:
|
|
// The CImap4Agent class always asks for the server's CAPABILITIES after
|
|
// a connection is established. The result is saved in a register and
|
|
// is available by calling this function.
|
|
//
|
|
// Arguments:
|
|
// [out] DWORD *pdwCapabilityFlags - this function returns a DWORD with
|
|
// bit-flags specifying which capabilities this IMAP server
|
|
// supports.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT Capability([out] DWORD *pdwCapabilityFlags);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Select
|
|
//
|
|
// Purpose:
|
|
// This function issues a SELECT command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
// LPSTR lpszMailboxName - pointer to IMAP-compliant mailbox name
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure of send operation.
|
|
//***************************************************************************
|
|
HRESULT Select([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler,
|
|
[in] LPSTR lpszMailboxName);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Examine
|
|
//
|
|
// Purpose:
|
|
// This function issues an EXAMINE command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// Same as for the Select() function.
|
|
//
|
|
// Returns:
|
|
// Same as for the Select() function.
|
|
//***************************************************************************
|
|
HRESULT Examine([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler,
|
|
[in] LPSTR lpszMailboxName);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Create
|
|
//
|
|
// Purpose:
|
|
// This function issues a CREATE command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
// LPSTR lpszMailboxName - IMAP-compliant name of the mailbox.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure of send operation.
|
|
//***************************************************************************
|
|
HRESULT Create([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler,
|
|
[in] LPSTR lpszMailboxName);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Delete
|
|
//
|
|
// Purpose:
|
|
// This function issues a DELETE command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
// LPSTR lpszMailboxName - IMAP-compliant name of the mailbox.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure of send operation.
|
|
//***************************************************************************
|
|
HRESULT Delete([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler,
|
|
[in] LPSTR lpszMailboxName);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Rename
|
|
//
|
|
// Purpose:
|
|
// This function issues a RENAME command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
// LPSTR lpszMailboxName - CURRENT IMAP-compliant name of the mailbox.
|
|
// LPSTR lpszNewMailboxName - NEW IMAP-compliant name of the mailbox.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure of send operation.
|
|
//***************************************************************************
|
|
HRESULT Rename([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler,
|
|
[in] LPSTR lpszMailboxName,
|
|
[in] LPSTR lpszNewMailboxName);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Subscribe
|
|
//
|
|
// Purpose:
|
|
// This function issues a SUBSCRIBE command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
// LPSTR lpszMailboxName - IMAP-compliant name of the mailbox.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure of send operation.
|
|
//***************************************************************************
|
|
HRESULT Subscribe([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler,
|
|
[in] LPSTR lpszMailboxName);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Unsubscribe
|
|
//
|
|
// Purpose:
|
|
// This function issues an UNSUBSCRIBE command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
// LPSTR lpszMailboxName - IMAP-compliant name of the mailbox.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure of send operation.
|
|
//***************************************************************************
|
|
HRESULT Unsubscribe([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler,
|
|
[in] LPSTR lpszMailboxName);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: List
|
|
//
|
|
// Purpose:
|
|
// This function issues a LIST command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
// LPSTR lpszMailboxNameReference - IMAP-compliant reference for mbox name
|
|
// LPSTR lpszMailboxNamePattern - IMAP-compliant pattern for mailbox name
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure of send operation.
|
|
//***************************************************************************
|
|
HRESULT List([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler,
|
|
[in] LPSTR lpszMailboxNameReference,
|
|
[in] LPSTR lpszMailboxNamePattern);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Lsub
|
|
//
|
|
// Purpose:
|
|
// This function issues a LSUB command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
// LPSTR lpszMailboxNameReference - IMAP-compliant reference for mbox name
|
|
// LPSTR lpszMailboxNamePattern - IMAP-compliant pattern for mailbox name.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure of send operation.
|
|
//***************************************************************************
|
|
HRESULT Lsub([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler,
|
|
[in] LPSTR lpszMailboxNameReference,
|
|
[in] LPSTR lpszMailboxNamePattern);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Append
|
|
//
|
|
// Purpose:
|
|
// This function issues an APPEND command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
// LPSTR lpszMailboxName - IMAP-compliant mailbox name to append message to.
|
|
// LPSTR lpszMessageFlags - IMAP-compliant list of msg flags to set for msg.
|
|
// Set to NULL to set no message flags. (Avoid passing "()" due to old Cyrus
|
|
// server bug). $REVIEW: This should be changed to IMAP_MSGFLAGS!!!
|
|
// FILETIME ftMessageDateTime - date/time to associate with msg (GMT/UTC)
|
|
// LPSTREAM lpstmMessageToSave - the message to save, in RFC822 format.
|
|
// No need to rewind the stream, this is done by CConnection::SendStream.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure of send operation.
|
|
//***************************************************************************
|
|
HRESULT Append([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler,
|
|
[in] LPSTR lpszMailboxName,
|
|
[in] LPSTR lpszMessageFlags,
|
|
[in] FILETIME ftMessageDateTime,
|
|
[in] LPSTREAM lpstmMessageToSave);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Close
|
|
//
|
|
// Purpose:
|
|
// This function issues a CLOSE command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure of send operation.
|
|
//***************************************************************************
|
|
HRESULT Close([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Expunge
|
|
//
|
|
// Purpose:
|
|
// This function issues an EXPUNGE command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure on send operation.
|
|
//***************************************************************************
|
|
HRESULT Expunge([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Search
|
|
//
|
|
// Purpose:
|
|
// This function issues a SEARCH command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
// LPSTR lpszSearchCriteria - IMAP-compliant list of search criteria
|
|
// boolean bReturnUIDs - if TRUE, we prepend "UID" to command.
|
|
// IRangeList *pMsgRange [in] - range of messages over which to operate
|
|
// the search. This argument should be NULL to exclude the message
|
|
// set from the search criteria.
|
|
// boolean bUIDRangeList [in] - TRUE if pMsgRange refers to a UID range,
|
|
// FALSE if pMsgRange refers to a message sequence number range. If
|
|
// pMsgRange is NULL, this argument is ignored.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure on send operation.
|
|
//***************************************************************************
|
|
HRESULT Search([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler,
|
|
[in] LPSTR lpszSearchCriteria,
|
|
[in] boolean bReturnUIDs,
|
|
[in] IRangeList *pMsgRange,
|
|
[in] boolean bUIDRangeList);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Fetch
|
|
//
|
|
// Purpose:
|
|
// This function issues a FETCH command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
// IRangeList *pMsgRange [in] - range of messages to fetch. The caller
|
|
// should pass NULL if he is using UIDs and he wants to generate his
|
|
// own message set (in lpszFetchArgs). If the caller is using msg
|
|
// seq nums, this argument MUST be specified to allow this class to
|
|
// resequence the msg nums as required.
|
|
// boolean bUIDMsgRange [in] - if TRUE, prepends "UID" to FETCH command and
|
|
// treats pMsgRange as a UID range.
|
|
// LPSTR lpszFetchArgs - arguments to the FETCH command
|
|
//
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure of the send operation.
|
|
//***************************************************************************
|
|
HRESULT Fetch([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler,
|
|
[in] IRangeList *pMsgRange,
|
|
[in] boolean bUIDMsgRange,
|
|
[in] LPSTR lpszFetchArgs);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Store
|
|
//
|
|
// Purpose:
|
|
// This function issues a STORE command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
// IRangeList *pMsgRange [in] - range of messages to store. The caller
|
|
// should pass NULL if he is using UIDs and he wants to generate his
|
|
// own message set (in lpszStoreArgs). If the caller is using msg
|
|
// seq nums, this argument MUST be specified to allow this class to
|
|
// resequence the msg nums as required.
|
|
// boolean bUIDRangeList [in] - if TRUE, we prepend "UID" to the STORE command
|
|
// LPSTR lpszStoreArgs - arguments for the STORE command.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure of the send operation.
|
|
//***************************************************************************
|
|
HRESULT Store([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler,
|
|
[in] IRangeList *pMsgRange,
|
|
[in] boolean bUIDRangeList,
|
|
[in] LPSTR lpszStoreArgs);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Copy
|
|
//
|
|
// Purpose:
|
|
// This function issues a COPY command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
// IRangeList *pMsgRange [in] - the range of messages to copy. This
|
|
// argument must be supplied.
|
|
// boolean bUIDRangeList [in] - if TRUE, prepends "UID" to COPY command
|
|
// LPSTR lpszMailboxName [in] - C String of mailbox name
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure of send operation.
|
|
//***************************************************************************
|
|
HRESULT Copy([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler,
|
|
[in] IRangeList *pMsgRange,
|
|
[in] boolean bUIDRangeList,
|
|
[in] LPSTR lpszMailboxName);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Noop
|
|
//
|
|
// Purpose:
|
|
// This function issues a NOOP command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure of send operation.
|
|
//***************************************************************************
|
|
HRESULT Noop([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler);
|
|
|
|
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Message Sequence Number to UID member functions - the caller may use
|
|
// these functions to map from MSN's to UID's, if the caller uses UIDs
|
|
// to refer to messages. If the caller uses MSN's, there is no need to
|
|
// invoke the following functions.
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: ResizeMsgSeqNumTable
|
|
//
|
|
// Purpose:
|
|
// This function is called whenever we receive an EXISTS response. It
|
|
// resizes the MsgSeqNumToUID table to match the current size of the mailbox.
|
|
//
|
|
// Arguments:
|
|
// DWORD dwSizeOfMbox [in] - the number returned via the EXISTS response.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT ResizeMsgSeqNumTable([in] DWORD dwSizeOfMbox);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: UpdateSeqNumToUID
|
|
//
|
|
// Purpose:
|
|
// This function is called whenever we receive a FETCH response which has
|
|
// both a message sequence number and a UID number. It updates the
|
|
// MsgSeqNumToUID table so that given msg seq number maps to the given UID.
|
|
//
|
|
// Arguments:
|
|
// DWORD dwMsgSeqNum [in] - the message sequence number of the FETCH
|
|
// response.
|
|
// DWORD dwUID [in] - the UID of the given message sequence number.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT UpdateSeqNumToUID([in] DWORD dwMsgSeqNum,
|
|
[in] DWORD dwUID);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: RemoveSequenceNum
|
|
//
|
|
// Purpose:
|
|
// This function is called whenever we receive an EXPUNGE response. It
|
|
// removes the given message sequence number from the MsgSeqNumToUID table,
|
|
// and compacts the table so that all message sequence numbers following
|
|
// the deleted one are re-sequenced.
|
|
//
|
|
// Arguments:
|
|
// DWORD dwDeletedMsgSeqNum [in] - message sequence number of deleted msg.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT RemoveSequenceNum([in] DWORD dwDeletedMsgSeqNum);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: MsgSeqNumToUID
|
|
//
|
|
// Purpose:
|
|
// This function takes a message sequence number and converts it to a UID
|
|
// based on the MsgSeqNumToUID table.
|
|
//
|
|
// Arguments:
|
|
// DWORD dwMsgSeqNum [in] - the sequence number for which the caller wants
|
|
// to know the UID.
|
|
// DWORD *pdwUID [out] - the UID associated with the given sequence number
|
|
// is returned here. If none could be found, this function returns 0.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT MsgSeqNumToUID([in] DWORD dwMsgSeqNum, [out] DWORD *pdwUID);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: GetMsgSeqNumToUIDArray
|
|
//
|
|
// Purpose:
|
|
// This function returns a copy of the MsgSeqNumToUID array. The caller
|
|
// will want to do this to delete messages from the cache which no longer
|
|
// exist on the server, for example.
|
|
//
|
|
// Arguments:
|
|
// DWORD **ppdwMsgSeqNumToUIDArray [out] - the function returns a pointer
|
|
// to the copy of the MsgSeqNumToUID array in this argument. Note that
|
|
// it is the caller's responsibility to MemFree the array. If no array
|
|
// is available, or it is empty, the returned pointer value is NULL.
|
|
// DWORD *pdwNumberOfElements [out] - the function returns the size of
|
|
// the MsgSeqNumToUID array.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT GetMsgSeqNumToUIDArray([out] DWORD **ppdwMsgSeqNumToUIDArray,
|
|
[out] DWORD *pdwNumberOfElements);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: GetHighestMsgSeqNum
|
|
//
|
|
// Purpose:
|
|
// This function returns the highest message sequence number reported in
|
|
// the MsgSeqNumToUID array.
|
|
//
|
|
// Arguments:
|
|
// DWORD *pdwHighestMSN [out] - the highest message sequence number in the
|
|
// table is returned here.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT GetHighestMsgSeqNum([out] DWORD *pdwHighestMSN);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: ResetMsgSeqNumToUID
|
|
//
|
|
// Purpose:
|
|
// This function resets the variables used to maintain the MsgSeqNumToUID
|
|
// table. This function is AUTOMATICALLY called whenever the MsgSeqNumToUID
|
|
// table becomes invalid (say, when a new mailbox is selected, or we are
|
|
// disconnected). This function shouldn't normally need to be called, but
|
|
// I've placed it here just in case someone needs it.
|
|
//
|
|
// Returns:
|
|
// S_OK. This function cannot fail.
|
|
//***************************************************************************
|
|
HRESULT ResetMsgSeqNumToUID(void);
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Leaving Message Sequence Number to UID member functions zone
|
|
//---------------------------------------------------------------------------
|
|
|
|
//***************************************************************************
|
|
// Function: SetDefaultCBHandler
|
|
//
|
|
// Purpose: This function changes the current default IIMAPCallback handler
|
|
// to the given one.
|
|
//
|
|
// Arguments:
|
|
// IIMAPCallback *pCBHandler [in] - a pointer to the new callback handler.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT SetDefaultCBHandler([in] IIMAPCallback *pCBHandler);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: Status
|
|
//
|
|
// Purpose:
|
|
// This function issues a STATUS command to the IMAP server.
|
|
//
|
|
// Arguments:
|
|
// WPARAM wParam [in] - (see below)
|
|
// LPARAM lParam [in] - the wParam and lParam form a unique ID assigned by
|
|
// the caller to this IMAP command and its responses. Can be anything,
|
|
// but note that the value of 0, 0 is reserved for unsolicited responses.
|
|
// IIMAPCallback *pCBHandler [in] - the CB handler to use to process the
|
|
// responses for this command. If this is NULL, the default CB handler
|
|
// is used.
|
|
// LPSTR pszMailboxName [in] - the mailbox which you want to get the
|
|
// STATUS of.
|
|
// LPSTR pszStatusCmdArgs [in] - the arguments for the STATUS command,
|
|
// eg, "(MESSAGES UNSEEN)".
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure of the send operation.
|
|
//***************************************************************************
|
|
HRESULT Status([in] WPARAM wParam,
|
|
[in] LPARAM lParam,
|
|
[in] IIMAPCallback *pCBHandler,
|
|
[in] LPSTR pszMailboxName,
|
|
[in] LPSTR pszStatusCmdArgs);
|
|
|
|
|
|
} // interface IIMAPTransport
|
|
|
|
|
|
|
|
// ***************************************************************************************
|
|
// ---------------------------------------------------------------------------------------
|
|
// IID_IIMAPTransport2
|
|
// ---------------------------------------------------------------------------------------
|
|
[
|
|
uuid(DA8283C0-37C5-11d2-ACD9-0080C7B6E3C5),
|
|
helpstring("IMAP Transport Interface 2: Extension to IIMAPTransport."),
|
|
local,
|
|
]
|
|
interface IIMAPTransport2 : IIMAPTransport
|
|
{
|
|
|
|
//-----------------------------------------------------------------------
|
|
// IID_IIMAPTransport Interface Functions
|
|
//-----------------------------------------------------------------------
|
|
|
|
//***************************************************************************
|
|
// Function: SetDefaultCP
|
|
//
|
|
// Purpose:
|
|
// This function allows the caller to tell IIMAPTransport what codepage to
|
|
// use for IMAP mailbox names. After calling this function, all mailbox names
|
|
// submitted to IIMAPTransport will be translated from the default codepage,
|
|
// and all mailbox names returned from the server will be translated to
|
|
// the default codepage before being returned via IIMAPCallback.
|
|
//
|
|
// Arguments:
|
|
// DWORD dwTranslateFlags [in] - enables/disables automatic translation to
|
|
// and from default codepage and IMAP-modified UTF-7. If disabled, caller
|
|
// wishes all mailbox names to be passed verbatim to/from IMAP server.
|
|
// Note that by default we translate for IMAP4 servers, even with its
|
|
// round-trippability problems, because this is how we used to do it
|
|
// in the past.
|
|
// UINT uiCodePage [in] - the default codepage to use for translations.
|
|
// By default this value is the CP returned by GetACP().
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT SetDefaultCP([in] DWORD dwTranslateFlags,
|
|
[in] UINT uiCodePage);
|
|
|
|
// TranslateFlags
|
|
const DWORD IMAP_MBOXXLATE_DEFAULT = 0x00000000; // Always translate, even for IMAP4
|
|
const DWORD IMAP_MBOXXLATE_DISABLE = 0x00000001; // Always disable
|
|
const DWORD IMAP_MBOXXLATE_DISABLEIMAP4 = 0x00000002; // Disable for IMAP4, translate for IMAP4rev1
|
|
const DWORD IMAP_MBOXXLATE_VERBATIMOK = 0x00000004; // Non-translatable mbox names can be returned verbatim
|
|
// Note if translation disabled, all mboxes will be
|
|
// returned with IXP_S_IMAP_VERBATIM_MBOX
|
|
const DWORD IMAP_MBOXXLATE_RETAINCP = 0x00000008; // Don't change codepage with this call
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: MultiByteToModifiedUTF7
|
|
//
|
|
// Purpose:
|
|
// This function takes a MultiByte string and converts it to modified IMAP
|
|
// UTF7, which is described in RFC2060. This function is only needed if the
|
|
// user has disabled transparent mailbox translation using SetDefaultCP(FALSE,0).
|
|
//
|
|
// Arguments:
|
|
// LPCSTR pszSource [in] - pointer to the MultiByte string to convert to UTF7.
|
|
// LPSTR *ppszDestination [out] - a pointer to a string buffer containing
|
|
// the UTF7 equivalent of pszSource is returned here. It is the caller's
|
|
// responsibility to MemFree this string.
|
|
// UINT uiSourceCP [in] - indicates the codepage for pszSource
|
|
// Note that no translation is performed if SetDefaultCP(FALSE,.) was called.
|
|
// DWORD dwFlags [in] - Reserved. Leave as 0.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT MultiByteToModifiedUTF7([in] LPCSTR pszSource,
|
|
[out] LPSTR *ppszDestination,
|
|
[in] UINT uiSourceCP,
|
|
[in] DWORD dwFlags);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: ModifiedUTF7ToMultiByte
|
|
//
|
|
// Purpose:
|
|
// This function takes a modified IMAP UTF-7 string (as defined in RFC2060)
|
|
// and converts it to a multi-byte string. This function is only needed if the
|
|
// user has disabled transparent mailbox translation using SetDefaultCP(FALSE,0).
|
|
//
|
|
// Arguments:
|
|
// LPCSTR pszSource [in] - a null-terminated string containing the modified
|
|
// IMAP UTF-7 string to convert to multibyte.
|
|
// LPSTR *ppszDestination [out] - this function returns a pointer to the
|
|
// null-terminated multibyte string (in the system codepage) obtained
|
|
// from pszSource. It is the caller's responsiblity to MemFree this
|
|
// string when it is done with it.
|
|
// UINT uiDestintationCP [in] - indicates the desired codepage for the
|
|
// destination string. Note that no translation is performed if
|
|
// SetDefaultCP(FALSE,.) was called.
|
|
// DWORD dwFlags [in] - Reserved. Leave as 0.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure. Success result codes include:
|
|
// S_OK - pszSource successfully converted to modified UTF-7
|
|
// IXP_S_IMAP_VERBATIM_MBOX - pszSource could not be converted to multibyte,
|
|
// so ppszDestination contains a duplicate of pszSource. If target CP
|
|
// is Unicode, pszSource is converted to Unicode with the assumption
|
|
// that it is USASCII. IMAP_MBOXXLATE_VERBATIMOK must have been set via
|
|
// SetDefaultCP in order to get this behaviour.
|
|
//***************************************************************************
|
|
HRESULT ModifiedUTF7ToMultiByte([in] LPCSTR pszSource,
|
|
[out] LPSTR *ppszDestination,
|
|
[in] UINT uiDestinationCP,
|
|
[in] DWORD dwFlags);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: SetIdleMode
|
|
//
|
|
// Purpose:
|
|
// The IMAP IDLE extension allows the server to unilaterally report changes
|
|
// to the currently selected mailbox: new email, flag updates, and message
|
|
// expunges. IIMAPTransport always enters IDLE mode when no IMAP commands
|
|
// are pending, but it turns out that this can result in unnecessary
|
|
// entry and exit of IDLE mode when the caller tries to sequence IMAP commands.
|
|
// This function allows the caller to disable the use of the IDLE extension.
|
|
//
|
|
// Arguments:
|
|
// DWORD dwIdleFlags [in] - enables or disables the use of the IDLE extension.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT SetIdleMode([in] DWORD dwIdleFlags);
|
|
|
|
// Idle Flags
|
|
const DWORD IMAP_IDLE_DISABLE = 0x00000000;
|
|
const DWORD IMAP_IDLE_ENABLE = 0x00000001;
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: EnableFetchEx
|
|
//
|
|
// Purpose:
|
|
// IIMAPTransport only understood a subset of FETCH response tags. Notable
|
|
// omissions included ENVELOPE and BODYSTRUCTURE. Calling this function
|
|
// changes the behaviour of IIMAPTransport::Fetch. Instead of returning
|
|
// FETCH responses via IIMAPCallback::OnResponse(irtUPDATE_MSG),
|
|
// the FETCH response is returned via OnResponse(irtUPDATE_MSG_EX).
|
|
// Other FETCH-related responses remain unaffected (eg, irtFETCH_BODY).
|
|
//
|
|
// Arguments:
|
|
// DWORD dwFetchExFlags [in] - enables or disables FETCH extensions.
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT EnableFetchEx([in] DWORD dwFetchExFlags);
|
|
|
|
// FetchEx flags
|
|
const DWORD IMAP_FETCHEX_DISABLE = 0x00000000;
|
|
const DWORD IMAP_FETCHEX_ENABLE = 0x00000001;
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: SetWindow
|
|
//
|
|
// Purpose:
|
|
// This function creates a new window for async winsock processing
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT SetWindow(void);
|
|
|
|
|
|
//***************************************************************************
|
|
// Function: ResetWindow
|
|
//
|
|
// Purpose:
|
|
// This function closes a window for async winsock processing
|
|
//
|
|
// Returns:
|
|
// HRESULT indicating success or failure.
|
|
//***************************************************************************
|
|
HRESULT ResetWindow(void);
|
|
|
|
} // interface IIMAPTransport2
|
|
|
|
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// Exported C Functions")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("#if !defined(_IMNXPORT_)")
|
|
cpp_quote("#define IMNXPORTAPI DECLSPEC_IMPORT HRESULT WINAPI")
|
|
cpp_quote("#else")
|
|
cpp_quote("#define IMNXPORTAPI HRESULT WINAPI")
|
|
cpp_quote("#endif")
|
|
cpp_quote("#ifdef __cplusplus")
|
|
cpp_quote("extern \"C\" {")
|
|
cpp_quote("#endif")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// CreateRASTransport")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Description:")
|
|
cpp_quote("// This method creates a IRASTransport object. The client must initialize the")
|
|
cpp_quote("// object by calling IRASTransport::InitNew")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Parameters:")
|
|
cpp_quote("// ppTransport Upon successful return, contains the a pointer to")
|
|
cpp_quote("// an IRASTransport interface")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Return Values:")
|
|
cpp_quote("// S_OK Successful.")
|
|
cpp_quote("// E_INVALIDARG ppTransport is NULL")
|
|
cpp_quote("// E_OUTOFMEMORY Memory allocation failure...")
|
|
cpp_quote("// ")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("IMNXPORTAPI CreateRASTransport(")
|
|
cpp_quote(" /* out */ IRASTransport **ppTransport);")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// CreateNNTPTransport")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Description:")
|
|
cpp_quote("// This method creates a INNTPTransport object. The client must initialize the")
|
|
cpp_quote("// object by calling INNTPTransport::InitNew")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Parameters:")
|
|
cpp_quote("// ppTransport Upon successful return, contains the a pointer to")
|
|
cpp_quote("// an INNTPTransport interface")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Return Values:")
|
|
cpp_quote("// S_OK Successful.")
|
|
cpp_quote("// E_INVALIDARG ppTransport is NULL")
|
|
cpp_quote("// E_OUTOFMEMORY Memory allocation failure...")
|
|
cpp_quote("// ")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("IMNXPORTAPI CreateNNTPTransport(")
|
|
cpp_quote(" /* out */ INNTPTransport **ppTransport);")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// CreateSMTPTransport")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Description:")
|
|
cpp_quote("// This method creates a ISMTPTransport object. The client must initialize the")
|
|
cpp_quote("// object by calling ISMTPTransport::InitNew")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Parameters:")
|
|
cpp_quote("// ppTransport Upon successful return, contains the a pointer to")
|
|
cpp_quote("// an ISMTPTransport interface")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Return Values:")
|
|
cpp_quote("// S_OK Successful.")
|
|
cpp_quote("// E_INVALIDARG ppTransport is NULL")
|
|
cpp_quote("// E_OUTOFMEMORY Memory allocation failure...")
|
|
cpp_quote("// ")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("IMNXPORTAPI CreateSMTPTransport(")
|
|
cpp_quote(" /* out */ ISMTPTransport **ppTransport);")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// CreatePOP3Transport")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Description:")
|
|
cpp_quote("// This method creates a IPOP3Transport object. The client must initialize the")
|
|
cpp_quote("// object by calling IPOP3Transport::InitNew")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Parameters:")
|
|
cpp_quote("// ppTransport Upon successful return, contains the a pointer to")
|
|
cpp_quote("// an IPOP3Transport interface")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Return Values:")
|
|
cpp_quote("// S_OK Successful.")
|
|
cpp_quote("// E_INVALIDARG ppTransport is NULL")
|
|
cpp_quote("// E_OUTOFMEMORY Memory allocation failure...")
|
|
cpp_quote("// ")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("IMNXPORTAPI CreatePOP3Transport(")
|
|
cpp_quote(" /* out */ IPOP3Transport **ppTransport);")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// CreateIMAPTransport")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Description:")
|
|
cpp_quote("// This method creates a IIMAPTransport object. The client must initialize the")
|
|
cpp_quote("// object by calling IIMAPTransport::InitNew")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Parameters:")
|
|
cpp_quote("// ppTransport Upon successful return, contains the a pointer to")
|
|
cpp_quote("// an IIMAPTransport interface")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Return Values:")
|
|
cpp_quote("// S_OK Successful.")
|
|
cpp_quote("// E_INVALIDARG ppTransport is NULL")
|
|
cpp_quote("// E_OUTOFMEMORY Memory allocation failure...")
|
|
cpp_quote("// ")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("IMNXPORTAPI CreateIMAPTransport(")
|
|
cpp_quote(" /* out */ IIMAPTransport **ppTransport);")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// CreateIMAPTransport2")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Description:")
|
|
cpp_quote("// This method creates an IIMAPTransport2 object. The client must initialize the")
|
|
cpp_quote("// object by calling IIMAPTransport2::InitNew")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Parameters:")
|
|
cpp_quote("// ppTransport Upon successful return, contains the a pointer to")
|
|
cpp_quote("// an IIMAPTransport2 interface")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Return Values:")
|
|
cpp_quote("// S_OK Successful.")
|
|
cpp_quote("// E_INVALIDARG ppTransport is NULL")
|
|
cpp_quote("// E_OUTOFMEMORY Memory allocation failure...")
|
|
cpp_quote("// ")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("IMNXPORTAPI CreateIMAPTransport2(")
|
|
cpp_quote(" /* out */ IIMAPTransport2 **ppTransport);")
|
|
cpp_quote("")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("// CreateRangeList")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Description:")
|
|
cpp_quote("// This method creates a IRangeList object.")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Parameters:")
|
|
cpp_quote("// ppRangeList Upon successful return, contains the a pointer to")
|
|
cpp_quote("// an IRangeList interface")
|
|
cpp_quote("// ")
|
|
cpp_quote("// Return Values:")
|
|
cpp_quote("// S_OK Successful.")
|
|
cpp_quote("// E_INVALIDARG ppRangeList is NULL")
|
|
cpp_quote("// E_OUTOFMEMORY Memory allocation failure...")
|
|
cpp_quote("// ")
|
|
cpp_quote("// --------------------------------------------------------------------------------")
|
|
cpp_quote("IMNXPORTAPI CreateRangeList(")
|
|
cpp_quote(" /* out */ IRangeList **ppRangeList);")
|
|
cpp_quote("")
|
|
cpp_quote("#ifdef __cplusplus")
|
|
cpp_quote("}")
|
|
cpp_quote("#endif")
|
|
cpp_quote("")
|