realtimenetprots/sipfw/ClientResolver/Resolver/src/CSipHeaderStrategyBase.cpp
changeset 0 307788aac0a8
--- /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<TUid>& 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<TUid>& 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<TUid>& 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<TUid>& 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<TUid>& 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<TUid>& 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<TUid>& 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<CSIPContentTypeHeader*>( header );
+		}	
+	return contentType;
+    }