/*** Autogenerated by WIDL 10.11 from include/httprequest.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __httprequest_h__
#define __httprequest_h__

/* Forward declarations */

#ifndef __IWinHttpRequest_FWD_DEFINED__
#define __IWinHttpRequest_FWD_DEFINED__
typedef interface IWinHttpRequest IWinHttpRequest;
#ifdef __cplusplus
interface IWinHttpRequest;
#endif /* __cplusplus */
#endif

#ifndef __WinHttpRequest_FWD_DEFINED__
#define __WinHttpRequest_FWD_DEFINED__
#ifdef __cplusplus
typedef class WinHttpRequest WinHttpRequest;
#else
typedef struct WinHttpRequest WinHttpRequest;
#endif /* defined __cplusplus */
#endif /* defined __WinHttpRequest_FWD_DEFINED__ */

/* Headers for imported files */

#include <oaidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __WinHttp_LIBRARY_DEFINED__
#define __WinHttp_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_WinHttp, 0x662901fc, 0x6951, 0x4854, 0x9e,0xb2, 0xd9,0xa2,0x57,0x0f,0x2b,0x2e);

typedef LONG HTTPREQUEST_PROXY_SETTING;
#define HTTPREQUEST_PROXYSETTING_DEFAULT (0x0)

#define HTTPREQUEST_PROXYSETTING_PRECONFIG (0x0)

#define HTTPREQUEST_PROXYSETTING_DIRECT (0x1)

#define HTTPREQUEST_PROXYSETTING_PROXY (0x2)

typedef LONG HTTPREQUEST_SETCREDENTIALS_FLAGS;
#define HTTPREQUEST_SETCREDENTIALS_FOR_SERVER (0x0)

#define HTTPREQUEST_SETCREDENTIALS_FOR_PROXY (0x1)

typedef enum WinHttpRequestOption {
    WinHttpRequestOption_UserAgentString = 0,
    WinHttpRequestOption_URL = 1,
    WinHttpRequestOption_URLCodePage = 2,
    WinHttpRequestOption_EscapePercentInURL = 3,
    WinHttpRequestOption_SslErrorIgnoreFlags = 4,
    WinHttpRequestOption_SelectCertificate = 5,
    WinHttpRequestOption_EnableRedirects = 6,
    WinHttpRequestOption_UrlEscapeDisable = 7,
    WinHttpRequestOption_UrlEscapeDisableQuery = 8,
    WinHttpRequestOption_SecureProtocols = 9,
    WinHttpRequestOption_EnableTracing = 10,
    WinHttpRequestOption_RevertImpersonationOverSsl = 11,
    WinHttpRequestOption_EnableHttpsToHttpRedirects = 12,
    WinHttpRequestOption_EnablePassportAuthentication = 13,
    WinHttpRequestOption_MaxAutomaticRedirects = 14,
    WinHttpRequestOption_MaxResponseHeaderSize = 15,
    WinHttpRequestOption_MaxResponseDrainSize = 16,
    WinHttpRequestOption_EnableHttp1_1 = 17,
    WinHttpRequestOption_EnableCertificateRevocationCheck = 18,
    WinHttpRequestOption_RejectUserpwd = 19
} WinHttpRequestOption;
typedef enum WinHttpRequestAutoLogonPolicy {
    AutoLogonPolicy_Always = 0,
    AutoLogonPolicy_OnlyIfBypassProxy = 1,
    AutoLogonPolicy_Never = 2
} WinHttpRequestAutoLogonPolicy;
/*****************************************************************************
 * IWinHttpRequest interface
 */
