/*
 * Copyright (C) 2000 Ulrich Czekalla
 *
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef __WINE__
#include "rpc.h"
#include "rpcndr.h"
#ifndef COM_NO_WINDOWS_H
#include "windows.h"
#include "ole2.h"
#endif
#endif

#ifndef __WINE_URLMON_H
#define __WINE_URLMON_H

#include "winbase.h"
#include "wine/obj_base.h"

#ifdef __cplusplus
extern "C" {
#endif /* defined(__cplusplus) */

DEFINE_GUID(IID_IBinding, 0x79EAC9C0, 0xBAF9, 0x11CE,
	0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B);
typedef struct IBinding IBinding,*LPBINDING;

DEFINE_GUID(IID_IBindStatusCallback, 0x79EAC9C1, 0xBAF9, 0x11CE,
	0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B);
typedef struct IBindStatusCallback IBindStatusCallback,*LPBINDSTATUSCALLBACK;

DEFINE_GUID(IID_IBindHost, 0XFC4801A1, 0X2BA9, 0X11CF,
    0XA2, 0X29, 0X00, 0XAA, 0X00, 0X3D, 0X73, 0X52);
typedef struct IBindHost IBindHost,*LPBINDHOST;

DEFINE_GUID(IID_IWinInetInfo, 0x79EAC9D6, 0xBAFA, 0x11CE,
    0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0X0B);
typedef struct IWinInetInfo IWinInetInfo,*LPWININETINFO;

DEFINE_GUID(IID_IWinInetHttpInfo, 0x79EAC9D8, 0xBAFA, 0x11CE,
    0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0X0B);
typedef struct IWinInetHttpInfo IWinInetHttpInfo,*LPWININETHTTPINFO;

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_RESERVED_3 = 0x00800000
} BINDF;

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 enum {
    BSCF_FIRSTDATANOTIFICATION = 0x01,
    BSCF_INTERMEDIATEDATANOTIFICATION = 0x02,
    BSCF_LASTDATANOTIFICATION = 0x04,
    BSCF_DATAFULLYAVAILABLE = 0x08,
    BSCF_AVAILABLEDATASIZEUNKNOWN = 0x10
} BSCF;

typedef enum BINDSTATUS {
	BINDSTATUS_FINDINGRESOURCE,
	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_VERFIEDMIMETYPEAVAILABLE,
	BINDSTATUS_CLASSINSTALLLOCATION,
	BINDSTATUS_DECODING,
	BINDSTATUS_LOADINGMIMEHANDLER,
	BINDSTATUS_CONTENTDISPOSITIONATTACH,
	BINDSTATUS_FILTERREPORTMIMETYPE,
	BINDSTATUS_CLSIDCANINSTANTIATE,
	BINDSTATUS_IUNKNOWNAVAILABLE,
	BINDSTATUS_DIRECTBIND,
	BINDSTATUS_RAWMIMETYPE,
	BINDSTATUS_PROXYDETECTING,
	BINDSTATUS_ACCEPTRANGES
} BINDSTATUS;

#define MK_S_ASYNCHRONOUS 0x000401E8
#define S_ASYNCHRONOUS    MK_S_ASYNCHRONOUS

#define INET_E_ERROR_FIRST               0x800C0002L
#define INET_E_INVALID_URL               0x800C0002L
#define INET_E_NO_SESSION                0x800C0003L
#define INET_E_CANNOT_CONNECT            0x800C0004L
#define INET_E_RESOURCE_NOT_FOUND        0x800C0005L
#define INET_E_OBJECT_NOT_FOUND          0x800C0006L
#define INET_E_DATA_NOT_AVAILABLE        0x800C0007L
#define INET_E_DOWNLOAD_FAILURE          0x800C0008L
#define INET_E_AUTHENTICATION_REQUIRED   0x800C0009L
#define INET_E_NO_VALID_MEDIA            0x800C000AL
#define INET_E_CONNECTION_TIMEOUT        0x800C000BL
#define INET_E_INVALID_REQUEST           0x800C000CL
#define INET_E_UNKNOWN_PROTOCOL          0x800C000DL
#define INET_E_SECURITY_PROBLEM          0x800C000EL
#define INET_E_CANNOT_LOAD_DATA          0x800C000FL
#define INET_E_CANNOT_INSTANTIATE_OBJECT 0x800C0010L
#define INET_E_REDIRECT_FAILED           0x800C0014L
#define INET_E_REDIRECT_TO_DIR           0x800C0015L
#define INET_E_CANNOT_LOCK_REQUEST       0x800C0016L
#define INET_E_ERROR_LAST                INET_E_REDIRECT_TO_DIR


