iaupdate/IAD/engine/inc/iaupdatexmlsubparser.h
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iaupdate/IAD/engine/inc/iaupdatexmlsubparser.h	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,383 @@
+/*
+* Copyright (c) 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:   ?Description
+*
+*/
+
+
+
+#ifndef IA_UPDATE_XML_SUB_PARSER_H
+#define IA_UPDATE_XML_SUB_PARSER_H
+
+
+#include <e32base.h>
+#include <e32cmn.h>
+#include <xml/contenthandler.h>
+#include <f32file.h>
+
+
+/**
+ * CIAUpdateXmlSubParser is the parent class 
+ * for IA Update XML sub parsers and provides the basic functionality
+ * that is common for all the IA Update XML sub parsers.
+ * This class can not be instantiated itself. So, child classes
+ * must be created to finalize the functionality.
+ *
+ * @since S60 v3.2
+ */
+class CIAUpdateXmlSubParser : public CBase,
+                              public Xml::MContentHandler
+    {
+
+public:
+    
+    /**
+     * Destructor
+     *
+     * @since S60 v3.2
+     */
+    IMPORT_C virtual ~CIAUpdateXmlSubParser();
+
+
+public: // Xml::MContentHandler
+
+    /**
+     * @see Xml::MContentHandler::OnStartDocumentL
+     *
+     * Initializes this sub parser and its sub parsers. 
+     *
+     * @since S60 v3.2
+     */
+    IMPORT_C virtual void OnStartDocumentL( const Xml::RDocumentParameters& aDocParam, 
+                                            TInt aErrorCode );
+                                   
+    /**
+     * @see Xml::MContentHandler::OnEndDocumentL
+     *
+     * This contains only an empty implementation. Child classes may
+     * provide their own implemenations if necessary.
+     *
+     * @since S60 v3.2
+     */
+    IMPORT_C virtual void OnEndDocumentL( TInt aErrorCode );
+                                   
+    /**
+     * @see Xml::MContentHandler::OnStartElementL
+     *
+     * If necessary, this function can set the current sub parser for this 
+     * sub parser by finding the correct subparser from the sub parser array.
+     * ElementTagInfoEquals function is used for comparison. 
+     * When the current sub parser is set, then element handling is
+     * forwarded to the subparser until end tag of the element is reached.
+     * The forwarding makes it possible to create a structural element
+     * handling. If forwarding is not required, then child classes
+     * can handle elements directly in their implementation of this function.
+     * This function will set the AcceptData flag to a correct state.
+     *
+     * Child classes may provide their own implemenations if necessary.
+     *
+     * @since S60 v3.2
+     */    
+    IMPORT_C virtual void OnStartElementL( const Xml::RTagInfo& aElement, 
+                                           const Xml::RAttributeArray& aAttributes, 
+                                           TInt aErrorCode );
+                                   
+    /**
+     * @see Xml::MContentHandler::OnEndElementL
+     *
+     * If current sub parser is set for this sub parser, hanling of the elements 
+     * is forwarded to the sub parser. ElementTagInfoEquals function is used to 
+     * check if the current subparser has finished its job. If sub parser is not
+     * needed, then sub parser is set to NULL and the responsibility of 
+     * handling elements is given back to this class object.
+     * This function will set the AcceptData flag to a correct state.
+     *
+     * Child classes may provide their own implemenations if necessary.
+     *
+     * @since S60 v3.2
+     */                                  
+    IMPORT_C virtual void OnEndElementL( const Xml::RTagInfo& aElement, 
+                                         TInt aErrorCode );
+                                   
+    /**
+     * @see Xml::MContentHandler::OnContentL
+     *
+     * If current sub parser is set for this sub parser, hanling of the elements 
+     * is forwarded to the sub parser.
+     *
+     * Child classes may provide their own implemenations if necessary.
+     *
+     * @since S60 v3.2
+     */                                
+    IMPORT_C virtual void OnContentL( const TDesC8& aBytes, 
+                                      TInt aErrorCode );
+                                   
+    /**
+     * @see Xml::MContentHandler::OnStartPrefixMappingL
+     *
+     * This contains only an empty implementation. Child classes may
+     * provide their own implemenations if necessary.
+     *
+     * @since S60 v3.2
+     */                             
+    IMPORT_C virtual void OnStartPrefixMappingL( const RString& aPrefix, 
+                                                 const RString& aUri, 
+                                                 TInt aErrorCode);
+                                   
+    /**
+     * @see Xml::MContentHandler::OnEndPrefixMappingL
+     *
+     * This contains only an empty implementation. Child classes may
+     * provide their own implemenations if necessary.
+     *
+     * @since S60 v3.2
+     */                                        
+    IMPORT_C virtual void OnEndPrefixMappingL( const RString& aPrefix, 
+                                               TInt aErrorCode );
+                                   
+    /**
+     * @see Xml::MContentHandler::OnIgnorableWhiteSpaceL
+     *
+     * This contains only an empty implementation. Child classes may
+     * provide their own implemenations if necessary.
+     *
+     * @since S60 v3.2
+     */    
+    IMPORT_C virtual void OnIgnorableWhiteSpaceL( const TDesC8& aBytes, 
+                                                  TInt aErrorCode );
+                                   
+    /**
+     * @see Xml::MContentHandler::OnSkippedEntityL
+     *
+     * This contains only an empty implementation. Child classes may
+     * provide their own implemenations if necessary.
+     *
+     * @since S60 v3.2
+     */    
+    IMPORT_C virtual void OnSkippedEntityL( const RString& aName, 
+                                            TInt aErrorCode );
+                                   
+    /**
+     * @see Xml::MContentHandler::OnProcessingInstructionL
+     *
+     * This contains only an empty implementation. Child classes may
+     * provide their own implemenations if necessary.
+     *
+     * @since S60 v3.2
+     */    
+    IMPORT_C virtual void OnProcessingInstructionL( const TDesC8& aTarget, 
+                                                    const TDesC8& aData, 
+                                                    TInt aErrorCode );
+                                   
+    /**
+     * @see Xml::MContentHandler::OnError
+     *
+     * This contains only an empty implementation. Child classes may
+     * provide their own implemenations if necessary.
+     *
+     * @since S60 v3.2
+     */
+    IMPORT_C virtual void OnError( TInt aErrorCode );
+                                   
+    /**
+     * @see Xml::MContentHandler::GetExtendedInterface
+     *
+     * This contains only an empty implementation. Child classes may
+     * provide their own implemenations if necessary.
+     *
+     * @since S60 v3.2
+     */    
+    IMPORT_C virtual TAny* GetExtendedInterface( const TInt32 aUid );
+
+
+protected:
+    
+    /**
+     * Constructor
+     *
+     * @since S60 v3.2
+     */
+    IMPORT_C CIAUpdateXmlSubParser();
+    
+    /**
+     * 2nd. phase constructor.
+     *
+     * @note This may be a good place for the child classes to implement
+     * a functionality that adds its sub browsers to the sub browser array
+     * that is used to delegate element handling to correct places.
+     *
+     * @param aElementLocalName This value is the local name of the
+     * element that this parser is for. ElementTagInfoEquals function uses
+     * this as a default to check if this parser is meant for the element
+     * that the platform XML parser gives.
+     *
+     * @since S60 v3.2
+     */
+    IMPORT_C virtual void ConstructL( const TDesC8& aElementLocalName );
+
+    
+    /**
+     * @return const TDesC& Local name of this element.
+     *
+     * @since S60 v3.2
+     */
+    IMPORT_C const TDesC8& LocalName() const;
+
+
+    /**
+     * Gives the current sub parser of this sub parser if one has been set.
+     * Sub parser is set when the element handling is forwarded to
+     * a sub parser in OnStartElementL function. OnStartElementL function
+     * of this class does it automatically. So, child classes can
+     * use this functionality. NULL is returned if sub parser has
+     * handled its job and OnEndElementL has been called for that
+     * element.
+     *
+     * @return CIAUpdateXmlSubParser* Current sub parser or NULL if no
+     * sub parser is in use. Ownerhsip is NOT transferred.
+     *
+     * @since S60 v3.2
+     */
+    IMPORT_C CIAUpdateXmlSubParser* CurrentSubParser() const;
+
+
+    /**
+     * This method can be used to get the array and
+     * insert and remove sub parsers from it. 
+     *
+     * @return RPointerArray< CIAUpdateXmlSubParser >& Reference to the
+     * sub parser array. 
+     *
+     * @since S60 v3.2
+     */
+    IMPORT_C RPointerArray< CIAUpdateXmlSubParser >& SubParsers();
+    
+    
+    /**
+     * Compares the tag information of the given object to the tag info 
+     * of the main element of this parser.
+     *
+     * @note This default implementation compares only element local names.
+     * The local name for this element is given in the ConstructL of 
+     * this class. Child classes may implement their own functionality here.
+     *
+     * @note This value is used by OnStartElementL and OnEndElementL functions
+     * when current subparser is checked for the given element.
+     *
+     * @param aElement Information about the element that has been gotten
+     * from the XML parser.
+     * @return TBool ETrue if tag infos match. 
+     * EFalse if tag infos do not match. 
+     *
+     * @since S60 v3.2
+     */
+    IMPORT_C TBool ElementTagInfoEquals( const Xml::RTagInfo& aElement ) const;
+
+
+    /**
+     * This flag is used to check if this sub parser should handle the given element or content.
+     * 
+     * @return TBool If sub parser has forwarded the task to another sub parser 
+     * or if the given element does not match the element of this sub parser, 
+     * then this flag is EFalse. If this class object should handle the element and it
+     * matches the element of this sub parser, then this flag is ETrue.
+     *
+     * @since S60 v3.2
+     */
+    IMPORT_C TBool AcceptData() const;    
+    
+
+    /**
+     * This flag is used to check if this sub parser has handled its on starting element.
+     * This is needed because sub element may have a same name with this element. So,
+     * just name comparing is not enough.
+     *
+     * @return TBool ETrue if this sub parser has already handled its start element.
+     * EFalse if this sub parser has not already handled its start element.
+     *
+     * @since S60 v3.2
+     */
+    IMPORT_C TBool IsElementStarted() const;
+
+
+    /**
+     * This flag is used to check if this sub parser has handled its on end element.
+     * This is needed because sub element may have a same name with this element. So,
+     * just name comparing is not enough.
+     *
+     * @return TBool ETrue if this sub parser has already handled its end element.
+     * EFalse if this sub parser has not already handled its end element.
+     *
+     * @since S60 v3.2
+     */
+    IMPORT_C TBool IsElementEnded() const;
+
+
+    /**
+     * Informs how many unknown elements are in line with this parser.
+     *
+     * @return TInt Number of unknown elements that this parser have to handle
+     * before new possible known elements can be handled.
+     *
+     * @since S60 v3.2
+     */
+    IMPORT_C TInt UnknownElementCounter() const;
+
+
+private:
+    
+    // Prevent these if not implemented
+    CIAUpdateXmlSubParser( const CIAUpdateXmlSubParser& aObject );
+    CIAUpdateXmlSubParser& operator =( const CIAUpdateXmlSubParser& aObject );
+
+
+private: // data
+
+    // Local name of the element of this sub parser.
+    HBufC8* iElementLocalName;
+
+    // This array will contain other instances of the parsers that this
+    // parser uses as subparsers. This way element hierarchy can be browsed
+    // through.
+    RPointerArray< CIAUpdateXmlSubParser > iSubParsers;    
+    
+    // iCurrentSubParser points to the subparser that this class object
+    // forwards element handling to.
+    // Notice, that the iSubParsers array has the ownership of the
+    // subparsers. So, do not delete this object separately.
+    // This is NULL if there is no current subparser in use.
+    CIAUpdateXmlSubParser* iCurrentSubParser;
+    
+    // This flag is used to check if this sub parser should handle the given element or content.
+    // If sub parser has given the task to another sub parser or if the given element does not
+    // match the element of this sub parser, then this flag is EFalse.
+    TBool iAcceptData;
+
+    // This flag is used to check if this sub parser has handled its on starting element.
+    // This is needed because sub element may have a same name with this element. So,
+    // just name comparing is not enough.
+    TBool iIsElementStarted;
+
+    // This flag is used to check if this sub parser has handled its on ending element.
+    // This is needed because sub element may have a same name with this element. So,
+    // just name comparing is not enough.
+    TBool iIsElementEnded;
+    
+    // Number of unknown elements that this parser have to handle
+    // before new possible known elements can be handled.
+    TInt iUnknownElementCounter;
+    };
+
+#endif // IA_UPDATE_XML_SUB_PARSER_H
+