--- /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