xdmprotocols/LocalProtocol/src/LocalDocument.cpp
branchRCL_3
changeset 35 fbd2e7cec7ef
parent 0 c8caa15ef882
--- /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
+    }
+
+
+
+