realtimenetprots/sipfw/SIP/sipapi/src/sipservertransaction.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/sipapi/src/sipservertransaction.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,241 @@
+// Copyright (c) 2003-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          : SIPServerTransaction.cpp
+// Part of       : SIPAPI
+// Version       : SIP/4.0 
+//
+
+
+
+#include "sip.h"
+#include "siperr.h"
+#include "SipAssert.h"
+#include "transactionassociation.h"
+#include "sipservertransaction.h"
+#include "siprequestelements.h"
+#include "csipresponsesender.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+
+#ifdef CPPUNIT_TEST
+
+#include "TestCleanupStack.h"
+
+#undef EXPORT_C
+#define EXPORT_C
+
+#endif
+
+
+// -----------------------------------------------------------------------------
+// CSIPServerTransaction::NewL
+// -----------------------------------------------------------------------------
+//
+CSIPServerTransaction*
+CSIPServerTransaction::NewL(TUint32 aRequestId,
+                            MTransactionAssociation& aAssociation,
+                            CSIPRequestElements* aElements)
+    {
+    CSIPServerTransaction* self =
+        CSIPServerTransaction::NewLC(aRequestId, aAssociation, aElements);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPServerTransaction::NewLC
+// -----------------------------------------------------------------------------
+//
+CSIPServerTransaction*
+CSIPServerTransaction::NewLC(TUint32 aRequestId,
+                             MTransactionAssociation& aAssociation,
+                             CSIPRequestElements* aElements)
+    {
+    __ASSERT_ALWAYS(aElements, User::Leave(KErrArgument));
+
+    CSIPServerTransaction* self =
+        new (ELeave) CSIPServerTransaction(aRequestId, aAssociation);
+    CleanupStack::PushL(self);
+    self->ConstructL(aElements);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPServerTransaction::CSIPServerTransaction
+// -----------------------------------------------------------------------------
+//
+CSIPServerTransaction::CSIPServerTransaction(TUint32 aRequestId,
+                                    MTransactionAssociation& aAssociation ) :
+    CSIPTransactionBase(EFalse, aRequestId, aAssociation)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPServerTransaction::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPServerTransaction::ConstructL(CSIPRequestElements* aElements)
+    {
+    __ASSERT_ALWAYS(aElements, User::Leave(KErrArgument));
+
+    CSIPTransactionBase::ConstructL(aElements->Method());
+
+    //Create default sender
+    iResponseSender = CSIPResponseSender::NewL();
+
+    //Take ownership of aElements when leave can't occur
+    iRequestElements = aElements;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPServerTransaction::~CSIPServerTransaction
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPServerTransaction::~CSIPServerTransaction()
+    {
+    delete iRequestElements;
+    delete iResponseSender;    
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPServerTransaction::SendResponseL
+// CSIPResponseElements checks the response is not a 100
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void
+CSIPServerTransaction::SendResponseL(CSIPResponseElements* aElements)
+    {
+    __TEST_INVARIANT;
+    __ASSERT_ALWAYS(aElements, User::Leave(KErrArgument));
+    __ASSERT_ALWAYS(ResponseAllowed(), User::Leave(KErrGeneral));
+
+    CSIPTransactionBase::TState state = StateL();
+    __ASSERT_ALWAYS(state == CSIPTransactionBase::ETrying ||
+                    state == CSIPTransactionBase::EProceeding,
+                    User::Leave(KErrSIPInvalidTransactionState));    
+
+    CheckAssociationL();
+    iResponseSender->SendResponseL(iAssociation->ClientConnectionL(),
+                                   *aElements,
+                                   RequestId(),
+                                   AffectsDialogState(),
+                                   IsTargetRefresh(Type()));
+    SetResponseElements(aElements);
+
+    __TEST_INVARIANT;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPServerTransaction::RequestElements
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const CSIPRequestElements*
+CSIPServerTransaction::RequestElements() const
+    {
+    __TEST_INVARIANT;
+    return iRequestElements;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPServerTransaction::ResponseAllowed
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CSIPServerTransaction::ResponseAllowed() const
+    {
+    __TEST_INVARIANT;
+    return (Type() != SIPStrings::StringF(SipStrConsts::EAck));
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPServerTransaction::SetResponseSender
+// -----------------------------------------------------------------------------
+//
+void CSIPServerTransaction::SetResponseSender(MSIPResponseSender* aSender)
+    {
+    __TEST_INVARIANT;
+    __ASSERT_DEBUG(aSender,
+		User::Panic(_L("CSIPServerTransaction::SetRespSender() aSender = 0"),
+		KErrArgument));
+
+    delete iResponseSender;
+    iResponseSender = aSender;
+
+    __TEST_INVARIANT;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPServerTransaction::Dialog
+// -----------------------------------------------------------------------------
+//
+CSIPDialogImplementation* CSIPServerTransaction::Dialog() const
+	{
+	__TEST_INVARIANT;
+	return iResponseSender->Dialog();
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPServerTransaction::SIPConnectionL
+// -----------------------------------------------------------------------------
+//
+CSIPConnection& CSIPServerTransaction::SIPConnectionL()
+    {
+    CheckAssociationL();
+
+    return iAssociation->SIPConnectionL();
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPServerTransaction::ReAssociateL
+// -----------------------------------------------------------------------------
+//
+void CSIPServerTransaction::ReAssociateL(MTransactionAssociation& aAssociation)
+    {
+    __TEST_INVARIANT;
+    CheckAssociationL();
+
+    //Attach transaction to the new association
+    aAssociation.AddTransactionL(*this);
+    
+    //Clear previous association only after attaching has succeeded
+    iAssociation->RemoveTransaction(*this);
+
+    iAssociation = &aAssociation;
+
+    __TEST_INVARIANT;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPServerTransaction::DetachRequestElements
+// -----------------------------------------------------------------------------
+//
+void CSIPServerTransaction::DetachRequestElements(TAny* aServerTransaction)
+	{
+    __SIP_ASSERT_RETURN(aServerTransaction, KErrArgument);
+
+    reinterpret_cast<CSIPServerTransaction*>(aServerTransaction)->
+        iRequestElements = NULL;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPServerTransaction::__DbgTestInvariant
+// -----------------------------------------------------------------------------
+//
+
+void CSIPServerTransaction::__DbgTestInvariant() const
+	{
+	if (iResponseSender == NULL)
+		{	
+		User::Invariant();
+		}
+	}