upnp/upnpstack/upnputils/src/upnpipaddressutils.cpp
changeset 0 f5a58ecadc66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnp/upnpstack/upnputils/src/upnpipaddressutils.cpp	Tue Feb 02 01:12:20 2010 +0200
@@ -0,0 +1,246 @@
+/** @file
+* Copyright (c) 2005-2006 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:  IP Address utils
+*
+*/
+
+
+// INCLUDES
+#include <e32base.h>
+#include <commdb.h>
+#include <in_sock.h>
+#include "upnpipaddressutils.h"
+#define KLogFile _L("DLNAWebServer.txt")
+#include "upnpcustomlog.h"
+
+// ================= MEMBER FUNCTIONS =======================
+namespace UpnpIpAddressUtil
+    {
+// -----------------------------------------------------------------------------
+// UpnpIpAddressUtil::GetIfNameForIap
+// Reads the IF name for the specified IAP ID.
+// -----------------------------------------------------------------------------
+//
+    EXPORT_C void GetIfNameForIap( TUint32 aIapId, TDes& aIfName )
+        {
+        CCommsDatabase* theDb;
+        TUint32 iapId;
+        TBool nameNotFound = ETrue;
+
+        // First zero the name. If IF Name is not found, it will be zero lenght.
+        aIfName.Zero();
+
+        // Open CommDB
+        theDb = CCommsDatabase::NewL( EDatabaseTypeIAP );
+        CleanupStack::PushL( theDb );
+
+        theDb->ShowHiddenRecords();
+
+        // Open IAP table and find the IAP ID given as method parameter.
+        CCommsDbTableView* view = theDb->OpenTableLC( TPtrC( IAP ) );
+        TInt res = view->GotoFirstRecord();
+        while ( res == KErrNone && nameNotFound )
+            {
+            // Read IAP ID and match it to the one given as parameter
+            view->ReadUintL( TPtrC( COMMDB_ID ), iapId );
+            if ( iapId == aIapId )
+                {
+                // Right IAP found, read bearer ID and type
+                TUint32 iapBearerId;
+                view->ReadUintL( TPtrC( IAP_BEARER ),iapBearerId );
+                view->ReadTextL( TPtrC( IAP_BEARER_TYPE ),aIfName );
+
+                // Find the correct bearer table specified by bearer type
+                CCommsDbTableView* ifView = theDb->OpenTableLC( 
+                    TPtrC( aIfName ) );
+                TInt bearerRes = ifView->GotoFirstRecord();
+                TUint32 bearerId;
+                while ( bearerRes == KErrNone && nameNotFound )
+                    {
+                    ifView->ReadUintL( TPtrC( COMMDB_ID ), bearerId );
+                    // Find out right bearer record and read IF name
+                    if ( bearerId == iapBearerId )
+                        {
+                        // Read the IF name, it is returned in the method
+                        // parameter
+                        ifView->ReadTextL( TPtrC( IF_NAME ),aIfName );
+                        nameNotFound = EFalse;
+                        }
+                    // Bearer id does not match, check next record
+                    else
+                        {
+                        bearerRes = ifView->GotoNextRecord();
+                        }
+                    }
+                CleanupStack::PopAndDestroy( ifView );
+                }
+            // IAP id does not match, check next record
+            else
+                {
+                res = view->GotoNextRecord();
+                }
+            }
+        CleanupStack::PopAndDestroy( view );
+        CleanupStack::PopAndDestroy( theDb );
+        }
+
+// -----------------------------------------------------------------------------
+// UpnpFileUtil::MatchIfNameWithIpInterface
+// Matches IF name with IP address of the TCP/IP stack interfaces.
+// -----------------------------------------------------------------------------
+//
+    EXPORT_C TInetAddr MatchIfNameWithIpInterface( RSocketServ& aSocketServer,
+                                                   TDesC& aIfName,
+                                                   TInt& aInterfaceIndex )
+        {
+        // Buffer for IP address
+        const TUint KAddrOutputLength = 50;
+        TBuf<KAddrOutputLength> address;
+        TPckgBuf<TSoInetInterfaceInfo> info;
+        TInetAddr localIpAddress;        
+        TInetAddr autoIpAddress;
+        TInt autoIfIndex = 0;
+        RSocket sock;
+        TBool autoIpFound = EFalse;
+        TBool ipFound = EFalse;
+
+        _LIT( KUdpProtocol, "udp" );
+        _LIT( KLoop4Interface, "loop4" );
+        _LIT( KLoop6Interface, "loop6" );
+        _LIT( KNoAddress, "0.0.0.0");
+        _LIT( KLocalHost, "127.0.0.1");
+        _LIT( KWlanIPv6IfSearchString, "wlan6[*");
+        _LIT( KWlanIPv4IfSearchString, "wlan[*");
+        _LIT( KWlanIfMatchString, "wlan*");
+        _LIT( KEtherIfSearchString, "eth[*");
+        _LIT( KEtherIfMatchString, "eth*");
+        // BT PAN is the same for both info and NIF name
+        _LIT( KBtPanIfSearchString, "btpannif*");
+        _LIT( KAutoIpMatch, "169.254.*");
+        
+        //the default interface index
+        aInterfaceIndex = 0;
+        
+        TInt ret= sock.Open( aSocketServer, KUdpProtocol );
+        if ( KErrNone == ret )
+            {
+            ret = sock.SetOpt( KSoInetEnumInterfaces, KSolInetIfCtrl );
+            }
+
+        if ( KErrNone == ret )
+            {
+            while( KErrNone == sock.GetOpt( 
+                       KSoInetNextInterface, KSolInetIfCtrl, info ) )
+                {
+
+                // If state is up and name is not empty, loop4 or loop6, 
+                // then get the address
+                if ( ( EIfUp == info().iState ) &&
+                     ( 0 != info().iName.Length() ) &&
+                     ( 0 != info().iName.Match( KLoop4Interface ) ) && 
+                     ( 0 != info().iName.Match( KLoop6Interface ) ) )
+                    {
+                    // Check if we have valid IP
+                    address.Zero();
+                    info().iAddress.Output( address );
+
+                    if ( ( 0 < address.Length() ) && 
+                         ( 0 != address.Match( KNoAddress ) ) &&
+                         ( 0 != address.Match( KLocalHost ) ) )
+                        {
+                        
+                        // read index of interface 
+                                        
+                        TPckgBuf<TSoInetIfQuery> query;
+    					query().iName = info().iName;
+    					
+    					TInt index;
+    					ret=sock.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, query);
+    					if(KErrNone==ret)
+    					    {
+    					    index = query().iIndex;
+                   
+                            // For ethernet, WLAN and BT PAN interfaces, 
+                            // change the match string to suit right interfaces
+                            if ( 0 <= info().iName.MatchC( KEtherIfSearchString ) )
+                                {
+                                // Set the IF name for ETH Match operation below.
+                                info().iName.Copy( KEtherIfMatchString );
+                                }
+                            else if ( 0 <= info().iName.MatchC( 
+                                KWlanIPv4IfSearchString ) )
+                                {
+                                // Set the IF name for WLAN Match operation below.
+                                info().iName.Copy( KWlanIfMatchString );
+                                }
+                            else if ( 0 <= info().iName.MatchC( 
+                                    KBtPanIfSearchString ) )
+                                {
+                                // Set the IF name for BT PAN Match operation below.
+                                info().iName.Copy( KBtPanIfSearchString );
+                                }
+
+                            // Exlude IPv6 addresses, they are not supported.
+                            // If IF name matches with the one given as parameter,
+                            // then we have the same interface with IP.
+                            if ( ( 0 > info().iName.MatchC( KWlanIPv6IfSearchString ) ) &&
+                                 ( 0 <= aIfName.MatchC( info().iName ) ) )
+                                {
+                                // If the address is auto-ip, check whether there 
+                                // is also DHCP IP in the same interface.
+                                if ( 0 <= address.Match( KAutoIpMatch ) )
+                                    {
+                                    autoIpFound = ETrue;
+                                    autoIpAddress = info().iAddress;
+                                    autoIpAddress.ConvertToV4();
+                                    autoIfIndex = index;
+                                    }
+                                // Other than auto IP
+                                else
+                                    {
+                                    ipFound = ETrue;
+                                    localIpAddress = info().iAddress;
+                                    // we're using ipv4 addresses
+                                    localIpAddress.ConvertToV4();
+                                    aInterfaceIndex = index;
+                                    }
+                                }
+    					    }
+                        }
+                    }
+                }
+            }
+        sock.Close();
+
+        // If only auto-IP was found, then return it.
+        // If only DHCP IP was found or also auto-IP, then return the
+        // DHCP IP which is already placed in localIpAddress variable.
+        // It is not possible that there is no IP as the connection has
+        // been started already by the UPnP application and this method can't
+        // be called if there is no connection.
+        if ( !ipFound && autoIpFound )
+            {
+            localIpAddress = autoIpAddress;
+            aInterfaceIndex = autoIfIndex;
+            }
+
+        address.Zero();
+        localIpAddress.Output( address );
+
+        // return the address
+        return localIpAddress;
+        }
+    }
+
+//  End of File