diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/ClientResolver/Resolver/src/CSipHeaderStrategyBase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/ClientResolver/Resolver/src/CSipHeaderStrategyBase.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,273 @@ +// Copyright (c) 2005-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 : CSipHeaderStrategyBase.cpp +// Part of : SIP Client Resolver +// Version : 1.0 +// + + + +#include "CSipHeaderStrategyBase.h" +#include "MSipClient.h" +#include "MSipClients.h" +#include "siprequest.h" +#include "sipstrings.h" +#include "sipstrconsts.h" +#include "sipcontenttypeheader.h" +#include "CSIPClientResolver2.h" +#include "uricontainer.h" +#include "SIPCRLogs.h" +#include "TSipClient.h" + +// ---------------------------------------------------------------------------- +// CSipHeaderStrategyBase::~CSipHeaderStrategyBase +// ---------------------------------------------------------------------------- +// +CSipHeaderStrategyBase::~CSipHeaderStrategyBase() + { + } + +// ---------------------------------------------------------------------------- +// CSipHeaderStrategyBase::CSipHeaderStrategyBase +// ---------------------------------------------------------------------------- +// +CSipHeaderStrategyBase::CSipHeaderStrategyBase( + MSipClients& aSipClients, + CSipHeaderStrategyBase* aNextStrategy, + CSipHeaderStrategyBase* aNextStrategy2 ) +: iSipClients( aSipClients ), + iNextStrategy( aNextStrategy ), + iNextStrategy2( aNextStrategy2 ) + { + } + +// ---------------------------------------------------------------------------- +// CSipHeaderStrategyBase::MatchClientsL +// ---------------------------------------------------------------------------- +// +CSIPResponse* CSipHeaderStrategyBase::MatchClientsL( + CSIPRequest& aRequest, + RArray& aUids ) + { + SIP_CR_LOG("CSipHeaderStrategyBase::MatchClientsL") + EliminateClientsL( aRequest,aUids ); + if ( aUids.Count() == 0 ) + { + return CreateResponseL(); + } + return NULL; + } + +// ---------------------------------------------------------------------------- +// CSipHeaderStrategyBase::MatchClients2L +// ---------------------------------------------------------------------------- +// +CSIPResponse* CSipHeaderStrategyBase::MatchClients2L( + CSIPRequest& aRequest, + RArray& aUids, + TBool& aContinueSearch, + CSIPClientResolver2& aClientResolver2 ) + { + SIP_CR_LOG("CSipHeaderStrategyBase::MatchClients2L") + CSIPResponse* response = NULL; + aClientResolver2.FetchMatchingUidsL( aRequest, *this ); + response = NoMatchL( aRequest,aUids,aContinueSearch,aClientResolver2 ); + if ( !response ) + { + response = MoreThanOneMatchL( aRequest,aUids,aContinueSearch, + aClientResolver2 ); + } + return response; + } + +// ---------------------------------------------------------------------------- +// CSipHeaderStrategyBase::MatchL +// ---------------------------------------------------------------------------- +// +TBool CSipHeaderStrategyBase::MatchL( CSIPResolvedClient2& aClient, + CSIPRequest& aRequest, + TUid& aUid ) + { + CUri8* uri8 = ConvertRequestUriL( aRequest ); + CleanupStack::PushL( uri8 ); + TBool match( EFalse ); + match = MatchResolvedClientL( aClient,aRequest,aUid,*uri8 ); + CleanupStack::PopAndDestroy( uri8 ); + return match; + } + +// ---------------------------------------------------------------------------- +// CSipHeaderStrategyBase::ConvertRequestUriL +// ---------------------------------------------------------------------------- +// +CUri8* CSipHeaderStrategyBase::ConvertRequestUriL( CSIPRequest& aRequest ) + { + CUri8* uri8 = NULL; + __ASSERT_ALWAYS(aRequest.RequestURI(), User::Leave(KErrCorrupt)); + HBufC8* temp = aRequest.RequestURI()->ToTextL(); + CleanupStack::PushL( temp ); + TUriParser8 parser; + User::LeaveIfError( parser.Parse( *temp) ); + uri8 = CUri8::NewL( parser ); + CleanupStack::PopAndDestroy( temp ); + return uri8; + } + +// ---------------------------------------------------------------------------- +// CSipHeaderStrategyBase::NextStrategyL +// ---------------------------------------------------------------------------- +// +CSIPResponse* CSipHeaderStrategyBase::NextStrategyL( CSIPRequest& aRequest, + RArray& aUids, + TBool& aContinueSearch, + CSIPClientResolver2& aClientResolver2 ) + { + SIP_CR_LOG("CSipHeaderStrategyBase::NextStrategyL") + CSIPResponse* response = NULL; + if ( iNextStrategy ) + { + response = iNextStrategy->ApplyL( aRequest,aUids,aContinueSearch, + aClientResolver2 ); + } + return response; + } + +// ---------------------------------------------------------------------------- +// CSipHeaderStrategyBase::NextStrategy2L +// ---------------------------------------------------------------------------- +// +CSIPResponse* CSipHeaderStrategyBase::NextStrategy2L( + CSIPRequest& aRequest, + RArray& aUids, + TBool& aContinueSearch, + CSIPClientResolver2& aClientResolver2 ) + { + SIP_CR_LOG("CSipHeaderStrategyBase::NextStrategy2L") + CSIPResponse* response = NULL; + if ( iNextStrategy2 ) + { + response = iNextStrategy2->ApplyL( aRequest,aUids,aContinueSearch, + aClientResolver2 ); + } + return response; + } + +// ---------------------------------------------------------------------------- +// CSipHeaderStrategyBase::NoMatchL +// ---------------------------------------------------------------------------- +// +CSIPResponse* CSipHeaderStrategyBase::NoMatchL( + CSIPRequest& aRequest, + RArray& aUids, + TBool& aContinueSearch, + CSIPClientResolver2& aClientResolver2 ) + { + SIP_CR_LOG("CSipHeaderStrategyBase::NoMatchL") + CSIPResponse* response = NULL; + if ( !aClientResolver2.ClientsData().Count() ) + { + response = NextStrategy2L( aRequest,aUids,aContinueSearch, + aClientResolver2 ); + } + return response; + } + +// ---------------------------------------------------------------------------- +// CSipHeaderStrategyBase::MoreThanOneMatchL +// ---------------------------------------------------------------------------- +// +CSIPResponse* CSipHeaderStrategyBase::MoreThanOneMatchL( CSIPRequest& aRequest, + RArray& aUids, + TBool& aContinueSearch, + CSIPClientResolver2& aClientResolver2 ) + { + SIP_CR_LOG("CSipHeaderStrategyBase::MoreThanOneMatchL") + CSIPResponse* response = NULL; + if ( iNextStrategy && aClientResolver2.ClientsData().Count() > 1 ) + { + response = NextStrategyL( aRequest,aUids,aContinueSearch, + aClientResolver2 ); + } + return response; + } + +// ---------------------------------------------------------------------------- +// CSipHeaderStrategyBase::MatchResolvedClientsL +// ---------------------------------------------------------------------------- +// +TBool CSipHeaderStrategyBase::MatchResolvedClientL( + CSIPResolvedClient2& /*aClient*/, + CSIPRequest& /*aRequest*/, + TUid& /*aUids*/, + const CUri8& /*aUri8*/ ) + { + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CSipHeaderStrategyBase::EliminateClientsL +// ---------------------------------------------------------------------------- +// +void CSipHeaderStrategyBase::EliminateClientsL( + CSIPRequest& aRequest, + RArray& aUids ) + { + for ( TInt i=0; i < aUids.Count();i++ ) + { + MSipClient* client = iSipClients.GetByUID( aUids[i] ); + if ( client && !CompareHeaders( aRequest,*client) ) + { + aUids.Remove( i ); + i--; + } + } + } + +// ---------------------------------------------------------------------------- +// CSipHeaderStrategyBase::CreateResponseL +// ---------------------------------------------------------------------------- +// +CSIPResponse* CSipHeaderStrategyBase::CreateResponseL() + { + return NULL; + } + +// ---------------------------------------------------------------------------- +// CSipHeaderStrategyBase::CompareHeaders +// ---------------------------------------------------------------------------- +// +TBool CSipHeaderStrategyBase::CompareHeaders( + CSIPRequest& /*aRequest*/, + MSipClient& /*aClient*/) + { + // Not implemented for this sub-class + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CSipHeaderStrategyBase::ContentType +// ---------------------------------------------------------------------------- +// +CSIPContentTypeHeader* CSipHeaderStrategyBase::ContentType( + CSIPRequest& aRequest ) + { + CSIPContentTypeHeader* contentType = NULL; + CSIPHeaderBase* header = aRequest.Header( + SIPStrings::StringF( SipStrConsts::EContentTypeHeader ),0 ); + if ( header ) + { + contentType = static_cast( header ); + } + return contentType; + }