tsrc/VCXTestCommon/src/CIptvTestEventWaiter.cpp
changeset 0 96612d01cf9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tsrc/VCXTestCommon/src/CIptvTestEventWaiter.cpp	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,327 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: 
+*
+*/
+
+
+//  INCLUDES
+#include "CIptvTestEventWaiter.h"
+#include "MIptvTestEventWaiterObserver.h"
+#include "CIptvTestEvent.h"
+#include "VCXTestLog.h"
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestEventWaiter* CIptvTestEventWaiter::NewL(MIptvTestEventWaiterObserver& aObserver)
+{
+	VCXLOGLO1(">>>CIptvTestEventWaiter::NewL");
+	CIptvTestEventWaiter* self = new (ELeave) CIptvTestEventWaiter(aObserver);
+
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	CleanupStack::Pop( self );
+	VCXLOGLO1("<<<CIptvTestEventWaiter::NewL");
+	return self;
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::~CIptvTestEventWaiter
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestEventWaiter::~CIptvTestEventWaiter()
+{
+	VCXLOGLO1(">>>CIptvTestEventWaiter::~CIptvTestEventWaiter");
+   	if( IsAdded() )
+        {
+        Deque(); // calls also Cancel()
+        }
+
+	iTimer.Close();
+
+	Reset();
+	VCXLOGLO1("<<<CIptvTestEventWaiter::~CIptvTestEventWaiter");
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::CheckTimeouts
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestEventWaiter::CheckTimeouts()
+{
+	VCXLOGLO1(">>>CIptvTestEventWaiter::CheckTimeouts");
+	TTime now;
+	now.UniversalTime();
+
+	TInt i;
+	for(i=0; i<iEventQueue.Count();i++)
+		{
+		CIptvTestEvent* event = iEventQueue[i];
+		if( event->HasTimeouted( now ) )
+			{
+			VCXLOGLO1("CIptvTestEventWaiter:: event timedout");
+			iObserver.EventWaiterErrorL( KErrTimedOut, *event );
+			VCXLOGLO1("<<<CIptvTestEventWaiter::CheckTimeouts");
+			return KErrTimedOut;
+			}
+		}
+
+	for(i=0; i<iEventDump.Count();i++)
+		{
+		CIptvTestEvent* event = iEventDump[i];
+		if( event->HasTimeouted( now ) )
+			{
+			VCXLOGLO1("CIptvTestEventWaiter:: event timedout");
+			iObserver.EventWaiterErrorL( KErrTimedOut, *event );
+			VCXLOGLO1("<<<CIptvTestEventWaiter::CheckTimeouts");
+			return KErrTimedOut;
+			}
+		}
+
+	VCXLOGLO1("<<<CIptvTestEventWaiter::CheckTimeouts");
+
+	return KErrNone;
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::AddEvent
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestEventWaiter::AddEvent(CIptvTestEvent* aEvent, TBool aSequential)
+{
+	VCXLOGLO1(">>>CIptvTestEventWaiter::AddEvent");
+
+	if(aSequential)
+		{
+		// First event in queue, activate it
+		if(iEventQueue.Count() <= 0)
+			{
+			aEvent->Activate();
+			}
+		// Add event
+		iEventQueue.Append( aEvent );
+		}
+	else
+		{
+		// All events in dump are active
+		iEventDump.Append( aEvent );
+		aEvent->Activate();
+		}
+
+	if( !IsActive() )
+		{
+		iTimer.After(iStatus, 1000000); // once in second
+		SetActive();
+		}
+
+	VCXLOGLO1("<<<CIptvTestEventWaiter::AddEvent");
+	return KErrNone;
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::EventHappened
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestEventWaiter::EventHappened(CIptvTestEvent* aEvent, CIptvTestEvent** aQueuedEvent)
+{
+	VCXLOGLO1(">>>CIptvTestEventWaiter::EventHappened");
+	TBool eventFound = EFalse;
+
+	// Check first from the queue.
+
+	VCXLOGLO1("Event queue:");
+
+	for(TInt i=0; i<iEventQueue.Count();i++)
+		{
+		CIptvTestEvent* event = iEventQueue[i];
+		TBuf<32> name;
+		event->GetName(name);
+		VCXLOGLO3(" queue %d: %S, %d", i, &name);
+		}
+
+	//CheckTimeouts();
+
+	if(iEventQueue.Count() > 0)
+		{
+		CIptvTestEvent* event = iEventQueue[0];
+		TBuf<32> name;
+		event->GetName(name);
+		VCXLOGLO2(" - %S", &name);
+
+		if( !eventFound && event->Compare( *aEvent ) )
+			{
+			iEventQueue.Remove( 0 );
+			if(iEventQueue.Count() > 0)
+				{
+				iEventQueue[0]->Activate();
+				}
+			iPastEvents.Append( event );
+			eventFound = ETrue;
+
+			*aQueuedEvent = event;
+
+			VCXLOGLO1("*Match*");
+			}
+		}
+
+	// Check if the event is in the dump, meaning it can happen any time.
+
+	VCXLOGLO1("Event dump:");
+
+	if(!eventFound)
+		{
+		for(TInt i=0; i<iEventDump.Count();i++)
+			{
+			CIptvTestEvent* event = iEventDump[i];
+
+			TBuf<32> name;
+			event->GetName(name);
+			VCXLOGLO2(" - %S", &name);
+
+			if( !eventFound && event->Compare( *aEvent ) )
+				{
+				iEventDump.Remove( i );
+				iPastEvents.Append( event );
+				eventFound = ETrue;
+				*aQueuedEvent = event;
+				VCXLOGLO1("*Match*");
+				}
+			}
+		}
+
+	// Event was found and there's no more events in queues. Message observer that all events are validated.
+
+	if( eventFound && iEventQueue.Count() == 0 && iEventDump.Count() == 0 )
+		{
+		iObserver.EventWaiterAllEventsValidated();
+		}
+
+	if( !eventFound )
+		{
+		VCXLOGLO1("CIptvTestEventWaiter:: Event not found from queues.");
+
+		if(iEventQueue.Count() > 0)
+			{
+			CIptvTestEvent* event = iEventQueue[0];
+			*aQueuedEvent = event;
+			}
+
+		VCXLOGLO1("<<<CIptvTestEventWaiter::EventHappened");
+		return KErrNotFound;
+		}
+
+	VCXLOGLO1("<<<CIptvTestEventWaiter::EventHappened");
+	return KErrNone;
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::Reset
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestEventWaiter::Reset()
+{
+	VCXLOGLO1(">>>CIptvTestEventWaiter::Reset");
+	iEventQueue.ResetAndDestroy();
+	iEventDump.ResetAndDestroy();
+	iPastEvents.ResetAndDestroy();
+	VCXLOGLO1("<<<CIptvTestEventWaiter::Reset");
+	return KErrNone;
+}
+
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::GetEventCount
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestEventWaiter::GetEventCount()
+{
+	VCXLOGLO1(">>>CIptvTestEventWaiter::GetEventCount");
+	TInt count = 0;
+	count += iEventQueue.Count();
+	count += iEventDump.Count();
+	VCXLOGLO2("<<<CIptvTestEventWaiter:: events in queue: %d", count);
+
+	VCXLOGLO1("<<<CIptvTestEventWaiter::GetEventCount");
+	return count;
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::CIptvTestEventWaiter
+// -----------------------------------------------------------------------------
+//
+CIptvTestEventWaiter::CIptvTestEventWaiter(MIptvTestEventWaiterObserver& aObserver)
+ : CActive(CActive::EPriorityStandard), iObserver(aObserver)
+{
+
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CIptvTestEventWaiter::ConstructL()
+{
+	VCXLOGLO1(">>>CIptvTestEventWaiter::ConstructL");
+	User::LeaveIfError(iTimer.CreateLocal());
+	CActiveScheduler::Add(this);
+	VCXLOGLO1("<<<CIptvTestEventWaiter::ConstructL");
+}
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnectionWaiter::RunL()
+//
+// Handle request completion events
+// ---------------------------------------------------------------------------
+//
+void CIptvTestEventWaiter::RunL()
+	{
+ 	//VCXLOGLO1(">>>CIptvTestEventWaiter::RunL");
+
+//    TInt statusCode = iStatus.Int();
+
+	CheckTimeouts();
+
+	// Start timer again if waiting for events
+
+	if(iEventQueue.Count() > 0 || iEventDump.Count() > 0)
+		{
+
+		if( !IsActive() )
+			{
+			iTimer.After(iStatus, 1000000); // once in second
+			SetActive();
+			}
+		}
+
+
+    //VCXLOGLO1("<<<CIptvTestEventWaiter::RunL");
+	}
+
+// ---------------------------------------------------------------------------
+// CIptvTestEventWaiter::DoCancel()
+//
+// Cancels ongoing requests
+// ---------------------------------------------------------------------------
+//
+void CIptvTestEventWaiter::DoCancel()
+	{
+	VCXLOGLO1(">>>CIptvTestEventWaiter::DoCancel");
+	iTimer.Cancel();
+	VCXLOGLO1("<<<CIptvTestEventWaiter::DoCancel");
+    }
+
+
+// End of File