#ifndef __IWinHttpRequest_INTERFACE_DEFINED__
#define __IWinHttpRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWinHttpRequest, 0x016fe2ec, 0xb2c8, 0x45f8, 0xb2,0x3b, 0x39,0xe5,0x3a,0x75,0x39,0x6b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("016fe2ec-b2c8-45f8-b23b-39e53a75396b")
IWinHttpRequest : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE SetProxy(
        HTTPREQUEST_PROXY_SETTING proxy_setting,
        VARIANT proxy_server,
        VARIANT bypass_list) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCredentials(
        BSTR username,
        BSTR password,
        HTTPREQUEST_SETCREDENTIALS_FLAGS flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Open(
        BSTR method,
        BSTR url,
        VARIANT async) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRequestHeader(
        BSTR header,
        BSTR value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResponseHeader(
        BSTR header,
        BSTR *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllResponseHeaders(
        BSTR *headers) = 0;

    virtual HRESULT STDMETHODCALLTYPE Send(
        VARIANT body) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Status(
        LONG *status) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StatusText(
        BSTR *status) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ResponseText(
        BSTR *body) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ResponseBody(
        VARIANT *body) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ResponseStream(
        VARIANT *body) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Option(
        WinHttpRequestOption option,
        VARIANT *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Option(
        WinHttpRequestOption option,
        VARIANT value) = 0;

    virtual HRESULT STDMETHODCALLTYPE WaitForResponse(
        VARIANT timeout,
        VARIANT_BOOL *succeeded) = 0;

    virtual HRESULT STDMETHODCALLTYPE Abort(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTimeouts(
        LONG resolve_timeout,
        LONG connect_timeout,
        LONG send_timeout,
        LONG receive_timeout) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetClientCertificate(
        BSTR certificate) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAutoLogonPolicy(
        WinHttpRequestAutoLogonPolicy policy) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWinHttpRequest, 0x016fe2ec, 0xb2c8, 0x45f8, 0xb2,0x3b, 0x39,0xe5,0x3a,0x75,0x39,0x6b)
#endif
#else
typedef struct IWinHttpRequestVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWinHttpRequest *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWinHttpRequest *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWinHttpRequest *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IWinHttpRequest *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IWinHttpRequest *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IWinHttpRequest *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IWinHttpRequest *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IWinHttpRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *SetProxy)(
        IWinHttpRequest *This,
        HTTPREQUEST_PROXY_SETTING proxy_setting,
        VARIANT proxy_server,
        VARIANT bypass_list);

    HRESULT (STDMETHODCALLTYPE *SetCredentials)(
        IWinHttpRequest *This,
        BSTR username,
        BSTR password,
        HTTPREQUEST_SETCREDENTIALS_FLAGS flags);

    HRESULT (STDMETHODCALLTYPE *Open)(
        IWinHttpRequest *This,
        BSTR method,
        BSTR url,
        VARIANT async);

    HRESULT (STDMETHODCALLTYPE *SetRequestHeader)(
        IWinHttpRequest *This,
        BSTR header,
        BSTR value);

    HRESULT (STDMETHODCALLTYPE *GetResponseHeader)(
        IWinHttpRequest *This,
        BSTR header,
        BSTR *value);

    HRESULT (STDMETHODCALLTYPE *GetAllResponseHeaders)(
        IWinHttpRequest *This,
        BSTR *headers);

    HRESULT (STDMETHODCALLTYPE *Send)(
        IWinHttpRequest *This,
        VARIANT body);

    HRESULT (STDMETHODCALLTYPE *get_Status)(
        IWinHttpRequest *This,
        LONG *status);

    HRESULT (STDMETHODCALLTYPE *get_StatusText)(
        IWinHttpRequest *This,
        BSTR *status);

    HRESULT (STDMETHODCALLTYPE *get_ResponseText)(
        IWinHttpRequest *This,
        BSTR *body);

    HRESULT (STDMETHODCALLTYPE *get_ResponseBody)(
        IWinHttpRequest *This,
        VARIANT *body);

    HRESULT (STDMETHODCALLTYPE *get_ResponseStream)(
        IWinHttpRequest *This,
        VARIANT *body);

    HRESULT (STDMETHODCALLTYPE *get_Option)(
        IWinHttpRequest *This,
        WinHttpRequestOption option,
        VARIANT *value);

    HRESULT (STDMETHODCALLTYPE *put_Option)(
        IWinHttpRequest *This,
        WinHttpRequestOption option,
        VARIANT value);

    HRESULT (STDMETHODCALLTYPE *WaitForResponse)(
        IWinHttpRequest *This,
        VARIANT timeout,
        VARIANT_BOOL *succeeded);

    HRESULT (STDMETHODCALLTYPE *Abort)(
        IWinHttpRequest *This);

    HRESULT (STDMETHODCALLTYPE *SetTimeouts)(
        IWinHttpRequest *This,
        LONG resolve_timeout,
        LONG connect_timeout,
        LONG send_timeout,
        LONG receive_timeout);

    HRESULT (STDMETHODCALLTYPE *SetClientCertificate)(
        IWinHttpRequest *This,
        BSTR certificate);

    HRESULT (STDMETHODCALLTYPE *SetAutoLogonPolicy)(
        IWinHttpRequest *This,
        WinHttpRequestAutoLogonPolicy policy);

    END_INTERFACE
} IWinHttpRequestVtbl;

interface IWinHttpRequest {
    CONST_VTBL IWinHttpRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWinHttpRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWinHttpRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWinHttpRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWinHttpRequest_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWinHttpRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWinHttpRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWinHttpRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWinHttpRequest methods ***/
#define IWinHttpRequest_SetProxy(This,proxy_setting,proxy_server,bypass_list) (This)->lpVtbl->SetProxy(This,proxy_setting,proxy_server,bypass_list)
#define IWinHttpRequest_SetCredentials(This,username,password,flags) (This)->lpVtbl->SetCredentials(This,username,password,flags)
#define IWinHttpRequest_Open(This,method,url,async) (This)->lpVtbl->Open(This,method,url,async)
#define IWinHttpRequest_SetRequestHeader(This,header,value) (This)->lpVtbl->SetRequestHeader(This,header,value)
#define IWinHttpRequest_GetResponseHeader(This,header,value) (This)->lpVtbl->GetResponseHeader(This,header,value)
#define IWinHttpRequest_GetAllResponseHeaders(This,headers) (This)->lpVtbl->GetAllResponseHeaders(This,headers)
#define IWinHttpRequest_Send(This,body) (This)->lpVtbl->Send(This,body)
#define IWinHttpRequest_get_Status(This,status) (This)->lpVtbl->get_Status(This,status)
#define IWinHttpRequest_get_StatusText(This,status) (This)->lpVtbl->get_StatusText(This,status)
#define IWinHttpRequest_get_ResponseText(This,body) (This)->lpVtbl->get_ResponseText(This,body)
#define IWinHttpRequest_get_ResponseBody(This,body) (This)->lpVtbl->get_ResponseBody(This,body)
#define IWinHttpRequest_get_ResponseStream(This,body) (This)->lpVtbl->get_ResponseStream(This,body)
#define IWinHttpRequest_get_Option(This,option,value) (This)->lpVtbl->get_Option(This,option,value)
#define IWinHttpRequest_put_Option(This,option,value) (This)->lpVtbl->put_Option(This,option,value)
#define IWinHttpRequest_WaitForResponse(This,timeout,succeeded) (This)->lpVtbl->WaitForResponse(This,timeout,succeeded)
#define IWinHttpRequest_Abort(This) (This)->lpVtbl->Abort(This)
#define IWinHttpRequest_SetTimeouts(This,resolve_timeout,connect_timeout,send_timeout,receive_timeout) (This)->lpVtbl->SetTimeouts(This,resolve_timeout,connect_timeout,send_timeout,receive_timeout)
#define IWinHttpRequest_SetClientCertificate(This,certificate) (This)->lpVtbl->SetClientCertificate(This,certificate)
#define IWinHttpRequest_SetAutoLogonPolicy(This,policy) (This)->lpVtbl->SetAutoLogonPolicy(This,policy)
#else
/*** IUnknown methods ***/
static inline HRESULT IWinHttpRequest_QueryInterface(IWinHttpRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IWinHttpRequest_AddRef(IWinHttpRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IWinHttpRequest_Release(IWinHttpRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IWinHttpRequest_GetTypeInfoCount(IWinHttpRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IWinHttpRequest_GetTypeInfo(IWinHttpRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IWinHttpRequest_GetIDsOfNames(IWinHttpRequest* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IWinHttpRequest_Invoke(IWinHttpRequest* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWinHttpRequest methods ***/
static inline HRESULT IWinHttpRequest_SetProxy(IWinHttpRequest* This,HTTPREQUEST_PROXY_SETTING proxy_setting,VARIANT proxy_server,VARIANT bypass_list) {
    return This->lpVtbl->SetProxy(This,proxy_setting,proxy_server,bypass_list);
}
static inline HRESULT IWinHttpRequest_SetCredentials(IWinHttpRequest* This,BSTR username,BSTR password,HTTPREQUEST_SETCREDENTIALS_FLAGS flags) {
    return This->lpVtbl->SetCredentials(This,username,password,flags);
}
static inline HRESULT IWinHttpRequest_Open(IWinHttpRequest* This,BSTR method,BSTR url,VARIANT async) {
    return This->lpVtbl->Open(This,method,url,async);
}
static inline HRESULT IWinHttpRequest_SetRequestHeader(IWinHttpRequest* This,BSTR header,BSTR value) {
    return This->lpVtbl->SetRequestHeader(This,header,value);
}
static inline HRESULT IWinHttpRequest_GetResponseHeader(IWinHttpRequest* This,BSTR header,BSTR *value) {
    return This->lpVtbl->GetResponseHeader(This,header,value);
}
static inline HRESULT IWinHttpRequest_GetAllResponseHeaders(IWinHttpRequest* This,BSTR *headers) {
    return This->lpVtbl->GetAllResponseHeaders(This,headers);
}
static inline HRESULT IWinHttpRequest_Send(IWinHttpRequest* This,VARIANT body) {
    return This->lpVtbl->Send(This,body);
}
static inline HRESULT IWinHttpRequest_get_Status(IWinHttpRequest* This,LONG *status) {
    return This->lpVtbl->get_Status(This,status);
}
static inline HRESULT IWinHttpRequest_get_StatusText(IWinHttpRequest* This,BSTR *status) {
    return This->lpVtbl->get_StatusText(This,status);
}
static inline HRESULT IWinHttpRequest_get_ResponseText(IWinHttpRequest* This,BSTR *body) {
    return This->lpVtbl->get_ResponseText(This,body);
}
static inline HRESULT IWinHttpRequest_get_ResponseBody(IWinHttpRequest* This,VARIANT *body) {
    return This->lpVtbl->get_ResponseBody(This,body);
}
static inline HRESULT IWinHttpRequest_get_ResponseStream(IWinHttpRequest* This,VARIANT *body) {
    return This->lpVtbl->get_ResponseStream(This,body);
}
static inline HRESULT IWinHttpRequest_get_Option(IWinHttpRequest* This,WinHttpRequestOption option,VARIANT *value) {
    return This->lpVtbl->get_Option(This,option,value);
}
static inline HRESULT IWinHttpRequest_put_Option(IWinHttpRequest* This,WinHttpRequestOption option,VARIANT value) {
    return This->lpVtbl->put_Option(This,option,value);
}
static inline HRESULT IWinHttpRequest_WaitForResponse(IWinHttpRequest* This,VARIANT timeout,VARIANT_BOOL *succeeded) {
    return This->lpVtbl->WaitForResponse(This,timeout,succeeded);
}
static inline HRESULT IWinHttpRequest_Abort(IWinHttpRequest* This) {
    return This->lpVtbl->Abort(This);
}
static inline HRESULT IWinHttpRequest_SetTimeouts(IWinHttpRequest* This,LONG resolve_timeout,LONG connect_timeout,LONG send_timeout,LONG receive_timeout) {
    return This->lpVtbl->SetTimeouts(This,resolve_timeout,connect_timeout,send_timeout,receive_timeout);
}
static inline HRESULT IWinHttpRequest_SetClientCertificate(IWinHttpRequest* This,BSTR certificate) {
    return This->lpVtbl->SetClientCertificate(This,certificate);
}
static inline HRESULT IWinHttpRequest_SetAutoLogonPolicy(IWinHttpRequest* This,WinHttpRequestAutoLogonPolicy policy) {
    return This->lpVtbl->SetAutoLogonPolicy(This,policy);
}
#endif
#endif

#endif


#endif  /* __IWinHttpRequest_INTERFACE_DEFINED__ */

/*****************************************************************************
 * WinHttpRequest coclass
 */

DEFINE_GUID(CLSID_WinHttpRequest, 0x2087c2f4, 0x2cef, 0x4953, 0xa8,0xab, 0x66,0x77,0x9b,0x67,0x04,0x95);

#ifdef __cplusplus
class DECLSPEC_UUID("2087c2f4-2cef-4953-a8ab-66779b670495") WinHttpRequest;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WinHttpRequest, 0x2087c2f4, 0x2cef, 0x4953, 0xa8,0xab, 0x66,0x77,0x9b,0x67,0x04,0x95)
#endif
#endif

#endif /* __WinHttp_LIBRARY_DEFINED__ */
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);
ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __httprequest_h__ */
