natfw/natfwunsaf_protocols/unsaf_transport/src/cnatfwunsafquerysrv.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/natfw/natfwunsaf_protocols/unsaf_transport/src/cnatfwunsafquerysrv.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,270 @@
+/*
+* Copyright (c) 2006-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 "cnatfwunsafquerysrv.h"
+#include "mnatfwunsafhostresolver.h"
+
+_LIT8(KDot8, ".");
+_LIT8(KUnderLine8, "_");
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::CNATFWUNSAFQuerySrv
+// ----------------------------------------------------------------------------
+//
+CNATFWUNSAFQuerySrv::CNATFWUNSAFQuerySrv()
+:CNATFWUNSAFQueryBase()
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::ConstructL
+// ----------------------------------------------------------------------------
+//
+void CNATFWUNSAFQuerySrv::ConstructL( const TDesC8& aTarget )
+    {
+    SetTargetL( aTarget );
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::NewL
+// ----------------------------------------------------------------------------
+//
+CNATFWUNSAFQuerySrv* CNATFWUNSAFQuerySrv::NewL( const TDesC8& aTarget )
+    {
+    CNATFWUNSAFQuerySrv* self = new ( ELeave ) CNATFWUNSAFQuerySrv();
+    CleanupStack::PushL( self );
+    self->ConstructL( aTarget );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::~CNATFWUNSAFQuerySrv
+// ----------------------------------------------------------------------------
+//
+CNATFWUNSAFQuerySrv::~CNATFWUNSAFQuerySrv()
+    {
+    delete iTarget;
+    iRecordArray.Reset();
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::SetTargetProtocolL
+// ----------------------------------------------------------------------------
+//
+HBufC8* CNATFWUNSAFQuerySrv::SetTargetProtocolL( const TDesC8& aTarget,
+                                            const TDesC8& aProtocol,
+                                            const TDesC8& aServiceName )
+    {
+    HBufC8* temp = HBufC8::NewLC( KUnderLine8().Length() +
+                                  aServiceName.Length()  +
+                                  KDot8().Length()       +
+                                  KUnderLine8().Length() +
+                                  aProtocol.Length()     +
+                                  KDot8().Length()       +
+                                  aTarget.Length() );
+
+    TPtr8 tempPtr = temp->Des();
+    tempPtr.Append( KUnderLine8 );
+    tempPtr.Append( aServiceName );
+    tempPtr.Append( KDot8 );
+    tempPtr.Append( KUnderLine8 );
+    tempPtr.Append( aProtocol );
+    tempPtr.Append( KDot8 );
+    tempPtr.Append( aTarget );
+    CleanupStack::Pop( temp );
+    return temp;
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::AddL
+// ----------------------------------------------------------------------------
+//
+void CNATFWUNSAFQuerySrv::AddL( const TDnsRespSRV& aSrv )
+    {
+    TLinearOrder<TDnsRespSRV> order( CNATFWUNSAFQuerySrv::Compare );
+    User::LeaveIfError(
+        iRecordArray.InsertInOrderAllowRepeats( aSrv, order ) );
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::SetTargetL
+// ----------------------------------------------------------------------------
+//
+void CNATFWUNSAFQuerySrv::SetTargetL( const TDesC8& aTarget )
+    {
+    const TInt KMaxlength(256);
+    __ASSERT_ALWAYS ( aTarget.Length() > 0, User::Leave( KErrArgument ) );
+    __ASSERT_ALWAYS ( aTarget.Length() < KMaxlength, User::Leave( KErrArgument ) );
+    HBufC8* temp = aTarget.AllocL();
+    delete iTarget;
+    iTarget = temp;
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::RecordArray
+// ----------------------------------------------------------------------------
+//
+RArray<TDnsRespSRV>& CNATFWUNSAFQuerySrv::RecordArray()
+    {
+    return iRecordArray;
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::SRVRecordL
+// ----------------------------------------------------------------------------
+//
+TDnsRespSRV& CNATFWUNSAFQuerySrv::SRVRecordL( TInt aIndex )
+    {
+    __ASSERT_ALWAYS ( aIndex < iRecordArray.Count(),
+                      User::Leave( KErrArgument ) );
+
+    return iRecordArray[aIndex];
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::Compare
+// ----------------------------------------------------------------------------
+//
+TInt CNATFWUNSAFQuerySrv::Compare( const TDnsRespSRV& aFirst,
+                            const TDnsRespSRV& aSecond )
+    {
+    if ( aFirst.Priority() < aSecond.Priority() )
+        {
+        return -1;
+        }
+    if ( aFirst.Priority() > aSecond.Priority() )
+        {
+        return 1;
+        }
+    if ( aFirst.Priority() == aSecond.Priority() )
+        {
+        if ( aSecond.Weight() == 0 )
+            {
+            return -1;
+            }
+        else
+            {
+            return 1;
+            }
+        }
+    return 0;
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::QueryBuf
+// ----------------------------------------------------------------------------
+//
+const TDesC8& CNATFWUNSAFQuerySrv::QueryBuf()
+    {
+    TDnsQuery query( *iTarget, KDnsRRTypeSRV );
+    TDnsQueryBuf querybuf( query );
+    return iQueryBuf = querybuf;
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::QueryResultBuf
+// ----------------------------------------------------------------------------
+//
+TDes8& CNATFWUNSAFQuerySrv::QueryResultBuf()
+    {
+    return iResult;
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::QueryResult
+// ----------------------------------------------------------------------------
+//
+TDnsRespSRV CNATFWUNSAFQuerySrv::QueryResult()
+    {
+    return iResult();
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::Query
+// ----------------------------------------------------------------------------
+//
+void CNATFWUNSAFQuerySrv::Query( MNATFWUNSAFHostResolver& aResolver )
+    {
+    aResolver.Resolver().Query( QueryBuf(),
+                                QueryResultBuf(),
+                                aResolver.RequestStatus() );
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::HandleQueryResultL
+// ----------------------------------------------------------------------------
+//
+void CNATFWUNSAFQuerySrv::HandleQueryResultL(
+    MNATFWUNSAFHostResolver& aResolver )
+    {
+    if ( QueryResult().Target().CompareF( KDot8 ) != KErrNone )
+        {
+        AddL( QueryResult() );
+        }
+
+    while ( aResolver.Resolver().QueryGetNext( QueryResultBuf() )
+                                                == KErrNone )
+        {
+        if ( QueryResult().Target().CompareF( KDot8 ) != KErrNone )
+            {
+            //Records are sorted in right order in inserting phase
+            AddL( QueryResult() );
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::ResultTargetL
+// ----------------------------------------------------------------------------
+//
+const TDesC8& CNATFWUNSAFQuerySrv::ResultTargetL()
+    {
+    return SRVRecordL( 0 ).Target();
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::ResultPortL
+// ----------------------------------------------------------------------------
+//
+TUint CNATFWUNSAFQuerySrv::ResultPortL()
+    {
+    return SRVRecordL( 0 ).Port();
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::RemoveElementL
+// ----------------------------------------------------------------------------
+//
+void CNATFWUNSAFQuerySrv::RemoveElementL( TInt aIndex )
+    {
+    if ( aIndex < iRecordArray.Count() && aIndex >= 0 )
+        {
+        iRecordArray.Remove( aIndex );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CNATFWUNSAFQuerySrv::ArrayCountL
+// ----------------------------------------------------------------------------
+//
+TUint CNATFWUNSAFQuerySrv::ArrayCountL()
+    {
+    return iRecordArray.Count();
+    }
+