diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/ServerResolver/src/CSIPQuerySrv.cpp --- /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 +#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 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& 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(); + } +