--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/landmarks/locationlandmarks/converter/inc/EPos_CPosLmXmlParser.h Tue Feb 02 01:06:48 2010 +0200
@@ -0,0 +1,443 @@
+/*
+* Copyright (c) 2002-2007 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: Parser that uses Symbian XML Framework to parse XML files with
+* Landmark Content Format.
+*
+*
+*/
+
+
+#ifndef CPOSLMXMLPARSER_H
+#define CPOSLMXMLPARSER_H
+
+// INCLUDES
+#include <f32file.h>
+#include <xml/parser.h>
+#include <xml/contenthandler.h>
+#include <xml/documentparameters.h>
+#include <EPos_CPosLandmarkParser.h>
+#include "EPos_LmConverter.h"
+
+// DATA TYPES
+enum TLmXmlParserState
+ {
+ EStateParsingStateUnknown = 0,
+ EStateInitialized = 0x01,
+ EStateOperationConstructed = 0x02,
+ EStateParsingStarted = 0x04,
+ EStateParsing = 0x08,
+ EStateParsedLandmark = 0x10,
+ EStateParsingForNextLm = 0x20,
+ EStateParsingPartReady = 0x40,
+ EStateParsingReady = 0x80
+ };
+
+enum TXmlParserElementState
+ {
+ EXmlParserOnStartElement,
+ EXmlParserOnEndElement
+ };
+
+
+// FORWARD DECLARATIONS
+class CPosLmXmlParserOperation;
+class CPosLmCollectionData;
+class CPosLmParsedLmBuffer;
+
+// CLASS DECLARATION
+
+/**
+* Parser that uses Symbian XML Framework to parse XML files with
+* Landmark Content Format.
+*
+*/
+class CPosLmXmlParser : public CPosLandmarkParser, public Xml::MContentHandler
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Destructor.
+ */
+ virtual ~CPosLmXmlParser();
+
+ public: // New functions
+
+ /**
+ * Parses next part of either buffer or from file.
+ *
+ * @param[out] aProgress The progress of the parsing after the function
+ * is finished.
+ * @return KErrNone if parsing is ready, otherwise
+ * KPosLmOperationNotComplete.
+ */
+ virtual TInt ParseNextPartL( TReal32& aProgress );
+
+ /**
+ * Reset parser due to error during parsing.
+ */
+ void ResetParserOnError();
+
+ /** Called by operation to inform that it's being destroyed */
+ void OperationDestroyed();
+
+ public: // From CPosLandmarkParser
+
+ /**
+ * @param aBuffer The buffer containing the landmark content.
+ */
+ void SetInputBuffer( const TDesC8& aBuffer );
+
+ /**
+ * @param aFile The file containing the landmark content.
+ */
+ void SetInputFileL( const TDesC& aFile );
+
+ /**
+ * @param aFileHandle The handle to the file which should be parsed.
+ */
+ void SetInputFileHandleL( RFile& aFileHandle );
+
+ /**
+ * @param aBuildIndex Specifies if the parser should build an
+ * index.
+ * @return A handle to the operation.
+ */
+ CPosLmOperation* ParseContentL( TBool aBuildIndex = EFalse );
+
+ /**
+ * @return The total number of parsed landmarks.
+ */
+ TUint32 NumOfParsedLandmarks() const;
+
+ /**
+ * @return The first landmark collection data.
+ */
+ TPosLmCollectionDataId FirstCollectionDataId() const;
+
+ /**
+ * @param aCollectionDataId Collection data id.
+ * @return The next landmark collection data.
+ */
+ TPosLmCollectionDataId NextCollectionDataId( TPosLmCollectionDataId aCollectionDataId ) const;
+
+ /**
+ * @param aDataId The identifier for the collection data to retrieve.
+ * @return The requested collection data.
+ */
+ virtual TPtrC CollectionData( TPosLmCollectionDataId aDataId ) const;
+
+ /**
+ * @param aLandmarkIndex The index of the landmark to retrieve.
+ * @return The requested landmark.
+ */
+ CPosLandmark* LandmarkLC( TUint aLandmarkIndex = KPosLastParsedLandmark ) const;
+
+ /**
+ * @param aCategoryId The ID of the landmark category.
+ * @return The requested landmark category.
+ */
+ CPosLandmarkCategory* LandmarkCategoryLC(
+ /* IN */ TPosLmItemId aCategoryId
+ ) const;
+
+ public: // From Xml::MContentHandler
+
+ void OnStartDocumentL(
+ const Xml::RDocumentParameters& aDocParam,
+ TInt aErrorCode );
+
+ void OnEndDocumentL(TInt aErrorCode);
+
+ void OnStartElementL(
+ const Xml::RTagInfo& aElement,
+ const Xml::RAttributeArray& aAttributes,
+ TInt aErrorCode );
+
+ void OnEndElementL( const Xml::RTagInfo& aElement, TInt aErrorCode );
+
+ void OnContentL( const TDesC8& aBytes, TInt aErrorCode );
+
+ void OnStartPrefixMappingL(
+ const RString& aPrefix,
+ const RString& aUri,
+ TInt aErrorCode );
+
+ void OnEndPrefixMappingL( const RString& aPrefix, TInt aErrorCode );
+
+ void OnIgnorableWhiteSpaceL( const TDesC8& aBytes, TInt aErrorCode );
+
+ void OnSkippedEntityL( const RString& aName, TInt aErrorCode );
+
+ void OnProcessingInstructionL(
+ const TDesC8& aTarget,
+ const TDesC8& aData,
+ TInt aErrorCode );
+
+ void OnOutOfData();
+
+ void OnError( TInt aErrorCode );
+
+ TAny* GetExtendedInterface( const TInt32 aUid );
+
+ protected:
+
+ virtual void OnAttributesL( TPosXmlTagType aTag, const Xml::RAttributeArray& aAttributes ) = 0;
+
+ virtual void GetNextAllowedTagsL( RArray<TPosXmlTagType>& aChildTags ) = 0;
+
+ virtual void CheckMandatoryTagsL( TPosXmlTagType aTreeType ) = 0;
+
+ virtual TBool IsLandmarkStarted( TPosXmlTagType aTag ) = 0;
+
+ virtual TBool IsCategoryStarted( TPosXmlTagType aTag ) = 0;
+
+ virtual void SetContentL( TPosXmlTagType aTag, const TDesC& aContent ) = 0;
+
+ virtual TPosXmlTagType TagTypeL( const Xml::RTagInfo& aElement ) = 0;
+
+ virtual TBool IsTreeTag( TPosXmlTagType aTag ) = 0;
+
+ protected:
+
+ /** Verifies if given tag has been parsed in current tree*/
+ TBool ChildTagFoundL( TPosXmlTagType aTagType );
+
+ /**
+ * Add parsed collection data.
+ *
+ * @param aCollId Collection data identifier.
+ * @param aContent Collection data content.
+ */
+ void AddCollectionDataL(
+ TPosLmCollectionDataId aCollId,
+ const TDesC& aContent );
+
+ virtual TBool EqualsTagL( const TDesC8& aTag, const TDesC& aDefinedTag );
+
+ /** Updates state of the parser when another landmark is parsed */
+ void HandleLandmarkParsedL();
+
+ /** Updates state of the parser when root tag is parsed */
+ void HandleRootTag();
+
+ /** Returns last parsed known child tag */
+ TPosXmlTagType LastKnownChildTag();
+
+ /** Returns sequence of tags given in aChildTags[aChildTagsCount],
+ * which includes only tags starting from the last parsed known child tag */
+ void GenValidSequenceL(
+ const TPosXmlTagType* aChildTags,
+ TInt aChildTagsCount,
+ RArray<TPosXmlTagType>& aSequence );
+
+ /** Returns set of tags given in aChildTags[aChildTagsCount],
+ * excluding all last parsed known child tags */
+ void GenValidSetL(
+ const TPosXmlTagType* aChildTags,
+ TInt aChildTagsCount,
+ RArray<TPosXmlTagType>& aSet );
+
+ /** Marks current tag as tree */
+ void StartNewTreeL();
+
+ /** Resets to previous tree tag */
+ void CloseCurrentTree();
+
+ /** Returns type of current tree */
+ TPosXmlTagType CurrentTree();
+
+ /** Returns type of current tag */
+ TPosXmlTagType CurrentTag();
+
+ /** Index of current tree tag in iReadTags */
+ TInt CurrentTreeTagIndex();
+
+ /** Checks if given tag has been processed in current tree */
+ TBool ChildTagFound( TPosXmlTagType aTag );
+
+ /** Compares namespace of given tag with root namespace */
+ TBool MatchesRootNamespace( const Xml::RTagInfo& aElement );
+
+ private:
+
+ /**
+ * Initiates the parser to parse from a file.
+ *
+ * The file is either passed as a file handle or as a file name. If the
+ * file handle is @p NULL, then this method will open the file passed in
+ * the @p aFile parameter.
+ *
+ * @param aFileHandle The handle to the file to parse, or @p NULL if a
+ * new file handle should be opened.
+ * @param aFile The file to open if @p aFileHandle is set to @p NULL.
+ */
+ void SetInputFileInternalL(
+ RFile* aFileHandle,
+ const TDesC& aFile = KNullDesC );
+
+ /**
+ * Checks is parsing is complete.
+ *
+ * @return Whether test is complete or not.
+ */
+ TBool IsParsingComplete();
+
+ /**
+ * Completes parsing against the Symbian XML parser.
+ *
+ * @return System wide error code.
+ */
+ TInt CompleteParsing();
+
+ /**
+ * Resets the parser.
+ */
+ void ResetParser();
+
+ /**
+ * Resets the parser's state, meaning that it won't reset the underlying
+ * Symbian XML parser. It will release it's allocated resources.
+ */
+ void ResetParserState();
+
+ /**
+ * Resets the parser partly, used between when each part is parsed.
+ */
+ void ResetParserPartState();
+
+ /**
+ * Current read buffer length.
+ *
+ * @return Length of read buffer.
+ */
+ TInt BufferLength() const;
+
+ /**
+ * Checks if parsed has parsed part/on parsed landmark.
+ *
+ * @return Whether one part is parsed.
+ */
+ TBool ParsedPart();
+
+ /**
+ * Reads a predefined length from buffer/file.
+ *
+ */
+ void ReadNextPartL();
+
+ /** Informs operation to disconnect from this parser */
+ void DisconnectOperation();
+
+ /** Removes all child tags of the current tree from the tag list */
+ void RemoveChildTags();
+
+ /**
+ * Sets parser state.
+ * @param aTag Tag to set parsed state for.
+ */
+ void SetParserStateL( TPosXmlTagType aTag );
+
+ /** Converts current content to Unicode and calls SetContentL */
+ void SaveContentL( TPosXmlTagType aTag );
+
+ /** Verifies that given tag is allowed on current phase */
+ void CheckSequenceOrderL( TPosXmlTagType aTag );
+
+
+
+ protected:
+
+ // C++ default constructor
+ CPosLmXmlParser();
+
+ /** Reset parser state, including symbina XML Parser, input Buffer*/
+ void ResetContentL();
+
+ /**
+ *Close Filehandle if it is open
+ */
+ void CloseCurrentFileHandle();
+
+
+ private:
+ // By default, prohibit copy constructor
+ CPosLmXmlParser( const CPosLmXmlParser& );
+ // Prohibit assigment operator
+ CPosLmXmlParser& operator= ( const CPosLmXmlParser& );
+
+ protected:
+
+ // Saved parsed values
+ TReal64 iParsedLatitude;
+ TReal64 iParsedLongitude;
+ TReal32 iParsedAltitude;
+ TReal32 iParsedHorAcc;
+ TReal32 iParsedVertAcc;
+ HBufC* iReadMimeType;
+ HBufC* iReadUrl;
+ TUint iNoOfMediaLinks;
+
+ // Object that are changed during parsing
+ TUint32 iNumOfParsedLandmarks;
+
+ TPosLmItemId iWorkingItemId;
+ CPosLandmark* iWorkingLandmark;
+ CPosLandmarkCategory* iWorkingCategory;
+
+ RPointerArray<CPosLandmarkCategory> iCategories;
+
+ //data
+ // Stuff for handling file
+ RFs iFs;
+ RFile iFile;
+ RFile* iFileHandle;
+
+ // Parser stuff
+ Xml::CParser* iXmlParser;
+ HBufC8* iBuffer;
+ TInt iNumberOfBytesRead;
+ TInt iParserError;
+ TUint iParserStatus;
+ TReal32 iIncrBytesPerLm;
+
+ private: // Data
+
+
+
+ // Input stuff
+ TPtrC8 iInputBuffer;
+ TInt iContentSize;
+
+
+
+ // Parsed data
+ HBufC8* iRootNs;
+ HBufC8* iReadContent;
+
+ RArray<TPosXmlTagType> iReadTags;
+ RArray<TInt> iTrees;
+ TXmlParserElementState iLastElementState;
+
+ // Operation to notify
+ CPosLmXmlParserOperation* iParserOp;
+
+ RPointerArray<CPosLmParsedLmBuffer> iParsedLmBuffer;
+
+ RPointerArray<CPosLmCollectionData> iCollectionData;
+
+ };
+
+#endif // CPOSLMXMLPARSER_H
+
+// End of File