multimediacommsengine/mmcesrv/mmceserver/src/mceclientresolver.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcesrv/mmceserver/src/mceclientresolver.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,378 @@
+/*
+* Copyright (c) 2005 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 <sipclientdiscovery.h>
+#include <sipservertransaction.h>
+#include <siprequestelements.h>
+#include <sipmessageelements.h>
+#include <sipresponseelements.h>
+#include <sipcontenttypeheader.h>
+#include <sipstrings.h>
+#include <sipstrconsts.h>
+#include <siptoheader.h>
+#include <sipfromheader.h>
+#include <sipcseqheader.h>
+
+#include "mceclientresolver.h"
+#include "mcesipconnection.h"
+#include "mceclientserver.h"
+#include "cleanupresetanddestroy.h"
+
+
+
+// -----------------------------------------------------------------------------
+// CMceClientResolver::CMceRoutingRequest::CMceRoutingRequest
+// -----------------------------------------------------------------------------
+//
+CMceClientResolver::CMceRoutingRequest::CMceRoutingRequest( TUint32 aResolverRequestId,
+                                                            CMceSipConnection& aConnection, 
+                                                            CSIPServerTransaction* aRequest )
+ : iResolverRequestId(aResolverRequestId),
+   iRequest(aRequest),
+   iConnection(aConnection)
+    {    
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceClientResolver::CMceRoutingRequest::~CMceRoutingRequest
+// -----------------------------------------------------------------------------
+//
+CMceClientResolver::CMceRoutingRequest::~CMceRoutingRequest()
+    {
+    delete iRequest;
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceClientResolver::CMceRoutingRequest::LinkOffset
+// -----------------------------------------------------------------------------
+//
+TInt CMceClientResolver::CMceRoutingRequest::LinkOffset ()
+	{
+	return _FOFF(CMceClientResolver::CMceRoutingRequest,iLink);
+	}    
+
+    
+// -----------------------------------------------------------------------------
+// CMceClientResolver::CMceRoutingRequest::ResolverRequestId
+// -----------------------------------------------------------------------------
+//
+TUint32 CMceClientResolver::CMceRoutingRequest::ResolverRequestId() const
+	{
+	return iResolverRequestId;		
+	}
+    
+// -----------------------------------------------------------------------------
+// CMceClientResolver::CMceRoutingRequest::Request
+// -----------------------------------------------------------------------------
+// 
+CSIPServerTransaction* CMceClientResolver::CMceRoutingRequest::Request()
+	{
+	CSIPServerTransaction* req = iRequest;
+	iRequest = NULL;
+	return req;
+	}
+	
+	
+// -----------------------------------------------------------------------------
+// CMceClientResolver::CMceRoutingRequest::Connection
+// -----------------------------------------------------------------------------
+// 	
+CMceSipConnection& CMceClientResolver::CMceRoutingRequest::Connection() const
+	{
+	return iConnection;
+	}
+
+
+
+// ----------------------------------------------------------------------------
+// CMceClientResolver::NewL
+// ----------------------------------------------------------------------------
+//
+CMceClientResolver* 
+CMceClientResolver::NewL( MMceClientResolverObserver& aRequestHandler )
+    {
+    CMceClientResolver* self = CMceClientResolver::NewLC( aRequestHandler );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CMceClientResolver::NewLC
+// ----------------------------------------------------------------------------
+//
+CMceClientResolver* 
+CMceClientResolver::NewLC( MMceClientResolverObserver& aRequestHandler )
+    {
+	CMceClientResolver* self = 
+		new(ELeave)CMceClientResolver( aRequestHandler );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CMceClientResolver::ConstructL
+// ----------------------------------------------------------------------------
+//
+void CMceClientResolver::ConstructL ()
+    {
+    iDiscovery = CSIPClientDiscovery::NewL( *this, KServerUid3 );
+    }
+
+// ----------------------------------------------------------------------------
+// CMceClientResolver::CMceClientResolver
+// ----------------------------------------------------------------------------
+//
+CMceClientResolver::CMceClientResolver( MMceClientResolverObserver& aRequestHandler )
+: iRequestHandler( aRequestHandler ),
+  iList( CMceClientResolver::CMceRoutingRequest::LinkOffset() )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CMceClientResolver::~CMceClientResolver
+// ----------------------------------------------------------------------------
+//
+CMceClientResolver::~CMceClientResolver ()
+    {
+	TSglQueIter<CMceClientResolver::CMceRoutingRequest> iter( iList );
+	for (CMceClientResolver::CMceRoutingRequest* request = iter++; request; request = iter++)
+		{
+		iList.Remove( *request );
+		delete request;
+    	}
+    	
+    delete iDiscovery;
+    
+    }
+
+
+// ----------------------------------------------------------------------------
+// CMceClientResolver::RegisterClientL
+// ----------------------------------------------------------------------------
+//
+void CMceClientResolver::RegisterClientL( TUid aClientUid )
+    {
+    iDiscovery->RegisterL( aClientUid );
+    }
+
+// ----------------------------------------------------------------------------
+// CMceClientResolver::RegisterClientL
+// ----------------------------------------------------------------------------
+//
+void CMceClientResolver::DeregisterClient( TUid aClientUid )
+    {
+    iDiscovery->Deregister( aClientUid );
+    }
+
+
+// ----------------------------------------------------------------------------
+// CMceClientResolver::RegisterClientL
+// ----------------------------------------------------------------------------
+//
+void CMceClientResolver::RegisterIncomingRequestL( CSIPServerTransaction* aRequest,
+                                                   CMceSipConnection& aConnection )
+    {
+	const CSIPRequestElements* requestElements =
+	    aRequest->RequestElements();
+	    
+	__ASSERT_ALWAYS( requestElements!=NULL, User::Leave( KErrNotFound ) );
+
+    const CSIPMessageElements& messageElements = 
+        requestElements->MessageElements();
+    
+    // Array does not own added headers
+    RPointerArray<CSIPHeaderBase> allHeaders;
+    CleanupClosePushL( allHeaders );
+    AllHeadersL( *requestElements, allHeaders );
+	TUint32 requestId = 
+	    iDiscovery->ChannelL( requestElements->Method(),
+                              requestElements->RemoteUri().Uri().UriDes(),
+                              allHeaders,
+                              messageElements.Content(),
+                              messageElements.ContentType() );
+    CleanupStack::PopAndDestroy( &allHeaders );
+    
+    CMceClientResolver::CMceRoutingRequest* request =
+     new (ELeave) CMceClientResolver::CMceRoutingRequest(requestId, 
+                                                         aConnection,
+                                                         aRequest);
+  	iList.AddLast( *request );
+                                     
+                                           
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CMceClientResolver::ChannelResolvedL
+// -----------------------------------------------------------------------------
+//
+void CMceClientResolver::ChannelResolvedL(TUid aChannel, TUint32 aRequestId)
+    {
+    CSIPServerTransaction* incomingRequest = NULL;
+    CMceSipConnection* connection = NULL;
+    
+    CMceClientResolver::CMceRoutingRequest* request = Find( aRequestId );
+    User::LeaveIfNull( request );
+    
+	incomingRequest = request->Request();
+	connection = &request->Connection();
+    RemoveAndDelete( request );        
+
+    iRequestHandler.IncomingResolvedRequest( aChannel, *connection, 
+                                             incomingRequest );
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceClientResolver::ClientNotFoundL
+// -----------------------------------------------------------------------------
+//
+void CMceClientResolver::ClientNotFoundL(TUint32 aRequestId,
+        						     TUint aStatusCode, 
+        						     RStringF aReasonPhrase, 
+        						     RPointerArray<CSIPHeaderBase> aHeaders,
+        						     HBufC8* aContent)
+    {
+    CSIPServerTransaction* incomingRequest = NULL;
+
+    CMceClientResolver::CMceRoutingRequest* request = Find( aRequestId );
+    User::LeaveIfNull( request );
+    
+	incomingRequest = request->Request();
+    RemoveAndDelete( request );
+
+    CleanupStack::PushL( incomingRequest );
+    
+    CSIPResponseElements* response = 
+        CSIPResponseElements::NewLC( aStatusCode, aReasonPhrase );
+        
+    if ( aContent )
+        {
+        CSIPContentTypeHeader* contenttype = NULL;
+        
+    	for (TInt i=aHeaders.Count()-1; i >= 0; i--)
+    		{
+    		CSIPHeaderBase* header = aHeaders[i];
+    		if (header->Name() ==  SIPStrings::StringF( SipStrConsts::EContentTypeHeader ) )
+    			{
+    			contenttype = static_cast<CSIPContentTypeHeader*>(header);
+    			aHeaders.Remove(i);
+    			}
+    		}
+        CleanupStack::PushL( contenttype );
+        
+        response->MessageElements().SetContentL( aContent, contenttype );
+        CleanupStack::Pop( contenttype );
+        }
+        
+    response->MessageElements().SetUserHeadersL( aHeaders );
+    
+    incomingRequest->SendResponseL( response );
+	aHeaders.ResetAndDestroy();
+	CleanupStack::Pop( response );
+	CleanupStack::PopAndDestroy( incomingRequest );
+    
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CMceClientResolver::ErrorOccurred
+// -----------------------------------------------------------------------------
+//
+void CMceClientResolver::ErrorOccurred(TInt /*aError*/, TUint32 aRequestId)
+    {
+    CMceClientResolver::CMceRoutingRequest* request = Find( aRequestId );
+    RemoveAndDelete( request );
+    }
+
+
+	
+	
+// ----------------------------------------------------------------------------
+// CMceClientResolver::Find
+// ----------------------------------------------------------------------------
+//	
+CMceClientResolver::CMceRoutingRequest* CMceClientResolver::Find(TUint32 aRequestId)
+	{
+    CMceClientResolver::CMceRoutingRequest* routingRequest = NULL;
+	TSglQueIter<CMceClientResolver::CMceRoutingRequest> iter(iList);
+	CMceClientResolver::CMceRoutingRequest* listItem = NULL; 
+	for (listItem = iter++; listItem && !routingRequest; listItem = iter++)
+		{
+        if (listItem->ResolverRequestId() == aRequestId )
+            {
+            routingRequest = listItem;
+            }
+		}
+	return routingRequest;	
+	}
+
+// ----------------------------------------------------------------------------
+// CMceClientResolver::RemoveAndDelete
+// ----------------------------------------------------------------------------
+//	
+void CMceClientResolver::RemoveAndDelete( CMceClientResolver::CMceRoutingRequest* aRequest )
+	{
+	if ( aRequest )
+		{
+		iList.Remove(*aRequest);
+		delete aRequest;		
+		}		
+	}
+
+// ----------------------------------------------------------------------------
+// CMceClientResolver::AllHeadersL
+// ----------------------------------------------------------------------------
+//
+void CMceClientResolver::AllHeadersL( 
+    const CSIPRequestElements& aRequestElements, 
+    RPointerArray<CSIPHeaderBase>& aAllHeaders )
+    {
+    const CSIPToHeader* toHeader = aRequestElements.ToHeader();
+    if ( toHeader )
+        {
+        aAllHeaders.AppendL( toHeader );
+        }
+    const CSIPFromHeader* fromHeader = aRequestElements.FromHeader();
+    if ( fromHeader )
+        {
+        aAllHeaders.AppendL( fromHeader );
+        }
+    const CSIPCSeqHeader* cseqHeader = aRequestElements.CSeqHeader();
+    if( cseqHeader )
+        {
+        aAllHeaders.AppendL( cseqHeader );
+        }
+    
+    const CSIPMessageElements& messageElements = aRequestElements.MessageElements();
+    
+    const RPointerArray<CSIPHeaderBase>& userHeaders = 
+        messageElements.UserHeaders();
+    for ( TInt i = 0; i < userHeaders.Count(); i++ )
+        {
+        aAllHeaders.AppendL( userHeaders[ i ] );
+        }
+    }
+