diff -r 000000000000 -r b16258d2340f applayerprotocols/wappushsupport/XmlLib/XmlPars.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerprotocols/wappushsupport/XmlLib/XmlPars.h Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,330 @@ +// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef __XMLPARS_H__ +#define __XMLPARS_H__ + +// System includes +// +#include +#include + +// Local includes +// +#include "XmlLog.h" + +// Forward class declarations +// +class CAttributeLookupTable; +class CBNFNode; +class CXmlElement; + +// DATA STRUCTURES +// + +// Replacement strings for predefined XML entities +_LIT(KPredefEntityLT, "<"); +_LIT(KPredefEntityGT, ">"); +_LIT(KPredefEntityAMP, "&"); +_LIT(KPredefEntityAPOS, "'"); +_LIT(KPredefEntityQUOT, """); + +// CXmlParser CLASS DEFINITION +// +//##ModelId=3B6679A00264 +class CXmlParser : public CBNFParser + { +public: // Data type definitions + // Positive error codes to signal clients about actions + enum TSignals + { + EDTDDefinitionFound = 1, + ENoDTDDefined + }; + + // Definition of our own rule types + enum TXmlParserNodeTypes + { + EFirstXmlParserNodeType = ELastParserNodeType, + EChar, + ELetter, + ES, + EFirstNameChar, + ENMoreNameChar, + ELastXmlParserNodeType + }; + +public: // Methods + + //##ModelId=3B6679A10374 + static CXmlParser* NewL(CAttributeLookupTable& aAttributeLUT); + //##ModelId=3B6679A10373 + virtual ~CXmlParser(); + + // Ready the parser to take in a document. Must be called before any data passed + // into ProcessDataL! + // INPUT: + // aRootNode - the to be root node of the document we are about to parse + //##ModelId=3B6679A1035F + void ResetL(CXmlElement* aRootNode); + + // Perform parsing for the incoming data + // INPUT: + // aData - buffer of text to be parsed. Parser makes a copy if the buffer. + //##ModelId=3B6679A10337 + void ProcessDataL(HBufC8& aData); + + // Perform parsing for the incoming data + // INPUT: + // aData - buffer of text to be parser. Parser TAKES OWNERSHIP OF THE BUFFER! + //##ModelId=3B6679A1034B + void ProcessDataL(HBufC16* aData); + + // Signal, that all the data has been passed in. CommitL should be called when all + // the data has been parsed. + //##ModelId=3B6679A1032E + void CommitL(); + + // Continue parsing after returning with a signal that requires actions from the client. + //##ModelId=3B6679A1032D + void ContinueL(); // Just go on parsing after a stop or pause without adding data + + // Get the current error status of the parser + // OUTPUT: + // return TInt - an error code defined in XmlLib.h or KErrNone, if everything was Ok. + //##ModelId=3B6679A10325 + inline TInt ErrorCode(); + + // Get document type definitions string (if found) + // OUTPUT: + // const HBufC* - the document type + //##ModelId=3B6679A10324 + inline const HBufC* DocType(); + + // OUTPUT: + // const HBufC* - Url string defining the location of external DTD document + //##ModelId=3B6679A10323 + inline const HBufC* DTDUrl(); + + // Detect status of data gathering in the parser. If no DTD was available when it was + // requested, the parser enters a data gathering mode, in which it just buffers the incoming + // data for further parsing. + // OUTPUT: + // TBool - ETrue, if data is currently being gathered, EFalse if parsing on normally + //##ModelId=3B6679A1031A + inline TBool DataGathering() const; + + // OUTPUT: + // const CBNFNode* - The DTD tree root node + //##ModelId=3B6679A10319 + inline const CBNFNode* DTD() const; + + // Setting data gathering mode either active or inactive + // INPUT: + // TBool aDataGathering - ETrue sets the data gathering active, EFalse disables it. + //##ModelId=3B6679A10305 + inline void SetDataGathering(TBool aDataGathering); + + // Set a valid DTD for the parser to use + // INPUT: + // CBNFNode* aDTD - the DTD tree root node + //##ModelId=3B6679A102E8 + inline void SetDTD(CBNFNode* aDTD); + +protected: // Methods + + //##ModelId=3B6679A10369 + virtual void ResetL(); + //##ModelId=3B6679A102E7 + virtual CBNFNode* TreeL(); + //##ModelId=3B6679A102D2 + CXmlParser(CAttributeLookupTable& aALUT); + + // Second phase c'tor. All allocation occurs in this function. + // + //##ModelId=3B6679A102C8 + void ConstructL(); + + // + // Tree building rule callback functions + // + //##ModelId=3B6679A102B4 + static void PostCharDataL(CBNFParser& aParser); + //##ModelId=3B6679A102A0 + static void PostCDStart(CBNFParser& aParser); + //##ModelId=3B6679A1028C + static void PostCDataL(CBNFParser& aParser); + //##ModelId=3B6679A10278 + static void PostCDSectL(CBNFParser& aParser); + //##ModelId=3B6679A10264 + static void PostNameL(CBNFParser& aParser); + //##ModelId=3B6679A10250 + static void PostNodeNameL(CBNFParser& aParser); + //##ModelId=3B6679A1023C + static void PreAttribute(CBNFParser& aParser); + //##ModelId=3B6679A10228 + static void PostPureAttValueL(CBNFParser& aParser); + //##ModelId=3B6679A10214 + static void PostAttrName(CBNFParser& aParser); + //##ModelId=3B6679A101F6 + static void PostAttributeL(CBNFParser& aParser); + //##ModelId=3B6679A101E2 + static void PostTagStartL(CBNFParser& aParser); + //##ModelId=3B6679A101CE + static void PostEmptyElemClose(CBNFParser& aParser); + //##ModelId=3B6679A101BA + static void PostETag(CBNFParser& aParser); + //##ModelId=3B6679A101A6 + static void PostPureSystemLiteralL(CBNFParser& aParser); + //##ModelId=3B6679A10192 + static void PostPubidLiteralL(CBNFParser& aParser); + //##ModelId=3B6679A1017E + static void PreExternalID(CBNFParser& aParser); + //##ModelId=3B6679A1016A + static void PostDTDidAndUrl(CBNFParser& aParser); + //##ModelId=3B6679A10156 + static void PostCharReferenceValue(CBNFParser& aParser); + //##ModelId=3B6679A10142 + static void PostEntityRefL(CBNFParser& aParser); + //##ModelId=3B6679A1012E + static void PostVersionNumL(CBNFParser& aParser); + //##ModelId=3B6679A1011A + static void PostDoctypedecl(CBNFParser& aParser); + //##ModelId=3B6679A100FC + static void PostDocRootName(CBNFParser& aParser); + //##ModelId=3B6679A100E8 + static void PostProlog(CBNFParser& aParser); + + // Internal utility functions + // + //##ModelId=3B6679A100D4 + void CharRefReplacement(TPtr& aString); + //##ModelId=3B6679A100C0 + void EolNormalization(TPtr aString); + + // The following methods were implemented to speed up the parser + // Some of the parsing rules were implemented as their own types of + // rules and these methods are the handler functions for those types. + //##ModelId=3B6679A100A2 + virtual TBool PerformRuleL(CBNFNode& aRule, CFragmentedString::TStringMatch& aMatched); + //##ModelId=3B6679A1008E + TBool CharL(CFragmentedString::TStringMatch& aMatched); + //##ModelId=3B6679A1007A + TBool LetterL(CFragmentedString::TStringMatch& aMatched); + //##ModelId=3B6679A10066 + TBool SL(CFragmentedString::TStringMatch& aMatched); + //##ModelId=3B6679A10052 + TBool FirstNameCharL(CFragmentedString::TStringMatch& aMatched); + //##ModelId=3B6679A1003E + TBool NMoreNameCharL(CFragmentedString::TStringMatch& aMatched); + //##ModelId=3B6679A0038F + CBNFNode& NewXmlRuleL(CBNFNode* aRootRule, const TDesC& aRuleName, TXmlParserNodeTypes aRuleType); + //##ModelId=3B6679A003C1 + CBNFNode& NewXmlRuleL(CBNFNode* aRootRule, const TDesC& aRuleName, TXmlParserNodeTypes aRuleType, HBufC* aData, TRuleCallback* aPreRule, TRuleCallback* aPostRule); + +private: // Attributes + + // Document tree root node from which down the tree shall be built + //##ModelId=3B6679A0037D + CXmlElement* iRootNode; // NOT OWNED + + // Storage pointers for the DocType and DTD url + //##ModelId=3B6679A00371 + HBufC* iDocType; + //##ModelId=3B6679A0035F + HBufC* iDTDUrl; + + // Parsing time pointer to the node that is currently being contstructed + //##ModelId=3B6679A00353 + CXmlElement* iCurrentNode; + + // A flag denoting whether we have already found the first tag of the document. + // Enables the first tag Name and attributes to be inserted to the given root node. + //##ModelId=3B6679A00341 + TBool iRootTagFound; + + // Parsing time data storages. Used to temporarily store the matched components + //##ModelId=3B6679A00335 + HBufC* iName; + //##ModelId=3B6679A00323 + HBufC* iAttrName; + //##ModelId=3B6679A00317 + HBufC* iAttValue; + //##ModelId=3B6679A0030D + HBufC* iCData; + //##ModelId=3B6679A002FB + HBufC* iSystemLiteral; + //##ModelId=3B6679A002F1 + HBufC* iPubidLiteral; + //##ModelId=3B6679A002E7 + HBufC* iXmlVersionString; + //##ModelId=3B6679A002DB + HBufC* iDocRootName; + + // An error code defining the failure reason, if something went wrong + // Positive error code values are used to signal XmlLib about actions that should be taken + //##ModelId=3B6679A002D1 + TInt iErrorCode; + + // DTD tree for entity replacement + //##ModelId=3B6679A002BF + CBNFNode* iDTD; // NOT OWNED + + // Data gathering mode, if we didn't get a DTD, then we need to gather the data in a buffer + // and perform the parsing in the validation phase + //##ModelId=3B6679A002B5 + TBool iDataGathering; + __XML_DECLARE_LOG + + }; + +// Inline functions +// +inline TInt CXmlParser::ErrorCode() + { + return(iErrorCode); + } + +inline const HBufC* CXmlParser::DocType() + { + return(iDocType); + } + +inline const HBufC* CXmlParser::DTDUrl() + { + return(iDTDUrl); + } + +inline TBool CXmlParser::DataGathering() const + { + return(iDataGathering); + } + +inline void CXmlParser::SetDataGathering(TBool aDataGathering) + { + iDataGathering = aDataGathering; + } + +inline const CBNFNode* CXmlParser::DTD() const + { + return(iDTD); + } + +inline void CXmlParser::SetDTD(CBNFNode* aDTD) + { + iDTD = aDTD; + } + +#endif // __XMLPARS_H __