/*
 * 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("#undef SetPort")
cpp_quote("#endif")

interface IInternetProtocolSink;
interface IUri;

/*****************************************************************************
 * 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
    {
        BINDINFO_OPTIONS_WININETFLAG              = 0x00010000,
        BINDINFO_OPTIONS_ENABLE_UTF8              = 0x00020000,
        BINDINFO_OPTIONS_DISABLE_UTF8             = 0x00040000,
        BINDINFO_OPTIONS_USE_IE_ENCODING          = 0x00080000,
        BINDINFO_OPTIONS_BINDTOOBJECT             = 0x00100000,
        BINDINFO_OPTIONS_SECURITYOPTOUT           = 0x00200000,
        BINDINFO_OPTIONS_IGNOREMIMETEXTPLAIN      = 0x00400000,
        BINDINFO_OPTIONS_USEBINDSTRINGCREDS       = 0x00800000,
        BINDINFO_OPTIONS_IGNOREHTTPHTTPSREDIRECTS = 0x01000000,
        BINDINFO_OPTIONS_IGNORE_SSLERRORS_ONCE    = 0x02000000,
        BINDINFO_WPC_DOWNLOADBLOCKED              = 0x08000000,
        BINDINFO_WPC_LOGGING_ENABLED              = 0x10000000,
        BINDINFO_OPTIONS_ALLOWCONNECTDATA         = 0x20000000,
        BINDINFO_OPTIONS_DISABLEAUTOREDIRECTS     = 0x40000000,
        BINDINFO_OPTIONS_SHDOCVW_NAVIGATE    = (int)0x80000000
    } BINDINFO_OPTIONS;

    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_SSLUX_NAVBLOCKED,
        BINDSTATUS_SERVER_MIMETYPEAVAILABLE,
        BINDSTATUS_SNIFFED_CLASSIDAVAILABLE,
        BINDSTATUS_64BIT_PROGRESS,
        BINDSTATUS_LAST = BINDSTATUS_64BIT_PROGRESS,
        BINDSTATUS_RESERVED_0 = (BINDSTATUS_LAST+1),
        BINDSTATUS_RESERVED_1 = (BINDSTATUS_RESERVED_0+1),
        BINDSTATUS_RESERVED_2 = (BINDSTATUS_RESERVED_1+1),
        BINDSTATUS_RESERVED_3 = (BINDSTATUS_RESERVED_2+1),
        BINDSTATUS_RESERVED_4 = (BINDSTATUS_RESERVED_3+1),
        BINDSTATUS_RESERVED_5 = (BINDSTATUS_RESERVED_4+1),
        BINDSTATUS_RESERVED_6 = (BINDSTATUS_RESERVED_5+1),
        BINDSTATUS_RESERVED_7 = (BINDSTATUS_RESERVED_6+1),
        BINDSTATUS_RESERVED_8 = (BINDSTATUS_RESERVED_7+1),
        BINDSTATUS_RESERVED_9 = (BINDSTATUS_RESERVED_8+1),
        BINDSTATUS_LAST_PRIVATE = BINDSTATUS_RESERVED_9
    } 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, unique] 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);
}

/*****************************************************************************
 * IBindStatusCallbackEx interface
 */
[
    object,
    uuid(aaa74ef9-8ee7-4659-88d9-f8c504da73cc),
    pointer_default(unique)
]
interface IBindStatusCallbackEx : IBindStatusCallback
{
    typedef [unique] IBindStatusCallbackEx *LPBINDSTATUSCALLBACKEX;

    typedef enum {
        BINDF2_DISABLEBASICOVERHTTP               = 0x00000001,
        BINDF2_DISABLEAUTOCOOKIEHANDLING          = 0x00000002,
        BINDF2_READ_DATA_GREATER_THAN_4GB         = 0x00000004,
        BINDF2_DISABLE_HTTP_REDIRECT_XSECURITYID  = 0x00000008,
        BINDF2_RESERVED_3                         = 0x20000000,
        BINDF2_RESERVED_2                         = 0x40000000,
        BINDF2_RESERVED_1                         = 0x80000000,
    } BINDF2;

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

