/*
 * 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 = 0x00000000,
        USE_SRC_URL  = 0x00000001
    } 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 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("#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")
