diff -r 4096754ee773 -r 52a167391590 localconnectivityservice/dun/utils/src/DunNetDataport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/localconnectivityservice/dun/utils/src/DunNetDataport.cpp Wed Sep 01 12:20:40 2010 +0100 @@ -0,0 +1,395 @@ +/* +* Copyright (c) 2006-2008 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: Dataport specific network resource accessor implementation +* +*/ + + +#include +#include "DunNetDataport.h" +#include "DunUtils.h" +#include "DunDebug.h" + +_LIT(DUN_GGP_DATAPORT_CSY_PORT, "::DUN"); +_LIT(DUN_GGP_DATAPORT_CSY, "DATAPORT"); + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CDunNetDataport* CDunNetDataport::NewL( TInt aNumOfMaxChannels ) + { + CDunNetDataport* self = new (ELeave) CDunNetDataport( aNumOfMaxChannels ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CDunNetDataport::~CDunNetDataport() + { + FTRACE(FPrint(_L( "CDunNetDataport::~CDunNetDataport()"))); + TInt i; + TInt count = iEntities.Count(); + for ( i=0; i MDunNetwork). +// Initializes network for Dataport +// Must be called before any other operation +// --------------------------------------------------------------------------- +// +void CDunNetDataport::InitializeL() + { + FTRACE(FPrint(_L( "CDunNetDataport::InitializeL()"))); + AllocatePhoneObjectsL(); + FTRACE(FPrint(_L( "CDunNetDataport::InitializeL() complete"))); + } + +// --------------------------------------------------------------------------- +// From class MDunNetDataport. +// Called when channel was created by transporter for Dataport +// Initializes network for channel creation +// --------------------------------------------------------------------------- +// +TInt CDunNetDataport::AllocateChannel( RComm*& aComm ) + { + FTRACE(FPrint(_L( "CDunNetDataport::AllocateChannel()"))); + TInt firstFree = InitializeFirstFreeEntity(); + if ( firstFree < 0 ) + { + FTRACE(FPrint(_L( "CDunNetDataport::AllocateChannel() (not found) complete"))); + return firstFree; + } + if ( firstFree >= iEntities.Count() ) + { + FTRACE(FPrint(_L( "CDunNetDataport::AllocateChannel() (firstfree failed!) complete"))); + return KErrGeneral; + } + TInt retTemp = iEntities[firstFree].iMobileCall.OpenNewCall( iMobileLine ); + if ( retTemp != KErrNone ) + { + RemoveEntity( firstFree ); // remove unused initialized channel + FTRACE(FPrint(_L( "CDunNetDataport::AllocateChannel() OpenNewCall FAILED %d" ), retTemp)); + return KErrGeneral; + } + retTemp = iEntities[firstFree].iMobileCall.Connect(); + if ( retTemp != KErrNone ) + { + RemoveEntity( firstFree ); // remove unused initialized channel + FTRACE(FPrint(_L( "CDunNetDataport::AllocateChannel() iEntities[%d]->iMobileCall.Connect FAILED %d" ), firstFree, retTemp)); + return KErrGeneral; + } + RCall::TCommPort portName; + portName.iPort.Copy( DUN_GGP_DATAPORT_CSY ); + portName.iPort.Append( DUN_GGP_DATAPORT_CSY_PORT ); + retTemp = iEntities[firstFree].iMobileCall.LoanDataPort( portName ); + if ( retTemp != KErrNone ) + { + RemoveEntity( firstFree ); // remove unused initialized channel + if ( retTemp == KErrEtelPortNotLoanedToClient ) + { + FTRACE(FPrint(_L( "CDunNetDataport::AllocateChannel() (too big) complete"))); + return KErrTooBig; + } + FTRACE(FPrint(_L( "CDunNetDataport::AllocateChannel() iEntities[%d]->iMobileCall.LoanDataPort FAILED %d" ), firstFree, retTemp)); + return KErrGeneral; + } + FTRACE(FPrint(_L( "CDunNetDataport::AllocateChannel() Created call object at index %d" ), firstFree)); + retTemp = iEntities[firstFree].iDataport.Open( iCommServer, + portName.iPort, + ECommExclusive, + ECommRoleDTE ); + if ( retTemp != KErrNone ) + { + RemoveEntity( firstFree ); // remove unused initialized channel + FTRACE(FPrint(_L( "CDunNetDataport::AllocateChannel() FAILED to open dataport %d"), retTemp)); + return KErrGeneral; + } + iEntities[firstFree].iDataport.ResetBuffers(); + iEntities[firstFree].iEntityInUse = ETrue; + aComm = &iEntities[firstFree].iDataport; + FTRACE(FPrint(_L( "CDunNetDataport::AllocateChannel() (iEntities[%d]->iDataport) opened"), firstFree)); + FTRACE(FPrint(_L( "CDunNetDataport::AllocateChannel() complete"))); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// From class MDunNetDataport. +// Called when channel was deleted/closed by transporter for Dataport +// Uninitializes network for channel deletion/close +// --------------------------------------------------------------------------- +// +TInt CDunNetDataport::FreeChannel( RComm* aComm ) + { + FTRACE(FPrint(_L( "CDunNetDataport::FreeChannel()"))); + TInt i; + TInt count = iEntities.Count(); + for ( i=0; i= count ) + { + FTRACE(FPrint(_L( "CDunNetDataport::FreeChannel() (not found) complete"))); + return KErrNotFound; + } + DeleteNetworkEntity( i, ETrue ); + FTRACE(FPrint(_L( "CDunNetDataport::FreeChannel() (iEntities[%d]->iDataport) freed"), i)); + FTRACE(FPrint(_L( "CDunNetDataport::FreeChannel() complete"))); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// From class MDunNetDataport. +// Gets index by network ID for Dataport +// --------------------------------------------------------------------------- +// +TInt CDunNetDataport::GetIndexById( RComm* aComm ) + { + FTRACE(FPrint(_L( "CDunNetDataport::GetIndexById()"))); + TInt i; + TInt count = iEntities.Count(); + for ( i=0; i=iNumOfMaxChannels ) + { + FTRACE(FPrint( _L("CDunNetDataport::InitializeFirstFreeEntity() (too big) complete" ))); + return KErrTooBig; + } + TDunDataportEntity emptyEntity; + emptyEntity.iEntityInUse = EFalse; + retTemp = iEntities.Append( emptyEntity ); + if ( retTemp != KErrNone ) + { + FTRACE(FPrint( _L("CDunNetDataport::InitializeFirstFreeEntity() (append failed!) complete" ))); + return retTemp; + } + FTRACE(FPrint(_L( "CDunNetDataport::InitializeFirstFreeEntity() complete"))); + return i; + } + +// --------------------------------------------------------------------------- +// Remove network entity by index +// --------------------------------------------------------------------------- +// +TInt CDunNetDataport::RemoveEntity( TInt aIndex ) + { + FTRACE(FPrint(_L( "CDunNetDataport::RemoveEntity()"))); + if ( aIndex < 0 || + aIndex >= iEntities.Count() ) + { + FTRACE(FPrint(_L( "CDunNetDataport::RemoveEntity() (not found) complete"))); + return KErrNotFound; + } + DeleteNetworkEntity( aIndex, EFalse ); + FTRACE(FPrint(_L( "CDunNetDataport::RemoveEntity() complete"))); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// Deletes own internal data +// --------------------------------------------------------------------------- +// +void CDunNetDataport::DeleteNetwork() + { + FTRACE(FPrint(_L( "CDunNetDataport::DeleteNetwork()"))); + if ( iMobileLine.SubSessionHandle() ) + { + iMobileLine.Close(); + FTRACE(FPrint(_L( "CDunNetDataport::DeleteNetwork() mobile line closed"))); + } + if ( iMobilePhone.SubSessionHandle() ) + { + iMobilePhone.Close(); + FTRACE(FPrint(_L( "CDunNetDataport::DeleteNetwork() mobile phone closed"))); + } + if ( iTelServer.Handle() ) + { + iTelServer.UnloadPhoneModule( KMmTsyModuleName ); + FTRACE(FPrint(_L( "CDunNetDataport::DeleteNetwork() phone module unloaded"))); + iTelServer.Close(); + FTRACE(FPrint(_L( "CDunNetDataport::DeleteNetwork() phone module closed"))); + } + if ( iCommServer.Handle() ) + { + iCommServer.UnloadCommModule( DUN_GGP_DATAPORT_CSY ); + FTRACE(FPrint(_L( "CDunNetDataport::DeleteNetwork() comm module unloaded"))); + iCommServer.Close(); + FTRACE(FPrint(_L( "CDunNetDataport::DeleteNetwork() comm module closed"))); + } + iEntities.Close(); + FTRACE(FPrint(_L( "CDunNetDataport::DeleteNetwork() complete"))); + } + +// --------------------------------------------------------------------------- +// Deletes one network entity at index aIndex for Dataport +// --------------------------------------------------------------------------- +// +TInt CDunNetDataport::DeleteNetworkEntity( TInt aIndex, TBool aCheckFree ) + { + FTRACE(FPrint(_L( "CDunNetDataport::DeleteNetworkEntity()"))); + if ( aIndex < 0 || + aIndex >= iEntities.Count() ) + { + FTRACE(FPrint(_L( "CDunNetDataport::DeleteNetworkEntity() (not found) complete"), aIndex)); + return KErrGeneral; + } + TDunDataportEntity& entity = iEntities[aIndex]; + if ( (aCheckFree&&entity.iEntityInUse) || !aCheckFree ) + { + if ( entity.iDataport.SubSessionHandle() ) + { + // The next will set KSignalDTEOutputs down twice for RComm + // local media case because CDunSignalCopy clears them also which + // in turn causes plugin to free channel. But this probably won't + // cause any harm. + entity.iDataport.SetSignals( 0, KSignalDTEOutputs ); + FTRACE(FPrint(_L( "CDunNetDataport::DeleteNetworkEntity() RComm signals set"))); + entity.iDataport.Close(); + FTRACE(FPrint(_L( "CDunNetDataport::DeleteNetworkEntity() RComm closed"))); + } + if ( entity.iMobileCall.SubSessionHandle() ) + { + entity.iMobileCall.RecoverDataPort(); + FTRACE(FPrint(_L( "CDunNetDataport::DeleteNetworkEntity() Dataport recovered"))); + entity.iMobileCall.Close(); + FTRACE(FPrint(_L( "CDunNetDataport::DeleteNetworkEntity() Dataport closed"))); + } + entity.iEntityInUse = EFalse; + } + FTRACE(FPrint(_L( "CDunNetDataport::DeleteNetworkEntity() complete"))); + return KErrNone; + }