// webgate.h : Declaration of the CWebGate

#ifndef __WEBGATE_H_
#define __WEBGATE_H_

#include <urlmon.h>  
#include <wininet.h>
#include <shlwapi.h>
#include <windowsx.h>
#include "obcomglb.h"

/////////////////////////////////////////////////////////////////////////////
// CWebGate
class CWebGate : public IBindStatusCallback, IHttpNegotiate
{
public:
     CWebGate ();
    ~CWebGate ();

    // IUnknown methods
    STDMETHODIMP QueryInterface  (REFIID riid, void ** ppv);
    STDMETHODIMP_(ULONG) AddRef  ();
    STDMETHODIMP_(ULONG) Release ();

    // IBindStatusCallback methods
    STDMETHODIMP OnStartBinding    (DWORD dwReserved, IBinding* pbinding);
    STDMETHODIMP GetPriority       (LONG* pnPriority);
    STDMETHODIMP OnLowResource     (DWORD dwReserved);
    STDMETHODIMP OnProgress        (ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR pwzStatusText);
    STDMETHODIMP OnStopBinding     (HRESULT hrResult, LPCWSTR szError);
    STDMETHODIMP GetBindInfo       (DWORD* pgrfBINDF, BINDINFO* pbindinfo);
    STDMETHODIMP OnDataAvailable   (DWORD grfBSCF, DWORD dwSize, FORMATETC *pfmtetc, STGMEDIUM* pstgmed);
    STDMETHODIMP OnObjectAvailable (REFIID riid, IUnknown* punk);

    // IHttpNegotiate methods
	STDMETHODIMP BeginningTransaction (LPCWSTR szURL, LPCWSTR szHeaders, DWORD dwReserved, LPWSTR* pszAdditionalHeaders);
    STDMETHODIMP OnResponse           (DWORD dwResponseCode, LPCWSTR szResponseHeaders, LPCWSTR szRequestHeaders, LPWSTR* pszAdditionalRequestHeaders);

    //WebGate
    STDMETHOD (get_DownloadFname) (BSTR *pVal);
    STDMETHOD (FetchPage)         (DWORD dwDoWait, BOOL *pbRetVal);
    STDMETHOD (put_Path)          (BSTR newVal);

private:
    DWORD     m_cRef;
    IMoniker* m_pmk;
    IBindCtx* m_pbc;
    IStream*  m_pstm;
    BSTR      m_bstrCacheFileName;
    HANDLE    m_hEventComplete;
    HANDLE    m_hEventError;
    BSTR      m_bstrPath;

    void FlushCache();
};

/*
// ===========================================================================
//                     CWebGateBindStatusCallback Definition
//
// This class will be use to indicate download progress
//
// ===========================================================================

class CWebGateBindStatusCallback : public IBindStatusCallback
{
public:
    // IUnknown methods
    STDMETHODIMP            QueryInterface (REFIID riid, void ** ppv);
    STDMETHODIMP_(ULONG)    AddRef         ();
    STDMETHODIMP_(ULONG)    Release        ();

    // IBindStatusCallback methods
    STDMETHODIMP OnStartBinding    (DWORD dwReserved, IBinding* pbinding);
    STDMETHODIMP GetPriority       (LONG* pnPriority);
    STDMETHODIMP OnLowResource     (DWORD dwReserved);
    STDMETHODIMP OnProgress        (ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR pwzStatusText);
    STDMETHODIMP OnStopBinding     (HRESULT hrResult, LPCWSTR szError);
    STDMETHODIMP GetBindInfo       (DWORD* pgrfBINDF, BINDINFO* pbindinfo);
    STDMETHODIMP OnDataAvailable   (DWORD grfBSCF, DWORD dwSize, FORMATETC *pfmtetc, STGMEDIUM* pstgmed);
    STDMETHODIMP OnObjectAvailable (REFIID riid, IUnknown* punk);

    // constructors/destructors
     CWebGateBindStatusCallback (CWebGate* lpWebGate);
    ~CWebGateBindStatusCallback ();

    // data members
    DWORD     m_cRef;
    IBinding* m_pbinding;
    IStream*  m_pstm;
    CWebGate* m_lpWebGate;
};
*/
#endif //__WEBGATE_H_