|
|
//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000 Microsoft Corporation
//
// Module Name:
// ActiveScriptSite.cpp
//
// Description:
// CActiveScript class implementation.
//
// Maintained By:
// gpease 08-FEB-2000
//
//////////////////////////////////////////////////////////////////////////////
#include "pch.h"
#include "ResourceObject.h"
#include "ActiveScriptSite.h"
DEFINE_THISCLASS( "CActiveScriptSite" );
//////////////////////////////////////////////////////////////////////
//
// Constructor
//
//////////////////////////////////////////////////////////////////////
CActiveScriptSite::CActiveScriptSite( RESOURCE_HANDLE hResourceIn, PLOG_EVENT_ROUTINE plerIn, HKEY hkeyIn, LPCWSTR pszNameIn ) : m_hResource( hResourceIn ), m_pler( plerIn ), m_hkey( hkeyIn ), m_pszName( pszNameIn ) { TraceClsFunc( "CActiveScriptSite\n" ); Assert( m_cRef == 0 ); Assert( m_punkResource == 0 ); AddRef( );
TraceFuncExit( ); }
//////////////////////////////////////////////////////////////////////
//
// Destructor
//
//////////////////////////////////////////////////////////////////////
CActiveScriptSite::~CActiveScriptSite() { TraceClsFunc( "~CActiveScriptSite\n" );
// Don't close m_hkey.
// Don't free m_pszName
if ( m_punkResource != NULL ) { m_punkResource->Release( ); }
TraceFuncExit( ); }
//****************************************************************************
//
// IUnknown
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CScriptResource::[IUnknown] QueryInterface(
// REFIID riid,
// LPVOID * ppv
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::QueryInterface( REFIID riid, void** ppUnk ) { TraceClsFunc( "[IUnknown] QueryInterface( )\n" );
HRESULT hr = E_NOINTERFACE;
*ppUnk = NULL;
if ( riid == IID_IUnknown ) { *ppUnk = TraceInterface( __THISCLASS__, IUnknown, (IActiveScriptSite*) this, 0 ); hr = S_OK; } else if ( riid == IID_IActiveScriptSite ) { *ppUnk = TraceInterface( __THISCLASS__, IActiveScriptSite, (IActiveScriptSite*) this, 0 ); hr = S_OK; } else if ( riid == IID_IActiveScriptSiteInterruptPoll ) { *ppUnk = TraceInterface( __THISCLASS__, IActiveScriptSiteInterruptPoll, (IActiveScriptSiteInterruptPoll*) this, 0 ); hr = S_OK; } else if ( riid == IID_IActiveScriptSiteWindow ) { *ppUnk = TraceInterface( __THISCLASS__, IActiveScriptSiteWindow, (IActiveScriptSiteWindow*) this, 0 ); hr = S_OK; } else if ( riid == IID_IDispatchEx ) { *ppUnk = TraceInterface( __THISCLASS__, IDispatchEx, (IDispatchEx*) this, 0 ); hr = S_OK; } else if ( riid == IID_IDispatch ) { *ppUnk = TraceInterface( __THISCLASS__, IDispatch, (IDispatchEx*) this, 0 ); hr = S_OK; }
if ( hr == S_OK ) { ((IUnknown *) *ppUnk)->AddRef( ); }
QIRETURN( hr, riid ); }
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP_( ULONG )
// CScriptResource::[IUnknown] AddRef( void )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) CActiveScriptSite::AddRef( ) { TraceClsFunc( "[IUnknown] AddRef( )\n" ); InterlockedIncrement( &m_cRef ); RETURN( m_cRef ); }
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP_( ULONG )
// CScriptResource::[IUnknown] Release( void )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) CActiveScriptSite::Release( ) { TraceClsFunc( "[IUnknown] Release( )\n" ); InterlockedDecrement( &m_cRef ); if ( m_cRef ) RETURN( m_cRef );
delete this;
RETURN( 0 ); }
//****************************************************************************
//
// IActiveScriptSite
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::GetLCID(
// LCID *plcid // out
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::GetLCID( LCID *plcid // out
) { TraceClsFunc( "[IActiveScriptSite] GetLCID( ... )\n" ); if ( !plcid ) HRETURN( E_POINTER ); HRETURN( S_FALSE ); // use system-defined locale
} //////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::GetItemInfo(
// LPCOLESTR pstrName, // in
// DWORD dwReturnMask, // in
// IUnknown **ppiunkItem, // out
// ITypeInfo **ppti // out
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::GetItemInfo( LPCOLESTR pstrName, // in
DWORD dwReturnMask, // in
IUnknown **ppiunkItem, // out
ITypeInfo **ppti // out
) { TraceClsFunc( "[IActiveScriptSite] GetItemInfo( )\n" );
if ( (dwReturnMask & SCRIPTINFO_IUNKNOWN) && !ppiunkItem ) HRETURN( E_POINTER );
if ( (dwReturnMask & SCRIPTINFO_ITYPEINFO) && !ppti ) HRETURN( E_POINTER );
if ( pstrName == NULL ) HRETURN( E_INVALIDARG );
HRESULT hr = TYPE_E_ELEMENTNOTFOUND;
if ( StrCmpI( pstrName, L"Resource" ) == 0 ) { if ( dwReturnMask & SCRIPTINFO_IUNKNOWN ) { if ( m_punkResource == NULL ) { m_punkResource = new CResourceObject( m_hResource, m_pler, m_hkey, m_pszName ); if ( m_punkResource == NULL ) goto OutOfMemory;
//
// No need to AddRef() as the constructor does that for us.
//
}
hr = m_punkResource->TypeSafeQI( IUnknown, ppiunkItem ); }
if ( SUCCEEDED( hr ) && ( dwReturnMask & SCRIPTINFO_ITYPEINFO ) ) { *ppti = NULL; hr = THR( E_FAIL ); } }
Cleanup: HRETURN( hr );
OutOfMemory: hr = E_OUTOFMEMORY; goto Cleanup; } //////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::GetDocVersionString(
// BSTR *pbstrVersion // out
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::GetDocVersionString( BSTR *pbstrVersion // out
) { TraceClsFunc( "[IActiveScriptSite] GetDocVersionString( )\n" ); *pbstrVersion = SysAllocString( L"Cluster Scripting Host Version 1.0" ); if ( *pbstrVersion == NULL ) { HRETURN( E_OUTOFMEMORY ); } HRETURN( S_OK ); } //////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::OnScriptTerminate(
// const VARIANT *pvarResult, // in
// const EXCEPINFO *pexcepinfo // in
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::OnScriptTerminate( const VARIANT *pvarResult, // in
const EXCEPINFO *pexcepinfo // in
) { TraceClsFunc( "[IActiveScriptSite] OnScriptTerminate( )\n" ); HRETURN( S_OK ); // nothing to do
} //////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::OnStateChange(
// SCRIPTSTATE ssScriptState // in
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::OnStateChange( SCRIPTSTATE ssScriptState // in
) { TraceClsFunc( "[IActiveScriptSite] OnStateChange( )\n" );
#if defined(DEBUG)
//
// We don't really care.
//
switch ( ssScriptState ) { case SCRIPTSTATE_UNINITIALIZED: TraceMsg( mtfCALLS, "OnStateChange: Uninitialized\n" ); break;
case SCRIPTSTATE_INITIALIZED: TraceMsg( mtfCALLS, "OnStateChange: Initialized\n" ); break;
case SCRIPTSTATE_STARTED: TraceMsg( mtfCALLS, "OnStateChange: Started\n" ); break;
case SCRIPTSTATE_CONNECTED: TraceMsg( mtfCALLS, "OnStateChange: Connected\n" ); break;
case SCRIPTSTATE_DISCONNECTED: TraceMsg( mtfCALLS, "OnStateChange: Disconnected\n" ); break;
case SCRIPTSTATE_CLOSED: TraceMsg( mtfCALLS, "OnStateChange: Closed\n" ); break;
default: TraceMsg( mtfCALLS, "OnStateChange: Unknown value\n" ); break; } #endif // defined(DEBUG)
HRETURN( S_OK ); } //////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::OnScriptError(
// IActiveScriptError *pscripterror // in
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::OnScriptError( IActiveScriptError *pscripterror // in
) { TraceClsFunc( "[IActiveScriptSite] OnScriptError( )\n" );
HRESULT hr; BSTR bstrSourceLine = NULL; DWORD dwSourceContext; ULONG ulLineNumber; LONG lCharacterPosition; EXCEPINFO excepinfo; LPTSTR pszMsgBuf = NULL;
hr = pscripterror->GetSourcePosition( &dwSourceContext, &ulLineNumber, &lCharacterPosition );
hr = pscripterror->GetSourceLineText( &bstrSourceLine ); if (SUCCEEDED( hr )) { TraceMsg( mtfCALLS, "Script Error: Line=%u, Character=%u: %s\n", ulLineNumber, lCharacterPosition, bstrSourceLine ); (ClusResLogEvent)( m_hResource, LOG_ERROR, L"Script Error: Line=%1!u!, Character=%2!u!: %3\n", ulLineNumber, lCharacterPosition, bstrSourceLine ); SysFreeString( bstrSourceLine ); } else { TraceMsg( mtfCALLS, "Script Error: ulLineNumber = %u, lCharacter = %u\n", ulLineNumber, lCharacterPosition ); (ClusResLogEvent)( m_hResource, LOG_ERROR, L"Script Error: Line=%1!u!, Character = %2!u!\n", ulLineNumber, lCharacterPosition ); }
hr = pscripterror->GetExceptionInfo( &excepinfo ); if (SUCCEEDED( hr )) { if ( excepinfo.bstrSource ) { TraceMsg( mtfCALLS, "Source: %s\n", excepinfo.bstrSource ); (ClusResLogEvent)( m_hResource, LOG_ERROR, L"Source: %1\n", excepinfo.bstrSource ); }
if ( excepinfo.bstrDescription ) { TraceMsg( mtfCALLS, "Description: %s\n", excepinfo.bstrDescription ); (ClusResLogEvent)( m_hResource, LOG_ERROR, L"Description: %1\n", excepinfo.bstrDescription ); }
if ( excepinfo.bstrHelpFile ) { TraceMsg( mtfCALLS, "Help File: %s\n", excepinfo.bstrHelpFile ); (ClusResLogEvent)( m_hResource, LOG_ERROR, L"Help File: %1\n", excepinfo.bstrHelpFile ); }
hr = THR( excepinfo.scode ); }
HRETURN( S_FALSE ); } //////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::OnEnterScript( void )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::OnEnterScript( void ) { TraceClsFunc( "[IActiveScriptSite] OnEnterScript( )\n" ); HRETURN( S_OK ); } //////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::OnLeaveScript( void )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::OnLeaveScript( void ) { TraceClsFunc( "[IActiveScriptSite] OnLeaveScript( )\n" ); HRETURN( S_OK ); }
//****************************************************************************
//
// IActiveScriptSiteInterruptPoll
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::QueryContinue( void )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::QueryContinue( void ) { TraceClsFunc( "[IActiveScriptSiteInterruptPoll] QueryContinue( )\n" ); HRETURN( S_OK ); }
//****************************************************************************
//
// IActiveScriptSiteWindow
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::GetWindow (
// HWND *phwnd // out
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::GetWindow ( HWND *phwnd // out
) { TraceClsFunc( "[IActiveScriptSiteWindow] GetWindow( )\n" ); *phwnd = NULL; // desktop;
HRETURN( S_OK ); }
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::EnableModeless(
// BOOL fEnable // in
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::EnableModeless( BOOL fEnable // in
) { TraceClsFunc( "[IActiveScriptSiteWindow] EnableModeless( )\n" ); HRETURN( S_OK ); }
//****************************************************************************
//
// IDispatch
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::GetTypeInfoCount (
// UINT * pctinfo // out
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::GetTypeInfoCount ( UINT * pctinfo // out
) { TraceClsFunc( "[IDispatch] GetTypeInfoCount( )\n" );
*pctinfo = 0;
HRETURN( E_NOTIMPL ); }
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::GetTypeInfo (
// UINT iTInfo, // in
// LCID lcid, // in
// ITypeInfo * * ppTInfo // out
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::GetTypeInfo ( UINT iTInfo, // in
LCID lcid, // in
ITypeInfo * * ppTInfo // out
) { TraceClsFunc( "[IDispatch] GetTypeInfo( )\n" );
if ( !ppTInfo ) HRETURN( E_POINTER );
*ppTInfo = NULL;
HRETURN( E_NOTIMPL ); }
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::GetIDsOfNames (
// REFIID riid, // in
// LPOLESTR * rgszNames, // in
// UINT cNames, // in
// LCID lcid, // in
// DISPID * rgDispId // out
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::GetIDsOfNames ( REFIID riid, // in
LPOLESTR * rgszNames, // in
UINT cNames, // in
LCID lcid, // in
DISPID * rgDispId // out
) { TraceClsFunc( "[IDispatch] GetIDsOfName( )\n" );
ZeroMemory( rgDispId, cNames * sizeof(DISPID) );
HRETURN( E_NOTIMPL ); }
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::Invoke (
// DISPID dispIdMember, // in
// REFIID riid, // in
// LCID lcid, // in
// WORD wFlags, // in
// DISPPARAMS *pDispParams, // out in
// VARIANT *pVarResult, // out
// EXCEPINFO *pExcepInfo, // out
// UINT *puArgErr // out
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::Invoke ( DISPID dispIdMember, // in
REFIID riid, // in
LCID lcid, // in
WORD wFlags, // in
DISPPARAMS *pDispParams, // out in
VARIANT *pVarResult, // out
EXCEPINFO *pExcepInfo, // out
UINT *puArgErr // out
) { TraceClsFunc( "[IDispatch] Invoke( )\n" );
HRETURN( E_NOTIMPL ); }
//****************************************************************************
//
// IDispatchEx
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::GetDispID (
// BSTR bstrName, // in
// DWORD grfdex, //in
// DISPID *pid //out
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::GetDispID ( BSTR bstrName, // in
DWORD grfdex, //in
DISPID *pid //out
) { if ( !pid ) HRETURN( E_POINTER );
TraceClsFunc( "[IDispatchEx] GetDispID( )\n" );
HRESULT hr = S_OK;
if ( StrCmpI( bstrName, L"Resource" ) == 0 ) { *pid = 0; } else { hr = DISP_E_UNKNOWNNAME; }
HRETURN( hr ); }
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::InvokeEx (
// DISPID id, // in
// LCID lcid, // in
// WORD wFlags, // in
// DISPPARAMS *pdp, // in
// VARIANT *pvarRes, // out
// EXCEPINFO *pei, // out
// IServiceProvider *pspCaller // in
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::InvokeEx ( DISPID id, // in
LCID lcid, // in
WORD wFlags, // in
DISPPARAMS *pdp, // in
VARIANT *pvarRes, // out
EXCEPINFO *pei, // out
IServiceProvider *pspCaller // in
) { TraceClsFunc2( "[IDispatchEx] InvokeEx( id = %u, ..., wFlags = 0x%08x, ... )\n", id, wFlags );
HRESULT hr = S_OK;
switch ( id ) { case 0: pvarRes->vt = VT_DISPATCH; hr = THR( QueryInterface( IID_IDispatch, (void **) &pvarRes->pdispVal ) ); break;
default: hr = THR( DISP_E_MEMBERNOTFOUND ); break; } HRETURN( hr ); }
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::DeleteMemberByName (
// BSTR bstr, // in
// DWORD grfdex // in
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::DeleteMemberByName ( BSTR bstr, // in
DWORD grfdex // in
) { TraceClsFunc( "[IDispatchEx] DeleteMemberByName( )\n" ); HRETURN( E_NOTIMPL ); }
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::DeleteMemberByDispID (
// DISPID id // in
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::DeleteMemberByDispID ( DISPID id // in
) { TraceClsFunc1( "[IDispatchEx] DeleteMemberByDispID( id = %u )\n", id ); HRETURN( E_NOTIMPL ); }
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::GetMemberProperties (
// DISPID id, // in
// DWORD grfdexFetch, // in
// DWORD * pgrfdex // out
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::GetMemberProperties ( DISPID id, // in
DWORD grfdexFetch, // in
DWORD * pgrfdex // out
) { TraceClsFunc2( "[IDispatchEx] GetMemberProperties( id = %u, grfdexFetch = 0x%08x )\n", id, grfdexFetch ); HRETURN( E_NOTIMPL ); }
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::GetMemberName (
// DISPID id, // in
// BSTR * pbstrName // out
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::GetMemberName ( DISPID id, // in
BSTR * pbstrName // out
) { TraceClsFunc1( "[IDispatchEx] GetMemberName( id = %u, ... )\n", id ); HRETURN( E_NOTIMPL ); }
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::GetNextDispID (
// DWORD grfdex, // in
// DISPID id, // in
// DISPID * pid // out
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::GetNextDispID ( DWORD grfdex, // in
DISPID id, // in
DISPID * pid // out
) { TraceClsFunc2( "[IDispatchEx] GetNextDispId( grfdex = 0x%08x, id = %u, ... )\n", grfdex, id ); HRETURN( E_NOTIMPL ); }
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::GetNameSpaceParent (
// IUnknown * * ppunk // out
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::GetNameSpaceParent ( IUnknown * * ppunk // out
) { TraceClsFunc( "[IDispatchEx] GetNameSpaceParent( ... )\n" );
if ( !ppunk ) HRETURN( E_POINTER );
*ppunk = NULL;
HRETURN( E_NOTIMPL ); }
//****************************************************************************
//
// Private Methods
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//
// STDMETHODIMP
// CActiveScriptSite::LogError(
// HRESULT hrIn
// )
//
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CActiveScriptSite::LogError( HRESULT hrIn ) { TraceClsFunc1( "LogError( hrIn = 0x%08x )\n", hrIn );
TraceMsg( mtfCALLS, "HRESULT: 0x%08x\n", hrIn ); (ClusResLogEvent)( m_hResource, LOG_ERROR, L"HRESULT: 0x%1!08x!.\n", hrIn );
HRETURN( S_OK );
} //*** LogError( )
//****************************************************************************
//
// Automation Methods
//
//****************************************************************************
|