diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccsubcontroller/src/mccqoshandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/mmccsubcontroller/src/mccqoshandler.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,262 @@ +/* +* Copyright (c) 2006-2007 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: Implementation of CMccQosHandler +* +*/ + + + + +// INCLUDES +#include +#include + +#include "mccqoshandler.h" +#include "mccqossockethandler.h" +#include "mccqoseventmonitor.h" +#include "mccqoslogging.h" + +// Constants for QoS parameters +const TUint KTransferDelay = 600; +const TUint KMaxSduSize = 1024; +const TUint KMaxBitrate = 66000; +const TUint KMaxGuaBitrate = 15200; + +// ======== MEMBER FUNCTIONS ================================================= + + +// --------------------------------------------------------------------------- +// CMccQosHandler::CMccQosHandler +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------------------------- +// +CMccQosHandler::CMccQosHandler( MMccQosEventObserver& aObserver ) : + iObserver( aObserver ) + { + + } + + +// --------------------------------------------------------------------------- +// CMccQosPluginImpl::NewL +// Static constructor. +// --------------------------------------------------------------------------- +// +CMccQosHandler* CMccQosHandler::NewL( MMccQosEventObserver& aObserver ) + { + __QOSLOG( "CMccQosHandler::NewL" ) + + CMccQosHandler* self = new ( ELeave ) CMccQosHandler( aObserver ); + return self; + } + + +// --------------------------------------------------------------------------- +// CMccQosHandler::~CMccQosHandler +// Destructor. +// --------------------------------------------------------------------------- +// +CMccQosHandler::~CMccQosHandler() + { + __QOSLOG( "CMccQosHandler::~CMccQosHandler" ) + + delete iEventMonitor; + HandleSocketHandlerDeletion(); + iSubConnection.Close(); + } + + +// --------------------------------------------------------------------------- +// CMccQosHandler::EnableQosL +// --------------------------------------------------------------------------- +// +void CMccQosHandler::EnableQosL() + { + __QOSLOG("CMccQosHandler::DoEnableQoSL") + + __ASSERT_ALWAYS( iConnection, User::Leave( KErrNotReady ) ); + __ASSERT_ALWAYS( iSocketServ, User::Leave( KErrNotReady ) ); + __ASSERT_ALWAYS( iSocket, User::Leave( KErrNotReady ) ); + + // This makes sure that we have not created eventhandler nor + // sockethandler. This way we stay in correct state. + if ( QoSEnabled() ) + { + __QOSLOG( "CMccQosHandler::DoEnableQoSL KErrInUse" ) + + User::Leave( KErrInUse ); + } + + // Qos functionality is broken in current environments and prevents + // sending packets to network. Therefore, feature is disabled at the + // moment. Only supported when unit testing. +#ifndef TEST_EUNIT + __QOSLOG( "CMccQosHandler::DoEnableQoSL FEATURE DISABLED!" ) + User::Leave( KErrNotSupported ); +#endif + + // Create a parameter bundle & container for QoS subconnection parameters + RSubConParameterBundle subConparams; + CleanupClosePushL( subConparams ); + + // Parambundle takes ownership + CSubConParameterFamily* family = + CSubConParameterFamily::NewL( subConparams, KSubConQoSFamily ); + + // Create a requested technology specific parameter set for QoS + // (Qos family takes ownership). + CSubConQosR99ParamSet* reqParams( CSubConQosR99ParamSet::NewL( *family, + CSubConParameterFamily::ERequested ) ); + + // Create acceptable parameter set. (Qos family takes ownership). + CSubConQosR99ParamSet* acpParams( CSubConQosR99ParamSet::NewL( *family, + CSubConParameterFamily::EAcceptable ) ); + + // Set the requested params, request conversational class. + reqParams->SetTrafficClass( + RPacketQoS::ETrafficClassConversational ); + + reqParams->SetDeliveryOrder( + RPacketQoS::EDeliveryOrderNotRequired ); + + reqParams->SetErroneousSDUDelivery( + RPacketQoS::EErroneousSDUNoDetection ); + + reqParams->SetResidualBitErrorRatio( + RPacketQoS::EBERUnspecified ); + + reqParams->SetSDUErrorRatio( + RPacketQoS::ESDUErrorRatioUnspecified ); + + reqParams->SetTrafficHandlingPriority( + RPacketQoS::ETrafficPriorityUnspecified ); + + // Accept streaming class + acpParams->SetTrafficClass( + RPacketQoS::ETrafficClassStreaming ); + + reqParams->SetTransferDelay( KTransferDelay ); + reqParams->SetMaxSduSize( KMaxSduSize ); + reqParams->SetMaxBitrateUplink( KMaxBitrate ); + reqParams->SetMaxBitrateDownlink( KMaxBitrate ); + reqParams->SetGuaBitrateUplink( KMaxGuaBitrate ); + reqParams->SetGuaBitrateDownlink( KMaxGuaBitrate ); + + // Open the subconnection + User::LeaveIfError( iSubConnection.Open( *iSocketServ, + RSubConnection::ECreateNew, *iConnection ) ); + + // Set QoS properties of the subconnection + User::LeaveIfError( iSubConnection.SetParameters( subConparams ) ); + + acpParams = NULL; + reqParams = NULL; + family = NULL; + CleanupStack::PopAndDestroy(); // subConparams + + + // Start the socket adding process to the subconnections + CMccQosSocketHandler* sockHandler = CMccQosSocketHandler::NewLC( iObserver, + iSubConnection, *iSocket ); + + // Start the eventmonitoring of the subconnection. + CMccQosEventMonitor* evHandler = CMccQosEventMonitor::NewLC( iObserver, + iSubConnection ); + + iEventMonitor = evHandler; + CleanupStack::Pop( evHandler ); + evHandler = NULL; + + iQosSocketHandler = sockHandler; + CleanupStack::Pop( sockHandler ); + sockHandler = NULL; + + __QOSLOG("CMccQosHandler::DoEnableQoSL exit") + } + + +// --------------------------------------------------------------------------- +// CMccQosHandler::DisableQoSL +// --------------------------------------------------------------------------- +// +void CMccQosHandler::DisableQoS() + { + __QOSLOG( "CMccQosHandler::DisableQoS" ) + + HandleSocketHandlerDeletion(); + delete iEventMonitor; + iSubConnection.Close(); + iQosSocketHandler = NULL; + iEventMonitor = NULL; + iConnection = NULL; + iSocketServ = NULL; + iSocket = NULL; + } + + +// --------------------------------------------------------------------------- +// CMccQosHandler::SetSubConnectionParams +// --------------------------------------------------------------------------- +// +void CMccQosHandler::SetSubConnectionParams( RConnection& aConnection, + RSocketServ& aSocketServ, RSocket& aSocket ) + { + __QOSLOG( "CMccQosHandler::SetSubConnectionParams" ) + + iConnection = &aConnection; + iSocketServ = &aSocketServ; + iSocket = &aSocket; + } + + +// --------------------------------------------------------------------------- +// CMccQosHandler::QoSEnabled +// --------------------------------------------------------------------------- +// +TBool CMccQosHandler::QoSEnabled() const + { + if ( iQosSocketHandler && iEventMonitor ) + { + __QOSLOG( "CMccQosHandler::QoSEnabled ETrue" ) + + return ETrue; + } + else + { + __QOSLOG( "CMccQosHandler::QoSEnabled EFalse" ) + + return EFalse; + } + } + + +// --------------------------------------------------------------------------- +// CMccQosHandler::HandleSocketHandlerDeletion +// --------------------------------------------------------------------------- +// +void CMccQosHandler::HandleSocketHandlerDeletion() + { + __QOSLOG("CMccQosHandler::HandleSocketHandlerDeletion" ) + + if ( iQosSocketHandler && iQosSocketHandler->IsActive() ) + { + iQosSocketHandler->AsyncDeleteNeeded( ETrue ); + } + else + { + delete iQosSocketHandler; + iQosSocketHandler = NULL; + } + }