diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/ConnectionMgr/src/CLocalAddrResolver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/ConnectionMgr/src/CLocalAddrResolver.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,198 @@ +// Copyright (c) 2006-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: +// Name : CLocalAddrResolver.cpp +// Part of : ConnectionMgr +// Version : SIP/5.0 +// + + + + +#include "CLocalAddrResolver.h" +#include "SipLogs.h" + +// ----------------------------------------------------------------------------- +// CLocalAddrResolver::NewL +// ----------------------------------------------------------------------------- +// +CLocalAddrResolver* CLocalAddrResolver::NewL( + RSocketServ& aServer, + RConnection& aConnection ) + { + CLocalAddrResolver* self = NewLC( aServer, aConnection ); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CLocalAddrResolver::NewLC +// ----------------------------------------------------------------------------- +// +CLocalAddrResolver* CLocalAddrResolver::NewLC( + RSocketServ& aServer, + RConnection& aConnection ) + { + CLocalAddrResolver* self = + new( ELeave ) CLocalAddrResolver( aServer, aConnection ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CLocalAddrResolver::CLocalAddrResolver +// ----------------------------------------------------------------------------- +// +CLocalAddrResolver::CLocalAddrResolver( + RSocketServ& aServer, + RConnection& aConnection ) + : iServer( aServer ), + iConnection( aConnection ) + { + } + +// ----------------------------------------------------------------------------- +// CLocalAddrResolver::~CLocalAddrResolver +// ----------------------------------------------------------------------------- +// +CLocalAddrResolver::~CLocalAddrResolver() + { + } + +// ----------------------------------------------------------------------------- +// CLocalAddrResolver::ConstructL +// ----------------------------------------------------------------------------- +// +void CLocalAddrResolver::ConstructL() + { + _LIT( KIap, "IAP\\Id" ); + // The following is done 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. For each CSipConnection instance, their + // iLocalAddrResolver->iIapId will be the correct IAP's ID after the + // following function call is complete. + User::LeaveIfError( iConnection.GetIntSetting( KIap, iIapId ) ); + } + +// ----------------------------------------------------------------------------- +// CLocalAddrResolver::Addr +// ----------------------------------------------------------------------------- +// +const TInetAddr& CLocalAddrResolver::IPv6Addr() const + { + return iIPv6Addr; + } + +// ----------------------------------------------------------------------------- +// CLocalAddrResolver::HasIPv4Addr +// ----------------------------------------------------------------------------- +// +TBool CLocalAddrResolver::HasIPv4Addr() const + { + return ( !iIPv4Addr.IsUnspecified() ); + } + +// ----------------------------------------------------------------------------- +// CLocalAddrResolver::IPv4Addr +// ----------------------------------------------------------------------------- +// +const TInetAddr& CLocalAddrResolver::IPv4Addr() const + { + return iIPv4Addr; + } + +// ----------------------------------------------------------------------------- +// CLocalAddrResolver::IsLocalAddr +// ----------------------------------------------------------------------------- +// +TBool CLocalAddrResolver::IsLocalAddr(const TInetAddr& aAddr) const + { + return ( aAddr.CmpAddr( iIPv6Addr ) || aAddr.CmpAddr( iIPv4Addr ) ); + } + +// ----------------------------------------------------------------------------- +// CLocalAddrResolver::RefreshLocalAddressesL +// ----------------------------------------------------------------------------- +// +void CLocalAddrResolver::RefreshLocalAddressesL() + { + RSocket socket; + User::LeaveIfError( socket.Open( + iServer, KAfInet, KSockDatagram, KProtocolInetUdp, iConnection ) ); + + iIPv6Addr.Init( KAFUnspec ); + iIPv4Addr.Init( KAFUnspec ); + + TInt err = socket.SetOpt( KSoInetEnumInterfaces, KSolInetIfCtrl ); + if ( err == KErrNone ) + { + TPckgBuf info; + err = socket.GetOpt( KSoInetNextInterface, KSolInetIfCtrl, info ); + while ( err == KErrNone ) + { + TPckgBuf query; + query().iName = info().iName; + err = socket.GetOpt( KSoInetIfQueryByName, KSolInetIfQuery, query ); + if ( err == KErrNone ) + { + if ( Match(info(), query() ) ) + { + SetAddress( info().iAddress ); + } + } + err = socket.GetOpt( KSoInetNextInterface, KSolInetIfCtrl, info ); + } + } + socket.Close(); + if ( err == KErrNoMemory ) + { + User::LeaveNoMemory(); + } + } + +// ----------------------------------------------------------------------------- +// CLocalAddrResolver::Match +// ----------------------------------------------------------------------------- +// +TBool CLocalAddrResolver::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; + } + +// ----------------------------------------------------------------------------- +// CLocalAddrResolver::SetAddress +// ----------------------------------------------------------------------------- +// +void CLocalAddrResolver::SetAddress( const TInetAddr& aAddr ) + { + if ( aAddr.Address() != 0 ) + { + iIPv4Addr = aAddr; + iIPv4Addr.ConvertToV4(); + } + else + { + iIPv6Addr = aAddr; + } + }