--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/PresenceServer2/ServerSrc/CPEngHandlerSendData.cpp Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,320 @@
+/*
+* 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: Request Handler to update data to the network server
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CPEngHandlerSendData.h"
+#include <e32std.h>
+
+#include "MPEngRequestHandlerObserver.h"
+#include "CPEngOutGoingTransContainer.h"
+#include "MPEngOutgoingTransactionHandler.h"
+#include "MPEngSubSession.h"
+#include "PEngWVPresenceErrors2.h"
+#include "CPEngTransactionStatus.h"
+
+// Debug prints
+#include "PresenceDebugPrint.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPEngHandlerSendData::CPEngHandlerSendData
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CPEngHandlerSendData::CPEngHandlerSendData(
+ MPEngRequestHandlerObserver& aRequestHandlerObserver,
+ MPEngPureDataHandler& aPureDataHandler,
+ MPEngSubSession& aServSubSession,
+ const RPEngMessage& aMessage,
+ TInt32 aSessionId,
+ TInt32 aSubSessionId )
+ : iRequestHandlerObserver( aRequestHandlerObserver ),
+ iPureDataHandler( aPureDataHandler ),
+ iServSubSession( aServSubSession ),
+ iSessionId( aSessionId ),
+ iSubSessionId( aSubSessionId ),
+ iFunction( aMessage.Function() )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CPEngHandlerSendData::ConstructHandlerFromTransactionHandlersL
+// Symbian 2nd phase constructor can leave.
+// Construct Send Data handler from the passed array of the outgoing Transaction handlers
+// -----------------------------------------------------------------------------
+//
+void CPEngHandlerSendData::ConstructL(
+ RPointerArray<MPEngOutgoingTransactionHandler>& aTransactions )
+ {
+ // copy handlers from the given array, but just their pointers, it takes ownership
+ for ( TInt x( aTransactions.Count() - 1 ) ; x >= 0 ; x-- )
+ {
+ User::LeaveIfError( iOutgoingTransactionHandlers.Append( aTransactions[ x ] ) );
+ aTransactions.Remove( x );
+ }
+ iTransactionStatus = CPEngTransactionStatus::NewL();
+ }
+
+// -----------------------------------------------------------------------------
+// CPEngHandlerSendData::NewHandlerFromTransactionHandlersLC
+// Two-phased constructor. which creates Send Data handler from the passed array of the
+// Transaction handlers, no reading of the storage IDs from the client side is needed then
+// are readed from the client RPEngMessage
+// -----------------------------------------------------------------------------
+//
+CPEngHandlerSendData* CPEngHandlerSendData::NewLC(
+ MPEngRequestHandlerObserver& aRequestHandlerObserver,
+ MPEngPureDataHandler& aPureDataHandler,
+ MPEngSubSession& aServSubSession,
+ const RPEngMessage& aMessage,
+ RPointerArray<MPEngOutgoingTransactionHandler>& aTransactions,
+ TInt32 aSessionId,
+ TInt32 aSubSessionId )
+ {
+ CPEngHandlerSendData* self = new( ELeave ) CPEngHandlerSendData(
+ aRequestHandlerObserver,
+ aPureDataHandler,
+ aServSubSession,
+ aMessage,
+ aSessionId,
+ aSubSessionId );
+
+ CleanupStack::PushL( self );
+ self->ConstructL( aTransactions );
+
+ return self;
+ }
+
+// Destructor
+CPEngHandlerSendData::~CPEngHandlerSendData()
+ {
+ PENG_DP( D_PENG_LIT( "CPEngHandlerSendData::~CPEngHandlerSendData" ) );
+ // cancel and delete all transaction containers
+ iTrasactionContainersArray.ResetAndDestroy();
+ iOutgoingTransactionHandlers.ResetAndDestroy();
+ delete iTransactionStatus;
+
+ // complete message with KErrCancel, just in case it was not completed yet
+ iMessage.Complete( KErrCancel );
+ // remove handler from the CSP Session manager
+ iRequestHandlerObserver.CompleteRequestHandler( this );
+ PENG_DP( D_PENG_LIT( "CPEngHandlerSendData::~CPEngHandlerSendData - End" ) );
+ }
+
+
+/////////////////////////////////////////////////////////////////////////////////
+// =============== New Functions of the MPEngRequestHandler class ==============
+/////////////////////////////////////////////////////////////////////////////////
+
+// -----------------------------------------------------------------------------
+// CPEngHandlerSendData::StartHandlerL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPEngHandlerSendData::StartHandlerL( )
+ {
+ PENG_DP( D_PENG_LIT( "CPEngHandlerSendData::StartHandlerL" ) );
+ // create containers and run them
+ CreateNewContainersRunThemL();
+ }
+
+// -----------------------------------------------------------------------------
+// CPEngHandlerSendData::SessionId
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt32 CPEngHandlerSendData::SessionId( ) const
+ {
+ return iSessionId;
+ }
+
+// -----------------------------------------------------------------------------
+// CPEngHandlerSendData::SubSessionId
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CPEngHandlerSendData::SubSessionId( ) const
+ {
+ return iSubSessionId;
+ }
+
+// -----------------------------------------------------------------------------
+// CPEngHandlerSendData::RequestFunction
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CPEngHandlerSendData::RequestFunction( ) const
+ {
+ return iFunction;
+ }
+
+// -----------------------------------------------------------------------------
+// CPEngHandlerSendData::CancelRequest
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPEngHandlerSendData::CancelRequestD( )
+ {
+ PENG_DP( D_PENG_LIT( "CPEngHandlerSendData::CancelRequest" ) );
+ // delete containers and complete message
+ iTrasactionContainersArray.ResetAndDestroy();
+ iMessage.Complete( KErrCancel );
+ // now we are done and handler can be deleted
+ delete this;
+ }
+
+// -----------------------------------------------------------------------------
+// CPEngHandlerSendData::SetMessage
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPEngHandlerSendData::SetMessage(
+ const RPEngMessage& aMessage )
+ {
+ iMessage = aMessage;
+ }
+
+
+/////////////////////////////////////////////////////////////////////////////////
+// =============== New Functions of the MPEngHandlerSendData class =============
+/////////////////////////////////////////////////////////////////////////////////
+
+// -----------------------------------------------------------------------------
+// CPEngHandlerSendData::CompleteRequestD
+// Complete request handlers, store request result and delete itself
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPEngHandlerSendData::CompleteRequestD()
+ {
+ PENG_DP( D_PENG_LIT( "CPEngHandlerSendData::CompleteRequestL" ) );
+ // get transaction result and store it in SubSession
+ HBufC8* volatile reqResult = NULL;
+ TRAPD( e, reqResult = iTransactionStatus->PackResultsL() );
+ // if error complete with error
+ if ( e != KErrNone )
+ {
+ iMessage.Complete( e );
+ delete this;
+ return;
+ }
+ iServSubSession.StoreRequestResponse( reqResult );
+ // complete RPEngMessage and delete itself
+ iMessage.Complete( reqResult->Length() );
+ delete this;
+ }
+
+// -----------------------------------------------------------------------------
+// CPEngHandlerSendData::CreateContainersAndRunThemL
+// go through all transaction handlers in iOutgoingTransactionHandlers
+// array, create for each of then container with given Transaction handler
+// and start it
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPEngHandlerSendData::CreateNewContainersRunThemL()
+ {
+ PENG_DP( D_PENG_LIT( "CPEngHandlerSendData::CreateNewContainersRunThemL" ) );
+
+ // we have to go through array from the end, created
+ // transaction containers are taking owner ship of the transaction
+ // handler from the array, so they have to be removed from there
+ for ( TInt i( iOutgoingTransactionHandlers.Count() - 1 ) ; i >= 0 ; i-- )
+ {
+ CPEngOutGoingTransContainer* newContainer = CPEngOutGoingTransContainer::NewLC(
+ *this,
+ iPureDataHandler,
+ iOutgoingTransactionHandlers );
+ newContainer->StartTransactionL( iOutgoingTransactionHandlers[ i ] );
+ iOutgoingTransactionHandlers.Remove( i );
+ // remove trans. handler from the array since its ownership was
+ // taken by transaction container
+ iTrasactionContainersArray.AppendL( newContainer );
+ CleanupStack::Pop( newContainer ); // newContainer
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CPEngHandlerSendData::CompleteTransContainer
+// Remove transaction container from the array of containers
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CPEngHandlerSendData::CompleteTransContainer(
+ CPEngOutGoingTransContainer* aTransContainer,
+ CPEngTransactionStatus* aTransactionStatus,
+ TInt aErrCode )
+ {
+ PENG_DP( D_PENG_LIT( "CPEngHandlerSendData::CompleteTransContainer" ) );
+
+ // inport transaction status
+ iTransactionStatus->ImportStatusFrom( *aTransactionStatus );
+
+ // find transaction and remove it from the list
+ TInt index ( iTrasactionContainersArray.Find( aTransContainer ) );
+ if ( index != KErrNotFound )
+ {
+ if ( KErrCancel != aErrCode && aErrCode != KPEngNwErrForcedLogout )
+ {
+ //Skip the deletion if aErrCode is KErrCancel
+ delete iTrasactionContainersArray[ index ];
+ }
+ iTrasactionContainersArray.Remove( index );
+ }
+ else
+ {
+ // if container was not found in array, complete it anyway,
+ // however, it should not happen
+ delete aTransContainer;
+ }
+
+ // end if there was some Symbian error
+ if ( aErrCode != KErrNone )
+ {
+ // cancel all active transaction
+ iTrasactionContainersArray.ResetAndDestroy();
+ iMessage.Complete( aErrCode );
+ delete this;
+ }
+ else if ( iTrasactionContainersArray.Count() == 0 )
+ {
+ // we can safely call complete, even this function was
+ // most likely called from the destructor of the
+ // Transaction Container, it was already removed from the array
+ CompleteRequestD();
+ }
+ PENG_DP( D_PENG_LIT( "CPEngHandlerSendData::CompleteTransContainer - End" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CPEngHandlerSendData::LastRunningTransaction
+// Check how many running transactions is still there,
+// and if calling one is last, return ETrue
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CPEngHandlerSendData::LastRunningTransaction( )
+ {
+ return ( 1 == iTrasactionContainersArray.Count() );
+ }
+
+// End of File