Windows2003-3790/inetsrv/iis/svcs/cmp/asp/asperror.cpp
2020-09-30 16:53:55 +02:00

267 lines
6.7 KiB
C++

/*===================================================================
Microsoft Denali
Microsoft Confidential.
Copyright 1998 Microsoft Corporation. All Rights Reserved.
Component: ASPError object
File: asperror.cpp
Owner: dmitryr
This file contains the code for the implementation of
the ASPError class.
===================================================================*/
#include "denpre.h"
#pragma hdrstop
#include "asperror.h"
#include "memchk.h"
/*===================================================================
CASPError::CASPError
Constructor for the empty error object
Returns:
===================================================================*/
CASPError::CASPError()
:
m_cRefs(1),
m_szASPCode(NULL),
m_lNumber(0),
m_szSource(NULL),
m_szFileName(NULL),
m_lLineNumber(0),
m_szDescription(NULL),
m_szASPDescription(NULL),
m_bstrLineText(NULL)
{
CDispatch::Init(IID_IASPError);
}
/*===================================================================
CASPError::CASPError
Constructor for real error object given CErrInfo
Parameters
pErrInfo [in] copy data from there
Returns:
===================================================================*/
CASPError::CASPError(CErrInfo *pErrInfo)
:
m_cRefs(1),
m_szASPCode(NULL),
m_lNumber(0),
m_szSource(NULL),
m_szFileName(NULL),
m_lLineNumber(0),
m_szDescription(NULL),
m_szASPDescription(NULL),
m_bstrLineText(NULL)
{
CDispatch::Init(IID_IASPError);
if (!pErrInfo)
return;
// Parse ASP error code and HRESULT from szErrorCode
CHAR *szErrorCode = StringDupA(pErrInfo->GetItem(Im_szErrorCode));
if (szErrorCode != NULL)
{
CHAR *szC = strchr(szErrorCode, ':');
if (szC)
{
// format "ASP XXX : HRESULT"
szC[-1] = '\0';
m_szASPCode = szErrorCode;
m_lNumber = strtoul(szC+2, NULL, 16);
}
else if (strncmp(szErrorCode, "ASP", 3) == 0)
{
// format "ASP XXX"
m_szASPCode = szErrorCode;
m_lNumber = E_FAIL;
}
else
{
// format "HRESULT"
m_szASPCode = NULL;
m_lNumber = strtoul(szErrorCode, NULL, 16);
free(szErrorCode);
}
}
else
{
// no error description available
m_szASPCode = NULL;
m_lNumber = E_FAIL;
}
// Copy the rest
m_szSource = StringDupA(pErrInfo->GetItem(Im_szEngine));
m_szFileName = StringDupA(pErrInfo->GetItem(Im_szFileName));
m_szDescription = StringDupA(pErrInfo->GetItem(Im_szShortDescription));
m_szASPDescription = StringDupA(pErrInfo->GetItem(Im_szLongDescription));
// Get line text & column (supplies init. values if not available)
BSTR bstrLineText;
pErrInfo->GetLineInfo(&bstrLineText, &m_nColumn);
m_bstrLineText = SysAllocString(bstrLineText);
// Line number if present
if (pErrInfo->GetItem(Im_szLineNum))
m_lLineNumber = atoi(pErrInfo->GetItem(Im_szLineNum));
}
/*===================================================================
CASPError::~CASPError
Destructor
Parameters:
Returns:
===================================================================*/
CASPError::~CASPError()
{
Assert(m_cRefs == 0); // must have 0 ref count
if (m_szASPCode)
free(m_szASPCode);
if (m_szSource)
free(m_szSource);
if (m_szFileName)
free(m_szFileName);
if (m_szDescription)
free(m_szDescription);
if (m_szASPDescription)
free(m_szASPDescription);
if (m_bstrLineText)
SysFreeString(m_bstrLineText);
}
/*===================================================================
CASPError::ToBSTR
Produce a BSTR to be returned by get_XXX methods
Parameters:
sz return this string as BSTR
Returns:
BSTR or NULL if FAILED
===================================================================*/
BSTR CASPError::ToBSTR(CHAR *sz)
{
BSTR bstr;
if (sz == NULL || *sz == '\0')
bstr = SysAllocString(L"");
else if (FAILED(SysAllocStringFromSz(sz, 0, &bstr)))
bstr = NULL;
return bstr;
}
/*===================================================================
CASPError::QueryInterface
CASPError::AddRef
CASPError::Release
IUnknown members for CASPError object.
===================================================================*/
STDMETHODIMP CASPError::QueryInterface(REFIID riid, VOID **ppv)
{
if (IID_IUnknown == riid || IID_IDispatch == riid || IID_IASPError == riid)
{
AddRef();
*ppv = this;
return S_OK;
}
*ppv = NULL;
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) CASPError::AddRef()
{
return InterlockedIncrement(&m_cRefs);
}
STDMETHODIMP_(ULONG) CASPError::Release()
{
LONG cRefs = InterlockedDecrement(&m_cRefs);
if (cRefs)
return cRefs;
delete this;
return 0;
}
/*===================================================================
CASPError::get_ASPCode
CASPError::get_Number
CASPError::get_Source
CASPError::get_FileName
CASPError::get_LineNumber
CASPError::get_Description
CASPError::get_ASPDescription
IASPError members for CASPError object.
===================================================================*/
STDMETHODIMP CASPError::get_ASPCode(BSTR *pbstr)
{
*pbstr = ToBSTR(m_szASPCode);
return (*pbstr) ? S_OK : E_OUTOFMEMORY;
}
STDMETHODIMP CASPError::get_Number(long *plNumber)
{
*plNumber = m_lNumber;
return S_OK;
}
STDMETHODIMP CASPError::get_Category(BSTR *pbstr)
{
*pbstr = ToBSTR(m_szSource);
return (*pbstr) ? S_OK : E_OUTOFMEMORY;
}
STDMETHODIMP CASPError::get_File(BSTR *pbstr)
{
*pbstr = ToBSTR(m_szFileName);
return (*pbstr) ? S_OK : E_OUTOFMEMORY;
}
STDMETHODIMP CASPError::get_Line(long *plLineNumber)
{
*plLineNumber = m_lLineNumber;
return S_OK;
}
STDMETHODIMP CASPError::get_Column(long *pnColumn)
{
*pnColumn = long(m_nColumn);
return S_OK;
}
STDMETHODIMP CASPError::get_Source(BSTR *pbstrLineText)
{
*pbstrLineText = SysAllocString(m_bstrLineText? m_bstrLineText : L"");
return (*pbstrLineText) ? S_OK : E_OUTOFMEMORY;
}
STDMETHODIMP CASPError::get_Description(BSTR *pbstr)
{
*pbstr = ToBSTR(m_szDescription);
return (*pbstr) ? S_OK : E_OUTOFMEMORY;
}
STDMETHODIMP CASPError::get_ASPDescription(BSTR *pbstr)
{
*pbstr = ToBSTR(m_szASPDescription);
return (*pbstr) ? S_OK : E_OUTOFMEMORY;
}