diff -r 000000000000 -r a2952bb97e68 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crequestprocessor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crequestprocessor.cpp Thu Dec 17 08:55:47 2009 +0200 @@ -0,0 +1,460 @@ +/* +* Copyright (c) 2009 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: +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "crequestprocessor.h" +#include "crequestchecker.h" +#include "mmmtpdplogger.h" + +static const TInt KNullBufferSize = 4096; + +// ----------------------------------------------------------------------------- +// CRequestProcessor::CRequestProcessor +// Standard c++ constructor +// ----------------------------------------------------------------------------- +// +EXPORT_C CRequestProcessor::CRequestProcessor( MMTPDataProviderFramework& aFramework, + MMTPConnection& aConnection, + TInt aElementCount, + const TMTPRequestElementInfo* aElements ): + CActive( EPriorityStandard ), + iFramework( aFramework ), + iConnection( aConnection ), + iElementCount( aElementCount ), + iElements( aElements ) + { + // CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::~CRequestProcessor +// Destructor +// ----------------------------------------------------------------------------- +// +EXPORT_C CRequestProcessor::~CRequestProcessor() + { +// Cancel(); + iNullBuffer.Close(); + delete iRequestChecker; + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::Release +// Relese (delete) this request processor +// ----------------------------------------------------------------------------- +// +EXPORT_C void CRequestProcessor::Release() + { + delete this; + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::SendResponseL +// Send a response to the initiator +// ----------------------------------------------------------------------------- +// +EXPORT_C void CRequestProcessor::SendResponseL( TMTPResponseCode aResponseCode, + TInt aParameterCount, + TUint32* aParams ) + { + PRINT2( _L( "MM MTP <> CRequestProcessor::SendResponseL iTransactionCode = %d, aResponseCode = 0x%x" ), + iTransactionCode, + aResponseCode ); + __ASSERT_DEBUG( aParameterCount < TMTPTypeRequest::ENumElements, User::Invariant() ); + + iResponse.SetUint16( TMTPTypeResponse::EResponseCode, aResponseCode ); + iResponse.SetUint32( TMTPTypeResponse::EResponseSessionID, iSessionId ); + iResponse.SetUint32( TMTPTypeResponse::EResponseTransactionID, iTransactionCode ); + + TInt i = 0; + for( i = 0; i < aParameterCount; i++ ) + { + iResponse.SetUint32( TMTPTypeResponse::EResponseParameter1 + i, aParams[i] ); + } + + i += TMTPTypeResponse::EResponseParameter1; + while( i < TMTPTypeResponse::EResponseParameter5 ) + { + iResponse.SetUint32( i, 0 ); + i++; + } + + __ASSERT_DEBUG( iRequest, User::Invariant() ); + iFramework.SendResponseL( iResponse, *iRequest, iConnection ); + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::Request +// The current active request +// ----------------------------------------------------------------------------- +// +EXPORT_C const TMTPTypeRequest& CRequestProcessor::Request() const + { + __ASSERT_DEBUG( iRequest, User::Invariant() ); + return *iRequest; + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::Connection +// The connection from which the current request comes +// ----------------------------------------------------------------------------- +// +EXPORT_C MMTPConnection& CRequestProcessor::Connection() const + { + return iConnection; + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::UsbDisconnect +// Rollback when WMP closed and disconnect the USB cable, +// during the transferring file +// ----------------------------------------------------------------------------- +// +EXPORT_C void CRequestProcessor::UsbDisconnect() + { + // TODO: reset the CenRep value + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::CompleteRequestL +// Signal to the framework that the current request transaction has completed +// ----------------------------------------------------------------------------- +// +void CRequestProcessor::CompleteRequestL() + { + __ASSERT_DEBUG( iRequest, User::Invariant() ); + iFramework.TransactionCompleteL( *iRequest, iConnection ); + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::SendDataL +// Send data to the initiator +// ----------------------------------------------------------------------------- +// +EXPORT_C void CRequestProcessor::SendDataL( const MMTPType& aData ) + { + __ASSERT_DEBUG( iRequest, User::Invariant() ); + iFramework.SendDataL( aData, *iRequest, iConnection ); + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::ReceiveDataL +// Receive data from the initiator +// ----------------------------------------------------------------------------- +// +EXPORT_C void CRequestProcessor::ReceiveDataL( MMTPType& aData ) + { + __ASSERT_DEBUG( iRequest, User::Invariant() ); + iFramework.ReceiveDataL( aData, *iRequest, iConnection ); + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::HandleRequestL +// Handle the request +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CRequestProcessor::HandleRequestL( const TMTPTypeRequest& aRequest, + TMTPTransactionPhase aPhase ) + { + iRequest = &aRequest; + __ASSERT_DEBUG( iRequest, User::Invariant() ); + TBool result = EFalse; + switch( aPhase ) + { + case ERequestPhase: + ExtractSessionTransactionId(); + result = DoHandleRequestPhaseL(); + break; + + case EDataIToRPhase: + result = DoHandleDataIToRPhaseL(); + break; + + case EDataRToIPhase: + result = DoHandleRToIPhaseL(); + break; + + case EResponsePhase: + if ( iResponseCode != EMTPRespCodeOK && HasDataphase() ) + { + SendResponseL( iResponseCode ); + iNullBuffer.Close(); + PRINT1( _L( "MM MTP <> CRequestProcessor::HandleRequestL SendResponse 0x%x" ), iResponseCode ); + } + else + { + result = DoHandleResponsePhaseL(); + } + break; + + case ECompletingPhase: + result = DoHandleCompletingPhaseL(); + break; + + default: + PRINT( _L( "MM MTP <> CRequestProcessor::HandleRequestL default" ) ); + break; + } + + return result; + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::HandleEventL +// Handle the event +// ----------------------------------------------------------------------------- +// +EXPORT_C void CRequestProcessor::HandleEventL( const TMTPTypeEvent& aEvent ) + { + TUint16 eventCode = aEvent.Uint16( TMTPTypeEvent::EEventCode ); + iCancelled = ( eventCode == EMTPEventCodeCancelTransaction ); + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::Match +// Check whether the processor can process the request +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CRequestProcessor::Match( const TMTPTypeRequest& aRequest, + MMTPConnection& aConnection ) const + { + __ASSERT_DEBUG( iRequest, User::Invariant() ); + TBool result = ( ( &aRequest == iRequest ) && ( &iConnection == &aConnection ) ); + return result; + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::Match +// Check whether the processor can process the event +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CRequestProcessor::Match( const TMTPTypeEvent& aEvent, + MMTPConnection& aConnection ) const + { + TUint32 eventSessionId = aEvent.Uint32( TMTPTypeEvent::EEventSessionID ); + TUint32 eventTransactionCode = aEvent.Uint32( TMTPTypeEvent::EEventTransactionID ); + + TBool result = EFalse; + if ( ( iSessionId == eventSessionId ) + && ( iTransactionCode == eventTransactionCode ) + && ( &iConnection == &aConnection ) ) + { + result = ETrue; + } + return result; + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::DoHandleRequestPhaseL +// Handle the request phase of the current request +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CRequestProcessor::DoHandleRequestPhaseL() + { + TRAPD( err, iResponseCode = CheckRequestL() ); + PRINT2( _L( "MM MTP <> CRequestProcessor::DoHandleRequestPhaseL iResponseCode = 0x%x, CheckRequestL err = %d" ), + iResponseCode, err ); + if ( ( err != KErrNone ) || ( iResponseCode != EMTPRespCodeOK ) ) + { + if ( HasDataphase() ) + { + // If we have a dataphase + // we need to read in the data and discard it + iNullBuffer.Close(); + iNullBuffer.CreateMaxL( KNullBufferSize ); + iNull.SetBuffer( iNullBuffer ); + ReceiveDataL( iNull ); + } + else + { + if ( err != KErrNone ) + { + User::Leave( err ); + } + SendResponseL( iResponseCode ); + } + } + else + { + TRAP( err, ServiceL() ); + PRINT1( _L( "MM MTP <> CRequestProcessor::DoHandleRequestPhaseL ServiceL err = %d" ), err ); + if ( err != KErrNone ) + { + iResponseCode = EMTPRespCodeGeneralError; + if ( HasDataphase() ) + { + // If we have a dataphase + // we need to read in the data and discard it + iNullBuffer.Close(); + iNullBuffer.CreateMaxL( KNullBufferSize ); + iNull.SetBuffer( iNullBuffer ); + ReceiveDataL( iNull ); + } + else + { + User::Leave( err ); + } + } + } + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::DoHandleDataIToRPhaseL +// Handle the receiving data phase of the current request +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CRequestProcessor::DoHandleDataIToRPhaseL() + { + User::Invariant(); + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::DoHandleRToIPhaseL +// Handle the sending data phase of the current request +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CRequestProcessor::DoHandleRToIPhaseL() + { + User::Invariant(); + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::DoHandleResponsePhaseL +// Handle the response phase of the current request +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CRequestProcessor::DoHandleResponsePhaseL() + { + TMTPResponseCode responseCode = ( iCancelled ? EMTPRespCodeIncompleteTransfer : EMTPRespCodeOK ); + SendResponseL( responseCode ); + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::DoHandleCompletingPhaseL +// Handle the completing phase of the current request +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CRequestProcessor::DoHandleCompletingPhaseL() + { + CompleteRequestL(); + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::CheckRequestL +// Check the current request +// ----------------------------------------------------------------------------- +// +EXPORT_C TMTPResponseCode CRequestProcessor::CheckRequestL() + { + if ( !iRequestChecker ) + { + iRequestChecker = CRequestChecker::NewL( iFramework, iConnection ); + } + __ASSERT_DEBUG( iRequest, User::Invariant() ); + return iRequestChecker->VerifyRequestL( *iRequest, iElementCount, iElements ); + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::RunL +// part of active object framework, provide default implementation +// ----------------------------------------------------------------------------- +// +EXPORT_C void CRequestProcessor::RunL() + { + + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::DoCancel +// part of active object framework, provide default implementation +// ----------------------------------------------------------------------------- +// +EXPORT_C void CRequestProcessor::DoCancel() + { + + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::RunError +// part of active object framework, provide default implementation +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CRequestProcessor::RunError( TInt aError ) + { + PRINT1( _L( "MM MTP <> CRequestProcessor RunError = %d" ), aError ); + TRAP_IGNORE( SendResponseL( EMTPRespCodeGeneralError ) ); + return KErrNone; + } + +EXPORT_C TBool CRequestProcessor::HasDataphase() const + { + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::SetPSStatus +// Set P&S Status to avoid MPX access conflict +// ----------------------------------------------------------------------------- +// +void CRequestProcessor::SetPSStatus() + { + TInt mtpStatus; + RProperty::Get( KMtpPSUid, KMtpPSStatus, mtpStatus); + + if ( mtpStatus != EMtpPSStatusActive ) + { + TInt err = RProperty::Set( KMtpPSUid, KMtpPSStatus, EMtpPSStatusActive ); + PRINT1( _L("MM MTP <> CRequestProcessor::SetPSStatus err = %d" ), err ); + } + } + +// ----------------------------------------------------------------------------- +// CRequestProcessor::ExtractSessionTransactionId +// retrieve the session id and transaction code from the current request +// ----------------------------------------------------------------------------- +// +void CRequestProcessor::ExtractSessionTransactionId() + { + iSessionId = iRequest->Uint32( TMTPTypeRequest::ERequestSessionID ); + iTransactionCode = iRequest->Uint32( TMTPTypeRequest::ERequestTransactionID ); + + PRINT2( _L( "MM MTP <> CRequestProcessor iSessionId = %d, iTransactionCode = %d" ), + iSessionId, + iTransactionCode ); + } + +EXPORT_C TUint32 CRequestProcessor::SessionId() + { + return iSessionId; + } + +// end of file