natfw/natfwclient/src/natfwcandidate.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/natfwclient/src/natfwcandidate.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,585 @@
+/*
+* Copyright (c) 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:    
+*
+*/
+
+
+
+
+
+#include <es_sock.h>
+#include <utf.h>
+#include "natfwcandidate.h"
+#include "natfwclientlogs.h"
+
+// CONSTANTS
+const TInt KMaxLengthOfFQDN = 255;
+_LIT8(KValidFQDNChars,
+      "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-");
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::CNATFWCandidate
+// ---------------------------------------------------------------------------
+//
+CNATFWCandidate::CNATFWCandidate( )
+    :
+    iTransportAddr( KInetAddrNone, 0 ),
+    iBase( KInetAddrNone, 0 )
+    {
+
+    }
+
+
+// ---------------------------------------------------------------------------
+//  CNATFWCandidate::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CNATFWCandidate::ConstructL()
+    {
+    iFoundation.Assign( KNullDesC8().AllocL() );
+    iTransportDomainAddr.Assign( KNullDesC8().AllocL() );
+    iTransportAddr = TInetAddr();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CNATFWCandidate::ConstructL( const CNATFWCandidate& aCandidate )
+    {
+    __NATFWCLIENT( "CNATFWCandidate::ConstructL" )
+
+    iPriority = aCandidate.Priority();
+    iTransportAddr = aCandidate.TransportAddr();
+    iTransportProtocol = aCandidate.TransportProtocol();
+    iTransportDomainAddr.Assign( aCandidate.TransportDomainAddr().AllocL() );
+    iTransportDomainPort = aCandidate.TransportDomainPort();
+    iBase = aCandidate.Base();
+    iFoundation.Assign( aCandidate.Foundation().AllocL() );
+    iType = aCandidate.Type();
+    iComponentId = aCandidate.ComponentId();
+    iSessionId = aCandidate.SessionId();
+    iStreamId = aCandidate.StreamId();
+    iStreamCollectionId = aCandidate.StreamCollectionId();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::NewL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CNATFWCandidate* CNATFWCandidate::NewL()
+    {
+    __NATFWCLIENT("CNATFWCandidate::NewL")
+
+    CNATFWCandidate* self = CNATFWCandidate::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::NewLC
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CNATFWCandidate* CNATFWCandidate::NewLC()
+    {
+    __NATFWCLIENT("CNATFWCandidate::NewLC")
+
+    CNATFWCandidate* self = new( ELeave ) CNATFWCandidate();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::NewL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CNATFWCandidate* CNATFWCandidate::NewL(
+        const CNATFWCandidate& aCandidate )
+    {
+    __NATFWCLIENT("CNATFWCandidate::NewL (copy)")
+
+    CNATFWCandidate* self = CNATFWCandidate::NewLC( aCandidate );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::NewLC
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CNATFWCandidate* CNATFWCandidate::NewLC(
+        const CNATFWCandidate& aCandidate )
+    {
+    __NATFWCLIENT("CNATFWCandidate::NewLC(copy)")
+
+    CNATFWCandidate* self = new ( ELeave ) CNATFWCandidate( );
+    CleanupStack::PushL( self );
+    self->ConstructL( aCandidate );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::~CNATFWCandidate
+// ---------------------------------------------------------------------------
+//
+CNATFWCandidate::~CNATFWCandidate()
+    {
+    __NATFWCLIENT("CNATFWCandidate::~CNATFWCandidate")
+
+    iTransportDomainAddr.Close();
+    iFoundation.Close();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::SessionId
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TUint CNATFWCandidate::SessionId() const
+    {
+    __NATFWCLIENT_INT1( "CNATFWCandidate::SessionId", iSessionId )
+
+    return iSessionId;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::SetSessionId
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CNATFWCandidate::SetSessionId( TUint aId )
+    {
+    __NATFWCLIENT_INT1( "CNATFWCandidate::SetSessionId", aId )
+
+    iSessionId = aId;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::StreamCollectionId
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TUint CNATFWCandidate::StreamCollectionId() const
+    {
+    __NATFWCLIENT_INT1( "CNATFWCandidate::StreamCollectionId",
+        iStreamCollectionId )
+
+    return iStreamCollectionId;
+    }
+
+
+// ---------------------------------------------------------------------------
+// SetStreamCollectionId
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CNATFWCandidate::SetStreamCollectionId( TUint aId )
+    {
+    __NATFWCLIENT_INT1( "CNATFWCandidate::SetStreamCollectionId", aId )
+
+    iStreamCollectionId = aId;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::StreamId
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TUint CNATFWCandidate::StreamId() const
+    {
+    __NATFWCLIENT_INT1( "CNATFWCandidate::StreamId", iStreamId )
+
+    return iStreamId;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::SetStreamId
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CNATFWCandidate::SetStreamId( TUint aId )
+    {
+    __NATFWCLIENT_INT1( "CNATFWCandidate::SetStreamId", aId )
+
+    iStreamId = aId;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::Priority
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TUint CNATFWCandidate::Priority() const
+    {
+    __NATFWCLIENT_INT1( "CNATFWCandidate::Priority", iPriority )
+
+    return iPriority;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::SetPriority
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CNATFWCandidate::SetPriority( TUint aPriority )
+    {
+    __NATFWCLIENT_INT1( "CNATFWCandidate::SetPriority", aPriority )
+
+    iPriority = aPriority;
+    }
+
+
+// ---------------------------------------------------------------------------
+//  CNATFWCandidate::TransportAddr
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TInetAddr& CNATFWCandidate::TransportAddr() const
+    {
+    __NATFWCLIENT_ADDR( "CNATFWCandidate::TransportAddr", iTransportAddr )
+
+    return iTransportAddr;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::SetTransportAddrL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CNATFWCandidate::SetTransportAddrL( const TInetAddr& aAddr )
+    {
+    __NATFWCLIENT_ADDR( "CNATFWCandidate::SetTransportAddrL", aAddr )
+
+    iTransportAddr = aAddr;
+
+    if ( !iTransportDomainAddr.Length() )
+        {
+        // Update domain address as well
+        THostName name;
+        aAddr.Output( name );
+
+        HBufC8* addrBuf = HBufC8::NewLC( name.Length() );
+        TPtr8 addrBufPtr = addrBuf->Des();
+        User::LeaveIfError(
+            CnvUtfConverter::ConvertFromUnicodeToUtf8( addrBufPtr, name ) );
+
+        iTransportDomainAddr.Close();
+        iTransportDomainAddr.Assign( addrBuf ); // takes ownership
+        iTransportDomainPort = aAddr.Port();
+        CleanupStack::Pop( addrBuf );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::TransportDomainAddr
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TDesC8& CNATFWCandidate::TransportDomainAddr() const
+    {
+    __NATFWCLIENT_STR8( "CNATFWCandidate::TransportDomainAddr",
+        iTransportDomainAddr )
+
+    return iTransportDomainAddr;
+    }
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::TransportDomainPort
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TUint CNATFWCandidate::TransportDomainPort() const
+    {
+    __NATFWCLIENT_INT1( "CNATFWCandidate::TransportDomainAddrPort",
+        iTransportDomainPort)
+
+    return iTransportDomainPort;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::SetTransportDomainAddrL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CNATFWCandidate::SetTransportDomainAddrL( const TDesC8& aAddr,
+    TUint aPort )
+    {
+    __NATFWCLIENT_STR( "CNATFWCandidate::SetTransportDomainAddrL - domain",
+        aAddr )
+    __NATFWCLIENT_INT1( "CNATFWCandidate::SetTransportDomainAddrL - port",
+        aPort )
+
+    // Verify that the domain name doesn't exceed maximum length for FQDNs
+    if ( KMaxLengthOfFQDN < aAddr.Length() )
+        {
+        User::Leave( KErrOverflow );
+        }
+
+    // Verify that the domain name contains only valid FQDN characters
+    for ( TInt i( 0 ); i < aAddr.Length(); i++ )
+        {
+        if ( KErrNotFound == KValidFQDNChars().Locate( aAddr[ i ] ) )
+            {
+            User::Leave( KErrArgument );
+            }
+        }
+
+    iTransportDomainAddr.Close();
+    iTransportDomainAddr.Assign( aAddr.AllocL() );
+    iTransportDomainPort = aPort;
+
+    TInetAddr addr;
+    HBufC* addrBuf = HBufC::NewLC( aAddr.Length() );
+    TPtr addrPtr( addrBuf->Des() );
+    User::LeaveIfError(
+        CnvUtfConverter::ConvertToUnicodeFromUtf8( addrPtr, aAddr ) );
+
+    if ( !addr.Input( addrPtr ) )
+        {
+        // This is a valid IP address so set the transport address as well
+        iTransportAddr = addr;
+        iTransportAddr.SetPort( aPort );
+        __NATFWCLIENT_ADDR(
+            "CNATFWCandidate::SetTransportDomainAddrL: IP now",
+                iTransportAddr )
+        }
+
+    CleanupStack::PopAndDestroy( addrBuf );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::TransportProtocol
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TUint CNATFWCandidate::TransportProtocol() const
+    {
+    __NATFWCLIENT_INT1( "CNATFWCandidate::TransportProtocol",
+        iTransportProtocol )
+
+    return iTransportProtocol;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::SetTransportProtocol
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CNATFWCandidate::SetTransportProtocol(
+        TUint aTransportProtocol )
+    {
+    __NATFWCLIENT_INT1( "CNATFWCandidate::SetTransportProtocol",
+        aTransportProtocol )
+
+    iTransportProtocol = aTransportProtocol;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::Base
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TInetAddr& CNATFWCandidate::Base() const
+    {
+    __NATFWCLIENT_ADDR( "CNATFWCandidate::Base", iBase )
+
+    return iBase;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::SetBase
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CNATFWCandidate::SetBase( const TInetAddr& aBase )
+    {
+    __NATFWCLIENT_ADDR( "CNATFWCandidate::SetBase", aBase )
+
+    iBase = aBase;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::Foundation
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TDesC8& CNATFWCandidate::Foundation() const
+    {
+    __NATFWCLIENT_STR8( "CNATFWCandidate::Foundation", iFoundation )
+
+    return iFoundation;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::SetFoundationL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CNATFWCandidate::SetFoundationL( const TDesC8& aFoundation )
+    {
+    __NATFWCLIENT_STR8( "CNATFWCandidate::SetFoundationL", aFoundation )
+
+    iFoundation.Close();
+    iFoundation.Assign( aFoundation.AllocL() );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::Type
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CNATFWCandidate::TCandidateType CNATFWCandidate::Type() const
+    {
+    __NATFWCLIENT_INT1( "CNATFWCandidate::Type", iType )
+
+    return iType;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::SetType
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CNATFWCandidate::SetType(
+        CNATFWCandidate::TCandidateType aType )
+    {
+    __NATFWCLIENT_INT1( "CNATFWCandidate::SetType", aType )
+
+    iType = aType;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::ComponentId
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TUint CNATFWCandidate::ComponentId() const
+    {
+    __NATFWCLIENT_INT1( "CNATFWCandidate::ComponentId", iComponentId )
+
+    return iComponentId;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::SetComponentId
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CNATFWCandidate::SetComponentId( TUint aComponentId)
+    {
+    __NATFWCLIENT_INT1( "CNATFWCandidate::SetComponentId", aComponentId )
+
+    iComponentId = aComponentId;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::CompareFoundations
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CNATFWCandidate::CompareFoundations(
+    const CNATFWCandidate& aSource, const CNATFWCandidate& aTarget )
+    {
+    __NATFWCLIENT( "CNATFWCandidate::CompareFoundations" )
+
+    return ( aSource.iFoundation == aTarget.iFoundation );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::PriorityOrder
+// Implements TLinearOrder.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CNATFWCandidate::PriorityOrder( const CNATFWCandidate& aC1,
+        const CNATFWCandidate& aC2 )
+    {
+    return ( aC2.iPriority - aC1.iPriority );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::CopyL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CNATFWCandidate::CopyL( const CNATFWCandidate& aCandidate )
+    {
+    iPriority = aCandidate.Priority();
+    iTransportAddr = aCandidate.TransportAddr();
+    iTransportProtocol = aCandidate.TransportProtocol();
+    iTransportDomainAddr.Close();
+    iTransportDomainAddr.Assign( aCandidate.TransportDomainAddr().AllocL() );
+    iTransportDomainPort = aCandidate.TransportDomainPort();
+    iBase = aCandidate.Base();
+    iFoundation.Close();
+    iFoundation.Assign( aCandidate.Foundation().AllocL() );
+    iType = aCandidate.Type();
+    iComponentId = aCandidate.ComponentId();
+    iSessionId = aCandidate.SessionId();
+    iStreamId = aCandidate.StreamId();
+    iStreamCollectionId = aCandidate.StreamCollectionId();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::operator==
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CNATFWCandidate::operator==(
+        const CNATFWCandidate& aCandidate ) const
+    {
+    return (
+        iPriority == aCandidate.Priority()
+        && iTransportAddr.CmpAddr( aCandidate.TransportAddr() )
+        && iTransportDomainAddr == aCandidate.TransportDomainAddr()
+        && iTransportDomainPort == aCandidate.TransportDomainPort()
+        && iTransportProtocol == aCandidate.TransportProtocol()
+        && iBase.CmpAddr( aCandidate.Base() )
+        && iFoundation == aCandidate.Foundation()
+        && iType == aCandidate.Type()
+        && iComponentId == aCandidate.ComponentId()
+        && iSessionId == aCandidate.SessionId()
+        && iStreamId == aCandidate.StreamId()
+        && iStreamCollectionId == aCandidate.StreamCollectionId() );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CNATFWCandidate::operator!=
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CNATFWCandidate::operator!=(
+        const CNATFWCandidate& aCandidate ) const
+    {
+    return (
+        iPriority != aCandidate.Priority()
+        || !iTransportAddr.CmpAddr( aCandidate.TransportAddr() )
+        || iTransportDomainAddr != aCandidate.TransportDomainAddr()
+        || iTransportDomainPort != aCandidate.TransportDomainPort()
+        || iTransportProtocol != aCandidate.TransportProtocol()
+        || !iBase.CmpAddr( aCandidate.Base() )
+        || iFoundation != aCandidate.Foundation()
+        || iType != aCandidate.Type()
+        || iComponentId != aCandidate.ComponentId()
+        || iSessionId != aCandidate.SessionId()
+        || iStreamId != aCandidate.StreamId()
+        || iStreamCollectionId != aCandidate.StreamCollectionId() );
+    }