    [call_as(GetBindInfoEx)]
    HRESULT RemoteGetBindInfoEx(
            [out] DWORD *grfBINDF,
            [in, out, unique] RemBINDINFO *pbindinfo,
            [in, out, unique] RemSTGMEDIUM *pstgmed,
            [out] DWORD *grfBINDF2,
            [out] DWORD *pdwReserved);
}


/*****************************************************************************
 * IAuthenticate interface
 */
[
    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);
}

/*****************************************************************************
 * IWinInetHttpTimeouts interface
 */
[
    local,
    object,
    uuid(f286fa56-c1fd-4270-8e67-b3eb790a81e8),
    pointer_default(unique)
]
interface IWinInetHttpTimeouts : IUnknown
{
    HRESULT GetRequestTimeouts(
        [out] DWORD *connect_timeout,
        [out] DWORD *send_timeout,
        [out] DWORD *receive_timeout);
}

/*****************************************************************************
 * 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);
}

/*****************************************************************************
 * ICodeInstall interface
 */
[
    local,
    object,
    uuid(79eac9d1-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface ICodeInstall : IWindowForBindingUI
{
    typedef [unique] ICodeInstall *LPCODEINSTALL;

    typedef enum {
        CIP_DISK_FULL,
        CIP_ACCESS_DENIED,
        CIP_NEWER_VERSION_EXISTS,
        CIP_OLDER_VERSION_EXISTS,
        CIP_NAME_CONFLICT,
        CIP_TRUST_VERIFICATION_COMPONENT_MISSING,
        CIP_EXE_SELF_REGISTERATION_TIMEOUT,
        CIP_UNSAFE_TO_ABORT,
        CIP_NEED_REBOOT,
        CIP_NEED_REBOOT_UI_PERMISSION
    } CIP_STATUS;

    HRESULT OnCodeInstallProblem(
            [in] ULONG ulStatusCode,
            [in, unique] LPCWSTR szDestination,
            [in, unique] LPCWSTR szSource,
            [in] DWORD dwReserved);
}

/*****************************************************************************
 * IHttpSecurity interface
 */
[
    local,
    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_XDR_ORIGIN,
        BINDSTRING_DOWNLOADPATH,
        BINDSTRING_ROOTDOC_URL,
        BINDSTRING_INITIAL_FILENAME,
        BINDSTRING_PROXY_USERNAME,
        BINDSTRING_PROXY_PASSWORD,
        BINDSTRING_ENTERPRISE_ID
    } 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,
        QUERY_IS_CACHED_AND_USABLE_OFFLINE
    } 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, unique] 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);
}

/*****************************************************************************
 * IInternetSecurityManagerEx interface
 */
cpp_quote("#define SID_SInternetSecurityManagerEx IID_IInternetSecurityManagerEx")

[
    object,
    uuid(f164edf1-cc7c-4f0d-9a94-34222625C393),
    pointer_default(unique)
]
interface IInternetSecurityManagerEx : IInternetSecurityManager
{
    HRESULT ProcessUrlActionEx(
        [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,
        [out] DWORD *pdwOutFlags);
}

/*****************************************************************************
 * IInternetSecurityManagerEx2 interface
 */
cpp_quote("#define SID_SInternetSecurityManagerEx2 IID_IInternetSecurityManagerEx2")

[
    object,
    uuid(f1e50292-a795-4117-8e09-2b560a72ac60),
    pointer_default(unique)
]
interface IInternetSecurityManagerEx2 : IInternetSecurityManagerEx
{
    HRESULT MapUrlToZoneEx2(
        [in] IUri *pUri,
        [out] DWORD *pdwZone,
        [in] DWORD dwFlags,
        [out] LPWSTR *ppwszMappedUrl,
        [out] DWORD *pdwOutFlags);

