|
|
#ifndef __SHVOCX_H__
#define __SHVOCX_H__
#include "shocx.h"
#include "basesb.h"
#include "sfview.h"
#include "util.h" // for BSTR functions
#include "cobjsafe.h"
#include "ipstg.h"
#include "fldset.h"
class CWebBrowserOC;
#define CS_BACK 0x0001
#define CS_FORE 0x0002
#define AUTOSIZE_OFF 0x00000000L
#define AUTOSIZE_ON 0x00000001L
#define AUTOSIZE_PERCENTWIDTH 0x00000002L
#define AUTOSIZE_FULLSIZE 0x00000004L
#define VB_CLASSNAME_LENGTH 20
//
// NOTES:
//
// A CWebBrowserSB object is ALWAYS paired with CWebBrowserOC, and bahaves
// as a "ShellExplorer" OC together. CWebBrowserOC exports OLE control
// interfaces and an OLE automation interface (IWebBrowser) to the
// container. CWebBrowserSB exports IShellBrowser interface and a few other
// interfaces to the containee (IShellView object and DocObject).
//
// It's important to know that those objects have pointers (not interface
// pointers but explicit object pointers) to each other. In order to avoid
// a circular reference, we don't AddRef to the pointer to CWebBrowserOC
// (_psvo).
//
class CWebBrowserSB : public CBASEBROWSER { public: // IUnknown
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef() { return CBASEBROWSER::AddRef(); }; STDMETHODIMP_(ULONG) Release() { return CBASEBROWSER::Release(); };
// IOleInPlaceUIWindow (also IOleWindow)
STDMETHODIMP EnableModelessSB(BOOL fEnable); STDMETHODIMP TranslateAcceleratorSB(LPMSG lpmsg, WORD wID); STDMETHODIMP SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret); STDMETHODIMP OnViewWindowActive(struct IShellView * ppshv);
// IBrowserService
STDMETHODIMP GetParentSite(struct IOleInPlaceSite** ppipsite); STDMETHODIMP GetOleObject(struct IOleObject** ppobjv); STDMETHODIMP SetNavigateState(BNSTATE bnstate); STDMETHODIMP_(LRESULT) WndProcBS(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); STDMETHODIMP_(LRESULT) OnNotify(NMHDR * pnm); STDMETHODIMP ReleaseShellView(); STDMETHODIMP ActivatePendingView(); STDMETHODIMP SetTopBrowser(); STDMETHODIMP GetFolderSetData(struct tagFolderSetData* pfsd) { /* we modify base directly */ return S_OK; }; STDMETHODIMP _SwitchActivationNow();
// IShellBrowser
STDMETHODIMP BrowseObject(LPCITEMIDLIST pidl, UINT wFlags);
// IServiceProvider
STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppvObj);
HRESULT QueryServiceItsOwn(REFGUID guidService, REFIID riid, void **ppvObj) { return CBASEBROWSER::QueryService(guidService, riid, ppvObj); }
// 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);
CWebBrowserSB(IUnknown* pauto, CWebBrowserOC* psvo);
void ReleaseShellExplorer(void) { _psvo = NULL; } // NOTE: Note that we haven't AddRef'ed it.
IShellView* GetShellView() { return _bbd._psv;};
// Load/Save to be called by CWebBrowserOC's IPS::Save
HRESULT Load(IStream *pStm); HRESULT Save(IStream *pStm /*, BOOL fClearDirty */);
protected:
~CWebBrowserSB();
virtual LRESULT _DefWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); virtual void _ViewChange(DWORD dwAspect, LONG lindex);
//ViewStateStream related
STDMETHODIMP_(IStream*) v_GetViewStream(LPCITEMIDLIST pidl, DWORD grfMode, LPCWSTR pwszName); // se DIRECTION_ flags below
HRESULT _EnableModeless(BOOL fEnable, BOOL fDirection); HRESULT _TranslateAccelerator(LPMSG lpmsg, WORD wID, BOOL fDirection); HRESULT _IncludeByPidl(struct IShellView *psv, LPCITEMIDLIST pidl); HRESULT _IncludeByName(struct IShellView *psv, LPCTSTR pszInclude, LPCTSTR pszExclude); HRESULT _QueryServiceParent(REFGUID guidService, REFIID riid, void **ppvObj);
BOOL _IsDesktopOC(void);
virtual BOOL _HeyMoe_IsWiseGuy(void);
friend CWebBrowserOC; CWebBrowserOC* _psvo;
long _cbScriptNesting; };
#define DIRECTION_FORWARD_TO_CHILD FALSE
#define DIRECTION_FORWARD_TO_PARENT TRUE
class CWebBrowserOC : public CShellOcx , public IWebBrowser2 // wrapped _pauto
, public CImpIExpDispSupport // wrapped _pauto
, public IExpDispSupportOC , public IPersistString , public IOleCommandTarget , public CObjectSafety , public ITargetEmbedding , public CImpIPersistStorage , public IPersistHistory { public: // IUnknown (we multiply inherit from IUnknown, disambiguate here)
STDMETHOD(QueryInterface)(REFIID riid, void **ppvObj) { return CShellOcx::QueryInterface(riid, ppvObj); } STDMETHOD_(ULONG, AddRef)() { return CShellOcx::AddRef(); } STDMETHOD_(ULONG, Release)() { return CShellOcx::Release(); }
// IDispatch (we multiply inherit from IDispatch, disambiguate here)
STDMETHOD(GetTypeInfoCount)(UINT *pctinfo) { return CShellOcx::GetTypeInfoCount(pctinfo); } STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo **pptinfo) { return CShellOcx::GetTypeInfo(itinfo, lcid, pptinfo); } STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgdispid) { return CShellOcx::GetIDsOfNames(riid,rgszNames,cNames,lcid,rgdispid); } STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdispparams, VARIANT *pvarResult, EXCEPINFO *pexcepinfo, UINT *puArgErr);
// IPersistXXX disambiguate here
STDMETHODIMP IsDirty(void) {return CShellOcx::IsDirty();}
// IOleCommandTarget
STDMETHOD(QueryStatus)(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext); STDMETHOD(Exec)(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
// IObjectSafety
STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions);
// IWebBrowser
STDMETHOD(GoBack)(); STDMETHOD(GoForward)(); STDMETHOD(GoHome)(); STDMETHOD(GoSearch)(); STDMETHOD(Navigate)(BSTR URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers); STDMETHOD(Refresh)(); STDMETHOD(Refresh2)(VARIANT *Level); STDMETHOD(Stop)(); STDMETHOD(get_Application)(IDispatch **ppDisp); STDMETHOD(get_Parent)(IDispatch **ppDisp); STDMETHOD(get_Container)(IDispatch **ppDisp); STDMETHOD(get_Document)(IDispatch **ppDisp); STDMETHOD(get_TopLevelContainer)(VARIANT_BOOL *pBool); STDMETHOD(get_Type)(BSTR * pbstrType); STDMETHOD(get_Left)(long * pl); STDMETHOD(put_Left)(long Left); STDMETHOD(get_Top)(long * pl); STDMETHOD(put_Top)(long Top); STDMETHOD(get_Width)(long * pl); STDMETHOD(put_Width)(long Width); STDMETHOD(get_Height)(long * pl); STDMETHOD(put_Height)(long Height); STDMETHOD(get_LocationName)(BSTR * pbstrLocationName); STDMETHOD(get_LocationURL)(BSTR * pbstrLocationURL); STDMETHOD(get_Busy)(VARIANT_BOOL * pBool);
/* IWebBrowserApp methods */ STDMETHOD(Quit)(THIS); STDMETHOD(ClientToWindow)(THIS_ int FAR* pcx, int FAR* pcy); STDMETHOD(PutProperty)(THIS_ BSTR szProperty, VARIANT vtValue); STDMETHOD(GetProperty)(THIS_ BSTR szProperty, VARIANT FAR* pvtValue); STDMETHOD(get_Name)(THIS_ BSTR FAR* pbstrName); STDMETHOD(get_HWND)(THIS_ LONG_PTR* pHWND); STDMETHOD(get_FullName)(THIS_ BSTR FAR* pbstrFullName); STDMETHOD(get_Path)(THIS_ BSTR FAR* pbstrPath); STDMETHOD(get_FullScreen)(THIS_ VARIANT_BOOL FAR* pBool); STDMETHOD(put_FullScreen)(THIS_ VARIANT_BOOL Value); STDMETHOD(get_Visible)(THIS_ VARIANT_BOOL FAR* pBool); STDMETHOD(put_Visible)(THIS_ VARIANT_BOOL Value); STDMETHOD(get_StatusBar)(THIS_ VARIANT_BOOL FAR* pBool); STDMETHOD(put_StatusBar)(THIS_ VARIANT_BOOL Value); STDMETHOD(get_StatusText)(THIS_ BSTR FAR* pbstr); STDMETHOD(put_StatusText)(THIS_ BSTR bstr); STDMETHOD(get_ToolBar)(THIS_ int FAR* pBool); STDMETHOD(put_ToolBar)(THIS_ int Value); STDMETHOD(get_MenuBar)(THIS_ VARIANT_BOOL FAR* pValue); STDMETHOD(put_MenuBar)(THIS_ VARIANT_BOOL Value);
// IWebBrowser2 methods
STDMETHOD(Navigate2)(THIS_ VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers); STDMETHOD(ShowBrowserBar)(THIS_ VARIANT FAR* pvaClsid, VARIANT FAR* pvaShow, VARIANT FAR* pvaSize); STDMETHOD(QueryStatusWB)(THIS_ OLECMDID cmdID, OLECMDF FAR* pcmdf); STDMETHOD(ExecWB)(THIS_ OLECMDID cmdID, OLECMDEXECOPT cmdexecopt, VARIANT FAR* pvaIn, VARIANT FAR* pvaOut); STDMETHOD(get_ReadyState)(THIS_ READYSTATE FAR* plReadyState); STDMETHOD(get_Offline)(THIS_ VARIANT_BOOL FAR* pbOffline); STDMETHOD(put_Offline)(THIS_ VARIANT_BOOL bOffline); STDMETHOD(get_Silent)(THIS_ VARIANT_BOOL FAR* pbSilent); STDMETHOD(put_Silent)(THIS_ VARIANT_BOOL bSilent); STDMETHOD(get_RegisterAsBrowser)(THIS_ VARIANT_BOOL FAR* pbRegister); STDMETHOD(put_RegisterAsBrowser)(THIS_ VARIANT_BOOL bRegister); STDMETHOD(get_RegisterAsDropTarget)(THIS_ VARIANT_BOOL FAR* pbRegister); STDMETHOD(put_RegisterAsDropTarget)(THIS_ VARIANT_BOOL bRegister); STDMETHOD(get_TheaterMode)(THIS_ VARIANT_BOOL FAR* pValue); STDMETHOD(put_TheaterMode)(THIS_ VARIANT_BOOL Value); STDMETHOD(get_AddressBar)(THIS_ VARIANT_BOOL FAR* Value); STDMETHOD(put_AddressBar)(THIS_ VARIANT_BOOL Value); STDMETHOD(get_Resizable)(THIS_ VARIANT_BOOL FAR* Value) { return E_NOTIMPL; } STDMETHOD(put_Resizable)(THIS_ VARIANT_BOOL Value);
// *** CImpIExpDispSupport override ***
STDMETHODIMP OnTranslateAccelerator(MSG *pMsg,DWORD grfModifiers); STDMETHODIMP OnInvoke(DISPID dispidMember, REFIID iid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pdispparams, VARIANT FAR* pVarResult,EXCEPINFO FAR* pexcepinfo,UINT FAR* puArgErr);
// *** IExpDispSupportOC ***
STDMETHODIMP OnOnControlInfoChanged(); STDMETHODIMP GetDoVerbMSG(MSG *pMsg);
// IPersist
STDMETHOD(GetClassID)(CLSID *pClassID) { return CShellOcx::GetClassID(pClassID); }
// IPersistString
STDMETHOD(Initialize)(LPCWSTR pwszInit);
// ITargetEmbedding
STDMETHOD(GetTargetFrame)(ITargetFrame **ppTargetFrame);
// IPersistStreamInit
STDMETHOD(Load)(IStream *pStm); STDMETHOD(Save)(IStream *pStm, BOOL fClearDirty); STDMETHOD(InitNew)(void);
// IPersistPropertyBag
STDMETHOD(Load)(IPropertyBag *pBag, IErrorLog *pErrorLog); STDMETHOD(Save)(IPropertyBag *pBag, BOOL fClearDirty, BOOL fSaveAllProperties);
// IOleObject
STDMETHODIMP Close(DWORD dwSaveOption); STDMETHODIMP DoVerb( LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect); STDMETHODIMP SetHostNames(LPCOLESTR szContainerApp, LPCOLESTR szContainerObj);
// IViewObject2
STDMETHODIMP Draw( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds, BOOL ( __stdcall *pfnContinue )(ULONG_PTR dwContinue), ULONG_PTR dwContinue);
STDMETHODIMP GetColorSet(DWORD, LONG, void *, DVTARGETDEVICE *, HDC, LOGPALETTE **);
virtual HRESULT STDMETHODCALLTYPE SetExtent( DWORD dwDrawAspect, SIZEL *psizel); // IOleControl
STDMETHODIMP GetControlInfo(LPCONTROLINFO pCI); STDMETHODIMP OnMnemonic(LPMSG pMsg); STDMETHODIMP OnAmbientPropertyChange(DISPID dispid); STDMETHODIMP FreezeEvents(BOOL bFreeze);
// IOleInPlaceActiveObject
virtual HRESULT __stdcall OnFrameWindowActivate(BOOL fActivate); STDMETHODIMP TranslateAccelerator(LPMSG lpmsg); STDMETHODIMP EnableModeless(BOOL fEnable);
// *** CShellOcx's CImpIConnectionPointContainer override ***
STDMETHODIMP EnumConnectionPoints(LPENUMCONNECTIONPOINTS * ppEnum);
// *** IPersistHistory
STDMETHODIMP LoadHistory(IStream *pStream, IBindCtx *pbc); STDMETHODIMP SaveHistory(IStream *pStream); STDMETHODIMP SetPositionCookie(DWORD dwPositionCookie); STDMETHODIMP GetPositionCookie(DWORD *pdwPositioncookie);
// random public functions
friend HRESULT CWebBrowserOC_SavePersistData(IStream *pstm, SIZE* psizeObj, FOLDERSETTINGS* pfs, IShellLinkA* plink, SHELLVIEWID* pvid, BOOL fOffline = FALSE, BOOL fSilent = FALSE, BOOL fRegisterAsBrowser = FALSE, BOOL fRegisterAsDropTarget = TRUE, BOOL fEmulateOldStream = FALSE, DWORD * pdwExtra = NULL);
protected: CWebBrowserOC(IUnknown* punkOuter, LPCOBJECTINFO poi); ~CWebBrowserOC(); BOOL _InitializeOC(IUnknown* punkOuter); IUnknown* _GetInner() { return CShellOcx::_GetInner(); } friend HRESULT CWebBrowserOC_CreateInstance(IUnknown* punkOuter, IUnknown** ppunk, LPCOBJECTINFO poi);
// Override private virtual function
virtual LRESULT v_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); virtual HRESULT v_InternalQueryInterface(REFIID riid, void **ppvObj); virtual void _OnSetClientSite(void); virtual HRESULT _OnActivateChange(IOleClientSite* pActiveSite, UINT uState); virtual void _OnInPlaceActivate(void); virtual void _OnInPlaceDeactivate(void); virtual CConnectionPoint* _FindCConnectionPointNoRef(BOOL fdisp, REFIID iid);
// Private non-virtual
LRESULT _OnPaintPrint(HDC hdcPrint); LRESULT _OnCreate(LPCREATESTRUCT lpcs); HRESULT _BrowseObject(LPCITEMIDLIST pidlBrowseTo); void _InitDefault(void); void _OnSetShellView(IShellView*); void _OnReleaseShellView(void); BOOL _GetViewInfo(SHELLVIEWID* pvid); void _RegisterWindow(); void _UnregisterWindow(); HRESULT _SetDownloadState(HRESULT hresRet, DWORD nCmdexecopt, VARIANTARG *pvarargIn); void _OnLoaded(BOOL fUpdateBrowserReadyState); HMODULE _GetBrowseUI(); BOOL _HeyMoe_IsWiseGuy(void) {return _fHostedInImagineer;} void _OnSetSecureLockIcon(int lock); BOOL AccessAllowedToNamedFrame(VARIANT *varTargetFrameName);
static LRESULT CALLBACK s_DVWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
IUnknown* _pauto; // we aggregate this and pass it to the shellbrowser
IWebBrowser2* _pautoWB2; IExpDispSupport*_pautoEDS;
BOOL _fInit:1; // TRUE iff we are initialized
BOOL _fEmulateOldStream:1; // TRUE iff we emulate ie30 stream format
BOOL _fNavigateOnSetClientSite:1; // set when Loaded before SetClientSite
BOOL _fShouldRegisterAsBrowser:1; // TRUE iff OC should be registered in windows list
BOOL _fDidRegisterAsBrowser:1; // TRUE iff registered in windows list
BOOL _fTopLevel:1; // TRUE iff we're the topmost CBaseBrowser around
BOOL _fVisible:1; // BETA1: bindable props of the OC that we can't
BOOL _fNoMenuBar:1; // call IEDisp's version of the props.
BOOL _fNoToolBar:1; // for beta2 we should let us call
BOOL _fNoStatusBar:1; // iedisp's version to get the events
BOOL _fFullScreen:1; // to fire and persistence correct.
BOOL _fTheaterMode:1; BOOL _fNoAddressBar:1; BOOL _fHostedInVB5:1; // Our immediate container is the VB5 forms engine.
BOOL _fHostedInImagineer:1; //
BOOL _fIncrementedSessionCount:1; // We incremented session count and need to decrement it
BOOL _fInsideInvokeCall; // Currently processing an invoke call
MSG *_pmsgDoVerb; // valid only when _fDoVerbMSGValid
long _cbCookie; // our cookie for registering in windows list
SIZE _szIdeal; // ideal size of view, based on _size.cx
SIZE _szNotify; // last size we notified conainer
FOLDERSETTINGS _fs; // FolderViewMode and FolderFlags
// cached draw aspect incase we are not READSTATE_INTERACTIVE when we get SetExtent
DWORD _dwDrawAspect; friend CWebBrowserSB; CWebBrowserSB* _psb; ITargetFramePriv* _pTargetFramePriv; // QueryService(IID_ITARGETFRAME2)
IShellLinkA* _plinkA; // used in save/load code only
IOleCommandTarget* _pctContainer; // container
HGLOBAL _hmemSB; // Initializing stream
CConnectionPoint m_cpWB1Events; // CShellOcx holds the WB2 event source
LPMESSAGEFILTER _lpMF; // Pointer to message filter for cross-thread containers (e.g., AOL)
HMODULE _hBrowseUI; // Handle for use in design mode brand drawing
DWORD _cPendingFreezeEvents; };
#define IS_INITIALIZED if(!_fInit){TraceMsg(TF_WARNING,"shvocx: BOGUS CONTAINER calling when we haven't been initialized"); _InitDefault();}
#endif // __SHVOCX_H__
|