diff -r ccd8e69b5392 -r 496ad160a278 mmsharing/mmshavailability/src/musavaconnectionmonitor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmsharing/mmshavailability/src/musavaconnectionmonitor.cpp Fri Jun 11 13:36:18 2010 +0300 @@ -0,0 +1,345 @@ +/* +* Copyright (c) 2005-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: Provide interface for the client requestin availability class. +* +*/ + + + +#include "musavaconnectionmonitor.h" +#include "musavasettingsimp.h" +#include "musavanetworkavailability.h" +#include "musavaobserver.h" +#include "musavaavailability.h" +#include "musavasharedobject.h" +#include "musavaconnectionmonitorobserver.h" +#include "musavasip.h" +#include "muslogger.h" + +#include +#include +#include + +// ------------------------------------------------------------------------- +// Two-phased constructor. +// ------------------------------------------------------------------------- +// +CMusAvaConnectionMonitor* CMusAvaConnectionMonitor::NewL( + CMusAvaSharedObject& aSharedObject ) + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaConnectionMonitor::NewL()" ) + CMusAvaConnectionMonitor* self = + new( ELeave ) CMusAvaConnectionMonitor( aSharedObject ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + MUS_LOG( "mus: [MUSAVA] <- CMusAvaConnectionMonitor::NewL()" ) + return self; + } + + +// ------------------------------------------------------------------------- +// Destructor. +// ------------------------------------------------------------------------- +// +CMusAvaConnectionMonitor::~CMusAvaConnectionMonitor() + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaConnectionMonitor::\ + ~CMusAvaConnectionMonitor()" ) + iConnectionMonitorObserver.Reset(); + iConnectionMonitorObserver.Close(); + // Close the monitor when event notifications are no longer required + iConnectionMonitor.Close(); + + MUS_LOG( "mus: [MUSAVA] <- CMusAvaConnectionMonitor::\ + ~CMusAvaConnectionMonitor()" ) + } + +// ------------------------------------------------------------------------- +// Constructor function. +// ------------------------------------------------------------------------- +// +void CMusAvaConnectionMonitor::EventL(const CConnMonEventBase& aConnMonEvent) + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaConnectionMonitor::EventL()" ) + TUint connectionId = aConnMonEvent.ConnectionId(); + TInt eventType = aConnMonEvent.EventType(); + MUS_LOG1( "Connection ID = %d", connectionId ) + MUS_LOG1( "Event type = %d", eventType ) + + for( TInt i=0; iEventL( aConnMonEvent ); + } + MUS_LOG( "mus: [MUSAVA] <- CMusAvaConnectionMonitor::EventL()" ) + } + + +// ------------------------------------------------------------------------- +// Constructor function. +// ------------------------------------------------------------------------- +// +CMusAvaConnectionMonitor::CMusAvaConnectionMonitor( + CMusAvaSharedObject& aSharedObject ): +iSharedObj( &aSharedObject ) + { + } + +// ------------------------------------------------------------------------- +// Second phase constructor. +// ------------------------------------------------------------------------- +// +void CMusAvaConnectionMonitor::ConstructL() + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaConnectionMonitor::ConstructL()" ) + User::LeaveIfError( iConnectionMonitor.ConnectL() ); + + MUS_LOG( "mus: [MUSAVA] <- CMusAvaConnectionMonitor::ConstructL()" ) + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +void CMusAvaConnectionMonitor::AddAdapterL( + MMusAvaConnectionMonitorObserver& aAdapter ) + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaConnectionMonitor::\ + AddAdapterL( MMusAvaConnectionMonitorObserver& aAdapter )" ) + iConnectionMonitorObserver.AppendL( &aAdapter ); + MUS_LOG( "mus: [MUSAVA] <- CMusAvaSip::\ + AddAdapterL( MMusAvaConnectionMonitorObserver& aAdapter )" ) + } + +// ------------------------------------------------------------------------- +// Created connection ID for multimedia sharing is returned +// ------------------------------------------------------------------------- +// +TUint CMusAvaConnectionMonitor::CreatedConnectionID() + { + return iConnectionID; + } + +// ------------------------------------------------------------------------- +// Connection ID is stored +// ------------------------------------------------------------------------- +// +void CMusAvaConnectionMonitor::SetConnectionID( TUint aConnectionID ) + { + iConnectionID = aConnectionID; + } +// ------------------------------------------------------------------------- +// Active connection ID for multimedia sharing is returned +// ------------------------------------------------------------------------- +// +TUint CMusAvaConnectionMonitor::ConnectionIDL() + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaConnectionMonitor::ConnectionIDL()" ) + TUint iap = 0; //Internet acces point + TUint sipIap = 0; //SIP acces point + TUint count = 0; //Number of connections + TUint id = 0; //Connection ID + TUint activeIapID = 0; //Connection ID for active SIP IAP + TUint subId = 0; //SubconnectionID + TUint subCount; //Subconnectioncount + TRequestStatus status; + + //Fetch number of connections to count + count = ConnectionCount(); + if ( count == 0 ) + { + MUS_LOG( "mus: [MUSAVA] Non connections" ) + } + else + { + MUS_LOG1( "mus: [MUSAVA] Fetch number of connections: %d", count ) + + //Fetch internet access point to iap + sipIap = MultimediaSharingAccessPointID(); + if ( sipIap == 0 ) + { + MUS_LOG( "mus: [MUSAVA] Non Access Point ID's for app" ) + } + else + { + MUS_LOG1( "mus: [MUSAVA] Internet access point for sip: %d", + sipIap ) + + TBool goOn = ETrue; + for ( TUint i = 1; i <= count && goOn; i++ ) + { + //Fetch connectionId to id + User::LeaveIfError(iConnectionMonitor.GetConnectionInfo( + i, id, subCount )); + MUS_LOG1( "mus: [MUSAVA] Connection ID = %d", id ) + + //Fetch internet access point to iap + iConnectionMonitor.GetUintAttribute( id, subId, KIAPId, + iap, status ); + #ifndef UNIT_TESTING + User::WaitForRequest( status ); + #endif + MUS_LOG1( "mus: [MUSAVA] Internet access point %d ", iap ) + + // when correct Iap found ... + if( iap == sipIap ) + { + MUS_LOG( "mus: [MUSAVA] Connection ID found" ) + activeIapID = id; + goOn = EFalse; + } + } + + } + } + MUS_LOG( "mus: [MUSAVA] <- CMusAvaConnectionMonitor::ConnectionIDL()" ) + return activeIapID; + } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +TBool CMusAvaConnectionMonitor::KillPdpContext() + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaConnectionMonitor::KillPdpContext" ) + + TUint connId = 0; + TUint subConnectionCount = 0; + TRequestStatus requestStatus; + TUint count = ConnectionCount(); + TInt ret = 0; + TBool retval = EFalse; + + for ( TUint i = 1; i <= count && !retval; i++ ) + { + TInt bearerType = 0; + iConnectionMonitor.GetIntAttribute( connId, + subConnectionCount, + KBearer, + bearerType, + requestStatus ); + User::WaitForRequest( requestStatus ); + if ( bearerType == EBearerCSD || + bearerType == EBearerHSCSD || + bearerType == EBearerGPRS || + bearerType == EBearerEdgeGPRS || + bearerType == EBearerWCDMA || + bearerType == EBearerWcdmaCSD ) + { + MUS_LOG1( "mus: [MUSAVA] now killing connection whose connId \ + == <%d>", connId ) + ret = iConnectionMonitor.GetConnectionInfo( i, connId, + subConnectionCount ); + if ( ret == KErrNone ) + { + ret = iConnectionMonitor.SetBoolAttribute( connId, 0, + KConnectionStop, ETrue ); + if ( ret == KErrNone ) + { + retval = ETrue; + } + } + } + } + MUS_LOG( "mus: [MUSAVA] <- CMusAvaConnectionMonitor::KillPdpContext" ) + return retval; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +void CMusAvaConnectionMonitor::RemoveAdapter( + MMusAvaConnectionMonitorObserver& aAdapter ) + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaConnectionMonitor::\ + RemoveAdapter( MMusAvaConnectionMonitorObserver& aAdapter )" ) + TInt index = iConnectionMonitorObserver.Find( &aAdapter ); + + if( index != KErrNotFound ) + { + iConnectionMonitorObserver.Remove( index ); + } + MUS_LOG( "mus: [MUSAVA] <- CMusAvaSip::\ + RemoveAdapter( MMusAvaConnectionMonitorObserver& aAdapter )" ) + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +void CMusAvaConnectionMonitor::NotifyEventL() + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaConnectionMonitor::NotifyEventL()" ) + iConnectionMonitor.NotifyEventL( *this ); + MUS_LOG( "mus: [MUSAVA] <- CMusAvaConnectionMonitor::NotifyEventL()" ) + } + +// ------------------------------------------------------------------------- +// Active connection count for multimedia sharing is returned +// ------------------------------------------------------------------------- +// +TUint CMusAvaConnectionMonitor::ConnectionCount() + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaConnectionMonitor::ConnectionCount()" ) + TUint count = (TUint) KErrNotFound; + TRequestStatus status; + + iConnectionMonitor.GetConnectionCount( count, status ); + #ifndef UNIT_TESTING + User::WaitForRequest( status ); + #endif + if ( status.Int() != KErrNone ) + { + MUS_LOG( "mus: [MUSAVA] Phone doesn't have any active connections" ) + } + MUS_LOG( "mus: [MUSAVA] <- CMusAvaConnectionMonitor::ConnectionCount()" ) + return count; + } + +// ------------------------------------------------------------------------- +// Active Internet Access Point ID for multimedia sharing is returned +// ------------------------------------------------------------------------- +// +TUint CMusAvaConnectionMonitor::MultimediaSharingAccessPointID() + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaConnectionMonitor::\ + MultimediaSharingAccessPointID()" ) + TUint retval = KErrNone; + TBool profileCreated = EFalse; + TRAPD( err, profileCreated = iSharedObj->MusAvaSip().CreateProfileL() ); + if ( err || !profileCreated ) + { + retval = (TUint)KErrNotFound; + } + else + { + CSIPProfile* profile = iSharedObj->MusAvaSip().Profile(); + // Get IAP ID + MUS_LOG( "mus: [MUSAVA] Get IAP ID" ) + + TInt ret = profile->GetParameter( KSIPAccessPointId, iProfileId ); + if( ret ) + { + MUS_LOG( "mus: [MUSAVA] IAP ID is not found" ) + MUS_LOG( "mus: [MUSAVA] <- CMusAvaConnectionMonitor::\ + MultimediaSharingAccessPointID()" ) + retval = (TUint)ret; + } + else + { + MUS_LOG1( "mus: [MUSAVA] IAP ID = %d", iProfileId ) + retval = iProfileId; + } + } + MUS_LOG( "mus: [MUSAVA] <- CMusAvaConnectionMonitor::\ + MultimediaSharingAccessPointID()" ) + return retval; + }