    HRESULT ProcessUrlActionEx2(
        [in] IUri *pUri,
        [in] DWORD dwAction,
        [out, size_is(cbPolicy)] BYTE *pPolicy,
        [in] DWORD cbPolicy,
        [in, unique] BYTE *pContext,
        [in] DWORD cbContext,
        [in] DWORD dwFlags,
        [in] DWORD_PTR dwReserved,
        [out] DWORD *pdwOutFlags);

    HRESULT GetSecurityIdEx2(
        [in] IUri *pUri,
        [out, size_is(*pcbSecurityId)] BYTE *pbSecurityId,
        [in, out] DWORD *pcbSecurityId,
        [in] DWORD_PTR dwReserved);

    HRESULT QueryCustomPolicyEx2(
        [in] IUri *pUri,
        [in] REFGUID guidKey,
        [out, size_is(,*pcbPolicy)] BYTE **ppPolicy,
        [out] DWORD *pcbPolicy,
        [in] BYTE *pContext,
        [in] DWORD cbContext,
        [in] DWORD_PTR dwReserved);
}

/*****************************************************************************
 * IInternetHostSecurityManager interface
 */
cpp_quote("#define SID_SInternetHostSecurityManager IID_IInternetHostSecurityManager")

[
    local,
    object,
    uuid(3af280b6-cb3f-11d0-891e-00c04fb6bfc4),
    pointer_default(unique)
]
interface IInternetHostSecurityManager : IUnknown
{
    HRESULT GetSecurityId(
            [out, size_is(*pcbSecurityId)] BYTE *pbSecurityId,
            [in, out] DWORD *pcbSecurityId,
            [in] DWORD_PTR dwReserved);

    HRESULT ProcessUrlAction(
            [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] REFGUID guidKey,
            [out, size_is(,*pcbPolicy)] BYTE **ppPolicy,
            [out] DWORD *pcbPolicy,
            [in] BYTE *pContext,
            [in] DWORD cbContext,
            [in] DWORD dwReserved);
}

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 URLACTION_BEHAVIOR_MIN           0x00002000")
cpp_quote("#define URLACTION_BEHAVIOR_RUN           0x00002000")
cpp_quote("#define URLPOLICY_BEHAVIOR_CHECK_LIST    0x00010000")

cpp_quote("#define URLACTION_FEATURE_MIN                        0x00002100")
cpp_quote("#define URLACTION_FEATURE_MIME_SNIFFING              0x00002100")
cpp_quote("#define URLACTION_FEATURE_ZONE_ELEVATION             0x00002101")
cpp_quote("#define URLACTION_FEATURE_WINDOW_RESTRICTIONS        0x00002102")
cpp_quote("#define URLACTION_FEATURE_SCRIPT_STATUS_BAR          0x00002103")
cpp_quote("#define URLACTION_FEATURE_FORCE_ADDR_AND_STATUS      0x00002104")
cpp_quote("#define URLACTION_FEATURE_BLOCK_INPUT_PROMPTS        0x00002105")

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_INVALID         = -1,
        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_MEDLOW         = 0x10500,
        URLTEMPLATE_MEDIUM         = 0x11000,
        URLTEMPLATE_MEDHIGH        = 0x11500,
        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_DETECT_INTRANET          = 0x00000100,
        ZAFLAGS_USE_LOCKED_ZONES         = 0x00010000,
        ZAFLAGS_VERIFY_TEMPLATE_SETTINGS = 0x00020000,
        ZAFLAGS_NO_CACHE                 = 0x00040000,
    } 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, size_is(,*pcbPolicy)] BYTE **ppPolicy,
        [out] DWORD* pcbPolicy,
        [in]  URLZONEREG ulrZoneReg);

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

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

    HRESULT SetZoneActionPolicy(
        [in] DWORD dwZone,
        [in] DWORD dwAction,
        [in, size_is(cbPolicy)] 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);
}

