realtimenetprots/sipfw/ClientResolver/Server/src/CSIPCRSessionReceiver.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/ClientResolver/Server/src/CSIPCRSessionReceiver.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,285 @@
+// 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          : CSipCRSessionReceiver.cpp
+// Part of       : SIP Client Resolver
+// Version       : 1.0
+//
+
+
+
+// INCLUDES
+#include "CSIPCRSessionReceiver.h"
+#include "CSIPCRResponseQueue.h"
+#include "CSIPCRITCUtility.h"
+#include "CSIPCRResponseItem.h"
+#include "sipresponse.h"
+#include "SIPCRSerializer.h"
+
+// ----------------------------------------------------------------------------
+// CSIPCRSessionReceiver::NewLC
+// ----------------------------------------------------------------------------
+//
+CSIPCRSessionReceiver* CSIPCRSessionReceiver::NewL(CSIPCRITCUtility& aITC)
+    {
+    CSIPCRSessionReceiver* self = CSIPCRSessionReceiver::NewLC(aITC);
+    CleanupStack::Pop (self);
+    return self;
+    }
+    
+// ----------------------------------------------------------------------------
+// CSIPCRSessionReceiver::NewLC
+// ----------------------------------------------------------------------------
+//
+CSIPCRSessionReceiver* CSIPCRSessionReceiver::NewLC(CSIPCRITCUtility& aITC)
+    {
+    CSIPCRSessionReceiver* self = new(ELeave)CSIPCRSessionReceiver (aITC);
+    CleanupStack::PushL(self);
+    self->ConstructL ();
+    return self;
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPCRSessionReceiver::ConstructL
+// ----------------------------------------------------------------------------
+//
+void CSIPCRSessionReceiver::ConstructL()
+    {
+    User::LeaveIfError(iReceiverMutex.CreateLocal());
+    iResponseQueue = new(ELeave)CSIPCRResponseQueue;
+    }
+
+// ----------------------------------------------------------------------------
+// CSIPCRSessionReceiver::~CSIPCRSessionReceiver
+// ----------------------------------------------------------------------------
+//
+CSIPCRSessionReceiver::~CSIPCRSessionReceiver()
+	{
+	delete iResponseQueue;
+	iReceiverMutex.Close();
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPCRSessionReceiver::ConstructL
+// ----------------------------------------------------------------------------
+//
+CSIPCRSessionReceiver::CSIPCRSessionReceiver(CSIPCRITCUtility& aITC)
+: iITC(aITC),
+  iClientReadyToReceive(EFalse)
+    {
+    }
+    
+// ----------------------------------------------------------------------------
+// CSIPCRSessionReceiver::ClientReadyToReceiveL
+// ----------------------------------------------------------------------------
+//
+void CSIPCRSessionReceiver::ClientReadyToReceiveL(const RMessage2& aMessage)
+    {
+    CSIPCRITCUtility::WaitForMutexLC(iReceiverMutex);
+    
+    __ASSERT_ALWAYS (!iClientReadyToReceive, User::Leave (KErrAlreadyExists));
+
+    if (iResponseQueue->IsEmpty())
+		{
+        iClientReadyToReceive = ETrue;
+        iReceiveRMessage = aMessage;
+		}
+    else
+        {
+        CSIPCRResponseItem& item = iResponseQueue->First();
+        TInt error = item.Error();
+        iITC.WriteRequestIdL(aMessage, item.RequestId());
+        if (error == KErrNone)
+            {
+            if (item.SIPResponse() == 0)
+                {
+                iITC.WriteClientResolvedL(aMessage, ESIPCRChannelComplete);
+                iITC.WriteChannelUidL(aMessage,item.Channel());
+                iResponseQueue->RemoveFirst();
+                }
+            else
+                {
+                iITC.WriteClientResolvedL(aMessage, ESIPCRClientNotFound);
+                iITC.WriteResponseSizeL(aMessage, item.BufSizes());
+                }
+            }
+        else
+            {
+            iResponseQueue->RemoveFirst();
+            }
+        iITC.Complete (aMessage,error);
+        }
+        
+    CleanupStack::PopAndDestroy(); // signals iReceiverMutex     
+    }
+
+// ----------------------------------------------------------------------------
+// CSIPCRSessionReceiver::CancelClientReceiveL
+// ----------------------------------------------------------------------------
+//
+void CSIPCRSessionReceiver::CancelClientReceiveL()
+    {
+    CSIPCRITCUtility::WaitForMutexLC(iReceiverMutex);
+    
+    __ASSERT_ALWAYS (iClientReadyToReceive, User::Leave (KErrNotFound));
+    iClientReadyToReceive = EFalse;
+    iITC.Complete (iReceiveRMessage, KErrCancel);
+    
+    CleanupStack::PopAndDestroy(); // signals iReceiverMutex 
+    }
+
+// ----------------------------------------------------------------------------
+// CSIPCRSessionReceiver::WriteSipResponseToClientL
+// ----------------------------------------------------------------------------
+//
+void CSIPCRSessionReceiver::WriteSipResponseToClientL(
+    const RMessage2& aMessage)
+    {
+    CSIPCRITCUtility::WaitForMutexLC(iReceiverMutex);
+    
+    __ASSERT_ALWAYS (!iResponseQueue->IsEmpty(), User::Leave (KErrNotFound));
+    CSIPCRResponseItem& item = iResponseQueue->First();
+    __ASSERT_ALWAYS (item.RequestId() != 0,User::Leave (KErrGeneral));
+    __ASSERT_ALWAYS (item.SIPResponse() != 0,User::Leave (KErrGeneral));
+    __ASSERT_ALWAYS (item.SIPResponseContent() != 0,User::Leave (KErrGeneral));   
+    iITC.WriteSIPResponseL(aMessage, *item.SIPResponse());
+    iITC.WriteSIPResponseContentL(aMessage, *item.SIPResponseContent());
+    iResponseQueue->RemoveFirst();
+    
+    CleanupStack::PopAndDestroy(); // signals iReceiverMutex 
+    }
+
+// ----------------------------------------------------------------------------
+// CSIPCRSessionReceiver::AddErrorResponseL
+// ----------------------------------------------------------------------------
+//
+void CSIPCRSessionReceiver::AddErrorResponseL(
+    TUint32 aRequestId, 
+    CSIPResponse* aResponse)
+    {
+    CSIPCRITCUtility::WaitForMutexLC(iReceiverMutex);
+    
+    __ASSERT_ALWAYS (aResponse, User::Leave(KErrArgument));  
+    CBufFlat* response = SIPCRSerializer::ExternalizeL(*aResponse);
+    CleanupStack::PushL(response);
+    HBufC8* content = aResponse->TakeContentOwnershipL();
+    CleanupStack::PushL(content);
+    CSIPCRResponseItem* item = 
+        new(ELeave)CSIPCRResponseItem(aRequestId,response,content);
+    CleanupStack::Pop(content);
+    CleanupStack::Pop(response);
+    CleanupStack::PushL(item);    
+    if (iClientReadyToReceive)
+        {
+        iITC.WriteRequestIdL(iReceiveRMessage, aRequestId);
+        iITC.WriteClientResolvedL(iReceiveRMessage, ESIPCRClientNotFound);
+        iITC.WriteResponseSizeL(iReceiveRMessage, item->BufSizes());
+        User::LeaveIfError(iResponseQueue->AddLast(item));
+        iITC.Complete (iReceiveRMessage,KErrNone);
+        iClientReadyToReceive = EFalse;
+        }
+    else
+        {
+        User::LeaveIfError(iResponseQueue->AddLast(item));
+        }
+    CleanupStack::Pop(item);
+    CleanupStack::PopAndDestroy(); // signals iReceiverMutex 
+    
+    }
+
+// ----------------------------------------------------------------------------
+// CSIPCRSessionReceiver::RequestCompletedL
+// ----------------------------------------------------------------------------
+//
+void CSIPCRSessionReceiver::RequestCompletedL(
+    TUint32 aRequestId, 
+    TUid aChannel)
+    {
+    CSIPCRITCUtility::WaitForMutexLC(iReceiverMutex);
+    
+    __ASSERT_ALWAYS (aChannel.iUid != 0, User::Leave(KErrArgument));
+    __ASSERT_ALWAYS (aRequestId, User::Leave(KErrArgument));
+    if (iClientReadyToReceive)
+        {
+        iITC.WriteRequestIdL(iReceiveRMessage, aRequestId);
+        iITC.WriteClientResolvedL(iReceiveRMessage, ESIPCRChannelComplete);
+        iITC.WriteChannelUidL(iReceiveRMessage, aChannel);
+        iITC.Complete (iReceiveRMessage,KErrNone);
+        iClientReadyToReceive = EFalse;
+        }
+    else
+        {
+        CSIPCRResponseItem* item = 
+            new(ELeave)CSIPCRResponseItem(aRequestId,aChannel);
+        CleanupStack::PushL(item);
+        User::LeaveIfError(iResponseQueue->AddLast(item));
+        CleanupStack::Pop(item);
+        }
+        
+    CleanupStack::PopAndDestroy(); // signals iReceiverMutex     
+    }
+    
+// ----------------------------------------------------------------------------
+// CSIPCRSessionReceiver::ErrorReceivedL
+// ----------------------------------------------------------------------------
+//
+void CSIPCRSessionReceiver::ErrorReceivedL(
+    TUint32 aRequestId,
+    TInt aError)   
+    {
+    CSIPCRITCUtility::WaitForMutexLC(iReceiverMutex);
+    
+    if (aError != KErrNone)
+        {
+        if (iClientReadyToReceive)
+            {
+            iITC.WriteRequestIdL (iReceiveRMessage, aRequestId);
+            iITC.Complete(iReceiveRMessage,aError);
+            iClientReadyToReceive = EFalse;
+            }
+        else
+            {
+            CSIPCRResponseItem* item = 
+                new(ELeave)CSIPCRResponseItem(aRequestId,aError);
+            CleanupStack::PushL(item);
+            User::LeaveIfError(iResponseQueue->AddLast(item));
+            CleanupStack::Pop(item);
+            }
+        }
+        
+    CleanupStack::PopAndDestroy(); // signals iReceiverMutex     
+    }
+
+// ----------------------------------------------------------------------------
+// CSIPCRSessionReceiver::RemoveByRequestId
+// ----------------------------------------------------------------------------
+//
+void CSIPCRSessionReceiver::RemoveByRequestId(TUint32 aRequestId)
+    {
+    iReceiverMutex.Wait();
+    iResponseQueue->RemoveByRequestId(aRequestId);
+    iReceiverMutex.Signal();
+    }
+    
+// ----------------------------------------------------------------------------
+// CSIPCRSessionReceiver::RemoveAll
+// ----------------------------------------------------------------------------
+//    
+void CSIPCRSessionReceiver::RemoveAll()
+    {
+    iReceiverMutex.Wait();
+    iResponseQueue->RemoveAll();
+    iReceiverMutex.Signal();
+    }
+
+// End of File