diff -r 000000000000 -r 3553901f7fa8 telephonyprotocols/pdplayer/umts/spudtel/src/ceteldrivercontext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyprotocols/pdplayer/umts/spudtel/src/ceteldrivercontext.cpp Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,369 @@ +// Copyright (c) 2004-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: +// implementation of etel driver context class +// +// + +/** + @file + @internalComponent +*/ + + +#include "ceteldrivercontext.h" +#include "ceteldriverfactory.h" +#include "spudteldebuglogger.h" + + +using namespace EtelDriver; + + +CEtelDriverContext* CEtelDriverContext::NewL(TContextId aId, SpudMan::TPdpContextType aContextType, CEtelDriverFactory& aFactory) + { + CEtelDriverContext* self = new (ELeave) CEtelDriverContext(aId, aContextType, aFactory); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +void CEtelDriverContext::ConstructL() + { + iContextConfig.CreateL(PdpFsm::KContextConfigBufferSize); + iContextConfig.SetMax(); + iContextConfig.FillZ(); + + switch(PdpFsmInterface().UmtsRelease()) + { + case TPacketDataConfigBase::KConfigGPRS: + { + RPacketContext::TContextConfigGPRS tmp; + Mem::Copy(const_cast(iContextConfig.Ptr()), &tmp, sizeof(tmp)); + } + break; + + case TPacketDataConfigBase::KConfigRel99Rel4: + { + RPacketContext::TContextConfigR99_R4 tmp; + Mem::Copy(const_cast(iContextConfig.Ptr()), &tmp, sizeof(tmp)); + } + break; + + case TPacketDataConfigBase::KConfigRel5: + { + RPacketContext::TContextConfig_R5 tmp; + Mem::Copy(const_cast(iContextConfig.Ptr()), &tmp, sizeof(tmp)); + } + break; + default: + User::Leave(KErrNotSupported); + break; + + } + } + +CEtelDriverContext::CEtelDriverContext (TContextId aId, SpudMan::TPdpContextType aContextType, CEtelDriverFactory& aFactory) +: CActive(CActive::EPriorityStandard), + iId(aId), + iContextType(aContextType), + iCompletionStatus(KErrNone), + iStrategyStep(MEtelDriverStrategy::EFinishStep), + iStrategyId(ESentinelStrategy), + iFactory(aFactory), + iQosRequestedPckg(iQosRequested), + iQosNegotiatedPckg(iQosNegotiated), + + iDataChannelV2(), + iDataChannelV2Pckg(iDataChannelV2), + iPcktMbmsSessionList(NULL), + iContextConfigMbms(), + iContextConfigMbmsPckg(iContextConfigMbms), + iFilterV2(), + iFilterV2Pckg(iFilterV2) + { + SPUDTEL_FNLOG("CEtelDriverContext::CEtelDriverContext"); + CActiveScheduler::Add(this); + } +CEtelDriverContext::~CEtelDriverContext() + { + SPUDTEL_FNLOG("CEtelDriverContext::~CEtelDriverContext()"); + Cancel(); // N.B. This cancels all outstanding operations on the context, including deletion! + iContextConfig.Close(); + + // Guarantees proper release of all handles. + // If everything is closed already, this does no harm. + iPacketQoS.Close(); // Close QoS first, a buggy TSY may not handle it the other way. + iPacketContext.Close(); // At this point the reference count on the context is zero. + // TSY should cleanly dispose of the context, if it had not done so already. + + // This is necessary only in a situtation where Spudman is destroyed while a strategy + // on a context is outstanding: in this case deletion of SpudTel results in cancellation + // of all outstanding operations, which is likely to result in handle leak. + // Under other circumstances, the handles will be closed via an appropriate strategy. + + //delete if MBMS sessions structures. + iMbmsPacketContext.Close(); + if (iMbmsSession) + { + delete iMbmsSession; + delete iPcktMbmsSessionList; + } + iSessionInfo.iSessionIds.Close(); //RArray should be closed. + + } + +/** initiates a new request + +@param aOperation - type of an etel driver request + +@return KErrInUse if pdp context has active strategy +*/ +TInt CEtelDriverContext::Input (TEtelInput aOperation) + { + SPUDTEL_FNLOG("CEtelDriverContext::Input()"); + SPUDTELVERBOSE_INFO_LOG1( _L("Operation %d"), aOperation ); + + if (MEtelDriverStrategy::EFinishStep != iStrategyStep) + { + SPUDTEL_ERROR_LOG(_L("ERROR: Pdp context is in use, return %d"), KErrInUse); + // I'm still doing something + ASSERT(EFalse); // shouldn't happen + return KErrInUse; + } + + iStrategyId = iFactory.StrategyId(aOperation); + iStrategyStep = MEtelDriverStrategy::EStartStep; + iCompletionStatus = KErrNone; + + SetActive(); + Strategy(iStrategyId).Next(*this, &iStatus); + + return KErrNone; + } + + +void CEtelDriverContext::RunL() + { + SPUDTEL_FNLOG("CEtelDriverContext::RunL()"); + ASSERT(iStrategyId < ESentinelStrategy); + + if(iStatus != KErrNone) + { + if(iCompletionStatus == KErrNone) + { + iCompletionStatus = iStatus; + SPUDTEL_ERROR_LOG(_L("Last async request completed with error %d"), iStatus.Int()); + } + // Don't continue with the strategy for all cases except Delete + // N.B.: deletion of a context has to be done till the very last step + // to ensure proper cleanup of resources. + if(EContextDeleteStrategy != iStrategyId) + { + iStrategyStep = MEtelDriverStrategy::EFinishStep; + } + SPUDTELVERBOSE_INFO_LOG(_L("Strategy is completed")); + } + + if(MEtelDriverStrategy::EFinishStep == iStrategyStep) + { + // we are done + SPUDTELVERBOSE_INFO_LOG(_L("Strategy is completed")); + Strategy(iStrategyId).NotifyFsm (*this, iCompletionStatus); + } + else + { + // continue with next step + SetActive(); + Strategy(iStrategyId).Next(*this, &iStatus); + } + } + +/** cancels last async request */ +void CEtelDriverContext::DoCancel() + { + SPUDTEL_FNLOG("CEtelDriverContext::DoCancel()"); + + if(IsActive()) + { + // delegate to strategy + Strategy(iStrategyId).CancelAsyncRequest(*this); + } + iStrategyStep = MEtelDriverStrategy::EFinishStep; + SPUDTELVERBOSE_INFO_LOG(_L("Strategy is cancelled")); + } + +/** accessor */ +const TName& CEtelDriverContext::ExistingContextName() const + { + SPUDTEL_FNLOG("CEtelDriverContext::ExistingContextName()"); + for (TContextId i = 0; i < static_cast(iFactory.ContextCount()); i++) + { + + if (iFactory.HasContext(i) && iFactory.Context(i).Name().Size()) + { + return iFactory.Context(i).Name(); + } + } + + // Unacceptable situation: we didn't create a single context yet + SPUDTEL_ERROR_LOG(_L("CEtelDriverContext::ExistingContextName - can't find existing context. return %S"), &iFactory.Context(0).Name()); + ASSERT(EFalse); + return iFactory.Context(0).Name(); + } + +/** accessor + +@return reference to etel RPhone +*/ +RPhone& CEtelDriverContext::Phone() const + { + return iFactory.Phone(); + } + +/** accessor + +@return reference to etel RPacketService +*/ +RPacketService& CEtelDriverContext::PacketService() const + { + return iFactory.PacketService(); + } + +/** accessor + +@return reference to etel driver strategy +*/ +MEtelDriverStrategy& CEtelDriverContext::Strategy(TEtelDriverStrategy aId) const + { + return iFactory.Strategy(aId); + } + +/** accessor + +@return reference to pdp fsm interface +*/ +CPdpFsmInterface& CEtelDriverContext::PdpFsmInterface() const + { + return iFactory.PdpFsmInterface(); + } + +/** start pdp notifications */ +void CEtelDriverContext::StartNotifications() const + { + iFactory.StartPdpNotifications(iId); + } + +/** stops pdp notifications */ +void CEtelDriverContext::StopNotifications() const + { + iFactory.CancelPdpNotifications(iId); + } + + +#ifdef _DEBUG +void CEtelDriverContext::DumpReqProfileParameters () + { + SPUDTEL_INFO_LOG1( _L("Requested Profile Parameters Dump - Context Id = %d"), Id()); + SPUDTEL_INFO_LOG( _L("===========================================================")); + SPUDTEL_INFO_LOG1( _L("ExtensionId = %d"), iQosRequested.ExtensionId()); + + if (iQosRequested.ExtensionId() != TPacketDataConfigBase::KConfigRel99Rel4 + && iQosRequested.ExtensionId() != TPacketDataConfigBase::KConfigRel5) + { + SPUDTEL_INFO_LOG( _L("Invalid/Unsupported ExtensionId")); + return; + } + + if (iQosRequested.ExtensionId() == TPacketDataConfigBase::KConfigRel99Rel4 + || iQosRequested.ExtensionId() == TPacketDataConfigBase::KConfigRel5) + { + SPUDTEL_INFO_LOG1( _L("[1]iReqTrafficClass = %d"), iQosRequested.RequestedQoSR99_R4().iReqTrafficClass); + SPUDTEL_INFO_LOG1( _L("[2]iMinTrafficClass = %d"), iQosRequested.RequestedQoSR99_R4().iMinTrafficClass); + SPUDTEL_INFO_LOG1( _L("[3]iReqDeliveryOrderReqd = %d"), iQosRequested.RequestedQoSR99_R4().iReqDeliveryOrderReqd); + SPUDTEL_INFO_LOG1( _L("[4]iMinDeliveryOrderReqd = %d"), iQosRequested.RequestedQoSR99_R4().iMinDeliveryOrderReqd); + SPUDTEL_INFO_LOG1( _L("[5]iReqDeliverErroneousSDU = %d"), iQosRequested.RequestedQoSR99_R4().iReqDeliverErroneousSDU); + SPUDTEL_INFO_LOG1( _L("[6]iMinDeliverErroneousSDU = %d"), iQosRequested.RequestedQoSR99_R4().iMinDeliverErroneousSDU); + SPUDTEL_INFO_LOG1( _L("[7]iReqMaxSDUSize = %d"), iQosRequested.RequestedQoSR99_R4().iReqMaxSDUSize); + SPUDTEL_INFO_LOG1( _L("[8]iMinAcceptableMaxSDUSize = %d"), iQosRequested.RequestedQoSR99_R4().iMinAcceptableMaxSDUSize); + SPUDTEL_INFO_LOG1( _L("[9]iReqMaxRate.iUplinkRate = %d"), iQosRequested.RequestedQoSR99_R4().iReqMaxRate.iUplinkRate); + SPUDTEL_INFO_LOG1( _L("[10]iReqMaxRate.iDownlinkRate = %d"), iQosRequested.RequestedQoSR99_R4().iReqMaxRate.iDownlinkRate); + SPUDTEL_INFO_LOG1( _L("[11]iMinAcceptableMaxRate.iUplinkRate = %d"), iQosRequested.RequestedQoSR99_R4().iMinAcceptableMaxRate.iUplinkRate); + SPUDTEL_INFO_LOG1( _L("[12]iMinAcceptableMaxRate.iDownlinkRate = %d"), iQosRequested.RequestedQoSR99_R4().iMinAcceptableMaxRate.iDownlinkRate); + SPUDTEL_INFO_LOG1( _L("[13]iReqBER = %d"), iQosRequested.RequestedQoSR99_R4().iReqBER); + SPUDTEL_INFO_LOG1( _L("[14]iMaxBER = %d"), iQosRequested.RequestedQoSR99_R4().iMaxBER); + SPUDTEL_INFO_LOG1( _L("[15]iReqSDUErrorRatio = %d"), iQosRequested.RequestedQoSR99_R4().iReqSDUErrorRatio); + SPUDTEL_INFO_LOG1( _L("[16]iMaxSDUErrorRatio = %d"), iQosRequested.RequestedQoSR99_R4().iMaxSDUErrorRatio); + SPUDTEL_INFO_LOG1( _L("[17]iReqTrafficHandlingPriority = %d"), iQosRequested.RequestedQoSR99_R4().iReqTrafficHandlingPriority); + SPUDTEL_INFO_LOG1( _L("[18]iReqTrafficHandlingPriority = %d"), iQosRequested.RequestedQoSR99_R4().iMinTrafficHandlingPriority); + SPUDTEL_INFO_LOG1( _L("[19]iReqTransferDelay = %d"), iQosRequested.RequestedQoSR99_R4().iReqTransferDelay); + SPUDTEL_INFO_LOG1( _L("[20]iMaxTransferDelay = %d"), iQosRequested.RequestedQoSR99_R4().iMaxTransferDelay); + SPUDTEL_INFO_LOG1( _L("[21]iReqGuaranteedRate.iUplinkRate = %d"), iQosRequested.RequestedQoSR99_R4().iReqGuaranteedRate.iUplinkRate); + SPUDTEL_INFO_LOG1( _L("[22]iReqGuaranteedRate.iDownlinkRate = %d"), iQosRequested.RequestedQoSR99_R4().iReqGuaranteedRate.iDownlinkRate); + SPUDTEL_INFO_LOG1( _L("[23]iMinGuaranteedRate.iUplinkRate = %d"), iQosRequested.RequestedQoSR99_R4().iMinGuaranteedRate.iUplinkRate); + SPUDTEL_INFO_LOG1( _L("[24]iMinGuaranteedRate.iDownlinkRate = %d"), iQosRequested.RequestedQoSR99_R4().iMinGuaranteedRate.iDownlinkRate); + } + +#ifdef SYMBIAN_NETWORKING_UMTSR5 + if (iQosRequested.ExtensionId() == TPacketDataConfigBase::KConfigRel5) + { + SPUDTEL_INFO_LOG1( _L("[25]iSignallingIndication = %d"), iQosRequested.RequestedQoSR5().iSignallingIndication); + SPUDTEL_INFO_LOG1( _L("[26]iSourceStatisticsDescriptor = %d"), iQosRequested.RequestedQoSR5().iSourceStatisticsDescriptor); + } +#endif + } + + + +void CEtelDriverContext::DumpNegProfileParameters () + { + SPUDTEL_INFO_LOG1( _L("Negotiated Profile Parameters Dump - Context Id = %d"), Id()); + SPUDTEL_INFO_LOG( _L("===========================================================")); + SPUDTEL_INFO_LOG1( _L("ExtensionId = %d"), iQosNegotiated.ExtensionId()); + + if (iQosNegotiated.ExtensionId() != TPacketDataConfigBase::KConfigRel99Rel4 + && iQosNegotiated.ExtensionId() != TPacketDataConfigBase::KConfigRel5) + { + SPUDTEL_INFO_LOG( _L("Invalid/Unsupported ExtensionId")); + return; + } + + if (iQosNegotiated.ExtensionId() == TPacketDataConfigBase::KConfigRel99Rel4 + || iQosNegotiated.ExtensionId() == TPacketDataConfigBase::KConfigRel5) + { + SPUDTEL_INFO_LOG1( _L("[2]iTrafficClass = %d"), iQosNegotiated.NegotiatedQoSR99_R4().iTrafficClass); + SPUDTEL_INFO_LOG1( _L("[3]iDeliveryOrderReqd = %d"), iQosNegotiated.NegotiatedQoSR99_R4().iDeliveryOrderReqd); + SPUDTEL_INFO_LOG1( _L("[4]iDeliverErroneousSDU = %d"), iQosNegotiated.NegotiatedQoSR99_R4().iDeliverErroneousSDU); + SPUDTEL_INFO_LOG1( _L("[5]iMaxSDUSize = %d"), iQosNegotiated.NegotiatedQoSR99_R4().iMaxSDUSize); + SPUDTEL_INFO_LOG1( _L("[6]iBER = %d"), iQosNegotiated.NegotiatedQoSR99_R4().iBER); + SPUDTEL_INFO_LOG1( _L("[7]iSDUErrorRatio = %d"), iQosNegotiated.NegotiatedQoSR99_R4().iSDUErrorRatio); + SPUDTEL_INFO_LOG1( _L("[8]iTrafficHandlingPriority = %d"), iQosNegotiated.NegotiatedQoSR99_R4().iTrafficHandlingPriority); + SPUDTEL_INFO_LOG1( _L("[9]iTransferDelay = %d"), iQosNegotiated.NegotiatedQoSR99_R4().iTransferDelay); + SPUDTEL_INFO_LOG1( _L("[10]iGuaranteedRate.iUplinkRate = %d"), iQosNegotiated.NegotiatedQoSR99_R4().iGuaranteedRate.iUplinkRate); + SPUDTEL_INFO_LOG1( _L("[11]iGuaranteedRate.iDownlinkRate = %d"), iQosNegotiated.NegotiatedQoSR99_R4().iGuaranteedRate.iDownlinkRate); + SPUDTEL_INFO_LOG1( _L("[12]iMaxRate.iUplinkRate = %d"), iQosNegotiated.NegotiatedQoSR99_R4().iMaxRate.iUplinkRate); + SPUDTEL_INFO_LOG1( _L("[13]iMaxRate.iDownlinkRate = %d"), iQosNegotiated.NegotiatedQoSR99_R4().iMaxRate.iDownlinkRate); + } + + +#ifdef SYMBIAN_NETWORKING_UMTSR5 + if (iQosNegotiated.ExtensionId() == TPacketDataConfigBase::KConfigRel5) + { + SPUDTEL_INFO_LOG1( _L("[14]iSignallingIndication = %d"), iQosNegotiated.NegotiatedQoSR5().iSignallingIndication); + SPUDTEL_INFO_LOG1( _L("[15]iSourceStatisticsDescriptor = %d"), iQosNegotiated.NegotiatedQoSR5().iSourceStatisticsDescriptor); + } +#endif + } + +#endif +// _DEBUG