realtimenetprots/sipfw/SIP/sipapi/src/sipnotifydialogassoc.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/sipapi/src/sipnotifydialogassoc.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,248 @@
+// 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          : SIPNotifyDialogAssoc.cpp
+// Part of       : SIPAPI
+// Version       : SIP/4.0 
+//
+
+
+
+#include "sip.h"
+#include "siperr.h"
+#include "sipnotifydialogassoc.h"
+#include "SipDialogAssocImplementation.h"
+#include "SipDialogImplementation.h"
+#include "SipConnectionImplementation.h"
+#include "sipservertransaction.h"
+#include "sipclientconnection.h"
+#include "sipmessageelements.h"
+#include "sipeventheader.h"
+#include "sipsubscriptionstateheader.h"
+#include "SipAssert.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+#include "MessageHeaderCleanup.h"
+
+#ifdef CPPUNIT_TEST
+
+#include "TestCleanupStack.h"
+
+#undef EXPORT_C
+#define EXPORT_C
+
+#endif
+
+
+// -----------------------------------------------------------------------------
+// CSIPNotifyDialogAssoc::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPNotifyDialogAssoc*
+CSIPNotifyDialogAssoc::NewL(CSIPServerTransaction& aTransaction,
+			     			CSIPEventHeader* aEvent,
+				 			CSIPSubscriptionStateHeader* aState)
+    {
+    CSIPNotifyDialogAssoc* self =
+    	CSIPNotifyDialogAssoc::NewLC(aTransaction, aEvent, aState);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPNotifyDialogAssoc::NewLC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPNotifyDialogAssoc*
+CSIPNotifyDialogAssoc::NewLC(CSIPServerTransaction& aTransaction,
+			      			 CSIPEventHeader* aEvent,
+				  			 CSIPSubscriptionStateHeader* aState)
+    {    
+    CSIPNotifyDialogAssoc* self = new (ELeave) CSIPNotifyDialogAssoc();
+    CleanupStack::PushL(self);
+    self->ConstructL(aTransaction,NULL,aEvent,aState);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPNotifyDialogAssoc::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPNotifyDialogAssoc*
+CSIPNotifyDialogAssoc::NewL(CSIPServerTransaction& aTransaction,
+                            const MSIPRegistrationContext& aContext,
+			     			CSIPEventHeader* aEvent,
+				 			CSIPSubscriptionStateHeader* aState)
+    {
+    CSIPNotifyDialogAssoc* self =
+    	CSIPNotifyDialogAssoc::NewLC(aTransaction, aContext, aEvent, aState);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPNotifyDialogAssoc::NewLC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPNotifyDialogAssoc*
+CSIPNotifyDialogAssoc::NewLC(CSIPServerTransaction& aTransaction,
+                             const MSIPRegistrationContext& aContext,
+			      			 CSIPEventHeader* aEvent,
+				  			 CSIPSubscriptionStateHeader* aState)
+    {    
+    CSIPNotifyDialogAssoc* self = new (ELeave) CSIPNotifyDialogAssoc();
+    CleanupStack::PushL(self);
+    self->ConstructL(aTransaction,&aContext,aEvent,aState);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPNotifyDialogAssoc::CSIPNotifyDialogAssoc
+// -----------------------------------------------------------------------------
+//
+CSIPNotifyDialogAssoc::CSIPNotifyDialogAssoc()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPNotifyDialogAssoc::~CSIPNotifyDialogAssoc
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPNotifyDialogAssoc::~CSIPNotifyDialogAssoc()
+    {
+    delete iEvent;
+    delete iSubscriptionState;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPNotifyDialogAssoc::Event
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const CSIPEventHeader& CSIPNotifyDialogAssoc::Event() const
+	{
+	return *iEvent;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPNotifyDialogAssoc::SubscriptionState
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPSubscriptionStateHeader& CSIPNotifyDialogAssoc::SubscriptionState()
+	{
+	return *iSubscriptionState;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPNotifyDialogAssoc::SubscriptionState
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const CSIPSubscriptionStateHeader&
+CSIPNotifyDialogAssoc::SubscriptionState() const
+	{
+	return *iSubscriptionState;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPNotifyDialogAssoc::SendNotifyL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPClientTransaction*
+CSIPNotifyDialogAssoc::SendNotifyL(CSIPMessageElements* aElements)
+    {
+    return Dialog().Implementation().SendNotifyL(*this, aElements);
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPNotifyDialogAssoc::DoSendNotifyWithinDialogL
+// -----------------------------------------------------------------------------
+//
+CSIPClientTransaction*
+CSIPNotifyDialogAssoc::DoSendNotifyWithinDialogL(CSIPMessageElements* aElements)
+    {
+    CSIPMessageElements* elem = aElements;
+    if (!aElements)
+    	{
+    	//CSIPMessageElements is created by SIP Client API, and will be deleted
+    	//in all cases.
+    	elem = CSIPMessageElements::NewLC();
+    	}
+
+    TMessageHeaderCleanup headerCleanup(*elem);
+    TCleanupItem cleanupItem(TMessageHeaderCleanup::Cleanup, &headerCleanup);
+    if (aElements)
+    	{
+    	//CSIPMessageElements is created by application. If leave occurs, the
+    	//copied Event and SubscribtionState headers are detached from
+    	//CSIPMessageElements, but CSIPMessageElements won't be deleted.
+    	//If leave doesn't occur, CSIPMessageElements will be deleted.  	    	
+    	CleanupStack::PushL(cleanupItem);
+    	}
+
+	CSIPDialogAssocImplementation::CopyHeaderL(*iEvent,
+											   *elem,
+											   headerCleanup);
+	CSIPDialogAssocImplementation::CopyHeaderL(*iSubscriptionState,
+											   *elem,
+											   headerCleanup);
+    CSIPClientTransaction* ta =
+    	Dialog().Implementation().SendRequestInDialogL(
+    							Implementation(),
+    							SIPStrings::StringF(SipStrConsts::ENotify),
+                                elem);
+	CleanupStack::Pop(); //TCleanupItem or elem
+	return ta;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPNotifyDialogAssoc::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPNotifyDialogAssoc::ConstructL(CSIPServerTransaction& aTransaction,
+                                       const MSIPRegistrationContext* aContext,
+                                       CSIPEventHeader* aEvent,
+                                       CSIPSubscriptionStateHeader* aState)
+    {
+    __ASSERT_ALWAYS(
+    	aTransaction.Type() == SIPStrings::StringF(SipStrConsts::ESubscribe) ||
+    	aTransaction.Type() == SIPStrings::StringF(SipStrConsts::ERefer),
+        User::Leave(KErrArgument));
+
+    CSIPTransactionBase::TState state = aTransaction.StateL();
+    __ASSERT_ALWAYS(state == CSIPTransactionBase::ETrying ||
+    				state == CSIPTransactionBase::EProceeding,
+        			User::Leave(KErrSIPInvalidTransactionState));
+    __ASSERT_ALWAYS(aEvent && aState, User::Leave(KErrArgument));
+
+	CSIPDialogImplementation* dialogImpl = aTransaction.Dialog();
+	TBool createNewDialog = (dialogImpl == NULL);
+	if (createNewDialog)
+		{
+		//Push dialogImpl to CleanupStack until it has been associated with
+		//CSIPNotifyDialogAssoc, using CSIPDialogAssocBase::ConstructL().
+		//Once associated, it is deleted if CSIPNotifyDialogAssoc is deleted.
+		dialogImpl = CSIPDialogImplementation::NewLC(
+			aTransaction.SIPConnectionL().Implementation(),aContext);
+		}	
+
+    //Associates CSIPDialogImplementation with CSIPNotifyDialogAssoc
+    CSIPDialogAssocBase::ConstructL(SIPStrings::StringF(SipStrConsts::ENotify),
+                                    dialogImpl->Dialog(),aTransaction);
+    if (createNewDialog)
+    	{
+    	CleanupStack::Pop(dialogImpl);
+    	dialogImpl->InitialTransactionReceivedL(aTransaction);
+    	}
+
+    iEvent = aEvent;
+    iSubscriptionState = aState;    
+    }