--- /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 <XdmErrors.h>
+#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
+