/*****************************************************************************
 * IBinding interface
 */
#define ICOM_INTERFACE IBinding
#define IBinding_METHODS \
    ICOM_METHOD  (HRESULT,Abort) \
    ICOM_METHOD  (HRESULT,Suspend) \
    ICOM_METHOD  (HRESULT,Resume) \
    ICOM_METHOD1 (HRESULT,SetPriority,       LONG,nPriority) \
    ICOM_METHOD1 (HRESULT,GetPriority,       LONG*,pnPriority) \
    ICOM_METHOD4 (HRESULT,GetBindResult,     CLSID*,pclsidProtocol, DWORD*,pdwResult, LPOLESTR*,pszResult, DWORD*,pdwReserved)
#define IBinding_IMETHODS \
    IUnknown_IMETHODS \
    IBinding_METHODS
ICOM_DEFINE(IBinding,IUnknown)
#undef ICOM_INTERFACE

/*** IUnknown methods ***/
#define IBinding_QueryInterface(p,a,b)      ICOM_CALL2(QueryInterface,p,a,b)
#define IBinding_AddRef(p)                  ICOM_CALL (AddRef,p)
#define IBinding_Release(p)                 ICOM_CALL (Release,p)
/*** IBinding methods ***/
#define IBinding_Abort(p)                   ICOM_CALL (Abort,p)
#define IBinding_Suspend(p)                 ICOM_CALL (Suspend,p)
#define IBinding_Resume(p)                  ICOM_CALL (Resume,p)
#define IBinding_SetPriority(p,a)           ICOM_CALL2(SetPriority,p,a)
#define IBinding_GetPriority(p,a)           ICOM_CALL2(GetPriority,p,a)
#define IBinding_GetBindResult(p,a,b,c,d)   ICOM_CALL4(GetBindResult,p,a,b,c,d)

/*****************************************************************************
 * IBindStatusCallback interface
 */
#define ICOM_INTERFACE IBindStatusCallback
#define IBindStatusCallback_METHODS \
    ICOM_METHOD2 (HRESULT,OnStartBinding,    DWORD,dwReserved, IBinding*,pib) \
    ICOM_METHOD1 (HRESULT,GetPriority,       LONG*,pnPriority) \
    ICOM_METHOD  (HRESULT,OnLowResource) \
    ICOM_METHOD4 (HRESULT,OnProgress,        ULONG,ulProgress, ULONG,ulProgressMax, ULONG,ulStatusCode, LPCWSTR,szStatusText) \
    ICOM_METHOD2 (HRESULT,OnStopBinding,     HRESULT,hresult, LPCWSTR,szError) \
    ICOM_METHOD2 (HRESULT,GetBindInfo,       DWORD*,grfBINDF, BINDINFO*,pbindinfo) \
    ICOM_METHOD4 (HRESULT,OnDataAvailable,   DWORD,grfBSCF, DWORD,dwSize, FORMATETC*,pformatetc, STGMEDIUM*,pstgmed) \
    ICOM_METHOD2 (HRESULT,OnObjectAvailable, REFIID,iid, IUnknown*,punk)
#define IBindStatusCallback_IMETHODS \
    IUnknown_IMETHODS \
    IBindStatusCallback_METHODS
ICOM_DEFINE(IBindStatusCallback,IUnknown)
#undef ICOM_INTERFACE

/*** IUnknown methods ***/
#define IBindStatusCallback_QueryInterface(p,a,b)      ICOM_CALL2(QueryInterface,p,a,b)
#define IBindStatusCallback_AddRef(p)                  ICOM_CALL (AddRef,p)
#define IBindStatusCallback_Release(p)                 ICOM_CALL (Release,p)
/*** IBindStatusCallback methods ***/
#define IBindStatusCallback_OnStartBinding(p,a,b)      ICOM_CALL2(OnStartBinding,p,a,b)
#define IBindStatusCallback_GetPriority(p,a)           ICOM_CALL1(GetPriority,p,a)
#define IBindStatusCallback_OnLowResource(p)           ICOM_CALL (OnLowResource,p)
#define IBindStatusCallback_OnProgress(p,a,b,c,d)      ICOM_CALL4(OnProgress,p,a,b,c,d)
#define IBindStatusCallback_OnStopBinding(p,a,b)       ICOM_CALL2(OnStopBinding,p,a,b)
#define IBindStatusCallback_GetBindInfo(p,a,b)         ICOM_CALL2(GetBindInfo,p,a,b)
#define IBindStatusCallback_OnDataAvailable(p,a,b,c,d) ICOM_CALL4(OnDataAvailable,p,a,b,c,d)
#define IBindStatusCallback_OnObjectAvailable(p,a,b)   ICOM_CALL2(OnObjectAvailable,p,a,b)

