00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _NSFIXUPFILTER_HPP
00023 #define _NSFIXUPFILTER_HPP
00024
00025 #include <xqilla/events/EventHandler.hpp>
00026
00027 class XPath2MemoryManager;
00028
00029 class XQILLA_API NSFixupFilter : public EventFilter
00030 {
00031 public:
00032 NSFixupFilter(EventHandler *next, XPath2MemoryManager *mm);
00033 ~NSFixupFilter();
00034
00035 virtual void startDocumentEvent(const XMLCh *documentURI, const XMLCh *encoding);
00036 virtual void endDocumentEvent();
00037 virtual void startElementEvent(const XMLCh *prefix, const XMLCh *uri, const XMLCh *localname);
00038 virtual void endElementEvent(const XMLCh *prefix, const XMLCh *uri, const XMLCh *localname,
00039 const XMLCh *typeURI, const XMLCh *typeName);
00040 virtual void attributeEvent(const XMLCh *prefix, const XMLCh *uri, const XMLCh *localname, const XMLCh *value,
00041 const XMLCh *typeURI, const XMLCh *typeName);
00042 virtual void namespaceEvent(const XMLCh *prefix, const XMLCh *uri);
00043
00044 private:
00045 struct ElemEntry {
00046 void set(const XMLCh *p, ElemEntry *pr)
00047 { prefix = p; prev = pr; }
00048
00049 const XMLCh *prefix;
00050 ElemEntry *prev;
00051 };
00052
00053 struct NSEntry {
00054 void set(const XMLCh *p, const XMLCh *u, unsigned int l, NSEntry *pr)
00055 { prefix = p; uri = u; level = l; prev = pr; }
00056
00057 const XMLCh *prefix;
00058 const XMLCh *uri;
00059 unsigned int level;
00060
00061 NSEntry *prev;
00062 };
00063
00064 NSEntry *findPrefix(const XMLCh *prefix);
00066 bool definePrefix(const XMLCh *&prefix, const XMLCh *uri, bool attr = false, bool redefine = true);
00067
00068 XPath2MemoryManager *mm_;
00069 unsigned int level_;
00070 ElemEntry *elements_;
00071 NSEntry *namespaces_;
00072 };
00073
00074 #endif