diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcesrv/mmceserver/src/mcelocaladdrresolver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/mmcesrv/mmceserver/src/mcelocaladdrresolver.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,209 @@ +/* +* Copyright (c) 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: +* +*/ + + + + +#include "mcelocaladdrresolver.h" +#include +#include + + +// ----------------------------------------------------------------------------- +// CMceLocalAddrResolver::NewL +// ----------------------------------------------------------------------------- +// +CMceLocalAddrResolver* CMceLocalAddrResolver::NewL( + RSocketServ& aSocketServ, + TUint32 aIapId ) + { + CMceLocalAddrResolver* self = NewLC( aSocketServ, aIapId ); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CMceLocalAddrResolver::NewLC +// ----------------------------------------------------------------------------- +// +CMceLocalAddrResolver* CMceLocalAddrResolver::NewLC( + RSocketServ& aSocketServ, + TUint32 aIapId ) + { + CMceLocalAddrResolver* self = + new( ELeave )CMceLocalAddrResolver( aSocketServ ); + CleanupStack::PushL(self); + self->ConstructL( aIapId ); + return self; + } + +// ----------------------------------------------------------------------------- +// CMceLocalAddrResolver::CMceLocalAddrResolver +// ----------------------------------------------------------------------------- +// +CMceLocalAddrResolver::CMceLocalAddrResolver( RSocketServ& aSocketServ ) + : iSocketServ( aSocketServ ) + { + } + +// ----------------------------------------------------------------------------- +// CMceLocalAddrResolver::ConstructL +// ----------------------------------------------------------------------------- +// +void CMceLocalAddrResolver::ConstructL( TUint32 aIapId ) + { + // The actual IAP ID is fetched dynamically + // to make local IP address lookup work in a case + // where there are several IAPs used which have different IDs + // but all point to the same physical AP. + + RConnection connection; + User::LeaveIfError( connection.Open( iSocketServ ) ); + CleanupClosePushL( connection ); + + // The connection has to be started to get the actual IAP ID from it + // At this point the physical connection should be already up + // as the related SIP profile has been registered using it and + // the synchronous RConnection::Start should return quickly and + // should not hang the whole MCE server process for too long + TCommDbConnPref prefs; + prefs.SetDialogPreference( ECommDbDialogPrefDoNotPrompt ); + prefs.SetDirection( ECommDbConnectionDirectionOutgoing ); + prefs.SetIapId( aIapId ); + connection.Start( prefs ); + + // Fetch the actual IAP ID from the started connection + _LIT( KIapIdSetting, "IAP\\Id" ); + User::LeaveIfError( connection.GetIntSetting( KIapIdSetting, iIapId ) ); + + CleanupStack::PopAndDestroy(); // connection + } + +// ----------------------------------------------------------------------------- +// CMceLocalAddrResolver::~CMceLocalAddrResolver +// ----------------------------------------------------------------------------- +// +CMceLocalAddrResolver::~CMceLocalAddrResolver() + { + } + +// ----------------------------------------------------------------------------- +// CMceLocalAddrResolver::Addr +// ----------------------------------------------------------------------------- +// +const TInetAddr& CMceLocalAddrResolver::Addr() const + { + return iAddr; + } + +// ----------------------------------------------------------------------------- +// CMceLocalAddrResolver::HasIPv4Addr +// ----------------------------------------------------------------------------- +// +TBool CMceLocalAddrResolver::HasIPv4Addr() const + { + return (!iIPv4Addr.IsUnspecified()); + } + +// ----------------------------------------------------------------------------- +// CMceLocalAddrResolver::IPv4Addr +// ----------------------------------------------------------------------------- +// +const TInetAddr& CMceLocalAddrResolver::IPv4Addr() const + { + return iIPv4Addr; + } + +// ----------------------------------------------------------------------------- +// CMceLocalAddrResolver::RefreshLocalAddressesL +// ----------------------------------------------------------------------------- +// +void CMceLocalAddrResolver::RefreshLocalAddressesL() + { + RSocket socket; + User::LeaveIfError( socket.Open( iSocketServ, KAfInet, KSockDatagram, + KProtocolInetUdp ) ); + + iAddr.Init( KAfInet ); + iIPv4Addr.Init( KAfInet ); + + if ( socket.SetOpt( KSoInetEnumInterfaces, KSolInetIfCtrl ) == KErrNone ) + { + TPckgBuf info; + while ( socket.GetOpt( KSoInetNextInterface, + KSolInetIfCtrl, info ) == KErrNone ) + { + TPckgBuf query; + query().iName = info().iName; + if ( socket.GetOpt( KSoInetIfQueryByName, + KSolInetIfQuery, query ) == KErrNone ) + { + if ( Match( info(), query() ) ) + { + SetAddressesIfNotSet( info().iAddress ); + } + } + } + } + + socket.Close(); + } + +// ----------------------------------------------------------------------------- +// CMceLocalAddrResolver::Match +// ----------------------------------------------------------------------------- +// +TBool CMceLocalAddrResolver::Match( + const TSoInetInterfaceInfo& aInfo, + const TSoInetIfQuery& aQuery) const + { + TBool match = EFalse; + if ( !aInfo.iAddress.IsUnspecified() && + !aInfo.iAddress.IsLoopback() && + !aInfo.iAddress.IsLinkLocal() && + aQuery.iZone[1] == iIapId ) + { + match = ETrue; + } + return match; + } + +// ----------------------------------------------------------------------------- +// CMceLocalAddrResolver::SetAddressesIfNotSet +// ----------------------------------------------------------------------------- +// +void CMceLocalAddrResolver::SetAddressesIfNotSet( const TInetAddr& aAddr ) + { + if ( aAddr.Family() == KAfInet ) + { + if ( iAddr.IsUnspecified() ) + { + iAddr = aAddr; + } + iIPv4Addr = aAddr; + } + else + { + iAddr = aAddr; + } + if ( iIPv4Addr.IsUnspecified() && iAddr.IsV4Mapped() ) + { + iIPv4Addr = iAddr; + iIPv4Addr.ConvertToV4(); + } + } +