1 // Copyright (c) 1994 James Clark
2 // See the file COPYING for copying permission.
3 #pragma ident "%Z%%M% %I% %E% SMI"
4
5 #ifndef Message_INCLUDED
6 #define Message_INCLUDED 1
7
8 #ifdef __GNUG__
9 #pragma interface
10 #endif
11
12 #include <stddef.h>
13 #include "Location.h"
14 #include "Vector.h"
15 #include "CopyOwner.h"
16 #include "Boolean.h"
17 #include "StringC.h"
18 #include "MessageArg.h"
19
20 #ifdef SP_NAMESPACE
21 namespace SP_NAMESPACE {
22 #endif
23
24 class SP_API MessageFragment {
25 public:
26 enum {
27 libModule = 0,
28 appModule = 1
29 };
30 MessageFragment(unsigned module, unsigned number, const char *text = 0);
31 unsigned module() const;
32 unsigned number() const;
33 const char *text() const;
34 private:
35 unsigned short number_;
36 unsigned char module_;
37 protected:
38 unsigned char spare_;
39 private:
40 #ifndef SP_NO_MESSAGE_TEXT
41 const char *text_;
42 #endif
43 };
44
45 class SP_API MessageType : public MessageFragment {
46 public:
47 enum Severity {
48 info,
49 warning,
50 quantityError,
51 idrefError,
52 error
53 };
54 MessageType(Severity, unsigned module, unsigned number,
55 const char *text = 0, const char *auxText = 0);
56 Severity severity() const;
57 MessageFragment auxFragment() const;
58 Boolean isError() const;
59 private:
60 #ifndef SP_NO_MESSAGE_TEXT
61 const char *auxText_;
62 #endif
63 };
64
65
66 class SP_API MessageType0 : public MessageType {
67 public:
68 MessageType0(Severity, unsigned module, unsigned number, const char *text = 0);
69 };
70
71 class SP_API MessageType1 : public MessageType {
72 public:
73 MessageType1(Severity, unsigned module, unsigned number, const char *text = 0);
74 };
75
76 class SP_API MessageType2 : public MessageType {
77 public:
78 MessageType2(Severity, unsigned module, unsigned number, const char *text = 0);
79 };
80
81 class SP_API MessageType3 : public MessageType {
82 public:
83 MessageType3(Severity, unsigned module, unsigned number, const char *text = 0);
84 };
85
86 class SP_API MessageType4 : public MessageType {
87 public:
88 MessageType4(Severity, unsigned module, unsigned number, const char *text = 0);
89 };
90
91 class SP_API MessageType5 : public MessageType {
92 public:
93 MessageType5(Severity, unsigned module, unsigned number, const char *text = 0);
94 };
95
96 class SP_API MessageType6 : public MessageType {
97 public:
98 MessageType6(Severity, unsigned module, unsigned number, const char *text = 0);
99 };
100
101 class SP_API MessageType0L : public MessageType {
102 public:
103 MessageType0L(Severity, unsigned module, unsigned number, const char *text = 0,
104 const char *auxText = 0);
105 };
106
107 class SP_API MessageType1L : public MessageType {
108 public:
109 MessageType1L(Severity, unsigned module, unsigned number, const char *text = 0,
110 const char *auxText = 0);
111 };
112
113 class SP_API OpenElementInfo {
114 public:
115 OpenElementInfo();
116 PackedBoolean included;
117 StringC gi;
118 StringC matchType;
119 unsigned matchIndex;
120 };
121
122 class SP_API Message {
123 public:
124 Message();
125 Message(int nArgs);
126 const MessageType *type;
127 Location loc;
128 Location auxLoc;
129 Vector<CopyOwner<MessageArg> > args;
130 Vector<OpenElementInfo> openElementInfo;
131 void swap(Message &);
132 Boolean isError() const;
133 };
134
135 class SP_API Messenger {
136 public:
137 Messenger();
138 virtual ~Messenger();
139 void message(const MessageType0 &);
140 void message(const MessageType1 &, const MessageArg &);
141 void message(const MessageType2 &,
142 const MessageArg &,
143 const MessageArg &);
144 void message(const MessageType3 &,
145 const MessageArg &,
146 const MessageArg &,
147 const MessageArg &);
148 void message(const MessageType4 &,
149 const MessageArg &,
150 const MessageArg &,
151 const MessageArg &,
152 const MessageArg &);
153 void message(const MessageType5 &,
154 const MessageArg &,
155 const MessageArg &,
156 const MessageArg &,
157 const MessageArg &,
158 const MessageArg &);
159 void message(const MessageType6 &,
160 const MessageArg &,
161 const MessageArg &,
162 const MessageArg &,
163 const MessageArg &,
164 const MessageArg &,
165 const MessageArg &);
166 void message(const MessageType0L &, const Location &);
167 void message(const MessageType1L &, const MessageArg &, const Location &);
168 void setNextLocation(const Location &);
169 virtual void initMessage(Message &);
170 virtual void dispatchMessage(const Message &) = 0;
171 virtual void dispatchMessage(Message &);
172 private:
173 void doInitMessage(Message &);
174 Boolean haveNextLocation_;
175 Location nextLocation_;
176 };
177
178 class SP_API ForwardingMessenger : public Messenger {
179 public:
180 ForwardingMessenger(Messenger &);
181 void dispatchMessage(const Message &);
182 void dispatchMessage(Message &);
183 void initMessage(Message &);
184 private:
185 Messenger *to_;
186 };
187
188 class SP_API ParentLocationMessenger : public ForwardingMessenger {
189 public:
190 ParentLocationMessenger(Messenger &);
191 void initMessage(Message &);
192 };
193
194 class SP_API NullMessenger : public Messenger {
195 public:
196 NullMessenger();
197 void dispatchMessage(const Message &);
dispatchMessage(Message & tmp_message)198 void dispatchMessage(Message &tmp_message) {
199 dispatchMessage((const Message &)tmp_message);
200 };
201 };
202
203 inline
module()204 unsigned MessageFragment::module() const
205 {
206 return module_;
207 }
208
209 inline
number()210 unsigned MessageFragment::number() const
211 {
212 return number_;
213 }
214
215 inline
text()216 const char *MessageFragment::text() const
217 {
218 #ifdef SP_NO_MESSAGE_TEXT
219 return 0;
220 #else
221 return text_;
222 #endif
223 }
224
225 inline
severity()226 MessageType::Severity MessageType::severity() const
227 {
228 return Severity(spare_);
229 }
230
231 inline
auxFragment()232 MessageFragment MessageType::auxFragment() const
233 {
234 return MessageFragment(module(),
235 number() + 1,
236 #ifdef SP_NO_MESSAGE_TEXT
237 0
238 #else
239 auxText_
240 #endif
241 );
242 }
243
244 inline
isError()245 Boolean MessageType::isError() const
246 {
247 return severity() != info && severity() != warning;
248 }
249
250 inline
isError()251 Boolean Message::isError() const
252 {
253 return type->isError();
254 }
255
256 #ifdef SP_NAMESPACE
257 }
258 #endif
259
260 #endif /* not Message_INCLUDED */
261