1 // Copyright (c) 1996 James Clark
2 // See the file copying.txt for copying permission.
3 
4 #ifndef DssslSpecEventHandler_INCLUDED
5 #define DssslSpecEventHandler_INCLUDED 1
6 
7 #include "ErrorCountEventHandler.h"
8 #include "ArcEngine.h"
9 #include "Message.h"
10 #include "Text.h"
11 #include "Owner.h"
12 #include "Boolean.h"
13 #include "InputSource.h"
14 #include "Vector.h"
15 #include "NCVector.h"
16 #include "IList.h"
17 #include "IListIter.h"
18 #include "StringC.h"
19 
20 #ifdef DSSSL_NAMESPACE
21 namespace DSSSL_NAMESPACE {
22 #endif
23 
24 class DssslSpecEventHandler
25 : private ErrorCountEventHandler, private ArcDirector {
26 public:
27   class BodyElement : public Link {
28   public:
29     virtual ~BodyElement();
30     virtual void makeInputSource(DssslSpecEventHandler &, Owner<InputSource> &) = 0;
31   };
32 
33   class ImmediateBodyElement : public BodyElement {
34   public:
35     ImmediateBodyElement(Text &);
36     void makeInputSource(DssslSpecEventHandler &, Owner<InputSource> &);
37   private:
38     Text text_;
39   };
40 
41   class EntityBodyElement : public BodyElement {
42   public:
43     EntityBodyElement(const ConstPtr<Entity> &);
44     void makeInputSource(DssslSpecEventHandler &, Owner<InputSource> &);
45   private:
46     ConstPtr<Entity> entity_;
47   };
48 
49   class SpecPart;
50   class Doc;
51   class Part;
52   class MapSdataEntityElement;
53 
54   class DeclarationElement : public Link {
55   public:
56     enum Type {
57       features,
58       basesetEncoding,
59       literalDescribedChar,
60       addNameChars,
61       addSeparatorChars,
62       standardChars,
63       otherChars,
64       combineChar,
65       mapSdataEntity,
66       charRepertoire,
67       sgmlGrovePlan,
68     };
69 
70     DeclarationElement(Type);
71     void makeInputSource(DssslSpecEventHandler&, Owner<InputSource>&);
72     Type type() const;
73     void setContent(Text &);
setName(const StringC & s)74     void setName(const StringC &s) { name_ = s; };
name()75     const StringC &name() { return name_; };
setText(const StringC & s)76     void setText(const StringC &s) { text_ = s; };
text()77     const StringC &text() { return text_; };
setModadd(const StringC & s)78     void setModadd(const StringC &s) { modadd_ = s; };
modadd()79     const StringC &modadd() { return modadd_; };
setDesc(const StringC & s)80     void setDesc(const StringC &s) { desc_ = s; };
desc()81     const StringC &desc() { return desc_; };
82 
83   private:
84     Type type_;
85     Text content_;
86     StringC name_;
87     StringC text_;
88     StringC modadd_;
89     StringC desc_;
90   };
91 
92   class PartHeader : public Link {
93   public:
94     PartHeader(Doc *, const StringC &id);
95     const StringC &id() const;
96     Part *resolve(DssslSpecEventHandler &);
97     void setPart(SpecPart *);
98     void setRefLoc(const Location &);
99   private:
100     Doc *doc_;
101     StringC id_;
102     // Location of first reference
103     Location refLoc_;
104     Owner<SpecPart> specPart_;
105   };
106 
107 
108   class SpecPart {
109   public:
110     virtual ~SpecPart();
111     virtual Part *resolve(DssslSpecEventHandler &) = 0;
112   };
113 
114   class ExternalPart : public SpecPart {
115   public:
116     ExternalPart(PartHeader *);
117     Part *resolve(DssslSpecEventHandler &);
118   private:
119     PartHeader *header_;
120   };
121 
122   class ExternalFirstPart : public SpecPart {
123   public:
124     ExternalFirstPart(Doc *);
125     Part *resolve(DssslSpecEventHandler &);
126   private:
127     Doc *doc_;
128   };
129 
130   class Part : public SpecPart {
131   public:
132     typedef IListIter<BodyElement> Iter;
133     typedef IListIter<DeclarationElement> DIter;
134     Part(Doc *);
135     Iter iter();
136     DIter diter();
137     Doc *doc();
138     const Vector<PartHeader *> &use() const;
139     void addUse(PartHeader *);
140     void append(BodyElement *);
141     void append(DeclarationElement *);
142     bool setMark(bool = 1);
143   private:
144     Part *resolve(DssslSpecEventHandler &);
145     IList<DeclarationElement> declarations_;
146     IList<BodyElement> bodyElements_;
147     Vector<PartHeader *> use_;
148     bool mark_;
149     Doc *doc_;
150   };
151 
152   class Doc : public Link {
153   public:
154     Doc();
155     Doc(const StringC &sysid);
156     void setLocation(const Location &);
157     PartHeader *refPart(const StringC &);
158     PartHeader *refPart(const StringC &, const Location &refLoc);
159     Part *resolveFirstPart(DssslSpecEventHandler &);
160     Part::DIter diter();
161     void load(DssslSpecEventHandler &);
162     void append(DeclarationElement *);
163     const StringC &sysid() const;
164   private:
165     bool loaded_;
166     StringC sysid_;
167     IList<DeclarationElement> declarations_;
168     IList<PartHeader> headers_;
169     Location loc_;
170     friend class Part;
171   };
172   DssslSpecEventHandler(Messenger &);
173   void load(SgmlParser &specParser, const CharsetInfo &, const StringC &id,
174 	    Vector<Part *> &parts);
175   void externalSpecificationStart(const StartElementEvent &);
176   void externalSpecificationEnd(const EndElementEvent &);
177   void styleSpecificationStart(const StartElementEvent &);
178   void styleSpecificationEnd(const EndElementEvent &);
179   void styleSpecificationBodyStart(const StartElementEvent &);
180   void styleSpecificationBodyEnd(const EndElementEvent &);
181   void declarationStart(const StartElementEvent &);
182   void declarationEnd(const EndElementEvent &);
183 private:
184   Vector<Part *> &parts();
185   void startElement(StartElementEvent *);
186   void endElement(EndElementEvent *);
187   void data(DataEvent *);
188   void message(MessageEvent *);
189   void endProlog(EndPrologEvent *);
190   EventHandler *arcEventHandler(const StringC *,
191 		  		const Notation *,
192 				const Vector<StringC> &,
193 				const SubstTable *);
194   void loadDoc(SgmlParser &, Doc &);
195   void resolveParts(Part *, Vector<Part *> &);
196   Doc *findDoc(const StringC &);
197   const StringC *attributeString(const StartElementEvent &, const char *);
198   const Text *attributeText(const StartElementEvent &, const char *);
199   ConstPtr<Entity> attributeEntity(const StartElementEvent &, const char *);
200 
201   Messenger *mgr_;
202   bool gotArc_;
203   bool gatheringBody_;
204   Part *currentPart_;
205   Text currentBody_;
206   Doc *currentDoc_;
207   IList<Doc> docs_;
208   SgmlParser *parser_;
209   const CharsetInfo *charset_;
210   DeclarationElement *currentDecl_;
211   friend class Doc;
212   friend class EntityBodyElement;
213   friend class PartHeader;
214 };
215 
216 inline
id()217 const StringC &DssslSpecEventHandler::PartHeader::id() const
218 {
219   return id_;
220 }
221 
222 inline
setPart(SpecPart * part)223 void DssslSpecEventHandler::PartHeader::setPart(SpecPart *part)
224 {
225   specPart_ = part;
226 }
227 
228 inline
addUse(PartHeader * header)229 void DssslSpecEventHandler::Part::addUse(PartHeader *header)
230 {
231   use_.push_back(header);
232 }
233 
234 inline
235 const Vector<DssslSpecEventHandler::PartHeader *> &
use()236 DssslSpecEventHandler::Part::use() const
237 {
238   return use_;
239 }
240 
241 inline
sysid()242 const StringC &DssslSpecEventHandler::Doc::sysid() const
243 {
244   return sysid_;
245 }
246 
247 inline
iter()248 DssslSpecEventHandler::Part::Iter DssslSpecEventHandler::Part::iter()
249 {
250   return Iter(bodyElements_);
251 }
252 
253 inline
diter()254 DssslSpecEventHandler::Part::DIter DssslSpecEventHandler::Part::diter()
255 {
256   return DIter(declarations_);
257 }
258 
259 inline
diter()260 DssslSpecEventHandler::Part::DIter DssslSpecEventHandler::Doc::diter()
261 {
262   return Part::DIter(declarations_);
263 }
264 
265 inline
setMark(bool b)266 bool DssslSpecEventHandler::Part::setMark(bool b)
267 {
268   bool tem = mark_;
269   mark_ = b;
270   return tem;
271 }
272 
273 #ifdef DSSSL_NAMESPACE
274 }
275 #endif
276 
277 #endif /* not DssslSpecEventHandler_INCLUDED */
278