/******************************************************************** Copyright (c) 1999 Microsoft Corporation Module Name: ScriptWrapper_ClientSide.cpp Abstract: File for implementation of CPCHScriptWrapper_ServerSide class, a generic wrapper for remoting scripting engines. Revision History: Davide Massarenti created 03/28/2000 ********************************************************************/ #include "stdafx.h" ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// CPCHScriptWrapper_ServerSide::CPCHScriptWrapper_ServerSide() { // CComPtr m_Browser; // CComPtr m_Script; // CComPtr m_ScriptParse; } CPCHScriptWrapper_ServerSide::~CPCHScriptWrapper_ServerSide() { } HRESULT CPCHScriptWrapper_ServerSide::FinalConstructInner( /*[in]*/ const CLSID* pWrappedCLSID, /*[in]*/ BSTR bstrURL ) { __HCP_FUNC_ENTRY( "CPCHScriptWrapper_ServerSide::FinalConstructInner" ); HRESULT hr; CComPtr unk; m_bstrURL = bstrURL; __MPC_EXIT_IF_METHOD_FAILS(hr, ::CoCreateInstance( *pWrappedCLSID, NULL, CLSCTX_ALL, IID_IUnknown, (void**)&unk )); __MPC_EXIT_IF_METHOD_FAILS(hr, unk->QueryInterface( IID_IActiveScript , (void**)&m_Script )); __MPC_EXIT_IF_METHOD_FAILS(hr, unk->QueryInterface( IID_IActiveScriptParse, (void**)&m_ScriptParse )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } void CPCHScriptWrapper_ServerSide::FinalRelease() { m_Browser .Release(); m_Script .Release(); m_ScriptParse.Release(); } //////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CPCHScriptWrapper_ServerSide::Remote_SetScriptSite( /*[in]*/ IPCHActiveScriptSite* pass ) { m_Browser = pass; return S_OK; } STDMETHODIMP CPCHScriptWrapper_ServerSide::Remote_SetScriptState( /*[in] */ SCRIPTSTATE ss ) { if(m_Script == NULL) return E_FAIL; return m_Script->SetScriptState( ss ); } STDMETHODIMP CPCHScriptWrapper_ServerSide::Remote_GetScriptState( /*[out]*/ SCRIPTSTATE *pssState ) { if(m_Script == NULL) return E_FAIL; return m_Script->GetScriptState( pssState ); } STDMETHODIMP CPCHScriptWrapper_ServerSide::Remote_Close() { if(m_Script == NULL) return E_FAIL; return m_Script->Close(); } STDMETHODIMP CPCHScriptWrapper_ServerSide::Remote_AddNamedItem( /*[in]*/ BSTR bstrName , /*[in]*/ DWORD dwFlags ) { if(m_Script == NULL) return E_FAIL; return m_Script->AddNamedItem( bstrName, dwFlags ); } STDMETHODIMP CPCHScriptWrapper_ServerSide::Remote_AddTypeLib( /*[in]*/ BSTR bstrTypeLib , /*[in]*/ DWORD dwMajor , /*[in]*/ DWORD dwMinor , /*[in]*/ DWORD dwFlags ) { GUID guidTypeLib; if(m_Script == NULL) return E_FAIL; ::CLSIDFromString( bstrTypeLib, &guidTypeLib ); return m_Script->AddTypeLib( guidTypeLib, dwMajor, dwMinor, dwFlags ); } STDMETHODIMP CPCHScriptWrapper_ServerSide::Remote_GetScriptDispatch( /*[in ]*/ BSTR pstrItemName , /*[out]*/ IDispatch* *ppdisp ) { if(m_Script == NULL) return E_FAIL; return m_Script->GetScriptDispatch( pstrItemName, ppdisp ); } STDMETHODIMP CPCHScriptWrapper_ServerSide::Remote_GetCurrentScriptThreadID( /*[out]*/ SCRIPTTHREADID *pstidThread ) { if(m_Script == NULL) return E_FAIL; return m_Script->GetCurrentScriptThreadID( pstidThread ); } STDMETHODIMP CPCHScriptWrapper_ServerSide::Remote_GetScriptThreadID( /*[in ]*/ DWORD dwWin32ThreadId , /*[out]*/ SCRIPTTHREADID *pstidThread ) { if(m_Script == NULL) return E_FAIL; return m_Script->GetScriptThreadID( dwWin32ThreadId, pstidThread ); } STDMETHODIMP CPCHScriptWrapper_ServerSide::Remote_GetScriptThreadState( /*[in ]*/ SCRIPTTHREADID stidThread , /*[out]*/ SCRIPTTHREADSTATE *pstsState ) { if(m_Script == NULL) return E_FAIL; return m_Script->GetScriptThreadState( stidThread, pstsState ); } STDMETHODIMP CPCHScriptWrapper_ServerSide::Remote_InterruptScriptThread( /*[in]*/ SCRIPTTHREADID stidThread , /*[in]*/ DWORD dwFlags ) { if(m_Script == NULL) return E_FAIL; return m_Script->InterruptScriptThread( stidThread, NULL, dwFlags ); } STDMETHODIMP CPCHScriptWrapper_ServerSide::Remote_InitNew() { HRESULT hr; if(m_Script == NULL) return E_FAIL; if(m_ScriptParse == NULL) return E_FAIL; if(FAILED(hr = m_ScriptParse->InitNew())) return hr; return m_Script->SetScriptSite( this ); } STDMETHODIMP CPCHScriptWrapper_ServerSide::Remote_AddScriptlet( /*[in ]*/ BSTR bstrDefaultName , /*[in ]*/ BSTR bstrCode , /*[in ]*/ BSTR bstrItemName , /*[in ]*/ BSTR bstrSubItemName , /*[in ]*/ BSTR bstrEventName , /*[in ]*/ BSTR bstrDelimiter , /*[in ]*/ DWORD_PTR dwSourceContextCookie , /*[in ]*/ ULONG ulStartingLineNumber , /*[in ]*/ DWORD dwFlags , /*[out]*/ BSTR *pbstrName ) { if(m_ScriptParse == NULL) return E_FAIL; return m_ScriptParse->AddScriptlet( bstrDefaultName , bstrCode , bstrItemName , bstrSubItemName , bstrEventName , bstrDelimiter , dwSourceContextCookie , ulStartingLineNumber , dwFlags , pbstrName , NULL ); } STDMETHODIMP CPCHScriptWrapper_ServerSide::Remote_ParseScriptText( /*[in ]*/ BSTR bstrCode , /*[in ]*/ BSTR bstrItemName , /*[in ]*/ IUnknown* punkContext , /*[in ]*/ BSTR bstrDelimiter , /*[in ]*/ DWORD_PTR dwSourceContextCookie , /*[in ]*/ ULONG ulStartingLineNumber , /*[in ]*/ DWORD dwFlags , /*[out]*/ VARIANT* pvarResult ) { __HCP_FUNC_ENTRY( "CPCHScriptWrapper_ServerSide::Remote_ParseScriptText" ); HRESULT hr; CComBSTR bstrRealCode; CPCHScriptWrapper_ServerSide::HeaderList lst; if(m_ScriptParse == NULL) __MPC_SET_ERROR_AND_EXIT(hr, E_FAIL); __MPC_EXIT_IF_METHOD_FAILS(hr, CPCHScriptWrapper_ServerSide::ProcessBody( bstrCode, bstrRealCode, lst )); hr = m_ScriptParse->ParseScriptText( bstrRealCode , bstrItemName , punkContext , bstrDelimiter , dwSourceContextCookie , ulStartingLineNumber , dwFlags , pvarResult , NULL ); __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CPCHScriptWrapper_ServerSide::GetLCID( /*[out]*/ LCID *plcid ) { HRESULT hr; CComBSTR bstr; CComVariant v; if(m_Browser == NULL) return E_FAIL; if(FAILED(hr = m_Browser->Remote_GetLCID( &bstr ))) return hr; v = bstr; v.ChangeType( VT_I4 ); if(plcid) *plcid = v.lVal; return S_OK; } STDMETHODIMP CPCHScriptWrapper_ServerSide::GetItemInfo( /*[in ]*/ LPCOLESTR pstrName , /*[in ]*/ DWORD dwReturnMask , /*[out]*/ IUnknown* *ppiunkItem , /*[out]*/ ITypeInfo* *ppti ) { HRESULT hr; CComBSTR bstrName( pstrName ); CComPtr unk; CComPtr pti; if(m_Browser == NULL) return E_FAIL; if(FAILED(hr = m_Browser->Remote_GetItemInfo( bstrName, dwReturnMask, &unk, &pti ))) return hr; if(ppiunkItem) *ppiunkItem = unk.Detach(); if(ppti ) *ppti = pti.Detach(); return S_OK; } STDMETHODIMP CPCHScriptWrapper_ServerSide::GetDocVersionString( /*[out]*/ BSTR *pbstrVersion ) { if(m_Browser == NULL) return E_FAIL; return m_Browser->Remote_GetDocVersionString( pbstrVersion ); } STDMETHODIMP CPCHScriptWrapper_ServerSide::OnScriptTerminate( /*[in]*/ const VARIANT* pvarResult , /*[in]*/ const EXCEPINFO* pexcepinfo ) { if(m_Browser == NULL) return E_FAIL; return m_Browser->Remote_OnScriptTerminate( (VARIANT*)pvarResult ); } STDMETHODIMP CPCHScriptWrapper_ServerSide::OnStateChange( /*[in]*/ SCRIPTSTATE ssScriptState ) { if(m_Browser == NULL) return E_FAIL; return m_Browser->Remote_OnStateChange( ssScriptState ); } STDMETHODIMP CPCHScriptWrapper_ServerSide::OnScriptError( /*[in]*/ IActiveScriptError *pscripterror ) { if(m_Browser == NULL) return E_FAIL; return m_Browser->Remote_OnScriptError( pscripterror ); } STDMETHODIMP CPCHScriptWrapper_ServerSide::OnEnterScript( void ) { if(m_Browser == NULL) return E_FAIL; return m_Browser->Remote_OnEnterScript(); } STDMETHODIMP CPCHScriptWrapper_ServerSide::OnLeaveScript( void ) { if(m_Browser == NULL) return E_FAIL; return m_Browser->Remote_OnLeaveScript(); } //////////////////////////////////////////////////////////////////////////////// bool CPCHScriptWrapper_ServerSide::KeyValue::operator==( /*[in]*/ LPCOLESTR szKey ) const { return MPC::StrICmp( m_strKey, szKey ) == 0; } HRESULT CPCHScriptWrapper_ServerSide::ProcessBody( /*[in ]*/ BSTR bstrCode , /*[out]*/ CComBSTR& bstrRealCode , /*[out]*/ HeaderList& lst ) { __HCP_FUNC_ENTRY( "CPCHScriptWrapper_ServerSide::ProcessBody" ); HRESULT hr; LPCWSTR szLineStart = SAFEBSTR( bstrCode ); LPCWSTR szLineEnd; LPCWSTR szLineNext; bool fSkipEmpty = true; lst.clear(); while(szLineStart[0]) { HeaderIter it; LPCWSTR szColon; LPCWSTR szEndLF; LPCWSTR szEndCR; szColon = wcschr( szLineStart, ':' ); szEndLF = wcschr( szLineStart, '\n' ); szEndCR = wcschr( szLineStart, '\r' ); if(szEndLF == NULL) { if(szEndCR == NULL) break; // No end of line, exit. szLineEnd = szEndCR; szLineNext = szEndCR+1; } else if(szEndCR == NULL) { szLineEnd = szEndLF; szLineNext = szEndLF+1; } else if(szEndCR+1 == szEndLF) // \r\n { szLineEnd = szEndCR; szLineNext = szEndLF+1; } else if(szEndLF < szEndCR) { szLineEnd = szEndLF; szLineNext = szEndLF+1; } else { szLineEnd = szEndCR; szLineNext = szEndCR+1; } if(szEndLF == szLineStart || szEndCR == szLineStart) // Empty line, skip it and exit. { if(fSkipEmpty) { szLineStart = szLineNext; continue; } szLineStart = szLineNext; break; } if(szColon == NULL) break; // No colon, so it's not an header field, exit it = lst.insert( lst.end() ); it->m_strKey = MPC::wstring( szLineStart, szColon ); it->m_strValue = MPC::wstring( szColon+1 , szLineEnd ); fSkipEmpty = false; szLineStart = szLineNext; } bstrRealCode = szLineStart; hr = S_OK; __HCP_FUNC_EXIT(hr); }