--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/sipapi/src/sipclienttransaction.cpp Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,192 @@
+// 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 : SIPClientTransaction.cpp
+// Part of : SIPAPI
+// Version : SIP/5.0
+//
+
+
+
+#include "sip.h"
+#include "siperr.h"
+#include "SipAssert.h"
+#include "SipDialogImplementation.h"
+#include "sipclienttransaction.h"
+#include "SipConnectionImplementation.h"
+#include "siprefresh.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+
+#ifdef CPPUNIT_TEST
+
+#include "TestCleanupStack.h"
+
+#undef EXPORT_C
+#define EXPORT_C
+
+#endif
+
+
+// -----------------------------------------------------------------------------
+// CSIPClientTransaction::NewL
+// -----------------------------------------------------------------------------
+//
+CSIPClientTransaction*
+CSIPClientTransaction::NewL(RStringF aType,
+ MTransactionAssociation& aAssociation,
+ CSIPRefresh* aRefresh)
+ {
+ CSIPClientTransaction* self = CSIPClientTransaction::NewLC(aType,
+ aAssociation,
+ aRefresh);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClientTransaction::NewLC
+// For INVITE client transaction, CSIPInviteClientTransaction must be used.
+// -----------------------------------------------------------------------------
+//
+CSIPClientTransaction*
+CSIPClientTransaction::NewLC(RStringF aType,
+ MTransactionAssociation& aAssociation,
+ CSIPRefresh* aRefresh)
+ {
+ __ASSERT_ALWAYS(aType != SIPStrings::StringF(SipStrConsts::EInvite),
+ User::Leave(KErrArgument));
+
+ CSIPClientTransaction* self =
+ new (ELeave) CSIPClientTransaction(aAssociation, aRefresh);
+ CleanupStack::PushL(self);
+ self->CSIPTransactionBase::ConstructL(aType);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClientTransaction::CSIPClientTransaction
+// RequestId is not yet known.
+// -----------------------------------------------------------------------------
+//
+CSIPClientTransaction::CSIPClientTransaction(
+ MTransactionAssociation& aAssociation,
+ CSIPRefresh* aRefresh) :
+ CSIPTransactionBase(ETrue, 0, aAssociation),
+ iRefresh(aRefresh)
+ {
+ if (iRefresh)
+ {
+ iRefresh->AddTransaction(*this);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClientTransaction::~CSIPClientTransaction
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPClientTransaction::~CSIPClientTransaction()
+ {
+ if (iRefresh)
+ {
+ iRefresh->RemoveTransaction();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClientTransaction::ResponseElements
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const CSIPResponseElements*
+CSIPClientTransaction::ResponseElements() const
+ {
+ return CSIPTransactionBase::ResponseElements();
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClientTransaction::CancelL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSIPClientTransaction* CSIPClientTransaction::CancelL()
+ {
+ __ASSERT_ALWAYS(CancelAllowed(),
+ User::Leave(KErrSIPInvalidTransactionState));
+ __ASSERT_ALWAYS(StateL() == CSIPTransactionBase::EProceeding,
+ User::Leave(KErrSIPInvalidTransactionState));
+
+ CheckAssociationL();
+ CSIPDialogImplementation* dialog = iAssociation->SIPConnectionL().
+ Implementation().FindDialogByRequestId(iRequestId);
+
+ if (!dialog)
+ {
+ User::Leave(KErrSIPInvalidTransactionState);
+ }
+
+ //Don't pass iAssociation to SendCancelL as user may have deleted the dialog
+ //association used by this transaction. In that case iAssociation is NULL.
+ //Dialog searches the dialog association with requestId. If it can't find
+ //it, something is wrong and CANCEL can't be sent.
+ return dialog->SendCancelL(iRequestId);
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClientTransaction::Refresh
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const CSIPRefresh* CSIPClientTransaction::Refresh() const
+ {
+ return iRefresh;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClientTransaction::CancelAllowed
+// Only INVITE client transaction can be canceled
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CSIPClientTransaction::CancelAllowed() const
+ {
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClientTransaction::SetRequestId
+// -----------------------------------------------------------------------------
+//
+void CSIPClientTransaction::SetRequestId(TUint32 aRequestId)
+ {
+ __SIP_ASSERT_RETURN(!iRequestId, KErrAlreadyExists);
+ __SIP_ASSERT_RETURN(aRequestId, KErrArgument);
+
+ iRequestId = aRequestId;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClientTransaction::Refresh
+// -----------------------------------------------------------------------------
+//
+CSIPRefresh* CSIPClientTransaction::Refresh()
+ {
+ return iRefresh;
+ }
+
+// -----------------------------------------------------------------------------
+// CSIPClientTransaction::RemoveRefresh
+// -----------------------------------------------------------------------------
+//
+void CSIPClientTransaction::RemoveRefresh()
+ {
+ __SIP_ASSERT_RETURN(iRefresh, KErrNotFound);
+
+ iRefresh = NULL;
+ }