source: icXML/icXML-devel/src/icxmlc/XMLParserImpl.hpp @ 2720

Last change on this file since 2720 was 2720, checked in by cameron, 6 years ago

Initial check-in of icXML 0.8 source files

File size: 4.0 KB
Line 
1/*
2 *  Copyright © 2012 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icXML is a trademark of International Characters.
5 */
6
7/*
8 * @author Nigel Medforth, nigelm -at- interational-characters.com
9 * @version $Id: XMLParserImpl.hpp 207 2012-12-02 20:38:22Z robc $
10 *
11 */
12
13#ifndef XMLPARSERIMPL_HPP
14#define XMLPARSERIMPL_HPP
15
16#include <icxmlc/XMLParser.hpp>
17
18XERCES_CPP_NAMESPACE_BEGIN
19
20template<class XMLScannerType>
21class XMLParserImpl : XMLParser
22{
23                typedef DynamicArray<XMLElementDecl *, INITIAL_MAX_SCOPE + EXPECTED_LEAF_NODE_COUNT> ElementArray;
24
25                typedef DynamicArray<XMLSize_t, INITIAL_MAX_SCOPE> ElementChildrenArray;
26
27                typedef DynamicArray<gid_t, INITIAL_MAX_SCOPE> GidStack;
28
29        public:
30
31                XMLParserImpl
32                (
33                        unsigned int                                            readerNum
34                        , XMLScannerType * const                        scanner
35                        , XMLTranscoder *                                       transcoder
36                        , MemoryManager * const                         manager           
37                );
38
39                ~XMLParserImpl();
40
41                void init
42                (
43                        XMLCharacterSetAdapter *                        adapter
44                        , XMLTranscoder *                                       transcoder
45                        , const XMLFileLoc                                      line
46                        , const XMLFileLoc                                      column
47            , const XMLVersion                  version
48                );
49
50                void preScanDocumentPage
51                (
52                        XMLByte*                                                        rawByteBuf
53                        , const XMLSize_t                                       rawBytesAvail
54                        , const bool                                            noMore
55                        , XMLReader     *                                               reader
56                );
57
58                /**
59                 Scan the prolog portion of the document, which includes everything before the root element
60                 including the DTD subsets. Returns true if it successfully found the end of the prolog.
61                 (i.e., no more data is required to complete it.)
62                 **/
63        bool scanProlog();
64
65        bool scanDocumentPage();
66
67                void resolveDocumentPageNamespaces();
68
69                /**
70                  If we have a DTD grammar available and that grammar can default attribute/value pairs into the
71                  elements, preparse them and determine what attributes must be added to the content and symbol
72                  streams
73                **/
74//              void resolveDefaultAttributeValues();
75
76                void prepareForNextDocumentPage();
77
78        XMLParser::XMLScanState scanNext();
79
80        bool scanMiscellaneous();
81
82                void popReader();
83
84        private:
85
86                template <XMLParser::DocumentStateType docStateType>
87                IDISA_ALWAYS_INLINE
88        XMLParser::XMLScanState scanContent(size_t & length);
89
90                template <XMLParser::DocumentStateType docStateType>
91                IDISA_ALWAYS_INLINE
92        XMLParser::XMLScanState scanMarkup();
93
94                IDISA_ALWAYS_INLINE
95                ptrdiff_t getStringLength(const XMLCh * stringStartPtr, const XMLCh ** & stringEndPtr);
96
97                IDISA_ALWAYS_INLINE
98                void addElement(XMLElementDecl * elemDecl, const gid_t gid, const bool isRoot, const bool isEmpty);
99
100                IDISA_ALWAYS_INLINE
101                XMLSymbol * getSymbol(const unsigned int index);
102
103                IDISA_ALWAYS_INLINE
104                const XMLSymbol * getSymbol(const unsigned int index) const;
105
106                IDISA_ALWAYS_INLINE
107                void storeSymbolUri(const unsigned int index, const unsigned int uriId);
108
109                IDISA_ALWAYS_INLINE
110                unsigned int getSymbolUri(const unsigned int index) const;
111
112        private:
113
114                XMLAttributeList                                        fAttributeList;
115                XMLSize_t                                                       fScope;
116                XMLSize_t                                                       fElementIndex;
117                ElementArray                                            fElement;
118                ElementChildrenArray                            fChildren;
119                GidStack                                                        fGidStack;
120                XMLScannerType* const               fScanner;
121                XMLNamespaceResolver                            fNamespaceResolver;
122                bool                                                            fMayHaveDefaultAttributeValues;
123        bool                                fNoMore;
124};
125
126template<class XMLScannerType>
127XMLParserImpl<XMLScannerType>::XMLParserImpl
128(
129        unsigned int                                            readerNum
130        , XMLScannerType * const                        scanner
131        , XMLTranscoder *                                       transcoder
132        , MemoryManager * const                         manager   
133)
134    : XMLParser(readerNum, scanner, transcoder, &fNamespaceResolver, manager)
135        , fElementIndex(-1)
136        , fScope(0)
137        , fScanner(scanner)
138        , fNamespaceResolver(scanner->getUriResolver(), manager)
139        , fMayHaveDefaultAttributeValues(1)
140    , fNoMore(1)
141{
142        fScanner->setUriResolver(&fNamespaceResolver);
143}
144
145template<class XMLScannerType>
146XMLParserImpl<XMLScannerType>::~XMLParserImpl()
147{
148        fScanner->setUriResolver(0);
149}
150
151XERCES_CPP_NAMESPACE_END
152
153#if !defined(XERCES_TMPLSINC)
154#include <icxmlc/XMLParserImpl.c>
155#endif
156
157#endif // XMLPARSERIMPL_HPP
Note: See TracBrowser for help on using the repository browser.