williamr@2: /// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: /// All rights reserved. williamr@2: /// This component and the accompanying materials are made available williamr@2: /// under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: /// which accompanies this distribution, and is available williamr@2: /// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@2: /// williamr@2: /// Initial Contributors: williamr@2: /// Nokia Corporation - initial contribution. williamr@2: /// williamr@2: /// Contributors: williamr@2: /// williamr@2: /// Description: williamr@2: /// All rights reserved. williamr@2: /// This component and the accompanying materials are made available williamr@2: /// under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: /// which accompanies this distribution, and is available williamr@2: /// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@2: /// Initial Contributors: williamr@2: /// Nokia Corporation - initial contribution. williamr@2: /// Contributors: williamr@2: /// williamr@2: williamr@2: _LIT(KWapBaseNodePanic,"Node-Panic"); williamr@2: williamr@2: #ifndef __WAP_MONOLITHIC__ williamr@2: williamr@2: void Panic(TNodePanic aPanic) williamr@2: // williamr@2: // Panic the client program. williamr@2: // williamr@2: { williamr@2: User::Panic(KWapBaseNodePanic,aPanic); williamr@2: } williamr@2: #endif williamr@2: williamr@2: // williamr@2: // INLINED Node implementation williamr@2: // for description of templated api's see CNODE.H williamr@2: // williamr@2: williamr@2: //CTOR of non-deletable data williamr@2: /** Constructor. williamr@2: williamr@2: @param aData Buffer to wrap williamr@2: */ williamr@2: inline CDataNoDelete::CDataNoDelete(HBufC16* aData) williamr@2: : iData(aData) williamr@2: { williamr@2: } williamr@2: williamr@2: //DTOR doesn't delete the data member williamr@2: /** Destructor. williamr@2: williamr@2: The wrapped buffer is not deleted. williamr@2: */ williamr@2: inline CDataNoDelete::~CDataNoDelete() williamr@2: { williamr@2: } williamr@2: williamr@2: //Accessor method to set the iData pointer to the parameter passed in williamr@2: //Ownership is taken here williamr@2: // Returns the previous value williamr@2: /** Changes the buffer that is wrapped. williamr@2: williamr@2: @return The previous wrapped buffer williamr@2: @param aData Buffer to wrap williamr@2: */ williamr@2: inline HBufC16* CDataNoDelete::SetData(HBufC16* aData) williamr@2: { williamr@2: HBufC16* prevVal = iData; williamr@2: iData = aData; williamr@2: return prevVal; williamr@2: } williamr@2: williamr@2: //Resets data pointer to point to aData, data is not deleted williamr@2: /** Sets the buffer that is wrapped. williamr@2: williamr@2: The existing value is forgotten. williamr@2: williamr@2: @param aData Buffer to wrap williamr@2: */ williamr@2: inline void CDataNoDelete::ResetDataPointer(HBufC16 *aData) williamr@2: { williamr@2: iData = aData; williamr@2: } williamr@2: williamr@2: //Accessor method to get the data williamr@2: /** Gets the wrapped buffer. williamr@2: williamr@2: @return The wrapped buffer williamr@2: */ williamr@2: inline HBufC16* CDataNoDelete::Data() williamr@2: { williamr@2: return iData; williamr@2: } williamr@2: williamr@2: //CTOR of deletable data williamr@2: /** Constructor. williamr@2: williamr@2: @param aData Buffer to wrap williamr@2: */ williamr@2: inline CDataDelete::CDataDelete(HBufC16* aData) williamr@2: : CDataNoDelete(aData) williamr@2: { williamr@2: } williamr@2: williamr@2: //DTOR of deletable data...DELETES THE DATA williamr@2: /** Destructor. williamr@2: williamr@2: The wrapped buffer is deleted. williamr@2: */ williamr@2: inline CDataDelete::~CDataDelete() williamr@2: { williamr@2: delete iData; williamr@2: } williamr@2: williamr@2: /** Sets the buffer that is wrapped. williamr@2: williamr@2: The existing value is deleted. williamr@2: williamr@2: @param aData Buffer to wrap williamr@2: */ williamr@2: inline void CDataDelete::ResetDataPointer(HBufC16* aData) williamr@2: { williamr@2: delete iData; williamr@2: iData = aData; williamr@2: } williamr@2: williamr@2: //CTOR of deletable file data williamr@2: /** Constructor. williamr@2: williamr@2: @param aData Buffer to wrap williamr@2: */ williamr@2: inline CFileDataDelete::CFileDataDelete(HBufC16* aData) williamr@2: : CDataNoDelete(aData) williamr@2: { williamr@2: } williamr@2: williamr@2: // DTOR of deletable file data... williamr@2: // DELETES THE DATA AFTER REMOVING THE REFERENCED FILE williamr@2: /** Destructor. williamr@2: williamr@2: It deletes the filename buffer and the file itself. williamr@2: */ williamr@2: inline CFileDataDelete::~CFileDataDelete() williamr@2: { williamr@2: RemoveFile(); williamr@2: delete iData; williamr@2: } williamr@2: williamr@2: /** Sets the filename that is wrapped. williamr@2: williamr@2: The existing filename buffer and the file itself are deleted. williamr@2: williamr@2: @param aData Buffer to wrap williamr@2: */ williamr@2: inline void CFileDataDelete::ResetDataPointer(HBufC16* aData) williamr@2: { williamr@2: RemoveFile(); williamr@2: delete iData; williamr@2: iData = aData; williamr@2: } williamr@2: williamr@2: inline void CFileDataDelete::RemoveFile() williamr@2: { williamr@2: // When this panics williamr@2: // Someone somewhere has incorrectly reset this node's data williamr@2: __ASSERT_DEBUG(iData,Panic(ENoData)); williamr@2: RFs fs; williamr@2: // If connect fails we can sadly do nothing to remove the file williamr@2: // it will be left lying around :-< williamr@2: if(fs.Connect() == KErrNone) williamr@2: { williamr@2: fs.Delete(iData->Des()); williamr@2: fs.Close(); williamr@2: } williamr@2: } williamr@2: williamr@2: //CTOR of wrapper for integer attributes williamr@2: /** Constructor. williamr@2: williamr@2: @param aInteger Integer to wrap williamr@2: */ williamr@2: inline CIntAttribute::CIntAttribute(TInt aInteger) williamr@2: : iInteger(aInteger) williamr@2: { williamr@2: } williamr@2: williamr@2: //Accessor method williamr@2: /** Gets the wrapped integer. williamr@2: williamr@2: @return The wrapped integer williamr@2: */ williamr@2: inline TInt CIntAttribute::Int() const williamr@2: { williamr@2: return iInteger; williamr@2: } williamr@2: williamr@2: williamr@2: // williamr@2: // williamr@2: //TEMPLATED FUNCTIONS SEE CNODE.H FOR DESCRIPTIONS OF API'S williamr@2: // williamr@2: // williamr@2: /** Allocates and constructs a new node. williamr@2: williamr@2: @return New node williamr@2: @param aType The type of the node williamr@2: @param aParent The parent of this node williamr@2: */ williamr@2: template williamr@2: inline CTypedNode* CTypedNode::NewL(TNodeType aType, CNode* aParent) williamr@2: { williamr@2: return (STATIC_CAST(CTypedNode*,CNode::NewL(CONST_CAST(TAny*,REINTERPRET_CAST(const TAny*,aType)),aParent))); williamr@2: } williamr@2: williamr@2: williamr@2: template williamr@2: inline CTypedNode::CTypedNode(TNodeType aType, CNode* aParent) williamr@2: : CNode(CONST_CAST(TAny*,REINTERPRET_CAST(const TAny*,aType)),aParent) williamr@2: {} williamr@2: williamr@2: /** Deletes a specified child node. williamr@2: williamr@2: @param aNode Node to delete williamr@2: */ williamr@2: template williamr@2: inline void CTypedNode::DeleteChildNode(CNode* aNode) williamr@2: { williamr@2: CNode::DeleteChildNode(aNode); williamr@2: } williamr@2: williamr@2: /** Deletes all the child nodes of this node. williamr@2: */ williamr@2: template williamr@2: inline void CTypedNode::DeleteAllChildNodes() williamr@2: { williamr@2: CNode::DeleteAllChildNodes(); williamr@2: } williamr@2: williamr@2: /** Creates a new child node. williamr@2: williamr@2: @return The new child node williamr@2: @param aType Node type williamr@2: */ williamr@2: template williamr@2: inline CTypedNode& CTypedNode::AppendNodeL(TNodeType aType) williamr@2: { williamr@2: return (STATIC_CAST(CTypedNode& , CNode::AppendNodeL(CONST_CAST(TAny*,REINTERPRET_CAST(TAny*,aType))))); williamr@2: } williamr@2: williamr@2: /** Adds an existing node as a child. williamr@2: williamr@2: @param aNode Node to make a child williamr@2: */ williamr@2: template williamr@2: inline void CTypedNode::AppendNodeToThisNodeL(CNode* aNode) williamr@2: { williamr@2: CNode::AppendNodeToThisNodeL(aNode); williamr@2: } williamr@2: williamr@2: /** Gets the first child or the next child after a specified child. williamr@2: williamr@2: @return First or next child node williamr@2: @param aNode Child node or NULL to get the first child williamr@2: */ williamr@2: template williamr@2: inline CTypedNode* CTypedNode::NextChild(const CNode* aNode) const williamr@2: { williamr@2: return (STATIC_CAST(CTypedNode*,CNode::NextChild(aNode))); williamr@2: } williamr@2: williamr@2: /** Gets the previous child before a specified child. williamr@2: williamr@2: @return Previous child node williamr@2: @param aNode Child node williamr@2: */ williamr@2: template williamr@2: inline CTypedNode* CTypedNode::PrevChild(const CNode& aNode) const williamr@2: { williamr@2: return (STATIC_CAST(CTypedNode*,CNode::PrevChild(aNode))); williamr@2: } williamr@2: williamr@2: /** Gets the parent of this node. williamr@2: williamr@2: @return Parent williamr@2: */ williamr@2: template williamr@2: inline CTypedNode* CTypedNode::Parent() const williamr@2: { williamr@2: return (STATIC_CAST(CTypedNode*,CNode::Parent())); williamr@2: } williamr@2: williamr@2: /** Changes the parent of the node. williamr@2: williamr@2: The node is removed from the childlist of its current parent. williamr@2: williamr@2: @param aParent New parent williamr@2: */ williamr@2: template williamr@2: inline void CTypedNode::ReparentL(CNode* aParent) williamr@2: { williamr@2: CNode::ReparentL(aParent); williamr@2: } williamr@2: williamr@2: /** Gets the next sibling node. williamr@2: williamr@2: This asks for the next child of its parent. williamr@2: williamr@2: @return Next sibling node williamr@2: */ williamr@2: template williamr@2: inline CTypedNode* CTypedNode::NextSibling() const williamr@2: { williamr@2: return (STATIC_CAST(CTypedNode*,CNode::NextSibling())); williamr@2: } williamr@2: williamr@2: /** Gets the previous sibling node. williamr@2: williamr@2: This asks for the previous child of its parent. williamr@2: williamr@2: @return Previous sibling node williamr@2: */ williamr@2: template williamr@2: inline CTypedNode* CTypedNode::PrevSibling() const williamr@2: { williamr@2: return (STATIC_CAST(CTypedNode*,CNode::PrevSibling())); williamr@2: } williamr@2: williamr@2: /** Gets the number of children of this node. williamr@2: williamr@2: @return Number of children of this node williamr@2: */ williamr@2: template williamr@2: inline TInt CTypedNode::NumberImmediateChildren() const williamr@2: { williamr@2: return (CNode::NumberImmediateChildren()); williamr@2: } williamr@2: williamr@2: /** Gets the absolute root node of the tree. williamr@2: williamr@2: @return Root node williamr@2: */ williamr@2: template williamr@2: inline const CTypedNode& CTypedNode::Root() const williamr@2: { williamr@2: return (STATIC_CAST(const CTypedNode&,CNode::Root())); williamr@2: } williamr@2: williamr@2: /** Sets the node data. williamr@2: williamr@2: The object will delete the data in its destructor. williamr@2: williamr@2: @param aData Node data williamr@2: */ williamr@2: template williamr@2: inline void CTypedNode::SetDataL(HBufC16 *aData) williamr@2: { williamr@2: CNode::SetDataL(aData); williamr@2: } williamr@2: williamr@2: /** Sets the object not to delete the node data in its destructor. williamr@2: williamr@2: Note that the function internally reallocates memory. If it leaves, the data is lost. williamr@2: */ williamr@2: template williamr@2: inline void CTypedNode::SetDataNoDeleteL() williamr@2: { williamr@2: CNode::SetDataNoDeleteL(); williamr@2: } williamr@2: williamr@2: /** Sets the object to delete the node data in its destructor. williamr@2: williamr@2: Note that the function internally reallocates memory. If it leaves, the data is lost. */ williamr@2: template williamr@2: inline void CTypedNode::ClearSetDataNoDeleteL() williamr@2: { williamr@2: CNode::ClearSetDataNoDeleteL(); williamr@2: } williamr@2: williamr@2: /** Sets the node data to be taken from a specified file. williamr@2: williamr@2: If the data is deleted, the referenced file is also deleted. williamr@2: williamr@2: @param aData Name of the file containing the data williamr@2: */ williamr@2: template williamr@2: inline void CTypedNode::SetFileDataL(HBufC16 *aData) williamr@2: { williamr@2: CNode::SetFileDataL(aData); williamr@2: } williamr@2: williamr@2: /** Resets the node data to a specified pointer. williamr@2: williamr@2: Existing data owned by the node is deleted. williamr@2: williamr@2: @param aData Root node williamr@2: */ williamr@2: template williamr@2: inline void CTypedNode::ResetDataPointer(HBufC16* aData) williamr@2: { williamr@2: CNode::ResetDataPointer(aData); williamr@2: } williamr@2: williamr@2: /** Gets the node data. williamr@2: williamr@2: @return Node data or NULL if no data is set williamr@2: */ williamr@2: template williamr@2: inline HBufC16* CTypedNode::Data() const williamr@2: { williamr@2: return (CNode::Data()); williamr@2: } williamr@2: williamr@2: /** Deletes an attribute of a specified type. williamr@2: williamr@2: Note that the attribute value will be deleted. williamr@2: williamr@2: @param aAttributeType Attribute type williamr@2: */ williamr@2: template williamr@2: inline void CTypedNode::DeleteAttribute(TAttributeType aAttributeType) williamr@2: { williamr@2: CNode::DeleteAttribute(CONST_CAST(TAny*, REINTERPRET_CAST(const TAny*,aAttributeType))); williamr@2: } williamr@2: williamr@2: /** Delete all node attributes. williamr@2: williamr@2: Note that attribute values will be deleted. williamr@2: */ williamr@2: template williamr@2: inline void CTypedNode::DeleteAllAttributes() williamr@2: { williamr@2: CNode::DeleteAllAttributes(); williamr@2: } williamr@2: williamr@2: /** Removes an attribute of a specified type, but does not delete it. williamr@2: williamr@2: The caller is now responsible for the destruction of the attribute value. williamr@2: williamr@2: @param aAttributeType Attribute type williamr@2: */ williamr@2: template williamr@2: inline void CTypedNode::RemoveAttributeNoDelete(TAttributeType aAttributeType) williamr@2: { williamr@2: CNode::RemoveAttributeNoDelete(CONST_CAST(TAny*,REINTERPRET_CAST(const TAny*,aAttributeType))); williamr@2: } williamr@2: williamr@2: /** Gets the number of attributes of this node. williamr@2: williamr@2: @return Number of attributes of this node williamr@2: */ williamr@2: template williamr@2: inline TInt CTypedNode::AttributeCount() const williamr@2: { williamr@2: return(CNode::AttributeCount()); williamr@2: } williamr@2: williamr@2: /** Gets the attribute value of an attribute at a specified index williamr@2: williamr@2: @return Attribute value williamr@2: @param aIndex Attribute index williamr@2: */ williamr@2: template williamr@2: inline TAttributeType CTypedNode::AttributeTypeByIndex(TInt aIndex) const williamr@2: { williamr@2: return(REINTERPRET_CAST(TAttributeType, CNode::AttributeTypeByIndex(aIndex))); williamr@2: } williamr@2: williamr@2: /** Gets the attribute value of an attribute at a specified index williamr@2: williamr@2: @return Attribute value williamr@2: @param aIndex Attribute index williamr@2: */ williamr@2: template williamr@2: inline CBase* CTypedNode::AttributeByIndex(TInt aIndex) const williamr@2: { williamr@2: return(CNode::AttributeByIndex(aIndex)); williamr@2: } williamr@2: williamr@2: /** Gets the attribute value and type of an attribute at a specified index.. williamr@2: williamr@2: @return Attribute value williamr@2: @param aIndex Attribute index williamr@2: @param aType On return, the attribute type williamr@2: */ williamr@2: template williamr@2: inline CBase* CTypedNode::AttributeByIndex(TInt aIndex,TAttributeType& aType) const williamr@2: { williamr@2: TAny* type; williamr@2: CBase* ret=CNode::AttributeByIndex(aIndex,type); williamr@2: aType=REINTERPRET_CAST(TAttributeType, type); williamr@2: return ret; williamr@2: } williamr@2: williamr@2: /** Adds an attribute. williamr@2: williamr@2: The node takes ownership of aAttributeValue. williamr@2: williamr@2: @param aAttributeType Attribute type williamr@2: @param aAttributeValue Attribute value williamr@2: */ williamr@2: template williamr@2: inline void CTypedNode::AddAttributeL(TAttributeType aAttributeType, CBase* aAttributeValue) williamr@2: { williamr@2: CNode::AddAttributeL(CONST_CAST(TAny*, REINTERPRET_CAST(const TAny*,aAttributeType)),aAttributeValue); williamr@2: } williamr@2: williamr@2: /** Sets node data and adds an attribute. williamr@2: williamr@2: The node takes ownership of aDataand aAttributeValue. williamr@2: Existing node data owned by the node is deleted. williamr@2: williamr@2: @param aData Node data williamr@2: @param aAttributeType Attribute type williamr@2: @param aAttributeValue Attribute value williamr@2: */ williamr@2: template williamr@2: inline void CTypedNode::AddDataAndAttributeL(HBufC16 *aData, TAttributeType aAttributeType, CBase* aAttributeValue) williamr@2: { williamr@2: CNode::AddDataAndAttributeL(aData,CONST_CAST(TAny*, REINTERPRET_CAST(const TAny*,aAttributeType)),aAttributeValue); williamr@2: } williamr@2: williamr@2: /** Gets a child node by index. williamr@2: williamr@2: @return Child node williamr@2: @param aByIndex Index of the child node williamr@2: */ williamr@2: template williamr@2: inline CTypedNode* CTypedNode::Child(TInt aByIndex) const williamr@2: { williamr@2: return (REINTERPRET_CAST(CTypedNode*,CNode::Child(aByIndex))); williamr@2: } williamr@2: williamr@2: /** Gets an attribute value for a specified attribute type. williamr@2: williamr@2: @return Attribute value williamr@2: @param aAttributeType Attribute type williamr@2: */ williamr@2: template williamr@2: inline CBase* CTypedNode::Attribute(TAttributeType aAttributeType) const williamr@2: { williamr@2: return (CNode::Attribute(CONST_CAST(TAny*, REINTERPRET_CAST(const TAny*,aAttributeType)))); williamr@2: } williamr@2: williamr@2: /** Tests if an attribute of a specified type exists. williamr@2: williamr@2: @return True if the attribute exists, otherwise false williamr@2: @param aAttributeType Attribute type williamr@2: */ williamr@2: template williamr@2: inline TBool CTypedNode::AttributeExists(TAttributeType aAttributeType) const williamr@2: { williamr@2: return (CNode::AttributeExists(CONST_CAST(TAny*, REINTERPRET_CAST(const TAny*,aAttributeType)))); williamr@2: } williamr@2: williamr@2: /** Gets the node type. williamr@2: williamr@2: @return Node type williamr@2: */ williamr@2: template williamr@2: inline TNodeType CTypedNode::Type() const williamr@2: { williamr@2: return (REINTERPRET_CAST(TNodeType,CNode::Type())); williamr@2: } williamr@2: williamr@2: /** Sets the node type. williamr@2: williamr@2: @param aType Node type williamr@2: */ williamr@2: template williamr@2: inline void CTypedNode::SetType(TNodeType aType) williamr@2: { williamr@2: CNode::SetType(CONST_CAST(TAny*,REINTERPRET_CAST(const TAny* ,aType))); williamr@2: }