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.
277 lines
14 KiB
277 lines
14 KiB
// --------------------------------------------------------------------------------
|
|
// MHTMLURL.H
|
|
// Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
|
|
// Steven J. Bailey
|
|
// --------------------------------------------------------------------------------
|
|
#ifndef __MHTMLURL_H
|
|
#define __MHTMLURL_H
|
|
|
|
#ifndef MAC
|
|
// --------------------------------------------------------------------------------
|
|
// Depends
|
|
// --------------------------------------------------------------------------------
|
|
#include "privunk.h"
|
|
#include "inetprot.h"
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Forward Decls
|
|
// --------------------------------------------------------------------------------
|
|
class CMessageTree;
|
|
typedef CMessageTree *LPMESSAGETREE;
|
|
class CMimeActiveUrlCache;
|
|
typedef class CActiveUrlRequest *LPURLREQUEST;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Global Active Url Cache Object
|
|
// --------------------------------------------------------------------------------
|
|
extern CMimeActiveUrlCache *g_pUrlCache;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// REQSTATE_xxxx States
|
|
// --------------------------------------------------------------------------------
|
|
#define REQSTATE_RESULTREPORTED 0x00000001 // I have called ReportResult, don't call again
|
|
#define REQSTATE_DOWNLOADED 0x00000002 // The data is all present in pLockBytes
|
|
#define REQSTATE_BINDF_NEEDFILE 0x00000004 // Need to use a file
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// CActiveUrlRequest
|
|
// --------------------------------------------------------------------------------
|
|
class CActiveUrlRequest : public CPrivateUnknown,
|
|
public IOInetProtocol,
|
|
public IOInetProtocolInfo,
|
|
public IServiceProvider
|
|
{
|
|
public:
|
|
// ----------------------------------------------------------------------------
|
|
// Construction
|
|
// ----------------------------------------------------------------------------
|
|
CActiveUrlRequest(IUnknown *pUnkOuter=NULL);
|
|
virtual ~CActiveUrlRequest(void);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IUnknown members
|
|
// ---------------------------------------------------------------------------
|
|
virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj) {
|
|
return CPrivateUnknown::QueryInterface(riid, ppvObj); };
|
|
virtual STDMETHODIMP_(ULONG) AddRef(void) {
|
|
return CPrivateUnknown::AddRef();};
|
|
virtual STDMETHODIMP_(ULONG) Release(void) {
|
|
return CPrivateUnknown::Release(); };
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// IOInetProtocol methods
|
|
// ----------------------------------------------------------------------------
|
|
STDMETHODIMP Start(LPCWSTR pwszUrl, IOInetProtocolSink *pProtSink, IOInetBindInfo *pBindInfo, DWORD grfSTI, HANDLE_PTR dwReserved);
|
|
STDMETHODIMP Terminate(DWORD dwOptions);
|
|
STDMETHODIMP Read(LPVOID pv,ULONG cb, ULONG *pcbRead);
|
|
STDMETHODIMP Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition);
|
|
STDMETHODIMP LockRequest(DWORD dwOptions) { return E_NOTIMPL; }
|
|
STDMETHODIMP UnlockRequest(void) { return E_NOTIMPL; }
|
|
STDMETHODIMP Suspend(void) { return E_NOTIMPL; }
|
|
STDMETHODIMP Resume(void) { return E_NOTIMPL; }
|
|
STDMETHODIMP Abort(HRESULT hrReason, DWORD dwOptions) { return E_NOTIMPL; }
|
|
STDMETHODIMP Continue(PROTOCOLDATA *pStateInfo) { return E_NOTIMPL; }
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// IServiceProvider methods
|
|
// ----------------------------------------------------------------------------
|
|
STDMETHODIMP QueryService(REFGUID rsid, REFIID riid, void **ppvObj); /* IServiceProvider */
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// IOInetProtocolInfo methods
|
|
// ----------------------------------------------------------------------------
|
|
STDMETHODIMP CombineUrl(LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl, DWORD dwCombineFlags, LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved);
|
|
STDMETHODIMP ParseUrl(LPCWSTR pwzUrl, PARSEACTION ParseAction, DWORD dwParseFlags, LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved);
|
|
STDMETHODIMP CompareUrl(LPCWSTR pwzUrl1, LPCWSTR pwzUrl2, DWORD dwCompareFlags) { return E_NOTIMPL; }
|
|
STDMETHODIMP QueryInfo(LPCWSTR pwzUrl, QUERYOPTION OueryOption, DWORD dwQueryFlags, LPVOID pBuffer,DWORD cbBuffer, DWORD *pcbBuf, DWORD dwReserved);
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Called from CMimeMessageTree during Binding
|
|
// ----------------------------------------------------------------------------
|
|
void OnFullyAvailable(LPCWSTR pszCntType, IStream *pStream, LPMESSAGETREE pWebBook, HBODY hBody);
|
|
|
|
// Async Binding Methods
|
|
void OnStartBinding(LPCWSTR pszCntType, IStream *pStream, LPMESSAGETREE pWebBook, HBODY hBody);
|
|
void OnBindingDataAvailable(void);
|
|
void OnBindingComplete(HRESULT hrResult);
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// CActiveUrlRequest Members
|
|
// ----------------------------------------------------------------------------
|
|
virtual HRESULT PrivateQueryInterface(REFIID riid, LPVOID * ppvObj);
|
|
|
|
private:
|
|
// ----------------------------------------------------------------------------
|
|
// Private Methods
|
|
// ----------------------------------------------------------------------------
|
|
void _ReportResult(HRESULT hrResult);
|
|
HRESULT _FillReturnString(LPCWSTR pszUrl, DWORD cchUrl, LPWSTR pszResult, DWORD cchResult, DWORD *pcchResult);
|
|
HRESULT _HrStreamToNeedFile(void);
|
|
HRESULT _HrReportData(void);
|
|
HRESULT _HrInitializeNeedFile(LPMESSAGETREE pTree, HBODY hBody);
|
|
|
|
private:
|
|
// ----------------------------------------------------------------------------
|
|
// Private Data
|
|
// ----------------------------------------------------------------------------
|
|
IOInetProtocolSink *m_pProtSink; // Protocol Sink from IOInetProtocol::Start
|
|
IOInetBindInfo *m_pBindInfo; // BindInfo from IOInetProtocol::Start
|
|
IStream *m_pStream; // The data source
|
|
LPSTR m_pszRootUrl; // Root document Url
|
|
LPSTR m_pszBodyUrl; // Body Url
|
|
IUnknown *m_pUnkKeepAlive; // This protocol may activate an object
|
|
LPURLREQUEST m_pNext; // Next Request
|
|
LPURLREQUEST m_pPrev; // Prev Request
|
|
DWORD m_dwState; // Keep track of some state
|
|
HANDLE m_hNeedFile; // Need File
|
|
DWORD m_dwBSCF; // Bind Status Callback Flags That I've Reported
|
|
CRITICAL_SECTION m_cs; // Thread Safety
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Friend
|
|
// ----------------------------------------------------------------------------
|
|
friend CMessageTree; // Accesses, m_pszRootUrl, m_pNext, m_pPrev
|
|
};
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// ACTIVEURL_xxx
|
|
// --------------------------------------------------------------------------------
|
|
#define ACTIVEURL_ISFAKEURL 0x00000001 // Specifies that the activeurl is a mid
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// CActiveUrl
|
|
// --------------------------------------------------------------------------------
|
|
class CActiveUrl : public IUnknown
|
|
{
|
|
public:
|
|
// ----------------------------------------------------------------------------
|
|
// Construction
|
|
// ----------------------------------------------------------------------------
|
|
CActiveUrl(void);
|
|
~CActiveUrl(void);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IUnknown members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// CActiveUrl Members
|
|
// ---------------------------------------------------------------------------
|
|
HRESULT Init(BINDF bindf, LPMESSAGETREE pWebBook);
|
|
HRESULT IsActive(void);
|
|
HRESULT CompareRootUrl(LPCSTR pszUrl);
|
|
HRESULT BindToObject(REFIID riid, LPVOID *ppv);
|
|
HRESULT CreateWebPage(IStream *pStmRoot, LPWEBPAGEOPTIONS pOptions, DWORD dwReserved, IMoniker **ppMoniker);
|
|
void RevokeWebBook(LPMESSAGETREE pWebBook);
|
|
CActiveUrl *PGetNext(void) { return m_pNext; }
|
|
CActiveUrl *PGetPrev(void) { return m_pPrev; }
|
|
void SetNext(CActiveUrl *pNext) { m_pNext = pNext; }
|
|
void SetPrev(CActiveUrl *pPrev) { m_pPrev = pPrev; }
|
|
void DontKeepAlive(void);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// CActiveUrl Inline Members
|
|
// ---------------------------------------------------------------------------
|
|
void SetFlag(DWORD dwFlags) {
|
|
EnterCriticalSection(&m_cs);
|
|
FLAGSET(m_dwFlags, dwFlags);
|
|
LeaveCriticalSection(&m_cs);
|
|
}
|
|
|
|
BOOL FIsFlagSet(DWORD dwFlags) {
|
|
EnterCriticalSection(&m_cs);
|
|
BOOL f = ISFLAGSET(m_dwFlags, dwFlags);
|
|
LeaveCriticalSection(&m_cs);
|
|
return f;
|
|
}
|
|
|
|
private:
|
|
// ---------------------------------------------------------------------------
|
|
// Private Data
|
|
// ---------------------------------------------------------------------------
|
|
LONG m_cRef; // Reference Count
|
|
IUnknown *m_pUnkAlive; // Keep it alive
|
|
IUnknown *m_pUnkInner; // The ActiveUrl's Inner Unknown
|
|
LPMESSAGETREE m_pWebBook; // Pointer to the active Url
|
|
CActiveUrl *m_pNext; // Next Active Url
|
|
CActiveUrl *m_pPrev; // Prev Active Url
|
|
DWORD m_dwFlags; // Flags
|
|
CRITICAL_SECTION m_cs; // Thread Safety
|
|
};
|
|
typedef CActiveUrl *LPACTIVEURL;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// CMimeActiveUrlCache
|
|
// --------------------------------------------------------------------------------
|
|
class CMimeActiveUrlCache : public IUnknown
|
|
{
|
|
public:
|
|
// ----------------------------------------------------------------------------
|
|
// Construction
|
|
// ----------------------------------------------------------------------------
|
|
CMimeActiveUrlCache(void);
|
|
~CMimeActiveUrlCache(void);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IUnknown members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// ObjectFromMoniker - Called from Trident
|
|
// ---------------------------------------------------------------------------
|
|
HRESULT ActiveObjectFromMoniker(
|
|
/* in */ BINDF bindf,
|
|
/* in */ IMoniker *pmkOriginal,
|
|
/* in */ IBindCtx *pBindCtx,
|
|
/* in */ REFIID riid,
|
|
/* out */ LPVOID *ppvObject,
|
|
/* out */ IMoniker **ppmkNew);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// ObjectFromUrl - Called from CActiveUrlRequest::Start
|
|
// ---------------------------------------------------------------------------
|
|
HRESULT ActiveObjectFromUrl(
|
|
/* in */ LPCSTR pszRootUrl,
|
|
/* in */ BOOL fCreate,
|
|
/* in */ REFIID riid,
|
|
/* out */ LPVOID *ppvObject,
|
|
/* out */ IUnknown **ppUnkKeepAlive);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// RegisterActiveObject - Called from CMimeMessageTree::CreateRootMoniker
|
|
// ---------------------------------------------------------------------------
|
|
HRESULT RegisterActiveObject(
|
|
/* in */ LPCSTR pszRootUrl,
|
|
/* in */ LPMESSAGETREE pWebBook);
|
|
|
|
HRESULT RemoveUrl(LPACTIVEURL pActiveUrl);
|
|
|
|
private:
|
|
// ---------------------------------------------------------------------------
|
|
// Memory
|
|
// ---------------------------------------------------------------------------
|
|
void _FreeActiveUrlList(BOOL fAll);
|
|
void _HandlePragmaNoCache(BINDF bindf, LPCSTR pszUrl);
|
|
HRESULT _RegisterUrl(LPMESSAGETREE pWebBook, BINDF bindf, LPACTIVEURL *ppActiveUrl);
|
|
HRESULT _ResolveUrl(LPCSTR pszUrl, LPACTIVEURL *ppActiveUrl);
|
|
HRESULT _RemoveUrl(LPACTIVEURL pActiveUrl);
|
|
|
|
private:
|
|
// ---------------------------------------------------------------------------
|
|
// Private Data
|
|
// ---------------------------------------------------------------------------
|
|
LONG m_cRef; // Reference Count
|
|
ULONG m_cActive; // Number of active items
|
|
LPACTIVEURL m_pHead; // Head Active Url
|
|
CRITICAL_SECTION m_cs; // Thread Safety
|
|
};
|
|
|
|
#endif // !MAC
|
|
|
|
#endif // __MHTMLURL_H
|