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

import "objidl.idl";
import "oleidl.idl";
import "servprov.idl";
import "msxml.idl";

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

interface IInternetProtocolSink;

/*****************************************************************************
 * IInternet interface
 */
[
    object,
    uuid(79eac9e0-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique),
    local
]
interface IInternet : IUnknown
{
    typedef [unique] IInternet *LPIINTERNET;
}

/*****************************************************************************
 * IBinding interface
 */
[
    object,
    uuid(79eac9c0-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IBinding : IUnknown
{
    typedef [unique] IBinding *LPBINDING;

    HRESULT Abort();
    HRESULT Suspend();
    HRESULT Resume();

    HRESULT SetPriority(
        [in] LONG nPriority);

    HRESULT GetPriority(
        [out] LONG * pnPriority);

    [local]
    HRESULT GetBindResult(
        [out] CLSID *pclsidProtocol,
        [out] DWORD *pdwResult,
        [out] LPOLESTR *pszResult,
        [in, out] DWORD *pdwReserved);

    [call_as(GetBindResult)]
    HRESULT RemoteGetBindResult(
        [out] CLSID *pclsidProtocol,
        [out] DWORD *pdwResult,
        [out] LPOLESTR *pszResult,
        [in] DWORD dwReserved);
}


/*****************************************************************************
 * IBindStatusCallback interface
 */
[
    object,
    uuid(79eac9c1-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IBindStatusCallback : IUnknown
{
    typedef [unique] IBindStatusCallback *LPBINDSTATUSCALLBACK;

    typedef enum
    {
        BINDVERB_GET    = 0x00000000,
        BINDVERB_POST   = 0x00000001,
        BINDVERB_PUT    = 0x00000002,
        BINDVERB_CUSTOM = 0x00000003
    } BINDVERB;

    typedef enum
    {
        BINDINFOF_URLENCODESTGMEDDATA = 0x00000001,
        BINDINFOF_URLENCODEDEXTRAINFO = 0x00000002
    } BINDINFOF;

    typedef enum
    {
        BINDF_ASYNCHRONOUS = 0x00000001,
        BINDF_ASYNCSTORAGE = 0x00000002,
        BINDF_NOPROGRESSIVERENDERING = 0x00000004,
        BINDF_OFFLINEOPERATION = 0x00000008,
        BINDF_GETNEWESTVERSION = 0x00000010,
        BINDF_NOWRITECACHE = 0x00000020,
        BINDF_NEEDFILE = 0x00000040,
        BINDF_PULLDATA = 0x00000080,
        BINDF_IGNORESECURITYPROBLEM = 0x00000100,
        BINDF_RESYNCHRONIZE = 0x00000200,
        BINDF_HYPERLINK = 0x00000400,
        BINDF_NO_UI = 0x00000800,
        BINDF_SILENTOPERATION = 0x00001000,
        BINDF_PRAGMA_NO_CACHE = 0x00002000,
        BINDF_GETCLASSOBJECT = 0x00004000,
        BINDF_RESERVED_1 = 0x00008000,
        BINDF_FREE_THREADED = 0x00010000,
        BINDF_DIRECT_READ = 0x00020000,
        BINDF_FORMS_SUBMIT = 0x00040000,
        BINDF_GETFROMCACHE_IF_NET_FAIL = 0x00080000,
        BINDF_FROMURLMON = 0x00100000,
        BINDF_FWD_BACK = 0x00200000,
        BINDF_PREFERDEFAULTHANDLER = 0x00400000,
        BINDF_ENFORCERESTRICTED = 0x00800000
    } BINDF;

    typedef enum
    {
        URL_ENCODING_NONE         = 0x00000000,
        URL_ENCODING_ENABLE_UTF8  = 0x10000000,
        URL_ENCODING_DISABLE_UTF8 = 0x20000000
    } URL_ENCODING;

    typedef struct _tagBINDINFO
    {
        ULONG cbSize;
        LPWSTR szExtraInfo;
        STGMEDIUM stgmedData;
        DWORD grfBindInfoF;
        DWORD dwBindVerb;
        LPWSTR szCustomVerb;
        DWORD cbstgmedData;
        DWORD dwOptions;
        DWORD dwOptionsFlags;
        DWORD dwCodePage;
        SECURITY_ATTRIBUTES securityAttributes;
        IID iid;
        IUnknown *pUnk;
        DWORD dwReserved;
    } BINDINFO;

    typedef struct _REMSECURITY_ATTRIBUTES
    {
        DWORD nLength;
        DWORD lpSecurityDescriptor;
        BOOL bInheritHandle;
    } REMSECURITY_ATTRIBUTES, *PREMSECURITY_ATTRIBUTES, *LPREMSECURITY_ATTRIBUTES;

    typedef struct _tagRemBINDINFO
    {
        ULONG cbSize;
        LPWSTR szExtraInfo;
        DWORD grfBindInfoF;
        DWORD dwBindVerb;
        LPWSTR szCustomVerb;
        DWORD cbstgmedData;
        DWORD dwOptions;
        DWORD dwOptionsFlags;
        DWORD dwCodePage;
        REMSECURITY_ATTRIBUTES securityAttributes;
        IID iid;
        IUnknown *pUnk;
        DWORD dwReserved;
    } RemBINDINFO;

    typedef struct tagRemFORMATETC
    {
        DWORD cfFormat;
        DWORD ptd;
        DWORD dwAspect;
        LONG lindex;
        DWORD tymed;
    } RemFORMATETC, *LPREMFORMATETC;

    typedef enum
    {
        BSCF_FIRSTDATANOTIFICATION = 0x01,
        BSCF_INTERMEDIATEDATANOTIFICATION = 0x02,
        BSCF_LASTDATANOTIFICATION = 0x04,
        BSCF_DATAFULLYAVAILABLE = 0x08,
        BSCF_AVAILABLEDATASIZEUNKNOWN = 0x10,
        BSCF_SKIPDRAINDATAFORFILEURLS = 0x20,
        BSCF_64BITLENGTHDOWNLOAD = 0x40
    } BSCF;

    typedef enum BINDSTATUS
    {
	BINDSTATUS_FINDINGRESOURCE = 1,
	BINDSTATUS_CONNECTING,
	BINDSTATUS_REDIRECTING,
	BINDSTATUS_BEGINDOWNLOADDATA,
	BINDSTATUS_DOWNLOADINGDATA,
	BINDSTATUS_ENDDOWNLOADDATA,
	BINDSTATUS_BEGINDOWNLOADCOMPONENTS,
	BINDSTATUS_INSTALLINGCOMPONENTS,
	BINDSTATUS_ENDDOWNLOADCOMPONENTS,
	BINDSTATUS_USINGCACHEDCOPY,
	BINDSTATUS_SENDINGREQUEST,
	BINDSTATUS_CLASSIDAVAILABLE,
	BINDSTATUS_MIMETYPEAVAILABLE,
	BINDSTATUS_CACHEFILENAMEAVAILABLE,
	BINDSTATUS_BEGINSYNCOPERATION,
	BINDSTATUS_ENDSYNCOPERATION,
	BINDSTATUS_BEGINUPLOADDATA,
	BINDSTATUS_UPLOADINGDATA,
	BINDSTATUS_ENDUPLOADINGDATA,
	BINDSTATUS_PROTOCOLCLASSID,
	BINDSTATUS_ENCODING,
	BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE,
	BINDSTATUS_CLASSINSTALLLOCATION,
	BINDSTATUS_DECODING,
	BINDSTATUS_LOADINGMIMEHANDLER,
	BINDSTATUS_CONTENTDISPOSITIONATTACH,
	BINDSTATUS_FILTERREPORTMIMETYPE,
	BINDSTATUS_CLSIDCANINSTANTIATE,
	BINDSTATUS_IUNKNOWNAVAILABLE,
	BINDSTATUS_DIRECTBIND,
	BINDSTATUS_RAWMIMETYPE,
	BINDSTATUS_PROXYDETECTING,
	BINDSTATUS_ACCEPTRANGES,
        BINDSTATUS_COOKIE_SENT,
        BINDSTATUS_COMPACT_POLICY_RECEIVED,
        BINDSTATUS_COOKIE_SUPPRESSED,
        BINDSTATUS_COOKIE_STATE_UNKNOWN,
        BINDSTATUS_COOKIE_STATE_ACCEPT,
        BINDSTATUS_COOKIE_STATE_REJECT,
        BINDSTATUS_COOKIE_STATE_PROMPT,
        BINDSTATUS_COOKIE_STATE_LEASH,
        BINDSTATUS_COOKIE_STATE_DOWNGRADE,
        BINDSTATUS_POLICY_HREF,
        BINDSTATUS_P3P_HEADER,
        BINDSTATUS_SESSION_COOKIE_RECEIVED,
        BINDSTATUS_PERSISTENT_COOKIE_RECEIVED,
        BINDSTATUS_SESSION_COOKIES_ALLOWED,
        BINDSTATUS_CACHECONTROL,
        BINDSTATUS_CONTENTDISPOSITIONFILENAME,
        BINDSTATUS_MIMETEXTPLAINMISMATCH,
        BINDSTATUS_PUBLISHERAVAILABLE,
        BINDSTATUS_DISPLAYNAMEAVAILABLE
    } BINDSTATUS;


    HRESULT OnStartBinding(
        [in] DWORD dwReserved,
        [in] IBinding * pib);

    HRESULT GetPriority(
        [out] LONG * pnPriority);

    HRESULT OnLowResource(
        [in] DWORD reserved);

    HRESULT OnProgress(
        [in] ULONG ulProgress,
        [in] ULONG ulProgressMax,
        [in] ULONG ulStatusCode,
        [in] LPCWSTR szStatusText);

    HRESULT OnStopBinding(
        [in] HRESULT hresult,
        [in, unique] LPCWSTR szError);

    [local]
    HRESULT GetBindInfo(
        [out] DWORD *grfBINDF,
        [in, out, unique] BINDINFO * pbindinfo);

    [call_as(GetBindInfo)]
    HRESULT RemoteGetBindInfo(
        [out] DWORD *grfBINDF,
        [in, out, unique] RemBINDINFO * pbindinfo,
        [in, out, unique] RemSTGMEDIUM* pstgmed);

    [local]
    HRESULT OnDataAvailable(
        [in] DWORD grfBSCF,
        [in] DWORD dwSize,
        [in] FORMATETC* pformatetc,
        [in] STGMEDIUM* pstgmed);

    [call_as(OnDataAvailable)]
    HRESULT RemoteOnDataAvailable(
        [in] DWORD grfBSCF,
        [in] DWORD dwSize,
        [in] RemFORMATETC *pformatetc,
        [in] RemSTGMEDIUM* pstgmed);

    HRESULT OnObjectAvailable(
        [in] REFIID riid,
        [in, iid_is(riid)] IUnknown* punk);
}

/*****************************************************************************
 * IAuthenticate interface
 */
[
    local,
    object,
    uuid(79EAC9D0-BAf9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IAuthenticate : IUnknown
{
    typedef [unique] IAuthenticate *LPAUTHENTICATION;

    HRESULT Authenticate(
        [out] HWND* phwnd,
        [out] LPWSTR *pszUsername,
        [out] LPWSTR *pszPassword);
}

/*****************************************************************************
 * IHttpNegotiate interface
 */
[
    object,
    uuid(79EAC9D2-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IHttpNegotiate : IUnknown
{
    typedef [unique] IHttpNegotiate *LPHTTPNEGOTIATE;

    HRESULT BeginningTransaction(
        [in] LPCWSTR szURL,
        [in, unique] LPCWSTR szHeaders,
        [in] DWORD dwReserved,
        [out] LPWSTR *pszAdditionalHeaders);

    HRESULT OnResponse(
        [in] DWORD dwResponseCode,
        [in, unique] LPCWSTR szResponseHeaders,
        [in, unique] LPCWSTR szRequestHeaders,
        [out] LPWSTR *pszAdditionalRequestHeaders);
}

/*****************************************************************************
 * IHttpNegotiate2 interface
 */
[
    object,
    uuid(4F9F9FCB-E0F4-48eb-B7AB-FA2EA9365CB4),
    pointer_default(unique)
]
interface IHttpNegotiate2 : IHttpNegotiate
{
    typedef [unique] IHttpNegotiate2 *LPHTTPNEGOTIATE2;

    HRESULT GetRootSecurityId(
         [out, size_is(*pcbSecurityId)] BYTE *pbSecurityId,
         [in, out] DWORD *pcbSecurityId,
         [in] DWORD_PTR dwReserved);
}

/*****************************************************************************
 * IBindHost interface
 */
cpp_quote("#define SID_IBindHost IID_IBindHost")
cpp_quote("#define SID_SBindHost IID_IBindHost")
[
    object,
    uuid(fc4801a1-2ba9-11cf-a229-00aa003d7352),
    pointer_default(unique)
]
interface IBindHost : IUnknown
{
    typedef [unique] IBindHost *LPBINDHOST;

    HRESULT CreateMoniker(
        [in] LPOLESTR szName,
        [in] IBindCtx *pBC,
        [out] IMoniker** ppmk,
        [in] DWORD dwReserved);

    [local]
    HRESULT MonikerBindToStorage(
        [in] IMoniker *pMk,
        [in] IBindCtx *pBC,
        [in] IBindStatusCallback *pBSC,
        [in] REFIID riid,
        [out] void **ppvObj);

    [call_as(MonikerBindToStorage)]
    HRESULT RemoteMonikerBindToStorage(
        [in, unique] IMoniker *pMk,
        [in, unique] IBindCtx *pBC,
        [in, unique] IBindStatusCallback *pBSC,
        [in] REFIID riid,
        [out, iid_is(riid)] IUnknown **ppvObj);

    [local]
    HRESULT MonikerBindToObject(
        [in] IMoniker *pMk,
        [in] IBindCtx *pBC,
        [in] IBindStatusCallback *pBSC,
        [in] REFIID riid,
        [out] void **ppvObj);

    [call_as(MonikerBindToObject)]
    HRESULT RemoteMonikerBindToObject(
        [in, unique] IMoniker *pMk,
        [in, unique] IBindCtx *pBC,
        [in, unique] IBindStatusCallback *pBSC,
        [in] REFIID riid,
        [out, iid_is(riid)] IUnknown **ppvObj);
}


/*****************************************************************************
 * IWinInetInfo interface
 */
[
    object,
    uuid(79eac9d6-bafa-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IWinInetInfo : IUnknown
{
    typedef [unique] IWinInetInfo *LPWININETINFO;

    [local]
    HRESULT QueryOption(
        [in] DWORD dwOption,
        [in, out, size_is(*pcbBuf)] LPVOID pBuffer,
        [in, out] DWORD *pcbBuf);

    [call_as(QueryOption)]
    HRESULT RemoteQueryOption(
        [in] DWORD  dwOption,
        [in, out, size_is(*pcbBuf)] BYTE *pBuffer,
        [in, out] DWORD *pcbBuf);
}



/*****************************************************************************
 * IWinInetHttpInfo interface
 */
[
    object,
    uuid(79eac9d8-bafa-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IWinInetHttpInfo : IWinInetInfo
{
    typedef [unique] IWinInetHttpInfo *LPWININETHTTPINFO;

    [local]
    HRESULT QueryInfo(
        [in] DWORD dwOption,
        [in, out,size_is(*pcbBuf)] LPVOID pBuffer,
        [in, out] DWORD *pcbBuf,
        [in, out] DWORD *pdwFlags,
        [in, out] DWORD *pdwReserved);

    [call_as(QueryInfo)]
    HRESULT RemoteQueryInfo(
        [in] DWORD dwOption,
        [in,out,size_is(*pcbBuf)] BYTE *pBuffer,
        [in, out] DWORD *pcbBuf,
        [in, out] DWORD *pdwFlags,
        [in, out] DWORD *pdwReserved);
}

/*****************************************************************************
 * IWindowForBindingUI interface
 */
[
    local,
    object,
    uuid(79eac9d5-bafa-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IWindowForBindingUI : IUnknown
{
    typedef [unique] IWindowForBindingUI *LPWINDOWFORBINDINGUI;

    HRESULT GetWindow(
        [in] REFGUID rguidReason,
        [out] HWND *phwnd);
}

/*****************************************************************************
 * IHttpSecurity interface
 */
[
    object,
    uuid(79eac9d7-bafa-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IHttpSecurity : IWindowForBindingUI
{
    typedef [unique] IHttpSecurity *LPHTTPSECURITY;

    HRESULT OnSecurityProblem(
        [in] DWORD dwProblem);
}


/*****************************************************************************
 * IPersistMoniker interface
 */
[
    object,
    uuid(79eac9c9-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IPersistMoniker : IUnknown
{
    typedef [unique] IPersistMoniker *LPPERSISTMONIKER;

    HRESULT GetClassID(
        [out] CLSID *pClassID);

    HRESULT IsDirty();

    HRESULT Load(
        [in] BOOL fFullyAvailable,
        [in] IMoniker *pimkName,
        [in] LPBC pibc,
        [in] DWORD grfMode);

    HRESULT Save(
        [in] IMoniker *pimkName,
        [in] LPBC pbc,
        [in] BOOL fRemember);

    HRESULT SaveCompleted(
        [in] IMoniker *pimkName,
        [in] LPBC pibc);

    HRESULT GetCurMoniker(
        [out] IMoniker **ppimkName);
}

/*****************************************************************************
 * IMonikerProp interface
 */
[
    object,
    uuid(A5CA5F7F-1847-4D87-9C5B-918509F7511D),
    pointer_default(unique)
]
interface IMonikerProp : IUnknown
{
    typedef [unique] IMonikerProp *LPMONIKERPROP;

    typedef enum {
        MIMETYPEPROP        = 0,
        USE_SRC_URL         = 1,
        CLASSIDPROP         = 2,
        TRUSTEDDOWNLOADPROP = 3,
        POPUPLEVELPROP      = 4
    } MONIKERPROPERTY;

    HRESULT PutProperty(
        [in] MONIKERPROPERTY mkp,
        [in] LPCWSTR val);
}

cpp_quote("#ifndef _LPBINDPROTOCOL_DEFINED")
cpp_quote("#define _LPBINDPROTOCOL_DEFINED")

/*****************************************************************************
 * IBindProtocol interface
 */
[
    local,
    object,
    uuid(79EAC9CD-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IBindProtocol : IUnknown
{
    typedef [unique] IBindProtocol *LPBINDPROTOCOL;

    HRESULT CreateBinding(
        [in] LPCWSTR szUrl,
        [in] IBindCtx *pbc,
        [out] IBinding **ppb);
}

cpp_quote("#endif /* !defined _LPBINDPROTOCOL_DEFINED */")

/*****************************************************************************
 * IInternetBindInfo interface
 */
[
    local,
    object,
    uuid(79EAC9E1-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IInternetBindInfo : IUnknown
{
    typedef [unique] IInternetBindInfo *LPIINTERNETBINDINFO;

    typedef enum tagBINDSTRING
    {
        BINDSTRING_HEADERS = 1,
        BINDSTRING_ACCEPT_MIMES,
        BINDSTRING_EXTRA_URL,
        BINDSTRING_LANGUAGE,
        BINDSTRING_USERNAME,
        BINDSTRING_PASSWORD,
        BINDSTRING_UA_PIXELS,
        BINDSTRING_UA_COLOR,
        BINDSTRING_OS,
        BINDSTRING_USER_AGENT,
        BINDSTRING_ACCEPT_ENCODINGS,
        BINDSTRING_POST_COOKIE,
        BINDSTRING_POST_DATA_MIME,
        BINDSTRING_URL,
        BINDSTRING_IID,
        BINDSTRING_FLAG_BIND_TO_OBJECT,
        BINDSTRING_PTR_BIND_CONTEXT
    } BINDSTRING;

    HRESULT GetBindInfo(
        [out] DWORD *grfBINDF,
        [in, out, unique] BINDINFO *pbindinfo);

    HRESULT GetBindString(
        [in]      ULONG ulStringType,
        [in, out] LPOLESTR *ppwzStr,
        [in]      ULONG cEl,
        [in, out] ULONG *pcElFetched);
}

/*****************************************************************************
 * IInternetPriority interface
 */
[
    local,
    object,
    uuid(79EAC9EB-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IInternetPriority : IUnknown
{
    typedef [unique] IInternetPriority *LPIINTERNETPRIORITY;

    HRESULT SetPriority([in] LONG nPriority);
    HRESULT GetPriority([out] LONG *pnPriority);
}

/*****************************************************************************
 * IInternetProtocolRoot interface
 */
[
    local,
    object,
    uuid(79EAC9E3-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IInternetProtocolRoot : IUnknown
{
    typedef [unique] IInternetProtocolRoot *LPIINTERNETPROTOCOLROOT;

    typedef enum _tagPI_FLAGS
    {
        PI_PARSE_URL         = 0x00000001,
        PI_FILTER_MODE       = 0x00000002,
        PI_FORCE_ASYNC       = 0x00000004,
        PI_USE_WORKERTHREAD  = 0x00000008,
        PI_MIMEVERIFICATION  = 0x00000010,
        PI_CLSIDLOOKUP       = 0x00000020,
        PI_DATAPROGRESS      = 0x00000040,
        PI_SYNCHRONOUS       = 0x00000080,
        PI_APARTMENTTHREADED = 0x00000100,
        PI_CLASSINSTALL      = 0x00000200,
        PD_FORCE_SWITCH      = 0x00010000
    } PI_FLAGS;

    typedef struct _tagPROTOCOLDATA
    {
        DWORD grfFlags;
        DWORD dwState;
        LPVOID pData;
        ULONG cbData;
    } PROTOCOLDATA;

    HRESULT Start(
        [in] LPCWSTR szUrl,
        [in] IInternetProtocolSink *pOIProtSink,
        [in] IInternetBindInfo *pOIBindInfo,
        [in] DWORD grfPI,
        [in] HANDLE_PTR dwReserved);

    HRESULT Continue(
        [in] PROTOCOLDATA *pProtocolData);

    HRESULT Abort(
        [in] HRESULT hrReason,
        [in] DWORD dwOptions);

    HRESULT Terminate(
        [in] DWORD dwOptions);

    HRESULT Suspend();

    HRESULT Resume();
}

/*****************************************************************************
 * IInternetProtocolSink interface
 */
[
    local,
    object,
    uuid(79EAC9E5-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IInternetProtocolSink : IUnknown
{
    typedef [unique] IInternetProtocolSink *LPIINTERNETPROTOCOLSINK;

    HRESULT Switch(
        [in] PROTOCOLDATA *pProtocolData);

    HRESULT ReportProgress(
        [in] ULONG ulStatusCode,
        [in] LPCWSTR szStatusText);

    HRESULT ReportData(
        [in] DWORD grfBSCF,
        [in] ULONG ulProgress,
        [in] ULONG ulProgressMax);

    HRESULT ReportResult(
        [in] HRESULT hrResult,
        [in] DWORD dwError,
        [in] LPCWSTR szResult);
}

/*****************************************************************************
 * IInternetProtocol interface
 */
[
    local,
    object,
    uuid(79EAC9E4-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IInternetProtocol : IInternetProtocolRoot
{
    typedef [unique] IInternetProtocol *LPIINTERNETPROTOCOL;

    HRESULT Read(
        [in,out, size_is(cb), length_is(*pcbRead)] void *pv,
        [in]  ULONG cb,
        [out] ULONG *pcbRead);

    HRESULT Seek(
        [in]  LARGE_INTEGER dlibMove,
        [in]  DWORD dwOrigin,
        [out] ULARGE_INTEGER *plibNewPosition);

    HRESULT LockRequest(
        [in] DWORD dwOptions);

    HRESULT UnlockRequest();
}

/*****************************************************************************
 * IInternetProtocolInfo interface
 */
[
    local,
    object,
    uuid(79eac9ec-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IInternetProtocolInfo : IUnknown
{
    typedef [unique] IInternetProtocolInfo *LPIINTERNETPROTOCOLINFO;

    typedef enum _tagPARSEACTION
    {
        PARSE_CANONICALIZE = 1,
        PARSE_FRIENDLY,
        PARSE_SECURITY_URL,
        PARSE_ROOTDOCUMENT,
        PARSE_DOCUMENT,
        PARSE_ANCHOR,
        PARSE_ENCODE,
        PARSE_DECODE,
        PARSE_PATH_FROM_URL,
        PARSE_URL_FROM_PATH,
        PARSE_MIME,
        PARSE_SERVER,
        PARSE_SCHEMA,
        PARSE_SITE,
        PARSE_DOMAIN,
        PARSE_LOCATION,
        PARSE_SECURITY_DOMAIN,
        PARSE_ESCAPE,
        PARSE_UNESCAPE
    } PARSEACTION;

    typedef enum _tagPSUACTION
    {
        PSU_DEFAULT = 1,
        PSU_SECURITY_URL_ONLY
    } PSUACTION;

    typedef enum _tagQUERYOPTION
    {
        QUERY_EXPIRATION_DATE = 1,
        QUERY_TIME_OF_LAST_CHANGE,
        QUERY_CONTENT_ENCODING,
        QUERY_CONTENT_TYPE,
        QUERY_REFRESH,
        QUERY_RECOMBINE,
        QUERY_CAN_NAVIGATE,
        QUERY_USES_NETWORK,
        QUERY_IS_CACHED,
        QUERY_IS_INSTALLEDENTRY,
        QUERY_IS_CACHED_OR_MAPPED,
        QUERY_USES_CACHE,
        QUERY_IS_SECURE,
        QUERY_IS_SAFE,
        QUERY_USES_HISTORYFOLDER
    } QUERYOPTION;

    HRESULT ParseUrl(
        [in] LPCWSTR pwzUrl,
        [in] PARSEACTION ParseAction,
        [in] DWORD dwParseFlags,
        [out] LPWSTR pwzResult,
        [in] DWORD cchResult,
        [out] DWORD *pcchResult,
        [in] DWORD dwReserved);

    HRESULT CombineUrl(
        [in] LPCWSTR pwzBaseUrl,
        [in] LPCWSTR pwzRelativeUrl,
        [in] DWORD dwCombineFlags,
        [out] LPWSTR pwzResult,
        [in] DWORD cchResult,
        [out] DWORD *pcchResult,
        [in] DWORD dwReserved);

    HRESULT CompareUrl(
        [in] LPCWSTR pwzUrl1,
        [in] LPCWSTR pwzUrl2,
        [in] DWORD dwCompareFlags);

    HRESULT QueryInfo(
        [in] LPCWSTR pwzUrl,
        [in] QUERYOPTION OueryOption,
        [in] DWORD dwQueryFlags,
        [in, out,size_is(*pcbBuf)] LPVOID pBuffer,
        [in] DWORD cbBuffer,
        [in, out] DWORD *pcbBuf,
        [in] DWORD dwReserved);
}

/*****************************************************************************
 * IInternetSession interface
 */
[
    local,
    object,
    uuid(79eac9e7-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IInternetSession : IUnknown
{
    typedef [unique] IInternetSession *LPIINTERNETSESSION;

    typedef enum _tagOIBDG_FLAGS
    {
        OIBDG_APARTMENTTHREADED = 0x0100,
        OIBDG_DATAONLY          = 0x1000
    } OIBDG_FLAGS;

    HRESULT RegisterNameSpace(
        [in] IClassFactory *pCF,
        [in] REFCLSID rclsid,
        [in] LPCWSTR pwzProtocol,
        [in] ULONG cPatterns,
        [in] const LPCWSTR *ppwzPatterns,
        [in] DWORD dwReserved);

    HRESULT UnregisterNameSpace(
        [in] IClassFactory *pCF,
        [in] LPCWSTR pszProtocol);

    HRESULT RegisterMimeFilter(
        [in] IClassFactory *pCF,
        [in] REFCLSID rclsid,
        [in] LPCWSTR pwzType);

    HRESULT UnregisterMimeFilter(
        [in] IClassFactory *pCF,
        [in] LPCWSTR pwzType);

    HRESULT CreateBinding(
        [in] LPBC pBC,
        [in] LPCWSTR szUrl,
        [in] IUnknown *pUnkOuter,
        [out, unique] IUnknown **ppUnk,
        [out, unique] IInternetProtocol **ppOInetProt,
        [in] DWORD dwOption);

    HRESULT SetSessionOption(
        [in] DWORD dwOption,
        [in] LPVOID pBuffer,
        [in] DWORD dwBufferLength,
        [in] DWORD dwReserved);
}

/*****************************************************************************
 * IInternetSecurityMgrSite interface
 */
[
    local,
    object,
    uuid(79eac9ed-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IInternetSecurityMgrSite : IUnknown
{
    HRESULT GetWindow(
        [out] HWND *phwnd);

    HRESULT EnableModeless(
        [in] BOOL fEnable);
}


/*****************************************************************************
 * IInternetSecurityManager interface
 */
cpp_quote("#define SID_SInternetSecurityManager IID_IInternetSecurityManager")

[
    object,
    uuid(79eac9ee-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IInternetSecurityManager : IUnknown
{
    HRESULT SetSecuritySite(
        [in, unique] IInternetSecurityMgrSite *pSite);

    HRESULT GetSecuritySite(
        [out] IInternetSecurityMgrSite **ppSite);

    HRESULT MapUrlToZone(
        [in] LPCWSTR pwszUrl,
        [out] DWORD *pdwZone,
        [in] DWORD dwFlags);

cpp_quote("#define MAX_SIZE_SECURITY_ID 512")

    HRESULT GetSecurityId(
        [in] LPCWSTR pwszUrl,
        [out, size_is(*pcbSecurityId)] BYTE *pbSecurityId,
        [in, out] DWORD *pcbSecurityId,
        [in] DWORD_PTR dwReserved);


    typedef enum {
        PUAF_DEFAULT                = 0x00,
        PUAF_NOUI                   = 0x01,
        PUAF_ISFILE                 = 0x02,
        PUAF_WARN_IF_DENIED         = 0x04,
        PUAF_FORCEUI_FOREGROUND     = 0x08,
        PUAF_CHECK_TIPS             = 0x10
    } PUAF;

    HRESULT ProcessUrlAction(
        [in] LPCWSTR pwszUrl,
        [in] DWORD dwAction,
        [out, size_is(cbPolicy)] BYTE *pPolicy,
        [in] DWORD cbPolicy,
        [in] BYTE *pContext,
        [in] DWORD cbContext,
        [in] DWORD dwFlags,
        [in] DWORD dwReserved);

    HRESULT QueryCustomPolicy(
        [in] LPCWSTR pwszUrl,
        [in] REFGUID guidKey,
        [out, size_is(,*pcbPolicy)] BYTE **ppPolicy,
        [out] DWORD *pcbPolicy,
        [in] BYTE *pContext,
        [in] DWORD cbContext,
        [in] DWORD dwReserved);

    typedef enum {
        SZM_CREATE = 0x0,
        SZM_DELETE = 0x1
    } SZM_FLAGS;

    HRESULT SetZoneMapping(
        [in] DWORD dwZone,
        [in] LPCWSTR lpszPattern,
        [in] DWORD dwFlags);

    HRESULT GetZoneMappings(
        [in] DWORD dwZone,
        [out] IEnumString **ppenumString,
        [in] DWORD dwFlags);
}

cpp_quote("#define URLACTION_MIN                        0x00001000")
cpp_quote("#define URLACTION_DOWNLOAD_MIN               0x00001000")
cpp_quote("#define URLACTION_DOWNLOAD_SIGNED_ACTIVEX    0x00001001")
cpp_quote("#define URLACTION_DOWNLOAD_UNSIGNED_ACTIVEX  0x00001004")
cpp_quote("#define URLACTION_DOWNLOAD_CURR_MAX          0x00001004")
cpp_quote("#define URLACTION_DOWNLOAD_MAX               0x000011ff")

cpp_quote("#define URLACTION_ACTIVEX_MIN                     0x00001200")
cpp_quote("#define URLACTION_ACTIVEX_RUN                     0x00001200")
cpp_quote("#define URLPOLICY_ACTIVEX_CHECK_LIST              0x00010000")
cpp_quote("#define URLACTION_ACTIVEX_OVERRIDE_OBJECT_SAFETY  0x00001201")
cpp_quote("#define URLACTION_ACTIVEX_OVERRIDE_DATA_SAFETY    0x00001202")
cpp_quote("#define URLACTION_ACTIVEX_OVERRIDE_SCRIPT_SAFETY  0x00001203")
cpp_quote("#define URLACTION_SCRIPT_OVERRIDE_SAFETY          0x00001401")
cpp_quote("#define URLACTION_ACTIVEX_CONFIRM_NOOBJECTSAFETY  0x00001204")
cpp_quote("#define URLACTION_ACTIVEX_TREATASUNTRUSTED        0x00001205")
cpp_quote("#define URLACTION_ACTIVEX_CURR_MAX                0x00001205")
cpp_quote("#define URLACTION_ACTIVEX_MAX                     0x000013ff")

cpp_quote("#define URLACTION_SCRIPT_MIN           0x00001400")
cpp_quote("#define URLACTION_SCRIPT_RUN           0x00001400")
cpp_quote("#define URLACTION_SCRIPT_JAVA_USE      0x00001402")
cpp_quote("#define URLACTION_SCRIPT_SAFE_ACTIVEX  0x00001405")
cpp_quote("#define URLACTION_CROSS_DOMAIN_DATA    0x00001406")
cpp_quote("#define URLACTION_SCRIPT_PASTE         0x00001407")
cpp_quote("#define URLACTION_SCRIPT_CURR_MAX      0x00001407")
cpp_quote("#define URLACTION_SCRIPT_MAX           0x000015ff")

cpp_quote("#define URLACTION_HTML_MIN                0x00001600")
cpp_quote("#define URLACTION_HTML_SUBMIT_FORMS       0x00001601")
cpp_quote("#define URLACTION_HTML_SUBMIT_FORMS_FROM  0x00001602")
cpp_quote("#define URLACTION_HTML_SUBMIT_FORMS_TO    0x00001603")
cpp_quote("#define URLACTION_HTML_FONT_DOWNLOAD      0x00001604")
cpp_quote("#define URLACTION_HTML_JAVA_RUN           0x00001605")
cpp_quote("#define URLACTION_HTML_USERDATA_SAVE      0x00001606")
cpp_quote("#define URLACTION_HTML_SUBFRAME_NAVIGATE  0x00001607")
cpp_quote("#define URLACTION_HTML_META_REFRESH       0x00001608")
cpp_quote("#define URLACTION_HTML_MIXED_CONTENT      0x00001609")
cpp_quote("#define URLACTION_HTML_MAX                0x000017ff")

cpp_quote("#define URLACTION_SHELL_MIN              0x00001800")
cpp_quote("#define URLACTION_SHELL_INSTALL_DTITEMS  0x00001800")
cpp_quote("#define URLACTION_SHELL_MOVE_OR_COPY     0x00001802")
cpp_quote("#define URLACTION_SHELL_FILE_DOWNLOAD    0x00001803")
cpp_quote("#define URLACTION_SHELL_VERB             0x00001804")
cpp_quote("#define URLACTION_SHELL_WEBVIEW_VERB     0x00001805")
cpp_quote("#define URLACTION_SHELL_CURR_MAX         0x00001805")
cpp_quote("#define URLACTION_SHELL_MAX              0x000019ff")

cpp_quote("#define URLACTION_NETWORK_MIN                  0x00001a00")
cpp_quote("#define URLACTION_CREDENTIALS_USE              0x00001a00")
cpp_quote("#define URLACTION_AUTHENTICATE_CLIENT          0x00001a01")
cpp_quote("#define URLACTION_COOKIES                      0x00001a02")
cpp_quote("#define URLACTION_COOKIES_SESSION              0x00001a03")
cpp_quote("#define URLACTION_CLIENT_CERT_PROMPT           0x00001a04")
cpp_quote("#define URLACTION_COOKIES_THIRD_PARTY          0x00001a05")
cpp_quote("#define URLACTION_COOKIES_SESSION_THIRD_PARTY  0x00001a06")
cpp_quote("#define URLACTION_COOKIES_ENABLED              0x00001a10")
cpp_quote("#define URLACTION_NETWORK_CURR_MAX             0x00001a10")
cpp_quote("#define URLACTION_NETWORK_MAX                  0x00001bff")

cpp_quote("#define URLACTION_JAVA_MIN          0x00001c00")
cpp_quote("#define URLACTION_JAVA_PERMISSIONS  0x00001c00")
cpp_quote("#define URLPOLICY_JAVA_PROHIBIT     0x00000000")
cpp_quote("#define URLPOLICY_JAVA_HIGH         0x00010000")
cpp_quote("#define URLPOLICY_JAVA_MEDIUM       0x00020000")
cpp_quote("#define URLPOLICY_JAVA_LOW          0x00030000")
cpp_quote("#define URLPOLICY_JAVA_CUSTOM       0x00800000")
cpp_quote("#define URLACTION_JAVA_CURR_MAX     0x00001c00")
cpp_quote("#define URLACTION_JAVA_MAX          0x00001cff")

cpp_quote("#define URLACTION_INFODELIVERY_MIN                        0x00001d00")
cpp_quote("#define URLACTION_INFODELIVERY_NO_ADDING_CHANNELS         0x00001d00")
cpp_quote("#define URLACTION_INFODELIVERY_NO_EDITING_CHANNELS        0x00001d01")
cpp_quote("#define URLACTION_INFODELIVERY_NO_REMOVING_CHANNELS       0x00001d02")
cpp_quote("#define URLACTION_INFODELIVERY_NO_ADDING_SUBSCRIPTIONS    0x00001d03")
cpp_quote("#define URLACTION_INFODELIVERY_NO_EDITING_SUBSCRIPTIONS   0x00001d04")
cpp_quote("#define URLACTION_INFODELIVERY_NO_REMOVING_SUBSCRIPTIONS  0x00001d05")
cpp_quote("#define URLACTION_INFODELIVERY_NO_CHANNEL_LOGGING         0x00001d06")
cpp_quote("#define URLACTION_INFODELIVERY_CURR_MAX                   0x00001d06")
cpp_quote("#define URLACTION_INFODELIVERY_MAX                        0x00001dff")

cpp_quote("#define URLACTION_CHANNEL_SOFTDIST_MIN          0x00001e00")
cpp_quote("#define URLACTION_CHANNEL_SOFTDIST_PERMISSIONS  0x00001e05")
cpp_quote("#define URLPOLICY_CHANNEL_SOFTDIST_PROHIBIT     0x00010000")
cpp_quote("#define URLPOLICY_CHANNEL_SOFTDIST_PRECACHE     0x00020000")
cpp_quote("#define URLPOLICY_CHANNEL_SOFTDIST_AUTOINSTALL  0x00030000")
cpp_quote("#define URLACTION_CHANNEL_SOFTDIST_MAX          0x00001eff")

cpp_quote("#define URLPOLICY_ALLOW     0x00")
cpp_quote("#define URLPOLICY_QUERY     0x01")
cpp_quote("#define URLPOLICY_DISALLOW  0x03")

cpp_quote("#define URLPOLICY_NOTIFY_ON_ALLOW     0x10")
cpp_quote("#define URLPOLICY_NOTIFY_ON_DISALLOW  0x20")

cpp_quote("#define URLPOLICY_LOG_ON_ALLOW     0x40")
cpp_quote("#define URLPOLICY_LOG_ON_DISALLOW  0x80")

cpp_quote("#define URLPOLICY_DONTCHECKDLGBOX     0x100")

cpp_quote("#define URLPOLICY_CREDENTIALS_SILENT_LOGON_OK     0x00000000")
cpp_quote("#define URLPOLICY_CREDENTIALS_MUST_PROMPT_USER    0x00010000")
cpp_quote("#define URLPOLICY_CREDENTIALS_CONDITIONAL_PROMPT  0x00020000")
cpp_quote("#define URLPOLICY_CREDENTIALS_ANONYMOUS_ONLY      0x00030000")

cpp_quote("#define URLPOLICY_AUTHENTICATE_CLEARTEXT_OK        0x00000000")
cpp_quote("#define URLPOLICY_AUTHENTICATE_CHALLENGE_RESPONSE  0x00010000")
cpp_quote("#define URLPOLICY_AUTHENTICATE_MUTUAL_ONLY         0x00030000")

cpp_quote("#define URLPOLICY_MASK_PERMISSIONS  0x0f")
cpp_quote("#define GetUrlPolicyPermissions(dw)      (dw & URLPOLICY_MASK_PERMISSIONS)")
cpp_quote("#define SetUrlPolicyPermissions(dw,dw2)  ((dw) = ((dw) & ~URLPOLICY_MASK_PERMISSIONS) | (dw2))")

/*****************************************************************************
 * IInternetZoneManager interface
 */
[
    local,
    object,
    uuid(79EAC9EF-BAf9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IInternetZoneManager : IUnknown
{
    typedef [unique] IInternetZoneManager* LPURLZONEMANAGER;

    typedef enum tagURLZONE
    {
        URLZONE_PREDEFINED_MIN  = 0,
        URLZONE_LOCAL_MACHINE   = 0,
        URLZONE_INTRANET        = 1,
        URLZONE_TRUSTED         = 2,
        URLZONE_INTERNET        = 3,
        URLZONE_UNTRUSTED       = 4,
        URLZONE_PREDEFINED_MAX  = 999,
        URLZONE_USER_MIN        = 1000,
        URLZONE_USER_MAX        = 10000,
    }  URLZONE;

    typedef enum tagURLTEMPLATE
    {
        URLTEMPLATE_CUSTOM         = 0x00000,
        URLTEMPLATE_PREDEFINED_MIN = 0x10000,
        URLTEMPLATE_LOW            = 0x10000,
        URLTEMPLATE_MEDIUM         = 0x11000,
        URLTEMPLATE_HIGH           = 0x12000,
        URLTEMPLATE_PREDEFINED_MAX = 0x20000,
    } URLTEMPLATE ;

    typedef enum {
        ZAFLAGS_CUSTOM_EDIT            = 0x00000001,
        ZAFLAGS_ADD_SITES              = 0x00000002,
        ZAFLAGS_REQUIRE_VERIFICATION   = 0x00000004,
        ZAFLAGS_INCLUDE_PROXY_OVERRIDE = 0x00000008,
        ZAFLAGS_INCLUDE_INTRANET_SITES = 0x00000010,
        ZAFLAGS_NO_UI                  = 0x00000020,
        ZAFLAGS_SUPPORTS_VERIFICATION  = 0x00000040,
        ZAFLAGS_UNC_AS_INTRANET        = 0x00000080,
    } ZAFLAGS ;

    enum {
        MAX_ZONE_PATH        = 260,
        MAX_ZONE_DESCRIPTION = 200
    };

    typedef struct _ZONEATTRIBUTES {
        ULONG cbSize;
        WCHAR szDisplayName[MAX_ZONE_PATH];
        WCHAR szDescription[MAX_ZONE_DESCRIPTION];
        WCHAR szIconPath[MAX_ZONE_PATH];
        DWORD dwTemplateMinLevel;
        DWORD dwTemplateRecommended;
        DWORD dwTemplateCurrentLevel;
        DWORD dwFlags;
    } ZONEATTRIBUTES, *LPZONEATTRIBUTES;

    typedef enum _URLZONEREG {
        URLZONEREG_DEFAULT,
        URLZONEREG_HKLM,
        URLZONEREG_HKCU
    } URLZONEREG;

    HRESULT GetZoneAttributes(
        [in]              DWORD dwZone,
        [in, out, unique] ZONEATTRIBUTES* pZoneAttributes);

    HRESULT SetZoneAttributes(
        [in] DWORD dwZone,
        [in] ZONEATTRIBUTES* pZoneAttributes);

    HRESULT GetZoneCustomPolicy(
        [in]  DWORD dwZone,
        [in]  REFGUID guidKey,
        [out] BYTE **ppPolicy,
        [out] DWORD* pcbPolicy,
        [in]  URLZONEREG ulrZoneReg);

    HRESULT SetZoneCustomPolicy(
        [in] DWORD dwZone,
        [in] REFGUID guidKey,
        [in] BYTE *ppPolicy,
        [in] DWORD pcbPolicy,
        [in] URLZONEREG ulrZoneReg);

    HRESULT GetZoneActionPolicy(
        [in]  DWORD dwZone,
        [in]  DWORD dwAction,
        [out] BYTE* pPolicy,
        [in]  DWORD cbPolicy,
        [in]  URLZONEREG urlZoneReg);

    HRESULT SetZoneActionPolicy(
        [in] DWORD dwZone,
        [in] DWORD dwAction,
        [in] BYTE* pPolicy,
        [in] DWORD cbPolicy,
        [in] URLZONEREG urlZoneReg);

    HRESULT PromptAction(
        [in] DWORD dwAction,
        [in] HWND hwndParent,
        [in] LPCWSTR pwszUrl,
        [in] LPCWSTR pwszText,
        [in] DWORD dwPromptFlags );

    HRESULT LogAction(
        [in] DWORD dwAction,
        [in] LPCWSTR pwszUrl,
        [in] LPCWSTR pwszText,
        [in] DWORD dwLogFlags);

    HRESULT CreateZoneEnumerator(
        [out] DWORD* pdwEnum,
        [out] DWORD* pdwCount,
        [in]  DWORD dwFlags);

    HRESULT GetZoneAt(
        [in]  DWORD dwEnum,
        [in]  DWORD dwIndex,
        [out] DWORD* pdwZone);

    HRESULT DestroyZoneEnumerator(
        [in] DWORD dwEnum);

    HRESULT CopyTemplatePoliciesToZone(
        [in] DWORD dwTemplate,
        [in] DWORD dwZone,
        [in] DWORD dwReserved);
}

typedef struct _tagSOFTDISTINFO
{
    ULONG cbSize;
    DWORD dwFlags;
    DWORD dwAdState;
    LPWSTR szTitle;
    LPWSTR szAbstract;
    LPWSTR szHREF;
    DWORD dwInstalledVersionMS;
    DWORD dwInstalledVersionLS;
    DWORD dwUpdateVersionMS;
    DWORD dwUpdateVersionLS;
    DWORD dwAdvertisedVersionMS;
    DWORD dwAdvertisedVersionLS;
    DWORD dwReserved;
} SOFTDISTINFO, *LPSOFTDISTINFO;

typedef struct _tagCODEBASEHOLD
{
    DWORD cbSize;
    LPWSTR szDistUnit;
    LPWSTR szCodeBase;
    DWORD dwVersionMS;
    DWORD dwVersionLS;
    DWORD dwStyle;
} CODEBASEHOLD, *LPCODEBASEHOLD;

[
    local,
    object,
    uuid(b15b8dc1-c7e1-11d0-8680-00aa00bdcb71),
    pointer_default(unique)
]
interface ISoftDistExt : IUnknown
{
    HRESULT ProcessSoftDist(
        [in] LPCWSTR szCDFURL,
        [in] IXMLElement *pSoftDistElement,
        [in, out] LPSOFTDISTINFO lpsdi );

    HRESULT GetFirstCodeBase(
        [in] LPWSTR *szCodeBase,
        [in] LPDWORD dwMaxSize );

    HRESULT GetNextCodeBase(
        [in] LPWSTR *szCodeBase,
        [in] LPDWORD dwMaxSize );

    HRESULT AsyncInstallDistributionUnit(
        [in] IBindCtx *pbc,
        [in] LPVOID lpReserved,
        [in] DWORD flags,
        [in] LPCODEBASEHOLD lpcbh);
}

typedef enum _tagINTERNETFEATURELIST
{
    FEATURE_OBJECT_CACHING,
    FEATURE_ZONE_ELEVATION,
    FEATURE_MIME_HANDLING,
    FEATURE_MIME_SNIFFING,
    FEATURE_WINDOW_RESTRICTIONS,
    FEATURE_WEBOC_POPUPMANAGEMENT,
    FEATURE_BEHAVIORS,
    FEATURE_DISABLE_MK_PROTOCOL,
    FEATURE_LOCALMACHINE_LOCKDOWN,
    FEATURE_SECURITYBAND,
    FEATURE_RESTRICT_ACTIVEXINSTALL,
    FEATURE_VALIDATE_NAVIGATE_URL,
    FEATURE_RESTRICT_FILEDOWNLOAD,
    FEATURE_ADDON_MANAGEMENT,
    FEATURE_PROTOCOL_LOCKDOWN,
    FEATURE_HTTP_USERNAME_PASSWORD_DISABLE,
    FEATURE_SAFE_BINDTOOBJECT,
    FEATURE_UNC_SAVEDFILECHECK,
    FEATURE_GET_URL_DOM_FILEPATH_UNENCODED,
    FEATURE_TABBED_BROWSING,
    FEATURE_SSLUX,
    FEATURE_DISABLE_NAVIGATION_SOUNDS,
    FEATURE_DISABLE_LEGACY_COMPRESSION,
    FEATURE_FORCE_ADDR_AND_STATUS,
    FEATURE_XMLHTTP,
    FEATURE_DISABLE_TELNET_PROTOCOL,
    FEATURE_FEEDS,
    FEATURE_BLOCK_INPUT_PROMPTS,
    FEATURE_DOMSTORAGE,
    FEATURE_XDOMAINREQUEST,
    FEATURE_DATAURI,
    FEATURE_AJAX_CONNECTIONSERVICES,
    FEATURE_ENTRY_COUNT
} INTERNETFEATURELIST;

typedef struct _tagPROTOCOLFILTERDATA {
    DWORD cbSize;
    IInternetProtocolSink *pProtocolSink;
    IInternetProtocol *pProtocol;
    IUnknown *pUnk;
    DWORD dwFilterFlags;
} PROTOCOLFILTERDATA;

/*****************************************************************************
 * IUri interface
 */
[
    local,
    object,
    uuid(a39ee748-6a27-4817-a6f2-13914bef5890),
    pointer_default(unique)
]
interface IUri : IUnknown
{
    typedef enum
    {
        Uri_PROPERTY_ABSOLUTE_URI = 0,
        Uri_PROPERTY_STRING_START = Uri_PROPERTY_ABSOLUTE_URI,
        Uri_PROPERTY_AUTHORITY = 1,
        Uri_PROPERTY_DISPLAY_URI = 2,
        Uri_PROPERTY_DOMAIN = 3,
        Uri_PROPERTY_EXTENSION = 4,
        Uri_PROPERTY_FRAGMENT = 5,
        Uri_PROPERTY_HOST = 6,
        Uri_PROPERTY_PASSWORD = 7,
        Uri_PROPERTY_PATH = 8,
        Uri_PROPERTY_PATH_AND_QUERY = 9,
        Uri_PROPERTY_QUERY = 10,
        Uri_PROPERTY_RAW_URI = 11,
        Uri_PROPERTY_SCHEME_NAME = 12,
        Uri_PROPERTY_USER_INFO = 13,
        Uri_PROPERTY_USER_NAME = 14,
        Uri_PROPERTY_STRING_LAST = Uri_PROPERTY_USER_NAME,
        Uri_PROPERTY_HOST_TYPE = 15,
        Uri_PROPERTY_DWORD_START = Uri_PROPERTY_HOST_TYPE,
        Uri_PROPERTY_PORT = 16,
        Uri_PROPERTY_SCHEME = 17,
        Uri_PROPERTY_ZONE = 18,
        Uri_PROPERTY_DWORD_LAST = Uri_PROPERTY_ZONE
    } Uri_PROPERTY;

    HRESULT GetPropertyBSTR(
        [in]  Uri_PROPERTY uriProp,
        [out] BSTR *pbstrProperty,
        [in]  DWORD dwFlags);

    HRESULT GetPropertyLength(
        [in]  Uri_PROPERTY uriProp,
        [out] DWORD *pcchProperty,
        [in]  DWORD dwFlags);

    HRESULT GetPropertyDWORD(
        [in]  Uri_PROPERTY uriProp,
        [out] DWORD *pdwProperty,
        [in]  DWORD dwFlags);

    HRESULT HasProperty(
        [in] Uri_PROPERTY uriProp,
        [out] BOOL *pfHasProperty);

    HRESULT GetAbsoluteUri(
        [out] BSTR *pbstrAbsoluteUri);

    HRESULT GetAuthority(
        [out] BSTR *pbstrAuthority);

    HRESULT GetDisplayUri(
        [out] BSTR *pbstrDisplayString);

    HRESULT GetDomain(
        [out] BSTR *pbstrDomain);

    HRESULT GetExtension(
        [out] BSTR *pbstrExtension);

    HRESULT GetFragment(
        [out] BSTR *pbstrFragment);

    HRESULT GetHost(
        [out] BSTR *pbstrHost);

    HRESULT GetPassword(
        [out] BSTR *pbstrPassword);

    HRESULT GetPath(
        [out] BSTR *pbstrPath);

    HRESULT GetPathAndQuery(
        [out] BSTR *pbstrPathAndQuery);

    HRESULT GetQuery(
        [out] BSTR *pbstrQuery);

    HRESULT GetRawUri(
        [out] BSTR *pbstrRawUri);

    HRESULT GetSchemeName(
        [out] BSTR *pbstrSchemeName);

    HRESULT GetUserInfo(
        [out] BSTR *pbstrUserInfo);

    HRESULT GetUserName(
        [out] BSTR *pbstrUserName);

    HRESULT GetHostType(
        [out] DWORD *pdwHostType);

    HRESULT GetPort(
        [out] DWORD *pdwPort);

    HRESULT GetScheme(
        [out] DWORD *pdwScheme);

    HRESULT GetZone(
        [out] DWORD *pdwZone);

    HRESULT GetProperties(
        [out] LPDWORD pdwFlags);

    HRESULT IsEqual(
        [in]  IUri *pUri,
        [out] BOOL *pfEqual);
}

/*****************************************************************************
 * IUriContainer interface
 */
[
    local,
    object,
    uuid(a158a630-ed6f-45fb-b987-f68676f57752),
    pointer_default(unique)
]
interface IUriContainer : IUnknown
{
    HRESULT GetIUri([out] IUri **ppIUri);
}

/*****************************************************************************
 * IInternetProtocolEx interface
 */
[
    local,
    object,
    uuid(c7a98e66-1010-492c-a1c8-c809e1f75905),
    pointer_default(unique)
]
interface IInternetProtocolEx : IInternetProtocol
{
    HRESULT StartEx(
        [in] IUri *pUri,
        [in] IInternetProtocolSink *pOIProtSink,
        [in] IInternetBindInfo *pOIBindInfo,
        [in] DWORD grfPI,
        [in] HANDLE *dwReserved);
}

cpp_quote("DEFINE_GUID(CLSID_InternetSecurityManager, 0x7b8a2d94, 0x0ac9, 0x11d1, 0x89, 0x6c, 0x00, 0xc0, 0x4f, 0xB6, 0xbf, 0xc4);")
cpp_quote("DEFINE_GUID(CLSID_InternetZoneManager, 0x7B8A2D95, 0x0AC9, 0x11D1, 0x89, 0x6C, 0x00, 0xC0, 0x4F, 0xB6, 0xBF, 0xC4);")
cpp_quote("DEFINE_GUID(IID_IAsyncMoniker, 0x79EAC9D3, 0xBAF9, 0x11CE, 0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B);")
cpp_quote("DEFINE_GUID(IID_IAsyncBindCtx, 0x79EAC9D4, 0xBAF9, 0x11CE, 0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B);")
cpp_quote("DEFINE_GUID(CLSID_StdURLMoniker, 0x79EAC9E0, 0xBAF9, 0x11CE, 0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B);")
cpp_quote("DEFINE_GUID(CLSID_DeCompMimeFilter, 0x8f6b0360, 0xb80d, 0x11d0, 0xa9,0xb3, 0x00,0x60,0x97,0x94,0x23,0x11);")

cpp_quote("DEFINE_GUID(CLSID_CdlProtocol, 0x3dd53d40, 0x7b8b, 0x11D0, 0xb0,0x13, 0x00,0xaa,0x00,0x59,0xce,0x02);")
cpp_quote("DEFINE_GUID(CLSID_FileProtocol, 0x79EAC9E7, 0xBAF9, 0x11CE, 0x8C,0x82, 0x00,0xAA,0x00,0x4B,0xA9,0x0B);")
cpp_quote("DEFINE_GUID(CLSID_FtpProtocol, 0x79EAC9E3, 0xBAF9, 0x11CE, 0x8C,0x82, 0x00,0xAA,0x00,0x4B,0xA9,0x0B);")
cpp_quote("DEFINE_GUID(CLSID_GopherProtocol, 0x79EAC9E4, 0xBAF9, 0x11CE, 0x8C,0x82, 0x00,0xAA,0x00,0x4B,0xA9,0x0B);")
cpp_quote("DEFINE_GUID(CLSID_HttpProtocol, 0x79EAC9E2, 0xBAF9, 0x11CE, 0x8C,0x82, 0x00,0xAA,0x00,0x4B,0xA9,0x0B);")
cpp_quote("DEFINE_GUID(CLSID_HttpSProtocol, 0x79EAC9E5, 0xBAF9, 0x11CE, 0x8C,0x82, 0x00,0xAA,0x00,0x4B,0xA9,0x0B);")
cpp_quote("DEFINE_GUID(CLSID_MkProtocol, 0x79EAC9E6, 0xBAF9, 0x11CE, 0x8C,0x82, 0x00,0xAA,0x00,0x4B,0xA9,0x0B);")

cpp_quote("#define URLMON_OPTION_USERAGENT          0x10000001")
cpp_quote("#define URLMON_OPTION_USERAGENT_REFRESH  0x10000002")
cpp_quote("#define URLMON_OPTION_URL_ENCODING       0x10000004")

cpp_quote("#define MK_S_ASYNCHRONOUS                _HRESULT_TYPEDEF_(0x000401E8)")
cpp_quote("#ifndef S_ASYNCHRONOUS")
cpp_quote("#define S_ASYNCHRONOUS                   MK_S_ASYNCHRONOUS")
cpp_quote("#endif")

cpp_quote("#define INET_E_ERROR_FIRST               _HRESULT_TYPEDEF_(0x800C0002)")
cpp_quote("#define INET_E_INVALID_URL               _HRESULT_TYPEDEF_(0x800C0002)")
cpp_quote("#define INET_E_NO_SESSION                _HRESULT_TYPEDEF_(0x800C0003)")
cpp_quote("#define INET_E_CANNOT_CONNECT            _HRESULT_TYPEDEF_(0x800C0004)")
cpp_quote("#define INET_E_RESOURCE_NOT_FOUND        _HRESULT_TYPEDEF_(0x800C0005)")
cpp_quote("#define INET_E_OBJECT_NOT_FOUND          _HRESULT_TYPEDEF_(0x800C0006)")
cpp_quote("#define INET_E_DATA_NOT_AVAILABLE        _HRESULT_TYPEDEF_(0x800C0007)")
cpp_quote("#define INET_E_DOWNLOAD_FAILURE          _HRESULT_TYPEDEF_(0x800C0008)")
cpp_quote("#define INET_E_AUTHENTICATION_REQUIRED   _HRESULT_TYPEDEF_(0x800C0009)")
cpp_quote("#define INET_E_NO_VALID_MEDIA            _HRESULT_TYPEDEF_(0x800C000A)")
cpp_quote("#define INET_E_CONNECTION_TIMEOUT        _HRESULT_TYPEDEF_(0x800C000B)")
cpp_quote("#define INET_E_INVALID_REQUEST           _HRESULT_TYPEDEF_(0x800C000C)")
cpp_quote("#define INET_E_UNKNOWN_PROTOCOL          _HRESULT_TYPEDEF_(0x800C000D)")
cpp_quote("#define INET_E_SECURITY_PROBLEM          _HRESULT_TYPEDEF_(0x800C000E)")
cpp_quote("#define INET_E_CANNOT_LOAD_DATA          _HRESULT_TYPEDEF_(0x800C000F)")
cpp_quote("#define INET_E_CANNOT_INSTANTIATE_OBJECT _HRESULT_TYPEDEF_(0x800C0010)")
cpp_quote("#define INET_E_USE_DEFAULT_PROTOCOLHANDLER _HRESULT_TYPEDEF_(0x800C0011)")
cpp_quote("#define INET_E_QUERYOPTION_UNKNOWN       _HRESULT_TYPEDEF_(0x800C0013)")
cpp_quote("#define INET_E_REDIRECT_FAILED           _HRESULT_TYPEDEF_(0x800C0014)")
cpp_quote("#define INET_E_REDIRECT_TO_DIR           _HRESULT_TYPEDEF_(0x800C0015)")
cpp_quote("#define INET_E_CANNOT_LOCK_REQUEST       _HRESULT_TYPEDEF_(0x800C0016)")
cpp_quote("#define INET_E_ERROR_LAST                INET_E_REDIRECT_TO_DIR")
cpp_quote("#define INET_E_DEFAULT_ACTION            INET_E_USE_DEFAULT_PROTOCOLHANDLER")

cpp_quote("HRESULT WINAPI CoGetClassObjectFromURL(REFCLSID, LPCWSTR, DWORD, DWORD, LPCWSTR, LPBINDCTX, DWORD, LPVOID, REFIID, LPVOID*);")
cpp_quote("HRESULT WINAPI CreateURLMoniker(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk);")
cpp_quote("HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pbsc, IBindStatusCallback **ppbsc, DWORD dwReserved);")
cpp_quote("HRESULT WINAPI CompareSecurityIds(BYTE*,DWORD,BYTE*,DWORD,DWORD);")
cpp_quote("HRESULT WINAPI URLDownloadToFileA(LPUNKNOWN,LPCSTR,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI URLDownloadToFileW(LPUNKNOWN,LPCWSTR,LPCWSTR,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI URLDownloadToCacheFileA(LPUNKNOWN,LPCSTR,LPSTR,DWORD,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI URLDownloadToCacheFileW(LPUNKNOWN,LPCWSTR,LPWSTR,DWORD,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI CoInternetGetSession(DWORD,IInternetSession**,DWORD);")
cpp_quote("HRESULT WINAPI MkParseDisplayNameEx(IBindCtx*,LPCWSTR,ULONG*,IMoniker**);")
cpp_quote("HRESULT WINAPI IsAsyncMoniker(IMoniker* pmk);")
cpp_quote("HRESULT WINAPI CreateAsyncBindCtx(DWORD, IBindStatusCallback*, IEnumFORMATETC*, IBindCtx**);")
cpp_quote("HRESULT WINAPI CreateAsyncBindCtxEx(IBindCtx*,DWORD,IBindStatusCallback*,IEnumFORMATETC*,IBindCtx**,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetCreateSecurityManager(IServiceProvider*,IInternetSecurityManager**,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetCombineUrl(LPCWSTR,LPCWSTR,DWORD,LPWSTR,DWORD,DWORD*,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetCompareUrl(LPCWSTR,LPCWSTR,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetCreateZoneManager(IServiceProvider*, IInternetZoneManager**, DWORD);")
cpp_quote("HRESULT WINAPI CoInternetParseUrl(LPCWSTR,PARSEACTION,DWORD,LPWSTR,DWORD,DWORD*,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetQueryInfo(LPCWSTR,QUERYOPTION,DWORD,LPVOID,DWORD,DWORD*,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetSetFeatureEnabled(INTERNETFEATURELIST,DWORD,BOOL);")
cpp_quote("HRESULT WINAPI CreateFormatEnumerator(UINT,FORMATETC*,IEnumFORMATETC**);")
cpp_quote("HRESULT WINAPI GetSoftwareUpdateInfo( LPCWSTR szDistUnit, LPSOFTDISTINFO psdi);")
cpp_quote("HRESULT WINAPI FaultInIEFeature(HWND,uCLSSPEC*,QUERYCONTEXT*,DWORD);")
cpp_quote("HRESULT WINAPI FindMimeFromData(LPBC,LPCWSTR,LPVOID,DWORD,LPCWSTR,DWORD,LPWSTR*,DWORD);")
cpp_quote("HRESULT WINAPI GetClassFileOrMime(LPBC,LPCWSTR,LPVOID,DWORD,LPCWSTR,DWORD,CLSID*);")
cpp_quote("HRESULT WINAPI HlinkGoBack(IUnknown*);")
cpp_quote("HRESULT WINAPI HlinkGoForward(IUnknown*);")
cpp_quote("HRESULT WINAPI HlinkNavigateMoniker(IUnknown*,IMoniker*);")
cpp_quote("HRESULT WINAPI HlinkNavigateString(IUnknown*,LPCWSTR);")
cpp_quote("HRESULT WINAPI HlinkSimpleNavigateToMoniker(IMoniker*,LPCWSTR,LPCWSTR,IUnknown*,IBindCtx*,IBindStatusCallback*,DWORD,DWORD);")
cpp_quote("HRESULT WINAPI HlinkSimpleNavigateToString(LPCWSTR,LPCWSTR,LPCWSTR,IUnknown*,IBindCtx*,IBindStatusCallback*,DWORD,DWORD);")
cpp_quote("HRESULT WINAPI IsValidURL(LPBC,LPCWSTR,DWORD);")
cpp_quote("HRESULT WINAPI ObtainUserAgentString(DWORD,LPSTR,DWORD*);")
cpp_quote("HRESULT WINAPI RegisterFormatEnumerator(LPBC,IEnumFORMATETC*,DWORD);")
cpp_quote("HRESULT WINAPI RevokeFormatEnumerator(LPBC,IEnumFORMATETC*);")
cpp_quote("HRESULT WINAPI RevokeBindStatusCallback(LPBC,IBindStatusCallback*);")
cpp_quote("HRESULT WINAPI CopyStgMedium(const STGMEDIUM*,STGMEDIUM*);")
cpp_quote("void WINAPI ReleaseBindInfo(BINDINFO*);")
cpp_quote("HRESULT WINAPI UrlMkGetSessionOption(DWORD,LPVOID,DWORD,DWORD*,DWORD);")
cpp_quote("HRESULT WINAPI UrlMkSetSessionOption(DWORD,LPVOID,DWORD,DWORD);")
cpp_quote("HRESULT WINAPI URLOpenStreamA(LPUNKNOWN,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI URLOpenStreamW(LPUNKNOWN,LPCWSTR,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI URLOpenPullStreamA(LPUNKNOWN,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI URLOpenPullStreamW(LPUNKNOWN,LPCWSTR,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI URLOpenBlockingStreamA(LPUNKNOWN,LPCSTR,LPSTREAM*,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI URLOpenBlockingStreamW(LPUNKNOWN,LPCWSTR,LPSTREAM*,DWORD,LPBINDSTATUSCALLBACK);")

cpp_quote("#define OInetCombineUrl CoInternetCombineUrl")
cpp_quote("#define OInetCompareUrl CoInternetCompareUrl")
cpp_quote("#define OInetGetSession CoInternetGetSession")

cpp_quote("BOOL WINAPI IsLoggingEnabledA(LPCSTR);")
cpp_quote("BOOL WINAPI IsLoggingEnabledW(LPCWSTR);")
cpp_quote("#define IsLoggingEnabled WINELIB_NAME_AW(IsLoggingEnabled)")

cpp_quote("#define MKSYS_URLMONIKER 6")
cpp_quote("#define URL_MK_LEGACY            0")
cpp_quote("#define URL_MK_UNIFORM           1")
