1 // Copyright (c) 1996 James Clark
2 // See the file copying.txt for copying permission.
4 #ifndef DssslSpecEventHandler_INCLUDED
5 #define DssslSpecEventHandler_INCLUDED 1
7 #include "ErrorCountEventHandler.h"
13 #include "InputSource.h"
17 #include "IListIter.h"
20 #ifdef DSSSL_NAMESPACE
21 namespace DSSSL_NAMESPACE {
24 class DssslSpecEventHandler
25 : private ErrorCountEventHandler, private ArcDirector {
27 class BodyElement : public Link {
29 virtual ~BodyElement();
30 virtual void makeInputSource(DssslSpecEventHandler &, Owner<InputSource> &) = 0;
33 class ImmediateBodyElement : public BodyElement {
35 ImmediateBodyElement(Text &);
36 void makeInputSource(DssslSpecEventHandler &, Owner<InputSource> &);
41 class EntityBodyElement : public BodyElement {
43 EntityBodyElement(const ConstPtr<Entity> &);
44 void makeInputSource(DssslSpecEventHandler &, Owner<InputSource> &);
46 ConstPtr<Entity> entity_;
52 class MapSdataEntityElement;
54 class DeclarationElement : public Link {
70 DeclarationElement(Type);
71 void makeInputSource(DssslSpecEventHandler&, Owner<InputSource>&);
73 void setContent(Text &);
74 void setName(const StringC &s) { name_ = s; };
75 const StringC &name() { return name_; };
76 void setText(const StringC &s) { text_ = s; };
77 const StringC &text() { return text_; };
78 void setModadd(const StringC &s) { modadd_ = s; };
79 const StringC &modadd() { return modadd_; };
80 void setDesc(const StringC &s) { desc_ = s; };
81 const StringC &desc() { return desc_; };
92 class PartHeader : public Link {
94 PartHeader(Doc *, const StringC &id);
95 const StringC &id() const;
96 Part *resolve(DssslSpecEventHandler &);
97 void setPart(SpecPart *);
98 void setRefLoc(const Location &);
102 // Location of first reference
104 Owner<SpecPart> specPart_;
111 virtual Part *resolve(DssslSpecEventHandler &) = 0;
114 class ExternalPart : public SpecPart {
116 ExternalPart(PartHeader *);
117 Part *resolve(DssslSpecEventHandler &);
122 class ExternalFirstPart : public SpecPart {
124 ExternalFirstPart(Doc *);
125 Part *resolve(DssslSpecEventHandler &);
130 class Part : public SpecPart {
132 typedef IListIter<BodyElement> Iter;
133 typedef IListIter<DeclarationElement> DIter;
138 const Vector<PartHeader *> &use() const;
139 void addUse(PartHeader *);
140 void append(BodyElement *);
141 void append(DeclarationElement *);
142 bool setMark(bool = 1);
144 Part *resolve(DssslSpecEventHandler &);
145 IList<DeclarationElement> declarations_;
146 IList<BodyElement> bodyElements_;
147 Vector<PartHeader *> use_;
152 class Doc : public Link {
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 &);
161 void load(DssslSpecEventHandler &);
162 void append(DeclarationElement *);
163 const StringC &sysid() const;
167 IList<DeclarationElement> declarations_;
168 IList<PartHeader> headers_;
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 &);
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 *,
192 const Vector<StringC> &,
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 *);
209 const CharsetInfo *charset_;
210 DeclarationElement *currentDecl_;
212 friend class EntityBodyElement;
213 friend class PartHeader;
217 const StringC &DssslSpecEventHandler::PartHeader::id() const
223 void DssslSpecEventHandler::PartHeader::setPart(SpecPart *part)
229 void DssslSpecEventHandler::Part::addUse(PartHeader *header)
231 use_.push_back(header);
235 const Vector<DssslSpecEventHandler::PartHeader *> &
236 DssslSpecEventHandler::Part::use() const
242 const StringC &DssslSpecEventHandler::Doc::sysid() const
248 DssslSpecEventHandler::Part::Iter DssslSpecEventHandler::Part::iter()
250 return Iter(bodyElements_);
254 DssslSpecEventHandler::Part::DIter DssslSpecEventHandler::Part::diter()
256 return DIter(declarations_);
260 DssslSpecEventHandler::Part::DIter DssslSpecEventHandler::Doc::diter()
262 return Part::DIter(declarations_);
266 bool DssslSpecEventHandler::Part::setMark(bool b)
273 #ifdef DSSSL_NAMESPACE
277 #endif /* not DssslSpecEventHandler_INCLUDED */