Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

469 lines
18 KiB

/******************************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name:
NameSpace_Impl.h
Abstract:
This file contains the declaration of the classes used to implement the
pluggable protocol: CHCPProtocol, CHCPProtocolInfo and CHCPBindStatusCallback.
Revision History:
Davide Massarenti (Dmassare) 07/05/99
created
Davide Massarenti (Dmassare) 07/23/99
moved to "include"
******************************************************************************/
#if !defined(__INCLUDED___HCP___NAMESPACE_H___)
#define __INCLUDED___HCP___NAMESPACE_H___
#include <MPC_utils.h>
#include <MPC_streams.h>
#include <TaxonomyDatabase.h>
/////////////////////////////////////////////////////////////////////////////
extern bool g_Debug_BLOCKERRORS;
extern bool g_Debug_CONTEXTMENU;
extern bool g_Debug_BUILDTREE;
extern WCHAR g_Debug_FORCESTYLE[];
////////////////////////////////////////////////////////////////////////////////
#ifdef DEBUG_PROTOCOLLEAK
#include <set>
class CHCPProtocol;
class DEBUG_ProtocolLeak
{
typedef std::set<CHCPProtocol*> Set;
typedef Set::iterator Iter;
typedef Set::const_iterator IterConst;
Set m_set;
Set m_setStart;
Set m_setComplete;
int m_num;
int m_numOut;
int m_numStart;
int m_numComplete;
public:
DEBUG_ProtocolLeak();
~DEBUG_ProtocolLeak();
void Add( CHCPProtocol* ptr );
void Del( CHCPProtocol* ptr );
void CheckStart( CHCPProtocol* ptr );
void Completed ( CHCPProtocol* ptr );
};
#endif
/////////////////////////////////////////////////////////////////////////////
class CHCPBindStatusCallback;
/////////////////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE ISimpleBindStatusCallback : public IUnknown
{
public:
STDMETHOD(ForwardQueryInterface)( REFIID riid, void** ppv );
STDMETHOD(GetBindInfo)( BINDINFO *pbindInfo );
STDMETHOD(PreBindMoniker)( IBindCtx* pBindCtx, IMoniker* pMoniker );
STDMETHOD(OnProgress)( ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText );
STDMETHOD(OnData)( CHCPBindStatusCallback* pbsc, BYTE* pBytes, DWORD dwSize, DWORD grfBSCF, FORMATETC *pformatetc, STGMEDIUM *pstgmed );
STDMETHOD(OnBindingFailure)( HRESULT hr, LPCWSTR szError );
};
class ATL_NO_VTABLE CHCPBindStatusCallback : // Hungarian: bscb
public CComObjectRootEx<MPC::CComSafeMultiThreadModel>,
public IBindStatusCallback,
public IHttpNegotiate
{
CComPtr<ISimpleBindStatusCallback> m_pT;
DWORD m_dwTotalRead;
DWORD m_dwAvailableToRead;
CComPtr<IMoniker> m_spMoniker;
CComPtr<IBindCtx> m_spBindCtx;
CComPtr<IBinding> m_spBinding;
CComPtr<IStream> m_spStream;
public:
BEGIN_COM_MAP(CHCPBindStatusCallback)
COM_INTERFACE_ENTRY(IBindStatusCallback)
COM_INTERFACE_ENTRY(IHttpNegotiate)
// COM_INTERFACE_ENTRY_FUNC_BLIND(0,TestQuery)
// COM_INTERFACE_ENTRY(IServiceProvider)
END_COM_MAP()
CHCPBindStatusCallback();
virtual ~CHCPBindStatusCallback();
//static HRESULT TestQuery( void* pv, REFIID iid, void** ppvObject, DWORD dw )
//{
// *ppvObject = NULL;
// return E_NOINTERFACE;
//}
/////////////////////////////////////////////////////////////////////////////
// IBindStatusCallback
STDMETHOD(OnStartBinding)( DWORD dwReserved ,
IBinding *pBinding );
STDMETHOD(GetPriority)( LONG *pnPriority );
STDMETHOD(OnLowResource)( DWORD reserved );
STDMETHOD(OnProgress)( ULONG ulProgress ,
ULONG ulProgressMax ,
ULONG ulStatusCode ,
LPCWSTR szStatusText );
STDMETHOD(OnStopBinding)( HRESULT hresult ,
LPCWSTR szError );
STDMETHOD(GetBindInfo)( DWORD *pgrfBINDF ,
BINDINFO *pbindInfo );
STDMETHOD(OnDataAvailable)( DWORD grfBSCF ,
DWORD dwSize ,
FORMATETC *pformatetc ,
STGMEDIUM *pstgmed );
STDMETHOD(OnObjectAvailable)( REFIID riid ,
IUnknown *punk );
/////////////////////////////////////////////////////////////////////////////
// IHttpNegotiate
STDMETHOD(BeginningTransaction)( LPCWSTR szURL ,
LPCWSTR szHeaders ,
DWORD dwReserved ,
LPWSTR *pszAdditionalHeaders );
STDMETHOD(OnResponse)( DWORD dwResponseCode ,
LPCWSTR szResponseHeaders ,
LPCWSTR szRequestHeaders ,
LPWSTR *pszAdditionalRequestHeaders );
/////////////////////////////////////////////////////////////////////////////
HRESULT StartAsyncDownload( ISimpleBindStatusCallback* pT, BSTR bstrURL, IUnknown* pUnkContainer = NULL, BOOL bRelative = FALSE );
HRESULT Abort();
};
/////////////////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE CHCPProtocol :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CHCPProtocol>,
public ISimpleBindStatusCallback,
public IInternetProtocol,
public IWinInetInfo
{
#ifdef DEBUG
friend class DEBUG_ProtocolLeak;
#endif
typedef CComObject< CHCPBindStatusCallback > InnerDownloader;
bool m_fDone; // Indicates whether we've received LASTDATANOTIFICATION yet
bool m_fReportResult; // Indicates whether we've called ReportResult on the sink.
//
DWORD m_cbAvailableSize; // Amount of data received up to now.
DWORD m_cbTotalSize; // Total number of bytes to be expected. For redirected requests,
// it comes from "ulProgressMax" parm to OnProgress for BEGINDOWNLOADDATA
//
CComPtr<IStream> m_pstrmRead; // Streams used for redirected request. We use two stream pointers to allow
CComPtr<IStream> m_pstrmWrite; // concurrent access to the same bits from two seek ptrs.
//
CComPtr<IInternetProtocolSink> m_pIProtSink; // Sink interface through which we should report progress.
CComPtr<IInternetBindInfo> m_pIBindInfo; // BindInfo interface used to get info about the binding.
DWORD m_grfSTI; // STI flags handed to us
BINDINFO m_bindinfo; // From m_pIBindInfo
DWORD m_bindf; // From m_pIBindInfo
//
CComBSTR m_bstrUrlComplete; // The complete URL requested.
CComBSTR m_bstrUrlRedirected; // The part that has been used as a redirection.
InnerDownloader* m_pDownloader; // The object that performs the redirection.
//
bool m_fRedirected; // The request has been redirected.
bool m_fCSS; // The request has been redirected.
bool m_fBypass; // The request has been sent to ms-its, with a bypass.
//
CComPtr<IInternetProtocol> m_ipiBypass; // Aggregated object.
//
CComBSTR m_bstrMimeType; // Type of the content.
DWORD m_dwContentLength; // Length of the page.
//
HANDLE m_hCache; // Handle for the cache entry.
WCHAR m_szCacheFileName[MAX_PATH]; // Name of the file inside the cache.
////////////////////////////////////////////////////////////////////////////////
HRESULT InnerReportProgress( /*[in]*/ ULONG ulStatusCode, /*[in]*/ LPCWSTR szStatusText );
HRESULT InnerReportData( /*[in]*/ DWORD grfBSCF, /*[in]*/ ULONG ulProgress, /*[in]*/ ULONG ulProgressMax );
HRESULT InnerReportResult( /*[in]*/ HRESULT hrResult, /*[in]*/ DWORD dwError, /*[in]*/ LPCWSTR szResult );
public:
DECLARE_NO_REGISTRY()
BEGIN_COM_MAP(CHCPProtocol)
COM_INTERFACE_ENTRY(IInternetProtocol )
COM_INTERFACE_ENTRY(IInternetProtocolRoot)
COM_INTERFACE_ENTRY(IWinInetInfo)
END_COM_MAP()
CHCPProtocol();
virtual ~CHCPProtocol();
////////////////////////////////////////////////////////////////////////////////
bool OpenCacheEntry ( );
void WriteCacheEntry( /*[in]*/ void *pv, /*[in]*/ ULONG cbRead );
void CloseCacheEntry( /*[in]*/ bool fDelete );
////////////////////////////////////////////////////////////////////////////////
void Shutdown( /*[in]*/ bool fAll = true );
/////////////////////////////////////////////////////////////////////////////
// IInternetProtocol interface
STDMETHOD(Start)( LPCWSTR szUrl ,
IInternetProtocolSink *pIProtSink ,
IInternetBindInfo *pIBindInfo ,
DWORD grfSTI ,
HANDLE_PTR dwReserved );
STDMETHOD(Continue)( PROTOCOLDATA *pStateInfo );
STDMETHOD(Abort )( HRESULT hrReason, DWORD dwOptions );
STDMETHOD(Terminate)( DWORD dwOptions );
STDMETHOD(Suspend )( );
STDMETHOD(Resume )( );
STDMETHOD(Read)( void *pv, ULONG cb, ULONG *pcbRead );
STDMETHOD(Seek)( LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition );
STDMETHOD(LockRequest )( DWORD dwOptions );
STDMETHOD(UnlockRequest)( );
/////////////////////////////////////////////////////////////////////////////
// IWinInetInfo interface
STDMETHOD(QueryOption)( DWORD dwOption, LPVOID pBuffer, DWORD *pcbBuf );
public:
HRESULT DoParse( /*[in]*/ LPCWSTR wstr );
HRESULT DoBind();
HRESULT DoBind_Exists( /*[in] */ MPC::FileSystemObject& fso, /*[out]*/ bool& fFound, /*[out]*/ bool& fIsAFile );
HRESULT DoBind_Redirect_UrlMoniker();
HRESULT DoBind_Redirect_MSITS ();
HRESULT DoBind_CSS ();
HRESULT DoBind_File ();
HRESULT DoBind_ReturnData ( /*[in]*/ bool fCloneStream, /*[in]*/ LPCWSTR szMimeType );
/////////////////////////////////////////////////////////////////////////////
// ISimpleBindStatusCallback
STDMETHOD(ForwardQueryInterface)( REFIID riid, void** ppv );
STDMETHOD(GetBindInfo)( BINDINFO *pbindInfo );
STDMETHOD(PreBindMoniker)( IBindCtx* pBindCtx, IMoniker* pMoniker );
STDMETHOD(OnBindingFailure)( HRESULT hr, LPCWSTR szError );
STDMETHOD(OnProgress)( ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText );
STDMETHOD(OnData)( CHCPBindStatusCallback* pbsc, BYTE* pBytes, DWORD dwSize, DWORD grfBSCF, FORMATETC *pformatetc, STGMEDIUM *pstgmed );
/////////////////////////////////////////////////////////////////////////////
static bool IsHCPRedirection(LPCWSTR szURL);
};
/////////////////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE CHCPProtocolInfo :
public CComObjectRootEx<CComSingleThreadModel>,
public IClassFactory,
public IInternetProtocolInfo
{
public:
DECLARE_NO_REGISTRY()
BEGIN_COM_MAP(CHCPProtocolInfo)
COM_INTERFACE_ENTRY(IClassFactory)
COM_INTERFACE_ENTRY(IInternetProtocolInfo)
END_COM_MAP()
CHCPProtocolInfo();
virtual ~CHCPProtocolInfo();
// IClassFactory interface
STDMETHOD(CreateInstance)(LPUNKNOWN pUnkOuter, REFIID riid, void** ppvObj);
STDMETHOD(LockServer)(BOOL fLock);
// IInternetProtocolInfo interface
STDMETHOD(ParseUrl)( LPCWSTR pwzUrl ,
PARSEACTION ParseAction ,
DWORD dwParseFlags,
LPWSTR pwzResult ,
DWORD cchResult ,
DWORD *pcchResult ,
DWORD dwReserved );
STDMETHOD(CombineUrl)( LPCWSTR pwzBaseUrl ,
LPCWSTR pwzRelativeUrl,
DWORD dwCombineFlags,
LPWSTR pwzResult ,
DWORD cchResult ,
DWORD *pcchResult ,
DWORD dwReserved );
STDMETHOD(CompareUrl)( LPCWSTR pwzUrl1 ,
LPCWSTR pwzUrl2 ,
DWORD dwCompareFlags );
STDMETHOD(QueryInfo)( LPCWSTR pwzUrl ,
QUERYOPTION QueryOption ,
DWORD dwQueryFlags,
LPVOID pBuffer ,
DWORD cbBuffer ,
DWORD *pcbBuf ,
DWORD dwReserved );
/////////////////////////////////////////////////////////////////////////////
static bool LookForHCP( LPCWSTR pwzUrl, bool& fRedirect, LPCWSTR& pwzRedirect );
};
/////////////////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE CPCHWrapProtocolInfo :
public CComObjectRootEx<CComSingleThreadModel>,
public IClassFactory,
public IInternetProtocolInfo
{
CComPtr<IClassFactory> m_realClass;
CComPtr<IInternetProtocolInfo> m_realInfo;
static void ExpandAndConcat( /*[out]*/ CComBSTR& bstrStorageName, /*[in]*/ LPCWSTR szVariable, /*[in]*/ LPCWSTR szAppend );
public:
DECLARE_NO_REGISTRY()
BEGIN_COM_MAP(CHCPProtocolInfo)
COM_INTERFACE_ENTRY(IClassFactory)
COM_INTERFACE_ENTRY(IInternetProtocolInfo)
END_COM_MAP()
CPCHWrapProtocolInfo();
virtual ~CPCHWrapProtocolInfo();
HRESULT Init( REFGUID realClass );
////////////////////
static void NormalizeUrl( /*[in]*/ LPCWSTR pwzUrl, /*[out]*/ MPC::wstring& strUrlModified, /*[in]*/ bool fReverse );
////////////////////
// IClassFactory interface
STDMETHOD(CreateInstance)(LPUNKNOWN pUnkOuter, REFIID riid, void** ppvObj);
STDMETHOD(LockServer)(BOOL fLock);
// IInternetProtocolInfo interface
STDMETHOD(ParseUrl)( LPCWSTR pwzUrl ,
PARSEACTION ParseAction ,
DWORD dwParseFlags,
LPWSTR pwzResult ,
DWORD cchResult ,
DWORD *pcchResult ,
DWORD dwReserved );
STDMETHOD(CombineUrl)( LPCWSTR pwzBaseUrl ,
LPCWSTR pwzRelativeUrl,
DWORD dwCombineFlags,
LPWSTR pwzResult ,
DWORD cchResult ,
DWORD *pcchResult ,
DWORD dwReserved );
STDMETHOD(CompareUrl)( LPCWSTR pwzUrl1 ,
LPCWSTR pwzUrl2 ,
DWORD dwCompareFlags );
STDMETHOD(QueryInfo)( LPCWSTR pwzUrl ,
QUERYOPTION QueryOption ,
DWORD dwQueryFlags,
LPVOID pBuffer ,
DWORD cbBuffer ,
DWORD *pcbBuf ,
DWORD dwReserved );
};
////////////////////////////////////////////////////////////////////////////////
class CHCPProtocolEnvironment
{
bool m_fHighContrast;
bool m_f16Colors;
Taxonomy::Instance m_inst;
MPC::string m_strCSS;
////////////////////
HRESULT ProcessCSS();
public:
CHCPProtocolEnvironment();
~CHCPProtocolEnvironment();
////////////////////////////////////////////////////////////////////////////////
static CHCPProtocolEnvironment* s_GLOBAL;
static HRESULT InitializeSystem();
static void FinalizeSystem ();
////////////////////////////////////////////////////////////////////////////////
bool UpdateState();
void ReformatURL( CComBSTR& bstrURL );
void SetHelpLocation( /*[in]*/ const Taxonomy::Instance& inst );
LPCWSTR HelpLocation ( );
LPCWSTR System ( );
const Taxonomy::Instance& Instance ( );
HRESULT GetCSS( /*[out]*/ CComPtr<IStream>& stream );
};
#endif // !defined(__INCLUDED___HCP___NAMESPACE_H___)