diff --git a/htmlparser/src/nsExpatDTD.cpp b/htmlparser/src/nsExpatDTD.cpp index 844c16a491d3..380b475a3eb3 100644 --- a/htmlparser/src/nsExpatDTD.cpp +++ b/htmlparser/src/nsExpatDTD.cpp @@ -46,13 +46,10 @@ #endif #include "prmem.h" - static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); static NS_DEFINE_IID(kIDTDIID, NS_IDTD_IID); static NS_DEFINE_IID(kClassIID, NS_EXPAT_DTD_IID); - - /** * This method gets called as part of our COM-like interfaces. * Its purpose is to create an interface to parser object @@ -220,6 +217,7 @@ NS_IMETHODIMP nsExpatDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink, NS_IMETHODIMP nsExpatDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsITokenObserver* anObserver,nsIContentSink* aSink) { nsresult result=NS_OK; + /* if(aTokenizer) { nsITokenizer* oldTokenizer=mTokenizer; mTokenizer=aTokenizer; @@ -242,6 +240,8 @@ NS_IMETHODIMP nsExpatDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer mTokenizer=oldTokenizer; } else result=NS_ERROR_HTMLPARSER_BADTOKENIZER; + */ + return result; } @@ -277,6 +277,27 @@ nsITokenRecycler* nsExpatDTD::GetTokenRecycler(void){ return theTokenizer->GetTokenRecycler(); } + +/** + * Sets up the callbacks for the expat parser encapsulated by nsExpatTokenizer + * @update nra 2/24/99 + * @param none + * @return none + */ +void nsExpatDTD::SetupExpatCallbacks(void) { + PR_ASSERT( mTokenizer != NULL ); + mTokenizer->SetElementHandler(HandleStartElement, HandleEndElement); + /* + mTokenizer->SetCharacterDataHandler(NULL); + mTokenizer->SetProcessingInstructionHandler(NULL); + mTokenizer->SetDefaultHandler(NULL); + mTokenizer->SetUnparsedEntityDeclHandler(NULL); + mTokenizer->SetNotationDeclHandler(NULL); + mTokenizer->SetExternalEntityRefHandler(NULL); + mTokenizer->SetUnknownEncodingHandler(NULL); + */ +} + /** * Retrieve the preferred tokenizer for use by this DTD. * @update gess12/28/98 @@ -284,11 +305,15 @@ nsITokenRecycler* nsExpatDTD::GetTokenRecycler(void){ * @return ptr to tokenizer */ nsITokenizer* nsExpatDTD::GetTokenizer(void) { - if(!mTokenizer) + if(!mTokenizer) { mTokenizer=new nsExpatTokenizer(); + if (mTokenizer) + SetupExpatCallbacks(); + } return mTokenizer; } + /** * * @update gess5/18/98 @@ -464,3 +489,17 @@ nsresult nsExpatDTD::ReleaseTokenPump(nsITagHandler* aHandler){ nsresult result=NS_OK; return result; } + +/***************************************/ +/* Expat Callback Functions start here */ +/***************************************/ + +void nsExpatDTD::HandleStartElement(void *userData, const XML_Char *name, const XML_Char **atts) +{ + NS_NOTYETIMPLEMENTED("Error: nsExpatDTD::HandleStartElement() not yet implemented."); +} + +void nsExpatDTD::HandleEndElement(void *userData, const XML_Char *name) +{ + NS_NOTYETIMPLEMENTED("Error: nsExpatDTD::HandleEndElement() not yet implemented."); +} diff --git a/htmlparser/src/nsExpatDTD.h b/htmlparser/src/nsExpatDTD.h index b6e7dc910337..e6be6aa1c189 100644 --- a/htmlparser/src/nsExpatDTD.h +++ b/htmlparser/src/nsExpatDTD.h @@ -34,6 +34,8 @@ #include "nsVoidArray.h" #include "nsDeque.h" #include "nsIContentSink.h" +#include "xmlparse.h" +#include "nsIExpatTokenizer.h" #define NS_EXPAT_DTD_IID \ @@ -221,12 +223,24 @@ class nsExpatDTD : public nsIDTD { virtual nsITokenRecycler* GetTokenRecycler(void); protected: + /** + * Sets up the callbacks for the expat parser encapsulated by nsExpatTokenizer. + * Assumes that mTokenizer has been set to nsExpatTokenizer + * @update nra 2/24/99 + * @param none + * @return none + */ + void SetupExpatCallbacks(void); + + /* The callback handlers that get called from the expat parser */ + static void HandleStartElement(void *userData, const XML_Char *name, const XML_Char **atts); + static void HandleEndElement(void *userData, const XML_Char *name); nsParser* mParser; nsIContentSink* mSink; nsString mFilename; PRInt32 mLineNumber; - nsITokenizer* mTokenizer; + nsIExpatTokenizer* mTokenizer; }; extern NS_HTMLPARS nsresult NS_New_Expat_DTD(nsIDTD** aInstancePtrResult); diff --git a/htmlparser/src/nsExpatTokenizer.cpp b/htmlparser/src/nsExpatTokenizer.cpp index 62c0a90f475b..dc8d9a90c098 100644 --- a/htmlparser/src/nsExpatTokenizer.cpp +++ b/htmlparser/src/nsExpatTokenizer.cpp @@ -33,10 +33,11 @@ And now for the main class -- nsExpatTokenizer... ************************************************************************/ -static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); -static NS_DEFINE_IID(kITokenizerIID, NS_ITOKENIZER_IID); -static NS_DEFINE_IID(kHTMLTokenizerIID, NS_HTMLTOKENIZER_IID); -static NS_DEFINE_IID(kClassIID, NS_EXPATTOKENIZER_IID); +static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); +static NS_DEFINE_IID(kITokenizerIID, NS_ITOKENIZER_IID); +static NS_DEFINE_IID(kIExpatTokenizerIID, NS_IEXPATTOKENIZER_IID); +static NS_DEFINE_IID(kHTMLTokenizerIID, NS_HTMLTOKENIZER_IID); +static NS_DEFINE_IID(kClassIID, NS_EXPATTOKENIZER_IID); /** * This method gets called as part of our COM-like interfaces. @@ -57,12 +58,16 @@ nsresult nsExpatTokenizer::QueryInterface(const nsIID& aIID, void** aInstancePtr if(aIID.Equals(kISupportsIID)) { //do IUnknown... *aInstancePtr = (nsExpatTokenizer*)(this); } - else if(aIID.Equals(kITokenizerIID)) { //do ITOkenizer base class... - *aInstancePtr = (nsITokenizer*)(this); + else if(aIID.Equals(kITokenizerIID)) { //do ITokenizer base class... + nsIExpatTokenizer *temp = this; + *aInstancePtr = (void *) temp; } else if(aIID.Equals(kHTMLTokenizerIID)) { //do nsHTMLTokenizer base class... *aInstancePtr = (nsHTMLTokenizer*)(this); } + else if (aIID.Equals(kIExpatTokenizerIID)) { //do IExpatTokenizer base class... + *aInstancePtr = (nsIExpatTokenizer*)(this); + } else if(aIID.Equals(kClassIID)) { //do this class... *aInstancePtr = (nsExpatTokenizer*)(this); } @@ -105,16 +110,22 @@ NS_IMPL_RELEASE(nsExpatTokenizer) */ nsExpatTokenizer::nsExpatTokenizer() : nsHTMLTokenizer() { NS_INIT_REFCNT(); + + // Create a new expat XML parser + parser = XML_ParserCreate(NULL); } /** - * Default constructor + * Destructor * * @update gess 4/9/98 * @param * @return */ nsExpatTokenizer::~nsExpatTokenizer(){ + if (parser) { + XML_ParserFree(parser); + } } @@ -135,6 +146,127 @@ nsExpatTokenizer::~nsExpatTokenizer(){ * @return new token or null */ nsresult nsExpatTokenizer::ConsumeToken(nsScanner& aScanner) { - return nsHTMLTokenizer::ConsumeToken(aScanner); + + // return nsHTMLTokenizer::ConsumeToken(aScanner); + + // Ask the scanner to send us all the data it has + // scanned and pass that data to expat. + nsString buffer; + const char *expatBuffer = NULL; + nsresult result = NS_OK; + + // XXX Rick should add a method to the scanner that gives me the + // entire contents of the scanner's buffer without calling + // GetChar() repeatedly. + result = aScanner.ReadUntil(buffer, '\0', PR_FALSE); + if (aScanner.Eof() == result || NS_OK == result) { + expatBuffer = buffer.ToNewCString(); + + if (expatBuffer) { + if (parser) { + if (!XML_Parse(parser, expatBuffer, strlen(expatBuffer), PR_FALSE)) { + // XXX Add code here to implement error propagation to the + // content sink. + NS_NOTYETIMPLEMENTED("Error: nsExpatTokenizer::ConsumeToken(): \ + Error propogation from expat not yet implemented."); + } + } + else { + result = NS_ERROR_FAILURE; + } + } + } + + return result; } +/* XXX These other methods should presumably never get called. + So, should I put an ASSERT here? For now, I just pass the + method call up to the parent class, nsHTMLTokenizer. */ + +nsITokenRecycler* nsExpatTokenizer::GetTokenRecycler(void) +{ + return nsHTMLTokenizer::GetTokenRecycler(); +} + +CToken* nsExpatTokenizer::PushTokenFront(CToken* theToken) +{ + return nsHTMLTokenizer::PushTokenFront(theToken); +} + +CToken* nsExpatTokenizer::PushToken(CToken* theToken) +{ + return nsHTMLTokenizer::PushToken(theToken); +} + +CToken* nsExpatTokenizer::PeekToken(void) +{ + return nsHTMLTokenizer::PeekToken(); +} + +CToken* nsExpatTokenizer::PopToken(void) +{ + return nsHTMLTokenizer::PopToken(); +} + +PRInt32 nsExpatTokenizer::GetCount(void) +{ + return nsHTMLTokenizer::GetCount(); +} + +CToken* nsExpatTokenizer::GetTokenAt(PRInt32 anIndex) +{ + return nsHTMLTokenizer::GetTokenAt(anIndex); +} + +/************************************************/ +/* Methods to set callbacks on the expat parser */ +/************************************************/ + +void nsExpatTokenizer::SetElementHandler(XML_StartElementHandler start, XML_EndElementHandler end) +{ + PR_ASSERT(parser != NULL); + XML_SetElementHandler(parser, start, end); +} + +void nsExpatTokenizer::SetCharacterDataHandler(XML_CharacterDataHandler handler) +{ + PR_ASSERT(parser != NULL); + XML_SetCharacterDataHandler(parser, handler); +} + +void nsExpatTokenizer::SetProcessingInstructionHandler(XML_ProcessingInstructionHandler handler) +{ + PR_ASSERT(parser != NULL); + XML_SetProcessingInstructionHandler(parser, handler); +} + +void nsExpatTokenizer::SetDefaultHandler(XML_DefaultHandler handler) +{ + PR_ASSERT(parser != NULL); + XML_SetDefaultHandler(parser, handler); +} + +void nsExpatTokenizer::SetUnparsedEntityDeclHandler(XML_UnparsedEntityDeclHandler handler) +{ + PR_ASSERT(parser != NULL); + XML_SetUnparsedEntityDeclHandler(parser, handler); +} + +void nsExpatTokenizer::SetNotationDeclHandler(XML_NotationDeclHandler handler) +{ + PR_ASSERT(parser != NULL); + XML_SetNotationDeclHandler(parser, handler); +} + +void nsExpatTokenizer::SetExternalEntityRefHandler(XML_ExternalEntityRefHandler handler) +{ + PR_ASSERT(parser != NULL); + XML_SetExternalEntityRefHandler(parser, handler); +} + +void nsExpatTokenizer::SetUnknownEncodingHandler(XML_UnknownEncodingHandler handler, void *encodingHandlerData) +{ + PR_ASSERT(parser != NULL); + XML_SetUnknownEncodingHandler(parser, handler, encodingHandlerData); +} \ No newline at end of file diff --git a/htmlparser/src/nsExpatTokenizer.h b/htmlparser/src/nsExpatTokenizer.h index a98a4fa92106..1d7aa3e7cb4f 100644 --- a/htmlparser/src/nsExpatTokenizer.h +++ b/htmlparser/src/nsExpatTokenizer.h @@ -28,7 +28,9 @@ #include "nsISupports.h" #include "nsHTMLTokenizer.h" +#include "nsIExpatTokenizer.h" #include "prtypes.h" +#include "xmlparse.h" #define NS_EXPATTOKENIZER_IID \ {0x483836aa, 0xcabe, 0x11d2, { 0xab, 0xcb, 0x0, 0x10, 0x4b, 0x98, 0x3f, 0xd4 }} @@ -42,14 +44,38 @@ #pragma warning( disable : 4275 ) #endif -CLASS_EXPORT_HTMLPARS nsExpatTokenizer : public nsHTMLTokenizer { +CLASS_EXPORT_HTMLPARS nsExpatTokenizer : public nsHTMLTokenizer, + public nsIExpatTokenizer +{ public: - nsExpatTokenizer(); - virtual ~nsExpatTokenizer(); + nsExpatTokenizer(); + virtual ~nsExpatTokenizer(); - NS_DECL_ISUPPORTS + NS_DECL_ISUPPORTS + /* nsITokenizer methods */ virtual nsresult ConsumeToken(nsScanner& aScanner); + virtual nsITokenRecycler* GetTokenRecycler(void); + + virtual CToken* PushTokenFront(CToken* theToken); + virtual CToken* PushToken(CToken* theToken); + virtual CToken* PopToken(void); + virtual CToken* PeekToken(void); + virtual PRInt32 GetCount(void); + virtual CToken* GetTokenAt(PRInt32 anIndex); + + /* nsIExpatTokenizer methods to set callbacks on the expat parser */ + virtual void SetElementHandler(XML_StartElementHandler start, XML_EndElementHandler end); + virtual void SetCharacterDataHandler(XML_CharacterDataHandler handler); + virtual void SetProcessingInstructionHandler(XML_ProcessingInstructionHandler handler); + virtual void SetDefaultHandler(XML_DefaultHandler handler); + virtual void SetUnparsedEntityDeclHandler(XML_UnparsedEntityDeclHandler handler); + virtual void SetNotationDeclHandler(XML_NotationDeclHandler handler); + virtual void SetExternalEntityRefHandler(XML_ExternalEntityRefHandler handler); + virtual void SetUnknownEncodingHandler(XML_UnknownEncodingHandler handler, void *encodingHandlerData); + +protected: + XML_Parser parser; }; extern NS_HTMLPARS nsresult NS_Expat_Tokenizer(nsIDTD** aInstancePtrResult); diff --git a/parser/htmlparser/src/nsExpatDTD.cpp b/parser/htmlparser/src/nsExpatDTD.cpp index 844c16a491d3..380b475a3eb3 100644 --- a/parser/htmlparser/src/nsExpatDTD.cpp +++ b/parser/htmlparser/src/nsExpatDTD.cpp @@ -46,13 +46,10 @@ #endif #include "prmem.h" - static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); static NS_DEFINE_IID(kIDTDIID, NS_IDTD_IID); static NS_DEFINE_IID(kClassIID, NS_EXPAT_DTD_IID); - - /** * This method gets called as part of our COM-like interfaces. * Its purpose is to create an interface to parser object @@ -220,6 +217,7 @@ NS_IMETHODIMP nsExpatDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink, NS_IMETHODIMP nsExpatDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsITokenObserver* anObserver,nsIContentSink* aSink) { nsresult result=NS_OK; + /* if(aTokenizer) { nsITokenizer* oldTokenizer=mTokenizer; mTokenizer=aTokenizer; @@ -242,6 +240,8 @@ NS_IMETHODIMP nsExpatDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer mTokenizer=oldTokenizer; } else result=NS_ERROR_HTMLPARSER_BADTOKENIZER; + */ + return result; } @@ -277,6 +277,27 @@ nsITokenRecycler* nsExpatDTD::GetTokenRecycler(void){ return theTokenizer->GetTokenRecycler(); } + +/** + * Sets up the callbacks for the expat parser encapsulated by nsExpatTokenizer + * @update nra 2/24/99 + * @param none + * @return none + */ +void nsExpatDTD::SetupExpatCallbacks(void) { + PR_ASSERT( mTokenizer != NULL ); + mTokenizer->SetElementHandler(HandleStartElement, HandleEndElement); + /* + mTokenizer->SetCharacterDataHandler(NULL); + mTokenizer->SetProcessingInstructionHandler(NULL); + mTokenizer->SetDefaultHandler(NULL); + mTokenizer->SetUnparsedEntityDeclHandler(NULL); + mTokenizer->SetNotationDeclHandler(NULL); + mTokenizer->SetExternalEntityRefHandler(NULL); + mTokenizer->SetUnknownEncodingHandler(NULL); + */ +} + /** * Retrieve the preferred tokenizer for use by this DTD. * @update gess12/28/98 @@ -284,11 +305,15 @@ nsITokenRecycler* nsExpatDTD::GetTokenRecycler(void){ * @return ptr to tokenizer */ nsITokenizer* nsExpatDTD::GetTokenizer(void) { - if(!mTokenizer) + if(!mTokenizer) { mTokenizer=new nsExpatTokenizer(); + if (mTokenizer) + SetupExpatCallbacks(); + } return mTokenizer; } + /** * * @update gess5/18/98 @@ -464,3 +489,17 @@ nsresult nsExpatDTD::ReleaseTokenPump(nsITagHandler* aHandler){ nsresult result=NS_OK; return result; } + +/***************************************/ +/* Expat Callback Functions start here */ +/***************************************/ + +void nsExpatDTD::HandleStartElement(void *userData, const XML_Char *name, const XML_Char **atts) +{ + NS_NOTYETIMPLEMENTED("Error: nsExpatDTD::HandleStartElement() not yet implemented."); +} + +void nsExpatDTD::HandleEndElement(void *userData, const XML_Char *name) +{ + NS_NOTYETIMPLEMENTED("Error: nsExpatDTD::HandleEndElement() not yet implemented."); +} diff --git a/parser/htmlparser/src/nsExpatDTD.h b/parser/htmlparser/src/nsExpatDTD.h index b6e7dc910337..e6be6aa1c189 100644 --- a/parser/htmlparser/src/nsExpatDTD.h +++ b/parser/htmlparser/src/nsExpatDTD.h @@ -34,6 +34,8 @@ #include "nsVoidArray.h" #include "nsDeque.h" #include "nsIContentSink.h" +#include "xmlparse.h" +#include "nsIExpatTokenizer.h" #define NS_EXPAT_DTD_IID \ @@ -221,12 +223,24 @@ class nsExpatDTD : public nsIDTD { virtual nsITokenRecycler* GetTokenRecycler(void); protected: + /** + * Sets up the callbacks for the expat parser encapsulated by nsExpatTokenizer. + * Assumes that mTokenizer has been set to nsExpatTokenizer + * @update nra 2/24/99 + * @param none + * @return none + */ + void SetupExpatCallbacks(void); + + /* The callback handlers that get called from the expat parser */ + static void HandleStartElement(void *userData, const XML_Char *name, const XML_Char **atts); + static void HandleEndElement(void *userData, const XML_Char *name); nsParser* mParser; nsIContentSink* mSink; nsString mFilename; PRInt32 mLineNumber; - nsITokenizer* mTokenizer; + nsIExpatTokenizer* mTokenizer; }; extern NS_HTMLPARS nsresult NS_New_Expat_DTD(nsIDTD** aInstancePtrResult); diff --git a/parser/htmlparser/src/nsExpatTokenizer.cpp b/parser/htmlparser/src/nsExpatTokenizer.cpp index 62c0a90f475b..dc8d9a90c098 100644 --- a/parser/htmlparser/src/nsExpatTokenizer.cpp +++ b/parser/htmlparser/src/nsExpatTokenizer.cpp @@ -33,10 +33,11 @@ And now for the main class -- nsExpatTokenizer... ************************************************************************/ -static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); -static NS_DEFINE_IID(kITokenizerIID, NS_ITOKENIZER_IID); -static NS_DEFINE_IID(kHTMLTokenizerIID, NS_HTMLTOKENIZER_IID); -static NS_DEFINE_IID(kClassIID, NS_EXPATTOKENIZER_IID); +static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); +static NS_DEFINE_IID(kITokenizerIID, NS_ITOKENIZER_IID); +static NS_DEFINE_IID(kIExpatTokenizerIID, NS_IEXPATTOKENIZER_IID); +static NS_DEFINE_IID(kHTMLTokenizerIID, NS_HTMLTOKENIZER_IID); +static NS_DEFINE_IID(kClassIID, NS_EXPATTOKENIZER_IID); /** * This method gets called as part of our COM-like interfaces. @@ -57,12 +58,16 @@ nsresult nsExpatTokenizer::QueryInterface(const nsIID& aIID, void** aInstancePtr if(aIID.Equals(kISupportsIID)) { //do IUnknown... *aInstancePtr = (nsExpatTokenizer*)(this); } - else if(aIID.Equals(kITokenizerIID)) { //do ITOkenizer base class... - *aInstancePtr = (nsITokenizer*)(this); + else if(aIID.Equals(kITokenizerIID)) { //do ITokenizer base class... + nsIExpatTokenizer *temp = this; + *aInstancePtr = (void *) temp; } else if(aIID.Equals(kHTMLTokenizerIID)) { //do nsHTMLTokenizer base class... *aInstancePtr = (nsHTMLTokenizer*)(this); } + else if (aIID.Equals(kIExpatTokenizerIID)) { //do IExpatTokenizer base class... + *aInstancePtr = (nsIExpatTokenizer*)(this); + } else if(aIID.Equals(kClassIID)) { //do this class... *aInstancePtr = (nsExpatTokenizer*)(this); } @@ -105,16 +110,22 @@ NS_IMPL_RELEASE(nsExpatTokenizer) */ nsExpatTokenizer::nsExpatTokenizer() : nsHTMLTokenizer() { NS_INIT_REFCNT(); + + // Create a new expat XML parser + parser = XML_ParserCreate(NULL); } /** - * Default constructor + * Destructor * * @update gess 4/9/98 * @param * @return */ nsExpatTokenizer::~nsExpatTokenizer(){ + if (parser) { + XML_ParserFree(parser); + } } @@ -135,6 +146,127 @@ nsExpatTokenizer::~nsExpatTokenizer(){ * @return new token or null */ nsresult nsExpatTokenizer::ConsumeToken(nsScanner& aScanner) { - return nsHTMLTokenizer::ConsumeToken(aScanner); + + // return nsHTMLTokenizer::ConsumeToken(aScanner); + + // Ask the scanner to send us all the data it has + // scanned and pass that data to expat. + nsString buffer; + const char *expatBuffer = NULL; + nsresult result = NS_OK; + + // XXX Rick should add a method to the scanner that gives me the + // entire contents of the scanner's buffer without calling + // GetChar() repeatedly. + result = aScanner.ReadUntil(buffer, '\0', PR_FALSE); + if (aScanner.Eof() == result || NS_OK == result) { + expatBuffer = buffer.ToNewCString(); + + if (expatBuffer) { + if (parser) { + if (!XML_Parse(parser, expatBuffer, strlen(expatBuffer), PR_FALSE)) { + // XXX Add code here to implement error propagation to the + // content sink. + NS_NOTYETIMPLEMENTED("Error: nsExpatTokenizer::ConsumeToken(): \ + Error propogation from expat not yet implemented."); + } + } + else { + result = NS_ERROR_FAILURE; + } + } + } + + return result; } +/* XXX These other methods should presumably never get called. + So, should I put an ASSERT here? For now, I just pass the + method call up to the parent class, nsHTMLTokenizer. */ + +nsITokenRecycler* nsExpatTokenizer::GetTokenRecycler(void) +{ + return nsHTMLTokenizer::GetTokenRecycler(); +} + +CToken* nsExpatTokenizer::PushTokenFront(CToken* theToken) +{ + return nsHTMLTokenizer::PushTokenFront(theToken); +} + +CToken* nsExpatTokenizer::PushToken(CToken* theToken) +{ + return nsHTMLTokenizer::PushToken(theToken); +} + +CToken* nsExpatTokenizer::PeekToken(void) +{ + return nsHTMLTokenizer::PeekToken(); +} + +CToken* nsExpatTokenizer::PopToken(void) +{ + return nsHTMLTokenizer::PopToken(); +} + +PRInt32 nsExpatTokenizer::GetCount(void) +{ + return nsHTMLTokenizer::GetCount(); +} + +CToken* nsExpatTokenizer::GetTokenAt(PRInt32 anIndex) +{ + return nsHTMLTokenizer::GetTokenAt(anIndex); +} + +/************************************************/ +/* Methods to set callbacks on the expat parser */ +/************************************************/ + +void nsExpatTokenizer::SetElementHandler(XML_StartElementHandler start, XML_EndElementHandler end) +{ + PR_ASSERT(parser != NULL); + XML_SetElementHandler(parser, start, end); +} + +void nsExpatTokenizer::SetCharacterDataHandler(XML_CharacterDataHandler handler) +{ + PR_ASSERT(parser != NULL); + XML_SetCharacterDataHandler(parser, handler); +} + +void nsExpatTokenizer::SetProcessingInstructionHandler(XML_ProcessingInstructionHandler handler) +{ + PR_ASSERT(parser != NULL); + XML_SetProcessingInstructionHandler(parser, handler); +} + +void nsExpatTokenizer::SetDefaultHandler(XML_DefaultHandler handler) +{ + PR_ASSERT(parser != NULL); + XML_SetDefaultHandler(parser, handler); +} + +void nsExpatTokenizer::SetUnparsedEntityDeclHandler(XML_UnparsedEntityDeclHandler handler) +{ + PR_ASSERT(parser != NULL); + XML_SetUnparsedEntityDeclHandler(parser, handler); +} + +void nsExpatTokenizer::SetNotationDeclHandler(XML_NotationDeclHandler handler) +{ + PR_ASSERT(parser != NULL); + XML_SetNotationDeclHandler(parser, handler); +} + +void nsExpatTokenizer::SetExternalEntityRefHandler(XML_ExternalEntityRefHandler handler) +{ + PR_ASSERT(parser != NULL); + XML_SetExternalEntityRefHandler(parser, handler); +} + +void nsExpatTokenizer::SetUnknownEncodingHandler(XML_UnknownEncodingHandler handler, void *encodingHandlerData) +{ + PR_ASSERT(parser != NULL); + XML_SetUnknownEncodingHandler(parser, handler, encodingHandlerData); +} \ No newline at end of file diff --git a/parser/htmlparser/src/nsExpatTokenizer.h b/parser/htmlparser/src/nsExpatTokenizer.h index a98a4fa92106..1d7aa3e7cb4f 100644 --- a/parser/htmlparser/src/nsExpatTokenizer.h +++ b/parser/htmlparser/src/nsExpatTokenizer.h @@ -28,7 +28,9 @@ #include "nsISupports.h" #include "nsHTMLTokenizer.h" +#include "nsIExpatTokenizer.h" #include "prtypes.h" +#include "xmlparse.h" #define NS_EXPATTOKENIZER_IID \ {0x483836aa, 0xcabe, 0x11d2, { 0xab, 0xcb, 0x0, 0x10, 0x4b, 0x98, 0x3f, 0xd4 }} @@ -42,14 +44,38 @@ #pragma warning( disable : 4275 ) #endif -CLASS_EXPORT_HTMLPARS nsExpatTokenizer : public nsHTMLTokenizer { +CLASS_EXPORT_HTMLPARS nsExpatTokenizer : public nsHTMLTokenizer, + public nsIExpatTokenizer +{ public: - nsExpatTokenizer(); - virtual ~nsExpatTokenizer(); + nsExpatTokenizer(); + virtual ~nsExpatTokenizer(); - NS_DECL_ISUPPORTS + NS_DECL_ISUPPORTS + /* nsITokenizer methods */ virtual nsresult ConsumeToken(nsScanner& aScanner); + virtual nsITokenRecycler* GetTokenRecycler(void); + + virtual CToken* PushTokenFront(CToken* theToken); + virtual CToken* PushToken(CToken* theToken); + virtual CToken* PopToken(void); + virtual CToken* PeekToken(void); + virtual PRInt32 GetCount(void); + virtual CToken* GetTokenAt(PRInt32 anIndex); + + /* nsIExpatTokenizer methods to set callbacks on the expat parser */ + virtual void SetElementHandler(XML_StartElementHandler start, XML_EndElementHandler end); + virtual void SetCharacterDataHandler(XML_CharacterDataHandler handler); + virtual void SetProcessingInstructionHandler(XML_ProcessingInstructionHandler handler); + virtual void SetDefaultHandler(XML_DefaultHandler handler); + virtual void SetUnparsedEntityDeclHandler(XML_UnparsedEntityDeclHandler handler); + virtual void SetNotationDeclHandler(XML_NotationDeclHandler handler); + virtual void SetExternalEntityRefHandler(XML_ExternalEntityRefHandler handler); + virtual void SetUnknownEncodingHandler(XML_UnknownEncodingHandler handler, void *encodingHandlerData); + +protected: + XML_Parser parser; }; extern NS_HTMLPARS nsresult NS_Expat_Tokenizer(nsIDTD** aInstancePtrResult);