Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this
4 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 :
6 : #ifndef NS_EXPAT_DRIVER__
7 : #define NS_EXPAT_DRIVER__
8 :
9 : #include "expat_config.h"
10 : #include "expat.h"
11 : #include "nsCOMPtr.h"
12 : #include "nsString.h"
13 : #include "nsIDTD.h"
14 : #include "nsITokenizer.h"
15 : #include "nsIInputStream.h"
16 : #include "nsIParser.h"
17 : #include "nsCycleCollectionParticipant.h"
18 :
19 : class nsIExpatSink;
20 : class nsIExtendedExpatSink;
21 : struct nsCatalogData;
22 :
23 : class nsExpatDriver : public nsIDTD,
24 : public nsITokenizer
25 : {
26 : virtual ~nsExpatDriver();
27 :
28 : public:
29 : NS_DECL_CYCLE_COLLECTING_ISUPPORTS
30 : NS_DECL_NSIDTD
31 : NS_DECL_NSITOKENIZER
32 152 : NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsExpatDriver, nsIDTD)
33 :
34 : nsExpatDriver();
35 :
36 : int HandleExternalEntityRef(const char16_t *aOpenEntityNames,
37 : const char16_t *aBase,
38 : const char16_t *aSystemId,
39 : const char16_t *aPublicId);
40 : nsresult HandleStartElement(const char16_t *aName, const char16_t **aAtts);
41 : nsresult HandleEndElement(const char16_t *aName);
42 : nsresult HandleCharacterData(const char16_t *aCData, const uint32_t aLength);
43 : nsresult HandleComment(const char16_t *aName);
44 : nsresult HandleProcessingInstruction(const char16_t *aTarget,
45 : const char16_t *aData);
46 : nsresult HandleXMLDeclaration(const char16_t *aVersion,
47 : const char16_t *aEncoding,
48 : int32_t aStandalone);
49 : nsresult HandleDefault(const char16_t *aData, const uint32_t aLength);
50 : nsresult HandleStartCdataSection();
51 : nsresult HandleEndCdataSection();
52 : nsresult HandleStartDoctypeDecl(const char16_t* aDoctypeName,
53 : const char16_t* aSysid,
54 : const char16_t* aPubid,
55 : bool aHasInternalSubset);
56 : nsresult HandleEndDoctypeDecl();
57 : nsresult HandleStartNamespaceDecl(const char16_t* aPrefix,
58 : const char16_t* aUri);
59 : nsresult HandleEndNamespaceDecl(const char16_t* aPrefix);
60 : nsresult HandleNotationDecl(const char16_t* aNotationName,
61 : const char16_t* aBase,
62 : const char16_t* aSysid,
63 : const char16_t* aPubid);
64 : nsresult HandleUnparsedEntityDecl(const char16_t* aEntityName,
65 : const char16_t* aBase,
66 : const char16_t* aSysid,
67 : const char16_t* aPubid,
68 : const char16_t* aNotationName);
69 :
70 : private:
71 : // Load up an external stream to get external entity information
72 : nsresult OpenInputStreamFromExternalDTD(const char16_t* aFPIStr,
73 : const char16_t* aURLStr,
74 : const char16_t* aBaseURL,
75 : nsIInputStream** aStream,
76 : nsAString& aAbsURL);
77 :
78 : /**
79 : * Pass a buffer to Expat. If Expat is blocked aBuffer should be null and
80 : * aLength should be 0. The result of the call will be stored in
81 : * mInternalState. Expat will parse as much of the buffer as it can and store
82 : * the rest in its internal buffer.
83 : *
84 : * @param aBuffer the buffer to pass to Expat. May be null.
85 : * @param aLength the length of the buffer to pass to Expat (in number of
86 : * char16_t's). Must be 0 if aBuffer is null and > 0 if
87 : * aBuffer is not null.
88 : * @param aIsFinal whether there will definitely not be any more new buffers
89 : * passed in to ParseBuffer
90 : * @param aConsumed [out] the number of PRUnichars that Expat consumed. This
91 : * doesn't include the PRUnichars that Expat stored in
92 : * its buffer but didn't parse yet.
93 : */
94 : void ParseBuffer(const char16_t *aBuffer, uint32_t aLength, bool aIsFinal,
95 : uint32_t *aConsumed);
96 : nsresult HandleError();
97 :
98 : void MaybeStopParser(nsresult aState);
99 :
100 220 : bool BlockedOrInterrupted()
101 : {
102 440 : return mInternalState == NS_ERROR_HTMLPARSER_BLOCK ||
103 440 : mInternalState == NS_ERROR_HTMLPARSER_INTERRUPTED;
104 : }
105 :
106 : XML_Parser mExpatParser;
107 : nsString mLastLine;
108 : nsString mCDataText;
109 : // Various parts of a doctype
110 : nsString mDoctypeName;
111 : nsString mSystemID;
112 : nsString mPublicID;
113 : nsString mInternalSubset;
114 : bool mInCData;
115 : bool mInInternalSubset;
116 : bool mInExternalDTD;
117 : bool mMadeFinalCallToExpat;
118 :
119 : // Whether we're sure that we won't be getting more buffers to parse from
120 : // Necko
121 : bool mIsFinalChunk;
122 :
123 : nsresult mInternalState;
124 :
125 : // The length of the data in Expat's buffer (in number of PRUnichars).
126 : uint32_t mExpatBuffered;
127 :
128 : // These sinks all refer the same conceptual object. mOriginalSink is
129 : // identical with the nsIContentSink* passed to WillBuildModel, and exists
130 : // only to avoid QI-ing back to nsIContentSink*.
131 : nsCOMPtr<nsIContentSink> mOriginalSink;
132 : nsCOMPtr<nsIExpatSink> mSink;
133 : nsCOMPtr<nsIExtendedExpatSink> mExtendedSink;
134 :
135 : const nsCatalogData* mCatalogData; // weak
136 : nsString mURISpec;
137 :
138 : // Used for error reporting.
139 : uint64_t mInnerWindowID;
140 : };
141 :
142 : #endif
|