PECengine/PresenceServer2/ServerSrc/CPEngOutGoingTransContainer.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/PresenceServer2/ServerSrc/CPEngOutGoingTransContainer.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,257 @@
+/*
+* Copyright (c) 2002 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:  Container of the one outgoing transaction handler
+*				  It process one handler until it is completed
+* 				  canceled or some error ocures.
+* 				  Its completion is signaled to the observer
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    <e32std.h>
+#include    "CPEngOutGoingTransContainer.h"
+#include    "MPEngOutgoingTransactionHandler.h"
+#include    "MPEngPureDataHandler.h"
+#include	"MPEngHandlerSendData.h"
+
+//	Debug prints
+#include	"PresenceDebugPrint.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPEngOutGoingTransContainer::CPEngOutGoingTransContainer
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CPEngOutGoingTransContainer::CPEngOutGoingTransContainer(
+    MPEngHandlerSendData& aRequestHandler,
+    MPEngPureDataHandler& aPureDataHandler,
+    RPointerArray<MPEngOutgoingTransactionHandler>&
+    aTransactionHandlersArray )
+        : CActive( CActive::EPriorityStandard ),
+        iPureDataHandler( aPureDataHandler ),
+        iRequestHandler( aRequestHandler ),
+        iNewTransactionHandlers( aTransactionHandlersArray )
+
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CPEngOutGoingTransContainer::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CPEngOutGoingTransContainer::ConstructL()
+    {
+    // add active object to the active scheduler
+    CActiveScheduler::Add( this );
+    }
+
+// -----------------------------------------------------------------------------
+// CPEngOutGoingTransContainer::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CPEngOutGoingTransContainer* CPEngOutGoingTransContainer::NewL(
+    MPEngHandlerSendData& aRequestHandler,
+    MPEngPureDataHandler& aPureDataHandler,
+    RPointerArray<MPEngOutgoingTransactionHandler>&
+    aTransactionHandlersArray )
+    {
+    CPEngOutGoingTransContainer* self = NewLC( aRequestHandler,
+                                               aPureDataHandler,
+                                               aTransactionHandlersArray );
+
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CPEngOutGoingTransContainer::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CPEngOutGoingTransContainer* CPEngOutGoingTransContainer::NewLC(
+    MPEngHandlerSendData& aRequestHandler,
+    MPEngPureDataHandler& aPureDataHandler,
+    RPointerArray<MPEngOutgoingTransactionHandler>&
+    aTransactionHandlersArray )
+    {
+    CPEngOutGoingTransContainer* self =
+        new( ELeave ) CPEngOutGoingTransContainer(
+        aRequestHandler,
+        aPureDataHandler,
+        aTransactionHandlersArray );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+// Destructor
+CPEngOutGoingTransContainer::~CPEngOutGoingTransContainer()
+    {
+    PENG_DP( D_PENG_LIT( "CPEngOutGoingTransContainer::~CPEngOutGoingTransContainer()" ) );
+    Cancel();
+    delete iTransactionHandler;
+    }
+
+// -----------------------------------------------------------------------------
+// -------- Function from the CActive ------------------------------------------
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// CPEngOutGoingTransContainer::StartTransaction
+// Start performing transaction
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPEngOutGoingTransContainer::StartTransactionL(
+    MPEngOutgoingTransactionHandler* aOutgoingTransaction )
+    {
+    PENG_DP( D_PENG_LIT( "CPEngOutGoingTransContainer::StartTransactionL()" ) );
+    TPtr8 outgoingBuffer( iPureDataHandler.TransferBufferL() );
+    aOutgoingTransaction->RequestL( outgoingBuffer );
+    iTransactionId = iPureDataHandler.SendDataL( iStatus );
+    SetActive();
+    // take ownership of transaction
+    iTransactionHandler = aOutgoingTransaction;
+    }
+
+// =============================================================================
+// ============== Function from the CActive ====================================
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// CPEngOutGoingTransContainer::RunL
+// Handles an active object’s request completion event.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPEngOutGoingTransContainer::RunL()
+    {
+    // what is necessary depends how request went
+    TInt errCode ( iStatus.Int() );
+    PENG_DP( D_PENG_LIT( "CPEngOutGoingTransContainer::RunL() - result:  %d" ),
+             errCode );
+
+    switch ( errCode )
+        {
+        case KErrNone:
+            {
+            HBufC8* response = iPureDataHandler.ResponseL( iTransactionId );
+            User::LeaveIfNull( response );
+            CleanupStack::PushL( response );
+            TBool last ( iRequestHandler.LastRunningTransaction() );
+            if ( last )
+                {
+                iTransactionHandler->LastRunningTransactionHandler();
+                }
+            // TO-DO do processing asynchronous
+            iTransactionHandler->ProcessResponseL( *response, iStatus );
+            CleanupStack::PopAndDestroy( response ); // response
+
+            iTransactionHandler->NewTransactionHandlersL(
+                iNewTransactionHandlers );
+            if ( iNewTransactionHandlers.Count() != 0 )
+                {
+                // new transaction handlers were created, inform RequestHandler
+                iRequestHandler.CreateNewContainersRunThemL();
+                }
+
+            if ( !iTransactionHandler->TransactionCompleted() )
+                {
+                // we are not done, just run another round
+                StartTransactionL( iTransactionHandler );
+                return;
+                }
+            break;
+            }
+
+        default:
+            {
+            // transfer error code
+            iTransactionHandler->ReleaseHandler();
+            }
+        }
+    // Get status and complete container, status ownership transfered
+    CPEngTransactionStatus* status =
+        iTransactionHandler->TransactionResult();
+    iRequestHandler.CompleteTransContainer( this, status, errCode );
+    PENG_DP( D_PENG_LIT( "CPEngOutGoingTransContainer::RunL() - End" ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CPEngOutGoingTransContainer::RunError
+// Handles a leave occurring in the request completion event handler RunL()
+// implementation should return KErrNone, if it handles the leave
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CPEngOutGoingTransContainer::RunError(
+    TInt aError )
+    {
+    // release handler and complete container
+    iTransactionHandler->ReleaseHandler();
+    // Get status and complete container, status ownership transfered
+    CPEngTransactionStatus* status =
+        iTransactionHandler->TransactionResult();
+    iRequestHandler.CompleteTransContainer( this, status, aError );
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CPEngOutGoingTransContainer::DoCancel
+// Implements cancellation of an outstanding request.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPEngOutGoingTransContainer::DoCancel()
+    {
+    PENG_DP( D_PENG_LIT( "CPEngOutGoingTransContainer::DoCancel()" ) );
+    // request was canceled, cancel log in, update state and complete RMessage
+    iPureDataHandler.CancelSending( iTransactionId );
+    iTransactionHandler->ReleaseHandler();
+    // Container is not removed here
+    }
+
+//  End of File
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+