/*****************************************************************************
 * IBindHost interface
 */
#define ICOM_INTERFACE IBindHost
#define IBindHost_METHODS \
    ICOM_METHOD4 (HRESULT,CreateMoniker,              LPOLESTR,szName, IBindCtx*,pBC, IMoniker**,ppmk, DWORD,dwReserved) \
    ICOM_METHOD5 (HRESULT,MonikerBindToStorage,       IMoniker*,pMk, IBindCtx*,pBC, IBindStatusCallback*,pBSC, REFIID,riid, LPVOID*,ppvObj) \
    ICOM_METHOD5 (HRESULT,MonikerBindToObject,        IMoniker*,pMk, IBindCtx*,pBC, IBindStatusCallback*,pBSC, REFIID,riid, LPVOID*,ppvObj)
#define IBindHost_IMETHODS \
    IUnknown_IMETHODS \
    IBindHost_METHODS
ICOM_DEFINE(IBindHost,IUnknown)
#undef ICOM_INTERFACE

/*** IUnknown methods ***/
#define IBindHost_QueryInterface(p,a,b)                   ICOM_CALL2(QueryInterface,p,a,b)
#define IBindHost_AddRef(p)                               ICOM_CALL (AddRef,p)
#define IBindHost_Release(p)                              ICOM_CALL (Release,p)
/*** IBindHost methods ***/
#define IBindHost_CreateMoniker(p,a,b,c,d)                ICOM_CALL4(CreateMoniker,p,a,b,c,d)
#define IBindHost_MonikerBindToStorage(p,a,b,c,d,e)       ICOM_CALL5(MonikerBindToStorage,p,a,b,c,d,e)
#define IBindHost_MonikerBindToObject(p,a,b,c,d,e)        ICOM_CALL5(MonikerBindToObject,p,a,b,c,d,e)

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

/*****************************************************************************
 * IWinInetInfo interface
 */
#define ICOM_INTERFACE IWinInetInfo
#define IWinInetInfo_METHODS \
    ICOM_METHOD3 (HRESULT,QueryOption,       DWORD,dwOption, LPVOID,pBuffer, DWORD*,pcbBuf)
#define IWinInetInfo_IMETHODS \
    IUnknown_IMETHODS \
    IWinInetInfo_METHODS
ICOM_DEFINE(IWinInetInfo,IUnknown)
#undef ICOM_INTERFACE

/*** IUnknown methods ***/
#define IWinInetInfo_QueryInterface(p,a,b)      ICOM_CALL2(QueryInterface,p,a,b)
#define IWinInetInfo_AddRef(p)                  ICOM_CALL (AddRef,p)
#define IWinInetInfo_Release(p)                 ICOM_CALL (Release,p)
/*** IWinInetInfo methods ***/
#define IWinInetInfo_QueryOption(p,a,b,c)       ICOM_CALL3(QueryOption,p,a,b,c)

/*****************************************************************************
 * IWinInetHttpInfo interface
 */
#define ICOM_INTERFACE IWinInetHttpInfo
#define IWinInetHttpInfo_METHODS \
    ICOM_METHOD5 (HRESULT,QueryInfo, DWORD,dwOption, LPVOID,pBuffer, DWORD*,pcbBuf, DWORD*,pdwFlags, DWORD*,pdwReserved)
#define IWinInetHttpInfo_IMETHODS \
    IWinInetInfo_IMETHODS \
    IWinInetHttpInfo_METHODS
ICOM_DEFINE(IWinInetHttpInfo,IWinInetInfo)
#undef ICOM_INTERFACE

/*** IUnknown methods ***/
#define IWinInetHttpInfo_QueryInterface(p,a,b)  ICOM_CALL2(QueryInterface,p,a,b)
#define IWinInetHttpInfo_AddRef(p)              ICOM_CALL (AddRef,p)
#define IWinInetHttpInfo_Release(p)             ICOM_CALL (Release,p)
/*** IWinInetHttpInfo methods ***/
#define IWinInetHttpInfo_QueryInfo(p,a,b,c,d,e) ICOM_CALL5(QueryInfo,p,a,b,c,d,e)

HRESULT WINAPI CreateURLMoniker(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk);
HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pbsc, IBindStatusCallback **ppbsc, DWORD dwReserved);

#ifdef __cplusplus
}      /* extern "C" */
#endif /* defined(__cplusplus) */

#endif /* __WINE_URLMON_H */

