Sync
[ntk/apt.git] / apt-pkg / contrib / error.h
1 // -*- mode: cpp; mode: fold -*-
2 // Description /*{{{*/
3 // $Id: error.h,v 1.2 1998/07/07 04:17:11 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 // Header section: pkglib
41 #ifndef PKGLIB_ERROR_H
42 #define PKGLIB_ERROR_H
43
44 #ifdef __GNUG__
45 #pragma interface "pkglib/error.h"
46 #endif
47
48 #include <string>
49
50 class GlobalError
51 {
52 struct Item
53 {
54 string Text;
55 bool Error;
56 Item *Next;
57 };
58
59 Item *List;
60 bool PendingFlag;
61 void Insert(Item *I);
62
63 public:
64
65 // Call to generate an error from a library call.
66 bool Errno(const char *Function,const char *Description,...);
67
68 /* A warning should be considered less severe than an error, and may be
69 ignored by the client. */
70 bool Error(const char *Description,...);
71 bool Warning(const char *Description,...);
72
73 // Simple accessors
74 inline bool PendingError() {return PendingFlag;};
75 inline bool empty() {return List == 0;};
76 bool PopMessage(string &Text);
77 void Discard();
78
79 // Usefull routine to dump to cerr
80 void DumpErrors();
81
82 GlobalError();
83 };
84
85 /* The 'extra-ansi' syntax is used to help with collisions. This is the
86 single global instance of this class. */
87 extern GlobalError *_error;
88
89 #endif