--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/xml/legacyminidomparser/xmldom/src/gmxmlelement.cpp Mon Sep 13 13:16:40 2010 +0530
@@ -0,0 +1,378 @@
+// Copyright (c) 2001-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:
+// MDXMLElement.CPP
+// @file
+// This file contains the implementation of the CMDXMLElement class.
+// This class represents a generic XML element with attributes
+// stored as name-value pairs. DTD-specific element classes
+// will store their attributes as member variables.
+//
+//
+
+#include <f32file.h>
+
+#include <gmxmldomconstants.h>
+#include <gmxmlnode.h>
+#include <gmxmldocument.h>
+#include <gmxmlelement.h>
+
+
+EXPORT_C CMDXMLElement* CMDXMLElement::NewLC( TBool aCanHaveChildren, CMDXMLDocument* aOwnerDocument, TPtrC aTagName )
+//
+// Two phase constructor
+// @param aCanHaveChildren Flag to indicate if the node represents a node
+// @param aOwnerDocument Pointer to the document at the root of the DOM tree
+// @param aTagName Name of the tag used to create the element
+// @return Created CMDXMLElement
+// @leave can Leave due to OOM
+//
+ {
+ CMDXMLElement* elPtr = new(ELeave) CMDXMLElement( aCanHaveChildren, aOwnerDocument );
+ CleanupStack::PushL( elPtr );
+ elPtr->SetNodeNameL( aTagName );
+ elPtr->ConstructL();
+ return elPtr;
+ }
+
+EXPORT_C CMDXMLElement* CMDXMLElement::NewL( TBool aCanHaveChildren, CMDXMLDocument* aOwnerDocument, TPtrC aTagName )
+//
+// Two phase constructor
+// @param aCanHaveChildren Flag to indicate if the node represents a node
+// @param aOwnerDocument Pointer to the document at the root of the DOM tree
+// @param aTagName Name of the tag used to create the element
+// @return Created CMDXMLElement
+// @leave can Leave due to OOM
+//
+ {
+ CMDXMLElement* elPtr = CMDXMLElement::NewLC( aCanHaveChildren, aOwnerDocument, aTagName );
+ CleanupStack::Pop(elPtr);
+ return elPtr;
+ }
+
+EXPORT_C CMDXMLElement::CMDXMLElement( TBool aCanHaveChildren, CMDXMLDocument* aOwnerDocument ):
+CMDXMLNode( EElementNode, aCanHaveChildren, aOwnerDocument)
+//
+// Constructor
+// @param aCanHaveChildren Flag to indicate if the node represents a node which is allowed children
+// @param aOwnerDocument Pointer to the document at the root of the DOM tree
+//
+ {
+ // No other work to do.
+ }
+
+void CMDXMLElement::ConstructL()
+/**
+ * 2nd-phase constructor. Initialises this object's member data.
+ *
+ * @leave KErrXxx Standard EPOC error codes if allocation or construction of the object's members fails
+ */
+ {
+ iDescAttName = new (ELeave) CDesCArraySeg(1);
+ iDescAttValue = new (ELeave) CDesCArraySeg(1);
+
+ }
+
+EXPORT_C CMDXMLElement::~CMDXMLElement()
+/**
+ * C++ destructor
+ */
+ {
+ // Delete the array of attribute name-value pairs.
+ if(iDescAttName)
+ delete iDescAttName;
+
+ if(iDescAttValue)
+ delete iDescAttValue;
+
+ }
+
+
+EXPORT_C TInt CMDXMLElement::GetAttribute(const TDesC& aAttributeName, TPtrC& aAttributeValue) const
+//
+// Returns the attribute value if it is set.
+// @param aAttributeName Name of attribute to return
+// @param aAttributeValue Value of attribute returned
+// @return Returns KErrNone if successful, KErrNotFound if the named attribute
+// is not set or KErrNotSupported if the named attribute doesn't exist.
+//
+ {
+ TInt returnValue = KErrNone;
+
+ TInt index;
+ TInt attributeFound;
+ attributeFound = iDescAttName->Find(aAttributeName,index);
+
+ if(attributeFound == 0)
+ {
+ aAttributeValue.Set(iDescAttValue->MdcaPoint(index));
+ }
+ else
+ returnValue = KErrNotSupported;
+
+ return returnValue;
+
+ }
+
+EXPORT_C TInt CMDXMLElement::SetAttributeL(const TDesC& aAttributeName, const TDesC& aAttributeValue)
+//
+// Sets the attribute value.if it is valid
+// @param aAttributeName Name of attribute to set
+// @param aAttributeValue Value of attribute
+// @return Returns KErrNone if successful, KErrNotSupported if a DTD-specific class.
+// @leave Can Leave due to OOM
+//
+ {
+ return SetAttributeL(aAttributeName, aAttributeValue, EFalse);
+ }
+
+EXPORT_C TInt CMDXMLElement::SetAttributeL(const TDesC& aAttributeName, const TDesC& aAttributeValue, TBool aStoreInvalid)
+//
+// Checks an attribute for validity and adds it to the DOM. The aStoreInvalid parameter is used to control whether invalid
+// attributes are added to the DOM.
+// @param aAttributeName Name of attribute to set
+// @param aAttributeValue Value of attribute
+// @param aStoreInvalid If set to ETrue all attributes will be stored in the DOM. Otherwise only those that are valid will be.
+// @return Returns KErrNone if successful, KErrNotSupported if a DTD-specific class.
+// @leave Can Leave due to OOM
+//
+ {
+ TInt returnValue = (iOwnerDocument->DtdRepresentation()).IsValidAttributeForElementL(NodeName(), aAttributeName, aAttributeValue);
+
+ if(returnValue == KErrNone || aStoreInvalid)
+ {
+ iDescAttName->AppendL(aAttributeName);
+ iDescAttValue->AppendL(aAttributeValue);
+ }
+
+ return returnValue;
+ }
+
+EXPORT_C TInt CMDXMLElement::RemoveAttribute(const TDesC& aAttributeName)
+//
+// Removes the named attribute if present.
+// @param aAttributeName Name of attribute to set
+// @return Returns KErrNone if successful, KErrNotFound if the named attribute is not set, KErrNotSupported if a DTD-specific class.
+//
+ {
+ TInt returnValue = KErrNone;
+
+ TInt index;
+ TInt attributeFound;
+ attributeFound = iDescAttName->Find(aAttributeName,index);
+
+ if(attributeFound == 0)
+ {
+ iDescAttName->Delete(index);
+ iDescAttValue->Delete(index);
+ }
+ else
+ returnValue = KErrNotFound;
+
+ return returnValue;
+ }
+
+
+EXPORT_C TBool CMDXMLElement::IsAttributeSpecified(const TDesC& aAttributeName) const
+//
+// Finds out whether or not the named attribute is set
+// @param aAttributeName Name of attribute that is subject of the enquiry.
+// @return true of the named attribute has a value set, false if not
+//
+ {
+ TBool returnValue = EFalse;
+
+ if(iDescAttName)
+ {
+ TInt index = 0;
+ TInt found = 0;
+ found = iDescAttName->Find(aAttributeName,index);
+ if(found == 0)
+ returnValue = ETrue;
+ }
+
+ return returnValue;
+ }
+
+
+
+
+
+EXPORT_C TBool CMDXMLElement::CheckImmediateChildren()
+// Check the immediate children of this element - i.e. the first level of children only
+// If the document has not been constructed with a pointer to a MXMLDtd object then a default ETrue will be returned
+// Otherwise the MXMLDtd object is used to validate immediate children - returns ETrue if valid
+// @return True if immediate children are valid
+ {
+ TBool returnValue = ETrue;
+ TRAPD(error,returnValue = DoCheckImmediateChildrenL());
+ if(error != KErrNone)
+ {
+ return EFalse;
+ }
+ return returnValue;
+ }
+
+TBool CMDXMLElement::DoCheckImmediateChildrenL()
+ {
+ TBool returnValue = ETrue;
+
+ // Create an array of this elements immediate children
+ CDesCArray* children = new (ELeave) CDesCArrayFlat(3);
+ CleanupStack::PushL(children);
+
+ if (HasChildNodes())
+ {
+ CMDXMLNode* childPtr;
+ childPtr = FirstChild();
+ // Cycle through the siblings
+ while (childPtr != NULL)
+ {
+ if( childPtr->NodeType() == EElementNode )
+ children->AppendL(childPtr->NodeName());
+ childPtr = childPtr->NextSibling();
+ }
+ returnValue = OwnerDocument()->DtdRepresentation().AreValidChildElementsL(this->NodeName(),*children);
+ }
+
+ // Do a DTD specific check to see if the children are valid
+ CleanupStack::PopAndDestroy(); // children
+
+ return returnValue;
+ }
+
+EXPORT_C TBool CMDXMLElement::CheckChildren()
+//
+// Check the children of this node for legality - must be defined based on DTD.
+// This function checks that the list of child elements
+// conforms to those allowed by the DTD.
+// As well as checking the list of direct children, it
+// calls CheckChildren for each child element which is an
+// element (it does not call this for child nodes which are
+// not elements as they cannot have children).
+// @return True if the node has legitimate children
+//
+ {
+ TBool retVal= CheckImmediateChildren();
+ if( retVal && HasChildNodes() )
+ {
+ CMDXMLNode* childPtr;
+ childPtr = FirstChild();
+ while((childPtr != NULL) && (retVal != false))
+ {
+ if( childPtr->NodeType() == EElementNode )
+ {
+ retVal = childPtr->CheckChildren();
+ }
+ childPtr = childPtr->NextSibling();
+ }
+ }
+
+ return retVal;
+ }
+
+
+EXPORT_C TInt CMDXMLElement::FindIndex(const TDesC &aAttName)
+//
+// Find an attribute and return the index of it
+// @param aAttName the string to search for
+// @return returns the index of the string if found or KErrNotFound
+//
+ {
+ TInt index = KErrNotFound;
+
+ if(iDescAttName)
+ {
+ TInt found = 0;
+ found = iDescAttName->Find(aAttName,index);
+ if(found != 0)
+ index = KErrNotFound;
+ }
+
+ return index;
+
+
+ }
+
+
+EXPORT_C TInt CMDXMLElement::AttributeDetails(TInt aIndex, TPtrC& aAttributeName, TPtrC& aAttributeValue)
+//
+// Retrieves the Name and Value of an attribute at a given index
+// @param aIndex the array index of the element for which details are required
+// @param aAttributeName the attribute name returned
+// @param aAttributeValue the attribute value returned
+// @return returns KErrNone if index is valid else KErrNotFound
+//
+
+ {
+ TInt error = KErrNone;
+ if (iDescAttName->Count() < aIndex)
+ error = KErrNotFound;
+ else
+ {
+ aAttributeValue.Set(iDescAttValue->MdcaPoint(aIndex));
+ aAttributeName.Set(iDescAttName->MdcaPoint(aIndex));
+ }
+ return error;
+ }
+
+
+
+EXPORT_C TInt CMDXMLElement::NumAttributes()
+//
+// Retrieves the Number od Attributes that this element has
+// @return returns the number of attributes held by the element
+//
+ {
+ return iDescAttName->Count();
+ }
+
+
+EXPORT_C CMDXMLElement* CMDXMLElement::FirstChildOfType(const TDesC& aElementType)
+// @return Returns a pointer to the first child of a given type if any, otherwise returns NULL
+// @param aElementType Name of element type to return
+ {
+ CMDXMLElement* retVal = NULL;
+ CMDXMLNode* nodePtr = FirstChild();
+ while((nodePtr != NULL) && (nodePtr->NodeName()).Compare(aElementType) != 0)
+ {
+ nodePtr = nodePtr->NextSibling();
+ }
+ if( nodePtr != NULL )
+ {
+ retVal = (CMDXMLElement*)nodePtr;
+ }
+ return retVal;
+
+ }
+
+EXPORT_C CMDXMLElement* CMDXMLElement::LastChildOfType(const TDesC& aElementType)
+// @return Returns a pointer to the last child of a given type if any, otherwise returns NULL
+// @param aElementType Name of element type to return
+
+ {
+ CMDXMLElement* retVal = NULL;
+ CMDXMLNode* nodePtr = LastChild();
+ while((nodePtr != NULL) && (nodePtr->NodeName()).Compare(aElementType) != 0)
+ {
+ nodePtr = nodePtr->PreviousSibling();
+ }
+ if( nodePtr != NULL )
+ {
+ retVal = (CMDXMLElement*)nodePtr;
+ }
+ return retVal;
+ }
+
+
+// End Of File