diff -r 000000000000 -r c8caa15ef882 xdmprotocols/LocalProtocol/LocalOperations/src/LocalDeletion.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/src/LocalDeletion.cpp Tue Feb 02 01:05:17 2010 +0200 @@ -0,0 +1,170 @@ +/* +* 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: CLocalDeletion +* +*/ + + + + +// INCLUDES +#include "XdmXmlParser.h" +#include "LocalProtocol.h" +#include "LocalDocument.h" +#include "LocalDeletion.h" +#include "LocalDocumentNode.h" +#include "LocalNodeAttribute.h" + +// --------------------------------------------------------- +// C++ constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CLocalDeletion::CLocalDeletion( CLocalDocument& aTargetDoc, + CLocalDocumentNode* aDocumentSubset, + CLocalOperationFactory& aOperationFactory ) : + CLocalOperationBase( aTargetDoc, aOperationFactory ), + iDocumentSubset( aDocumentSubset ), + iOperationType( aDocumentSubset == NULL ? + EXdmDocument : EXdmPartialDocument ) + { + } + +// --------------------------------------------------------- +// CLocalDeletion::NewL +// +// --------------------------------------------------------- +// +CLocalDeletion* CLocalDeletion::NewL( CLocalDocument& aParentDoc, + CLocalDocumentNode* aDocumentSubset, + CLocalOperationFactory& aOperationFactory ) + { + CLocalDeletion* self = new ( ELeave ) CLocalDeletion( aParentDoc, aDocumentSubset, aOperationFactory ); + CleanupStack::PushL( self ); + self->BaseConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CLocalDeletion::ExecuteL +// +// --------------------------------------------------------- +// +void CLocalDeletion::ExecuteL() + { + TPtrC fileName = iTargetDoc.XmlFilePath(); + TInt size = OpenDataFileL( fileName ); + if( size > 0 ) + { + //Only a subset of a document + if( iTargetDoc.IsSubset() ) + HandlePartialDeletionL( size ); + else if( iDocumentSubset != NULL ) + { + iTargetDoc.RemoveData( ( CLocalDocumentNode* )iDocumentSubset ); + iXmlFile.Close(); + ReplaceDataFileL(); + WriteFileL( iTargetDoc.DocumentRoot() ); + } + else + { + iXmlFile.Close(); + DeleteDataFileL(); //Delete the whole document + } + } + else User::Leave( KErrNotFound ); + iXmlFile.Close(); + } + +// --------------------------------------------------------- +// CLocalAddition::HandlePartialUpdateL +// +// --------------------------------------------------------- +// +void CLocalDeletion::HandlePartialDeletionL( TInt aDataLength ) + { + TInt error = KErrNone; + HBufC8* data = FetchXmlDataL( aDataLength ); + CleanupStack::PushL( data ); + TRAP( error, iXmlParser->ParseDocumentL( &iTargetDoc, *data ) ); + CXdmDocumentNode* parent = iDocumentSubset->Parent(); + RPointerArray parentResults; + CleanupClosePushL( parentResults ); + RPointerArray parentAttributes; + CleanupClosePushL( parentAttributes ); + RPointerArray nodeResults; + CleanupClosePushL( nodeResults ); + RPointerArray nodeAttributes; + CleanupClosePushL( nodeAttributes ); + TInt pAttrCount = parent->AttributeCount(); + TInt dAttrCount = iDocumentSubset->AttributeCount(); + if( pAttrCount > 0 ) + { + SXdmAttribute16 attribute; + for( TInt i = 0;i < pAttrCount;i++ ) + { + attribute.iName.Set( parent->Attribute( i )->NodeName() ); + attribute.iValue.Set( parent->Attribute( i )->AttributeValue() ); + } + User::LeaveIfError( parentAttributes.Append( &attribute ) ); + } + if( dAttrCount > 0 ) + { + SXdmAttribute16 attribute; + for( TInt i = 0;i < dAttrCount;i++ ) + { + attribute.iName.Set( iDocumentSubset->Attribute( i )->NodeName() ); + attribute.iValue.Set( iDocumentSubset->Attribute( i )->AttributeValue() ); + } + User::LeaveIfError( nodeAttributes.Append( &attribute ) ); + } + iTargetDoc.Find( parent->NodeName(), parentResults, parentAttributes ); + iTargetDoc.Find( iDocumentSubset->NodeName(), nodeResults, nodeAttributes ); + if( parentResults.Count() == 1 && nodeResults.Count() == 1 ) + { + iXmlFile.Close(); + ReplaceDataFileL(); + CLocalDocumentNode* p = ( CLocalDocumentNode* )parentResults[0]; + CLocalDocumentNode* r = ( CLocalDocumentNode* )nodeResults[0]; + p->RemoveLocalL( r ); + WriteFileL( iTargetDoc.DocumentRoot() ); + } + else User::Leave( KErrGeneral ); + CleanupStack::PopAndDestroy( 5 ); //nodeAttributes, nodeResults, + //parentAttributes, parentResults, data + } + +// --------------------------------------------------------- +// Symbian OS default constructor may leave. +// +// --------------------------------------------------------- +// +void CLocalDeletion::Destroy() + { + delete this; + } + +// --------------------------------------------------------- +// Destructor +// +// --------------------------------------------------------- +// +CLocalDeletion::~CLocalDeletion() + { + + } + +// End of File +