realtimenetprots/sipfw/SIP/ServerResolver/src/CSIPQuerySrv.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/ServerResolver/src/CSIPQuerySrv.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,305 @@
+// Copyright (c) 2004-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          : CSIPQuerySrv.cpp
+// Part of       : ServerResolver
+// Version       : SIP/4.0 
+//
+
+
+
+#include <stringpool.h>
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+#include "CSIPQuerySrv.h"
+#include "MSIPHostResolver.h"
+
+_LIT8(KDot8, ".");
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::CSIPQuerySrv
+// ----------------------------------------------------------------------------
+//
+CSIPQuerySrv::CSIPQuerySrv(TBool aSipsUri)
+:CSIPQueryBase(), iSipsUri(aSipsUri)
+	{
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::ConstructL
+// ----------------------------------------------------------------------------
+//
+void CSIPQuerySrv::ConstructL( const TDesC8& aTarget )
+	{
+ 	SetTargetL( aTarget );
+	}
+	
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::NewL
+// ----------------------------------------------------------------------------
+//
+CSIPQuerySrv* CSIPQuerySrv::NewL( const TDesC8& aTarget, TBool aSipsUri )
+	{
+	CSIPQuerySrv* self = new ( ELeave ) CSIPQuerySrv(aSipsUri);
+	CleanupStack::PushL( self );
+	self->ConstructL( aTarget );
+	CleanupStack::Pop( self );
+	return self;
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::~CSIPQuerySrv
+// ----------------------------------------------------------------------------
+//
+CSIPQuerySrv::~CSIPQuerySrv()
+	{
+	delete iTarget;
+	iRecordArray.Reset();
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::SetTargetProtocolL
+// ----------------------------------------------------------------------------
+//
+HBufC8* CSIPQuerySrv::SetTargetProtocolL( const TDesC8& aTarget,
+										  RStringF aProtocol,
+										  TBool aIsSipsUri )
+	{
+	_LIT8(Ksipudp, "_sip._udp.");
+	_LIT8(Ksiptcp, "_sip._tcp.");
+	_LIT8(Ksipstcp, "_sips._tcp.");
+	TUint32 len = aTarget.Length() + Ksipudp().Length();
+	if (aIsSipsUri)
+		{
+		len++;
+		}
+	HBufC8* temp =  HBufC8::NewLC( len );
+	TPtr8 tempPtr = temp->Des();
+	if (aIsSipsUri)
+		{
+		// If SIPS URI, ignore the value of aProtocol. and act always as
+		// transport is TLS (Ksipstcp)
+		tempPtr.Append( Ksipstcp );
+		}
+
+	else if ( aProtocol == SIPStrings::StringF( SipStrConsts::ETCP ) )
+		{
+		tempPtr.Append( Ksiptcp );
+		}
+		else if ( aProtocol == SIPStrings::StringF( SipStrConsts::EUDP ) )
+			{
+			tempPtr.Append( Ksipudp );
+			}
+			else
+				{
+				User::Leave( KErrNotSupported );
+				}
+	tempPtr.Append( aTarget );
+	CleanupStack::Pop( temp );
+	return temp;
+	}
+	
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::SetTargetTLSL
+// ----------------------------------------------------------------------------
+//
+HBufC8* CSIPQuerySrv::SetTargetTLSL( const TDesC8& aTarget )
+	{
+	_LIT8(Ksiptls, "_sip._tls.");
+	TUint32 len = aTarget.Length() + Ksiptls().Length();
+	HBufC8* temp =  HBufC8::NewLC( len );
+	TPtr8 tempPtr = temp->Des();
+	tempPtr.Append( Ksiptls );
+	tempPtr.Append( aTarget );
+	CleanupStack::Pop( temp );
+	return temp;
+	}
+	
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::AddL
+// ----------------------------------------------------------------------------
+//
+void CSIPQuerySrv::AddL( TDnsRespSRV aSrv )
+	{
+	TLinearOrder<TDnsRespSRV> order( CSIPQuerySrv::Compare );
+	User::LeaveIfError( iRecordArray.InsertInOrderAllowRepeats( aSrv, order ) );
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::SetTargetL
+// ----------------------------------------------------------------------------
+//
+void CSIPQuerySrv::SetTargetL( const TDesC8& aTarget )
+	{
+	__ASSERT_ALWAYS ( aTarget.Length() > 0, User::Leave( KErrArgument ) );
+
+	// KQueryDataMaxLength is same as TDnsQryData's max length in dns_qry.h
+	const TInt KQueryDataMaxLength = 255; 	
+	__ASSERT_ALWAYS ( aTarget.Length() < KQueryDataMaxLength, 
+					User::Leave( KErrArgument ) );
+
+	HBufC8* temp = aTarget.AllocL();
+	delete iTarget;
+	iTarget = temp;
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::RecordArray
+// ----------------------------------------------------------------------------
+//
+RArray<TDnsRespSRV>& CSIPQuerySrv::RecordArray()
+	{
+	return iRecordArray;
+	} 
+
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::SRVRecordL
+// ----------------------------------------------------------------------------
+//
+TDnsRespSRV& CSIPQuerySrv::SRVRecordL( TInt aIndex )
+	{
+	__ASSERT_ALWAYS ( aIndex < iRecordArray.Count(), 
+					  User::Leave( KErrArgument ) );
+					  
+	return iRecordArray[aIndex];
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::Compare
+// ----------------------------------------------------------------------------
+//
+TInt CSIPQuerySrv::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;
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::QueryBuf
+// ----------------------------------------------------------------------------
+//
+const TDesC8& CSIPQuerySrv::QueryBuf()
+	{
+	TDnsQuery query( *iTarget, KDnsRRTypeSRV );
+	TDnsQueryBuf querybuf( query );
+	return iQueryBuf = querybuf;
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::QueryResultBuf
+// ----------------------------------------------------------------------------
+//
+TDes8& CSIPQuerySrv::QueryResultBuf()
+	{
+	return iResult;
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::QueryResult
+// ----------------------------------------------------------------------------
+//
+TDnsRespSRV CSIPQuerySrv::QueryResult()
+	{
+	return iResult();
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::Query
+// ----------------------------------------------------------------------------
+//
+void CSIPQuerySrv::Query( MSIPHostResolver& aResolver )
+	{
+	aResolver.Resolver().Query( QueryBuf(), 
+								QueryResultBuf(), 
+								aResolver.RequestStatus() );	
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::HandleQueryResultL
+// ----------------------------------------------------------------------------
+//
+void CSIPQuerySrv::HandleQueryResultL( MSIPHostResolver& 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() );
+			}
+		}
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::ResultTargetL
+// ----------------------------------------------------------------------------
+//
+const TDesC8& CSIPQuerySrv::ResultTargetL()
+	{
+	return SRVRecordL( 0 ).Target();
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::ResultPortL
+// ----------------------------------------------------------------------------
+//
+TUint CSIPQuerySrv::ResultPortL() 
+	{
+	return SRVRecordL( 0 ).Port();
+	}
+	
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::RemoveElementL
+// ----------------------------------------------------------------------------
+//
+void CSIPQuerySrv::RemoveElementL( TInt aIndex )
+	{
+	if ( aIndex < iRecordArray.Count() && aIndex >= 0 )
+		{
+		iRecordArray.Remove( aIndex );
+		}
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPQuerySrv::ArrayCount
+// ----------------------------------------------------------------------------
+//
+TInt CSIPQuerySrv::ArrayCount() 
+	{
+	return iRecordArray.Count();
+	}
+