xdmprotocols/LocalProtocol/LocalOperations/src/LocalAddition.cpp
branchRCL_3
changeset 18 fbd2e7cec7ef
parent 0 c8caa15ef882
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xdmprotocols/LocalProtocol/LocalOperations/src/LocalAddition.cpp	Wed Sep 01 12:23:14 2010 +0100
@@ -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<CXdmDocumentNode> results;
+    CleanupClosePushL( results );
+    RPointerArray<SXdmAttribute16> 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  
+