/*****************************************************************************
 * IInternetZoneManagerEx interface
 */
[
    local,
    object,
    uuid(A4C23339-8E06-431E-9BF4-7E711C085648),
    pointer_default(unique)
]
interface IInternetZoneManagerEx : IInternetZoneManager
{
    HRESULT GetZoneActionPolicyEx(
        [in]  DWORD dwZone,
        [in]  DWORD dwAction,
        [out, size_is(cbPolicy)] BYTE *pPolicy,
        [in]  DWORD cbPolicy,
        [in]  URLZONEREG urlZoneReg,
        [in]  DWORD dwFlags);

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

}

/*****************************************************************************
 * IInternetZoneManagerEx2 interface
 */

cpp_quote("#define SECURITY_IE_STATE_GREEN 0")
cpp_quote("#define SECURITY_IE_STATE_RED   1")

[
    local,
    object,
    uuid(EDC17559-DD5D-4846-8EEF-8BECBA5A4ABF),
    pointer_default(unique)
]
interface IInternetZoneManagerEx2 : IInternetZoneManagerEx
{
    HRESULT GetZoneAttributesEx(
        [in]              DWORD dwZone,
        [in, out, unique] ZONEATTRIBUTES* pZoneAttributes,
        [in]              DWORD dwFlags);

    HRESULT GetZoneSecurityState(
        [in]      DWORD dwZoneIndex,
        [in]      BOOL fRespectPolicy,
        [in, out] LPDWORD pdwState,
        [in, out] BOOL *pfPolicyEncountered);

    HRESULT GetIESecurityState(
        [in]      BOOL fRespectPolicy,
        [in, out] LPDWORD pdwState,
        [in, out] BOOL *pfPolicyEncountered,
        [in]      BOOL fNoCache);

    HRESULT FixInsecureSettings(void);

}


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_ENTRY_COUNT
} INTERNETFEATURELIST;

cpp_quote("#define SET_FEATURE_ON_THREAD                0x00000001")
cpp_quote("#define SET_FEATURE_ON_PROCESS               0x00000002")
cpp_quote("#define SET_FEATURE_IN_REGISTRY              0x00000004")
cpp_quote("#define SET_FEATURE_ON_THREAD_LOCALMACHINE   0x00000008")
cpp_quote("#define SET_FEATURE_ON_THREAD_INTRANET       0x00000010")
cpp_quote("#define SET_FEATURE_ON_THREAD_TRUSTED        0x00000020")
cpp_quote("#define SET_FEATURE_ON_THREAD_INTERNET       0x00000040")
cpp_quote("#define SET_FEATURE_ON_THREAD_RESTRICTED     0x00000080")

cpp_quote("#define GET_FEATURE_FROM_THREAD              0x00000001")
cpp_quote("#define GET_FEATURE_FROM_PROCESS             0x00000002")
cpp_quote("#define GET_FEATURE_FROM_REGISTRY            0x00000004")
cpp_quote("#define GET_FEATURE_FROM_THREAD_LOCALMACHINE 0x00000008")
cpp_quote("#define GET_FEATURE_FROM_THREAD_INTRANET     0x00000010")
cpp_quote("#define GET_FEATURE_FROM_THREAD_TRUSTED      0x00000020")
cpp_quote("#define GET_FEATURE_FROM_THREAD_INTERNET     0x00000040")
cpp_quote("#define GET_FEATURE_FROM_THREAD_RESTRICTED   0x00000080")

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

/*****************************************************************************
 * IUri interface
 */
[
    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;

    typedef enum
    {
        Uri_HOST_UNKNOWN = 0,
        Uri_HOST_DNS = 1,
        Uri_HOST_IPV4 = 2,
        Uri_HOST_IPV6 = 3,
        Uri_HOST_IDN = 4
    } Uri_HOST_TYPE;

    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);
}

