xdmprotocols/XcapProtocol/src/XcapDocument.cpp
branchGCC_SURGE
changeset 28 d9861ae9169c
parent 23 77cb48a03620
parent 26 04ca1926b01c
--- a/xdmprotocols/XcapProtocol/src/XcapDocument.cpp	Thu Jul 01 14:09:06 2010 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1094 +0,0 @@
-/*
-* 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: CXcapDocument
-*
-*/
-
-
-
-
-// INCLUDE FILES
-#include <f32file.h>
-#include <XdmErrors.h>
-#include "XdmOperationFactory.h"
-#include "XcapProtocol.h"
-#include "XcapDocument.h"
-#include "XcapAppUsage.h"
-#include "XdmXmlParser.h"
-#include "XdmNamespace.h"
-#include "CommonDefines.h"
-#include "XcapDocumentNode.h"
-#include "XcapHttpRequest.h"
-#include "XcapHttpOperation.h"
-#include "XcapHttpTransport.h"
-
-// ================= MEMBER FUNCTIONS =======================
-//
-
-
-// ----------------------------------------------------------
-// CXcapDocument::CXcapDocument
-// 
-// ----------------------------------------------------------
-//
-CXcapDocument::CXcapDocument( TXdmDocType aDocumentType,
-                              const CXdmEngine& aXdmEngine,
-                              const CXcapProtocol& aXcapProtocol ) :
-                              CXdmDocument( CONST_CAST( CXdmEngine&, aXdmEngine ) ),
-                              iDocumentType( aDocumentType ),
-                              iXcapProtocol( CONST_CAST( CXcapProtocol&, aXcapProtocol ) )
-                                                
-    { 
-    }
-
-// ----------------------------------------------------------
-// CXcapDocument::NewL
-// 
-// ----------------------------------------------------------
-//
-CXcapDocument* CXcapDocument::NewL( TXdmDocType aDocumentType,
-                                    const TDesC& aDocumentName,
-                                    const CXdmEngine& aXdmEngine,
-                                    const CXcapProtocol& aXcapProtocol )
-    {
-    CXcapDocument* self = new ( ELeave ) CXcapDocument( aDocumentType, aXdmEngine, aXcapProtocol );
-    CleanupStack::PushL( self );
-    self->BaseConstructL( KXcapOperationFactory, aDocumentName );
-    self->ConstructL();
-    CleanupStack::Pop();
-    return self;
-    }
-
-// ----------------------------------------------------------
-// CXcapDocument::NewL
-// 
-// ----------------------------------------------------------
-//
-CXcapDocument* CXcapDocument::NewL( TXdmDocType aDocumentType,
-                                    const TDesC8& aDocumentName,
-                                    const CXdmEngine& aXdmEngine,
-                                    const CXcapProtocol& aXcapProtocol )
-    {
-    CXcapDocument* self = new ( ELeave ) CXcapDocument( aDocumentType, aXdmEngine, aXcapProtocol );
-    CleanupStack::PushL( self );
-    self->ConstructL( aDocumentName );
-    CleanupStack::Pop();
-    return self;
-    }
-
-// ----------------------------------------------------------
-// CXcapDocument::ConstructL
-// 
-// ----------------------------------------------------------
-//
-void CXcapDocument::ConstructL( const TDesC8& aDocumentName )
-    {
-    BaseConstructL( KXcapOperationFactory, aDocumentName );
-    ConstructL();
-    }
-    
-// ----------------------------------------------------------
-// CXcapDocument::ConstructL
-// 
-// ----------------------------------------------------------
-//
-void CXcapDocument::ConstructL()
-    {
-    InstallAppUsageL();
-    iErrorRoot = CXcapDocumentNode::NewL( iXdmEngine, iXcapProtocol );
-    TPtrC8 root( iXcapProtocol.Transport().RootUri() );
-    #ifdef _DEBUG
-        HBufC8* buf = HBufC8::NewLC( iDocumentName->Des().Length() );
-        buf->Des().Copy( iDocumentName->Des() );
-        TPtr8 nameDesc( buf->Des() );
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::ConstructL()" ) );
-        iXcapProtocol.WriteToLog( _L8( "  Root URI:   %S" ), &root );
-        iXcapProtocol.WriteToLog( _L8( "  Document:   %S" ), &nameDesc );
-        CleanupStack::PopAndDestroy();  //buf
-    #endif
-    RXcapCache* cache = iXcapProtocol.Cache();
-    if( cache )
-        UpdateDocumentInfoL( cache );
-    else
-        {
-        #ifdef _DEBUG
-            iXcapProtocol.WriteToLog( _L8( "  Cache disabled, no info for the document" ) );
-        #endif
-        }
-    CActiveScheduler::Add( this );
-    }
-
-// ----------------------------------------------------
-// CXcapDocument::~CXcapDocument
-// 
-// ----------------------------------------------------
-//
-CXcapDocument::~CXcapDocument()
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::~CXcapDocument()" ) );
-    #endif
-    Cancel();
-    delete iTempCopy;
-    delete iEightBitName;
-    delete iDocumentRoot;
-    delete iErrorRoot;
-    delete iAppUsage;
-    iNamespaces.ResetAndDestroy();
-    iNamespaces.Close();
-    }
-
-// ----------------------------------------------------------
-// CXcapDocument::ResetContents
-// 
-// ----------------------------------------------------------
-//
-void CXcapDocument::ResetContents()
-    {
-    iOptions = 0;
-    delete iDocumentRoot;
-    iDocumentRoot = NULL;
-    delete iErrorRoot;
-    iErrorRoot = NULL;
-    delete iTempCopy;
-    iTempCopy = NULL;
-    iNamespaces.ResetAndDestroy();
-    }
-    
-// ----------------------------------------------------------
-// CXcapDocument::UpdateDocumentInfoL
-// 
-// ----------------------------------------------------------
-//
-void CXcapDocument::UpdateDocumentInfoL( RXcapCache* aCacheClient )
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::UpdateDocumentInfo()" ) );
-    #endif
-    iETagBuffer.Zero();
-    TCacheEntryInfo cacheEntryInfo;
-    TPtrC8 root( iXcapProtocol.Transport().RootUri() );
-    TInt error = aCacheClient->FetchDocumentInfo( 
-                 iETagBuffer, iDocumentName->Des(), root, cacheEntryInfo );    
-    if( error == KErrNone )
-        {
-        iLastAccess = cacheEntryInfo.iLastAccess;
-        iLastModification = cacheEntryInfo.iLastUpdate;
-        iDataLength = cacheEntryInfo.iDataLength;
-        #ifdef _DEBUG
-            const TInt KDateTimeMaxSize = 100;
-            TBuf8<KDateTimeMaxSize> printBuffer;
-            TBuf<KDateTimeMaxSize> dateTimeBuffer;
-            _LIT( KDateTimeFormat, "%D%M%Y%/0%1%/1%2%/2%3%/3 %:0%H%:1%T%:2%S");
-            iLastModification.FormatL( dateTimeBuffer, KDateTimeFormat );
-            printBuffer.Copy( dateTimeBuffer );
-            iXcapProtocol.WriteToLog( _L8( "  ETag:        %S" ), &iETagBuffer );
-            iXcapProtocol.WriteToLog( _L8( "  Size:        %d bytes" ), iDataLength );
-            iXcapProtocol.WriteToLog( _L8( "  Time stamp:  %S" ), &printBuffer );
-        #endif
-        }
-    else
-        {
-        #ifdef _DEBUG
-            iXcapProtocol.WriteToLog( _L8( "  Cache read complete - Error: %d" ), error );
-        #endif
-        }
-    }
-    
-// ----------------------------------------------------
-// CXcapDocument::InstallAppUsageL
-// 
-// ----------------------------------------------------
-//
-void CXcapDocument::InstallAppUsageL()
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::InstallAppUsageL()" ) );
-    #endif  
-    HBufC8* docName = NULL;
-    iAppUsage = CXcapAppUsage::NewL( iXdmEngine, iDocumentType );
-    TPtrC8 auid = iAppUsage->AUID();
-    if( IsGlobalTree( auid ) )
-        {
-        docName = HBufC8::NewLC( auid.Length() + KGlobalDirName().Length() + 
-                                 KXcapGlobalDocName().Length() );
-        docName->Des().Copy( auid );
-        docName->Des().Append( KGlobalDirName );
-        docName->Des().Append( KXcapGlobalDocName );
-        delete iDocumentName;
-        iDocumentName = NULL;
-        iDocumentName = HBufC::NewL( docName->Des().Length() );
-        iDocumentName->Des().Copy( docName->Des() );
-        CleanupStack::PopAndDestroy();  //docName
-        }
-    else
-        {
-        TPtrC8 user = iXcapProtocol.UserName();
-        docName = HBufC8::NewLC( auid.Length() + user.Length() + 
-                                 KUserDirName().Length() + 1 /*'/'*/ + 
-                                 iDocumentName->Des().Length() );
-        docName->Des().Copy( auid );
-        docName->Des().Append( KUserDirName );
-        docName->Des().Append( user );
-        docName->Des().Append( KSlash );
-        docName->Des().Append( iDocumentName->Des() );
-        delete iDocumentName;
-        iDocumentName = NULL;
-        iDocumentName = HBufC::NewL( docName->Des().Length() );
-        iDocumentName->Des().Copy( docName->Des() );
-        CleanupStack::PopAndDestroy();  //docName
-        }
-    
-    }
-
-// ----------------------------------------------------
-// CXcapDocument::IsGlobalTree
-// 
-// ----------------------------------------------------
-//
-TBool CXcapDocument::IsGlobalTree( const TDesC8& aAuid )
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::IsGlobalTree()" ) );
-    #endif
-    TBool found = EFalse;
-    //Update this array when necessary
-    const TPtrC8 KGlobalTreeAuids[] = { TPtrC8( KXdmCapabilityUsageAUID ) };
-    const TInt count = sizeof( KGlobalTreeAuids ) / sizeof( KGlobalTreeAuids[0] );
-    for( TInt i = 0;!found && i < count;i++ )
-        found = aAuid.Compare( KGlobalTreeAuids[i] ) == 0;
-    return found;
-    }
-    
-// ----------------------------------------------------
-// CXcapDocument::CreateTempCopyL
-// 
-// ----------------------------------------------------
-//
-void CXcapDocument::CreateTempCopyL()
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::CreateTempCopyL()" ) );
-    #endif
-    CXdmDocument* copy = iXdmEngine.CreateDocumentModelL( Name(), iDocumentType );
-    iTempCopy = ( CXcapDocument* )copy;
-    }
-
-// ----------------------------------------------------
-// CXcapDocument::TempCopyL
-// 
-// ----------------------------------------------------
-//
-EXPORT_C CXcapDocument* CXcapDocument::TempCopyL()
-    {
-    return CXcapDocument::NewL( iDocumentType, Name(), iXdmEngine, iXcapProtocol );
-    }
-
-// ----------------------------------------------------
-// CXcapDocument::CreateRootL
-// 
-// ----------------------------------------------------
-//
-CXdmDocumentNode* CXcapDocument::CreateRootL()
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXdmDocument::CreateRootL()" ) );
-    #endif
-    delete iDocumentRoot;
-    iDocumentRoot = NULL;
-    iDocumentRoot = CXcapDocumentNode::NewL( iXdmEngine, iXcapProtocol );
-    return iDocumentRoot;
-    }
-
-// ----------------------------------------------------
-// CXcapDocument::AppendPathPartL
-// 
-// ----------------------------------------------------
-//
-void CXcapDocument::AppendPathPartL( const TDesC& aString )
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::PathPartL()" ) );
-    #endif
-    if( iDocumentRoot != NULL )
-        {
-        CXdmDocumentNode* node = NULL;
-        CXdmDocumentNode* parent = iDocumentRoot;
-        while( parent->NextNode() != NULL )
-            parent = parent->NextNode();
-        node = CXcapDocumentNode::NewL( iXdmEngine, aString, iXcapProtocol, parent );
-        parent->SetNextNode( node );
-        }
-    else iDocumentRoot = CXcapDocumentNode::NewL( iXdmEngine, aString, iXcapProtocol );
-    }
-
-// ----------------------------------------------------
-// CXcapDocument::CurrentExtent
-// 
-// ----------------------------------------------------
-//
-CXdmDocumentNode* CXcapDocument::CurrentExtent() const
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXdmDocument::CurrentExtent()" ) );
-    #endif
-    CXdmDocumentNode* ret = NULL;
-    if( iDocumentRoot != NULL )
-        {
-        CXdmDocumentNode* node = iDocumentRoot;
-        while( node->NextNode() != NULL )
-            node = node->NextNode();
-        ret = node;
-        }
-    else
-        {
-        #ifdef _DEBUG
-            iXcapProtocol.WriteToLog( _L8( " This document does not yet have a root, leave with KErrGeneral" ) );
-        #endif
-        User::Leave( KErrGeneral );
-        }
-    return ret;
-    }
-    
-// ----------------------------------------------------
-// CXcapDocument::DocumentRoot
-// 
-// ----------------------------------------------------
-//
-CXdmDocumentNode* CXcapDocument::DocumentRoot() const
-    {
-    return iDocumentRoot;
-    }     
-
-// ----------------------------------------------------
-// CXcapDocument::ErrorRoot
-// 
-// ----------------------------------------------------
-//
-CXdmDocumentNode* CXcapDocument::ErrorRoot()
-    {
-    if( !iErrorRoot )
-        {
-        iErrorRoot = CXcapDocumentNode::NewL( iXdmEngine, iXcapProtocol );
-        }
-    return iErrorRoot;
-    }
-
-// ----------------------------------------------------
-// CXcapDocument::ResetSubset
-// 
-// ----------------------------------------------------
-//
-EXPORT_C void CXcapDocument::ResetSubset()
-    {
-    CXdmDocument::ResetSubset();
-    delete iDocumentRoot;
-    iDocumentRoot = NULL;
-    iOptions = 0;
-    }
-           
-// ----------------------------------------------------
-// CXcapDocument::ETag
-// 
-// ----------------------------------------------------
-//
-EXPORT_C TPtrC8 CXcapDocument::ETag() const
-    {
-    return iETagBuffer;
-    }
-        
-// ----------------------------------------------------
-// CXcapDocument::SetETag
-// 
-// ----------------------------------------------------
-//     
-EXPORT_C void CXcapDocument::SetETag( const TDesC8& aETagDesc )
-    {
-    iETagBuffer.Zero();
-    iETagBuffer.Copy( aETagDesc );
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::SetETag()" ) );
-        iXcapProtocol.WriteToLog( _L8( "  New ETag: %S" ), &iETagBuffer );
-    #endif
-    }
-
-// ----------------------------------------------------
-// CXcapDocument::DataLength
-// 
-// ----------------------------------------------------
-//
-EXPORT_C TInt CXcapDocument::DataLength() const
-    {
-    return iDataLength;
-    }
-
-// ----------------------------------------------------
-// CXcapDocument::ApplicationUsage
-// 
-// ----------------------------------------------------
-//
-EXPORT_C CXcapAppUsage& CXcapDocument::ApplicationUsage() const
-    {
-    return *iAppUsage;
-    }
-
-// ----------------------------------------------------
-// CXcapDocument::Protocol
-// 
-// ----------------------------------------------------
-//
-EXPORT_C CXcapProtocol& CXcapDocument::Protocol() const
-    {
-    return iXcapProtocol;
-    }
-    
-// ----------------------------------------------------
-// CXcapDocument::RemoveData
-// 
-// ----------------------------------------------------
-//
-EXPORT_C void CXcapDocument::RemoveData( CXcapDocumentNode* aDocumentNode )
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::RemoveData()" ) );
-    #endif
-    CXcapDocumentNode* parent = ( CXcapDocumentNode* )aDocumentNode->Parent();
-    if( parent != NULL )
-        parent->RemoveNode( aDocumentNode );
-    }
-    
-// ----------------------------------------------------
-// CXcapDocument::StartUpdateL
-// 
-// ----------------------------------------------------
-//
-void CXcapDocument::StartUpdateL()
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::StartUpdateL()" ) );
-    #endif
-    TInt resolverError = 0;
-    if( iXcapProtocol.IsSimRequestPending( resolverError ) )
-        {
-        #ifdef _DEBUG
-            iXcapProtocol.WriteToLog( _L8( "  IMS Resolver pending => add to queue" ) );
-        #endif
-        iXcapProtocol.AppendNotifyeeL( this );
-        }
-    else
-        {
-        if( resolverError == KErrNone && !IsActive() && iChangeRequests.Count() > 0 )
-            {
-            iUpdateIndex = 0;
-            iDocumentState = EXdmDocUpdating;
-            iOperationCount = iChangeRequests.Count();
-            ActivateOperationL();
-            }
-        else
-            {
-            #ifdef _DEBUG
-                iXcapProtocol.WriteToLog( _L8(
-                 "  Already active, no operations or IMS resolver failed => complete with error" ) );
-            #endif
-            TInt error = resolverError == KErrNone ? KErrNotReady : resolverError; 
-            User::RequestComplete( iClientStatus, error );
-            }
-        }
-    }
-
-// ----------------------------------------------------
-// CXcapDocument::StartInternalL
-// 
-// ----------------------------------------------------
-//
-void CXcapDocument::StartInternalL( TRequestStatus& aStatus )
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::StartInternalL()" ) );
-    #endif
-    aStatus = KRequestPending;
-    iClientStatus = &aStatus;
-    StartUpdateL();
-    }
-
-// ----------------------------------------------------
-// CXcapDocument::NotifyResolverCompleteL
-// 
-// ----------------------------------------------------
-//
-void CXcapDocument::NotifyResolverCompleteL( TInt aError )
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::NotifyResolverCompleteL()" ) );
-    #endif
-    if( aError == KErrNone )
-        {
-        #ifdef _DEBUG
-            iXcapProtocol.WriteToLog( _L8( "  IMS Resolver ready" ) );
-        #endif
-        StartUpdateL();
-        }
-    else
-        {
-        #ifdef _DEBUG
-            iXcapProtocol.WriteToLog( _L8( "  IMS Resolver failed => complete with %d" ), aError );
-        #endif
-        DequeueAll();
-        User::RequestComplete( iClientStatus, aError );
-        }
-    }
-    
-// ----------------------------------------------------
-// CXcapDocument::ActivateOperationL
-// 
-// ----------------------------------------------------
-//
-void CXcapDocument::ActivateOperationL()
-    {
-    MXdmOperation* request = iChangeRequests[iUpdateIndex];
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::ActivateOperation() - Operation: %x" ), request );
-    #endif
-    if( iDocSubset )
-        {
-        #ifdef _DEBUG
-            iXcapProtocol.WriteToLog( _L8( " Document subset => set KXdmOption1 and KXdmOption2" ) );
-        #endif
-        SetOption( KXdmOption1 );
-        SetOption( KXdmOption2 );
-        }
-    if( iXcapProtocol.AuthType() == EXcapAuthEarlyIms )
-        {
-        #ifdef _DEBUG
-            iXcapProtocol.WriteToLog( _L8( " EarlyIMS is in use => set KXdmOption4" ) );
-        #endif
-        SetOption( KXdmOption4 );
-        }
-    request->ExecuteL( iStatus, iOptions );
-    SetActive();
-    }
-
-// ----------------------------------------------------
-// CXcapDocument::SetOption
-// 
-// ----------------------------------------------------
-//
-void CXcapDocument::SetOption( TInt aOption )
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::SetOption()" ) );
-    #endif
-    iOptions |= aOption;
-    }
-       
-// ----------------------------------------------------
-// CXcapDocument::CancelUpdate
-// 
-// ----------------------------------------------------
-//
-void CXcapDocument::CancelUpdate()
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::CancelUpdate()" ) );
-    #endif
-    TInt resolverError = 0;
-    if( iXcapProtocol.IsSimRequestPending( resolverError ) )
-        {
-        iXcapProtocol.CancelImsResolver();
-        }
-    else
-        {
-        switch( iDocumentState )
-            {
-            case EResolvingAsyncConflict:
-                iTempCopy->CancelUpdate();
-                break;
-            default:
-                {
-                TInt count = iChangeRequests.Count();
-                if( count > 0 )
-                    {
-                    MXdmOperation* request = iChangeRequests[iUpdateIndex];
-                    request->CancelOperation();
-                    #ifdef _DEBUG
-                        iXcapProtocol.WriteToLog( _L8( "  Operation %x cancelled" ), request );
-                    #endif
-                    }
-                }
-            }
-        }
-    User::RequestComplete( iClientStatus, KErrCancel );
-    }
-
-// ---------------------------------------------------------
-// CXcapDocument::RunL()
-// 
-// ---------------------------------------------------------
-//
-void CXcapDocument::RunL()
-    {
-    #ifdef _DEBUG
-        HBufC8* buf = HBufC8::NewLC( iDocumentName->Des().Length() );
-        buf->Des().Copy( iDocumentName->Des() );
-        TPtr8 nameDesc( buf->Des() );
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::RunL()" ) );
-        iXcapProtocol.WriteToLog( _L8( "  Name:         %S" ), &nameDesc );
-        iXcapProtocol.WriteToLog( _L8( "  Error:        %d" ), iStatus.Int() );
-        iXcapProtocol.WriteToLog( _L8( "  Update index: %d" ), iUpdateIndex );
-        CleanupStack::PopAndDestroy();  //buf
-    #endif
-    if( iStatus == KErrNone )
-        {
-        switch( iDocumentState )
-            {
-            case EXdmDocUpdating:
-                #ifdef _DEBUG
-                    iXcapProtocol.WriteToLog( _L8( "  Document state: EXdmDocUpdating" ) );
-                #endif
-                HandleRequestCompletionL();
-                break;
-            case EResolvingAsyncConflict:
-                #ifdef _DEBUG
-                    iXcapProtocol.WriteToLog( _L8( "  Document state: EResolvingAsyncConflict" ) );
-                #endif
-                ResolveAsyncConflictL();
-                break;
-            case ERetryingFailedOperation:
-                #ifdef _DEBUG
-                    iXcapProtocol.WriteToLog( _L8( "  Document state: ERetryingFailedOperation" ) );
-                #endif
-                ResolveAsyncConflictL();
-                break;
-            default:
-                break;
-            }
-        }
-    else HandleErrorL();
-    #ifdef _DEBUG
-        TInt biggestBlock( 0 );
-        TInt memory( User::Available( biggestBlock ) );
-        iXcapProtocol.WriteToLog( _L8( "** RunL() completes - Available memory: %d" ), memory );
-    #endif
-    }
-
-// ---------------------------------------------------------
-// CXcapDocument::HandleRequestCompletionL
-// 
-// ---------------------------------------------------------
-//
-void CXcapDocument::HandleRequestCompletionL()
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::HandleRequestCompletionL()" ) );
-    #endif
-    MXdmOperation* request = iChangeRequests[iUpdateIndex];
-    const TXdmCompletionData& data = request->CompletionData();
-    switch( data.iCompletion )
-        {
-        case KInsertConflict:
-            ResolveAsyncConflictL();
-            break;
-        default:
-            {
-            RXcapCache* cache = iXcapProtocol.Cache();
-            if( cache )
-                UpdateDocumentInfoL( cache );
-            DequeueOperation( request );
-            CheckOperationQueueL();
-            break;
-            }
-        }
-    }
-
-// ---------------------------------------------------------
-// CXcapDocument::ResolveAsyncConflictL
-// 
-// ---------------------------------------------------------
-//
-void CXcapDocument::ResolveAsyncConflictL()
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::ResolveAsyncConflictL()" ) );
-    #endif
-    switch( iDocumentState )
-        {
-        //This means the cached version of this document
-        //is out-of-date and that it needs to be updated.
-        case EXdmDocUpdating:
-            {
-            CreateTempCopyL();
-            iTempCopy->SetETag( iETagBuffer );
-            iTempCopy->FetchDataL();
-            iTempCopy->SaveClientStatus( iStatus );
-            iTempCopy->StartUpdateL();
-            iDocumentState = EResolvingAsyncConflict;
-            SetActive();
-            }
-            break;
-        case EResolvingAsyncConflict:
-            #ifdef _DEBUG
-                iXcapProtocol.WriteToLog( _L8( "  Async conflict resolved, retry insert" ) );
-            #endif
-            //CheckOperationQueueL() will increment the index
-            iUpdateIndex--;
-            SetETag( iTempCopy->ETag() );
-            iDocumentState = ERetryingFailedOperation;
-            CheckOperationQueueL();
-            break;
-        case ERetryingFailedOperation:
-            #ifdef _DEBUG
-                iXcapProtocol.WriteToLog( _L8( "  Operation retry ready" ) );
-            #endif
-            //Nothing can be done now but instruct the
-            //client to re-fetch the whole document and
-            //retry the failed operation.
-            User::RequestComplete( iClientStatus, KErrPathNotFound );
-            break;
-        default:
-            break;
-        }
-    }
-    
-// ---------------------------------------------------------
-// CXcapDocument::HandleErrorL
-// 
-// ---------------------------------------------------------
-//
-void CXcapDocument::HandleErrorL()
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::HandleErrorL()" ) );
-    #endif
-    TInt clientCode = KErrGeneral;
-    MXdmOperation* request = request = iChangeRequests[iUpdateIndex];
-    //The TXdmCompletionData is guaranteed to point at something 
-    const TXdmCompletionData& data = request->CompletionData();
-    switch( data.iCompletion )
-        {
-        case KErrCancel:
-            #ifdef _DEBUG
-                iXcapProtocol.WriteToLog( _L8( " Update cancelled" ) );
-            #endif
-            clientCode = KErrCancel;
-            break;
-        case ERetryingFailedOperation:
-            #ifdef _DEBUG
-                iXcapProtocol.WriteToLog( _L8( "  Operation retry failed" ) );
-            #endif
-            //Nothing can be done now but instruct the
-            //client to re-fetch the whole document and
-            //retry the failed operation.
-            User::RequestComplete( iClientStatus, KXcapErrorUnrecoverableConflict );
-            break;
-        case KXcapErrorHttpConflict:
-            #ifdef _DEBUG
-                iXcapProtocol.WriteToLog( _L8( "  Conflict, parse error document if available" ) );
-            #endif
-            if( data.iResponseData != NULL )
-                {
-                TInt error = KErrNone;
-                TPtrC8 errorData( data.iResponseData->Des() );
-                TRAP( error, iXcapProtocol.Parser().ParseDocumentL( errorData, ErrorRoot() ) );
-                #ifdef _DEBUG
-                    iXcapProtocol.WriteToLog( _L8( "  Parsing completed: %d" ), error );
-                    ErrorRoot()->Print();
-                #endif
-                //Suppress build warning
-                error = KErrNone;
-                }
-		        User::RequestComplete( iClientStatus, KXcapErrorHttpConflict );
-            break;
-        case KXcapErrorNetworkNotAvailabe:
-            {
-            #ifdef _DEBUG
-                iXcapProtocol.WriteToLog( _L8( "  Network not available, check cache" ) );
-            #endif
-            if( iDataLength > 0 )
-                {
-                RXcapCache* cache = iXcapProtocol.Cache();
-                if( cache != NULL )
-                    {
-                    TPtrC name( Name() );
-                    TInt error = KErrNone;
-                    TPtrC8 root = iXcapProtocol.Transport().RootUri();
-                    HBufC8* data = HBufC8::NewLC( iDataLength );
-                    TPtr8 dataPtr( data->Des() );
-                    cache->FetchDocumentContent( dataPtr, name, root );
-                    TRAP( error, iXcapProtocol.Parser().ParseDocumentL( this, dataPtr ) );
-                    #ifdef _DEBUG
-                        iXcapProtocol.WriteToLog( _L8( "  Parsing completed: %d" ), error );
-                    #endif
-                    //Suppress build warning
-                    error = KErrNone;
-                    CleanupStack::PopAndDestroy();  //data
-                    }
-                }
-            else
-                {
-                #ifdef _DEBUG
-                    iXcapProtocol.WriteToLog( _L8( "  No data in cache, nothing to do" ) );
-                #endif
-                }
-            User::RequestComplete( iClientStatus, KXcapErrorNetworkNotAvailabe );
-            }
-            break;
-        default:
-            #ifdef _DEBUG
-                iXcapProtocol.WriteToLog( _L8( " Default case - Result: %d" ), data.iCompletion );
-            #endif
-            clientCode = iStatus.Int();
-            User::RequestComplete( iClientStatus, clientCode );
-        }
-    DequeueOperation( request );
-    }
-     
-// ---------------------------------------------------------
-// CXcapDocument::CheckOperationQueueL
-// 
-// ---------------------------------------------------------
-//
-void CXcapDocument::CheckOperationQueueL()
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::CheckOperationQueueL()" ) );
-    #endif
-    iUpdateIndex++;
-    if( iUpdateIndex < iOperationCount )
-        ActivateOperationL();
-    else
-        {
-        DequeueAll();
-        iUpdateIndex = 0;
-        iXcapProtocol.CheckActivity();
-        User::RequestComplete( iClientStatus, KErrNone );   
-        }
-    }
-
-// ---------------------------------------------------------
-// CXcapDocument::DequeueOperation
-// 
-// ---------------------------------------------------------
-//
-void CXcapDocument::DequeueOperation( MXdmOperation* aOperation )
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::DequeueOperation()" ) );
-    #endif
-    TInt index = iChangeRequests.Find( aOperation );
-    if( index >= 0 )
-    	{	
-		iChangeRequests.Remove( index );    
-        aOperation->Destroy();
-        aOperation = NULL;
-    	}  
-   	iOperationCount = iChangeRequests.Count();
-    }
-
-// ---------------------------------------------------------
-// CXcapDocument::DequeueAll
-// 
-// ---------------------------------------------------------
-//
-void CXcapDocument::DequeueAll()
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::DequeueAll()" ) );
-    #endif
-    TInt count = iChangeRequests.Count();
-    for( TInt i = 0;i < count;i++ )
-    	{
-    	MXdmOperation* request = iChangeRequests[i];
-    	iChangeRequests.Remove( i );
-    	request->Destroy();
-    	request = NULL;
-    	} 
-    }
-      
-// ---------------------------------------------------------
-// CXcapDocument::EightBitNameLC
-// 
-// ---------------------------------------------------------
-//
-HBufC8* CXcapDocument::EightBitNameLC()
-    {
-    /*#ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::EightBitNameLC()" ) );
-    #endif*/
-    __ASSERT_DEBUG( Name().Length() > 0, User::Panic( _L( "CXcapDocument" ), 1 ) );
-    HBufC8* buf = HBufC8::NewLC( Name().Length() );
-    buf->Des().Copy( Name() );
-    return buf;
-    }
-
-// ---------------------------------------------------------
-// CXcapDocument::DocumentType
-// 
-// ---------------------------------------------------------
-//
-TXdmDocType CXcapDocument::DocumentType() const
-    {
-    return iDocumentType;
-    }
-
-// ---------------------------------------------------------
-// CXcapDocument::AppendNamespaceL
-// 
-// ---------------------------------------------------------
-//
-void CXcapDocument::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 CXcapDocument::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;
-            }
-        }
-    }
-                    
-// ---------------------------------------------------------
-// CXcapDocument::Uri
-// 
-// ---------------------------------------------------------
-//
-TPtrC8 CXcapDocument::Uri( const TDesC8& aPrefix ) const
-    {
-    TPtrC8 uri( _L8( "" ) );
-    TBool found = EFalse;
-    TInt count = iNamespaces.Count();
-    for( TInt i = 0;!found && i < count ;i++ )
-        {
-        if( iNamespaces[i]->Prefix().Compare( aPrefix ) == 0 )
-            {
-            uri.Set( iNamespaces[i]->Uri() );
-            found = ETrue;
-            }
-        }
-    return uri;
-    }
-
-// ---------------------------------------------------------
-// CXcapDocument::Count
-// 
-// ---------------------------------------------------------
-//
-TInt CXcapDocument::Count() const
-    {
-    return iNamespaces.Count();
-    }
-
-// ---------------------------------------------------------
-// CXcapDocument::Prefix
-// 
-// ---------------------------------------------------------
-//
-TPtrC8 CXcapDocument::Prefix( TInt aIndex ) const
-    {
-    TInt count = iNamespaces.Count();
-    if( count > 0 && ( aIndex >= 0 && aIndex < count ) )
-        return iNamespaces[aIndex]->Prefix();
-    else return TPtrC8();
-    }
-    
-// ---------------------------------------------------------
-// CXcapDocument::Uri
-// 
-// ---------------------------------------------------------
-//
-TPtrC8 CXcapDocument::Uri( TInt aIndex ) const
-    {
-    TInt count = iNamespaces.Count();
-    if( count > 0 && ( aIndex >= 0 && aIndex < count ) )
-        return iNamespaces[aIndex]->Uri();
-    else return TPtrC8();
-    }
-    
-// ---------------------------------------------------------
-// CXcapDocument::ResetNamespaces
-// 
-// ---------------------------------------------------------
-//
-void CXcapDocument::ResetNamespaces( ) 
-    {   
-    iNamespaces.ResetAndDestroy();
-    } 
-    
-// ---------------------------------------------------------
-// CXcapDocument::TimeStamp
-// 
-// ---------------------------------------------------------
-//
-TTime CXcapDocument::TimeStamp() const
-    {
-    return iLastModification;
-    }
-
-// ----------------------------------------------------
-// CXdmDocument::SaveClientStatus
-// 
-// ----------------------------------------------------
-//
-void CXcapDocument::SaveClientStatus( TRequestStatus& aClientStatus )
-    {
-    iClientStatus = &aClientStatus;        
-    }
-            
-// ---------------------------------------------------------
-// CXcapDocument::DoCancel
-// 
-// ---------------------------------------------------------
-//
-void CXcapDocument::DoCancel()
-    {
-    #ifdef _DEBUG
-        iXcapProtocol.WriteToLog( _L8( "CXcapDocument::DoCancel()" ) );
-    #endif
-    if( iClientStatus )
-        {
-        User::RequestComplete( iClientStatus, KErrCancel );
-        #ifdef _DEBUG
-            iXcapProtocol.WriteToLog( _L8( " Request completed" ) );
-        #endif
-        }
-    else
-        {
-        #ifdef _DEBUG
-            iXcapProtocol.WriteToLog( _L8( " iClientStatus == NULL => do nothing" ) );
-        #endif
-        }
-    }
-
-
-
-