--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/TransferAdapter2/Src/CPEngPureDataHandler.cpp Wed Sep 01 12:31:13 2010 +0100
@@ -0,0 +1,477 @@
+/*
+* Copyright (c) 2004 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: Access handler of the network session
+*
+*/
+
+// INCLUDE FILES
+#include "CPEngPureDataHandler.h"
+
+#include "PEngTransAdapterPanics.h"
+#include "CPEngSendDataOperation.h"
+#include "MPEngSessionManager.h"
+#include "MPEngAccessHandler.h"
+
+// Packet logger
+#include "PEngPacketLogger.h"
+
+
+// CONSTANTS
+const TInt KOpIdInitvalue = 1000;
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPEngPureDataHandler::CPEngPureDataHandler
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CPEngPureDataHandler::CPEngPureDataHandler(
+ MPEngSessionManager& aSessManager,
+ MPEngAccessHandler& aAccessHandler,
+ const CPEngSessionSlotId& aSessionId,
+ RImpsEng& aSessClient )
+ : iCount( 1 ), // init to 1
+ iSessionManager( aSessManager ),
+ iAccessHandler( aAccessHandler ),
+ iSessionId( aSessionId ),
+ iSessClient( aSessClient ),
+ iOpidIterator( KOpIdInitvalue )
+ {
+ PENG_DP( D_PENG_LIT( "CPEngPureDataHandler::CPEngPureDataHandler" ) );
+ iAccessHandler.Open(); // CSI: 65 #
+ iSessionManager.OpenRef();
+ }
+
+// -----------------------------------------------------------------------------
+// CPEngPureDataHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CPEngPureDataHandler::ConstructL(
+ RImpsEng& aSessClient )
+ {
+ iPureClient.RegisterL( aSessClient, // main client
+ this, // Observer
+ EImpsServicePresence, // Type of service
+ ETrue, // Incoming data interest
+ ETrue ); // Any content type
+ iPureClient.RegisterErrorObserverL( *this );
+ TInt bufferSize ( iPureClient.MaxTransactionContentLengthL() );
+
+ // if size is zero, leave cause WV Engine is not ready
+ if ( bufferSize == 0 )
+ {
+ User::Leave( KErrNotReady );
+ }
+ iTrasferBuffer = HBufC8::NewL( bufferSize );
+#ifdef PENG_ENABLE_DEBUG_PRINT
+ // init logs connection Id
+ iConnectionLogsId = PEngPacketLogger::GetConnectionId();
+#endif
+ }
+
+// -----------------------------------------------------------------------------
+// CPEngPureDataHandler::NewLC()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CPEngPureDataHandler* CPEngPureDataHandler::NewL(
+ RImpsEng& aSessClient,
+ MPEngSessionManager& aSessManager,
+ MPEngAccessHandler& aAccessHandler,
+ const CPEngSessionSlotId& aSessionId )
+ {
+ CPEngPureDataHandler* self = new ( ELeave ) CPEngPureDataHandler(
+ aSessManager,
+ aAccessHandler,
+ aSessionId,
+ aSessClient );
+ CleanupClosePushL( *self );
+ self->ConstructL( aSessClient );
+ CleanupStack::Pop();
+ return self;
+ }
+
+
+// Destructor
+CPEngPureDataHandler::~CPEngPureDataHandler()
+ {
+ PENG_DP( D_PENG_LIT( "CPEngPureDataHandler::~CPEngPureDataHandler" ) );
+
+ delete iTrasferBuffer;
+ iIncomingData.ResetAndDestroy();
+
+ if ( iIncReqStatus )
+ {
+ User::RequestComplete( iIncReqStatus, KErrCancel );
+ }
+ iPureClient.Unregister();
+ iSessionManager.ClosePureDataHandler();
+ // destroy arrays, operations are canceled
+ iOperations.ResetAndDestroy();
+ iAccessHandler.UnregisterSessionObserver( *this );
+ iAccessHandler.Close();
+ }
+
+
+// =============================================================================
+// =============== New Functions of the MPEngPureDataHandler ===================
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// CPEngPureDataHandler::Close()
+// -----------------------------------------------------------------------------
+//
+void CPEngPureDataHandler::Close()
+ {
+ iCount--;
+ if ( iCount == 0 )
+ {
+ delete this;
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CPEngPureDataHandler::TransferBufferL()
+// -----------------------------------------------------------------------------
+//
+TPtr8 CPEngPureDataHandler::TransferBufferL()
+ {
+ TPtr8 buf = iTrasferBuffer->Des();
+ buf.Zero();
+ return buf;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CPEngPureDataHandler::SendDataL()
+// -----------------------------------------------------------------------------
+//
+TInt CPEngPureDataHandler::SendDataL(
+ TRequestStatus& aStatus )
+ {
+ PENG_DP( D_PENG_LIT( "CPEngPureDataHandler::SendDataL:" ) );
+
+ if ( iTrasferBuffer->Length() == 0 )
+ {
+ // buffer is empty, nothing to send, leave
+ User::Leave( KErrArgument );
+ }
+ // allocate slot in array by adding NULL pointer and removing it
+ iOperations.AppendL( NULL );
+ iOperations.Remove( iOperations.Count() - 1 );
+ CPEngSendDataOperation* operation =
+ CPEngSendDataOperation::NewLC();
+
+ TInt opId( iPureClient.SendPureDataL( *iTrasferBuffer ) );
+ operation->SetIds( opId, iOpidIterator++ );
+
+#ifdef PENG_ENABLE_DEBUG_PRINT
+ iConnectionLogsId = PEngPacketLogger::WriteOutPacket(
+ *iTrasferBuffer,
+ operation->LogId(),
+ opId,
+ iConnectionLogsId,
+ iSessionId.UserId(),
+ iSessionId.ServiceAddress() );
+#endif
+
+ iOperations.Append( operation );
+ CleanupStack::Pop(); // operation
+ // now it is safe to set request status
+ operation->SetRequestStatus( aStatus );
+ aStatus = KRequestPending;
+ return opId;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CPEngPureDataHandler::ResponseLC()
+// -----------------------------------------------------------------------------
+//
+HBufC8* CPEngPureDataHandler::ResponseL(
+ TInt aTransId )
+ {
+ PENG_DP( D_PENG_LIT( "CPEngPureDataHandler::ResponseL - id: %d" ), aTransId );
+ // is it incoming data request
+ if ( aTransId == 0 )
+ {
+ if ( iIncomingData.Count() == 0 )
+ {
+ User::Leave( KErrNotFound );
+ }
+ // take first one from the array
+ HBufC8* buff = iIncomingData[ 0 ];
+ iIncomingData.Remove( 0 );
+ return buff;
+ }
+ // try to find operation
+ TInt x( FindOperationL( aTransId, CPEngSendDataOperation::OperationId ) );
+ // is operation completed?
+ TRequestStatus* status = iOperations[ x ]->Status();
+ if ( status && ( *status == KRequestPending ) )
+ {
+ User::Leave( KErrNotReady );
+ }
+
+ // send buffer and remove operation
+ HBufC8* buff = iOperations[ x ]->Response();
+ delete iOperations[ x ];
+ iOperations.Remove( x );
+ return buff;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CPEngPureDataHandler::CancelSending()
+// -----------------------------------------------------------------------------
+//
+void CPEngPureDataHandler::CancelSending(
+ TInt aTransId )
+ {
+ PENG_DP( D_PENG_LIT( "CPEngPureDataHandler::CancelSending - id: %d" ),
+ aTransId );
+
+ // try to find operation
+ TInt x( FindOperation( aTransId, CPEngSendDataOperation::OperationId ) );
+ if ( x == KErrNotFound )
+ {
+ // nothing to cancel
+ return;
+ }
+ TRequestStatus* status = iOperations[ x ]->Status();
+ if ( status && ( *status == KRequestPending ) )
+ {
+ // operation pending, cancel it
+ iPureClient.CancelTransaction( aTransId );
+ iOperations[ x ]->CompletedOperation( KErrCancel );
+ }
+ delete iOperations[ x ];
+ iOperations.Remove( x );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CPEngPureDataHandler::ListenIncomingData()
+// -----------------------------------------------------------------------------
+//
+TInt CPEngPureDataHandler::ListenIncomingData(
+ TRequestStatus& aStatus )
+ {
+ PENG_DP( D_PENG_LIT( "CPEngPureDataHandler::ListenIncomingData" ) );
+
+ __ASSERT_DEBUG( !iIncReqStatus,
+ User::Panic( KPEngTransferAdapterPanic,
+ EListenerAlreadyActive )
+ );
+ iIncReqStatus = &aStatus;
+ aStatus = KRequestPending;
+ return iIncomingData.Count();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CPEngPureDataHandler::CancelListening()
+// -----------------------------------------------------------------------------
+//
+void CPEngPureDataHandler::CancelListening()
+ {
+ PENG_DP( D_PENG_LIT( "CPEngPureDataHandler::CancelListening" ) );
+
+ if ( iIncReqStatus )
+ {
+ User::RequestComplete( iIncReqStatus, KErrCancel );
+ iIncReqStatus = NULL;
+ }
+ }
+
+
+// =============================================================================
+// =============== New Functions of the MImpsPureHandler =======================
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// CPEngPureDataHandler::HandlePureDataL()
+// -----------------------------------------------------------------------------
+//
+void CPEngPureDataHandler::HandlePureDataL(
+ TInt aOpId,
+ const TDesC8& aBuffer,
+ TImpsCspIdentifier& /* aCspId*/ )
+ {
+ PENG_DP( D_PENG_LIT( "CPEngPureDataHandler::HandlePureDataL - id: %d" ),
+ aOpId );
+
+ // is it incoming data handler
+ if ( aOpId == 0 )
+ {
+#ifdef PENG_ENABLE_DEBUG_PRINT
+ iConnectionLogsId = PEngPacketLogger::WriteNotifyPacket(
+ aBuffer,
+ iLastServerOpId,
+ iConnectionLogsId,
+ iSessionId.UserId(),
+ iSessionId.ServiceAddress() );
+#endif
+
+ HBufC8* buff = aBuffer.AllocLC();
+ iIncomingData.AppendL( buff );
+ CleanupStack::Pop(); // buff
+ if ( iIncReqStatus )
+ {
+ User::RequestComplete( iIncReqStatus, KErrNone );
+ iIncReqStatus = NULL;
+ }
+ return;
+ }
+
+ // get buffer and store it in the correct Operation if it is our operation
+ TInt x( FindOperationL( aOpId, CPEngSendDataOperation::OperationId ) );
+ if ( x != KErrNotFound )
+ {
+#ifdef PENG_ENABLE_DEBUG_PRINT
+ iConnectionLogsId = PEngPacketLogger::WriteInPacket(
+ aBuffer,
+ iOperations[ x ]->LogId(),
+ aOpId,
+ iConnectionLogsId,
+ iSessionId.UserId(),
+ iSessionId.ServiceAddress() );
+
+ iLastServerOpId = iOperations[ x ]->LogId();
+#endif
+ iOperations[ x ]->SetResponse( aBuffer.AllocL() );
+ iOperations[ x ]->CompletedOperation( KErrNone );
+ }
+ }
+
+
+// =============================================================================
+// =============== New Functions of the MImpsErrorHandler ======================
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// CPEngPureDataHandler::HandleErrorL()
+// -----------------------------------------------------------------------------
+//
+void CPEngPureDataHandler::HandleErrorL(
+ TInt aStatus,
+ TInt aOpId,
+ const TDesC* /*aDescription*/,
+ const CImpsDetailed* /* aDetailedRes*/,
+ TImpsCspIdentifier& /*aCspId*/ )
+ {
+ PENG_DP( D_PENG_LIT( "CPEngPureDataHandler::HandleErrorL - id: %d, %d" ),
+ aStatus,
+ aOpId );
+
+ // get buffer and store it in the correct Operation
+ TInt x( FindOperationL( aOpId, CPEngSendDataOperation::OperationId ) );
+#ifdef PENG_ENABLE_DEBUG_PRINT
+ iConnectionLogsId = PEngPacketLogger::WriteError(
+ aStatus,
+ iOperations[ x ]->LogId(),
+ aOpId,
+ iConnectionLogsId,
+ iSessionId.UserId(),
+ iSessionId.ServiceAddress() );
+
+#endif
+ iOperations[ x ]->CompletedOperation( aStatus );
+ }
+
+
+// =============================================================================
+// ============== New Functions of the MPEngSessionStatusObserver ==============
+// =============================================================================
+
+
+// -----------------------------------------------------------------------------
+// CPEngPureDataHandler::HandleErrorL()
+// -----------------------------------------------------------------------------
+//
+void CPEngPureDataHandler::StatusChangedL(
+ TPEngNWSessionSlotState aNewState,
+ TPEngNWSessionSlotEvent /*aNewEvent*/ )
+ {
+ if ( aNewState == EPEngNWPresenceSessionClosed )
+ {
+ // cancel all operations
+ iOperations.ResetAndDestroy();
+ }
+ }
+
+
+// =============================================================================
+// =============== New Functions of main class =================================
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// CPEngPureDataHandler::Open()
+// -----------------------------------------------------------------------------
+//
+void CPEngPureDataHandler::Open()
+ {
+ iCount++;
+ }
+
+
+// =============================================================================
+// =============== New private Functions of the base class =====================
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// CPEngPureDataHandler::FindOperation()
+// Find operation in array
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CPEngPureDataHandler::FindOperation(
+ TInt aOpId,
+ TInt ( CPEngSendDataOperation:: *aIdFunc )() const ) const
+ {
+ TInt count ( iOperations.Count() );
+ for ( TInt x( 0 ) ; x < count ; ++x )
+ {
+ if ( aOpId == ( ( *iOperations[ x ] ).*aIdFunc )() )
+ {
+ return x;
+ }
+ }
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CPEngPureDataHandler::FindOperationL()
+// Find operation in array, leave if not found
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CPEngPureDataHandler::FindOperationL(
+ TInt aOpId,
+ TInt ( CPEngSendDataOperation:: *aIdFunc )() const ) const
+ {
+ TInt x ( FindOperation( aOpId, aIdFunc ) );
+ if ( x == KErrNotFound )
+ {
+ User::Leave( KErrNotFound );
+ }
+ return x;
+ }
+// End of File
+
+