--- /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 <e32base.h>
+#include <cbnfparser.h>
+
+// 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 __