realtimenetprots/sipfw/SIP/RequestHandler/src/CSIPRequestHandler.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/RequestHandler/src/CSIPRequestHandler.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,194 @@
+// 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          : CSIPRequestHandler.cpp
+// Part of       : SIP Request Handler
+// Version       : SIP/4.0 
+//
+
+
+
+#include "CSIPRequestHandler.h"
+#include "SipRequestHandlerInitParams.h"
+#include "SipRequestHandlerObserver.h"
+#include "sipclientdiscovery.h"
+#include "siprequest.h"
+#include "sipresponse.h"
+#include "sipheaderbase.h"
+#include "sipcontenttypeheader.h"
+#include "uricontainer.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+
+// -----------------------------------------------------------------------------
+// CSIPRequestHandler::NewL
+// -----------------------------------------------------------------------------
+//
+CSIPRequestHandler* CSIPRequestHandler::NewL (TAny* aInitParams)
+	{
+	__ASSERT_ALWAYS (aInitParams != NULL, User::Leave(KErrArgument));
+	TSIPRequestHandlerInitParams* params =
+		static_cast<TSIPRequestHandlerInitParams*>(aInitParams);
+	MSIPRequestHandlerObserver* observer = params->iObserver;
+	__ASSERT_ALWAYS (observer != NULL, User::Leave(KErrArgument));
+    CSIPRequestHandler* self = new(ELeave)CSIPRequestHandler(*observer);
+    CleanupStack::PushL(self);
+    self->ConstructL(params->iUid);
+    CleanupStack::Pop(self);
+    return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRequestHandler::CSIPRequestHandler
+// -----------------------------------------------------------------------------
+//
+CSIPRequestHandler::CSIPRequestHandler (MSIPRequestHandlerObserver& aObserver)
+ : CSIPRequestHandlerBase(aObserver)
+	{
+	iContentTypeHeaderName = 
+		SIPStrings::StringF(SipStrConsts::EContentTypeHeader);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRequestHandler::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPRequestHandler::ConstructL (TUid aUid)
+    {
+	iSIPClientDiscovery = CSIPClientDiscovery::NewL(*this,aUid);
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPRequestHandler::~CSIPRequestHandler
+// -----------------------------------------------------------------------------
+//
+CSIPRequestHandler::~CSIPRequestHandler()
+	{
+	delete iSIPClientDiscovery;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRequestHandler::RegisterL
+// From CSIPRequestHandlerBase
+// -----------------------------------------------------------------------------
+//
+void CSIPRequestHandler::RegisterL(TUid aChannel)
+	{
+	iSIPClientDiscovery->RegisterL(aChannel);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRequestHandler::Deregister
+// From CSIPRequestHandlerBase
+// -----------------------------------------------------------------------------
+//
+TInt CSIPRequestHandler::Deregister(TUid aChannel)
+	{
+	return iSIPClientDiscovery->Deregister(aChannel);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRequestHandler::ChannelL
+// From CSIPRequestHandlerBase
+// -----------------------------------------------------------------------------
+//
+TUint32 CSIPRequestHandler::ChannelL(CSIPRequest& aSIPRequest)
+	{
+	CURIContainer* requestURI = aSIPRequest.RequestURI();
+	__ASSERT_ALWAYS(requestURI != NULL, User::Leave(KErrArgument));
+	HBufC8* requestURIText = requestURI->ToTextL();
+	CleanupStack::PushL(requestURIText);
+	
+	RPointerArray<CSIPHeaderBase> headers = aSIPRequest.AllHeadersL();
+	const CSIPContentTypeHeader* contentTypeHeader = NULL;
+	
+	for (TInt i=headers.Count()-1; i >= 0; i--)
+		{
+		CSIPHeaderBase* header = headers[i];
+		if (header->Name() == iContentTypeHeaderName)
+			{
+			contentTypeHeader = static_cast<CSIPContentTypeHeader*>(header);
+			headers.Remove(i);
+			}
+		}
+		
+	TUint32 requestId = iSIPClientDiscovery->ChannelL(aSIPRequest.Method(),
+	                                                  *requestURIText,
+	                                                  headers,
+	                                                  aSIPRequest.Content(),
+	                                                  contentTypeHeader);
+	
+	CleanupStack::PopAndDestroy(requestURIText);
+
+	return requestId;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRequestHandler::Cancel
+// From CSIPRequestHandlerBase
+// -----------------------------------------------------------------------------
+//		
+void CSIPRequestHandler::Cancel(TUint32 aRequestId)
+	{
+	iSIPClientDiscovery->Cancel(aRequestId);
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPRequestHandler::ChannelResolvedL
+// From MSIPClientDiscoveryObserver
+// -----------------------------------------------------------------------------
+//
+void CSIPRequestHandler::ChannelResolvedL(TUid aChannel, TUint32 aRequestId)
+	{
+	iObserver.ClientFoundL(aRequestId,aChannel);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRequestHandler::ClientNotFoundL
+// From MSIPClientDiscoveryObserver
+// -----------------------------------------------------------------------------
+//
+void CSIPRequestHandler::ClientNotFoundL(TUint32 aRequestId,
+                                         TUint aStatusCode, 
+                                         RStringF aReasonPhrase, 
+                                         RPointerArray<CSIPHeaderBase> aHeaders,
+                                         HBufC8* aContent)
+	{
+	CSIPResponse* response = CSIPResponse::NewLC(aStatusCode,aReasonPhrase);
+    if (aContent)
+        {
+        response->SetContent(aContent->AllocL()); 
+        }
+	for (TInt i=aHeaders.Count()-1; i >= 0; i--)
+		{
+		CSIPHeaderBase* header = aHeaders[i];
+		response->AddHeaderL(header);
+		aHeaders.Remove(i);
+		}
+	iObserver.ClientNotFoundL(aRequestId,response);
+	delete aContent;
+	aHeaders.ResetAndDestroy();
+	CleanupStack::Pop(response);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRequestHandler::ErrorOccurred
+// From MSIPClientDiscoveryObserver
+// -----------------------------------------------------------------------------
+//
+void CSIPRequestHandler::ErrorOccurred(TInt aError, TUint32 aRequestId)
+	{
+	iObserver.ErrorOccurred(aRequestId,aError);
+	}	
+
+