1 : // -*- mode: cpp; mode: fold -*-
2 : // Description /*{{{*/
3 : // $Id: error.h,v 1.8 2001/05/07 05:06:52 jgg Exp $
4 : /* ######################################################################
5 :
6 : Global Erorr Class - Global error mechanism
7 :
8 : This class has a single global instance. When a function needs to
9 : generate an error condition, such as a read error, it calls a member
10 : in this class to add the error to a stack of errors.
11 :
12 : By using a stack the problem with a scheme like errno is removed and
13 : it allows a very detailed account of what went wrong to be transmitted
14 : to the UI for display. (Errno has problems because each function sets
15 : errno to 0 if it didn't have an error thus eraseing erno in the process
16 : of cleanup)
17 :
18 : Several predefined error generators are provided to handle common
19 : things like errno. The general idea is that all methods return a bool.
20 : If the bool is true then things are OK, if it is false then things
21 : should start being undone and the stack should unwind under program
22 : control.
23 :
24 : A Warning should not force the return of false. Things did not fail, but
25 : they might have had unexpected problems. Errors are stored in a FIFO
26 : so Pop will return the first item..
27 :
28 : I have some thoughts about extending this into a more general UI<->
29 : Engine interface, ie allowing the Engine to say 'The disk is full' in
30 : a dialog that says 'Panic' and 'Retry'.. The error generator functions
31 : like errno, Warning and Error return false always so this is normal:
32 : if (open(..))
33 : return _error->Errno(..);
34 :
35 : This source is placed in the Public Domain, do with it what you will
36 : It was originally written by Jason Gunthorpe.
37 :
38 : ##################################################################### */
39 : /*}}}*/
40 : #ifndef PKGLIB_ERROR_H
41 : #define PKGLIB_ERROR_H
42 :
43 :
44 :
45 : #ifdef __GNUG__
46 : // Methods have a hidden this parameter that is visible to this attribute
47 : #define APT_MFORMAT1 __attribute__ ((format (printf, 2, 3)))
48 : #define APT_MFORMAT2 __attribute__ ((format (printf, 3, 4)))
49 : #else
50 : #define APT_MFORMAT1
51 : #define APT_MFORMAT2
52 : #endif
53 :
54 : #include <string>
55 :
56 : using std::string;
57 :
58 : class GlobalError
59 : {
60 : struct Item
61 : {
62 : string Text;
63 : bool Error;
64 : Item *Next;
65 : };
66 :
67 : Item *List;
68 : bool PendingFlag;
69 : void Insert(Item *I);
70 :
71 : public:
72 :
73 : // Call to generate an error from a library call.
74 : bool Errno(const char *Function,const char *Description,...) APT_MFORMAT2;
75 : bool WarningE(const char *Function,const char *Description,...) APT_MFORMAT2;
76 :
77 : /* A warning should be considered less severe than an error, and may be
78 : ignored by the client. */
79 : bool Error(const char *Description,...) APT_MFORMAT1;
80 : bool Warning(const char *Description,...) APT_MFORMAT1;
81 :
82 : // Simple accessors
83 3 : inline bool PendingError() {return PendingFlag;};
84 0 : inline bool empty() {return List == 0;};
85 : bool PopMessage(string &Text);
86 : void Discard();
87 :
88 : // Usefull routine to dump to cerr
89 : void DumpErrors();
90 :
91 : GlobalError();
92 : };
93 :
94 : // The 'extra-ansi' syntax is used to help with collisions.
95 : GlobalError *_GetErrorObj();
96 : #define _error _GetErrorObj()
97 :
98 : #undef APT_MFORMAT1
99 : #undef APT_MFORMAT2
100 :
101 : #endif
|