cpp_quote("HRESULT WINAPI CreateUri(LPCWSTR,DWORD,DWORD_PTR,IUri**);")
cpp_quote("HRESULT WINAPI CreateUriWithFragment(LPCWSTR,LPCWSTR,DWORD,DWORD_PTR,IUri**);")
cpp_quote("HRESULT WINAPI CreateUriFromMultiByteString(LPCSTR,DWORD,DWORD,DWORD,DWORD_PTR,IUri**);")

cpp_quote("#define Uri_HAS_ABSOLUTE_URI    (1 << Uri_PROPERTY_ABSOLUTE_URI)")
cpp_quote("#define Uri_HAS_AUTHORITY       (1 << Uri_PROPERTY_AUTHORITY)")
cpp_quote("#define Uri_HAS_DISPLAY_URI     (1 << Uri_PROPERTY_DISPLAY_URI)")
cpp_quote("#define Uri_HAS_DOMAIN          (1 << Uri_PROPERTY_DOMAIN)")
cpp_quote("#define Uri_HAS_EXTENSION       (1 << Uri_PROPERTY_EXTENSION)")
cpp_quote("#define Uri_HAS_FRAGMENT        (1 << Uri_PROPERTY_FRAGMENT)")
cpp_quote("#define Uri_HAS_HOST            (1 << Uri_PROPERTY_HOST)")
cpp_quote("#define Uri_HAS_PASSWORD        (1 << Uri_PROPERTY_PASSWORD)")
cpp_quote("#define Uri_HAS_PATH            (1 << Uri_PROPERTY_PATH)")
cpp_quote("#define Uri_HAS_QUERY           (1 << Uri_PROPERTY_QUERY)")
cpp_quote("#define Uri_HAS_RAW_URI         (1 << Uri_PROPERTY_RAW_URI)")
cpp_quote("#define Uri_HAS_SCHEME_NAME     (1 << Uri_PROPERTY_SCHEME_NAME)")
cpp_quote("#define Uri_HAS_USER_NAME       (1 << Uri_PROPERTY_USER_NAME)")
cpp_quote("#define Uri_HAS_PATH_AND_QUERY  (1 << Uri_PROPERTY_PATH_AND_QUERY)")
cpp_quote("#define Uri_HAS_USER_INFO       (1 << Uri_PROPERTY_USER_INFO)")
cpp_quote("#define Uri_HAS_HOST_TYPE       (1 << Uri_PROPERTY_HOST_TYPE)")
cpp_quote("#define Uri_HAS_PORT            (1 << Uri_PROPERTY_PORT)")
cpp_quote("#define Uri_HAS_SCHEME          (1 << Uri_PROPERTY_SCHEME)")
cpp_quote("#define Uri_HAS_ZONE            (1 << Uri_PROPERTY_ZONE)")

cpp_quote("#define Uri_CREATE_ALLOW_RELATIVE                  0x0001")
cpp_quote("#define Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME  0x0002")
cpp_quote("#define Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME      0x0004")
cpp_quote("#define Uri_CREATE_NOFRAG                          0x0008")
cpp_quote("#define Uri_CREATE_NO_CANONICALIZE                 0x0010")
cpp_quote("#define Uri_CREATE_CANONICALIZE                    0x0100")
cpp_quote("#define Uri_CREATE_FILE_USE_DOS_PATH               0x0020")
cpp_quote("#define Uri_CREATE_DECODE_EXTRA_INFO               0x0040")
cpp_quote("#define Uri_CREATE_NO_DECODE_EXTRA_INFO            0x0080")
cpp_quote("#define Uri_CREATE_CRACK_UNKNOWN_SCHEMES           0x0200")
cpp_quote("#define Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES        0x0400")
cpp_quote("#define Uri_CREATE_PRE_PROCESS_HTML_URI            0x0800")
cpp_quote("#define Uri_CREATE_NO_PRE_PROCESS_HTML_URI         0x1000")
cpp_quote("#define Uri_CREATE_IE_SETTINGS                     0x2000")
cpp_quote("#define Uri_CREATE_NO_IE_SETTINGS                  0x4000")
cpp_quote("#define Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS  0x8000")
cpp_quote("#define Uri_CREATE_NORMALIZE_INTL_CHARACTERS   0x00010000")
cpp_quote("#define Uri_CREATE_CANONICALIZE_ABSOLUTE       0x00020000")

