--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/xdmprotocols/LocalProtocol/src/LocalDocument.cpp Wed Sep 01 12:23:14 2010 +0100
@@ -0,0 +1,525 @@
+/*
+* 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: CLocalDocument
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <f32file.h>
+#include "XdmProtocol.h"
+#include "XdmNamespace.h"
+#include "XdmOperation.h"
+#include "XdmXmlParser.h"
+#include "LocalProtocol.h"
+#include "LocalDocument.h"
+#include "LocalDocumentNode.h"
+#include "XdmOperationFactory.h"
+
+// ----------------------------------------------------
+// CLocalDocument::CLocalDocument
+//
+// ----------------------------------------------------
+//
+CLocalDocument::CLocalDocument( CXdmEngine& aXdmEngine,
+ CLocalProtocol& aLocalProtocol ) :
+ CXdmDocument( aXdmEngine ),
+ iLocalProtocol( aLocalProtocol )
+ {
+ }
+
+
+// ----------------------------------------------------------
+// CLocalDocument::NewL
+//
+// ----------------------------------------------------------
+//
+CLocalDocument* CLocalDocument::NewL( CXdmEngine& aXdmEngine,
+ const TDesC& aDocumentName,
+ CLocalProtocol& aLocalProtocol )
+ {
+ CLocalDocument* self = new ( ELeave ) CLocalDocument( aXdmEngine, aLocalProtocol );
+ CleanupStack::PushL( self );
+ self->BaseConstructL( KLocalOperationFactory, aDocumentName );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// ----------------------------------------------------------
+// CLocalDocument::ConstructL
+//
+// ----------------------------------------------------------
+//
+void CLocalDocument::ConstructL()
+ {
+ #ifdef _DEBUG
+ iLocalProtocol.WriteToLog( _L8( "CLocalDocument::ConstructL()" ) );
+ #endif
+ TPtrC name = iDocumentName->Des();
+ TPtrC root = iLocalProtocol.RootFolder();
+ iFullPath = HBufC::NewL( name.Length() + root.Length() );
+ iFullPath->Des().Copy( root );
+ iFullPath->Des().Append( name );
+ FetchTimeStampL();
+ CActiveScheduler::Add( this );
+ }
+
+// ----------------------------------------------------------
+// CLocalDocument::ResetContents
+//
+// ----------------------------------------------------------
+//
+void CLocalDocument::ResetContents()
+ {
+ delete iDocumentRoot;
+ iDocumentRoot = NULL;
+ iNamespaces.ResetAndDestroy();
+ }
+
+// ----------------------------------------------------------
+// CLocalDocument::FetchTimeStampL
+//
+// ----------------------------------------------------------
+//
+void CLocalDocument::FetchTimeStampL()
+ {
+ #ifdef _DEBUG
+ iLocalProtocol.WriteToLog( _L8( "CLocalDocument::FetchTimeStampL()" ) );
+ #endif
+ RFile timeStamp;
+ TBuf8<KDateTimeMaxSize> buf;
+ TBuf<KDateTimeMaxSize> buf16;
+ const TChar idSeparator = 46;
+ TPtrC fullPath( iFullPath->Des() );
+ HBufC* path = HBufC::NewLC( fullPath.Length() + KTimeStampFileExt().Length() );
+ TInt index = fullPath.LocateReverse( idSeparator );
+ TPtrC tmspName( index > 0 ? fullPath.Left( index ) : fullPath );
+ path->Des().Copy( tmspName );
+ path->Des().Append( KTimeStampFileExt );
+ TInt error = timeStamp.Open( CLocalProtocol::FileSession(), path->Des(), EFileRead );
+ if( error == KErrNone )
+ {
+ CleanupClosePushL( timeStamp );
+ User::LeaveIfError( timeStamp.Read( buf ) );
+ buf16.Copy( buf );
+ buf.Zero();
+ User::LeaveIfError( iLastModification.Parse( buf16 ) );
+ CleanupStack::PopAndDestroy(); //timeStamp
+ }
+ CleanupStack::PopAndDestroy(); //path
+ }
+// ----------------------------------------------------
+// CLocalDocument::~CLocalDocument
+//
+// ----------------------------------------------------
+//
+CLocalDocument::~CLocalDocument()
+ {
+ #ifdef _DEBUG
+ iLocalProtocol.WriteToLog( _L8( "CLocalDocument::~CLocalDocument()" ) );
+ #endif
+ Cancel();
+ delete iFullPath;
+ delete iDocumentRoot;
+ iNamespaces.ResetAndDestroy();
+ }
+
+// ----------------------------------------------------
+// CLocalDocument::CreateRootL
+//
+// ----------------------------------------------------
+//
+CXdmDocumentNode* CLocalDocument::CreateRootL()
+ {
+ #ifdef _DEBUG
+ iLocalProtocol.WriteToLog( _L8( "CLocalDocument::DocumentSubsetL()" ) );
+ #endif
+ iDocumentRoot = CLocalDocumentNode::NewL( iXdmEngine, iLocalProtocol );
+ return iDocumentRoot;
+ }
+
+// ----------------------------------------------------
+// CLocalDocument::TempCopyL
+//
+// ----------------------------------------------------
+//
+EXPORT_C CLocalDocument* CLocalDocument::TempCopyL()
+ {
+ return CLocalDocument::NewL( iXdmEngine, Name(), iLocalProtocol );
+ }
+
+// ----------------------------------------------------
+// CLocalDocument::DocumentRoot
+//
+// ----------------------------------------------------
+//
+CXdmDocumentNode* CLocalDocument::DocumentRoot() const
+ {
+ return iDocumentRoot;
+ }
+
+// ----------------------------------------------------
+// CLocalDocument::ErrorRoot
+//
+// ----------------------------------------------------
+//
+CXdmDocumentNode* CLocalDocument::ErrorRoot()
+ {
+ return NULL;
+ }
+
+// ----------------------------------------------------
+// CLocalDocument::ErrorRoot
+//
+// ----------------------------------------------------
+//
+TXdmDocType CLocalDocument::DocumentType() const
+ {
+ return EXdmDocGeneral;
+ }
+
+// ----------------------------------------------------
+// CLocalDocument::IsSubset
+//
+// ----------------------------------------------------
+//
+EXPORT_C TBool CLocalDocument::IsSubset() const
+ {
+ return iDocSubset;
+ }
+
+// ----------------------------------------------------
+// CLocalDocument::ResetSubset
+//
+// ----------------------------------------------------
+//
+EXPORT_C void CLocalDocument::ResetSubset()
+ {
+ CXdmDocument::ResetSubset();
+ delete iDocumentRoot;
+ iDocumentRoot = NULL;
+ }
+
+// ----------------------------------------------------
+// CLocalDocument::XmlFilePath
+//
+// ------------------------------ ----------------------
+//
+EXPORT_C TPtrC CLocalDocument::XmlFilePath() const
+ {
+ return iFullPath != NULL ? iFullPath->Des() : TPtrC();
+ }
+
+// ----------------------------------------------------
+// CLocalDocument::RemoveData
+//
+// ----------------------------------------------------
+//
+EXPORT_C void CLocalDocument::RemoveData( CLocalDocumentNode* /*aDocumentNode*/ )
+ {
+ #ifdef _DEBUG
+ iLocalProtocol.WriteToLog( _L8( "CLocalDocument::RemoveData()" ) );
+ #endif
+
+ }
+
+// ----------------------------------------------------
+// CLocalDocument::StartUpdateL
+//
+// ----------------------------------------------------
+//
+void CLocalDocument::StartUpdateL()
+ {
+ #ifdef _DEBUG
+ iLocalProtocol.WriteToLog( _L8( "CLocalDocument::StartUpdateL()" ) );
+ #endif
+ TBool keepGoing = ETrue;
+ TInt completion = KErrNone;
+ TInt count = iChangeRequests.Count();
+ for( TInt i = 0;keepGoing && i < count;i++ )
+ {
+ //"First in, first served"
+ TRAPD( error, iChangeRequests[0]->ExecuteL() );
+ if( error == KErrNone )
+ {
+ #ifdef _DEBUG
+ iLocalProtocol.WriteToLog( _L8( " Execution of the operation no. %d was successful" ), i );
+ #endif
+ }
+ else
+ {
+ #ifdef _DEBUG
+ iLocalProtocol.WriteToLog( _L8( " Execution of the operation no. %d failed with %d" ), i, error );
+ #endif
+ completion = error;
+ keepGoing = EFalse;
+ }
+ FinaliseOperation( 0 );
+ }
+ User::RequestComplete( iClientStatus, completion );
+ }
+
+// ----------------------------------------------------
+// CLocalProtocol::AppendPathPartL
+//
+// ----------------------------------------------------
+//
+void CLocalDocument::AppendPathPartL( const TDesC& aString )
+ {
+ #ifdef _DEBUG
+ iLocalProtocol.WriteToLog( _L8( "CLocalDocument::PathPartL()" ) );
+ #endif
+ if( iDocumentRoot != NULL )
+ {
+ CXdmDocumentNode* node = NULL;
+ CXdmDocumentNode* parent = iDocumentRoot;
+ while( parent->NextNode() != NULL )
+ parent = parent->NextNode();
+ node = CLocalDocumentNode::NewL( iXdmEngine, aString, parent, iLocalProtocol );
+ parent->SetNextNode( node );
+ }
+ else
+ iDocumentRoot = CLocalDocumentNode::NewL( iXdmEngine, aString, iLocalProtocol );
+ }
+
+// ----------------------------------------------------
+// CLocalProtocol::CurrentExtent
+//
+// ----------------------------------------------------
+//
+CXdmDocumentNode* CLocalDocument::CurrentExtent() const
+ {
+ #ifdef _DEBUG
+ iLocalProtocol.WriteToLog( _L8( "CLocalDocument::CurrentExtent()" ) );
+ #endif
+ CXdmDocumentNode* ret = NULL;
+ if( iDocumentRoot != NULL )
+ {
+ CXdmDocumentNode* node = iDocumentRoot;
+ while( node->NextNode() != NULL )
+ node = node->NextNode();
+ ret = node;
+ }
+ else
+ {
+ #ifdef _DEBUG
+ iLocalProtocol.WriteToLog( _L8( " This document does not yet have a root, leave with KErrGeneral" ) );
+ #endif
+ User::Leave( KErrGeneral );
+ }
+ return ret;
+ }
+
+// ----------------------------------------------------
+// CLocalDocument::StartUpdateL
+//
+// ----------------------------------------------------
+//
+void CLocalDocument::StartInternalL( TRequestStatus& aStatus )
+ {
+ #ifdef _DEBUG
+ iLocalProtocol.WriteToLog( _L8( "CLocalDocument::StartInternalL()" ) );
+ #endif
+ aStatus = KRequestPending;
+ iClientStatus = &aStatus;
+ StartUpdateL();
+ }
+
+// ----------------------------------------------------
+// CLocalDocument::CancelUpdate
+//
+// ----------------------------------------------------
+//
+void CLocalDocument::CancelUpdate()
+ {
+ #ifdef _DEBUG
+ iLocalProtocol.WriteToLog( _L8( "CLocalDocument::CancelUpdate()" ) );
+ #endif
+ User::RequestComplete( iClientStatus, KErrCancel );
+ }
+
+// ---------------------------------------------------------
+// CLocalDocument::RunL()
+//
+// ---------------------------------------------------------
+//
+void CLocalDocument::RunL()
+ {
+ #ifdef _DEBUG
+ iLocalProtocol.WriteToLog( _L8( "CLocalDocument::RunL()" ) );
+ #endif
+ }
+
+// ----------------------------------------------------
+// CLocalDocument::FinaliseOperation
+//
+// ----------------------------------------------------
+//
+void CLocalDocument::FinaliseOperation( TInt aIndex )
+ {
+ #ifdef _DEBUG
+ iLocalProtocol.WriteToLog( _L8( "CLocalDocument::FinaliseOperation()" ) );
+ #endif
+ TInt count = iChangeRequests.Count();
+ if( count > 0 && ( aIndex >= 0 && aIndex < count ) )
+ {
+ MXdmOperation* operation = NULL;
+ operation = iChangeRequests[aIndex];
+ iChangeRequests.Remove( aIndex );
+ operation->Destroy();
+ operation = NULL;
+ }
+ }
+
+// ---------------------------------------------------------
+// CLocalDocument::AppendNamespaceL
+//
+// ---------------------------------------------------------
+//
+void CLocalDocument::AppendNamespaceL( const TDesC8& aUri, const TDesC8& aPrefix )
+ {
+ CXdmNamespace* ns = CXdmNamespace::NewL( aUri, aPrefix );
+ CleanupStack::PushL( ns );
+ User::LeaveIfError( iNamespaces.Append( ns ) );
+ CleanupStack::Pop(); //ns
+ }
+
+// ---------------------------------------------------------
+// CXcapDocument::RemoveNamespace
+//
+// ---------------------------------------------------------
+//
+void CLocalDocument::RemoveNamespace( const TDesC8& aUri )
+ {
+ TBool found = EFalse;
+ CXdmNamespace* ns = NULL;
+ TInt count = iNamespaces.Count();
+ for( TInt i = 0;!found && i < count;i++ )
+ {
+ ns = iNamespaces[i];
+ if( ns->Uri().Compare( aUri ) == 0 )
+ {
+ found = ETrue;
+ iNamespaces.Remove( i );
+ delete ns;
+ ns = NULL;
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CLocalDocument::Uri
+//
+// ---------------------------------------------------------
+//
+TPtrC8 CLocalDocument::Uri( const TDesC8& aPrefix ) const
+ {
+ TPtrC8 uri( _L8( "" ) );
+ TBool found = EFalse;
+ TInt count = iNamespaces.Count();
+ for( TInt i = 0;i < count && !found;i++ )
+ {
+ if( iNamespaces[i]->Prefix().Compare( aPrefix ) == 0 )
+ {
+ uri.Set( iNamespaces[i]->Uri() );
+ found = ETrue;
+ }
+ }
+ return uri;
+ }
+
+// ---------------------------------------------------------
+// CLocalDocument::Count
+//
+// ---------------------------------------------------------
+//
+TInt CLocalDocument::Count() const
+ {
+ return iNamespaces.Count();
+ }
+
+// ---------------------------------------------------------
+// CLocalDocument::Prefix
+//
+// ---------------------------------------------------------
+//
+TPtrC8 CLocalDocument::Prefix( TInt aIndex ) const
+ {
+ TInt count = iNamespaces.Count();
+ if( count > 0 && ( aIndex >= 0 && aIndex < count ) )
+ return iNamespaces[aIndex]->Prefix();
+ else return TPtrC8();
+ }
+
+// ---------------------------------------------------------
+// CLocalDocument::Uri
+//
+// ---------------------------------------------------------
+//
+TPtrC8 CLocalDocument::Uri( TInt aIndex ) const
+ {
+ TInt count = iNamespaces.Count();
+ if( count > 0 && ( aIndex >= 0 && aIndex < count ) )
+ return iNamespaces[aIndex]->Uri();
+ else return TPtrC8();
+ }
+
+// ---------------------------------------------------------
+// CLocalDocument::ResetNamespaces
+//
+// ---------------------------------------------------------
+//
+void CLocalDocument::ResetNamespaces( )
+ {
+ iNamespaces.ResetAndDestroy();
+ }
+
+// ---------------------------------------------------------
+// CLocalDocument::TimeStamp
+//
+// ---------------------------------------------------------
+//
+TTime CLocalDocument::TimeStamp() const
+ {
+ return iLastModification;
+ }
+
+// ---------------------------------------------------------
+// CLocalDocument::SaveClientStatus
+//
+// ---------------------------------------------------------
+//
+void CLocalDocument::SaveClientStatus( TRequestStatus& aStatus )
+ {
+ iClientStatus = &aStatus;
+ }
+
+// ---------------------------------------------------------
+// CLocalDocument::DoCancel
+//
+// ---------------------------------------------------------
+//
+void CLocalDocument::DoCancel()
+ {
+ #ifdef _DEBUG
+ iLocalProtocol.WriteToLog( _L8( "CLocalDocument::DoCancel()" ) );
+ #endif
+ }
+
+
+
+