diff -r 000000000000 -r c8caa15ef882 xdmprotocols/XcapProtocol/XcapOperations/src/XcapInsertion.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/src/XcapInsertion.cpp Tue Feb 02 01:05:17 2010 +0200 @@ -0,0 +1,216 @@ +/* +* 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: CXcapInsertion +* +*/ + + + + +// INCLUDES +//This is only for logging +#include +#include "XcapProtocol.h" +#include "XcapDocument.h" +#include "XcapUriParser.h" +#include "XcapInsertion.h" +#include "XdmXmlParser.h" +#include "XcapHttpReqPut.h" +#include "XdmNodeAttribute.h" +#include "XcapHttpTransport.h" +#include "XcapEngineDefines.h" +#include "XcapOperationFactory.h" + + +// --------------------------------------------------------- +// C++ constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CXcapInsertion::CXcapInsertion( CXcapDocument& aParentDoc, + CXcapDocumentNode* aDocumentSubset, + CXcapOperationFactory& aOperationFactory ) : + CXcapHttpOperation( aParentDoc, aDocumentSubset, aOperationFactory ), + iOperationType( EXdmPartialDocument ) + + { + } + +// --------------------------------------------------------- +// Two-phased constructor. +// +// --------------------------------------------------------- +// +CXcapInsertion* CXcapInsertion::NewL( CXcapDocument& aParentDoc, + CXcapDocumentNode* aDocumentSubset, + CXcapOperationFactory& aOperationFactory ) + { + CXcapInsertion* self = new ( ELeave ) CXcapInsertion( aParentDoc, aDocumentSubset, aOperationFactory ); + CleanupStack::PushL( self ); + self->BaseConstructL(); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CXcapInsertion::ConstructL +// +// --------------------------------------------------------- +// +void CXcapInsertion::ConstructL() + { + CXcapHttpReqPut* request = Transport().PutL( iTargetDoc.Name() ); + CleanupStack::PushL( request ); + User::LeaveIfError( iRequestQueue.Append( request ) ); + request->SetExpiryTimeL( NULL, KDefaultHttpRequestTimeout * 1000000 ); + CleanupStack::Pop(); //request + iUriParser->SetDocumentSubset( iDocumentSubset ); + } + +// --------------------------------------------------------- +// CXcapAddition::FormatModRequestL +// +// --------------------------------------------------------- +// +TInt CXcapInsertion::FormatModRequestL( const CXdmDocumentNode* aDocumentNode ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapInsertion::FormatModRequestL()" ) ); + iOperationFactory.WriteToLog( _L8( " Operation type: %d" ), iOperationType ); + iOperationFactory.WriteToLog( _L8( " Document subset: %x" ), iDocumentSubset ); + #endif + return CXcapHttpOperation::FormatModRequestL( aDocumentNode ); + } + +// --------------------------------------------------------- +// CXcapInsertion::ExecuteL +// +// --------------------------------------------------------- +// +void CXcapInsertion::ExecuteL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapInsertion::ExecuteL()" ) ); + #endif + CXcapHttpOperation::ExecuteL( iActiveRequest, iDocumentSubset ); + iActiveRequest->SetHeaderL( KHttpHeaderIfMatch, _L8( "*" ) ); + } + +// --------------------------------------------------------- +// CXcapInsertion::OperationCompleteL +// +// --------------------------------------------------------- +// +void CXcapInsertion::OperationCompleteL() + { + + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapInsertion::OperationCompleteL()" ) ); + #endif + TPtrC8 root = Transport().RootUri(); + iRequestData = iActiveRequest->ResponseData(); + TPtrC name = iTargetDoc.Name(); + TPtrC8 eTag = Descriptor( iRequestData->iETag ); + switch( iRequestData->iHttpStatus ) + { + case 201: //"Created" -> Put operation was succesful + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Status 201 - Created" ) ); + #endif + iResult = KErrNone; + iTargetDoc.SetETag( eTag ); + CXcapHttpContSupplier* request = ( CXcapHttpContSupplier* )iActiveRequest; + RXcapCache* cache = iTargetDoc.Protocol().Cache(); + if( cache != NULL && iOperationType == EXdmDocument ) + { + TPtrC8 payload = request->RequestBody(); + cache->Store( eTag, name, root, payload ); + } + iCompleted = ETrue; + } + break; + case 412: //"Precondition failed" -> Cache out of date + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Status 412 - Precondition failed" ) ); + #endif + iResult = KXcapErrorHttpPrecondFailed; + //RXcapCache* cache = CXcapProtocol::Cache(); + //if( cache != NULL && iOperationType == EXcapDocument ) + // cache->Delete( name, root ); + iCompleted = ETrue; + iActiveRequest->ResetUriL( _L( "" ) ); + iActiveRequest->ReleaseResponseData(); + iRequestData->iCompletion = KInsertConflict; + } + break; + default: + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Default case - Status: %d" ), + iRequestData->iHttpStatus ); + #endif + TInt status = iRequestData->iHttpStatus; + iResult = ReinterpretStatus( status ); + iCompleted = ETrue; + break; + } + } + +// --------------------------------------------------------- +// Symbian OS default constructor may leave. +// +// --------------------------------------------------------- +// +void CXcapInsertion::OperationFailedL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapInsertion::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; + } + +// --------------------------------------------------------- +// Symbian OS default constructor may leave. +// +// --------------------------------------------------------- +// +TBool CXcapInsertion::Result() const + { + return ETrue; + } + +// --------------------------------------------------------- +// Destructor +// +// --------------------------------------------------------- +// +CXcapInsertion::~CXcapInsertion() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapInsertion::~CXcapInsertion()" ) ); + #endif + } + +// End of File +