xdmprotocols/XcapProtocol/XcapOperations/src/XcapDeletion.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:05:17 +0200
changeset 0 c8caa15ef882
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* 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:   CXcapDeletion
*
*/




// INCLUDES
#include "XcapCache.h"
#include "XcapProtocol.h"
#include "XcapDeletion.h"
#include "XcapAppUsage.h"
#include "XcapDocument.h"
#include "XcapUriParser.h"
#include "XdmXmlParser.h"
#include "XcapDocumentNode.h"
#include "XcapHttpTransport.h"
#include "XcapHttpOperation.h"
#include "XcapHttpReqDelete.h"
#include "XcapOperationFactory.h"

// ================= MEMBER FUNCTIONS =======================

// ---------------------------------------------------------
// CXcapDeletion::CXcapDeletion
//
// ---------------------------------------------------------
//
CXcapDeletion::CXcapDeletion( CXcapDocument& aParentDoc,
                              CXcapDocumentNode* aDocumentSubset,
                              CXcapOperationFactory& aOperationFactory ) :
                              CXcapHttpOperation( aParentDoc, aDocumentSubset, aOperationFactory ),
                              iOperationType( iDocumentSubset == NULL ?
                              EXdmDocument : EXdmPartialDocument )                                 
    {
    }

// ---------------------------------------------------------
// CXcapDeletion::NewL
//
// ---------------------------------------------------------
//
CXcapDeletion* CXcapDeletion::NewL( CXcapDocument& aParentDoc,
                                    CXcapDocumentNode* aDocumentSubset,
                                    CXcapOperationFactory& aOperationFactory )
    {
    CXcapDeletion* self = new ( ELeave ) CXcapDeletion( aParentDoc, aDocumentSubset, aOperationFactory );
    CleanupStack::PushL( self );
    self->BaseConstructL();
    self->ConstructL();
    CleanupStack::Pop();
    return self;
    }

// ---------------------------------------------------------
// CXcapDeletion::ConstructL
//
// ---------------------------------------------------------
//
void CXcapDeletion::ConstructL()
    {
    CXcapHttpReqDelete* request = Transport().DeleteL( iTargetDoc.Name() );
    CleanupStack::PushL( request );
    User::LeaveIfError( iRequestQueue.Append( request ) );
    request->SetExpiryTimeL( NULL, KDefaultHttpRequestTimeout * 1000000 );
    CleanupStack::Pop();  //request
    if( iOperationType != EXdmDocument && iDocumentSubset != NULL )
    	{
    	iUriParser->SetDocumentSubset( iDocumentSubset );
    	//Add namespace mappings
    	User::LeaveIfError( iTargetDoc.ApplicationUsage().Validate(
                        	*iDocumentSubset, iUriParser, ETrue ) );
    	}
    }
    
// ---------------------------------------------------------
// CXcapDeletion::ExecuteL
//
// ---------------------------------------------------------
//
void CXcapDeletion::ExecuteL()
    {
    #ifdef _DEBUG
        iOperationFactory.WriteToLog( _L8( "CXcapDeletion::ExecuteL()" ) );  
    #endif
    TPtrC8 eTag = iTargetDoc.ETag();
    if( eTag.Length() > 0 )
        iActiveRequest->SetHeaderL( KHttpHeaderIfMatch, eTag );
    TRAPD( error, iUriParser->ParseL( iActiveRequest->RequestUriL() ) );
    if( error == KErrNone )
        {
        TPtrC8 uri = iUriParser->DesC8();
        #ifdef _DEBUG
            iOperationFactory.WriteToLog( _L8( " New URI: %S" ), &uri );  
        #endif
        HBufC8* escape = CXcapHttpOperation::EscapeLC( uri );
        iActiveRequest->UpdateRequestUriL( escape->Des() );
        CleanupStack::PopAndDestroy();  //escape
        } 
    }
        
