windows-nt/Source/XPSP1/NT/ds/security/csps/cryptoflex/slbscu/osexc.cpp
2020-09-26 16:20:57 +08:00

156 lines
5.9 KiB
C++

// OsExc.cpp -- Operating System Exception template class definition
// (c) Copyright Schlumberger Technology Corp., unpublished work, created
// 1999. This computer program includes Confidential, Proprietary
// Information and is a Trade Secret of Schlumberger Technology Corp. All
// use, disclosure, and/or reproduction is prohibited unless authorized
// in writing. All Rights Reserved.
#include "scuOsExc.h"
using namespace scu;
/////////////////////////// LOCAL/HELPER /////////////////////////////////
/////////////////////////// PUBLIC /////////////////////////////////
// Types
// C'tors/D'tors
// Operators
// Operations
// Access
// Predicates
// Static Variables
/////////////////////////// PROTECTED /////////////////////////////////
// C'tors/D'tors
// Operators
// Operations
// Access
// Predicates
// Static Variables
/////////////////////////// PRIVATE /////////////////////////////////
// C'tors/D'tors
// Operators
// Operations
// Access
// Predicates
// Static Variables
/////////////////////////// PUBLIC /////////////////////////////////
// Types
// C'tors/D'tors
OsException::OsException(CauseCode cc) throw()
: ExcTemplate<Exception::fcOS, DWORD>(cc),
m_lpDescription(0)
{}
OsException::OsException(HRESULT hr) throw()
: ExcTemplate<Exception::fcOS, DWORD>(static_cast<DWORD>(hr)),
m_lpDescription(0)
{}
OsException::OsException(OsException const &rhs)
: ExcTemplate<Exception::fcOS, DWORD>(rhs),
m_lpDescription(0) // force the copy to cache it's own description.
{}
OsException::~OsException() throw()
{
try
{
if (m_lpDescription)
LocalFree(m_lpDescription);
}
catch (...)
{
}
}
// Operators
// Operations
Exception *
OsException::Clone() const
{
return new OsException(*this);
}
void
OsException::Raise() const
{
throw *this;
}
// Access
char const *
OsException::Description() const
{
if (!m_lpDescription)
{
// cache the description
DWORD const dwBaseFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_IGNORE_INSERTS;
CauseCode const cc = Cause();
DWORD const dwLanguageId = LANG_NEUTRAL;
DWORD cMsgLength;
// Note: The compiler complains without the
// reinterpret_cast<LPTSTR> even though the declarations appear
// compatible. Something strange in the declaration of LPTSTR and
// LPSTR used by FormatMessageA.
cMsgLength = FormatMessage(dwBaseFlags | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, cc, dwLanguageId,
reinterpret_cast<LPTSTR>(&m_lpDescription),
0, NULL);
if (0 == cMsgLength)
{
cMsgLength = FormatMessage(dwBaseFlags |
FORMAT_MESSAGE_FROM_HMODULE,
GetModuleHandle(NULL), cc,
dwLanguageId,
reinterpret_cast<LPTSTR>(&m_lpDescription),
0, NULL);
if (0 == cMsgLength)
{
// if this fails, assume a message doesn't exist
cMsgLength = FormatMessage(dwBaseFlags |
FORMAT_MESSAGE_FROM_HMODULE,
GetModuleHandle(TEXT("winscard")),
cc, dwLanguageId,
reinterpret_cast<LPTSTR>(&m_lpDescription),
0, NULL);
}
}
}
return m_lpDescription;
}
// Predicates
// Static Variables
/////////////////////////// PROTECTED /////////////////////////////////
// C'tors/D'tors
// Operators
// Operations
// Access
// Predicates
// Static Variables
/////////////////////////// PRIVATE /////////////////////////////////
// C'tors/D'tors
// Operators
// Operations
// Access
// Predicates
// Static Variables