pressrv_plat/xdm_api/inc/XdmDocumentNode.h
changeset 0 c8caa15ef882
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pressrv_plat/xdm_api/inc/XdmDocumentNode.h	Tue Feb 02 01:05:17 2010 +0200
@@ -0,0 +1,525 @@
+/*
+* 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:   XDM document node
+*
+*/
+
+
+
+
+#ifndef __XDMDOCUMENTNODE__
+#define __XDMDOCUMENTNODE__
+
+#include <e32base.h>
+#include "XdmNodeInterface.h"
+
+enum TXdmElementType
+    {
+    EXdmElementNode = 0,
+    EXdmElementAttribute,
+    EXdmElementUnspecified
+    };
+
+class CXdmEngine;
+struct SXdmAttribute8;
+struct SXdmAttribute16;
+class MXdmNodeFactory;
+class CXdmNodeAttribute;
+class CXdmOperationFactory;
+
+//CLASS DECLARATION
+class CXdmDocumentNode : public CBase, public MXdmNodeInterface
+    {
+    public:  // Constructors and destructor
+        
+        /**
+        * Create a new child element
+        *
+		* @return CXdmDocumentNode* 
+        */
+        IMPORT_C CXdmDocumentNode* CreateChileNodeL();
+        
+        /**
+        * Create a new child element
+        *
+        * @param TDesC8& Name of the new element
+		* @return CXdmDocumentNode* 
+        */
+        IMPORT_C CXdmDocumentNode* CreateChileNodeL( const TDesC& aChildName );
+
+        /**
+        * Create a new attribute
+        *
+        * @param TDesC8& Name of the new attribute
+		* @return CXdmNodeAttribute* 
+        */
+        IMPORT_C CXdmNodeAttribute* CreateAttributeL();
+        
+        /**
+        * Create a new attribute
+        *
+        * @param TDesC8& Name of the new attribute
+		* @return CXdmNodeAttribute* 
+        */
+        IMPORT_C CXdmNodeAttribute* CreateAttributeL( const TDesC& aAttributeName );
+
+        /**
+        * Set the contents of a leaf node. Fails if this element
+        * is not a leaf element.
+        *
+        * <leaf>leafnodecontent</leaf>
+        *
+        *
+        * @param TDesC8& Content of the leaf element
+		* @return void 
+        */
+        IMPORT_C void SetLeafNodeContentL( const TDesC& aLeafContent );
+        
+        /**
+        * Set the contents of a leaf node. Fails if this element
+        * is not a leaf element.
+        *
+        * <leaf>leafnodecontent</leaf>
+        *
+        *
+        * @param TDesC8& Content of the leaf element
+		* @return void 
+        */
+        IMPORT_C void SetLeafNodeContentL( const TDesC8& aLeafContent );
+        
+        /**
+        * Define this node to be a leaf node. Default value is EFalse,
+        * so this method only needs to be called when the client wants to
+        * define a node a leaf node. The operation can, of course, be
+        * reverted if needed.
+        *
+        * @param TBool Define/undefine this node to be a leaf node
+		* @return void 
+        */
+        IMPORT_C void SetLeafNode( TBool aIsLeafNode );
+        
+        /**
+        * Define this node to be empty. Default value is EFalse,
+        * so this method only needs to be called when the client wants
+        * to indicate that a node does not/will not have children.
+        * The operation can be reverted if needed.
+        *
+        * NOTE: An attempt to create children on an empty node will
+        *       result in a panic being raised. Respectively, if a
+        *       client application wants to revert the state of a 
+        *       node from non-empty to empty, all children that may
+        *       have been created will be removed.
+        *
+        * @param TBool Define/undefine this node to be empty
+		* @return void 
+        */
+        IMPORT_C void SetEmptyNode( TBool aIsEmptyNode );
+        
+        /**
+        * Report whether or not this is a leaf element
+		* @return TBool Is this a leaf element
+        */
+        IMPORT_C TBool IsLeafNode() const;
+        
+        /**
+        * Report whether or not this element is empty
+		* @return TBool Is this an empty element
+        */
+        IMPORT_C TBool IsEmptyNode() const;
+        
+        /**
+        * Return the contents of a leaf element
+		* @return TPtrC8 Contents of the leaf element
+        */
+        IMPORT_C TPtrC8 LeafNodeContent() const;
+        
+        /**
+        * Return the contents of a leaf element escape-coded, if needed
+		* @return TPtrC8 Contents of the leaf element
+        */
+        IMPORT_C HBufC8* EscapeLeafNodeContentLC() const;
+
+        /**
+        * Returns the contents of a single element without any brackets
+        * and pushes the buffer onto the CleanupStack.
+        *
+        * For instance:
+        *
+        * 'element attribute1 = "value" attribute2 = "another value"'
+        *
+		* @return HBufC8* 
+        */
+        IMPORT_C HBufC8* ElementDataLC() const;
+        
+        /**
+        * Return the parent node of this element
+        *
+		* @return CXdmDocumentNode* 
+        */
+        IMPORT_C CXdmDocumentNode* Parent() const;
+        
+        /**
+        * Name of this element
+		* @return TPtrC8 Name of this element
+        */
+        IMPORT_C TPtrC NodeName() const;
+
+        /**
+        * Name of this element
+		* @return TPtrC8 Name of this element
+        */
+        IMPORT_C HBufC8* EightBitNodeNameLC() const;
+        
+        /**
+        * (Re-)Set the name of this element
+		* @param TDesC& Name of this element
+        * @return void
+        */
+        IMPORT_C void SetNameL( const TDesC& aNodeName );
+        
+        /**
+        * (Re-)Set the name of this element
+		* @param TDesC& Name of this element
+        * @return void
+        */
+        IMPORT_C void SetNameL( const TDesC8& aNodeName );
+        
+        /**
+        * Returns the number of child & lealf elements
+        *
+        * @return TInt Number of descendants
+        */
+        IMPORT_C TInt NodeCount() const;
+
+        /**
+        * Returns the number of attributes of this element
+        *
+		* @return TInt The number of attributes 
+        */
+        IMPORT_C TInt AttributeCount() const;
+
+        /**
+        * Returns a child node specified by its position among the
+        * descendants of an element
+        *
+		* @return CXdmDocument* 
+        */
+        IMPORT_C CXdmDocumentNode* ChileNode( TInt aPosition ) const;
+
+        /**
+        * Reference an attribute of this element specified by the position
+        * of the attribute
+        *
+		* @return CXdmDocument* 
+        */
+        IMPORT_C CXdmNodeAttribute* Attribute( TInt aPosition ) const;
+        
+        /**
+        * Reference an attribute of this element specified by the position
+        * of the attribute
+        *
+		* @return CXdmDocument* 
+        */
+        IMPORT_C CXdmNodeAttribute* Attribute( const TDesC& aAttributeName ) const;
+        
+        /**
+        * Search for nodes which match the specified name
+        *
+        * @param TDesC& The element name to search for
+        * @param RPointerArray<CXdmDocumentNode> Results, if any
+		* @return TInt Error
+        */
+        IMPORT_C TInt Find( const TDesC& aNodeName,
+                            RPointerArray<CXdmDocumentNode>& aResultArray ) const;
+                   
+        /**
+        * Search for nodes which match the specified node
+        *
+        * @param CXdmDocumentNode& The node to compare to
+		* @return TInt KErrNotFound if no matching nodes are found
+        */
+        IMPORT_C TInt Find( const CXdmDocumentNode& aTargetNode,
+                            RPointerArray<CXdmDocumentNode>& aResultArray ) const;
+                   
+        /**
+        * Search for nodes which match the specified name & attributes
+        *
+        * @param TDesC& The element name to search for
+        * @param RPointerArray<CXdmDocumentNode>& Results
+        * @param RPointerArray<SXdmAttribute16>& Attributes to search for
+		* @return TInt KErrNotFound if no matching nodes are found
+        */
+        IMPORT_C TInt Find( const TDesC& aNodeName,
+                            RPointerArray<CXdmDocumentNode>& aResultArray,
+                            const RPointerArray<SXdmAttribute16>& aAttributeArray ) const;
+
+
+        /**
+        * The type of this element: an element or an attribute
+		* @return TXdmElementType* 
+        */
+        IMPORT_C TBool Match( const CXdmDocumentNode& aAnotherNode ) const;
+                              
+        /**
+        * The type of this element: an element or an attribute
+		* @return TXdmElementType* 
+        */
+        IMPORT_C TBool Match( const TDesC& aNodeName,
+                              const RPointerArray<SXdmAttribute8>& aAttributeArray ) const;
+        
+        /**
+        * Comparison operator
+        *
+		* @return TBool Are the contents of this object identical to
+		*               the ones in the parameter
+        */
+        IMPORT_C TBool operator==( const CXdmDocumentNode& aNode ) const;
+        
+        /**
+        * The type of this element: an element or an attribute
+		* @return TXdmElementType* 
+        */                    
+        IMPORT_C TBool HasAttribute( const TDesC& aAttributeName ) const;
+                              
+        /**
+        * The type of this element: an element or an attribute
+		* @return TXdmElementType* 
+        */
+        IMPORT_C virtual TXdmElementType ElementType() const;
+        
+        /**
+        * Remove a child node
+        * @param CXdmDocumentNode The element to be removed
+		* @return void 
+        */
+        IMPORT_C void RemoveChileNodeL( CXdmDocumentNode* aChileNode );
+        
+        /**
+        * Append a child node
+        * @param CXdmDocumentNode The element to be appended
+		* @return void 
+        */
+        IMPORT_C void AppendChileNodeL( CXdmDocumentNode* aChileNode );
+        
+        /**
+        * Insert a child node to the given position
+        * @param TInt The position of the new element
+        * @param CXdmDocumentNode The element to be inserted
+		* @return void 
+        */
+        IMPORT_C void InsertChileNodeL( TInt aIndex, CXdmDocumentNode* aChileNode );
+        
+        /**
+        * Replace a child node
+        * @param CXdmDocumentNode The new node
+        * @param CXdmDocumentNode The node to be replaced
+		* @return void 
+        */
+        IMPORT_C void ReplaceChileNodeL( CXdmDocumentNode* aNewNode,
+                                         CXdmDocumentNode* aTargetNode );
+                                            
+        /**
+        * Destructor.
+        */
+        IMPORT_C ~CXdmDocumentNode();
+    
+    public:
+    
+        /**
+        * Print the contents of this node to the log file
+        *
+		* @return void 
+        */
+        IMPORT_C void Print();
+        
+        /**
+        * Return the next node in the list
+		* @return CXdmDocumentNode* 
+        */
+        IMPORT_C CXdmDocumentNode* NextNode() const;
+        
+        /**
+        * Set the next node in the list
+        * @param The next node in the list
+		* @return void 
+        */
+        IMPORT_C void SetNextNode( CXdmDocumentNode* aNextNode );
+    
+    public:
+        
+        /**
+        * Check whether an element has the specified attribute
+        *
+        * @param CXdmNodeAttribute& The specified attribute
+		* @return TBool Does the element have the specified attribute
+        */
+        TBool HasAttribute( const CXdmNodeAttribute& aNode ) const;
+        
+        /**
+        * Check whether an element has the specified attribute
+        *
+        * @param SXdmAttribute8& The specified attribute
+		* @return TBool Does the element have the specified attribute
+        */
+        TBool HasAttributeL( const SXdmAttribute8& aAttribute ) const;
+        
+        /**
+        * Check whether an element has the specified attribute
+        *
+        * @param SXdmAttribute16& The specified attribute
+		* @return TBool Does the element have the specified attribute
+        */
+        TBool HasAttribute( const SXdmAttribute16& aAttribute ) const;
+        
+    protected: // New functions
+        
+        /**
+        * Escape-code the specified string
+        *
+        * @param TDesC8& The descriptor to escape-code
+		* @return HBufC8* Escape-coded string
+        */
+        HBufC8* EscapeDescLC( const TDesC8& aDescriptor ) const;
+
+    protected:
+		                           
+        /**
+        * C++ constructor, for derived classes
+        *
+        * @param CXdmEngine* Reference to the engine
+        * @param MXdmNodeFactory* Reference to the node factory
+        * @param CXdmDocumentNode* The parent node of this element
+        */
+		IMPORT_C CXdmDocumentNode( CXdmEngine& aXdmEngine,
+		                           MXdmNodeFactory& aNodeFactory,
+		                           CXdmDocumentNode* aParentNode );
+		
+		/**
+        * CC++ constructor, for derived classes
+        *
+        * @param CXdmEngine* Reference to the engine
+        * @param MXdmNodeFactory* Reference to the node factory
+        */
+        IMPORT_C CXdmDocumentNode( CXdmEngine& aXdmEngine,
+                                   MXdmNodeFactory& aNodeFactory );
+
+        /**
+        * C++ constructor, for derived classes
+        *
+        * @param CXdmEngine* Is this a leaf element
+        * @param CXdmEngine* Reference to the engine
+        * @param MXdmNodeFactory* Reference to the node factory
+        * @param CXdmDocumentNode* The parent node of this element
+        */
+		IMPORT_C CXdmDocumentNode( const TBool aLeafNode,
+		                           CXdmEngine& aXdmEngine,
+		                           MXdmNodeFactory& aNodeFactory,
+                                   CXdmDocumentNode* aParentNode );
+       
+        /**
+        * Symbian OS constructor for derived classes.
+        *
+        * @param TDesC8& Name of this element
+        * @return void
+        */
+		IMPORT_C void BaseConstructL( const TDesC& aNodeName );
+		
+		/**
+        * Copy constructor
+        *
+        * @param CXdmDocumentNode& The element to copy
+        * @param CXdmDocumentNode& The parent of this element
+        * @return void
+        */
+		IMPORT_C virtual void CopyConstructL( const CXdmDocumentNode& aAnotherNode,
+		                                      const CXdmDocumentNode& aParentNode );
+    
+    private:
+        
+        /**
+        * Search for nodes which match the specified name
+        *
+        * @param TDesC& The element name to search for
+        * @param RPointerArray<CXdmDocumentNode> Results, if any
+		* @return TInt KErrNotFound if no matches were found,
+		*         number of matching elements otherwise
+        */
+        TInt DoFind( const TDesC& aNodeName,
+                     RPointerArray<CXdmDocumentNode>& aResultArray ) const;
+        
+        /**
+        * Search for nodes which match the specified node
+        *
+        * @param CXdmDocumentNode& The node to compare to
+		* @return TInt KErrNotFound if no matching nodes are found
+        */             
+        TInt DoFind( const CXdmDocumentNode& aTargetNode,
+                     RPointerArray<CXdmDocumentNode>& aResultArray ) const;
+        
+        /**
+        * Search for nodes which match the specified name & attributes
+        *
+        * @param TDesC& The element name to search for
+        * @param RPointerArray<CXdmDocumentNode>& Results
+        * @param RPointerArray<SXdmAttribute16>& Attributes to search for
+		* @return TInt KErrNotFound if no matching nodes are found
+        */              
+        TInt DoFind( const TDesC& aNodeName,
+                     RPointerArray<CXdmDocumentNode>& aResultArray,
+                     const RPointerArray<SXdmAttribute16>& aAttributeArray );
+                            
+        /**
+        * Copy the child nodes of another element.
+        *
+        * @param CXdmDocumentNode& The element the children of which should be copied
+        * @return void
+        */
+        void ConstructChildrenL( const CXdmDocumentNode& aAnotherNode );
+        
+        /**
+        * Copy the attributes of another element.
+        *
+        * @param CXdmDocumentNode& The element the attributes of which should be copied
+        * @return void
+        */
+        void ConstructAttributesL( const CXdmDocumentNode& aAnotherNode );
+        
+        /**
+        * Remove namespace attributes from this element. Namespaces must 
+        * not be used when comparing two elements, which is why these 
+        * attributes need to be removed before the comparison.
+        *
+        * @return void
+        */
+        void RemoveNamespaceAttributes();
+    
+    protected:
+        
+        TInt                                        iPosition;
+        TBool                                       iLeafNode;
+        TBool                                       iEmptyNode;
+        HBufC*                                      iNodeName;
+        HBufC8*                                     iLeafContent;
+        CXdmEngine&                                 iXdmEngine;
+        MXdmNodeFactory&                            iNodeFactory;
+        friend class                                CXdmDocument;
+        CXdmDocumentNode*                           iNextNode;
+        CXdmDocumentNode*                           iParentNode;
+        RPointerArray<CXdmDocumentNode>             iChildren;
+        RPointerArray<CXdmNodeAttribute>            iAttributes;  
+    };
+
+#endif      //__XDMDOCUMENTNODE__
+            
+// End of File