/*++ Copyright (c) 1991-2000 Microsoft Corporation Module Name: error.hxx Abstract: This module contains ERROR class. Environment: ULIB, User Mode Notes: --*/ /* Defining error code: */ #define ERROR_USER_DEFINED_BASE 0xFF00 #define ERR_ERRSTK_STACK_OVERFLOW ERROR_USER_DEFINED_BASE + 1 #define NEW_ALLOC_FAILED ERROR_USER_DEFINED_BASE + 2 #define ERROR_NLS_STRING_BASE 0xFF10 #define ERR_NLS_ALLOC_FAILED ERROR_NLS_STRING_BASE + 1 #define ERR_NLS_INVALID_PSZ ERROR_NLS_STRING_BASE + 2 #define ERR_NLS_INVALID_STRING ERROR_NLS_STRING_BASE + 3 #define ERR_NLS_FIXED_SIZE_BUF ERROR_NLS_STRING_BASE + 4 #define ERR_NLS_NOT_FOUND ERROR_NLS_STRING_BASE + 5 #define ERR_NLS_BAD_DATE ERROR_NLS_STRING_BASE + 6 #define ERR_NLS_BAD_TIME ERROR_NLS_STRING_BASE + 7 #define ERR_BAD_SUBSTRING ERROR_NLS_STRING_BASE + 8 #define ERROR_ARG_BASE 0xFF20 #define ERR_UNKNOWN_ARG_STRING ERROR_ARG_BASE + 1 #define ERR_INVALID_COMMAND_LINE ERROR_ARG_BASE + 2 #define ERROR_ARRAYLIST_BASE 0xFF30 #define ERR_REALLOC_SIZE_FAILED ERROR_ARRAYLIST_BASE + 1 #define ERROR_STR_BUF_BASE 0xFF40 #define ERR_FILE_TOO_LARGE ERROR_STR_BUF_BASE + 1 #define ERR_MEMORY_UNAVAILABLE ERROR_STR_BUF_BASE + 2 #define ERR_FILE_READ_ERROR ERROR_STR_BUF_BASE + 3 #define ERR_NO_STRINGS_IN_BUFFER ERROR_STR_BUF_BASE + 4 #define ERR_INVALID_FILE_NAME ERROR_STR_BUF_BASE + 4 #define ERROR_MB_STRING_BASE 0xFF50 #define ERR_COLLATE_FAILURE ERROR_MB_STRING_BASE + 1 #define ERROR_VOLUME_BASE 0xFF60 #define ERR_CANNOT_OPEN_VOL ERROR_VOLUME_BASE + 1 #define ERR_CANNOT_GET_VOL ERROR_VOLUME_BASE + 2 #define ERR_PARITION_TOOBIG ERROR_VOLUME_BASE + 3 #define ERR_NO_S_SWITCH ERROR_VOLUME_BASE + 4 #define ERR_INVALID_PARM ERROR_VOLUME_BASE + 5 #define ERR_VOL_NOTOPEN ERROR_VOLUME_BASE + 6 #define ERR_VOL_NOHELPERS ERROR_VOLUME_BASE + 7 #define ERR_VOL_NETDRIVE ERROR_VOLUME_BASE + 8 #define ERR_VOL_BUSYDRIVE ERROR_VOLUME_BASE + 9 #define ERR_VOL_INVALIDLABEL ERROR_VOLUME_BASE + 0xA #define ERROR_FMT_BASE 0xFFFF0070 #define ERR_FMT_NOTSUPPORTED ERROR_FMT_BASE + 1 #define ERR_FMT_UNEXPECTEDERR ERROR_FMT_BASE + 2 #define ERR_FMT_BADPARM ERROR_FMT_BASE + 3 #define ERR_FMT_INCOMPATPARM ERROR_FMT_BASE + 4 #define ERR_FMT_INCOMPATDISK ERROR_FMT_BASE + 5 #define ERR_FMT_ONCEONLY ERROR_FMT_BASE + 6 #define ERR_FMT_VOLTOOBIG ERROR_FMT_BASE + 7 #define ERR_FMT_BADVOLID ERROR_FMT_BASE + 8 #define ERR_FMT_EXECFAIL ERROR_FMT_BASE + 9 #define ERR_FMT_BADCMMFUNC ERROR_FMT_BASE + 0xA #define ERR_FMT_INVALIDMEDIA ERROR_FMT_BASE + 0xB #define ERR_FMT_BADOS ERROR_FMT_BASE + 0xC #define ERR_FMT_GENERALFAIL ERROR_FMT_BASE + 0xD #define ERR_FMT_NOSPARM ERROR_FMT_BASE + 0xE #define ERR_FMT_INVALIDNAME ERROR_FMT_BASE + 0xF #define ERR_FMT_NOWRITEBOOT ERROR_FMT_BASE + 0x10 #define ERR_FMT_BADLABEL ERROR_FMT_BASE + 0x11 #define ERR_FMT_FATERR ERROR_FMT_BASE + 0x12 #define ERR_FMT_DIRWRITE ERROR_FMT_BASE + 0x13 #define ERR_FMT_DRIVELETTER ERROR_FMT_BASE + 0x14 #define ERR_FMT_UNSUPP_PARMS ERROR_FMT_BASE + 0x15 #define ERR_FMT_STOPIFDISK ERROR_FMT_BASE + 0x16 #define ERR_FMT_NODRIVESPEC ERROR_FMT_BASE + 0x17 #define ERROR_IOBUF_BASE 0xFF90 #define ERR_ALLOC_FAILURE ERROR_IOBUF_BASE + 1 #define ERR_REALLOC_FAILURE ERROR_IOBUF_BASE + 2 #define ERR_BUFFER_OVERFLOW ERROR_IOBUF_BASE + 3 #define ERR_BUFFER_NOT_LOCAL ERROR_IOBUF_BASE + 4 #define ERROR_FS_MGR_BASE 0xff95 #define ERROR_DRV_BASE 0xff96 #define ERR_DRV_NOT_SET ERROR_DRV_BASE + 1 #define ERR_DRV_INVALID_ARG ERROR_DRV_BASE + 2 #define ERROR_FS_REF_BASE 0xff99 #define ERROR_FS_REF_SETPROPERTY ERROR_FS_REF_BASE + 1 #define ERROR_FILE_BASE 0xffa0 #define ERROR_DIRECTORY_BASE 0xffb0 #define ERROR_MSG_BASE 0xffc0 #define ERROR_MBR_BASE 0xFFd0 #define ERR_INVALID_PARITION ERROR_MBR_BASE + 1 #define ERR_INVALID_SYSTEM_ID ERROR_MBR_BASE + 2 #define ERROR_BPB_BASE 0xFFe0 #define ERR_BPB_NOMEM ERROR_BPB_BASE + 1 #define ERR_INVALID_DEVICE ERROR_BPB_BASE + 2 #define ERR_NO_BPB ERROR_BPB_BASE + 3 #define ERR_NO_MBR ERROR_BPB_BASE + 4 #define ERROR_FAT_BASE 0xFFf0 #define ERR_BAD_CLUS_NUM ERROR_FAT_BASE + 1 #define ERROR_FATFMT_BASE 0xFFf5 #define ERR_NOMULTITRACK ERROR_FATFMT_BASE + 1 #define ERR_BADAREAS ERROR_FATFMT_BASE + 2 #define ERROR_BMIND_BASE 0xFFFF0000 #define ERR_BMIND_PARAMETER ERROR_BMIND_BASE + 1 #define ERR_BMIND_INITIALIZATION ERROR_BMIND_BASE + 2 #define ERROR_BITMAP_BASE 0xFFFF0010 #define ERR_BM_PARAMETER ERROR_BITMAP_BASE + 1 #define ERR_BM_FULL ERROR_BITMAP_BASE + 2 #define ERROR_BADBLK_BASE 0xFFFF0020 #define ERR_BB_PARAMETER ERROR_BADBLK_BASE + 1 #define ERROR_HOTFIX_BASE 0xFFFF0030 #define ERR_HF_PARAMETER ERROR_HOTFIX_BASE + 1 #define ERROR_FNODE_BASE 0xFFFF0040 #define ERR_FN_PARAMETER ERROR_FNODE_BASE + 1 #define ERROR_SUPER_BASE 0xFFFF0050 #define ERR_SB_PARAMETER ERROR_SUPER_BASE + 1 #define ERROR_SPARE_BASE 0xFFFF0060 #define ERR_SP_PARAMETER ERROR_SPARE_BASE + 1 #define ERROR_HPFSVOL_BASE 0xFFFF0070 #define ERR_HV_PARAMETER ERROR_HPFSVOL_BASE + 1 #define ERR_HV_BAD_SA ERROR_HPFSVOL_BASE + 2 #define ERROR_DIRMAP_BASE 0xFFFF0080 #define ERR_DM_PARAMETER ERROR_DIRMAP_BASE + 1 #define ERR_DM_FULL ERROR_DIRMAP_BASE + 2 #define ERROR_DIRBLK_BASE 0xFFFF0090 #define ERR_DB_PARAMETER ERROR_DIRBLK_BASE + 1 #define ERROR_HP_SUPER_AREA_BASE 0xFFFF00A0 #define ERR_HPSA_PARAMETER ERROR_HP_SUPER_AREA_BASE + 1 #define ERR_HPSA_NOT_READ ERROR_HP_SUPER_AREA_BASE + 2 #define ERR_HPSA_BAD_SA ERROR_HP_SUPER_AREA_BASE + 3 #define ERROR_CHKDSK_BASE 0xFFFF00B0 #define ERR_CHKDSK_NOTSUPPORTED ERROR_CHKDSK_BASE + 1 #define ERR_CHKDSK_UNEXPECTEDERR ERROR_CHKDSK_BASE + 2 #define ERR_CHKDSK_BADPARM ERROR_CHKDSK_BASE + 3 #define ERR_CHKDSK_INCOMPATPARM ERROR_CHKDSK_BASE + 4 #define ERR_CHKDSK_INCOMPATDISK ERROR_CHKDSK_BASE + 5 #define ERR_CHKDSK_BADVOLID ERROR_CHKDSK_BASE + 6 #define ERR_CHKDSK_EXECFAIL ERROR_CHKDSK_BASE + 7 #define ERR_CHKDSK_BADCMMFUNC ERROR_CHKDSK_BASE + 8 #define ERR_CHKDSK_INVALIDMEDIA ERROR_CHKDSK_BASE + 9 #define ERR_CHKDSK_BADOS ERROR_CHKDSK_BASE + 0xA #define ERR_CHKDSK_GENERALFAIL ERROR_CHKDSK_BASE + 0xB #define ERR_CHKDSK_INVALIDNAME ERROR_CHKDSK_BASE + 0xC #define ERR_CHKDSK_NOWRITEBOOT ERROR_CHKDSK_BASE + 0xD #define ERR_CHKDSK_BADLABEL ERROR_CHKDSK_BASE + 0xE #define ERR_CHKDSK_FATERR ERROR_CHKDSK_BASE + 0xF #define ERR_CHKDSK_DIRWRITE ERROR_CHKDSK_BASE + 0x10 #define ERR_CHKDSK_DRIVELETTER ERROR_CHKDSK_BASE + 0x11 #define ERR_CHKDSK_UNSUPP_PARMS ERROR_CHKDSK_BASE + 0x12 #define ERR_CHKDSK_NODRIVESPEC ERROR_CHKDSK_BASE + 0x13 #define ERR_CHKDSK_INVALID_FSTYPE ERROR_CHKDSK_BASE + 0x14 #define ERR_CHKDSK_NO_FIX_SECTOR0 ERROR_CHKDSK_BASE + 0x15 #define ERR_NOT_INIT 0xFFFF00D0 #define ERR_NOT_READ 0xFFFF00E0 #define ERROR_MEM_BASE 0xFFFF00F0 #define ERR_CMEM_NO_MEM ERROR_MEM_BASE + 1 #define ERR_HMEM_NO_MEM ERROR_MEM_BASE + 2 #define ERRSTK_DEFAULT_SIZE 20 typedef ULONG ERRCODE; // errco #if !defined( ERRSTACK_DEFN ) #define ERRSTACK_DEFN // this has to be defined in the .exe and has to use this name. class ERRSTACK; typedef ERRSTACK* PERRSTACK; extern ERRSTACK *perrstk; class ERRSTACK { public: void push (ERRCODE errIn, CLASS_ID idIn) { (void)(errIn); (void)(idIn); (void)(this); }; }; #define PUSH_ERR( x ) perrstk->push( x, QueryClassId() ); #endif // !defined ERRSTACK_DEFN #if 0 // BUGBUG fix /***************************************************************************\ CLASS: ERROR PURPOSE: Class to hold an error code. INTERFACE: ERROR constructs and init error with class id and error code SetErr Sets the error code QueryErr returns current error code SetId Set id used to identify class that had error. QueryClassId returns current class id SetMsg Sets pointer to message object QueryMsg Returns pointer to message object SetIdErrMsg Sets err, id and message at same time NOTES: Any error that is to be passed up the stack should be put into an error object and put in the ERRSTK object. All references to ERRSTK are through the ulib defined global perrstk. All users of ERRSTK should declare: #include "error.hxx"; extern ERRSTK * perrstk; The ERROR object contains the error code, the class id (see object.hxx) and an optional pointer to a MESSAGE object. Error codes are defined with error.hxx. These are the error codes specific to the utility objects. All error codes generated from outside of OS/2 need to be mapped to this set of error codes. Specifically the C runtime error codes will have to be mapped to an error code defined in error.hxx. An error code returned from an OS/2 call is put directly into the ERROR object. An error code from the C runtime has to be mapped to some error code defined in error.hxx. The class id is defined in object.hxx. Each class has a unique class id. This can be found be using the QueryClassId method on any object. If the error does not occur within an object then use ID_NOT_AN_OBJECT. This is a generic class id defined for this purpose. If a more specific location is needed and the error is not in an object then define a new class id substracting from ID_BASE as shown in object.hxx with the ID_NOT_AN_OBJECT example. The optional pointer to a MESSAGE object can be used latter to process the ERROR and recover context specific information about the ERROR. There will need to be a message id defined for the error. HISTORY: 4-1-90 KEYWORDS: ERROR CLASS_ID SEEALSO: ERRSTK \***************************************************************************/ #if !defined (ERROR_DEFN) #define ERROR_DEFN class MESSAGE; class ERROR : public OBJECT { // err private: ERRCODE err; CLASS_ID id; // const MESSAGE * pmsg; public: ERROR (); // ERROR (ERRCODE errIn, CLASS_ID idIn, const MESSAGE *pmsgIn = (MESSAGE *)NULL); ~ERROR (); ERROR & operator= (ERROR & ); BOOL SetErr (ERRCODE errIn) {return(err = errIn);} ERRCODE QueryErr () {return(err);} BOOL SetId (CLASS_ID idIn) {return(id = idIn); } CLASS_ID QueryClassId () {return(id); } // ERROR * PutIdErrMsg (CLASS_ID idIn, ERRCODE errIn, const MESSAGE * pmsgIn = (const MESSAGE *)NULL) {id = idIn; pmsg = pmsgIn; err = errIn; return(this); } // const MESSAGE * PutMsg (MESSAGE * pmsgIn) { return(pmsg = pmsgIn); } // const MESSAGE * GetMsg () { return(pmsg); } #if defined (DEBUG) BOOL print (); #endif }; #if defined( DEBUG_STOP_PUSHERR ) #define PUSH_ERR( x ) DebugPrintAbort( "PUSH_ERR called" ); #else #define PUSH_ERR( x ) (void)*perrstk->push( x, QueryClassId() ); #endif // DEBUG #endif // ERROR_DEFN /***************************************************************************\ CLASS: ERRSTACK PURPOSE: Hold a stack of error objects INTERFACE: ERRSTACK creates an array of error obj. pointers ~ERRSTACK deletes array of errors. (calls ~ERROR on each) push push an error object onto the stack. There are two signatures one for pointer to error objectg the other for error code, class id and message pop pop the top error object off the stack QueryCount Query number of errors on the stack QueryTop Query Top index to stack. QuerySize Query size in pointer of stack ClearStack Clear all error from stack (deletes error objects) NOTES: Each exe should declare with global scope an object of type ERRSTK. If you include error.hxx a pointer called perrstk will be declared. perrstk = NEW ERRSTK should be done at the start of the program. The default size for the error stack will be ERRSTK_DEFAULT_SIZE. If the error stack cannot be constructed the the program should abort. One slot is always reserved in the stack to hold an overflow error. If ERRSTK_DEFAULT_SIZE stack is allocated then the actual size of the stack is ERRSTK_DEFAULT_SIZE + 1. The overflow error will also occur at index 0. Index ERRSTK_DEFAULT_SIZE - 1 is the bottom of the stack. Unless an overflow has occured the stack index will not go below 1. Note that QuerySize will return the original size passed in plus 1. QueryCountError will include a stack overflow error. The ERROR object passed to the stack is copied before it is pushed. The caller is responsible for deleting the object. HISTORY: 3-6-90 KEYWORDS: ERRSTK SEEALSO: ERROR CLASS_ID \***************************************************************************/ #if !defined (ERRSTK_DEFN) #define ERRSTK_DEFN class ERRSTACK : public OBJECT { // errstk public: ERRSTACK (ULONG cpoInitIn = ERRSTK_DEFAULT_SIZE, ULONG cpoIncIn = 0); ~ERRSTACK (); ERROR * push (const ERROR * ); ERROR * push (ERRCODE errIn, CLASS_ID idIn); ERROR * pop (); ULONG QueryCount () { return(ipoCur); } ULONG QueryTop () { return(ipoCur); } ULONG QuerySize () { return(cpoMax); } ULONG ClearStack (); #ifdef DEBUG ULONG print (); #endif private: ERROR * AllocError(); ULONG ipoCur; // index to top of stack ULONG cpoMax; // index to bottom of stack ULONG cpoInc; // bytes to add for each realloc ULONG cpoInit; // initial alloc. (used by ClearStack ERROR ** papo; // pointer to stack bottom }; #endif // ERRSTK_DEFN #endif // BUGBUG