windows-nt/Source/XPSP1/NT/ds/security/csps/cryptoflex/slbscu/scuexc.h

256 lines
8.3 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
// scuExc.h -- Smart Card Utility EXCeption declaration
// (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.
#if !defined(SCU_EXCEPTION_H)
#define SCU_EXCEPTION_H
#include "DllSymDefn.h"
namespace scu
{
// Exception is a virtual root class for exceptions and cannot be
// instantiated directly. Rather, specializations of Exception are
// defined by a facility and instantiated. Given a reference to an
// instance of Exception, it's facility can be obtained by the
// Facility member function. Specializations of the Exception class
// are typically defined by the responsible facility using the
// convenience template ExcTemplate.
//
// Each specialization of an exception typically has, but is not
// required to have, a cause code that uniquely identifies the reason
// for the exception within the facility it represents. Each
// Exception does have an error code that is a generic version of the
// cause code (if it exists). This error code could overlap error
// codes of other facilities. The specialization implements Error
// routine.
class SCU_DLLAPI Exception
{
public:
// Types
enum FacilityCode
{
fcCCI,
fcIOP,
fcOS,
fcSmartCard,
fcPKI,
};
typedef unsigned long ErrorCode;
// ErrorCode must be the largest integer that any facility
// needs to translate their native codes into a generic
// error code.
// C'tors/D'tors
virtual
~Exception() throw() = 0;
// Operators
// Operations
virtual Exception *
Clone() const = 0;
virtual void
Raise() const = 0;
// Access
virtual char const *
Description() const;
// Textual description of the exception.
virtual ErrorCode
Error() const throw() = 0;
// generic code
FacilityCode
Facility() const throw();
// Facility that threw the exception
// Predicates
protected:
// Types
// C'tors/D'tors
explicit
Exception(FacilityCode fc) throw();
// Operators
// Operations
// Access
// Predicates
// Variables
private:
// Types
// C'tors/D'tors
// Operators
// Operations
// Access
// Predicates
// Variables
FacilityCode m_fc;
};
// ExcTemplate is a convenience template to define new exceptions by
// facility. To define a new specialization, add the facility to the
// Exception class, then reference it when declaring the new
// exception. E.g.
//
// typedef ExcTemplate<OS, DWORD> OsException;
//
// The helper routine AsErrorCode is defined as a template to convert
// a cause code into a error code. The helper templates operator==
// and operator!= are also defined. These as well as the class
// methods can be overriden in the usual C++ fashion.
template<Exception::FacilityCode FC, class CC>
class ExcTemplate
: public Exception
{
public:
// Types
typedef CC CauseCode;
// C'tors/D'tors
explicit
ExcTemplate(CauseCode cc) throw();
virtual
~ExcTemplate() throw();
// Operations
virtual Exception *
Clone() const;
virtual void
Raise() const;
// Access
CauseCode
Cause() const throw();
// facility-specific code indicating the cause of the
// exception. The value is unique to facility.
virtual char const *
Description() const;
ErrorCode
Error() const throw();
// Predicates
protected:
// Types
// C'tors/D'tors
// Operators
// Operations
// Access
// Predicates
// Variables
private:
// Types
// C'tors/D'tors
// Operators
// Operations
// Access
// Predicates
// Variables
CauseCode m_cc;
};
///////////////////////// TEMPLATE METHODS //////////////////////////////
/////////////////////////// PUBLIC /////////////////////////////////
// Types
// C'tors/D'tors
template<Exception::FacilityCode FC, class CC>
ExcTemplate<FC, CC>::ExcTemplate(CauseCode cc) throw()
: Exception(FC),
m_cc(cc)
{}
template<Exception::FacilityCode FC, class CC>
ExcTemplate<FC, CC>::~ExcTemplate() throw()
{}
// Operators
// Operations
template<Exception::FacilityCode FC, class CC>
scu::Exception *
ExcTemplate<FC, CC>::Clone() const
{
return new ExcTemplate<FC, CC>(*this);
}
template<Exception::FacilityCode FC, class CC>
void
ExcTemplate<FC, CC>::Raise() const
{
throw *this;
}
// Access
template<Exception::FacilityCode FC, class CC>
ExcTemplate<FC, CC>::CauseCode
ExcTemplate<FC, CC>::Cause() const throw()
{
return m_cc;
}
template<Exception::FacilityCode FC, class CC>
char const *
ExcTemplate<FC, CC>::Description() const
{
return Exception::Description();
}
template<Exception::FacilityCode FC, class CC>
ExcTemplate<FC, CC>::ErrorCode
ExcTemplate<FC, CC>::Error() const throw()
{
return AsErrorCode(Cause());
}
// 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
/////////////////////////// HELPERS /////////////////////////////////
template<class CC>
Exception::ErrorCode
AsErrorCode(typename CC cc) throw()
{
return cc;
}
} // namespace
#endif // SCU_EXCEPTION_H