diff -r 4c282e7dd6d3 -r 5505e8908944 gst_plugins_symbian/tsrc/gstreamertestmodule/src/TimeoutController.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gst_plugins_symbian/tsrc/gstreamertestmodule/src/TimeoutController.cpp Fri Jan 22 09:59:59 2010 +0200 @@ -0,0 +1,334 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the +* Free Software Foundation, Inc., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +* +* Description: +* +*/ + + +#include "GStreamerTestClass.h" +#include "debug.h" + +/* +------------------------------------------------------------------------------- + +Class: CSimpleTimeout + +Method: CSimpleTimeout + +Description: Default constructor + +C++ default constructor can NOT contain any code, that +might leave. + +Parameters: None + +Return Values: None + +Errors/Exceptions: None + +Status: Approved + +------------------------------------------------------------------------------- +*/ +CSimpleTimeout::CSimpleTimeout() : CActive (CActive::EPriorityStandard) +{ + FTRACE(FPrint(_L("CSimpleTimeout::CSimpleTimeout"))); +} + +/* +------------------------------------------------------------------------------- + +Class: CSimpleTimeout + +Method: ConstructL + +Description: Symbian OS second phase constructor + +Symbian OS default constructor can leave. + +Parameters: + +Return Values: None + +Errors/Exceptions: + +Status: Approved + +------------------------------------------------------------------------------- +*/ +void CSimpleTimeout::ConstructL( MTimeoutObserver* aObserver, +CStifLogger* aLogger) +{ + FTRACE(FPrint(_L("CSimpleTimeout::ConstructL"))); + iObserver = aObserver; + iLog = aLogger; + iTimer.CreateLocal(); + iTestCaseTimeout = 0; // Initialize + + // Add to active scheduler + CActiveScheduler::Add ( this ); +} + +/* +------------------------------------------------------------------------------- + +Class: CSimpleTimeout + +Method: NewL + +Description: Two-phased constructor. + +Parameters: const TTestReportOutput aReportOutput: in: Report output type + +Return Values: CSimpleTimeout* : pointer to created object + +Errors/Exceptions: Leaves if memory allocation for object fails +Leaves if ConstructL leaves + +Status: Approved + +------------------------------------------------------------------------------- +*/ +CSimpleTimeout* CSimpleTimeout::NewL( MTimeoutObserver* aTestClass, +CStifLogger* aLogger) +{ + FTRACE(FPrint(_L("CSimpleTimeout::NewL"))); + CSimpleTimeout* self = new ( ELeave ) CSimpleTimeout(); + CleanupStack::PushL( self ); + self->ConstructL( aTestClass, aLogger); + CleanupStack::Pop( self ); + return self; + +} + +/* +------------------------------------------------------------------------------- + +Class: CSimpleTimeout + +Method: ~CSimpleTimeout + +Description: Destructor. + +Cancel request + +Parameters: None + +Return Values: None + +Errors/Exceptions: None + +Status: Approved + +------------------------------------------------------------------------------- +*/ +CSimpleTimeout::~CSimpleTimeout() +{ + FTRACE(FPrint(_L("CSimpleTimeout::~CSimpleTimeout"))); + Cancel(); + iTimer.Close(); +} + +/* +------------------------------------------------------------------------------- + +Class: CSimpleTimeout + +Method: Start + +Description: Start timeout counting + +Parameters: None + +Return Values: None + +Errors/Exceptions: None + +Status: Approved + +------------------------------------------------------------------------------- +*/ +void CSimpleTimeout::Start(TTimeIntervalMicroSeconds aTimeout) +{ + FTRACE(FPrint(_L("CSimpleTimeout::Start"))); + if (IsActive()) + { + Cancel(); + } + + // Request timer + TTime endTime; + endTime.HomeTime(); + endTime = endTime + aTimeout; + + TInt64 miliseconds = aTimeout.Int64(); + miliseconds /= 1000; + + TBuf<30> dateString; + endTime.FormatL(dateString, KFormatTimeStamp); + iLog->Log(_L("Timer=%LD ms, EndTime=%S"), miliseconds, &dateString); + + // Store absolute timeout + iTestCaseTimeout = endTime; + + // Taken from STIF engine + // Note: iTimer.After() method cannot use because there needed + // TTimeIntervalMicroSeconds32 and it is 32 bit. So then cannot create + // timeout time that is long enough. At() uses 64 bit value=>Long enough. + iTimer.At( iStatus, endTime ); + SetActive(); +} + + +/* +------------------------------------------------------------------------------- + +Class: CSimpleTimeout + +Method: Start + +Description: Start timeout counting + +Parameters: None + +Return Values: None + +Errors/Exceptions: None + +Status: Approved + +------------------------------------------------------------------------------- +*/ +void CSimpleTimeout::Stop() +{ + FTRACE(FPrint(_L("CSimpleTimeout::Stop"))); + if (IsActive()) + { + Cancel(); + } +} +/* +------------------------------------------------------------------------------- + +Class: CSimpleTimeout + +Method: RunL + +Description: RunL handles completed timeouts. + +Parameters: None + +Return Values: None + +Errors/Exceptions: None + +Status: Approved + +------------------------------------------------------------------------------- +*/ +void CSimpleTimeout::RunL() +{ + FTRACE(FPrint(_L("CSimpleTimeout::RunL"))); + iLog->Log(_L("CSimpleTimeout::RunL")); + TTime timeout; + timeout.HomeTime(); + // Handle the abort case when system time gets changed, but timeout is + // still valid. All other cases should timeout since they invalidate the + // logic of the timers. + if ( iStatus == KErrAbort) + { + if ( iTestCaseTimeout > timeout ) + { + RDebug::Print( _L( "Absolute timer still valid. Restaring timer. iStatus: %d" ), iStatus.Int() ); + // Start new timer + iStatus = KErrNone; // reset value + iTimer.At ( iStatus, iTestCaseTimeout ); // restart timer + SetActive(); + } + else + { + // Absolute timer no longer valid. Must timeout. + iLog->Log(_L("Absolute timeout no longer valid")); + iObserver->HandleTimeout(KErrNone); + } + + } + else + { + // Status was not KErrAbort. Timing out! + // iLog->Log(_L("CSimpleTimeout::RunL - Timeout !!"), iTimeout); + iLog->Log(_L("Timing out")); + iObserver->HandleTimeout(KErrNone); + } + +} + +/* +------------------------------------------------------------------------------- + +Class: CSimpleTimeout + +Method: DoCancel + +Description: Cancel active request + +Parameters: None + +Return Values: None + +Errors/Exceptions: None + +Status: Approved + +------------------------------------------------------------------------------- +*/ +void CSimpleTimeout::DoCancel() +{ + FTRACE(FPrint(_L("CSimpleTimeout::DoCancel"))); + iTimer.Cancel(); +} + +/* +------------------------------------------------------------------------------- + +Class: CSimpleTimeout + +Method: RunError + +Description: Handle errors. Just let framework handle errors because +RunL does not leave. + +Parameters: TInt aError: in: Symbian OS error: Error code + +Return Values: TInt: Symbian OS error code + +Errors/Exceptions: None + +Status: Approved + +------------------------------------------------------------------------------- +*/ +TInt CSimpleTimeout::RunError( TInt aError ) +{ + FTRACE(FPrint(_L("CSimpleTimeout::RunError"))); + iLog->Log(_L("Timeout error %d"), aError); + iObserver->HandleTimeout(aError); + return aError; +} +