multimediacommsengine/tsrc/testdriver/siptester/src/CTcSIPHttpDigestContainer.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/tsrc/testdriver/siptester/src/CTcSIPHttpDigestContainer.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,135 @@
+/*
+* Copyright (c) 2006 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:  See class definition below.
+*
+*/
+
+#include "CTcSIPHttpDigestContainer.h"
+#include "CTcSIPContext.h"
+#include "CTcSIPConnectionContainer.h"
+#include "SipConstants.h"
+#include "ErrorHandling.h"
+#include "SIPRefresh.h"
+
+const TInt KReceivedChallengesQueueGranularity = 4;
+
+CTcSIPHttpDigestContainer* CTcSIPHttpDigestContainer::NewL( 
+    CTcSIPContext& aContext,
+    CSIP& aSip )
+    {
+    CTcSIPHttpDigestContainer* self = 
+        new ( ELeave ) CTcSIPHttpDigestContainer( aContext );
+    CleanupStack::PushL( self );
+    self->ConstructL( aSip );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+CTcSIPHttpDigestContainer::~CTcSIPHttpDigestContainer()
+    {
+    delete iSipHttpDigest;
+    delete iTimer;
+    iReceivedChallengesQueue.ResetAndDestroy();
+    }
+
+
+CTcSIPHttpDigestContainer::CTcSIPHttpDigestContainer( CTcSIPContext& aContext )
+    : iContext( aContext ),
+      iReceivedChallengesQueue( KReceivedChallengesQueueGranularity )
+    {
+    }
+    
+void CTcSIPHttpDigestContainer::ConstructL( CSIP& aSip )
+    {
+   	iTimer = CDeltaTimer::NewL( CActive::EPriorityStandard );
+	TCallBack cb( ReceiveTimeout, this );
+	iReceiveTimeout.Set( cb );
+	
+    iSipHttpDigest = CSIPHttpDigest::NewL( 
+        aSip, static_cast< MSIPHttpDigestChallengeObserver& >( *this ) );
+    }
+
+void CTcSIPHttpDigestContainer::ChallengeReceived( const TDesC8& aRealm )
+    {
+    TRAPD( err, QueueReceivedChallengeL( aRealm ) );
+    __ASSERT_ALWAYS( !err, Panic( KSIPErrOOMInNotifier ) );
+    }
+
+void CTcSIPHttpDigestContainer::ChallengeReceived( 
+    const CSIPClientTransaction& aTransaction )
+    {
+    iContext.Connection().IncomingResponse( 
+        const_cast< CSIPClientTransaction& >( aTransaction ) );
+    }
+   
+void CTcSIPHttpDigestContainer::ChallengeReceived( 
+    const CSIPRefresh& aRefresh )
+    {
+	TRAPD( err, {
+		iContext.Registry().AddObjectL( aRefresh );
+		TTcSIPReceived received;
+		received.Set( &aRefresh );
+		received.SetEvent( TTcSIPReceived::EIncomingResponse );
+		iContext.Connection().QueueReceivedL( received );
+		} )
+
+	__ASSERT_ALWAYS( !err, Panic( KSIPErrOOMInNotifier ) );
+    }
+
+HBufC8* CTcSIPHttpDigestContainer::ReceivedChallengeL( TInt aTimeout )
+    {
+    if( iReceivedChallengesQueue.Count() == 0 )
+		{
+		// wait for items to arrive
+		iTimer->Queue( aTimeout * KSecondAsMicros, iReceiveTimeout );
+		iActiveWait.Start();
+		}
+
+	// Is the queue still empty ? (i.e. timeout occurred)
+	if( iReceivedChallengesQueue.Count() == 0 )
+		{
+		User::Leave( KErrTimedOut );
+		}
+     
+    HBufC8* challenge = iReceivedChallengesQueue[ 0 ];
+    iReceivedChallengesQueue.Remove( 0 );
+    iReceivedChallengesQueue.Compress();
+    
+    return challenge;
+    }
+
+void CTcSIPHttpDigestContainer::QueueReceivedChallengeL( const TDesC8& aRealm )
+    {
+    HBufC8* realm = aRealm.AllocLC();
+    User::LeaveIfError( iReceivedChallengesQueue.Append( realm ) );
+    CleanupStack::Pop(); //realm
+    
+    if( iActiveWait.IsStarted() )
+		{
+		iTimer->Remove( iReceiveTimeout );
+		iActiveWait.AsyncStop();
+		}
+    }
+    
+TInt CTcSIPHttpDigestContainer::ReceiveTimeout( TAny* aSelf )
+	{
+	CTcSIPHttpDigestContainer& self =
+				*reinterpret_cast< CTcSIPHttpDigestContainer* >( aSelf );
+	if( self.iActiveWait.IsStarted() )
+		{
+		self.iActiveWait.AsyncStop();
+		}
+
+	return KErrNone;
+	}