// 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(cc), m_lpDescription(0) {} OsException::OsException(HRESULT hr) throw() : ExcTemplate(static_cast(hr)), m_lpDescription(0) {} OsException::OsException(OsException const &rhs) : ExcTemplate(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 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(&m_lpDescription), 0, NULL); if (0 == cMsgLength) { cMsgLength = FormatMessage(dwBaseFlags | FORMAT_MESSAGE_FROM_HMODULE, GetModuleHandle(NULL), cc, dwLanguageId, reinterpret_cast(&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(&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