2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: Event.C /main/1 1996/07/29 16:51:15 cde-hp $ */
24 // Copyright (c) 1994 James Clark
25 // See the file COPYING for copying permission.
28 #pragma implementation
33 #include "Attribute.h"
34 #include "EventQueue.h"
37 namespace SP_NAMESPACE {
40 void Event::copyData()
44 LocatedEvent::LocatedEvent(Type type, const Location &location)
45 : location_(location), Event(type)
49 MarkupEvent::MarkupEvent(Type type)
50 : LocatedEvent(type, Location())
54 MarkupEvent::MarkupEvent(Type type, const Location &loc, Markup *markup)
55 : LocatedEvent(type, loc)
58 markup->swap(markup_);
61 StartElementEvent::StartElementEvent(const ElementType *elementType,
62 const ConstPtr<Dtd> &dtd,
63 AttributeList *attributes,
64 const Location &startLocation,
66 : LocatedEvent(startElement, startLocation),
67 elementType_(elementType),
72 attributes_(attributes)
76 StartElementEvent::~StartElementEvent()
84 void StartElementEvent::copyData()
88 AttributeList *p = new AttributeList;
89 attributes_->swap(*p);
93 Markup *p = new Markup;
101 EndElementEvent::EndElementEvent(const ElementType *elementType,
102 const ConstPtr<Dtd> &dtd,
103 const Location &startLocation,
105 : LocatedEvent(endElement, startLocation),
106 elementType_(elementType),
114 EndElementEvent::~EndElementEvent()
120 void EndElementEvent::copyData()
124 Markup *p = new Markup;
132 DataEvent::DataEvent(Type type, const Char *p, size_t length,
133 const Location &location)
134 : p_(p),length_(length), LocatedEvent(type, location)
138 const Entity *DataEvent::entity() const
143 Boolean DataEvent::isRe(unsigned long &) const
148 ImmediateDataEvent::ImmediateDataEvent(Type type, const Char *p, size_t length,
149 const Location &location,
151 : DataEvent(type, p, length, location), alloc_(0)
154 ImmediateDataEvent::copyData();
157 ImmediateDataEvent::~ImmediateDataEvent()
163 void ImmediateDataEvent::copyData()
166 alloc_ = new Char[length_];
167 memcpy(alloc_, p_, length_*sizeof(Char));
172 ReEvent::ReEvent(const Char *p, const Location &location, unsigned long serial)
173 : ImmediateDataEvent(characterData, p, 1, location, 0),
178 Boolean ReEvent::isRe(unsigned long &serial) const
184 DataEntityEvent::DataEntityEvent(Type type, const InternalEntity *entity,
185 const ConstPtr<Origin> &origin)
187 entity->string().data(),
188 entity->string().size(),
193 const Entity *DataEntityEvent::entity() const
195 return location().origin()->asEntityOrigin()->entity().pointer();
198 CdataEntityEvent::CdataEntityEvent(const InternalEntity *entity,
199 const ConstPtr<Origin> &origin)
200 : DataEntityEvent(characterData, entity, origin)
204 SdataEntityEvent::SdataEntityEvent(const InternalEntity *entity,
205 const ConstPtr<Origin> &origin)
206 : DataEntityEvent(sdataEntity, entity, origin)
210 MessageEvent::MessageEvent(const Message &m)
211 : Event(Event::message), message_(m)
215 MessageEvent::MessageEvent(Message &m)
216 : Event(Event::message)
221 PiEvent::PiEvent(const Char *data, size_t dataLength, const Location &location)
222 : data_(data), dataLength_(dataLength), LocatedEvent(pi, location)
226 const Entity *PiEvent::entity() const
231 PiEntityEvent::PiEntityEvent(const PiEntity *entity,
232 const ConstPtr<Origin> &origin)
233 : PiEvent(entity->string().data(), entity->string().size(),
238 const Entity *PiEntityEvent::entity() const
240 return location().origin()->asEntityOrigin()->entity().pointer();
243 ImmediatePiEvent::ImmediatePiEvent(StringC &str, const Location &loc)
244 : PiEvent(str.data(), str.size(), loc)
249 ExternalEntityEvent::ExternalEntityEvent(Type type,
250 const ConstPtr<EntityOrigin> &origin)
251 : origin_(origin), Event(type)
255 ExternalDataEntityEvent::ExternalDataEntityEvent(const ExternalDataEntity *entity,
256 const ConstPtr<EntityOrigin> &origin)
257 : dataEntity_(entity), ExternalEntityEvent(externalDataEntity, origin)
261 SubdocEntityEvent::SubdocEntityEvent(const SubdocEntity *entity,
262 const ConstPtr<EntityOrigin> &origin)
263 : subdocEntity_(entity), ExternalEntityEvent(subdocEntity, origin)
267 AppinfoEvent::AppinfoEvent(const Location &location)
268 : LocatedEvent(appinfo, location), appinfoNone_(1)
272 AppinfoEvent::AppinfoEvent(const Text &text, const Location &location)
273 : LocatedEvent(appinfo, location), appinfoNone_(0), appinfo_(text)
277 UselinkEvent::UselinkEvent(const ConstPtr<Lpd> &lpd,
278 const LinkSet *linkSet,
282 : MarkupEvent(uselink, loc, markup),
289 UsemapEvent::UsemapEvent(const ShortReferenceMap *map,
290 Vector<const ElementType *> &elements,
291 const ConstPtr<Dtd> &dtd,
294 : MarkupEvent(usemap, loc, markup),
298 elements.swap(elements_);
301 StartSubsetEvent::StartSubsetEvent(Type type,
303 const ConstPtr<Entity> &entity,
304 Boolean hasInternalSubset,
307 : name_(name), entity_(entity), hasInternalSubset_(hasInternalSubset),
308 MarkupEvent(type, loc, markup)
312 StartDtdEvent::StartDtdEvent(const StringC &name,
313 const ConstPtr<Entity> &entity,
314 Boolean hasInternalSubset,
317 : StartSubsetEvent(startDtd, name, entity, hasInternalSubset, loc, markup)
321 StartLpdEvent::StartLpdEvent(Boolean active,
323 const ConstPtr<Entity> &entity,
324 Boolean hasInternalSubset,
327 : StartSubsetEvent(startLpd, name, entity, hasInternalSubset, loc, markup),
332 EndDtdEvent::EndDtdEvent(const ConstPtr<Dtd> &dtd,
335 : MarkupEvent(endDtd, loc, markup), dtd_(dtd)
339 EndLpdEvent::EndLpdEvent(const ConstPtr<Lpd> &lpd,
342 : MarkupEvent(endLpd, loc, markup), lpd_(lpd)
346 EndPrologEvent::EndPrologEvent(const ConstPtr<Dtd> &dtd,
347 const ConstPtr<ComplexLpd> &lpd,
348 Vector<StringC> &simpleLinkNames,
349 Vector<AttributeList> &simpleLinkAttributes,
350 const Location &location)
351 : LocatedEvent(endProlog, location), dtd_(dtd), lpd_(lpd)
353 simpleLinkAttributes.swap(simpleLinkAttributes_);
354 simpleLinkNames.swap(simpleLinkNames_);
357 EndPrologEvent::EndPrologEvent(const ConstPtr<Dtd> &dtd,
358 const Location &location)
359 : LocatedEvent(endProlog, location), dtd_(dtd)
363 SgmlDeclEvent::SgmlDeclEvent(const ConstPtr<Sd> &sd,
364 const ConstPtr<Syntax> &syntax)
366 : sd_(sd), prologSyntax_(syntax), instanceSyntax_(syntax),
367 nextIndex_(0), MarkupEvent(sgmlDecl)
371 SgmlDeclEvent::SgmlDeclEvent(const ConstPtr<Sd> &sd,
372 const ConstPtr<Syntax> &prologSyntax,
373 const ConstPtr<Syntax> &instanceSyntax,
374 const ConstPtr<Sd> &refSd,
375 const ConstPtr<Syntax> &refSyntax,
377 const StringC &implySystemId,
380 : sd_(sd), prologSyntax_(prologSyntax), instanceSyntax_(instanceSyntax),
381 refSd_(refSd), refSyntax_(refSyntax),
382 nextIndex_(nextIndex), implySystemId_(implySystemId),
383 MarkupEvent(sgmlDecl, loc, markup)
387 CommentDeclEvent::CommentDeclEvent(const Location &loc,
389 : MarkupEvent(commentDecl, loc, markup)
393 SSepEvent::SSepEvent(const Char *p, size_t length,
394 const Location &location, Boolean copy)
395 : ImmediateDataEvent(sSep, p, length, location, copy)
399 IgnoredRsEvent::IgnoredRsEvent(Char c, const Location &location)
400 : LocatedEvent(ignoredRs, location), c_(c)
404 IgnoredReEvent::IgnoredReEvent(Char c, const Location &location,
405 unsigned long serial)
406 : LocatedEvent(ignoredRe, location),
412 ReOriginEvent::ReOriginEvent(Char c, const Location &location,
413 unsigned long serial)
414 : LocatedEvent(reOrigin, location), c_(c), serial_(serial)
419 IgnoredCharsEvent::IgnoredCharsEvent(const Char *p, size_t length,
420 const Location &location, Boolean copy)
421 : ImmediateDataEvent(ignoredChars, p, length, location, copy)
425 MarkedSectionEvent::MarkedSectionEvent(Type type, Status status,
428 : MarkupEvent(type, loc, markup),
433 MarkedSectionStartEvent::MarkedSectionStartEvent(Status status,
436 : MarkedSectionEvent(markedSectionStart, status, loc, markup)
440 MarkedSectionEndEvent::MarkedSectionEndEvent(Status status,
443 : MarkedSectionEvent(markedSectionEnd, status, loc, markup)
447 EntityStartEvent::EntityStartEvent(const ConstPtr<EntityOrigin> &origin)
448 : Event(entityStart), origin_(origin)
452 EntityEndEvent::EntityEndEvent(const Location &location)
453 : LocatedEvent(entityEnd, location)
457 EntityDeclEvent:: EntityDeclEvent(const ConstPtr<Entity> &entity,
458 Boolean ignored, const Location &loc,
460 : MarkupEvent(entityDecl, loc, markup),
466 NotationDeclEvent:: NotationDeclEvent(const ConstPtr<Notation> ¬ation,
469 : MarkupEvent(notationDecl, loc, markup), notation_(notation)
473 ElementDeclEvent::ElementDeclEvent(Vector<const ElementType *> &elements,
474 const ConstPtr<Dtd> &dtd,
477 : MarkupEvent(elementDecl, loc, markup), dtd_(dtd)
479 elements.swap(elements_);
482 AttlistDeclEvent::AttlistDeclEvent(Vector<const ElementType *> &elements,
483 const ConstPtr<Dtd> &dtd,
486 : MarkupEvent(attlistDecl, loc, markup), dtd_(dtd)
488 elements.swap(elements_);
491 AttlistNotationDeclEvent::AttlistNotationDeclEvent(
492 Vector<ConstPtr<Notation> > ¬ations, const Location &loc,
494 : MarkupEvent(attlistNotationDecl, loc, markup)
496 notations.swap(notations_);
500 ::LinkAttlistDeclEvent(Vector<const ElementType *> &elements,
501 const ConstPtr<Lpd> &lpd,
504 : MarkupEvent(linkAttlistDecl, loc, markup), lpd_(lpd)
506 elements.swap(elements_);
509 LinkDeclEvent::LinkDeclEvent(const LinkSet *linkSet,
510 const ConstPtr<ComplexLpd> &lpd,
513 : MarkupEvent(linkDecl, loc, markup), lpd_(lpd), linkSet_(linkSet)
517 IdLinkDeclEvent::IdLinkDeclEvent(const ConstPtr<ComplexLpd> &lpd,
520 : MarkupEvent(linkDecl, loc, markup), lpd_(lpd)
524 ShortrefDeclEvent::ShortrefDeclEvent(const ShortReferenceMap *map,
525 const ConstPtr<Dtd> &dtd,
528 : MarkupEvent(shortrefDecl, loc, markup), map_(map), dtd_(dtd)
532 IgnoredMarkupEvent::IgnoredMarkupEvent(const Location &loc,
534 : MarkupEvent(ignoredMarkup, loc, markup)
538 EntityDefaultedEvent::EntityDefaultedEvent(const ConstPtr<Entity> &entity,
540 : LocatedEvent(entityDefaulted, loc), entity_(entity)
544 SgmlDeclEntityEvent:: SgmlDeclEntityEvent(const PublicId &publicId,
545 PublicId::TextClass entityType,
546 const StringC &effectiveSystemId,
548 : LocatedEvent(sgmlDeclEntity, loc), publicId_(publicId),
549 entityType_(entityType), effectiveSystemId_(effectiveSystemId)
553 EventHandler::~EventHandler()
557 EventQueue::EventQueue()
561 #define EVENT(c, f) \
562 void EventHandler::f(c *event) { delete event; } \
563 void EventQueue::f(c *event) { append(event); } \
564 void c::handle(EventHandler &handler) { handler.f(this); }
568 Pass1EventHandler::Pass1EventHandler()
569 : hadError_(0), origHandler_(0)
573 void Pass1EventHandler::init(EventHandler *origHandler)
576 origHandler_ = origHandler;
579 void Pass1EventHandler::message(MessageEvent *event)
581 if (event->message().isError()) {
583 origHandler_->message(event);
586 IQueue<Event>::append(event);