cpp_quote("#define Uri_DISPLAY_NO_FRAGMENT  0x00000001")
cpp_quote("#define Uri_PUNYCODE_IDN_HOST    0x00000002")
cpp_quote("#define Uri_DISPLAY_IDN_HOST     0x00000004")

cpp_quote("#define Uri_ENCODING_USER_INFO_AND_PATH_IS_PERCENT_ENCODED_UTF8   0x00000001")
cpp_quote("#define Uri_ENCODING_USER_INFO_AND_PATH_IS_CP                     0x00000002")
cpp_quote("#define Uri_ENCODING_HOST_IS_IDN                                  0x00000004")
cpp_quote("#define Uri_ENCODING_HOST_IS_PERCENT_ENCODED_UTF8                 0x00000008")
cpp_quote("#define Uri_ENCODING_HOST_IS_PERCENT_ENCODED_CP                   0x00000010")
cpp_quote("#define Uri_ENCODING_QUERY_AND_FRAGMENT_IS_PERCENT_ENCODED_UTF8   0x00000020")
cpp_quote("#define Uri_ENCODING_QUERY_AND_FRAGMENT_IS_CP                     0x00000040")
cpp_quote("#define Uri_ENCODING_RFC (Uri_ENCODING_USER_INFO_AND_PATH_IS_PERCENT_ENCODED_UTF8|Uri_ENCODING_HOST_IS_PERCENT_ENCODED_UTF8|Uri_ENCODING_QUERY_AND_FRAGMENT_IS_PERCENT_ENCODED_UTF8)")

cpp_quote("#define UriBuilder_USE_ORIGINAL_FLAGS  0x00000001")

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

/*****************************************************************************
 * IUriBuilder interface
 */
[
    local,
    object,
    uuid(4221b2e1-8955-46c0-bd5b-de9897565de7),
    pointer_default(unique)
]
interface IUriBuilder: IUnknown
{
    HRESULT CreateUriSimple(
        [in]  DWORD       dwAllowEncodingPropertyMask,
        [in]  DWORD_PTR   dwReserved,
        [out] IUri      **ppIUri);

    HRESULT CreateUri(
        [in]  DWORD       dwCreateFlags,
        [in]  DWORD       dwAllowEncodingPropertyMask,
        [in]  DWORD_PTR   dwReserved,
        [out] IUri      **ppIUri);

    HRESULT CreateUriWithFlags(
        [in]  DWORD       dwCreateFlags,
        [in]  DWORD       dwUriBuilderFlags,
        [in]  DWORD       dwAllowEncodingPropertyMask,
        [in]  DWORD_PTR   dwReserved,
        [out] IUri      **ppIUri);

    HRESULT GetIUri(
        [out] IUri **ppIUri);

    HRESULT SetIUri(
        [in, unique] IUri *pIUri);

    HRESULT GetFragment(
        [out] DWORD   *pcchFragment,
        [out] LPCWSTR *ppwzFragment);

    HRESULT GetHost(
        [out] DWORD   *pcchHost,
        [out] LPCWSTR *ppwzHost);

    HRESULT GetPassword(
        [out] DWORD   *pcchPassword,
        [out] LPCWSTR *ppwzPassword);

    HRESULT GetPath(
        [out] DWORD   *pcchPath,
        [out] LPCWSTR *ppwzPath);

