diff -r 826cea16efd9 -r 13a33d82ad98 videoconnutility/connutility/src/vcxconnutilwaitsch.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoconnutility/connutility/src/vcxconnutilwaitsch.cpp Wed Sep 01 12:20:37 2010 +0100 @@ -0,0 +1,225 @@ +/* +* 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 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: CCVcxConnUtilWaitSch class definition file* +*/ + + + + + +#include "vcxconnutilwaitsch.h" + + + /** + * CVcxConnUtilWait is used to wrap CActiveScheduler objects to be used + * as "wait-type" context within videoconnutility. + * Each CVcxConnUtilWait object has a wait type -id for whose + * object maintans an array of CActiveScheduler objects' wait state. + */ +NONSHARABLE_CLASS( CVcxConnUtilWait ) : public CBase + { + public: + + /** + * Destructor. + */ + ~CVcxConnUtilWait() + { + iWaitArray.ResetAndDestroy(); + }; + + /** + * Default constructor + */ + CVcxConnUtilWait( ) {}; + + /** + * Wait type id + */ + TUint32 iType; + + /** + * Flag to indicate wether CActiveScheduler maintained + * by this object can really be released. In case flag is + * false, CActiveScheduler -objects need to be put to wait + * again right after their release. + */ + TBool iCanStop; + + /** + * Array containing CActiveScheduler maintained + * by this object + */ + RPointerArray < CActiveSchedulerWait > iWaitArray; + }; + + +// ----------------------------------------------------------------------------- +// CVcxConnUtilWaitSch::CVcxConnUtilWaitSch() +// ----------------------------------------------------------------------------- +// +CVcxConnUtilWaitSch::CVcxConnUtilWaitSch() + { + // No implementation required + } + +// ----------------------------------------------------------------------------- +// CVcxConnUtilWaitSch::~CVcxConnUtilWaitSch() +// ----------------------------------------------------------------------------- +// +CVcxConnUtilWaitSch::~CVcxConnUtilWaitSch() + { + iWaits.ResetAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// CVcxConnUtilWaitSch::NewLC() +// ----------------------------------------------------------------------------- +// +CVcxConnUtilWaitSch* CVcxConnUtilWaitSch::NewLC() + { + CVcxConnUtilWaitSch* self = new (ELeave)CVcxConnUtilWaitSch(); + CleanupStack::PushL(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CVcxConnUtilWaitSch::NewL() +// ----------------------------------------------------------------------------- +// +CVcxConnUtilWaitSch* CVcxConnUtilWaitSch::NewL() + { + CVcxConnUtilWaitSch* self = CVcxConnUtilWaitSch::NewLC(); + CleanupStack::Pop( self ); // self; + return self; + } + +// ----------------------------------------------------------------------------- +// CVcxConnUtilWaitSch::WaitL() +// ----------------------------------------------------------------------------- +// +void CVcxConnUtilWaitSch::WaitL( TUint32 aWaitId ) + { + CVcxConnUtilWait* wait = GetWaitL( aWaitId ); + CActiveSchedulerWait* activeWait = GetActiveSWaitL( wait ); + + while( !wait->iCanStop ) + { + activeWait->Start(); + } + + TInt index = wait->iWaitArray.FindL( activeWait ); + if( index != KErrNotFound ) + { + wait->iWaitArray.Remove( index ); + } + delete activeWait; + + if( !wait->iWaitArray.Count() ) + { + index = iWaits.FindL( wait ); + if( index != KErrNotFound ) + { + iWaits.Remove( index ); + } + delete wait; + } + } + +// ----------------------------------------------------------------------------- +// CVcxConnUtilWaitSch::EndWait() +// ----------------------------------------------------------------------------- +// +void CVcxConnUtilWaitSch::EndWait( TUint32 aWaitId ) + { + TInt waitCount( 0 ); + TInt asWaitCount( 0 ); + + waitCount = iWaits.Count(); + + for( TInt i( 0 ); i < waitCount; ++i ) + { + iWaits[ i ]->iCanStop = ( aWaitId == iWaits[ i ]->iType ); + + asWaitCount = iWaits[ i ]->iWaitArray.Count(); + + for( TInt j( 0 ); j < asWaitCount; ++j ) + { + if( iWaits[ i ]->iWaitArray[ j ]->IsStarted() ) + { + iWaits[ i ]->iWaitArray[ j ]->AsyncStop(); + } + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxConnUtilWaitSch::GetWaitL() +// ----------------------------------------------------------------------------- +// +CVcxConnUtilWait* CVcxConnUtilWaitSch::GetWaitL( TUint32 aID ) + { + CVcxConnUtilWait* wait( 0 ); + TInt count( 0 ); + count = iWaits.Count(); + + for( TInt i( 0 ); i < count; ++i ) + { + if( iWaits[ i ]->iType == aID ) + { + wait = iWaits[ i ]; + break; + } + } + if( !wait ) + { + wait = new (ELeave) CVcxConnUtilWait(); + CleanupStack::PushL( wait ); + wait->iType = aID; + iWaits.AppendL( wait ); + CleanupStack::Pop( wait ); + } + return wait; + } + +// ----------------------------------------------------------------------------- +// CVcxConnUtilWaitSch::GetActiveSWaitL() +// ----------------------------------------------------------------------------- +// +CActiveSchedulerWait* CVcxConnUtilWaitSch::GetActiveSWaitL( CVcxConnUtilWait* aWait ) + { + CActiveSchedulerWait* item( 0 ); + if( aWait ) + { + TInt count( aWait->iWaitArray.Count() ); + for( TInt i( 0 ); i < count; i++ ) + { + if( !( aWait->iWaitArray[i]->IsStarted() ) ) + { + item = aWait->iWaitArray[i]; + break; + } + } + } + if( !item ) + { + item = new ( ELeave) CActiveSchedulerWait; + CleanupStack::PushL( item ); + aWait->iWaitArray.AppendL( item ); + CleanupStack::Pop( item ); + } + return item; + } +// End of file +