--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/sipapi/src/sipreferdialogassoc.cpp Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,286 @@
+// Copyright (c) 2004-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 : SIPReferDialogAssoc.cpp
+// Part of : SIPAPI
+// Version : SIP/4.0
+//
+
+
+
+#include <uri8.h>
+#include "sip.h"
+#include "siperr.h"
+#include "sipreferdialogassoc.h"
+#include "SipDialogAssocImplementation.h"
+#include "SipDialogImplementation.h"
+#include "SipConnectionImplementation.h"
+#include "sipservertransaction.h"
+#include "sipclientconnection.h"
+#include "sipregistrationcontext.h"
+#include "sipmessageelements.h"
+#include "siptoheader.h"
+#include "sipfromheader.h"
+#include "sipcontactheader.h"
+#include "siprefertoheader.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
+
+
+// -----------------------------------------------------------------------------
+// CSIPReferDialogAssoc::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPReferDialogAssoc*
+CSIPReferDialogAssoc::NewL(CSIPDialog& aDialog, CSIPReferToHeader* aReferTo)
+ {
+ CSIPReferDialogAssoc* self = CSIPReferDialogAssoc::NewLC(aDialog, aReferTo);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPReferDialogAssoc::NewLC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPReferDialogAssoc*
+CSIPReferDialogAssoc::NewLC(CSIPDialog& aDialog, CSIPReferToHeader* aReferTo)
+ {
+ __ASSERT_ALWAYS(aReferTo, User::Leave(KErrArgument));
+
+ CSIPReferDialogAssoc* self = new (ELeave) CSIPReferDialogAssoc();
+ CleanupStack::PushL(self);
+ self->CSIPDialogAssocBase::ConstructL(
+ SIPStrings::StringF(SipStrConsts::ERefer),
+ aDialog);
+ self->iReferTo = aReferTo;
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPReferDialogAssoc::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPReferDialogAssoc*
+CSIPReferDialogAssoc::NewL(CSIPConnection& aConnection,
+ CSIPFromHeader* aFrom,
+ CUri8* aRemoteUri,
+ CSIPReferToHeader* aReferTo,
+ CSIPToHeader* aTo,
+ CSIPContactHeader* aContact)
+ {
+ CSIPReferDialogAssoc* self = CSIPReferDialogAssoc::NewLC(aConnection,
+ aFrom,
+ aRemoteUri,
+ aReferTo,
+ aTo,
+ aContact);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPReferDialogAssoc::NewLC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPReferDialogAssoc*
+CSIPReferDialogAssoc::NewLC(CSIPConnection& aConnection,
+ CSIPFromHeader* aFrom,
+ CUri8* aRemoteUri,
+ CSIPReferToHeader* aReferTo,
+ CSIPToHeader* aTo,
+ CSIPContactHeader* aContact)
+ {
+ __ASSERT_ALWAYS(aFrom, User::Leave(KErrArgument));
+ return CSIPReferDialogAssoc::NewLC(aConnection,
+ aRemoteUri,
+ aReferTo,
+ aFrom,
+ aTo,
+ aContact,
+ NULL);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPReferDialogAssoc::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPReferDialogAssoc*
+CSIPReferDialogAssoc::NewL(CSIPConnection& aConnection,
+ CUri8* aRemoteUri,
+ const MSIPRegistrationContext& aContext,
+ CSIPReferToHeader* aReferTo,
+ CSIPFromHeader* aFrom,
+ CSIPToHeader* aTo,
+ CSIPContactHeader* aContact)
+ {
+ CSIPReferDialogAssoc* self = CSIPReferDialogAssoc::NewLC(aConnection,
+ aRemoteUri,
+ aContext,
+ aReferTo,
+ aFrom,
+ aTo,
+ aContact);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPReferDialogAssoc::NewLC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPReferDialogAssoc*
+CSIPReferDialogAssoc::NewLC(CSIPConnection& aConnection,
+ CUri8* aRemoteUri,
+ const MSIPRegistrationContext& aContext,
+ CSIPReferToHeader* aReferTo,
+ CSIPFromHeader* aFrom,
+ CSIPToHeader* aTo,
+ CSIPContactHeader* aContact)
+ {
+ __ASSERT_ALWAYS(aContext.IsContextActive(),
+ User::Leave(KErrSIPInvalidRegistrationState));
+ return CSIPReferDialogAssoc::NewLC(aConnection,
+ aRemoteUri,
+ aReferTo,
+ aFrom,
+ aTo,
+ aContact,
+ &aContext);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPReferDialogAssoc::NewLC
+// -----------------------------------------------------------------------------
+//
+CSIPReferDialogAssoc*
+CSIPReferDialogAssoc::NewLC(CSIPConnection& aConnection,
+ CUri8* aRemoteUri,
+ CSIPReferToHeader* aReferTo,
+ CSIPFromHeader* aFrom,
+ CSIPToHeader* aTo,
+ CSIPContactHeader* aContact,
+ const MSIPRegistrationContext* aContext)
+ {
+ __ASSERT_ALWAYS(aRemoteUri && aReferTo, User::Leave(KErrArgument));
+
+ CSIPDialogImplementation* dialogImpl =
+ CSIPDialogImplementation::NewLC(aConnection.Implementation(),
+ aContext);
+ CSIPReferDialogAssoc* self =
+ CSIPReferDialogAssoc::NewL(dialogImpl->Dialog(), aReferTo);
+ //Don't take ownership of aReferTo yet, as leave can occur
+ self->iReferTo = NULL;
+
+ CleanupStack::Pop(dialogImpl);
+ CleanupStack::PushL(self);
+
+ dialogImpl->SetHeadersL(aFrom, aTo, aRemoteUri, aContact);
+ self->iReferTo = aReferTo;
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPReferDialogAssoc::CSIPReferDialogAssoc
+// -----------------------------------------------------------------------------
+//
+CSIPReferDialogAssoc::CSIPReferDialogAssoc()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPReferDialogAssoc::~CSIPReferDialogAssoc
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPReferDialogAssoc::~CSIPReferDialogAssoc()
+ {
+ delete iReferTo;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPReferDialogAssoc::ReferTo
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const CSIPReferToHeader& CSIPReferDialogAssoc::ReferTo() const
+ {
+ return *iReferTo;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPReferDialogAssoc::SendReferL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPClientTransaction*
+CSIPReferDialogAssoc::SendReferL(CSIPMessageElements* aElements)
+ {
+ return Dialog().Implementation().SendReferL(*this, aElements);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPReferDialogAssoc::DoSendReferL
+// -----------------------------------------------------------------------------
+//
+CSIPClientTransaction*
+CSIPReferDialogAssoc::DoSendReferL(CSIPMessageElements* aElements,
+ TBool aWithinDialog)
+ {
+ CSIPMessageElements* elem = aElements;
+ if (!aElements)
+ {
+ elem = CSIPMessageElements::NewLC();
+ }
+
+ TMessageHeaderCleanup headerCleanup(*elem);
+ TCleanupItem cleanupItem(TMessageHeaderCleanup::Cleanup, &headerCleanup);
+ if (aElements)
+ {
+ CleanupStack::PushL(cleanupItem);
+ }
+ CSIPDialogAssocImplementation::CopyHeaderL(*iReferTo, *elem, headerCleanup);
+
+ CSIPClientTransaction* ta = NULL;
+ if (aWithinDialog)
+ {
+ ta = Dialog().Implementation().SendRequestInDialogL(Implementation(),
+ Type(),
+ elem);
+ }
+ else
+ {
+ const CSIPContactHeader* contact =
+ Dialog().Implementation().ContactHeader();
+ if (contact)
+ {
+ CSIPDialogAssocImplementation::CopyHeaderL(*contact,
+ *elem,
+ headerCleanup);
+ }
+
+ ta = Dialog().Implementation().SendDialogCreatingRequestL(
+ Implementation(), elem);
+ }
+ CleanupStack::Pop(); //TCleanupItem or elem
+ return ta;
+ }