    HRESULT GetPort(
        [out] BOOL  *pfHasPort,
        [out] DWORD *pdwPort);

    HRESULT GetQuery(
        [out] DWORD   *pcchQuery,
        [out] LPCWSTR *ppwzQuery);

    HRESULT GetSchemeName(
        [out] DWORD   *pcchSchemeName,
        [out] LPCWSTR *ppwzSchemeName);

    HRESULT GetUserName(
        [out] DWORD   *pcchUserName,
        [out] LPCWSTR *ppwzUserName);

    HRESULT SetFragment(
        [in] LPCWSTR pwzNewValue);

    HRESULT SetHost(
        [in] LPCWSTR pwzNewValue);

    HRESULT SetPassword(
        [in] LPCWSTR pwzNewValue);

    HRESULT SetPath(
        [in] LPCWSTR pwzNewValue);

    HRESULT SetPort(
        [in] BOOL  fHasPort,
        [in] DWORD dwNewValue);

    HRESULT SetQuery(
        [in] LPCWSTR pwzNewValue);

    HRESULT SetSchemeName(
        [in] LPCWSTR pwzNewValue);

    HRESULT SetUserName(
        [in] LPCWSTR pwzNewValue);

    HRESULT RemoveProperties(
        [in] DWORD dwPropertyMask);

    HRESULT HasBeenModified(
        [out] BOOL *pfModified);
};

cpp_quote("HRESULT WINAPI CreateIUriBuilder(IUri*,DWORD,DWORD_PTR,IUriBuilder**);")

/*****************************************************************************
 * IUriBuilderFactory interface
 */
[
    local,
    object,
    uuid(e982ce48-0b96-440c-bc37-0c869b27a29e),
    pointer_default(unique)
]
interface IUriBuilderFactory : IUnknown
{
    HRESULT CreateIUriBuilder(
        [in]  DWORD dwFlags,
        [in]  DWORD_PTR dwReserved,
        [out] IUriBuilder **ppIUriBuilder);

    HRESULT CreateInitializedIUriBuilder(
        [in]  DWORD dwFlags,
        [in]  DWORD_PTR dwReserved,
        [out] IUriBuilder **ppIUriBuilder);
}

/*****************************************************************************
 * 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);
}

/*****************************************************************************
 * IGetBindHandle interface
 */
[
    local,
    object,
    uuid(AF0FF408-129D-4b20-91F0-02BD23D88352),
    pointer_default(unique)
]
interface IGetBindHandle : IUnknown
{
    typedef [unique] IGetBindHandle *LPGETBINDHANDLE;

    typedef enum {
        BINDHANDLETYPES_APPCACHE    = 0x00000000,
        BINDHANDLETYPES_DEPENDENCY  = 0x00000001,
        BINDHANDLETYPES_COUNT
    } BINDHANDLETYPES;

    HRESULT GetBindHandle(
            [in] BINDHANDLETYPES enumRequestedHandle,
            [out] HANDLE *pRetHandle);
}

/*****************************************************************************
 * IBindCallbackRedirect interface
 */
[
    local,
    object,
    uuid(11c81bc2-121e-4ed5-b9c4-b430bd54f2c0),
    pointer_default(unique)
]
interface IBindCallbackRedirect : IUnknown
{
    typedef [unique] IBindCallbackRedirect *LPBINDCALLBACKREDIRECT;

    HRESULT Redirect(
        [in] LPCWSTR lpcUrl,
        [out] VARIANT_BOOL *vbCancel);
}

cpp_quote("#define CONFIRMSAFETYACTION_LOADOBJECT  0x00000001")

struct CONFIRMSAFETY
{
    CLSID clsid;
    IUnknown *pUnk;
    DWORD dwFlags;
};

