xdmprotocols/XdmXmlParser/inc/XmlFormatter.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:23:14 +0100
branchRCL_3
changeset 18 fbd2e7cec7ef
parent 0 c8caa15ef882
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201027 Kit: 201035

/*
* Copyright (c) 2005 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:   CXmlFormatter
*
*/




#ifndef __XMLFORMATTER__
#define __XMLFORMATTER__

// INCLUDES
#include <e32base.h>
#include "XmlParserNodePath.h"
#include "XmlNodePathInterface.h"

//Konsts
_LIT8( KXmldocumentStart,               "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" );

//Forwar declarations
class CXdmDocument;
class CXdmXmlParser;
class CXdmDocumentNode;
class MXdmNodeInterface;
class CXmlParserNodePath;

// CLASS DECLARATION
NONSHARABLE_CLASS( CXmlFormatter ) : public CBase,
                                     public MXmlNodePathInterface
    {
    public:  // Constructors and destructor
        
        /**
        * Symbian OS Constructor
        * @return CXmlFormatter* New XML formatter
        */
        static CXmlFormatter* NewL( CXdmXmlParser& aParserMain );
        
        /**
        * Format a document
        * @param TBool Indicates whether parameter is a whole document
        * @param CXdmDocument* The target document
        * @param CXdmDocumentNode* The target element
        * @return HBufC8* The document in textual form
        */
        HBufC8* FormatLC( TBool aIsWholeDocument,
                          const CXdmDocument* aDocument,
                          const CXdmDocumentNode* aRootNode );
        
        /**
        * Format a document
        * @param TDesC8& An XML fragment to append
        * @param CXdmDocument* The target document
        * @param CXdmDocumentNode* The target element
        * @return HBufC8* The document in textual form
        */
        HBufC8* FormatLC( const TDesC8& aXmlFragment,
                          const CXdmDocument* aDocument,
                          const CXdmDocumentNode* aTargetNode );
                          
        /**
        * Destructor
        */
        virtual ~CXmlFormatter();
    
    private:  //From MXmlParserNodePathInterface
        
        /**
        * Return the target attribute
        * @return CXdmNodeAttribute* target attribute
        */
        CXdmNodeAttribute* TargetAttribute() const;
        
    private:
        
        /**
        * C++ constructor
        * @return CXmlFormatter
        */
        CXmlFormatter( CXdmXmlParser& aParserMain );
        
        /**
        * Symbian OS second-phase constructor
        * @return void
        */
        void ConstructL();

        /**
        * Read data from the format buffer into a contiguous segment
        * @return HBufC8* An XML document in textual form
        */  
        HBufC8* BufferToStringLC();
        
        /**
        * Check the next element in a document
        * @param CXdmDocumentNode& An XML element
        * @return void
        */
        void CheckSubsetPath( const CXdmDocumentNode& aNode );
        
        /**
        * Reset the internal format buffer
        * @return void
        */  
        void ResetFormatBuffer();
        
        /**
        * Find the (local) name of an element
        * @param TDesC8& The whole element string
        * @return TPtrC8 Name part of the element string
        */ 
        TPtrC8 FindElementName( const TDesC8& aElementString );
        
        /**
        * Format namespace declarations
        * @param CXdmDocumentNode& An XML element
        * @return MXdmNamespaceContainer& Namespace container
        */ 
        void FormatNamespaceDeclarationsL( const CXdmDocumentNode& aRootNode,
                                           const MXdmNamespaceContainer& aContainer );
                                           
        /**
        * Format the parameter element and its descendants
        * @param CXdmDocumentNode The element to format
        * @return void
        */  
        void FormatElementsL( CXdmDocumentNode* aCurrentNode );

        /**
        * Format a leaf element 
        * @param CXdmDocumentNode The element to format
        * @return void
        */    
        void FormatLeafElementL( CXdmDocumentNode* aCurrentNode );
        
        /**
        * Format the start of the parameter element
        * @param TDesC8& Element prefix 
        * @param TDesC8& Element URI 
        * @return void
        */ 
        void FormatElementStartL( const TDesC8& aPrefix,
                                  const TDesC8& aElementData ); 

        /**
        * Format the end of the parameter element
        * @param TDesC8& Element prefix 
        * @param TDesC8& Element URI 
        * @return void
        */ 
        void FormatElementEndL( const TDesC8& aPrefix,
                                const TDesC8& aElementData );
        
        /**
        * Format an empty element 
        * @param CXdmDocumentNode The element to format
        * @return void
        */    
        void FormatEmptyElementL( CXdmDocumentNode* aEmptyNode );
        
                                                   
        /**
        * Append a namespace mapping
        * @param TDesC8& Element URI 
        * @param TDesC8& Element prefix
        * @return void
        */                                      
        void AppendNamespaceL( const TDesC8& aUri, const TDesC8& aPrefix );
        
        /**
        * Append XML fragment into the format buffer
        * @return void
        */ 
        void AppendXmlFragmentL();
        
        /**
        * Return the prefix of the parameter element
        * @param MXdmNodeInterface& An XML element
        * @return TPtrC8 Prefix
        */  
        TPtrC8 Prefix( const MXdmNodeInterface& aInterface );
        
    private: //Data
        
        TInt                                iFormBufferPos;
        TBool                               iTargetFound;
        TBool                               iIsAppended;
        CBufSeg*                            iFormatBuffer;
        TPtrC8                              iDocumentFragment;
        CXdmXmlParser&                      iParserMain;
        CXdmNodeAttribute*                  iTargetAttribute;
        CXmlParserNodePath*                 iNodePath;
        TXdmElementType                     iElementType;
       
    };

#endif  //__XMLPARSERNODEPATH__


// End of File