--- /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 <networking/qos3gpp_subconparams.h>
+#include <es_enum.h>
+
+#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;
+ }
+ }