cpp_quote("EXTERN_C const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY;")

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_USE_DEFAULT_SETTING       _HRESULT_TYPEDEF_(0x800C0012L)")
cpp_quote("#define INET_E_DEFAULT_ACTION            INET_E_USE_DEFAULT_PROTOCOLHANDLER")
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_USE_EXTENDED_BINDING      _HRESULT_TYPEDEF_(0x800C0017)")
cpp_quote("#define INET_E_TERMINATED_BIND           _HRESULT_TYPEDEF_(0x800C0018)")
cpp_quote("#define INET_E_INVALID_CERTIFICATE       _HRESULT_TYPEDEF_(0x800C0019)")
cpp_quote("#define INET_E_CODE_DOWNLOAD_DECLINED    _HRESULT_TYPEDEF_(0x800C0100)")
cpp_quote("#define INET_E_RESULT_DISPATCHED         _HRESULT_TYPEDEF_(0x800C0200)")
cpp_quote("#define INET_E_CANNOT_REPLACE_SFP_FILE   _HRESULT_TYPEDEF_(0x800C0300)")
cpp_quote("#define INET_E_CODE_INSTALL_SUPPRESSED   _HRESULT_TYPEDEF_(0x800C0400)")
cpp_quote("#define INET_E_CODE_INSTALL_BLOCKED_BY_HASH_POLICY  _HRESULT_TYPEDEF_(0x800C0500)")
cpp_quote("#define INET_E_DOWNLOAD_BLOCKED_BY_INPRIVATE        _HRESULT_TYPEDEF_(0x800C0501)")
cpp_quote("#define INET_E_ERROR_LAST                INET_E_DOWNLOAD_BLOCKED_BY_INPRIVATE")

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 CreateURLMonikerEx(IMoniker*,LPCWSTR,IMoniker**,DWORD);")
cpp_quote("HRESULT WINAPI CreateURLMonikerEx2(IMoniker*,IUri*,IMoniker**,DWORD);")
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 CoInternetCombineUrlEx(IUri*,LPCWSTR,DWORD,IUri**,DWORD_PTR);")
cpp_quote("HRESULT WINAPI CoInternetCompareUrl(LPCWSTR,LPCWSTR,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetCombineIUri(IUri*,IUri*,DWORD,IUri**,DWORD_PTR);")
cpp_quote("HRESULT WINAPI CoInternetCreateZoneManager(IServiceProvider*, IInternetZoneManager**, DWORD);")
cpp_quote("HRESULT WINAPI CoInternetParseUrl(LPCWSTR,PARSEACTION,DWORD,LPWSTR,DWORD,DWORD*,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetParseIUri(IUri*,PARSEACTION,DWORD,LPWSTR,DWORD,DWORD*,DWORD_PTR);")
cpp_quote("HRESULT WINAPI CoInternetQueryInfo(LPCWSTR,QUERYOPTION,DWORD,LPVOID,DWORD,DWORD*,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetSetFeatureEnabled(INTERNETFEATURELIST,DWORD,BOOL);")
cpp_quote("HRESULT WINAPI CoInternetIsFeatureEnabled(INTERNETFEATURELIST,DWORD dwFlags);")
cpp_quote("HRESULT WINAPI CoInternetIsFeatureEnabledForUrl(INTERNETFEATURELIST,DWORD,LPCWSTR,IInternetSecurityManager*);")
cpp_quote("HRESULT WINAPI CoInternetGetSecurityUrl(LPCWSTR,LPWSTR*,PSUACTION,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetGetSecurityUrlEx(IUri*,IUri**,PSUACTION,DWORD_PTR);")
cpp_quote("HRESULT WINAPI AsyncInstallDistributionUnit(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,DWORD,LPCWSTR,IBindCtx*,LPVOID,DWORD);")
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("HRESULT WINAPI CopyBindInfo(const BINDINFO*,BINDINFO*);")
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")
cpp_quote("#define URL_MK_NO_CANONICALIZE   2")
