1129 lines
31 KiB
C++
1129 lines
31 KiB
C++
//+------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Forms
|
|
// Copyright (C) Microsoft Corporation, 1996
|
|
//
|
|
// File: bsssite.hxx
|
|
//
|
|
// Contents: CBServerScriptSite
|
|
//
|
|
//-------------------------------------------------------------------------
|
|
|
|
#include "headers.hxx"
|
|
|
|
#undef ASSERT
|
|
|
|
// ************************************************************************
|
|
//
|
|
// CConnectionPoint
|
|
//
|
|
// ************************************************************************
|
|
|
|
CConnectionPoint::CConnectionPoint(CScriptSite *pSite)
|
|
{
|
|
_ulRefs = 1;
|
|
_pSite = pSite;
|
|
_pSite->AddRef();
|
|
}
|
|
|
|
CConnectionPoint::~CConnectionPoint()
|
|
{
|
|
_pSite->Release();
|
|
}
|
|
|
|
HRESULT
|
|
CConnectionPoint::QueryInterface(REFIID iid, void **ppv)
|
|
{
|
|
if (iid == IID_IUnknown || iid == IID_IConnectionPoint)
|
|
{
|
|
*ppv = (IConnectionPoint *)this;
|
|
}
|
|
else
|
|
{
|
|
*ppv = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
((IUnknown *)*ppv)->AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT
|
|
CConnectionPoint::GetConnectionInterface(IID * pIID)
|
|
{
|
|
*pIID = DIID_DLocalMTScriptEvents;
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT
|
|
CConnectionPoint::GetConnectionPointContainer(IConnectionPointContainer ** ppCPC)
|
|
{
|
|
*ppCPC = _pSite;
|
|
(*ppCPC)->AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT
|
|
CConnectionPoint::Advise(IUnknown *pUnkSink, DWORD *pdwCookie)
|
|
{
|
|
*pdwCookie = 0;
|
|
|
|
ClearInterface(&_pSite->_pDispSink);
|
|
RRETURN(THR(pUnkSink->QueryInterface(IID_IDispatch, (void **)&_pSite->_pDispSink)));
|
|
}
|
|
|
|
HRESULT
|
|
CConnectionPoint::Unadvise(DWORD dwCookie)
|
|
{
|
|
ClearInterface(&_pSite->_pDispSink);
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT
|
|
CConnectionPoint::EnumConnections(LPENUMCONNECTIONS * ppEnum)
|
|
{
|
|
*ppEnum = NULL;
|
|
RRETURN(E_NOTIMPL);
|
|
}
|
|
|
|
// ************************************************************************
|
|
//
|
|
// CScriptSite
|
|
//
|
|
// ************************************************************************
|
|
|
|
STDMETHODIMP
|
|
CScriptSite::QueryInterface(REFIID iid, LPVOID * ppv)
|
|
{
|
|
if (iid == IID_IActiveScriptSite ||
|
|
iid == IID_IUnknown)
|
|
{
|
|
*ppv = (IActiveScriptSite *) this;
|
|
}
|
|
else if (iid == IID_IGlobalMTScript || iid == IID_IDispatch)
|
|
{
|
|
*ppv = (IGlobalMTScript *)this;
|
|
}
|
|
else if (iid == IID_IActiveScriptSiteDebug)
|
|
{
|
|
*ppv = (IActiveScriptSiteDebug *)this;
|
|
}
|
|
else if (iid == IID_IConnectionPointContainer)
|
|
{
|
|
*ppv = (IConnectionPointContainer *)this;
|
|
}
|
|
else if (iid == IID_IProvideClassInfo ||
|
|
iid == IID_IProvideClassInfo2 ||
|
|
iid == IID_IProvideMultipleClassInfo)
|
|
{
|
|
*ppv = (IProvideMultipleClassInfo *)this;
|
|
}
|
|
else if (iid == IID_IActiveScriptSiteWindow)
|
|
{
|
|
*ppv = (IActiveScriptSiteWindow *) this;
|
|
}
|
|
else
|
|
{
|
|
*ppv = NULL;
|
|
RRETURN(E_NOINTERFACE);
|
|
}
|
|
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite constructor
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
CScriptSite::CScriptSite(CScriptHost *pScriptHost)
|
|
: _cstrName(CSTR_NOINIT)
|
|
{
|
|
_pSH = pScriptHost;
|
|
_ulRefs = 1;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite destructor
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
CScriptSite::~CScriptSite()
|
|
{
|
|
VariantClear(&_varParam);
|
|
ClearInterface(&_pDispSink);
|
|
AssertSz(_ulRefs <= 1, "Object not properly released on destruction!");
|
|
|
|
if (_pDDH)
|
|
{
|
|
_pDDH->Detach();
|
|
ClearInterface(&_pDDH);
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::AddRef, Release
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
ULONG
|
|
CScriptSite::AddRef()
|
|
{
|
|
_ulRefs += 1;
|
|
return _ulRefs;
|
|
}
|
|
|
|
ULONG
|
|
CScriptSite::Release()
|
|
{
|
|
if (--_ulRefs == 0)
|
|
{
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
return _ulRefs;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::Init
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CScriptSite::Init(LPWSTR pszName)
|
|
{
|
|
HRESULT hr;
|
|
IActiveScriptParse *pParse = NULL;
|
|
static const CLSID CLSID_JSCRIPT = { 0xf414c260, 0x6ac0, 0x11cf, 0xb6, 0xd1, 0x00, 0xaa, 0x00, 0xbb, 0xbb, 0x58};
|
|
WCHAR *pch;
|
|
|
|
_cstrName.Set(pszName);
|
|
|
|
hr = THR(ScriptHost()->_pMT->HackCreateInstance(CLSID_JSCRIPT,
|
|
NULL,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_IActiveScript,
|
|
(void **)&_pScript));
|
|
if (hr)
|
|
{
|
|
hr = THR(CoCreateInstance(CLSID_JSCRIPT,
|
|
NULL,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_IActiveScript,
|
|
(void **)&_pScript));
|
|
}
|
|
|
|
if (hr)
|
|
goto Cleanup;
|
|
|
|
if (ScriptHost()->_pMT->_pPDM)
|
|
{
|
|
Assert(_pDDH == NULL);
|
|
|
|
hr = ScriptHost()->_pMT->_pPDM->CreateDebugDocumentHelper(NULL, &_pDDH);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = THR(_pDDH->Init(ScriptHost()->_pMT->_pDA,
|
|
_cstrName,
|
|
_cstrName,
|
|
0));
|
|
if (hr)
|
|
goto Cleanup;
|
|
|
|
hr = THR(_pDDH->Attach((_pScriptSitePrev)
|
|
? _pScriptSitePrev->_pDDH
|
|
: NULL));
|
|
if (hr)
|
|
goto Cleanup;
|
|
}
|
|
}
|
|
|
|
for (pch = _cstrName; *pch; pch++)
|
|
{
|
|
if (*pch == L'.')
|
|
{
|
|
*pch = L'_';
|
|
}
|
|
}
|
|
|
|
hr = THR(_pScript->QueryInterface(IID_IActiveScriptParse, (void **)&pParse));
|
|
if (hr)
|
|
goto Cleanup;
|
|
|
|
hr = THR(_pScript->SetScriptSite(this));
|
|
if (hr)
|
|
goto Cleanup;
|
|
|
|
hr = THR(pParse->InitNew());
|
|
if (hr)
|
|
goto Cleanup;
|
|
|
|
hr = THR(_pScript->AddNamedItem(_cstrName, SCRIPTITEM_ISVISIBLE | SCRIPTITEM_ISSOURCE | SCRIPTITEM_GLOBALMEMBERS));
|
|
if (hr)
|
|
goto Cleanup;
|
|
|
|
Cleanup:
|
|
ReleaseInterface(pParse);
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::Close
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
void
|
|
CScriptSite::Close()
|
|
{
|
|
if (_pScript)
|
|
{
|
|
_pScript->Close();
|
|
ClearInterface(&_pScript);
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::Abort
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
void
|
|
CScriptSite::Abort()
|
|
{
|
|
if (_pScript)
|
|
{
|
|
HRESULT hr;
|
|
|
|
hr = THR(_pScript->InterruptScriptThread(SCRIPTTHREADID_CURRENT,
|
|
NULL,
|
|
0));
|
|
}
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Member: CScriptSite::GetClassInfo, IProvideClassInfo
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CScriptSite::GetClassInfo(ITypeInfo **ppTypeInfo)
|
|
{
|
|
HRESULT hr;
|
|
|
|
hr = ScriptHost()->LoadTypeLibrary();
|
|
if (hr)
|
|
goto Cleanup;
|
|
|
|
*ppTypeInfo = ScriptHost()->_pTypeInfoCMTScript;
|
|
(*ppTypeInfo)->AddRef();
|
|
|
|
Cleanup:
|
|
RRETURN(hr);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Member: CScriptSite::GetGUID, IProvideClassInfo2
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CScriptSite::GetGUID(DWORD dwGuidKind, GUID * pGUID)
|
|
{
|
|
if (dwGuidKind == GUIDKIND_DEFAULT_SOURCE_DISP_IID)
|
|
{
|
|
*pGUID = DIID_DLocalMTScriptEvents;
|
|
}
|
|
else
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Member: CScriptSite::GetMultiTypeInfoCount, IProvideMultipleClassInfo
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
HRESULT
|
|
CScriptSite::GetMultiTypeInfoCount(ULONG *pc)
|
|
{
|
|
*pc = 1;
|
|
return S_OK;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Member: CScriptSite::GetInfoOfIndex, IProvideMultipleClassInfo
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CScriptSite::GetInfoOfIndex(
|
|
ULONG itinfo,
|
|
DWORD dwFlags,
|
|
ITypeInfo** pptinfoCoClass,
|
|
DWORD* pdwTIFlags,
|
|
ULONG* pcdispidReserved,
|
|
IID* piidPrimary,
|
|
IID* piidSource)
|
|
{
|
|
AssertSz(itinfo == 0, "itinfo == 0");
|
|
|
|
if (dwFlags & MULTICLASSINFO_GETTYPEINFO)
|
|
{
|
|
*pptinfoCoClass = ScriptHost()->_pTypeInfoCMTScript;
|
|
(*pptinfoCoClass)->AddRef();
|
|
if (pdwTIFlags)
|
|
*pdwTIFlags = 0;
|
|
}
|
|
|
|
if (dwFlags & MULTICLASSINFO_GETNUMRESERVEDDISPIDS)
|
|
{
|
|
*pcdispidReserved = 100;
|
|
}
|
|
|
|
if (dwFlags & MULTICLASSINFO_GETIIDPRIMARY)
|
|
{
|
|
*piidPrimary = IID_IGlobalMTScript;
|
|
}
|
|
|
|
if (dwFlags & MULTICLASSINFO_GETIIDSOURCE)
|
|
{
|
|
*piidSource = DIID_DLocalMTScriptEvents;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Member: CScriptSite::EnumConnectionPoints, IConnectionPointContainer
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
HRESULT
|
|
CScriptSite::EnumConnectionPoints(LPENUMCONNECTIONPOINTS *)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Member: CScriptSite::FindConnectionPoint, IConnectionPointContainer
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CScriptSite::FindConnectionPoint(REFIID iid, LPCONNECTIONPOINT* ppCpOut)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (iid == DIID_DLocalMTScriptEvents || iid == IID_IDispatch)
|
|
{
|
|
*ppCpOut = new CConnectionPoint(this);
|
|
hr = *ppCpOut ? S_OK : E_OUTOFMEMORY;
|
|
}
|
|
else
|
|
{
|
|
hr = E_NOINTERFACE;
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::GetLCID, IActiveScriptSite
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CScriptSite::GetLCID(LCID *plcid)
|
|
{
|
|
return E_NOTIMPL; // Use system settings
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::GetItemInfo, IActiveScriptSite
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CScriptSite::GetItemInfo(
|
|
LPCOLESTR pstrName,
|
|
DWORD dwReturnMask,
|
|
IUnknown** ppunkItemOut,
|
|
ITypeInfo** pptinfoOut)
|
|
{
|
|
if (dwReturnMask & SCRIPTINFO_ITYPEINFO)
|
|
{
|
|
if (!pptinfoOut)
|
|
return E_INVALIDARG;
|
|
*pptinfoOut = NULL;
|
|
}
|
|
|
|
if (dwReturnMask & SCRIPTINFO_IUNKNOWN)
|
|
{
|
|
if (!ppunkItemOut)
|
|
return E_INVALIDARG;
|
|
*ppunkItemOut = NULL;
|
|
}
|
|
|
|
if (!_wcsicmp(_cstrName, pstrName))
|
|
{
|
|
if (dwReturnMask & SCRIPTINFO_ITYPEINFO)
|
|
{
|
|
*pptinfoOut = ScriptHost()->_pTypeInfoCMTScript;
|
|
(*pptinfoOut)->AddRef();
|
|
}
|
|
if (dwReturnMask & SCRIPTINFO_IUNKNOWN)
|
|
{
|
|
*ppunkItemOut = (IGlobalMTScript *)this;
|
|
(*ppunkItemOut)->AddRef();
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
return TYPE_E_ELEMENTNOTFOUND;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::GetDocVersionString, IActiveScriptSite
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CScriptSite::GetDocVersionString(BSTR *pbstrVersion)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::, IActiveScriptSite
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CScriptSite::RequestItems()
|
|
{
|
|
return _pScript->AddNamedItem(_cstrName, SCRIPTITEM_ISVISIBLE | SCRIPTITEM_ISSOURCE);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::RequestTypeLibs, IActiveScriptSite
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CScriptSite::RequestTypeLibs()
|
|
{
|
|
return _pScript->AddTypeLib(LIBID_MTScriptEngine, 1, 0, 0);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::OnScriptTerminate, IActiveScriptSite
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CScriptSite::OnScriptTerminate(const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
|
|
{
|
|
// UNDONE: Put up error dlg here
|
|
return S_OK;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::OnStateChange, IActiveScriptSite
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CScriptSite::OnStateChange(SCRIPTSTATE ssScriptState)
|
|
{
|
|
// Don't care about notification
|
|
return S_OK;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::OnScriptError, IActiveScriptSite
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CScriptSite::OnScriptError(IActiveScriptError *pse)
|
|
{
|
|
long nScriptErrorResult = 0;
|
|
BSTR bstrLine = NULL;
|
|
TCHAR * pchDescription;
|
|
TCHAR achDescription[256];
|
|
TCHAR achMessage[1024];
|
|
EXCEPINFO ei;
|
|
DWORD dwSrcContext;
|
|
ULONG ulLine;
|
|
LONG ichError;
|
|
HRESULT hr;
|
|
LONG iRet = IDYES;
|
|
|
|
TraceTag((tagError, "OnScriptError!"));
|
|
|
|
if (ScriptHost()->_fMustExitThread)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
hr = THR(pse->GetExceptionInfo(&ei));
|
|
if (hr)
|
|
goto Cleanup;
|
|
|
|
hr = THR(pse->GetSourcePosition(&dwSrcContext, &ulLine, &ichError));
|
|
if (hr)
|
|
goto Cleanup;
|
|
|
|
hr = THR(pse->GetSourceLineText(&bstrLine));
|
|
if (hr)
|
|
hr = S_OK; // Ignore this error, there may not be source available
|
|
|
|
if (ei.bstrDescription)
|
|
{
|
|
pchDescription = ei.bstrDescription;
|
|
}
|
|
else
|
|
{
|
|
achDescription[0] = 0;
|
|
FormatMessage(
|
|
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
NULL,
|
|
ei.scode,
|
|
LANG_SYSTEM_DEFAULT,
|
|
achDescription,
|
|
ARRAY_SIZE(achDescription),
|
|
NULL);
|
|
pchDescription = achDescription;
|
|
}
|
|
|
|
// First, lets format a message nice for OUTPUTDEBUGSTRING
|
|
_snwprintf(achMessage, ARRAY_SIZE(achMessage),
|
|
_T("Thread: %s")
|
|
_T("File: %s ")
|
|
_T("Line: %d ")
|
|
_T("Char: %d ")
|
|
_T("Text: %s ")
|
|
_T("Scode: %x ")
|
|
_T("Source: %s ")
|
|
_T("Description: %s"),
|
|
(LPTSTR)_cstrName,
|
|
_achPath,
|
|
(long)(ulLine + 1),
|
|
(long)(ichError),
|
|
bstrLine ? bstrLine : _T(""),
|
|
ei.scode,
|
|
ei.bstrSource ? ei.bstrSource : _T(""),
|
|
pchDescription
|
|
);
|
|
achMessage[ARRAY_SIZE(achMessage) - 1] = 0;
|
|
OUTPUTDEBUGSTRING(achMessage);
|
|
//Assert(!_fInScriptError);
|
|
if (!_fInScriptError)
|
|
{
|
|
_fInScriptError = true;
|
|
nScriptErrorResult = _pSH->FireScriptErrorEvent(
|
|
_achPath,
|
|
ulLine + 1,
|
|
ichError,
|
|
bstrLine ? bstrLine : _T(""),
|
|
ei.scode,
|
|
ei.bstrSource ? ei.bstrSource : _T(""),
|
|
pchDescription);
|
|
_fInScriptError = false;
|
|
}
|
|
|
|
if (nScriptErrorResult == 0)
|
|
{
|
|
_snwprintf(achMessage, ARRAY_SIZE(achMessage),
|
|
_T("Thread: %s\r\n")
|
|
_T("File: %s\r\n")
|
|
_T("Line: %d\r\n")
|
|
_T("Char: %d\r\n")
|
|
_T("Text: %s\r\n")
|
|
_T("Scode: %x\r\n")
|
|
_T("Source: %s\r\n")
|
|
_T("Description: %s\r\n")
|
|
_T("%s"),
|
|
(LPTSTR)_cstrName,
|
|
_achPath,
|
|
(long)(ulLine + 1),
|
|
(long)(ichError),
|
|
bstrLine ? bstrLine : _T(""),
|
|
ei.scode,
|
|
ei.bstrSource ? ei.bstrSource : _T(""),
|
|
pchDescription,
|
|
((_fInDebugError) ? _T("\r\nDo you wish to debug?\r\n") : _T(""))
|
|
);
|
|
achMessage[ARRAY_SIZE(achMessage) - 1] = 0;
|
|
|
|
MSGBOXPARAMS mbp;
|
|
memset(&mbp, 0, sizeof(mbp));
|
|
mbp.cbSize = sizeof(mbp);
|
|
//mbp.hwndOwner = ScriptHost()->_pDoc->_hwnd;
|
|
mbp.hwndOwner = NULL;
|
|
mbp.lpszText = achMessage;
|
|
mbp.lpszCaption = _T("Script Error");
|
|
mbp.dwStyle = MB_APPLMODAL | MB_ICONERROR | ((_fInDebugError) ? MB_YESNO : MB_OK);
|
|
|
|
iRet = MessageBoxIndirect(&mbp);
|
|
}
|
|
if (nScriptErrorResult == 1)
|
|
hr = S_FALSE;
|
|
Cleanup:
|
|
if(ei.bstrSource)
|
|
SysFreeString(ei.bstrSource);
|
|
if(ei.bstrDescription)
|
|
SysFreeString(ei.bstrDescription);
|
|
if(ei.bstrHelpFile)
|
|
SysFreeString(ei.bstrHelpFile);
|
|
|
|
if (bstrLine)
|
|
SysFreeString(bstrLine);
|
|
|
|
RRETURN1((_fInDebugError && !hr && iRet == IDYES) ? S_FALSE : hr, S_FALSE);
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::OnEnterScript, IActiveScriptSite
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT CScriptSite::OnEnterScript()
|
|
{
|
|
// No need to do anything
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::OnLeaveScript, IActiveScriptSite
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT CScriptSite::OnLeaveScript()
|
|
{
|
|
// No need to do anything
|
|
return S_OK;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::, IActiveScriptSiteWindow
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT CScriptSite::GetWindow(HWND *phwndOut)
|
|
{
|
|
//*phwndOut = ScriptHost()->_pDoc->_hwnd;
|
|
*phwndOut = NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::EnableModeless, IActiveScriptSiteWindow
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT CScriptSite::EnableModeless(BOOL fEnable)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Member: CScriptSite::ExecuteScriptFile
|
|
//
|
|
// Load and execute script file
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CScriptSite::ExecuteScriptFile(TCHAR *pchPath)
|
|
{
|
|
HRESULT hr;
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
DWORD cchFile;
|
|
DWORD cbRead;
|
|
char * pchBuf = 0;
|
|
TCHAR * pchBufWide = 0;
|
|
TCHAR * pchFile;
|
|
|
|
// Attempt to find the file. First, we try to use the path as given. If
|
|
// that doesn't work, then we prefix the script path and try to find it.
|
|
|
|
GetFullPathName(pchPath, ARRAY_SIZE(_achPath), _achPath, &pchFile);
|
|
|
|
if (GetFileAttributes(_achPath) == 0xFFFFFFFF)
|
|
{
|
|
// The file apparently doesn't exist. Try pre-pending the ScriptPath
|
|
// onto it.
|
|
|
|
CStr cstrPath;
|
|
|
|
ScriptHost()->GetScriptPath(&cstrPath);
|
|
|
|
cstrPath.Append(L"\\");
|
|
|
|
cstrPath.Append(pchPath);
|
|
|
|
GetFullPathName(cstrPath, ARRAY_SIZE(_achPath), _achPath, &pchFile);
|
|
}
|
|
|
|
// Load script file
|
|
|
|
hFile = CreateFile(_achPath,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
0,
|
|
NULL);
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
goto Cleanup;
|
|
}
|
|
|
|
cchFile = GetFileSize(hFile, NULL);
|
|
if (cchFile == 0xFFFFFFFF)
|
|
{
|
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
goto Cleanup;
|
|
}
|
|
|
|
pchBuf = new char[cchFile + 1];
|
|
pchBufWide = new TCHAR[cchFile + 1];
|
|
if (!pchBuf || !pchBufWide)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto Cleanup;
|
|
}
|
|
|
|
if (!ReadFile(hFile, pchBuf, cchFile, &cbRead, 0))
|
|
{
|
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
goto Cleanup;
|
|
}
|
|
pchBuf[cbRead] = 0;
|
|
|
|
MultiByteToWideChar(CP_ACP, 0, pchBuf, -1, pchBufWide, cchFile + 1);
|
|
|
|
if (_pDDH)
|
|
{
|
|
pchFile = wcsrchr(pchPath, L'\\');
|
|
if (!pchFile)
|
|
{
|
|
pchFile = pchPath;
|
|
}
|
|
else
|
|
pchFile++;
|
|
|
|
hr = THR(_pDDH->SetLongName(_achPath));
|
|
if (hr)
|
|
goto Cleanup;
|
|
|
|
hr = THR(_pDDH->AddUnicodeText(pchBufWide));
|
|
if (hr)
|
|
goto Cleanup;
|
|
|
|
hr = THR(_pDDH->DefineScriptBlock(0,
|
|
cchFile,
|
|
_pScript,
|
|
TRUE,
|
|
&_dwSourceContext));
|
|
//if (hr)
|
|
// goto Cleanup;
|
|
}
|
|
|
|
// Execute script
|
|
|
|
hr = ExecuteScriptStr(pchBufWide);
|
|
if(hr)
|
|
goto Cleanup;
|
|
|
|
|
|
Cleanup:
|
|
delete pchBuf;
|
|
delete pchBufWide;
|
|
if (hFile != INVALID_HANDLE_VALUE)
|
|
CloseHandle(hFile);
|
|
RRETURN(hr);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::ExecuteScriptStr
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CScriptSite::ExecuteScriptStr(TCHAR * pchScript)
|
|
{
|
|
HRESULT hr;
|
|
IActiveScriptParse * pParse = NULL;
|
|
|
|
hr = THR(_pScript->QueryInterface(IID_IActiveScriptParse, (void **)&pParse));
|
|
if (hr)
|
|
goto Cleanup;
|
|
|
|
hr = THR(pParse->ParseScriptText(pchScript, _cstrName, NULL, NULL, 0, 0, 0L, NULL, NULL));
|
|
if (hr)
|
|
goto Cleanup;
|
|
|
|
Cleanup:
|
|
ReleaseInterface(pParse);
|
|
RRETURN(hr);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::SetScriptState
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CScriptSite::SetScriptState(SCRIPTSTATE ss)
|
|
{
|
|
return _pScript->SetScriptState(ss);
|
|
}
|
|
|
|
HRESULT
|
|
CScriptSite::GetDocumentContextFromPosition(DWORD dwSourceContext,
|
|
ULONG uCharacterOffset,
|
|
ULONG uNumChars,
|
|
IDebugDocumentContext **ppsc)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (_pDDH)
|
|
{
|
|
ULONG ulStartPos;
|
|
|
|
hr = _pDDH->GetScriptBlockInfo(dwSourceContext, NULL, &ulStartPos, NULL);
|
|
if (hr)
|
|
goto Cleanup;
|
|
|
|
hr = _pDDH->CreateDebugDocumentContext(ulStartPos+uCharacterOffset,
|
|
uNumChars,
|
|
ppsc);
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
|
|
Cleanup:
|
|
RRETURN(hr);
|
|
}
|
|
|
|
HRESULT
|
|
CScriptSite::GetApplication(IDebugApplication **ppda)
|
|
{
|
|
*ppda = ScriptHost()->_pMT->_pDA;
|
|
|
|
return (*ppda) ? S_OK : E_UNEXPECTED;
|
|
}
|
|
|
|
HRESULT
|
|
CScriptSite::GetRootApplicationNode(IDebugApplicationNode **ppdanRoot)
|
|
{
|
|
if (!ScriptHost()->_pMT->_pDA || !_pDDH)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
|
|
return _pDDH->GetDebugApplicationNode(ppdanRoot);
|
|
}
|
|
|
|
HRESULT
|
|
CScriptSite::OnScriptErrorDebug(IActiveScriptErrorDebug *pErrorDebug,
|
|
BOOL *pfEnterDebugger,
|
|
BOOL *pfCallOnScriptErrorWhenContinuing)
|
|
{
|
|
HRESULT hr;
|
|
IActiveScriptError * pError;
|
|
|
|
TraceTag((tagError, "OnScriptErrorDebug!"));
|
|
|
|
*pfEnterDebugger = FALSE;
|
|
*pfCallOnScriptErrorWhenContinuing = TRUE;
|
|
|
|
if (ScriptHost()->_fMustExitThread)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
hr = pErrorDebug->QueryInterface(IID_IActiveScriptError, (LPVOID*)&pError);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
_fInDebugError = TRUE;
|
|
|
|
hr = OnScriptError(pError);
|
|
|
|
_fInDebugError = FALSE;
|
|
|
|
if (hr == S_FALSE)
|
|
{
|
|
*pfEnterDebugger = TRUE;
|
|
}
|
|
|
|
*pfCallOnScriptErrorWhenContinuing = TRUE;
|
|
|
|
pError->Release();
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Method: CScriptSite::xxx, IBServer
|
|
//
|
|
// The implementation of IBServer passed to the script engine
|
|
// cannot be the same as that of the CBServerDoc because this
|
|
// causes a reference count loop with the script engine.
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT CScriptSite::GetTypeInfoCount(UINT FAR* pctinfo)
|
|
{ return ScriptHost()->GetTypeInfoCount(pctinfo); }
|
|
HRESULT CScriptSite::GetTypeInfo(
|
|
UINT itinfo,
|
|
LCID lcid,
|
|
ITypeInfo FAR* FAR* pptinfo)
|
|
{ return ScriptHost()->GetTypeInfo(itinfo, lcid, pptinfo); }
|
|
HRESULT CScriptSite::GetIDsOfNames(
|
|
REFIID riid,
|
|
OLECHAR FAR* FAR* rgszNames,
|
|
UINT cNames,
|
|
LCID lcid,
|
|
DISPID FAR* rgdispid)
|
|
{ return ScriptHost()->GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid); }
|
|
HRESULT CScriptSite::Invoke(
|
|
DISPID dispidMember,
|
|
REFIID riid,
|
|
LCID lcid,
|
|
WORD wFlags,
|
|
DISPPARAMS FAR* pdispparams,
|
|
VARIANT FAR* pvarResult,
|
|
EXCEPINFO FAR* pexcepinfo,
|
|
UINT FAR* puArgErr)
|
|
{ return ScriptHost()->Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr); }
|
|
|
|
|
|
HRESULT CScriptSite::get_PublicData(VARIANT *pvData)
|
|
{ return ScriptHost()->get_PublicData(pvData); }
|
|
HRESULT CScriptSite::put_PublicData(VARIANT vData)
|
|
{ return ScriptHost()->put_PublicData(vData); }
|
|
HRESULT CScriptSite::get_PrivateData(VARIANT *pvData)
|
|
{ return ScriptHost()->get_PrivateData(pvData); }
|
|
HRESULT CScriptSite::put_PrivateData(VARIANT vData)
|
|
{ return ScriptHost()->put_PrivateData(vData); }
|
|
HRESULT CScriptSite::ExitProcess()
|
|
{ return ScriptHost()->ExitProcess(); }
|
|
HRESULT CScriptSite::Restart()
|
|
{ return ScriptHost()->Restart(); }
|
|
HRESULT CScriptSite::get_LocalMachine(BSTR *pbstrName)
|
|
{ return ScriptHost()->get_LocalMachine(pbstrName); }
|
|
HRESULT CScriptSite::Include(BSTR bstrPath)
|
|
{ return ScriptHost()->Include(bstrPath); }
|
|
HRESULT CScriptSite::CallScript(BSTR Path, VARIANT *ScriptParam)
|
|
{ return ScriptHost()->CallScript(Path, ScriptParam); }
|
|
HRESULT CScriptSite::SpawnScript(BSTR Path, VARIANT *ScriptParam)
|
|
{ return ScriptHost()->SpawnScript(Path, ScriptParam); }
|
|
HRESULT CScriptSite::get_ScriptParam(VARIANT *ScriptParam)
|
|
{ return ScriptHost()->get_ScriptParam(ScriptParam); }
|
|
HRESULT CScriptSite::get_ScriptPath(BSTR *bstrPath)
|
|
{ return ScriptHost()->get_ScriptPath(bstrPath); }
|
|
HRESULT CScriptSite::CallExternal(BSTR bstrDLLName, BSTR bstrFunctionName, VARIANT *pParam, long *plRetVal)
|
|
{ return ScriptHost()->CallExternal(bstrDLLName, bstrFunctionName, pParam, plRetVal); }
|
|
HRESULT CScriptSite::ResetSync(const BSTR bstrName)
|
|
{ return ScriptHost()->ResetSync(bstrName); }
|
|
HRESULT CScriptSite::WaitForSync(BSTR bstrName, long nTimeout, VARIANT_BOOL *pfTimedout)
|
|
{ return ScriptHost()->WaitForSync(bstrName, nTimeout, pfTimedout); }
|
|
HRESULT CScriptSite::WaitForMultipleSyncs(const BSTR bstrNameList, VARIANT_BOOL fWaitForAll, long nTimeout, long *plSignal)
|
|
{ return ScriptHost()->WaitForMultipleSyncs(bstrNameList, fWaitForAll, nTimeout, plSignal); }
|
|
HRESULT CScriptSite::SignalThreadSync(BSTR bstrName)
|
|
{ return ScriptHost()->SignalThreadSync(bstrName); }
|
|
HRESULT CScriptSite::TakeThreadLock(BSTR bstrName)
|
|
{ return ScriptHost()->TakeThreadLock(bstrName); }
|
|
HRESULT CScriptSite::ReleaseThreadLock(BSTR bstrName)
|
|
{ return ScriptHost()->ReleaseThreadLock(bstrName); }
|
|
HRESULT CScriptSite::DoEvents()
|
|
{ return ScriptHost()->DoEvents(); }
|
|
HRESULT CScriptSite::MessageBoxTimeout(BSTR msg, long cBtn, BSTR btnText, long time, long intrvl, VARIANT_BOOL cancel, VARIANT_BOOL confirm, long *plSel)
|
|
{ return ScriptHost()->MessageBoxTimeout(msg, cBtn, btnText, time, intrvl, cancel, confirm, plSel); }
|
|
HRESULT CScriptSite::RunLocalCommand(BSTR bstrCmd, BSTR bstrDir, BSTR bstrTitle, VARIANT_BOOL fMin, VARIANT_BOOL fGetOut, VARIANT_BOOL fWait, VARIANT_BOOL fNoPopup, VARIANT_BOOL fNoEnviron, long *plError)
|
|
{ return ScriptHost()->RunLocalCommand(bstrCmd, bstrDir, bstrTitle, fMin, fGetOut, fWait, fNoPopup, fNoEnviron, plError); }
|
|
HRESULT CScriptSite::CopyOrAppendFile(BSTR bstrSrc, BSTR bstrDst, long nSrcOffset, long nSrcLength, VARIANT_BOOL fAppend, long *nSrcFilePosition)
|
|
{ return ScriptHost()->CopyOrAppendFile(bstrSrc, bstrDst, nSrcOffset, nSrcLength, fAppend, nSrcFilePosition); }
|
|
HRESULT CScriptSite::GetLastRunLocalError(long *plErrorCode)
|
|
{ return ScriptHost()->GetLastRunLocalError(plErrorCode); }
|
|
HRESULT CScriptSite::GetProcessOutput(long lProcessID, BSTR *pbstrData)
|
|
{ return ScriptHost()->GetProcessOutput(lProcessID, pbstrData); }
|
|
HRESULT CScriptSite::GetProcessExitCode(long lProcessID, long *plExitCode)
|
|
{ return ScriptHost()->GetProcessExitCode(lProcessID, plExitCode); }
|
|
HRESULT CScriptSite::TerminateProcess(long lProcessID)
|
|
{ return ScriptHost()->TerminateProcess(lProcessID); }
|
|
HRESULT CScriptSite::SendToProcess(long lProcessID, BSTR bstrType, BSTR bstrData, long *plReturn)
|
|
{ return ScriptHost()->SendToProcess(lProcessID, bstrType, bstrData, plReturn); }
|
|
HRESULT CScriptSite::SendMail(BSTR to, BSTR cc, BSTR bcc, BSTR subject, BSTR msg, BSTR attach, BSTR user, BSTR pass, long *plError)
|
|
{ return ScriptHost()->SendMail(to, cc, bcc, subject, msg, attach, user, pass, plError); }
|
|
HRESULT CScriptSite::SendSMTPMail(BSTR from, BSTR to, BSTR cc, BSTR subject, BSTR msg, BSTR host, long *plError)
|
|
{ return ScriptHost()->SendSMTPMail(from, to, cc, subject, msg, host, plError); }
|
|
HRESULT CScriptSite::OUTPUTDEBUGSTRING(BSTR LogMsg)
|
|
{ return ScriptHost()->OUTPUTDEBUGSTRING(LogMsg); }
|
|
HRESULT CScriptSite::UnevalString(BSTR in, BSTR *out)
|
|
{ return ScriptHost()->UnevalString(in, out); }
|
|
HRESULT CScriptSite::ASSERT(VARIANT_BOOL Assertion, BSTR LogMsg)
|
|
{ return ScriptHost()->ASSERT(Assertion, LogMsg); }
|
|
HRESULT CScriptSite::Sleep (int nTimeout)
|
|
{ return ScriptHost()->Sleep (nTimeout); }
|
|
HRESULT CScriptSite::Reboot ()
|
|
{ return ScriptHost()->Reboot (); }
|
|
HRESULT CScriptSite::NotifyScript (BSTR bstrEvent, VARIANT vData)
|
|
{ return ScriptHost()->NotifyScript (bstrEvent, vData); }
|
|
HRESULT CScriptSite::RegisterEventSource (IDispatch *pDisp, BSTR bstrProgID)
|
|
{ return ScriptHost()->RegisterEventSource (pDisp, bstrProgID); }
|
|
HRESULT CScriptSite::UnregisterEventSource (IDispatch *pDisp)
|
|
{ return ScriptHost()->UnregisterEventSource (pDisp); }
|
|
HRESULT CScriptSite::get_HostMajorVer(long *plMajorVer)
|
|
{ return ScriptHost()->get_HostMajorVer (plMajorVer); }
|
|
HRESULT CScriptSite::get_HostMinorVer(long *plMinorVer)
|
|
{ return ScriptHost()->get_HostMinorVer (plMinorVer); }
|
|
HRESULT CScriptSite::get_StatusValue(long nIndex, long *pnStatus)
|
|
{ return ScriptHost()->get_StatusValue(nIndex, pnStatus); }
|
|
HRESULT CScriptSite::put_StatusValue(long nIndex, long nStatus)
|
|
{ return ScriptHost()->put_StatusValue(nIndex, nStatus); }
|