windows-nt/Source/XPSP1/NT/shell/shdocvw/dochost.h

1271 lines
51 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include "dhuihand.h"
#include "iface.h"
#include "dspsprt.h"
#include "privacyui.hpp"
#ifdef UNIX
#define MAIL_ACTION_SEND 1
#define MAIL_ACTION_READ 2
#endif
#define MAX_SCRIPT_ERR_CACHE_SIZE 20
class CDocObjectHost;
interface IToolbarExt;
interface IHTMLPrivateWindow;
interface IPrivacyServices;
//
// script error handling
// support for caching errors and displaying them when the script error icon
// on the status bar is clicked by the user
//
class CScriptErrorList : public CImpIDispatch,
public IScriptErrorList
{
public:
CScriptErrorList();
~CScriptErrorList();
BOOL IsEmpty()
{ return _hdpa != NULL && DPA_GetPtrCount(_hdpa) == 0; }
BOOL IsFull()
{ return _hdpa != NULL && DPA_GetPtrCount(_hdpa) >= MAX_SCRIPT_ERR_CACHE_SIZE; }
HRESULT AddNewErrorInfo(LONG lLine,
LONG lChar,
LONG lCode,
BSTR strMsg,
BSTR strUrl);
void ClearErrorList();
// IUnknown
STDMETHODIMP QueryInterface(REFIID, void **);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// IDispatch
STDMETHODIMP GetTypeInfoCount(UINT * pctinfo)
{ return CImpIDispatch::GetTypeInfoCount(pctinfo); }
STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo * * pptinfo)
{ return CImpIDispatch::GetTypeInfo(itinfo, lcid, pptinfo); }
STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR * * rgszNames, UINT cNames, LCID lcid, DISPID * rgdispid)
{ return CImpIDispatch::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid); }
STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo, UINT * puArgErr)
{ return CImpIDispatch::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr); }
// IScriptErrorList
STDMETHODIMP advanceError();
STDMETHODIMP retreatError();
STDMETHODIMP canAdvanceError(BOOL * pfCanAdvance);
STDMETHODIMP canRetreatError(BOOL * pfCanRetreat);
STDMETHODIMP getErrorLine(LONG * plLine);
STDMETHODIMP getErrorChar(LONG * plChar);
STDMETHODIMP getErrorCode(LONG * plCode);
STDMETHODIMP getErrorMsg(BSTR * pstrMsg);
STDMETHODIMP getErrorUrl(BSTR * pstrUrl);
STDMETHODIMP getAlwaysShowLockState(BOOL * pfAlwaysShowLock);
STDMETHODIMP getDetailsPaneOpen(BOOL * pfDetailsPaneOpen);
STDMETHODIMP setDetailsPaneOpen(BOOL fDetailsPaneOpen);
STDMETHODIMP getPerErrorDisplay(BOOL * pfPerErrorDisplay);
STDMETHODIMP setPerErrorDisplay(BOOL fPerErrorDisplay);
private:
class _CScriptErrInfo
{
public:
~_CScriptErrInfo();
HRESULT Init(LONG lLine, LONG lChar, LONG lCode, BSTR strMsg, BSTR strUrl);
LONG _lLine;
LONG _lChar;
LONG _lCode;
BSTR _strMsg;
BSTR _strUrl;
};
HDPA _hdpa;
LONG _lDispIndex;
ULONG _ulRefCount;
};
// The dochost and docview need to talk to eachother. We can't use the IOleCommandTarget
// because there's no direction associated with that. Create two different interfaces
// for now becuz that'll probably be useful if we ever make dochost a CoCreateable thing
// so we can share hosting code with shell32.
// (We can coalesce them into one interface later if they don't diverge.)
//
// IDocHostObject
//
EXTERN_C const GUID IID_IDocHostObject; //67431840-C511-11CF-89A9-00A0C9054129
#undef INTERFACE
#define INTERFACE IDocHostObject
DECLARE_INTERFACE_(IDocHostObject, IUnknown)
{
// *** IUnknown methods ***
STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
STDMETHOD_(ULONG,Release)(THIS) PURE;
// *** IDocHostObject methods ***
virtual STDMETHODIMP OnQueryStatus(const GUID *pguidCmdGroup,
ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext, HRESULT hres) PURE;
virtual STDMETHODIMP OnExec(const GUID *pguidCmdGroup,
DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut) PURE;
virtual STDMETHODIMP QueryStatusDown(const GUID *pguidCmdGroup,
ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext) PURE;
virtual STDMETHODIMP ExecDown(const GUID *pguidCmdGroup,
DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut) PURE;
} ;
//
// This is a proxy IOleInPlaceActiveObject class. The interface to this
// object will be passed to the IOleInPlaceUIWindow interface of the browser
// if it support it.
//
class CProxyActiveObject : public IOleInPlaceActiveObject
{
public:
// *** IUnknown methods ***
STDMETHODIMP QueryInterface(REFIID riid, void ** ppvObj);
virtual STDMETHODIMP_(ULONG) AddRef(void) ;
virtual STDMETHODIMP_(ULONG) Release(void);
// *** IOleWindow methods ***
STDMETHODIMP GetWindow(HWND * lphwnd);
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode);
// *** IOleInPlaceActiveObject ***
STDMETHODIMP TranslateAccelerator(LPMSG lpmsg);
STDMETHODIMP OnFrameWindowActivate(
BOOL fActivate);
STDMETHODIMP OnDocWindowActivate(
BOOL fActivate);
STDMETHODIMP ResizeBorder(
LPCRECT prcBorder,
IOleInPlaceUIWindow *pUIWindow,
BOOL fFrameWindow);
STDMETHODIMP EnableModeless(
BOOL fEnable);
void Initialize(CDocObjectHost* pdoh) { _pdoh = pdoh; }
IOleInPlaceActiveObject *GetObject() { return _piact;}
HWND GetHwnd() {return _hwnd;}
void SetActiveObject(IOleInPlaceActiveObject * );
protected:
CDocObjectHost* _pdoh;
IOleInPlaceActiveObject* _piact; // non-NULL while UI-active
HWND _hwnd;
};
// This is a proxy IOleInPlaceFrame class. The interfaces to this object
// will be passed to in-place active object.
//
class CDocObjectFrame : public IOleInPlaceFrame
, public IOleCommandTarget
, public IServiceProvider
, public IInternetSecurityMgrSite
{
public:
// *** IUnknown methods ***
STDMETHODIMP QueryInterface(REFIID riid, void ** ppvObj);
virtual STDMETHODIMP_(ULONG) AddRef(void) ;
virtual STDMETHODIMP_(ULONG) Release(void);
// *** IOleWindow methods ***
STDMETHODIMP GetWindow(HWND * lphwnd);
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode);
// IOleInPlaceUIWindow (also IOleWindow)
STDMETHODIMP GetBorder(LPRECT lprectBorder);
STDMETHODIMP RequestBorderSpace(LPCBORDERWIDTHS pborderwidths);
STDMETHODIMP SetBorderSpace(LPCBORDERWIDTHS pborderwidths);
STDMETHODIMP SetActiveObject(
IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName);
// IOleInPlaceFrame (also IOleInPlaceUIWindow)
STDMETHODIMP InsertMenus(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);
STDMETHODIMP SetMenu(HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject);
STDMETHODIMP RemoveMenus(HMENU hmenuShared);
STDMETHODIMP SetStatusText(LPCOLESTR pszStatusText);
STDMETHODIMP EnableModeless(BOOL fEnable);
STDMETHODIMP TranslateAccelerator(LPMSG lpmsg, WORD wID);
// IOleCommandTarget
STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup,
ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext);
STDMETHODIMP Exec(const GUID *pguidCmdGroup,
DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
// IServiceProvider (must be QI'able from IOleClientSite)
STDMETHODIMP QueryService(REFGUID guidService,
REFIID riid, void **ppvObj);
// *** IInternetSecurityMgrSite methods ***
// STDMETHODIMP GetWindow(HWND * lphwnd) { return IOleWindow::GetWindow(lphwnd); }
// STDMETHODIMP EnableModeless(BOOL fEnable) { return IOleInPlaceFrame::EnableModeless(fEnable); }
public:
void Initialize(CDocObjectHost* pdoh) { _pdoh = pdoh; }
protected:
CDocObjectHost* _pdoh;
};
//
// LATER: Move it to a private, but shared header later.
//
// BROWSERFLAG_OPENCOPY - make a copy of object (Excel)
// BROWSERFLAG_OPENVERB - use OLEIVERB_OPEN instead of PRIMARY
// BROWSERFLAG_SETHOSTNAME - set HostName
// BROWSERFLAG_DONTINPLACE - Never in-place activate
// BROWSERFLAG_CANOPENFILEMULTIPETIMES-
// BROWSERFLAG_DONTUIDEACTIVATE - Never UI-deactivate
// BROWSERFLAG_NEVERERASEBKGND - Never erase background (Trident)
// BROWSERFLAG_PRINTPROMPTUI - Don't pass DONPROMPTUI for PRINT (PPT)
// BROWSERFLAG_SUPPORTTOP - Handles Navigate("#top")
// BROWSERFLAG_INITNEWTOKEEP - IPS::InitNew to keep it running
// BROWSERFLAG_DONTAUTOCLOSE - Don't auto close on first navigate w/ no OLE object
// BROWSERFLAG_REPLACE - Don't use hard-coded flags
// BROWSERFLAG_DONTCACHESERVER - Don't cache the server.
// BROWSERFLAG_ENABLETOOLSBUTTON - Ignore when QueryStatus doesn't set enabled flag (Visio)
// BROWSERFLAG_SAVEASWHENCLOSING - Show the Save As dialog instead of attempting to save (Visio)
//
#define BROWSERFLAG_OPENCOPY 0x00000001
#define BROWSERFLAG_OPENVERB 0x00000002
#define BROWSERFLAG_SETHOSTNAME 0x00000004
#define BROWSERFLAG_DONTINPLACE 0x00000008
#define BROWSERFLAG_CANOPENFILEMULTIPETIMES 0x00000010
#define BROWSERFLAG_DONTUIDEACTIVATE 0x00000020
#define BROWSERFLAG_NEVERERASEBKGND 0x00000040
#define BROWSERFLAG_PRINTPROMPTUI 0x00000080
#define BROWSERFLAG_SUPPORTTOP 0x00000100
#define BROWSERFLAG_INITNEWTOKEEP 0x00000200
#define BROWSERFLAG_DONTAUTOCLOSE 0x00000400
#define BROWSERFLAG_DONTDEACTIVATEMSOVIEW 0x00000800
#define BROWSERFLAG_MSHTML 0x40000000
#define BROWSERFLAG_REPLACE 0x80000000
#define BROWSERFLAG_DONTCACHESERVER 0x00001000
#define BROWSERFLAG_ENABLETOOLSBTN 0x00002000
#define BROWSERFLAG_SAVEASWHENCLOSING 0x00004000
#ifdef FEATURE_PICS
class CPicsRootDownload;
#endif
// CMenuList: a small class that tracks whether a given hmenu belongs
// to the frame or the object, so the messages can be
// dispatched correctly.
class CMenuList
{
public:
CMenuList(void);
~CMenuList(void);
void Set(HMENU hmenuShared, HMENU hmenuFrame);
void AddMenu(HMENU hmenu);
void RemoveMenu(HMENU hmenu);
BOOL IsObjectMenu(HMENU hmenu);
#ifdef DEBUG
void Dump(LPCTSTR pszMsg);
#endif
private:
HDSA _hdsa;
};
#define ERRORPAGE_DNS 1
#define ERRORPAGE_SYNTAX 2
#define ERRORPAGE_NAVCANCEL 3
#define ERRORPAGE_OFFCANCEL 4
#define ERRORPAGE_CHANNELNOTINCACHE 5
// Array of http error codes and file names.
//
struct ErrorUrls
{
DWORD dwError;
LPCTSTR pszUrl;
};
class CDocObjectHost :
/* public CDocHostUIHandler */
public IDocHostUIHandler2
, public IDocHostShowUI
/* Group 2 */ , public IOleClientSite, public IOleDocumentSite
, public IOleCommandTarget
/* Group 3 */ , public IOleInPlaceSiteEx
/* VBE */ , public IServiceProvider
, public IDocHostObject
/* palette */ , public IViewObject, public IAdviseSink
, public IDispatch // ambient properties (from container/iedisp)
, public IPropertyNotifySink // for READYSTATE
, public IOleControlSite // forward to container/iedisp
, protected CImpWndProc
{
/*typedef CDocHostUIHandler super;*/
friend class CDocObjectView;
friend CDocObjectFrame;
friend CProxyActiveObject;
friend void CDocObjectHost_GetCurrentPage(LPARAM that, LPTSTR szBuf, UINT cchMax);
public:
CDocObjectHost(BOOL fWindowOpen = FALSE);
// *** IUnknown methods ***
STDMETHODIMP QueryInterface(REFIID riid, void ** ppvObj);
virtual STDMETHODIMP_(ULONG) AddRef(void) ;
virtual STDMETHODIMP_(ULONG) Release(void);
// IOleClientSite
STDMETHODIMP SaveObject(void);
STDMETHODIMP GetMoniker(DWORD, DWORD, IMoniker **);
STDMETHODIMP GetContainer(IOleContainer **);
STDMETHODIMP ShowObject(void);
STDMETHODIMP OnShowWindow(BOOL fShow);
STDMETHODIMP RequestNewObjectLayout(void);
// IServiceProvider (must be QI'able from IOleClientSite)
STDMETHODIMP QueryService(REFGUID guidService,
REFIID riid, void **ppvObj);
// IViewObject
STDMETHODIMP Draw(DWORD, LONG, void *, DVTARGETDEVICE *, HDC, HDC,
const RECTL *, const RECTL *, BOOL (*)(ULONG_PTR), ULONG_PTR);
STDMETHODIMP GetColorSet(DWORD, LONG, void *, DVTARGETDEVICE *,
HDC, LOGPALETTE **);
STDMETHODIMP Freeze(DWORD, LONG, void *, DWORD *);
STDMETHODIMP Unfreeze(DWORD);
STDMETHODIMP SetAdvise(DWORD, DWORD, IAdviseSink *);
STDMETHODIMP GetAdvise(DWORD *, DWORD *, IAdviseSink **);
// IAdviseSink
virtual STDMETHODIMP_(void) OnDataChange(FORMATETC *, STGMEDIUM *);
virtual STDMETHODIMP_(void) OnViewChange(DWORD dwAspect, LONG lindex);
virtual STDMETHODIMP_(void) OnRename(IMoniker *);
virtual STDMETHODIMP_(void) OnSave();
virtual STDMETHODIMP_(void) OnClose();
// *** IOleWindow methods ***
STDMETHODIMP GetWindow(HWND * lphwnd);
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode);
// IOleInPlaceSite (also IOleWindow)
STDMETHODIMP CanInPlaceActivate( void);
STDMETHODIMP OnInPlaceActivate( void);
STDMETHODIMP OnUIActivate( void);
STDMETHODIMP GetWindowContext(
IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc,
LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo);
STDMETHODIMP Scroll(SIZE scrollExtant);
STDMETHODIMP OnUIDeactivate(BOOL fUndoable);
STDMETHODIMP OnInPlaceDeactivate( void);
STDMETHODIMP DiscardUndoState( void);
STDMETHODIMP DeactivateAndUndo( void);
STDMETHODIMP OnPosRectChange(LPCRECT lprcPosRect);
// IOleInPlaceSiteEx
STDMETHODIMP OnInPlaceActivateEx(BOOL *pfNoRedraw, DWORD dwFlags);
STDMETHODIMP OnInPlaceDeactivateEx(BOOL fNoRedraw);
STDMETHODIMP RequestUIActivate( void);
// IOleDocumentSite
STDMETHODIMP ActivateMe(IOleDocumentView *pviewToActivate);
// IDocHostUIHandler
STDMETHODIMP ShowContextMenu(
DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved);
STDMETHODIMP GetHostInfo(DOCHOSTUIINFO *pInfo);
STDMETHODIMP ShowUI(
DWORD dwID, IOleInPlaceActiveObject *pActiveObject,
IOleCommandTarget *pCommandTarget, IOleInPlaceFrame *pFrame,
IOleInPlaceUIWindow *pDoc);
STDMETHODIMP HideUI(void);
STDMETHODIMP UpdateUI(void);
STDMETHODIMP EnableModeless(BOOL fEnable);
STDMETHODIMP OnDocWindowActivate(BOOL fActivate);
STDMETHODIMP OnFrameWindowActivate(BOOL fActivate);
STDMETHODIMP ResizeBorder(
LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow);
STDMETHODIMP TranslateAccelerator(
LPMSG lpMsg, const GUID *pguidCmdGroup, DWORD nCmdID);
STDMETHODIMP GetOptionKeyPath(BSTR *pbstrKey, DWORD dw);
STDMETHODIMP GetDropTarget(
IDropTarget *pDropTarget, IDropTarget **ppDropTarget);
STDMETHODIMP GetExternal(IDispatch **ppDisp);
STDMETHODIMP TranslateUrl(DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut);
STDMETHODIMP FilterDataObject(IDataObject *pDO, IDataObject **ppDORet);
// IDocHostUIHandler2
STDMETHODIMP GetOverrideKeyPath(LPOLESTR *pchKey, DWORD dw);
// IDocHostShowUI
STDMETHODIMP ShowMessage(HWND hwnd, LPOLESTR lpstrText, LPOLESTR lpstrCaption,
DWORD dwType, LPOLESTR lpstrHelpFile, DWORD dwHelpContext, LRESULT *plResult);
STDMETHODIMP ShowHelp(HWND hwnd, LPOLESTR pszHelpFile, UINT uCommand, DWORD dwData,
POINT ptMouse, IDispatch *pDispatchObjectHit);
// IOleInPlaceFrame equivalent (non-virtual)
HRESULT _InsertMenus(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);
HRESULT _SetMenu(HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject);
HRESULT _RemoveMenus(HMENU hmenuShared);
HRESULT _SetStatusText(LPCOLESTR pszStatusText);
HRESULT _EnableModeless(BOOL fEnable);
HRESULT _TranslateAccelerator(LPMSG lpmsg, WORD wID);
// IOleCommandTarget equivalent (virtual / both direction)
STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup,
ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext);
STDMETHODIMP Exec(const GUID *pguidCmdGroup,
DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
// *** IDocHostObject methods ***
STDMETHODIMP OnQueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext, HRESULT hres);
STDMETHODIMP OnExec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
STDMETHODIMP QueryStatusDown(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext);
STDMETHODIMP ExecDown(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
// *** IDispatch methods ***
STDMETHOD(GetTypeInfoCount) (unsigned int *pctinfo)
{ return E_NOTIMPL; };
STDMETHOD(GetTypeInfo) (unsigned int itinfo, LCID lcid, ITypeInfo **pptinfo)
{ return E_NOTIMPL; };
STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR * * rgszNames, unsigned int cNames, LCID lcid, DISPID * rgdispid)
{ return E_NOTIMPL; };
STDMETHODIMP Invoke(DISPID dispidMember, REFIID iid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams,
VARIANT * pvarResult,EXCEPINFO * pexcepinfo,UINT * puArgErr);
// *** IPropertyNotifySink methods ***
STDMETHODIMP OnChanged(DISPID dispid);
STDMETHODIMP OnRequestEdit(DISPID dispid);
// *** IOleControlSite ***
STDMETHODIMP OnControlInfoChanged();
STDMETHODIMP LockInPlaceActive(BOOL fLock)
{ return E_NOTIMPL; };
STDMETHODIMP GetExtendedControl(IDispatch **ppDisp)
{ *ppDisp = NULL; return E_NOTIMPL; };
STDMETHODIMP TransformCoords(POINTL *pPtlHimetric, POINTF *pPtfContainer,DWORD dwFlags)
{ return E_NOTIMPL; };
STDMETHODIMP TranslateAccelerator(MSG *pMsg,DWORD grfModifiers);
STDMETHODIMP OnFocus(BOOL fGotFocus)
{ return E_NOTIMPL; };
STDMETHODIMP ShowPropertyFrame(void)
{ return E_NOTIMPL; };
HRESULT SetTarget(IMoniker* pmk, UINT uiCP, LPCTSTR pszLocation, LPITEMIDLIST pidlKey, IShellView* psvPrev, BOOL fFileProtocol);
HRESULT UIActivate(UINT uState, BOOL fPrevViewIsDocView);
//Helper function for initing History related privates
IUnknown *get_punkSFHistory();
BOOL InitHostWindow(IShellView* psv, IShellBrowser* psb, LPRECT prcView);
void DestroyHostWindow();
BOOL _OperationIsHyperlink();
void _ChainBSC();
HRESULT TranslateHostAccelerators(LPMSG lpmsg);
HRESULT AddPages(LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam);
BOOL _IsMenuShared(HMENU hmenu);
void _SetPriorityStatusText(LPCOLESTR pszPriorityStatusText);
BOOL DocCanHandleNavigation() const
{ return (_fPrevDocHost && _fDocCanNavigate); }
void OnInitialUpdate();
void ResetRefreshUrl();
void HideBrowser() const;
protected:
virtual ~CDocObjectHost();
// Private method
void _InitOleObject();
void _ResetOwners();
virtual LRESULT v_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void _OnMenuSelect(UINT id, UINT mf, HMENU hmenu);
void _OnInitMenuPopup(HMENU hmInit, int nIndex, BOOL fSystemMenu);
void _OnCommand(UINT wNotify, UINT id, HWND hwndControl);
void _OnNotify(LPNMHDR lpnm);
void _OnSave(void);
void _OnBound(HRESULT hres);
static BOOL_PTR CALLBACK s_RunDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void _OnOpen(void);
void _OnClose() const;
BOOL _HideBrowserBar() const;
void _OnImportExport(HWND hwnd);
HRESULT _PrepFileOpenAddrBand(IAddressEditBox ** ppaeb, IWinEventHandler ** ppweh, IBandSite ** ppbs);
void _OnPaint(HDC hdc);
void _OnSetFocus(void);
void _GetClipRect(RECT* prc);
void _RegisterWindowClass(void);
void _PlaceProgressBar(BOOL fForcedLayout=FALSE);
void _OnSetProgressPos(DWORD dwPos, DWORD state);
void _OnSetProgressMax(DWORD dwRange);
HRESULT _OnContentDisposition();
void _OnSetStatusText(VARIANTARG *pvarIn);
void _Navigate();
#ifndef UNIX
void _NavigateFolder(BSTR bstrUrl);
#endif // UNIX
// IE Media Bar functions
BOOL _DelegateToMediaBar(IBindCtx * pbc, LPCWSTR pwzMimeType);
void _ForceCreateMediaBar();
static INT_PTR CALLBACK s_MimeDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void _CancelPendingNavigation(BOOL fDownloadAsync,
BOOL fSyncReally = FALSE,
BOOL fDontShowNavCancelPage = FALSE,
BOOL fForceClose = FALSE);
void _DoAsyncNavigation(LPCTSTR pwzURL);
IOleInPlaceSite* _GetParentSite(void);
HRESULT _GetCurrentPage(LPTSTR szBuf, UINT cchMax, BOOL fURL=FALSE);
HRESULT _GetCurrentPageW(LPOLESTR * ppszDisplayName, BOOL fURL=FALSE);
BOOL _IsDirty(IPersistFile** pppf);
HRESULT _OnSaveAs(void);
void _MergeToolbarSB();
void _OnHelpGoto(UINT idRes);
void _Navigate(LPCWSTR pwszURL);
HRESULT _OnMaySaveChanges(void);
void _OnCodePageChange(const VARIANTARG* pvarargIn);
void _MappedBrowserExec(DWORD nCmdID, DWORD nCmdexecopt);
#ifdef DEBUG
void _DumpMenus(LPCTSTR pszMsg, BOOL bBreak);
#endif
HRESULT _BindSync(IMoniker* pmk, IBindCtx* pbc, IShellView* psvPrev);
void _PostBindAppHack(void);
void _AppHackForExcel95(void);
HRESULT _GetOfflineSilent(BOOL *pbIsOffline, BOOL *pbIsSilent);
HRESULT _StartAsyncBinding(IMoniker* pmk, IBindCtx* pbc, IShellView* psvPrev);
HRESULT _BindWithRetry(IMoniker* pmk, IBindCtx* pbc, IShellView* psvPrev);
void _UnBind(void);
void _ReleaseOleObject(BOOL fIfInited = TRUE);
void _ReleasePendingObject(BOOL fIfInited = TRUE);
HRESULT _GetUrlVariant(VARIANT *pvarOut);
HRESULT _CreatePendingDocObject(BOOL fMustInit, BOOL fWindowOpen = FALSE);
void _ActivateOleObject(void);
HRESULT _CreateMsoView(void);
void _CloseMsoView(void);
HRESULT _EnsureActivateMsoView(void);
void _ShowMsoView(void);
void _HideOfficeToolbars(void);
HRESULT _ActivateMsoView(void);
HRESULT _DoVerbHelper(BOOL fOC);
void _InitToolbarButtons(void);
void _UIDeactivateMsoView(void);
BOOL _BuildClassMapping(void);
HRESULT _RegisterMediaTypeClass(IBindCtx* pbc);
void _IPDeactivateMsoView(IOleDocumentView* pmsov);
void _CompleteHelpMenuMerge(HMENU hmenu);
BOOL _ShouldForwardMenu(UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT _ForwardObjectMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
HRESULT _MayHaveVirus(REFCLSID rclsid);
HRESULT _ForwardSetSecureLock(int lock);
void _ResetStatusBar();
BOOL _ToolsButtonAvailable();
BYTE _DefToolsButtonState(DWORD dwRest);
BYTE _DefFontsButtonState(DWORD dwRest);
DWORD _DiscussionsButtonCmdf();
BOOL _DiscussionsButtonAvailable();
BYTE _DefDiscussionsButtonState(DWORD dwRest);
BOOL _MailButtonAvailable();
BYTE _DefMailButtonState(DWORD dwRest);
BOOL _EditButtonAvailable();
BYTE _DefEditButtonState(DWORD dwRest);
void _MarkDefaultButtons(PTBBUTTON tbStd);
const GUID* _GetButtonCommandGroup();
void _AddButtons(BOOL fForceReload);
HRESULT _OnChangedReadyState();
void _OnReadyState(long lVal, BOOL fUpdateHistory = TRUE);
BOOL _SetUpTransitionCapability(BOOL fWindowOpen = FALSE);
BOOL _RemoveTransitionCapability();
void _UpdateHistoryAndIntSiteDB(LPCWSTR pszTitle);
HRESULT _CoCreateHTMLDocument(REFIID riid, LPVOID* ppvOut);
void _RemoveFrameSubMenus(void);
HRESULT _DestroyBrowserMenu(void);
HRESULT _CreateBrowserMenu(LPOLEMENUGROUPWIDTHS pmw);
void _SetStatusText(LPCSTR pszText);
void _OnSetTitle(VARIANTARG *pvTitle);
DWORD _GetAppHack(void);
void _CleanupProgress(void);
// Trident Native Frames Support
//
VOID ClearScriptError();
HRESULT _HandleFailedNavigation(VARIANTARG * varargIn, VARIANTARG * varargOut = NULL );
HRESULT _DisplayHttpErrorPage(IHTMLWindow2 * pCurrentWindow,
BSTR bstrUrl,
DWORD dwError,
BOOL fAddrBarNav,
BOOL fRefresh = FALSE );
HRESULT _DoAutoSearch(VARIANTARG * pvarargIn,
long lStartIdx,
DWORD dwStatusCode,
BOOL fAddMRU,
BOOL * pfShouldDisplayError);
HRESULT _HandleDocHostCmds(DWORD nCmdID,
DWORD nCmdexecopt,
VARIANTARG * pvarargIn,
VARIANTARG * pvarargOut,
BOOL * pfHandled);
HRESULT _HandleDocHostCmdPriv(DWORD nCmdID,
DWORD nCmdexecopt,
VARIANTARG * pvarargIn,
VARIANTARG * pvarargOut,
BOOL * pfHandled);
HRESULT _NavigateDocument(BSTR bstrUrl, BSTR bstrLocation);
void _GetShortCutPath(BSTR * bstrShortCutPath);
void _GetDocNavFlags(DWORD * pdwDocNavFlags);
BOOL _HandleShdocvwCmds(DWORD nCmdID,
DWORD nCmdexecopt,
VARIANTARG * pvarargIn,
VARIANTARG * pvarargOut);
void _StartPicsForWindow(VARIANTARG * pvarargIn, VARIANTARG * pvarargOut);
void _CancelPicsForWindow(VARIANTARG * pvarargIn);
void _IsPicsEnabled(VARIANTARG * pvarIsPicsEnabled);
HRESULT _UpdateState(LPITEMIDLIST pidl, BOOL fIsErrorUrl);
void _Init();
BOOL _IsInBrowserBand() const;
DEBUG_CODE(void _TraceMonikerDbg(IMoniker * pmk, TCHAR * pszCaller) const;)
HRESULT _LoadDocument();
void _FireNavigateErrorHelper(IHTMLWindow2 * pHTMLWindow2,
DWORD dwStatusCode,
BOOL * pfCancelAutoSearch,
BSTR bstrPendingURL = NULL);
static LRESULT s_IconsWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
static UINT _MapCommandID(UINT id, BOOL fToMsoCmd);
inline static UINT _MapToMso(UINT id) { return _MapCommandID(id, TRUE); }
inline static UINT _MapFromMso(UINT idMso) { return _MapCommandID(idMso, FALSE); }
inline IOleInPlaceActiveObject *_ActiveObject() { return _xao.GetObject(); }
inline HWND _ActiveHwnd() { return _xao.GetHwnd(); }
inline IOleObject * GetOleObject() { return _pole; }
// internal class objects
CDocObjectFrame _dof;
CProxyActiveObject _xao;
CDocHostUIHandler _dhUIHandler;
IToolbarExt * _pBrowsExt;
int _iString; // start index for toolbar button strings
UINT _cRef;
// parent references
IShellView * _psv;
IOleCommandTarget* _pmsoctView;
IDocViewSite* _pdvs;
//
IShellBrowser* _psb;
IOleCommandTarget* _pmsoctBrowser;
IBrowserService* _pwb;
IServiceProvider* _psp;
IOleInPlaceUIWindow* _pipu; // Optional interface from IShellBrowser
IExpDispSupport * _peds;
IExpDispSupportOC * _pedsHelper;
// for pre-merged menu
IOleCommandTarget* _pcmdMergedMenu;
// Pointer to the WebBrowserOC's DocHostUIHandler, if any.
IDocHostUIHandler * _pWebOCUIHandler;
IDocHostUIHandler2 * _pWebOCUIHandler2;
// Pointer to the WebBrowserOC's ShowUI handler, if any.
IDocHostShowUI * _pWebOCShowUI;
// Pointer to the WebBrowserOC's InPlaceSiteEx, if any.
IOleInPlaceSiteEx * _pWebOCInPlaceSiteEx;
// we created...
UINT _uState;
HWND _hwndProgress;
HWND _hwndIcons;
HWND _hwndTooltip;
WNDPROC _pfnStaticWndProc;
HACCEL _hacc;
// Menus: the final menu bar the user sees (_hmenuCur, _hmenuSet) is the product
// of merging the object's menu with the browser's menu. The browser's menu
// (_hmenuBrowser) is the result of combining the browser's
// menu (owned by mshtml, obtained via IShellBrowser) with the
// frame's menu (_hmenuFrame).
HMENU _hmenuFrame; // menu to be merged when we have focus
HMENU _hmenuBrowser; // Menu from IShellBrowser
HMENU _hmenuSet; // set by ::SetMenu
HMENU _hmenuCur; // currently set menu
HMENU _hmenuMergedHelp; // Merged help menu
HMENU _hmenuObjHelp; // Hosted object's help menu
CMenuList _menulist; // Menu list for dispatching
LPCTSTR _pszLocation;
UINT _uiCP;
LPOLESTR _pwszRefreshUrl; // Url to refresh when intrenal error page is dispalyed.
BOOL _fNeedToActivate:1; // this is set when we do a LoadHistory on the _pole
BOOL _fClientSiteSet:1;
BOOL _fDontInplaceActivate:1;
BOOL _fDrawBackground:1;
BOOL _fCanceledByBrowser:1;
BOOL _fForwardMenu:1; // TRUE: forward the menu message
BOOL _fHaveParentSite:1; // pretty much "we're in a frame"
BOOL _fhasLastModified; // object has Last-Modified header
BOOL _fIPDeactivatingView:1;
BOOL _fCantSaveBack:1; // We can't call IPSFile::Save(NULL)
BOOL _fHaveAppHack:1;
BOOL _fReadystateInteractiveProcessed:1;
BOOL _fFileProtocol:1;
BOOL _fConfirmed:1; // _MayHaveVirus already confirmed
BOOL _fCycleFocus:1; // 1=got callback to do CycleFocus
BOOL _fCreatingPending:1; // we are creating _punkPending
BOOL _fAbortCreatePending:1; // abort create due to reentrant free
BOOL _fCalledMayOpenSafeDlg:1; // Already called MayOpenSafeOpenDialog.
BOOL _fPendingNeedsInit:1; // does _punkPending need to be inited?
BOOL _fPendingWasInited:1; // _punkPending was inited
BOOL _fSetSecureLock:1; // indicates we should update the browser with fSecureLock
BOOL _fProgressTimer:1; // progress timer is active
BOOL _fProgressTimerFull:1; // wait a quarter sec with a full progress bar
BOOL _fIsHistoricalObject:1; // this item was retrieved from GetHistoryObject() and successfully took LoadHistory()
BOOL _fSyncBindToObject:1; // to detect when the call backs are on the sync thread
BOOL _fUIActivatingView:1; // Indicates if we're UIActivating or Showing our DocObj view.
BOOL _fShowProgressCtl:1; // Show the progress control on the status bar.
BOOL _fWebOC:1; // are we a web oc?
#ifdef DEBUG
BOOL _fFriendlyError:1; // So we know we're going to an error page.
#endif
BOOL _fDocCanNavigate:1; // TRUE indicates that the hosted document can navigate itself.
BOOL _fPrevDocHost:1; // TRUE if there was a previous doc object host.
BOOL _fClosing:1; // The browser is being closed.
BOOL _fRefresh:1; // the browser is being refreshed (ie we are handling refresh).
BOOL _fDelegatedNavigation:1; // TRUE if the navigation was delegated from the document.
BOOL _fErrorPage : 1; // True if we're navigating to some sort of error page.
BOOL _fWindowOpen:1;
IHTMLWindow2 * _pHTMLWindow; // Navigation interface of the hosted document.
LPITEMIDLIST _pidl; // Current pidl.
HRESULT _hrOnStopBinding; // set in onstopbinding when _fSyncBindToObject
DWORD _dwPropNotifyCookie;
DWORD _dwAppHack;
DWORD _dwSecurityStatus; // Return from QueryOptions(INTERNET_OPTION_SECURITY_FLAGS)
int _eSecureLock; // one of the SECURELOCK_* values
HINSTANCE _hinstInetCpl; // Inetcpl
TBBUTTON* _ptbStd; // buffer for button array (used for ETCMDID_GETBUTTONS)
int _nNumButtons;
VARIANT _varUserEnteredUrl; // The URL entered by the user in the address bar.
// Needed for AutoSearch when initiated by Trident.
BOOL _fDontInPlaceNavigate() { ASSERT(_fHaveAppHack); return (_dwAppHack & BROWSERFLAG_DONTINPLACE); }
BOOL _fCallSetHostName() { ASSERT(_fHaveAppHack); return (_dwAppHack & BROWSERFLAG_SETHOSTNAME); }
BOOL _fUseOpenVerb() { ASSERT(_fHaveAppHack); return (_dwAppHack & BROWSERFLAG_OPENVERB); }
BOOL _fAppHackForExcel() { ASSERT(_fHaveAppHack); return (_dwAppHack & BROWSERFLAG_OPENCOPY); }
UINT posOfflineIcon;
enum {
PROGRESS_RESET,
PROGRESS_FINDING,
PROGRESS_TICK,
PROGRESS_SENDING,
PROGRESS_RECEIVING,
PROGRESS_FULL
};
#define PROGRESS_REBASE 100
#define PROGRESS_FINDMAX 30 * PROGRESS_REBASE // maximum amount of status on find
#define PROGRESS_SENDMAX 40 * PROGRESS_REBASE // maximum amount of status on send
#define PROGRESS_TOTALMAX 100 * PROGRESS_REBASE // the total size of the progress bar in find/send
#define PROGRESS_INCREMENT 50 // default progress increment
#define ADJUSTPROGRESSMAX(dw) (PROGRESS_REBASE * (dw) )
#define ADJUSTPROGRESSPOS(dw) ((dw) * PROGRESS_REBASE + ((_dwProgressBase * _dwProgressMax) / PROGRESS_REBASE))
DWORD _dwProgressMax; // max progress range for progress bar
DWORD _dwProgressPos;
DWORD _dwProgressInc;
DWORD _dwProgressTicks;
DWORD _dwProgressMod;
DWORD _dwProgressBase;
#define IDTIMER_PROGRESS 88
#define IDTIMER_PROGRESSFULL 89
#ifdef HLINK_EXTRA
// Navigation
IHlinkBrowseContext* _pihlbc;
#endif // HLINK_EXTRA
// Data associated
IMoniker* _pmkCur;
IBindCtx* _pbcCur;
IOleObject* _pole;
IViewObject* _pvo;
IStorage* _pstg;
IUnknown* _punkPending;
IHlinkFrame *_phf;
IOleCommandTarget*_pocthf;
IUnknown *_punkSFHistory;
// Advisory connection
IAdviseSink *_padvise;
DWORD _advise_aspect;
DWORD _advise_advf;
// View associated (only used when the object is active)
IOleDocumentView* _pmsov;
IOleCommandTarget* _pmsot;
IOleControl* _pmsoc;
IHlinkSource* _phls;
BORDERWIDTHS _bwTools;
RECT _rcView;
int _iZoom;
int _iZoomMin;
int _iZoomMax;
class CDOHBindStatusCallback : public IBindStatusCallback
, public IAuthenticate
, public IServiceProvider
, public IHttpNegotiate
, public IHttpSecurity
{
friend CDocObjectHost;
protected:
// *** IUnknown methods ***
STDMETHODIMP QueryInterface(REFIID riid, void ** ppvObj);
virtual STDMETHODIMP_(ULONG) AddRef(void) ;
virtual STDMETHODIMP_(ULONG) Release(void);
// *** IAuthenticate ***
STDMETHODIMP Authenticate(
HWND *phwnd,
LPWSTR *pszUsername,
LPWSTR *pszPassword);
// *** IServiceProvider ***
STDMETHODIMP QueryService(REFGUID guidService,
REFIID riid, void **ppvObj);
// *** IBindStatusCallback ***
STDMETHODIMP OnStartBinding(
/* [in] */ DWORD grfBSCOption,
/* [in] */ IBinding *pib);
STDMETHODIMP GetPriority(
/* [out] */ LONG *pnPriority);
STDMETHODIMP OnLowResource(
/* [in] */ DWORD reserved);
STDMETHODIMP OnProgress(
/* [in] */ ULONG ulProgress,
/* [in] */ ULONG ulProgressMax,
/* [in] */ ULONG ulStatusCode,
/* [in] */ LPCWSTR szStatusText);
STDMETHODIMP OnStopBinding(
/* [in] */ HRESULT hresult,
/* [in] */ LPCWSTR szError);
STDMETHODIMP GetBindInfo(
/* [out] */ DWORD *grfBINDINFOF,
/* [unique][out][in] */ BINDINFO *pbindinfo);
STDMETHODIMP OnDataAvailable(
/* [in] */ DWORD grfBSCF,
/* [in] */ DWORD dwSize,
/* [in] */ FORMATETC *pformatetc,
/* [in] */ STGMEDIUM *pstgmed);
STDMETHODIMP OnObjectAvailable(
/* [in] */ REFIID riid,
/* [iid_is][in] */ IUnknown *punk);
/* *** IHttpNegotiate *** */
STDMETHODIMP BeginningTransaction(LPCWSTR szURL, LPCWSTR szHeaders,
DWORD dwReserved, LPWSTR *pszAdditionalHeaders);
STDMETHODIMP OnResponse(DWORD dwResponseCode, LPCWSTR szResponseHeaders,
LPCWSTR szRequestHeaders,
LPWSTR *pszAdditionalRequestHeaders);
/* *** IHttpSecurity *** */
STDMETHODIMP GetWindow(REFGUID rguidReason, HWND* phwnd);
STDMETHODIMP OnSecurityProblem(DWORD dwProblem);
protected:
~CDOHBindStatusCallback();
IBinding* _pib;
IBindCtx* _pbc;
IBindStatusCallback* _pbscChained;
IHttpNegotiate* _pnegotiateChained;
IShellView* _psvPrev;
ULONG _bindst;
HGLOBAL _hszPostData;
int _cbPostData;
LPSTR _pszHeaders;
LPTSTR _pszRedirectedURL;
LPTSTR _pszCacheFileName;
DWORD _dwBindVerb; // the verb requested
DWORD _dwBindf; // last set of bind flags returned as a response to the GetBindInfo call...
DWORD _cbContentLength;
BOOL _fSelfAssociated:1; //
BOOL _fBinding:1; // downloading
BOOL _bFrameIsOffline:1;
BOOL _bFrameIsSilent:1;
BOOL _fDocWriteAbort:1; // abort to use _punkPending
BOOL _fBoundToMSHTML:1; // if bound to TRIDENT
BOOL _fBoundToNoOleObject:1; // the object does not support IOleObject
BOOL _fAborted:1; // TRUE when AbortBinding called when IDCANCEL for BINDSTATUS_CONTENTDISPOSITIONATTACH
//Privacy data
LPTSTR _pszPolicyRefURL;
LPTSTR _pszP3PHeader;
DWORD _dwPrivacyFlags;
CPrivacyQueue _privacyQueue;
void _Redirect(LPCWSTR pwzNew);
HRESULT _HandleSelfAssociate(void);
void _UpdateSSLIcon(void);
BOOL _DisplayFriendlyHttpErrors(void);
void _HandleHttpErrors(DWORD dwError, DWORD cbContentLength, CDocObjectHost* pdoh);
HRESULT _HandleFailedNavigationSearch (LPBOOL pfShouldDisplayError,
DWORD dwStatusCode,
CDocObjectHost * pdoh,
HRESULT hrDisplay,
TCHAR * szURL,
LPCWSTR szError,
IBinding * pib,
BOOL fAddMRU = TRUE,
BOOL fFromTrident = FALSE);
void _CheckForCodePageAndShortcut(void);
void _DontAddToMRU(CDocObjectHost* pdoh);
void _UpdateMRU(CDocObjectHost* pdoh, LPCWSTR pszUrl);
HRESULT _SetSearchInfo(CDocObjectHost *pdoh, DWORD dwIndex, BOOL fAllowSearch, BOOL fContinueSearch, BOOL fSentToEngine);
void ResetPrivacyInfo();
HRESULT BuildRecord();
HRESULT AddToPrivacyQueue(LPTSTR * ppszUrl, LPTSTR * ppszPolicyRef, LPTSTR * ppszP3PHeader, DWORD dwFlags);
public:
void AbortBinding(void);
CDOHBindStatusCallback() : _pib(NULL) {}
void _RegisterObjectParam(IBindCtx* pbc);
void _RevokeObjectParam(IBindCtx* pbc);
void _NavigateToErrorPage(DWORD dwError, CDocObjectHost* pdoh, BOOL fInPlace);
};
friend class CDOHBindStatusCallback;
CDOHBindStatusCallback _bsc;
#ifdef FEATURE_PICS
#define PICS_WAIT_FOR_ASYNC 0x01 /* waiting for async rating query */
#define PICS_WAIT_FOR_INDOC 0x02 /* waiting for in-document rating */
#define PICS_WAIT_FOR_ROOT 0x04 /* waiting for root document */
#define PICS_WAIT_FOR_END 0x08 /* waiting for end of document */
#define PICS_MULTIPLE_FLAGS PICS_WAIT_FOR_INDOC /* sources which can produce multiple results */
#define PICS_LABEL_FROM_HEADER 0 /* label was obtained from the http header */
#define PICS_LABEL_FROM_PAGE 1 /* label was obtained from the page itself */
/*
* _fPicsBlockLate - TRUE if we're using a DocObject which we have
* to allow to download completely because we may
* need to get ratings out of it. FALSE if we
* just want to block it as early as possible
* (usually at OnProgress(CLASSIDAVAILABLE)).
* _fSetTarget - bug 29364: this indicates we are calling _StartAsyncBinding
* and we shouldn't do any activation, even if we're told to.
* Has URLMON changed how it binds to objects? (GregJ claims
* that URLMON never called OnObjectAvailable synchronously
* with the _StartAsyncBinding call...) It also seems that
* both Trident and this PICS stuff use the
* message SHDVID_ACTIVATEMENOW which might confuse
* the delayed activation stuff CDTurner put in... [mikesh]
*/
BOOL _fSetTarget:1;
BOOL _fPicsBlockLate:1;
class CPicsProcessor : public IOleCommandTarget
{
// Everything public because the _bsc needs to get at base proc
public:
friend class CDocObjectHost;
CPicsProcessor();
~CPicsProcessor() { _ReInit(); }
void _ReInit();
// *** IUnknown methods ***
STDMETHODIMP QueryInterface(REFIID riid, void ** ppvObj);
virtual STDMETHODIMP_(ULONG) AddRef(void) ;
virtual STDMETHODIMP_(ULONG) Release(void);
// IOleCommandTarget equivalent (virtual / both direction)
STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup,
ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext);
STDMETHODIMP Exec(const GUID *pguidCmdGroup,
DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
/* PICS state flags:
*
* _fPicsAccessAllowed - Whether the most significant rating we've
* found so far (that actually applies to the
* thing we're browsing to) would allow access.
* Once all rating sources report in, this flag
* indicates whether the user can see the content.
*/
BYTE _fPicsAccessAllowed:1;
BYTE _fInDialog:1;
BYTE _fTerminated:1;
/* The following flags are a separate bitfield so I can easily test
* "if (!_fbPicsWaitFlags)" to see if I'm done waiting.
*
* IMPORTANT: The flags are in order of precedence. That is, ASYNC
* is more important than INDOC, which is more important than ROOT.
* This way, given any flag which specifies the source of a rating,
* if that rating applies to the content, then
*
* _fbPicsWaitFlags &= (flag - 1);
*
* will turn off that flag and all flags above it, causing the code
* to not consider any further ratings from that source or less
* important sources.
*/
BYTE _fbPicsWaitFlags;
DWORD _dwPicsLabelSource;
LPVOID _pRatingDetails;
DWORD _dwPicsSerialNumber; /* serial number for async query */
DWORD _dwKey; /* Key for identifying CPicsProcs */
HANDLE _hPicsQuery; /* handle to async query event */
LPTSTR _pszPicsURL; /* result of CoInternetGetSecurityUrl */
IHTMLPrivateWindow * _pPrivWindow; /* Private Window on behalf of which this proccessing is being done */
CPicsRootDownload * _pRootDownload; /* object managing root document download */
CDocObjectHost * _pdoh;
CPicsProcessor * _pPicsProcNext; /* the next pics proc in the chain */
LONG_PTR _GetKey() { return (LONG_PTR)_dwKey; }
UINT _PicsBlockingDialog();
HRESULT _StartPicsQuery(LPCOLESTR pwszRawURL);
void _HandlePicsChecksComplete();
void _GotLabel(HRESULT hres, LPVOID pDetails, BYTE bfSource);
void _HandleInDocumentLabel(LPCTSTR pszLabel);
void _HandleDocumentEnd(void);
void _StartPicsRootQuery(LPCTSTR pszURL);
void _Terminate();
};
friend class CPicsProcessor;
CPicsProcessor _PicsProcBase;
DWORD _dwPicsKeyBase;
CPicsProcessor* _GetPicsProcessorFromKey(LONG_PTR lKey);
CPicsProcessor* _GetPicsProcessorFromSerialNumber( DWORD dwPicsSerialNumber );
void _StartBasePicsProcessor();
HRESULT _StartSecondaryPicsProcessor(IHTMLPrivateWindow * pPrivWindow);
HRESULT _RemovePicsProcessorByKey(LONG_PTR lKey);
HRESULT _RemovePicsProcessorByPrivWindowUnk(IUnknown* pUnkFind);
HRESULT _RemoveAllPicsProcessors();
#endif
BSTR _strPriorityStatusText;
// support for caching of script errors
CScriptErrorList * _pScriptErrList;
BOOL _fScriptErrDlgOpen;
BOOL _fShowScriptErrDlgAgain;
HRESULT _ScriptErr_CacheInfo(VARIANTARG *pvarIn);
void _ScriptErr_Dlg(BOOL fOverrridePerErrorMode);
};
#ifdef FEATURE_PICS
//#include <brwsectl.h> /* for IBrowseControl */
class CPicsRootDownload : public IBindStatusCallback,
IOleClientSite, IServiceProvider,
IDispatch
{
protected:
UINT m_cRef;
long m_lFlags;
IOleCommandTarget *m_pctParent;
IOleObject *m_pole;
IOleCommandTarget *m_pctObject;
IBinding *m_pBinding;
IBindCtx *m_pBindCtx;
void _NotifyEndOfDocument(void);
HRESULT _Abort(void);
BOOL m_fFrameIsSilent:1;
BOOL m_fFrameIsOffline:1;
public:
CPicsRootDownload(IOleCommandTarget *pctParent, BOOL fFrameIsOffline, BOOL fFrameIsSilent);
~CPicsRootDownload();
HRESULT StartDownload(IMoniker *pmk);
void CleanUp(void);
// IUnknown members
STDMETHODIMP QueryInterface(REFIID riid, void **punk);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
// 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);
// IOleClientSite
STDMETHODIMP SaveObject(void);
STDMETHODIMP GetMoniker(DWORD, DWORD, IMoniker **);
STDMETHODIMP GetContainer(IOleContainer **);
STDMETHODIMP ShowObject(void);
STDMETHODIMP OnShowWindow(BOOL fShow);
STDMETHODIMP RequestNewObjectLayout(void);
// IServiceProvider (must be QI'able from IOleClientSite)
STDMETHODIMP QueryService(REFGUID guidService,
REFIID riid, void **ppvObj);
// *** IDispatch methods ***
STDMETHOD(GetTypeInfoCount) (unsigned int *pctinfo)
{ return E_NOTIMPL; };
STDMETHOD(GetTypeInfo) (unsigned int itinfo, LCID lcid, ITypeInfo **pptinfo)
{ return E_NOTIMPL; };
STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR * * rgszNames, unsigned int cNames, LCID lcid, DISPID * rgdispid)
{ return E_NOTIMPL; };
STDMETHODIMP Invoke(DISPID dispidMember, REFIID iid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams,
VARIANT * pvarResult,EXCEPINFO * pexcepinfo,UINT * puArgErr);
};
// IID_IsPicsBrowser is a way we can use pClientSite->QueryService to find out
// if the top-level browser is a PICS root document download or not, so we can
// avoid navigating sub-frames. No real interface corresponds to this IID, we
// just return an IUnknown pointer.
EXTERN_C const GUID IID_IsPicsBrowser; // F114C2C0-90BE-11D0-83B1-00C04FD705B2
#endif
void DeleteFileSent(LPTSTR *ppszTempFile);
BOOL ShouldShellExecURL( LPTSTR pszURL );
DWORD GetSyncMode (DWORD dwDefault);
// in Dochost.cpp
BOOL _ValidateURL(LPTSTR pszName, DWORD dwFlags);
void GetAppHackFlags(IOleObject* pole, const CLSID* pclsid, DWORD* pdwAppHack);
BOOL _IsDesktopItem(CDocObjectHost * pdoh);
BOOL IsAssociatedWithIE(LPCWSTR pwszFileName);
UINT OpenSafeOpenDialog(HWND hwnd, UINT idRes, LPCTSTR pszFileClass, LPCTSTR pszURL, LPCTSTR pszRedirURL, LPCTSTR pszCacheName, LPCTSTR pszDisplay, UINT uiCP, IUnknown *punk = NULL, BOOL fDisableOpen = FALSE);
void CDownLoad_OpenUI(IMoniker* pmk,
IBindCtx *pbc,
BOOL fSync,
BOOL fSaveAs=FALSE,
BOOL fSafe=FALSE,
LPWSTR pwzHeaders = NULL,
DWORD dwVerb=BINDVERB_GET,
DWORD grfBINDF = (BINDF_ASYNCHRONOUS | BINDF_PULLDATA),
BINDINFO* pbinfo = NULL,
LPCTSTR pszRedir=NULL,
UINT uiCP = CP_ACP,
IUnknown *punk = NULL,
BOOL fConfirmed=FALSE
);
HRESULT CDownLoad_OpenUIURL(LPCWSTR pwszURL, IBindCtx *pbc, LPWSTR pwzHeaders, BOOL fSync, BOOL fSaveAs=FALSE, BOOL fSafe=FALSE, DWORD dwVerb=BINDVERB_GET, DWORD grfBINDF=(BINDF_ASYNCHRONOUS | BINDF_PULLDATA), BINDINFO* pbinfo=NULL,
LPCTSTR pszRedir=NULL, UINT uiCP=CP_ACP, IUnknown *punk = NULL, BOOL fConfirmed=FALSE);
HRESULT _GetRequestFlagFromPIB(IBinding *pib, DWORD *pdwOptions);
HRESULT _SetSearchInfo (IServiceProvider *psp, DWORD dwIndex, BOOL fAllowSearch, BOOL fContinueSearch, BOOL fSentToEngine);
HRESULT _GetSearchInfo (IServiceProvider *psp, LPDWORD pdwIndex, LPBOOL pfAllowSearch, LPBOOL pfContinueSearch, LPBOOL pfSentToEngine);
// Values for automatically scanning common net suffixes
#define NO_SUFFIXES 0
#define SCAN_SUFFIXES 1
#define DONE_SUFFIXES 2
// Registry values for automatically sending request to search engine
#define NEVERSEARCH 0
#define PROMPTSEARCH 1
#define ALWAYSSEARCH 2
#define SHOULD_DO_SEARCH(x,y) (y || (x && x != DONE_SUFFIXES))