- /*
- * Copyright 1995, 1996 Perforce Software. All rights reserved.
- */
- /*
- * Error.h - accumulate and report layered errors
- *
- * Class Defined:
- *
- * Error - holder of layered error
- *
- * The basic idea of Error is that the top level caller
- * should have one on its stack and hand it by reference
- * down to all lower layers. If any operation fails, it
- * can add its description of the error to the structure
- * with Set(). After each operation that can potentially
- * fail, the caller should use Test() to check for errors.
- * The top level should do the check and then call Report()
- * if necessary.
- *
- * Caveat: All messages now have named parameters, be very
- * careful not to nest messages that can have the same
- * parameter name.
- *
- * Public methods:
- *
- * Error::Clear() - clean an Error struct
- * Error::Test() - see if an error is present ( i.e. > E_INFO )
- * Error::IsFatal() - is most severe error fatal?
- * Error::IsWarning() - is most severe error just a warning?
- * Error::IsInfo() - is most severe error just information?
- * Error::GetSeverity() - return ErrorSeverity of most severe error
- * Error::GetGeneric() - return Generic code of most severe error
- *
- * Error::operator = - copy Error structs
- *
- * Error::Set() - add an error message into an Error struct
- * Error::operator << - add argument to error message
- * Error::Sys() - add a system error message into an Error struct
- * Error::Net() - add a network error message into an Error struct
- *
- * Error::GetId() - get an individual Error item
- * Error::CheckId() - is first error a particular code?
- * Error::Fmt() - format an error message
- * Error::GetDict() - get StrDict of error parameters
- *
- * Error::Marshall() - pack an Error into a StrBuf/StrDict
- * Error::UnMarshall() - unpack an Error from a StrBuf/StrDict
- * Error::Snap() - after UnMarshall, copy all data into Error
- *
- * Error::Dump() - dump out error struct, for debugging
- */
- # ifndef __ERROR_H__
- # define __ERROR_H__
- class StrBuf;
- class StrDict;
- class StrPtr;
- class ErrorPrivate;
- /*
- * ErrorSeverity - how bad is the error?
- */
- enum ErrorSeverity {
- E_EMPTY = 0, // nothing yet
- E_INFO = 1, // something good happened
- E_WARN = 2, // something not good happened
- E_FAILED = 3, // user did somthing wrong
- E_FATAL = 4 // system broken -- nothing can continue
- } ;
- /*
- * ErrorID - an error code and message
- * ErrorOf() - construct an ErrorID from bits
- *
- * sev - ErrorSeverity (4 bits)
- * arg - # of arguments, error specific (4 bits)
- * gen - generic error, defined in errornum.h (8 bits)
- * sub - subsystem id, defined in errornum.h (6 bits)
- * cod - code within subsystem, error specific (10 bits)
- */
- struct ErrorId {
- int code; // ErrorOf
- const char *fmt;
- int SubCode() const { return (code >> 0) & 0x3ff; }
- int Subsystem() const { return (code >> 10) & 0x3f; }
- int Generic() const { return (code >> 16) & 0xff; }
- int ArgCount() const { return (code >> 24) & 0x0f; }
- int Severity() const { return (code >> 28) & 0x0f; }
- int UniqueCode() const { return code & 0xffff; }
- } ;
- # define ErrorOf( sub, cod, sev, gen, arg ) \
- ((sev<<28)|(arg<<24)|(gen<<16)|(sub<<10)|cod)
- enum ErrorFmtOps {
- EF_PLAIN = 0x00, // for info messages
- EF_INDENT = 0x01, // indent each line with \t
- EF_NEWLINE = 0x02, // terminate buffer with \n
- EF_NOXLATE = 0x04 // don't use P4LANGUAGE formats
- } ;
- /*
- * class Error - hold layered errors.
- */
- class Error {
- public:
- Error() { ep = 0; severity = E_EMPTY; }
- ~Error();
- void operator =( const Error &source );
- void Clear() { severity = E_EMPTY; }
- int Test() const { return severity > E_INFO; }
- int IsInfo() const { return severity == E_INFO; }
- int IsWarning() const { return severity == E_WARN; }
- int IsError() const { return severity >= E_FAILED; }
- int IsFatal() const { return severity == E_FATAL; }
- int GetSeverity() const { return severity; }
- const char * FmtSeverity() const { return severityText[severity]; }
- int GetGeneric() const { return genericCode; }
- // Set errors, the new way
- Error & Set( const ErrorId &id );
- Error & Set( ErrorSeverity s, const char *fmt )
- {
- ErrorId eid;
- eid.code = ErrorOf( 0, 0, s, 0, 0 );
- eid.fmt = fmt;
- return Set( eid );
- }
- Error & operator <<( const StrPtr &arg );
- Error & operator <<( const StrPtr *arg );
- Error & operator <<( const char *arg );
- Error & operator <<( int arg );
- // Save system errors
- void Sys( const char *op, const char *arg );
- void Net( const char *op, const char *arg );
- // Output
- ErrorId * GetId( int i ) const;
- int CheckId( const ErrorId &id ) const
- { return severity && GetId(0)->code == id.code; }
- StrDict * GetDict();
- void Fmt( StrBuf &buf, int opts ) const;
- void Fmt( StrBuf *buf, int opts = EF_NEWLINE ) const
- { Fmt( *buf, opts ); }
- // Moving across client/server boundary
- // 0 is pre-2002.1
- // 1 is 2002.1
- // 2 is 2002.1 loopback (not used by client)
- void Marshall0( StrBuf &out ) const;
- void Marshall1( StrDict &out ) const;
- void Marshall2( StrBuf &out ) const;
- void UnMarshall0( const StrPtr &in );
- void UnMarshall1( StrDict &in );
- void UnMarshall2( const StrPtr &in );
- void Snap();
- // Debugging
- void Dump( const char *trace );
- private:
- // Remainder is the actual error info
- ErrorSeverity severity; // of worst error
- int genericCode; // of worst error
- ErrorPrivate *ep; // for actual error data
- static const char *severityText[];
- } ;
- # endif /* __ERROR_H__ */
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 7893 | Johan Nilsson | OFFLINE CHANGELIST 10 - SUBMITTED ON 2011/03/23 11:18:27 Upgrade project files to VS2010... and switching to msbuild for the entire project. Retargeted everything to .NET4 Client Profile for the time being, due to VS2010 C++ limitations (can't target anything other than 4.0 without complicating the setup too much). Shouldn't be too hard to retarget later if push comes to shove. Added VS2010 P4API stuff directly inside this project also to make things easier to get up and running for the moment. Removed old static P4API libraries. ____________________________________________________________ OFFLINE CHANGELIST 9 - SUBMITTED ON 2011/03/22 07:35:31 Converted to VS2010 « |
14 years ago |