diff -r 000000000000 -r c8caa15ef882 xdmprotocols/LocalProtocol/LocalOperations/src/LocalAddition.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/src/LocalAddition.cpp Tue Feb 02 01:05:17 2010 +0200 @@ -0,0 +1,143 @@ +/* +* 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: CLocalAddition +* +*/ + + + + +// INCLUDES +#include "LocalProtocol.h" +#include "LocalDocument.h" +#include "LocalAddition.h" +#include "XdmXmlParser.h" +#include "LocalDocumentNode.h" +#include "LocalNodeAttribute.h" +#include "LocalOperationFactory.h" + +// --------------------------------------------------------- +// CLocalAddition::CLocalAddition +// +// --------------------------------------------------------- +// +CLocalAddition::CLocalAddition( CLocalDocument& aParentDoc, + CLocalDocumentNode* aDocumentSubset, + CLocalOperationFactory& aOperationFactory ) : + CLocalOperationBase( aParentDoc, aOperationFactory ), + iOperationType( aDocumentSubset == NULL ? + EXdmDocument : EXdmPartialDocument ), + iDocumentSubset( aDocumentSubset ) + + { + } + +// --------------------------------------------------------- +// CLocalAddition::NewL +// +// --------------------------------------------------------- +// +CLocalAddition* CLocalAddition::NewL( CLocalDocument& aParentDoc, + CLocalDocumentNode* aDocumentSubset, + CLocalOperationFactory& aOperationFactory ) + { + CLocalAddition* self = new ( ELeave ) CLocalAddition( aParentDoc, aDocumentSubset, aOperationFactory ); + CleanupStack::PushL( self ); + self->BaseConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CLocalAddition::ExecuteL +// +// --------------------------------------------------------- +// +void CLocalAddition::ExecuteL() + { + TPtrC fileName = iTargetDoc.XmlFilePath(); + TInt size = OpenDataFileL( fileName ); + if( size > 0 ) //The document already exists + { + //Only a subset of a document + if( iTargetDoc.IsSubset() && iDocumentSubset != NULL ) + HandlePartialUpdateL( size ); + else WriteFileL( iTargetDoc.DocumentRoot() ); + } + else WriteFileL( iTargetDoc.DocumentRoot() ); + iXmlFile.Close(); + } + +// --------------------------------------------------------- +// CLocalAddition::HandlePartialUpdateL +// +// --------------------------------------------------------- +// +void CLocalAddition::HandlePartialUpdateL( TInt aDataLength ) + { + HBufC8* data = FetchXmlDataL( aDataLength ); + CleanupStack::PushL( data ); + CLocalDocument* copy = iTargetDoc.TempCopyL(); + CleanupStack::PushL( copy ); + iXmlParser->ParseDocumentL( copy, *data ); + RPointerArray results; + CleanupClosePushL( results ); + RPointerArray attributes; + CleanupClosePushL( attributes ); + TInt attrCount = iDocumentSubset->AttributeCount(); + if( attrCount > 0 ) + { + SXdmAttribute16 attribute; + for( TInt i = 0;i < attrCount;i++ ) + { + attribute.iName.Set( iDocumentSubset->Attribute( i )->NodeName() ); + attribute.iValue.Set( iDocumentSubset->Attribute( i )->AttributeValue() ); + } + User::LeaveIfError( attributes.Append( &attribute ) ); + } + copy->Find( iDocumentSubset->NodeName(), results, attributes ); + if( results.Count() == 1 ) + { + iXmlFile.Close(); + ReplaceDataFileL(); + CLocalDocumentNode* node = ( CLocalDocumentNode* )results[0]; + node->AppendLocalL( ( CLocalDocumentNode* )iDocumentSubset ); + WriteFileL( copy->DocumentRoot() ); + } + else User::Leave( KErrGeneral ); + CleanupStack::PopAndDestroy( 4 ); //attributes, results, copy, data + } + +// --------------------------------------------------------- +// CLocalAddition::Destroy +// +// --------------------------------------------------------- +// +void CLocalAddition::Destroy() + { + delete this; + } + +// --------------------------------------------------------- +// Destructor +// +// --------------------------------------------------------- +// +CLocalAddition::~CLocalAddition() + { + + } + +// End of File +