diff -r 000000000000 -r 094583676ce7 PECengine/PresenceServer2/ServerSrc/CPEngHandlerSendData.cpp --- /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 + +#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& 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& 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