xdmprotocols/XcapProtocol/XcapOperations/src/XcapInsertion.cpp
branchRCL_3
changeset 35 fbd2e7cec7ef
parent 0 c8caa15ef882
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xdmprotocols/XcapProtocol/XcapOperations/src/XcapInsertion.cpp	Wed Sep 01 12:23:14 2010 +0100
@@ -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  
+