multimediacommsengine/tsrc/testdriver/siptester/src/CTcSIPConnectionContainer.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/tsrc/testdriver/siptester/src/CTcSIPConnectionContainer.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,367 @@
+/*
+* Copyright (c) 2004 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:  Implementation.
+*
+*/
+
+#include "CTcSIPConnectionContainer.h"
+#include "TTcSIPReceived.h"
+#include "CTcSIPContext.h"
+#include "SipConstants.h"
+
+#include "TesterConstants.h"
+#include "ErrorHandling.h"
+
+// SIP stack includes
+#include <sip.h>
+#include <sipconnection.h>
+#include <sipdialog.h>
+#include <sipdialogassocbase.h>
+#include <sipheaderbase.h>
+#include <sipcseqheader.h>
+#include <sipextensionheader.h>
+#include <siprefresh.h>
+#include <sipregistrationbinding.h>
+#include <sipresponseelements.h>
+#include <sipclienttransaction.h>
+#include <sipmessageelements.h>
+
+CTcSIPConnectionContainer* CTcSIPConnectionContainer::NewL(
+													CTcSIPContext& aContext,
+													const TDesC8& aIAPName )
+	{
+	CTcSIPConnectionContainer* self =
+						new( ELeave ) CTcSIPConnectionContainer( aContext,
+																 aIAPName );
+
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	CleanupStack::Pop( self );
+
+	return self;
+	}
+
+CTcSIPConnectionContainer::~CTcSIPConnectionContainer()
+	{
+	delete iSipConnection;
+	delete iTimer;
+	iReceiveQueue.Reset();
+	}
+
+CTcSIPConnectionContainer::CTcSIPConnectionContainer( CTcSIPContext& aContext,
+													  const TDesC8& aIAPName )
+	: iContext( aContext ), iReceiveQueue( 1 ), iIAPName( aIAPName )
+	{
+	}
+
+void CTcSIPConnectionContainer::ConstructL()
+	{
+	iTimer = CDeltaTimer::NewL( CActive::EPriorityStandard );
+	TCallBack cb( ReceiveTimeout, this );
+	iReceiveTimeout.Set( cb );
+
+	TInt iapId = iContext.IAPIdL( iIAPName );
+	iSipConnection = CSIPConnection::NewL( iContext.SIP(), iapId, *this );
+	// SIPConnection doesn't call the callback function if there already
+	// is a connection (e.g. from ProfileServer)
+	if( iSipConnection->State() == CSIPConnection::EInit )
+		{
+		iActiveWait.Start();
+		}
+	}
+
+//
+// -- CSIPConnection notifiers ------------------------------------------------
+//
+
+// Note that adding an object by-reference to the registry does NOT transfer
+// ownership. Adding by-pointer does transfer ownership, however.
+// Most/all SIP objects should be in the registry at this stage anyway,
+// just make sure that's the case.
+
+void CTcSIPConnectionContainer::IncomingRequest(
+										CSIPServerTransaction* aTransaction )
+	{
+	TRAPD( err, {
+		iContext.Registry().AddObjectL( aTransaction );
+		TTcSIPReceived received;
+		received.Set( aTransaction );
+		received.SetEvent( TTcSIPReceived::EIncomingRequest );
+		QueueReceivedL( received );
+		} )
+	__ASSERT_ALWAYS( !err, Panic( KSIPErrOOMInNotifier ) );
+	}
+
+void CTcSIPConnectionContainer::IncomingRequest(
+										CSIPServerTransaction* aTransaction,
+										CSIPDialog& aDialog )
+	{
+	TRAPD( err, {
+		iContext.Registry().AddObjectL( aTransaction );
+		iContext.Registry().AddObjectL( aDialog );
+		TTcSIPReceived received;
+		received.Set( aTransaction );
+		received.Set( &aDialog );
+		received.SetEvent( TTcSIPReceived::EIncomingRequest );
+		QueueReceivedL( received );
+		} )
+	__ASSERT_ALWAYS( !err, Panic( KSIPErrOOMInNotifier ) );
+	}
+
+void CTcSIPConnectionContainer::IncomingResponse(
+										CSIPClientTransaction& aTransaction )
+	{
+	TRAPD( err, {
+		iContext.Registry().AddObjectL( aTransaction );
+		TTcSIPReceived received;
+		received.Set( &aTransaction );
+		received.SetEvent( TTcSIPReceived::EIncomingResponse );
+		QueueReceivedL( received );
+		} )
+	__ASSERT_ALWAYS( !err, Panic( KSIPErrOOMInNotifier ) );
+	}
+
+void CTcSIPConnectionContainer::IncomingResponse(
+										CSIPClientTransaction& aTransaction,
+										CSIPDialogAssocBase& aDialogAssoc )
+	{
+	TRAPD( err, {
+		iContext.Registry().AddObjectL( aTransaction );
+		iContext.Registry().AddObjectL( aDialogAssoc );
+		TTcSIPReceived received;
+		received.Set( &aTransaction );
+		received.Set( &aDialogAssoc );
+		received.SetEvent( TTcSIPReceived::EIncomingResponse );
+		QueueReceivedL( received );
+		} )
+	__ASSERT_ALWAYS( !err, Panic( KSIPErrOOMInNotifier ) );
+	}
+
+void CTcSIPConnectionContainer::IncomingResponse(
+										CSIPClientTransaction& aTransaction,
+										CSIPInviteDialogAssoc* aDialogAssoc )
+	{
+	TRAPD( err, {
+		iContext.Registry().AddObjectL( aTransaction );
+		iContext.Registry().AddObjectL( aDialogAssoc );
+		TTcSIPReceived received;
+		received.Set( &aTransaction );
+		received.Set( aDialogAssoc );
+		received.SetEvent( TTcSIPReceived::EIncomingResponse );
+		QueueReceivedL( received );
+		} )
+	__ASSERT_ALWAYS( !err, Panic( KSIPErrOOMInNotifier ) );
+	}
+
+void CTcSIPConnectionContainer::IncomingResponse(
+										CSIPClientTransaction& aTransaction,
+										CSIPRegistrationBinding& aRegistration )
+	{
+	TRAPD( err, {
+		iContext.Registry().AddObjectL( aTransaction );
+		iContext.Registry().AddObjectL( aRegistration );
+		TTcSIPReceived received;
+		received.Set( &aTransaction );
+		received.Set( &aRegistration );
+		received.SetEvent( TTcSIPReceived::EIncomingResponse );
+		QueueReceivedL( received );
+		} )
+	__ASSERT_ALWAYS( !err, Panic( KSIPErrOOMInNotifier ) );
+	}
+
+void CTcSIPConnectionContainer::ErrorOccured(
+										TInt aError,
+										CSIPTransactionBase& aTransaction )
+	{
+	TRAPD( err, {
+		iContext.Registry().AddObjectL( aTransaction );
+		TTcSIPReceived received;
+		received.Set( &aTransaction );
+		received.SetError( aError );
+		received.SetEvent( TTcSIPReceived::EErrorOccured );
+		QueueReceivedL( received );
+		} )
+	__ASSERT_ALWAYS( !err, Panic( KSIPErrOOMInNotifier ) );
+	}
+
+void CTcSIPConnectionContainer::ErrorOccured( TInt aError,
+										CSIPClientTransaction& aTransaction,
+										CSIPRegistrationBinding& aRegistration )
+	{
+	TRAPD( err, {
+		iContext.Registry().AddObjectL( aTransaction );
+		iContext.Registry().AddObjectL( aRegistration );
+		TTcSIPReceived received;
+		received.Set( &aTransaction );
+		received.Set( &aRegistration );
+		received.SetError( aError );
+		received.SetEvent( TTcSIPReceived::EErrorOccured );
+		QueueReceivedL( received );
+		} )
+	__ASSERT_ALWAYS( !err, Panic( KSIPErrOOMInNotifier ) );
+	}
+
+void CTcSIPConnectionContainer::ErrorOccured( TInt aError,
+										CSIPTransactionBase& aTransaction,
+										CSIPDialogAssocBase& aDialogAssoc )
+	{
+	TRAPD( err, {
+		iContext.Registry().AddObjectL( aTransaction );
+		iContext.Registry().AddObjectL( aDialogAssoc );
+		TTcSIPReceived received;
+		received.Set( &aTransaction );
+		received.Set( &aDialogAssoc );
+		received.SetError( aError );
+		received.SetEvent( TTcSIPReceived::EErrorOccured );
+		QueueReceivedL( received );
+		} )
+	__ASSERT_ALWAYS( !err, Panic( KSIPErrOOMInNotifier ) );
+	}
+
+void CTcSIPConnectionContainer::ErrorOccured(
+										TInt aError,
+										CSIPRefresh& aSIPRefresh )
+	{
+	TRAPD( err, {
+		iContext.Registry().AddObjectL( aSIPRefresh );
+		TTcSIPReceived received;
+		received.Set( &aSIPRefresh );
+		received.SetError( aError );
+		received.SetEvent( TTcSIPReceived::EErrorOccured );
+		QueueReceivedL( received );
+		} )
+	__ASSERT_ALWAYS( !err, Panic( KSIPErrOOMInNotifier ) );
+	}
+
+void CTcSIPConnectionContainer::ErrorOccured(
+										TInt aError,
+										CSIPRegistrationBinding& aRegistration )
+	{
+	TRAPD( err, {
+		iContext.Registry().AddObjectL( aRegistration );
+		TTcSIPReceived received;
+		received.Set( &aRegistration );
+		received.SetError( aError );
+		received.SetEvent( TTcSIPReceived::EErrorOccured );
+		QueueReceivedL( received );
+		} )
+	__ASSERT_ALWAYS( !err, Panic( KSIPErrOOMInNotifier ) );
+	}
+
+void CTcSIPConnectionContainer::ErrorOccured(
+										TInt aError,
+										CSIPDialogAssocBase& aDialogAssoc )
+
+	{
+	TRAPD( err, {
+		iContext.Registry().AddObjectL( aDialogAssoc );
+		TTcSIPReceived received;
+		received.Set( &aDialogAssoc );
+		received.SetError( aError );
+		received.SetEvent( TTcSIPReceived::EErrorOccured );
+		QueueReceivedL( received );
+		} )
+	__ASSERT_ALWAYS( !err, Panic( KSIPErrOOMInNotifier ) );
+	}
+
+void CTcSIPConnectionContainer::InviteCompleted(
+										CSIPClientTransaction& aTransaction )
+	{
+	TRAPD( err, {
+		iContext.Registry().AddObjectL( aTransaction );
+		TTcSIPReceived received;
+		received.Set( &aTransaction );
+		received.SetEvent( TTcSIPReceived::EInviteCompleted );
+		QueueReceivedL( received );
+		} )
+	__ASSERT_ALWAYS( !err, Panic( KSIPErrOOMInNotifier ) );
+	}
+
+void CTcSIPConnectionContainer::InviteCanceled( 
+										CSIPServerTransaction& aTransaction )
+	{
+	TRAPD( err, {
+		iContext.Registry().AddObjectL( &aTransaction );
+		TTcSIPReceived received;
+		received.Set( &aTransaction );
+		received.SetError( KSIPErrInviteCanceled );
+		received.SetEvent( TTcSIPReceived::EInviteCanceled );
+		QueueReceivedL( received );
+		} )
+	__ASSERT_ALWAYS( !err, Panic( KSIPErrOOMInNotifier ) );
+	}
+
+void CTcSIPConnectionContainer::ConnectionStateChanged(
+										CSIPConnection::TState aState )
+	{
+	iConnectionState = aState;
+	if( iActiveWait.IsStarted() )
+		{
+		iActiveWait.AsyncStop();
+		}
+	}
+
+//
+// -- Public functions --------------------------------------------------------
+//
+
+TTcSIPReceived CTcSIPConnectionContainer::ReceivedItemL( TInt aTimeout )
+	{
+	if( iReceiveQueue.Count() == 0 )
+		{
+		// wait for items to arrive
+		iTimer->Queue( aTimeout * KSecondAsMicros, iReceiveTimeout );
+		iActiveWait.Start();
+		}
+
+	// Is the queue still empty ? (i.e. timeout occurred)
+	if( iReceiveQueue.Count() == 0 )
+		{
+		User::Leave( KErrTimedOut );
+		}
+
+	// Get the first (oldest) item from the array
+	TTcSIPReceived item = iReceiveQueue[ 0 ];
+
+	// ..and remove it from the array
+	iReceiveQueue.Delete( 0 );
+	iReceiveQueue.Compress();
+	return item;
+	}
+
+//
+// -- Internal utility functions ----------------------------------------------
+//
+
+void CTcSIPConnectionContainer::QueueReceivedL( TTcSIPReceived& aItem )
+	{
+	iReceiveQueue.AppendL( aItem );
+	if( iActiveWait.IsStarted() )
+		{
+		iTimer->Remove( iReceiveTimeout );
+		iActiveWait.AsyncStop();
+		}
+	}
+
+TInt CTcSIPConnectionContainer::ReceiveTimeout( TAny* aSelf )
+	{
+	CTcSIPConnectionContainer& self =
+				*reinterpret_cast< CTcSIPConnectionContainer* >( aSelf );
+	if( self.iActiveWait.IsStarted() )
+		{
+		self.iActiveWait.AsyncStop();
+		}
+
+	return KErrNone;
+	}