// -------------------------------------------------------------------------------- // 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 ") cpp_quote("#include ") 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: // foo@bar.com // 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: // foo@bar.com // 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("")