diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/src/LocalDocument.cpp --- /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 +#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 buf; + TBuf 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 + } + + + +