//////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 1999 Microsoft Corporation
//
//  Module Name:
//      ActiveScriptSite.h
//
//  Description:
//      CActiveScriptSite class header file.
//
//  Maintained By:
//      gpease 14-DEC-1999
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

class CActiveScriptSite :
    public IActiveScriptSite,
    public IActiveScriptSiteInterruptPoll,
    public IActiveScriptSiteWindow,
    public IDispatchEx
{
private:
    LONG m_cRef;

    RESOURCE_HANDLE     m_hResource;        
    PLOG_EVENT_ROUTINE  m_pler;
    HKEY                m_hkey;
    IUnknown *          m_punkResource;
    LPCWSTR             m_pszName;      // DONT'T FREE

private:
    STDMETHOD(LogError)( HRESULT hrIn );

public:
    explicit CActiveScriptSite( RESOURCE_HANDLE     hResourceIn,
                                PLOG_EVENT_ROUTINE  plerIn,
                                HKEY                hkeyIn,
                                LPCWSTR             pszName
                                );
    virtual ~CActiveScriptSite();

    // IUnknown
    STDMETHOD( QueryInterface )(
        REFIID riid,
        void ** ppUnk );
    STDMETHOD_(ULONG, AddRef )( );
    STDMETHOD_(ULONG, Release )( );

    // IActiveScriptSite
    STDMETHOD( GetLCID )( 
            /* [out] */ LCID __RPC_FAR *plcid );
        
    STDMETHOD( GetItemInfo )( 
            /* [in] */ LPCOLESTR pstrName,
            /* [in] */ DWORD dwReturnMask,
            /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppiunkItem,
            /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppti );
        
    STDMETHOD( GetDocVersionString )( 
            /* [out] */ BSTR __RPC_FAR *pbstrVersion );
        
    STDMETHOD( OnScriptTerminate )( 
            /* [in] */ const VARIANT __RPC_FAR *pvarResult,
            /* [in] */ const EXCEPINFO __RPC_FAR *pexcepinfo );
        
    STDMETHOD( OnStateChange )( 
            /* [in] */ SCRIPTSTATE ssScriptState );
        
    STDMETHOD( OnScriptError )( 
            /* [in] */ IActiveScriptError __RPC_FAR *pscripterror );
        
    STDMETHOD( OnEnterScript )( void );
        
    STDMETHOD( OnLeaveScript )( void );

    // IActiveScriptSiteInterruptPoll 
    STDMETHOD( QueryContinue )( void );

    // IActiveScriptSiteWindow
    STDMETHOD( GetWindow )( 
            /* [out] */ HWND __RPC_FAR *phwnd );        
    STDMETHOD( EnableModeless)( 
            /* [in] */ BOOL fEnable );

    // IDispatch
    STDMETHOD( GetTypeInfoCount )( 
            /* [out] */ UINT __RPC_FAR *pctinfo );        
    STDMETHOD( GetTypeInfo )( 
            /* [in] */ UINT iTInfo,
            /* [in] */ LCID lcid,
            /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo );        
    STDMETHOD( GetIDsOfNames )( 
            /* [in] */ REFIID riid,
            /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames,
            /* [in] */ UINT cNames,
            /* [in] */ LCID lcid,
            /* [size_is][out] */ DISPID __RPC_FAR *rgDispId );        
    STDMETHOD( Invoke )( 
            /* [in] */ DISPID dispIdMember,
            /* [in] */ REFIID riid,
            /* [in] */ LCID lcid,
            /* [in] */ WORD wFlags,
            /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,
            /* [out] */ VARIANT __RPC_FAR *pVarResult,
            /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo,
            /* [out] */ UINT __RPC_FAR *puArgErr );
 
    // IDispatchEx
    STDMETHOD( GetDispID )( 
            /* [in] */ BSTR bstrName,
            /* [in] */ DWORD grfdex,
            /* [out] */ DISPID __RPC_FAR *pid );        
    STDMETHOD( InvokeEx )( 
            /* [in] */ DISPID id,
            /* [in] */ LCID lcid,
            /* [in] */ WORD wFlags,
            /* [in] */ DISPPARAMS __RPC_FAR *pdp,
            /* [out] */ VARIANT __RPC_FAR *pvarRes,
            /* [out] */ EXCEPINFO __RPC_FAR *pei,
            /* [unique][in] */ IServiceProvider __RPC_FAR *pspCaller );        
    STDMETHOD( DeleteMemberByName )( 
            /* [in] */ BSTR bstr,
            /* [in] */ DWORD grfdex );        
    STDMETHOD( DeleteMemberByDispID )( 
            /* [in] */ DISPID id );        
    STDMETHOD( GetMemberProperties )( 
            /* [in] */ DISPID id,
            /* [in] */ DWORD grfdexFetch,
            /* [out] */ DWORD __RPC_FAR *pgrfdex );        
    STDMETHOD( GetMemberName )( 
            /* [in] */ DISPID id,
            /* [out] */ BSTR __RPC_FAR *pbstrName );        
    STDMETHOD( GetNextDispID )( 
            /* [in] */ DWORD grfdex,
            /* [in] */ DISPID id,
            /* [out] */ DISPID __RPC_FAR *pid );        
    STDMETHOD( GetNameSpaceParent )( 
            /* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunk );

};