// 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 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 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 ExcTemplate::ExcTemplate(CauseCode cc) throw() : Exception(FC), m_cc(cc) {} template ExcTemplate::~ExcTemplate() throw() {} // Operators // Operations template scu::Exception * ExcTemplate::Clone() const { return new ExcTemplate(*this); } template void ExcTemplate::Raise() const { throw *this; } // Access template typename ExcTemplate::CauseCode ExcTemplate::Cause() const throw() { return m_cc; } template char const * ExcTemplate::Description() const { return Exception::Description(); } template typename ExcTemplate::ErrorCode ExcTemplate::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 Exception::ErrorCode AsErrorCode(typename CC cc) throw() { return cc; } } // namespace #endif // SCU_EXCEPTION_H