// ---------------------------------------------------------
// CXcapDeletion::OperationCompleteL
//
// ---------------------------------------------------------
//
void CXcapDeletion::OperationCompleteL()
    {
    #ifdef _DEBUG
        iOperationFactory.WriteToLog( _L8( "CXcapDeletion::OperationCompleteL()" ) );  
    #endif
    switch( iRequestData->iHttpStatus )
        {
        case 200:           //Document was deleted
            {
            #ifdef _DEBUG
                iOperationFactory.WriteToLog( _L8( " Status 200 - Document deleted" ) );  
            #endif
            iOperationType == EXdmDocument ?
                              HandleDocDeletion() :
                              HandlePartialDeletion();
            iCompleted = ETrue;
            }
            break;
        case 404:           //Document was not found
            {
            #ifdef _DEBUG   
                iOperationFactory.WriteToLog( _L8( " Status 404 - Document not found" ) );  
            #endif
            iCompleted = ETrue;
            iResult = KErrNotFound;
            }
            break;
        default:
            #ifdef _DEBUG
                iOperationFactory.WriteToLog( _L8( " Default case - Status: %d" ),
                                                   iRequestData->iHttpStatus );  
            #endif
            iCompleted = ETrue;
            break;
        }
    iResult = ReinterpretStatus( iRequestData->iHttpStatus );
    }

// ---------------------------------------------------------
// CXcapDeletion::HandleDocDeletion
//
// ---------------------------------------------------------
//
void CXcapDeletion::HandleDocDeletion()
    {
    #ifdef _DEBUG
        iOperationFactory.WriteToLog( _L8( "CXcapDeletion::HandleDocDeletion()" ) );  
    #endif
    TPtrC name = iTargetDoc.Name();
    TPtrC8 root = Transport().RootUri();
    RXcapCache* cache = iTargetDoc.Protocol().Cache();
    if( cache != NULL )
        {
        TInt error = cache->Delete( name, root );
        #ifdef _DEBUG
            iOperationFactory.WriteToLog( _L8( "  Document deleted from the cache" ) );  
        #endif
        }
    }

// ---------------------------------------------------------
// CXcapDeletion::HandlePartialDeletion
//
// ---------------------------------------------------------
//
void CXcapDeletion::HandlePartialDeletion()
    {
    #ifdef _DEBUG
        iOperationFactory.WriteToLog( _L8( "CXcapDeletion::HandlePartialDeletion()" ) );  
    #endif
    TPtrC name = iTargetDoc.Name();
    TPtrC8 root = Transport().RootUri();
    iTargetDoc.RemoveFromModelL( iDocumentSubset );
    TPtrC8 eTag = Descriptor( iRequestData->iETag );
    RXcapCache* cache = iTargetDoc.Protocol().Cache();
    if( cache != NULL )
        {
        HBufC8* newDoc = iXmlParser->FormatToXmlLC( ETrue, &iTargetDoc, iTargetDoc.DocumentRoot() );
        cache->Store( eTag, name, root, newDoc->Des() );
        CleanupStack::PopAndDestroy();  //newDoc
        }
    iTargetDoc.SetETag( eTag );
    }
      
// ---------------------------------------------------------
// CXcapDeletion::OperationFailedL
//
// ---------------------------------------------------------
//
void CXcapDeletion::OperationFailedL()
    {
    #ifdef _DEBUG
        iOperationFactory.WriteToLog( _L8( "CXcapDeletion::OperationFailedL() - Error: %d" ),
                                        iStatus.Int() );  
    #endif
    if( iStatus.Int() >= KErrNone )
        {
        TInt status = iActiveRequest->ResponseData()->iHttpStatus;
        TInt completion = iActiveRequest->ResponseData()->iCompletion;
        iResult = status < KErrNone || completion < KErrNone ? status : ReinterpretStatus( status );
        }
    else iResult = iStatus.Int();
    iCompleted = ETrue;
    }
    
// ---------------------------------------------------------
// CXcapDeletion::Result
//
// ---------------------------------------------------------
//
TBool CXcapDeletion::Result() const
    {
    return ETrue;
    }

// ---------------------------------------------------------
// CXcapDeletion::~CXcapDeletion
//
// ---------------------------------------------------------
//
CXcapDeletion::~CXcapDeletion()
    {
    #ifdef _DEBUG
        iOperationFactory.WriteToLog( _L8( "CXcapDeletion::~CXcapDeletion()" ) );  
    #endif
    }

//  End of File