96 lines
2.6 KiB
C++
96 lines
2.6 KiB
C++
// Copyright (c) 1999 Microsoft Corporation. All rights reserved.
|
|
//
|
|
// Implementation of CActiveScriptError.
|
|
//
|
|
|
|
#include "stdinc.h"
|
|
#include "enginc.h"
|
|
#include "engerror.h"
|
|
#include "oleaut.h"
|
|
|
|
CActiveScriptError::CActiveScriptError(HRESULT hr, Lexer &lexer, const char *pszDescription)
|
|
: m_scode(hr),
|
|
m_wstrDescription(pszDescription),
|
|
m_pwszSource(NULL),
|
|
m_ulLineNumber(lexer.line() - 1), // line is reported zero-based from IActiveScriptError
|
|
m_lCharacterPosition(lexer.column() - 1) // character position is reported zero-based from IActiveScriptError
|
|
{
|
|
assert(pszDescription && lexer.line() > 0 && lexer.column() > 0);
|
|
|
|
// build the near text from the lexer's current position to the end of the line
|
|
for (const WCHAR *pwsz = lexer.m_p; *pwsz && *pwsz != '\n' && *pwsz != '\r'; ++pwsz)
|
|
{}
|
|
|
|
m_wstrSourceLine.Assign(lexer.m_p, pwsz - lexer.m_p);
|
|
|
|
// fill in the source text based on hresult
|
|
if (hr == DMUS_E_AUDIOVBSCRIPT_SYNTAXERROR)
|
|
{
|
|
m_pwszSource = L"Microsoft AudioVBScript syntax error";
|
|
}
|
|
else if (hr == DMUS_E_AUDIOVBSCRIPT_RUNTIMEERROR)
|
|
{
|
|
m_pwszSource = L"Microsoft AudioVBScript runtime error";
|
|
}
|
|
else
|
|
{
|
|
assert(hr == DMUS_E_AUDIOVBSCRIPT_OPERATIONFAILURE);
|
|
m_pwszSource = L"Microsoft AudioVBScript operation failure";
|
|
}
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CActiveScriptError::GetExceptionInfo(
|
|
/* [out] */ EXCEPINFO *pexcepinfo)
|
|
{
|
|
V_INAME(CActiveScriptError::GetExceptionInfo);
|
|
V_PTR_WRITE(pexcepinfo, *pexcepinfo);
|
|
|
|
Zero(pexcepinfo);
|
|
pexcepinfo->scode = m_scode;
|
|
|
|
if (m_wstrDescription)
|
|
pexcepinfo->bstrDescription = DMS_SysAllocString(g_fUseOleAut, m_wstrDescription);
|
|
if (!pexcepinfo->bstrDescription)
|
|
return E_OUTOFMEMORY;
|
|
|
|
pexcepinfo->bstrSource = DMS_SysAllocString(g_fUseOleAut, m_pwszSource);
|
|
if (!pexcepinfo->bstrSource)
|
|
return E_OUTOFMEMORY;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CActiveScriptError::GetSourcePosition(
|
|
/* [out] */ DWORD *pdwSourceContext,
|
|
/* [out] */ ULONG *pulLineNumber,
|
|
/* [out] */ LONG *plCharacterPosition)
|
|
{
|
|
V_INAME(CActiveScriptError::GetSourcePosition);
|
|
V_PTR_WRITE_OPT(pdwSourceContext, *pdwSourceContext);
|
|
V_PTR_WRITE(pulLineNumber, *pulLineNumber);
|
|
V_PTR_WRITE(plCharacterPosition, *plCharacterPosition);
|
|
|
|
assert(!pdwSourceContext);
|
|
*pulLineNumber = m_ulLineNumber;
|
|
*plCharacterPosition = m_lCharacterPosition;
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CActiveScriptError::GetSourceLineText(
|
|
/* [out] */ BSTR *pbstrSourceLine)
|
|
{
|
|
V_INAME(CActiveScriptError::GetSourceLineText);
|
|
V_PTR_WRITE(pbstrSourceLine, *pbstrSourceLine);
|
|
|
|
*pbstrSourceLine = NULL;
|
|
if (m_wstrSourceLine)
|
|
*pbstrSourceLine = DMS_SysAllocString(g_fUseOleAut, m_wstrSourceLine);
|
|
if (!*pbstrSourceLine)
|
|
return E_OUTOFMEMORY;
|
|
|
|
return S_OK;
|
|
}
|