diff -r 1a2a00e78665 -r f62f87b200ec xcfw/src/xcfwtree.cpp --- a/xcfw/src/xcfwtree.cpp Tue Feb 02 00:23:10 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,551 +0,0 @@ -/* -* Copyright (c) 2002-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: Implementation of XCFW Content tree -* -*/ - - - -// INCLUDE FILES -#include "xcfwtree.h" -#include "xcfwnode.h" -#include "xcfwpanic.h" - -// MACROS -//Helper macro to cast MXCFWNode pointers to CXCFWNode -#define WRAPNODE( aNode ) static_cast( aNode ) - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CXCFWTree::CXCFWTree -// C++ default constructor can NOT contain any code, that -// might leave. -// ----------------------------------------------------------------------------- -// -CXCFWTree::CXCFWTree() - { - } - -// ----------------------------------------------------------------------------- -// CXCFWTree::ConstructL -// Symbian 2nd phase constructor can leave. -// ----------------------------------------------------------------------------- -// -void CXCFWTree::ConstructL() - { - } - -// ----------------------------------------------------------------------------- -// CXCFWTree::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -EXPORT_C CXCFWTree* CXCFWTree::NewL() - { - CXCFWTree* self = new( ELeave ) CXCFWTree; - - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - - return self; - } - - -// Destructor -EXPORT_C CXCFWTree::~CXCFWTree() - { - //delete dtd name buffer - delete iDTDName; - - //delete node array - iNodeList.ResetAndDestroy(); - iNodeList.Close(); - - //reset node array for client - iNodeListForClient.Reset(); - iNodeListForClient.Close(); - - //Null root pointer (owned in the iNodeList array) - iRoot = NULL; - } - - -// ----------------------------------------------------------------------------- -// CXCFWTree::AddNodeL -// this overload is for adding node under certain parent before certain child -// ----------------------------------------------------------------------------- -// -EXPORT_C MXCFWNode* CXCFWTree::AddNodeL( - CGECOObjectBase* aData, - MXCFWNode* aParent, - MXCFWNode* aInsertBefore ) - { - CleanupStack::PushL( aData ); - __ASSERT_LEAVE( aParent && aData && aInsertBefore && - aData->TypeIdentifier() != iRoot->Data()->TypeIdentifier() && - aInsertBefore->Parent() == aParent, KErrArgument ); - - __ASSERT_LEAVE( !iLocked, KErrAccessDenied ); - - //Create new node and add to arrays. - CXCFWNode* nodeToAdd = CXCFWNode::NewL( aData ); - CleanupStack::Pop( aData ); - CleanupStack::PushL( nodeToAdd ); - User::LeaveIfError( iNodeList.Append( nodeToAdd ) ); - CleanupStack::Pop( nodeToAdd ); - - //update node references - nodeToAdd->SetParent( aParent ); - nodeToAdd->SetNextSibling( aInsertBefore ); - nodeToAdd->SetPrevSibling( aInsertBefore->PrevSibling() ); - - //if "insert before" -node has previous sibling, update that - if ( aInsertBefore->PrevSibling() ) - { - WRAPNODE( aInsertBefore->PrevSibling() )->SetNextSibling( nodeToAdd ); - } - - //set previous sibling - WRAPNODE( aInsertBefore )->SetPrevSibling( nodeToAdd ); - - if( aParent->FirstChild() == aInsertBefore ) - { - WRAPNODE( aParent )->SetFirstChild( nodeToAdd ); - } - - //Set client list dirty => will be updated on next Nodes() request. - iClientListDirty = ETrue; - - return nodeToAdd; - - } - -// ----------------------------------------------------------------------------- -// CXCFWTree::AddNodeL -// this overload is for adding node under certain parent as last child -// ----------------------------------------------------------------------------- -// -EXPORT_C MXCFWNode* CXCFWTree::AddNodeL( - CGECOObjectBase* aData, - MXCFWNode* aParent ) - { - CleanupStack::PushL( aData ); - //Legality checks - __ASSERT_LEAVE( aParent && aData && - aData->TypeIdentifier() != iRoot->Data()->TypeIdentifier(), - KErrArgument ); - - __ASSERT_LEAVE( !iLocked, KErrAccessDenied ); - - - //Create new node and add to arrays - CXCFWNode* nodeToAdd = CXCFWNode::NewL( aData ); - CleanupStack::Pop( aData ); - CleanupStack::PushL( nodeToAdd ); - User::LeaveIfError( iNodeList.Append( nodeToAdd ) ); - CleanupStack::Pop( nodeToAdd ); - - //set parent for new node - nodeToAdd->SetParent( aParent ); - - //if parent has a last child - if( aParent->LastChild() ) - { - nodeToAdd->SetPrevSibling( aParent->LastChild() ); - WRAPNODE( aParent->LastChild() )->SetNextSibling( nodeToAdd ); - } - else - { - WRAPNODE( aParent )->SetFirstChild( nodeToAdd ); - } - - //update last child of the parent - WRAPNODE( aParent )->SetLastChild( nodeToAdd ); - - //Set client list dirty => will be updated on next Nodes() request. - iClientListDirty = ETrue; - - return nodeToAdd; - } - -// ----------------------------------------------------------------------------- -// CXCFWTree::AddNodeL -// this overload is for adding root node only -// ----------------------------------------------------------------------------- -// -EXPORT_C MXCFWNode* CXCFWTree::AddNodeL( - CGECOObjectBase* aData ) - { - CleanupStack::PushL( aData ); - //if we already have a root, this is illegal - __ASSERT_LEAVE( iRoot==NULL, KErrAlreadyExists ); - - __ASSERT_LEAVE( !iLocked, KErrAccessDenied ); - - //Create root node and add to arrays - CXCFWNode* nodeToAdd = CXCFWNode::NewL( aData ); - CleanupStack::Pop( aData ); - CleanupStack::PushL( nodeToAdd ); - User::LeaveIfError( iNodeList.Append( nodeToAdd ) ); - CleanupStack::Pop( nodeToAdd ); - - //Set internal root member. - iRoot = nodeToAdd; - nodeToAdd = NULL; - - //Set client list dirty => will be updated on next Nodes() request. - iClientListDirty = ETrue; - - return iRoot; - } - -// ----------------------------------------------------------------------------- -// CXCFWTree::GetChildNodesL -// Put child nodes of the given parent to the given array -// ----------------------------------------------------------------------------- -// -EXPORT_C void CXCFWTree::GetChildNodesL( - MXCFWNode* aParent, - RNodeArray& aNodeList) - { - - __ASSERT_LEAVE( aParent != NULL, KErrArgument ); - - MXCFWNode* pointer = aParent->FirstChild(); - while ( pointer ) - { - User::LeaveIfError( aNodeList.Append( pointer ) ); - pointer = pointer->NextSibling(); - } - - } - -// ----------------------------------------------------------------------------- -// CXCFWTree::GetNodesOfTypeL -// Put nodes that have dataobject of given type to given array. -// In case of recursion, pre-order recursion is used -// ----------------------------------------------------------------------------- -// -EXPORT_C void CXCFWTree::GetNodesOfTypeL( - const TDesC& aType, - RNodeArray& aNodeList, - MXCFWNode* aParent, - TBool aRecursive ) - { - - __ASSERT_LEAVE( aParent != NULL, KErrArgument ); - - MXCFWNode* pointer = aParent->FirstChild(); - - while ( pointer ) - { - if ( pointer->Data()->TypeIdentifier().Compare( aType ) == 0 ) - { - User::LeaveIfError( aNodeList.Append( pointer ) ); - } - if ( aRecursive ) - { - GetNodesOfTypeL( aType, aNodeList, pointer, aRecursive ); - } - pointer = pointer->NextSibling(); - } - - } - -// ----------------------------------------------------------------------------- -// CXCFWTree::MoveNodeL -// Moves a node in tree and updates the relative nodes in both original and -// new location. -// ----------------------------------------------------------------------------- -// -EXPORT_C void CXCFWTree::MoveNodeL( - MXCFWNode* aNodeToMove, - MXCFWNode* aNewParent, - MXCFWNode* aInsertBefore ) - { - - // assure parameter legality - __ASSERT_LEAVE( aNodeToMove && aNewParent && - aNodeToMove != iRoot && aInsertBefore != iRoot && - aNodeToMove != aNewParent, - KErrArgument ); - - __ASSERT_LEAVE( !iLocked, KErrAccessDenied ); - - - //if "insert before" node is child node of the given parent, move is illegal - if ( aInsertBefore && aInsertBefore->Parent() != aNewParent ) - { - User::Leave( KErrArgument ); - } - - MXCFWNode* check = aNewParent->Parent(); - while ( check ) - { - //if user tries to move a node under itself (it is among the parents - // of the given new parent) we'll leave - if ( check == aNodeToMove ) - { - User::Leave( KErrArgument ); - } - check = check->Parent(); - } - check = NULL; - - //first update old parent if necessary - if ( aNodeToMove->Parent()->FirstChild() == aNodeToMove ) - { - WRAPNODE( aNodeToMove->Parent() )->SetFirstChild( - aNodeToMove->NextSibling() ); - } - if ( aNodeToMove->Parent()->LastChild() == aNodeToMove ) - { - WRAPNODE( aNodeToMove->Parent() )->SetLastChild( - aNodeToMove->PrevSibling() ); - } - - //update old siblings - if ( aNodeToMove->PrevSibling() ) - { - WRAPNODE( aNodeToMove->PrevSibling())->SetNextSibling( - aNodeToMove->NextSibling() ); - } - - if ( aNodeToMove->NextSibling() ) - { - WRAPNODE( aNodeToMove->NextSibling() )->SetPrevSibling( - aNodeToMove->PrevSibling() ); - } - - //set new parent: - WRAPNODE( aNodeToMove )->SetParent( aNewParent ); - - //update new siblings - if ( aInsertBefore ) - { - - //if "insert before" -node has a sibling before it, we update that - if ( aInsertBefore->PrevSibling() ) - { - WRAPNODE( aInsertBefore->PrevSibling() )->SetNextSibling( - aNodeToMove ); - } - else - //no previous sibling => insertbefore is the first child of new parent - { - WRAPNODE( aNewParent )->SetFirstChild( aNodeToMove ); - } - WRAPNODE( aNodeToMove )->SetPrevSibling( aInsertBefore->PrevSibling() ); - WRAPNODE( aNodeToMove )->SetNextSibling( aInsertBefore ); - WRAPNODE( aInsertBefore )->SetPrevSibling( aNodeToMove ); - } - else - { - //if new parent had children - if ( aNewParent->LastChild() ) - { - WRAPNODE( aNewParent->LastChild() )->SetNextSibling( aNodeToMove ); - WRAPNODE( aNodeToMove )->SetPrevSibling( aNewParent->LastChild() ); - WRAPNODE( aNewParent )->SetLastChild( aNodeToMove ); - WRAPNODE( aNodeToMove )->SetNextSibling(NULL); - } - else //no children before - { - WRAPNODE( aNewParent )->SetFirstChild( aNodeToMove ); - WRAPNODE( aNewParent )->SetLastChild( aNodeToMove ); - WRAPNODE( aNodeToMove )->SetPrevSibling( NULL ); - WRAPNODE( aNodeToMove )->SetNextSibling( NULL ); - } - } - - //Set client list dirty => will be updated on next Nodes() request. - iClientListDirty = ETrue; - - } - -// ----------------------------------------------------------------------------- -// CXCFWTree::Nodes -// return tree nodes as array of MXCFWNode pointers -// ----------------------------------------------------------------------------- -// -EXPORT_C RNodeArray& CXCFWTree::Nodes() - { - - //see if we should update the MXCFWNode array to reflect the new - if ( iClientListDirty ) - { - - if ( iNodeListForClient.Count() > 0 ) - { - iNodeListForClient.Reset(); - } - - TInt count = iNodeList.Count(); - for ( TInt i = 0; i < count; i++ ) - { - iNodeListForClient.Append( (MXCFWNode*)iNodeList[i] ); - } - iClientListDirty = EFalse; - } - - return iNodeListForClient; - } - - -// ----------------------------------------------------------------------------- -// CXCFWTree::RemoveNodeL -// Removes a node from tree by updating all relative nodes and removing from -// arrays. -// ----------------------------------------------------------------------------- -// -EXPORT_C void CXCFWTree::RemoveNodeL( - MXCFWNode* aNodeToRemove ) - { - - __ASSERT_LEAVE( aNodeToRemove != NULL, KErrArgument ); - - __ASSERT_LEAVE( !iLocked, KErrAccessDenied ); - - if ( iRoot != aNodeToRemove ) - { - //update related nodes before removal, unless removing root node. - if ( aNodeToRemove->PrevSibling() ) - { - WRAPNODE( aNodeToRemove->PrevSibling() )->SetNextSibling( - aNodeToRemove->NextSibling() ); - } - - if ( aNodeToRemove->NextSibling() ) - { - WRAPNODE( aNodeToRemove->NextSibling() )->SetPrevSibling( - aNodeToRemove->PrevSibling() ); - } - - if ( aNodeToRemove->Parent()->FirstChild() == aNodeToRemove ) - { - WRAPNODE( aNodeToRemove->Parent() )->SetFirstChild( - aNodeToRemove->NextSibling() ); - } - - if ( aNodeToRemove->Parent()->LastChild() == aNodeToRemove ) - { - WRAPNODE( aNodeToRemove->Parent() )->SetLastChild( - aNodeToRemove->PrevSibling() ); - } - } - else - { - //root was removed. - iRoot = NULL; - } - - //Set client list dirty => will be updated on next Nodes() request. - iClientListDirty = ETrue; - - RemoveNodeRecursiveL( aNodeToRemove ); - - } - - -// ----------------------------------------------------------------------------- -// CXCFWTree::RemoveFromArray -// Removes node pointer from CXCFWNode and MXCFWNode pointer arrays. -// Deletes from CXCFWNode array as well. -// ----------------------------------------------------------------------------- -// -void CXCFWTree::RemoveFromNodeList( - MXCFWNode* aNode ) - { - - //remove node from the pointer array. - TInt i = iNodeList.Count() - 1 ; - for ( ;i>=0 && aNode != iNodeList[i] ; i-- ){} - if ( i>=0 ) - { - //delete object - delete iNodeList[i]; - //remove from pointer arrays. - iNodeList.Remove(i); - } - - } - -// ----------------------------------------------------------------------------- -// CXCFWTree::RemoveNodeRecursiveL -// Post-order recursion is used to make sure that no orhpan nodes are left -// floating. -// ----------------------------------------------------------------------------- -// -void CXCFWTree::RemoveNodeRecursiveL( - MXCFWNode* aNode ) - { - - __ASSERT_LEAVE ( aNode != NULL, KErrArgument ); - - MXCFWNode* pointer = aNode->FirstChild(); - - while ( pointer ) - { - MXCFWNode* temp = pointer->NextSibling(); - RemoveNodeRecursiveL( pointer ); - pointer = temp; - } - - RemoveFromNodeList( aNode ); - - } - - -// ----------------------------------------------------------------------------- -// CXCFWTree::Root -// Returns MXCFWNode pointer to root node. -// ----------------------------------------------------------------------------- -// -EXPORT_C MXCFWNode* CXCFWTree::Root() - { - return iRoot; - } - -EXPORT_C void CXCFWTree::SetLocked( TBool aLockStatus ) - { - iLocked = aLockStatus; - } - -EXPORT_C TBool CXCFWTree::IsLocked() - { - return iLocked; - } - -const TDesC& CXCFWTree::DTDName() - { - if ( !iDTDName ) - { - return KNullDesC; - } - else - { - return *iDTDName; - } - } - -void CXCFWTree::SetDTDNameL( const TDesC& aName ) - { - delete iDTDName; - iDTDName = NULL; - iDTDName = aName.AllocL(); - } - -// End of File