#ifndef _HTML_H
#define _HTML_H
#include "webvw.h"
interface IHTMLDocument2;
#define DECLAREWAITCURSOR2 HCURSOR hcursor_wait_cursor_save
//
// a class host for trident so that we can control what it downloads
// and what it doesn't...
//
class CTridentHost : public IOleClientSite,
public IDispatch,
public IDocHostUIHandler
{
public:
CTridentHost();
~CTridentHost();
HRESULT SetTrident( IOleObject * pTrident );
// IUnknown
STDMETHOD ( QueryInterface )( REFIID riid, void ** ppvObj );
STDMETHOD_( ULONG, AddRef ) ( void );
STDMETHOD_( ULONG, Release ) ( void );
// IDispatch (ambient properties)
STDMETHOD( GetTypeInfoCount ) (UINT *pctinfo);
STDMETHOD( GetTypeInfo )(UINT itinfo, LCID lcid, ITypeInfo **pptinfo);
STDMETHOD( GetIDsOfNames )(REFIID riid, OLECHAR **rgszNames, UINT cNames,
LCID lcid, DISPID *rgdispid);
STDMETHOD( Invoke )(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS *pdispparams, VARIANT *pvarResult,
EXCEPINFO *pexcepinfo, UINT *puArgErr);
// IOleClientSite
STDMETHOD( SaveObject )(void);
STDMETHOD( GetMoniker )(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk);
STDMETHOD( GetContainer )(IOleContainer **ppContainer);
STDMETHOD( ShowObject )(void);
STDMETHOD( OnShowWindow )(BOOL fShow);
STDMETHOD( RequestNewObjectLayout )(void);
// IDocHostUIHandler
STDMETHOD( ShowContextMenu )( DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved);
STDMETHOD( GetHostInfo )( DOCHOSTUIINFO *pInfo);
STDMETHOD( ShowUI )( DWORD dwID, IOleInPlaceActiveObject *pActiveObject,IOleCommandTarget *pCommandTarget,
IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc);
STDMETHOD( HideUI )( void);
STDMETHOD( UpdateUI )( void);
STDMETHOD( EnableModeless )( BOOL fEnable);
STDMETHOD( OnDocWindowActivate )( BOOL fActivate);
STDMETHOD( OnFrameWindowActivate )( BOOL fActivate);
STDMETHOD( ResizeBorder )( LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow);
STDMETHOD( TranslateAccelerator )( LPMSG lpMsg, const GUID *pguidCmdGroup, DWORD nCmdID);
STDMETHOD( GetOptionKeyPath )( LPOLESTR *pchKey, DWORD dw);
STDMETHOD( GetDropTarget )( IDropTarget *pDropTarget, IDropTarget **ppDropTarget);
STDMETHOD( GetExternal )( IDispatch **ppDispatch);
STDMETHOD( TranslateUrl )( DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut);
STDMETHOD( FilterDataObject )( IDataObject *pDO, IDataObject **ppDORet);
public:
BITBOOL m_fOffline : 1;
protected:
long m_cRef;
};
class CHtmlThumb : public IExtractImage,
public IThumbnailCapture,
public IRunnableTask,
public IPropertyNotifySink,
public IPersistFile,
public IPersistMoniker,
public CComObjectRoot,
public CComCoClass< CHtmlThumb,&CLSID_HtmlThumbnailExtractor >
{
public:
CHtmlThumb();
~CHtmlThumb();
BEGIN_COM_MAP( CHtmlThumb )
COM_INTERFACE_ENTRY( IExtractImage)
COM_INTERFACE_ENTRY( IThumbnailCapture )
COM_INTERFACE_ENTRY( IRunnableTask )
COM_INTERFACE_ENTRY( IPropertyNotifySink )
COM_INTERFACE_ENTRY( IPersistFile )
COM_INTERFACE_ENTRY( IPersistMoniker )
END_COM_MAP( )
DECLARE_REGISTRY( CHtmlThumb,
_T("Shell.ThumbnailExtract.HTML.1"),
_T("Shell.ThumbnailExtract.HTML.1"),
IDS_HTMLTHUMBEXTRACT_DESC,
THREADFLAGS_APARTMENT);
DECLARE_NOT_AGGREGATABLE( CHtmlThumb );
// IExtractImage
STDMETHOD (GetLocation) ( LPWSTR pszPathBuffer,
DWORD cch,
DWORD * pdwPriority,
const SIZE * prgSize,
DWORD dwRecClrDepth,
DWORD *pdwFlags );
STDMETHOD (Extract)( HBITMAP * phBmpThumbnail );
// IThumbnailCapture
STDMETHOD (CaptureThumbnail) ( const SIZE * pMaxSize, IUnknown * pHTMLDoc2, HBITMAP * phbmThumbnail );
// IRunnableTask
STDMETHOD (Run)( void ) ;
STDMETHOD (Kill)( BOOL fWait );
STDMETHOD (Suspend)( );
STDMETHOD (Resume)( );
STDMETHOD_( ULONG, IsRunning )( void );
// IPropertyNotifySink
STDMETHOD (OnChanged)( DISPID dispID);
STDMETHOD (OnRequestEdit) ( DISPID dispID);
// IPersistFile
STDMETHOD (GetClassID )(CLSID *pClassID);
STDMETHOD (IsDirty )();
STDMETHOD (Load )( LPCOLESTR pszFileName, DWORD dwMode);
STDMETHOD (Save )( LPCOLESTR pszFileName, BOOL fRemember);
STDMETHOD (SaveCompleted )( LPCOLESTR pszFileName);
STDMETHOD (GetCurFile )( LPOLESTR *ppszFileName);
// IPersistMoniker
STDMETHOD( Load )( BOOL fFullyAvailable, IMoniker *pimkName, LPBC pibc, DWORD grfMode);
STDMETHOD( Save )( IMoniker *pimkName, LPBC pbc, BOOL fRemember);
STDMETHOD( SaveCompleted )( IMoniker *pimkName, LPBC pibc);
STDMETHOD( GetCurMoniker )( IMoniker **ppimkName);
protected:
HRESULT InternalResume( void );
HRESULT Create_URL_Moniker( IMoniker **ppMoniker );
HRESULT WaitForRender( void );
HRESULT Finish( HBITMAP * pBmp, const SIZE * prgSize, DWORD dwClrDepth );
HRESULT CheckReadyState( );
void ReportError( void ** pMsgArgs );
LONG m_lState;
BOOL m_fAsync;
HANDLE m_hDone;
CTridentHost m_Host;
IHTMLDocument2 * m_pHTML;
IOleObject * m_pOleObject;
IConnectionPoint * m_pConPt;
IViewObject * m_pViewObject;
DWORD m_dwTimeout;
DWORD m_dwCurrentTick;
DWORD m_dwPropNotifyCookie;
WCHAR m_szPath[MAX_PATH];
SIZE m_rgSize;
HBITMAP * m_phBmp;
DWORD m_dwClrDepth;
DECLAREWAITCURSOR2;
DWORD m_dwXRenderSize;
DWORD m_dwYRenderSize;
IMoniker * m_pMoniker;
};
// time we wait before asking the internet explorer if it is done yet ...
#define TIME_PAUSE 200
// default timeout (seconds)
#define TIME_DEFAULT 90
HRESULT RegisterHTMLExtractor( void );
#endif