/*
 * 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";

interface IInternetProtocolSink;

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

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

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

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_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                0x000401E8")
cpp_quote("#ifndef S_ASYNCHRONOUS")
cpp_quote("#define S_ASYNCHRONOUS                   MK_S_ASYNCHRONOUS")
cpp_quote("#endif")

cpp_quote("#define INET_E_ERROR_FIRST               0x800C0002")
cpp_quote("#define INET_E_INVALID_URL               0x800C0002")
cpp_quote("#define INET_E_NO_SESSION                0x800C0003")
cpp_quote("#define INET_E_CANNOT_CONNECT            0x800C0004")
cpp_quote("#define INET_E_RESOURCE_NOT_FOUND        0x800C0005")
cpp_quote("#define INET_E_OBJECT_NOT_FOUND          0x800C0006")
cpp_quote("#define INET_E_DATA_NOT_AVAILABLE        0x800C0007")
cpp_quote("#define INET_E_DOWNLOAD_FAILURE          0x800C0008")
cpp_quote("#define INET_E_AUTHENTICATION_REQUIRED   0x800C0009")
cpp_quote("#define INET_E_NO_VALID_MEDIA            0x800C000A")
cpp_quote("#define INET_E_CONNECTION_TIMEOUT        0x800C000B")
cpp_quote("#define INET_E_INVALID_REQUEST           0x800C000C")
cpp_quote("#define INET_E_UNKNOWN_PROTOCOL          0x800C000D")
cpp_quote("#define INET_E_SECURITY_PROBLEM          0x800C000E")
cpp_quote("#define INET_E_CANNOT_LOAD_DATA          0x800C000F")
cpp_quote("#define INET_E_CANNOT_INSTANTIATE_OBJECT 0x800C0010")
cpp_quote("#define INET_E_USE_DEFAULT_PROTOCOLHANDLER 0x800C0011")
cpp_quote("#define INET_E_QUERYOPTION_UNKNOWN       0x800C0013")
cpp_quote("#define INET_E_REDIRECT_FAILED           0x800C0014")
cpp_quote("#define INET_E_REDIRECT_TO_DIR           0x800C0015")
cpp_quote("#define INET_E_CANNOT_LOCK_REQUEST       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 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("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("#define MKSYS_URLMONIKER 6")
cpp_quote("#define URL_MK_LEGACY            0")
cpp_quote("#define URL_MK_UNIFORM           1")
