--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/sipapi/src/sipinviteclienttransaction.cpp Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,168 @@
+// 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 : SIPInviteClientTransaction.cpp
+// Part of : SIPAPI
+// Version : SIP/5.0
+//
+
+
+
+#include "sip.h"
+#include "SipAssert.h"
+#include "transactionassociation.h"
+#include "sipinviteclienttransaction.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+
+
+#ifdef CPPUNIT_TEST
+
+#include "TestCleanupStack.h"
+
+#undef EXPORT_C
+#define EXPORT_C
+
+#endif
+
+
+// -----------------------------------------------------------------------------
+// CSIPInviteClientTransaction::NewL
+// -----------------------------------------------------------------------------
+//
+CSIPInviteClientTransaction*
+CSIPInviteClientTransaction::NewL(MTransactionAssociation& aAssociation)
+ {
+ CSIPInviteClientTransaction* self =
+ CSIPInviteClientTransaction::NewLC(aAssociation);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPInviteClientTransaction::NewLC
+// -----------------------------------------------------------------------------
+//
+CSIPInviteClientTransaction*
+CSIPInviteClientTransaction::NewLC(MTransactionAssociation& aAssociation)
+ {
+ CSIPInviteClientTransaction* self =
+ new (ELeave) CSIPInviteClientTransaction(aAssociation);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPInviteClientTransaction::CSIPInviteClientTransaction
+// -----------------------------------------------------------------------------
+//
+CSIPInviteClientTransaction::CSIPInviteClientTransaction(
+ MTransactionAssociation& aAssociation) :
+ CSIPClientTransaction(aAssociation, NULL)
+#ifdef CPPUNIT_TEST
+ , iAssociationArray(1)
+#endif
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPInviteClientTransaction::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPInviteClientTransaction::ConstructL()
+ {
+ iAssociationArray.AppendL(iAssociation);
+
+ CSIPTransactionBase::ConstructL(SIPStrings::StringF(SipStrConsts::EInvite));
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPInviteClientTransaction::~CSIPInviteClientTransaction
+// RemoveTransaction event is sent to all associations.
+// CSIPTransactionBase::iAssociation is set to NULL to prevent
+// ~CSIPTransactionBase() from also sending RemoveTransaction.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPInviteClientTransaction::~CSIPInviteClientTransaction()
+ {
+ for (TInt i = 0; i < iAssociationArray.Count(); i++)
+ {
+ iAssociationArray[i]->RemoveTransaction(*this);
+ }
+ iAssociationArray.Reset();
+
+ iAssociation = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPInviteClientTransaction::CancelAllowed
+// It is possible to cancel an INVITE client transaction, though it can be done
+// only in "proceeding state". This method just indicates whether canceling is
+// possible at all, and does not check the current state.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CSIPInviteClientTransaction::CancelAllowed() const
+ {
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPInviteClientTransaction::Detach
+// iAssociation is set to NULL when the last association is detached. Until that
+// happens it is set point one of the associations (does not matter which one).
+// -----------------------------------------------------------------------------
+//
+void CSIPInviteClientTransaction::Detach(
+ const MTransactionAssociation& aAssociation)
+ {
+ TInt pos = iAssociationArray.Find(&aAssociation);
+
+ __ASSERT_DEBUG(pos != KErrNotFound,
+ User::Panic(_L("CSIPInviteClientTransaction::Detach() not found"),
+ KErrNotFound));
+
+ if (pos != KErrNotFound)
+ {
+ iAssociationArray.Remove(pos);
+ }
+
+ if (iAssociationArray.Count() > 0)
+ {
+ iAssociation = iAssociationArray[0];
+ }
+ else
+ {
+ iAssociation = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPInviteClientTransaction::AddAssociationL
+// -----------------------------------------------------------------------------
+//
+void CSIPInviteClientTransaction::AddAssociationL(
+ MTransactionAssociation& aAssociation)
+ {
+ __ASSERT_ALWAYS(iAssociationArray.Find(&aAssociation) == KErrNotFound,
+ User::Leave(KErrAlreadyExists));
+
+ aAssociation.AddTransactionL(*this);
+
+ TInt err = iAssociationArray.Append(&aAssociation);
+ if (err != KErrNone)
+ {
+ aAssociation.RemoveTransaction(*this);
+ User::Leave(err);
+ }
+ }