diff -r 000000000000 -r 1bce908db942 multimediacommsengine/tsrc/testdriver/siptester/src/CTcSIPConnectionContainer.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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; + }