Join with aliencode
[ntk/apt.git] / apt-pkg / contrib / error.h
CommitLineData
578bfd0a
AL
1// -*- mode: cpp; mode: fold -*-
2// Description /*{{{*/
b2e465d6 3// $Id: error.h,v 1.7 2001/02/20 07:03:17 jgg Exp $
578bfd0a
AL
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 /*}}}*/
578bfd0a
AL
40#ifndef PKGLIB_ERROR_H
41#define PKGLIB_ERROR_H
42
6c139d6e 43#ifdef __GNUG__
094a497d 44#pragma interface "apt-pkg/error.h"
6c139d6e
AL
45#endif
46
b2e465d6
AL
47#ifdef __GNUG__
48// Methods have a hidden this parameter that is visible to this attribute
49#define APT_MFORMAT1 __attribute__ ((format (printf, 2, 3)))
50#define APT_MFORMAT2 __attribute__ ((format (printf, 3, 4)))
51#else
52#define APT_MFORMAT1
53#define APT_MFORMAT2
54#endif
55
578bfd0a 56#include <string>
578bfd0a
AL
57
58class GlobalError
59{
60 struct Item
61 {
62 string Text;
63 bool Error;
6c139d6e 64 Item *Next;
578bfd0a
AL
65 };
66
6c139d6e 67 Item *List;
578bfd0a 68 bool PendingFlag;
6c139d6e 69 void Insert(Item *I);
578bfd0a
AL
70
71 public:
72
73 // Call to generate an error from a library call.
b2e465d6
AL
74 bool Errno(const char *Function,const char *Description,...) APT_MFORMAT2;
75 bool WarningE(const char *Function,const char *Description,...) APT_MFORMAT2;
578bfd0a
AL
76
77 /* A warning should be considered less severe than an error, and may be
78 ignored by the client. */
b2e465d6
AL
79 bool Error(const char *Description,...) APT_MFORMAT1;
80 bool Warning(const char *Description,...) APT_MFORMAT1;
578bfd0a
AL
81
82 // Simple accessors
83 inline bool PendingError() {return PendingFlag;};
6c139d6e 84 inline bool empty() {return List == 0;};
578bfd0a 85 bool PopMessage(string &Text);
6c139d6e 86 void Discard();
578bfd0a
AL
87
88 // Usefull routine to dump to cerr
89 void DumpErrors();
90
91 GlobalError();
92};
93
6f27a7fc
AL
94// The 'extra-ansi' syntax is used to help with collisions.
95GlobalError *_GetErrorObj();
96#define _error _GetErrorObj()
578bfd0a 97
b2e465d6
AL
98#undef APT_MFORMAT1
99#undef APT_MFORMAT2
100
578bfd0a 101#endif