diff -r 826cea16efd9 -r 13a33d82ad98 videoconnutility/connutility/inc/vcxconnutilwaitsch.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoconnutility/connutility/inc/vcxconnutilwaitsch.h Wed Sep 01 12:20:37 2010 +0100 @@ -0,0 +1,166 @@ +/* +* 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 declaration file* +*/ + + + + +#ifndef __CVCXCONNUTILWAITSCH_H +#define __CVCXCONNUTILWAITSCH_H + +// INCLUDES +#include +#include +#include + + +class CVcxConnUtilWait; +class CActiveSchedulerWait; + +// CLASS DECLARATION + +/** + * CVcxConnUtilWaitSch is used to manage CActiveSchedulerWait objects + * within videoconnutility. + * Basically, when client calls wait, a new CActiveSchedulerWait is created + * and being put to list. Different types for waits are managed by different + * wait -wrapper object, which type is defined as a private class for this class. + * + * Currently videoconnutility puts active objects to wait in following situations: + * + * (1) When there is connection creation ongoing and other active objects try to + * create connection: only the one active object that is creating connection is runnig, + * other a-objects waits as long as connection is ready + * + * (2) Master waiting for roaming status from slave instances: Master's roaming active object is + * waiting for roaming response status change. + * + * (3) Connection creation during roaming: All active objects requesting connection during roaming + * are put to wait for the roaming to finish, so that correct iap id can be returned. + * + * (4) Disconnecting during roaming. Master's disconnecting a-object(s) is put to wait for + * roaming to finish + * + * Waiting is released by the client by calling EndWait. CVcxConnUtilWaitSch basicallly + * stops wait for every wait object, put those whose type is not the one provided + * by the parameter of EndWait are being put back to wait. This solution is needed, to + * prevent deadlocks: we might have different kind of waits at the same time, but not all + * are to be released at the same time, but because of the nature of the ActiveScheduler, + * all wait objects are needed to release once, before anyone can proceed. + * + * + */ +NONSHARABLE_CLASS( CVcxConnUtilWaitSch ) : public CBase + { + public: // Constructors and destructor + + /** + * Destructor. + */ + ~CVcxConnUtilWaitSch(); + + /** + * Two-phased constructor. + */ + static CVcxConnUtilWaitSch* NewL(); + + /** + * Two-phased constructor. + */ + static CVcxConnUtilWaitSch* NewLC(); + + private: + + /** + * Constructor for performing 1st stage construction + */ + CVcxConnUtilWaitSch(); + + /** + * EPOC default constructor for performing 2nd stage construction + */ + void ConstructL(); + + public: + + /** + * Method creates a new CVcxConnUtilWait object in case + * one with provided type does not already exist, then + * creates a CActiveSchedulerWait object for the current + * active object and puts it to wait by calling + * CActiveSchedulerWait::Start. After call returns (wait has + * released) checks if CVcxConnUtilWait's iCanStop is ETrue. + * In case it is not, the object is being put back to wait. + * + * After wait object is really released, it is being deallocated. + * + * Method leaves with systemwide error code, in case object + * creation or saving to array fails. + * + * @param aWaitId wait type id for this wait + */ + void WaitL( TUint32 aWaitId ); + + + /** + * Method loops all CVcxConnUtilWait objects and sets their + * iCanStop to ETrue, in case aWaitId is same as CVcxConnUtilWait's + * iType. + * All CActiveSchedulerWait's for each CVcxConnUtilWait is being + * released by calling CActiveSchedulerWait::AsyncStop. + * + * @param aWaitId wait type id for this wait + */ + void EndWait( TUint32 aWaitId ); + + + private: + + /** + * Internal helper method for getting corresponding + * CVcxConnUtilWait object based in the aID. + * + * In case aID -type object is not found from the + * iWaits -array, it is being created and appended to array. + * + * @param aID wait type id for this wait + */ + CVcxConnUtilWait* GetWaitL( TUint32 aID ); + + /** + * Internal helper method for PrepareWaitObjectL for + * getting next not started Active scheduler wait + * object for given CVcxConnUtilWait. + * + * If there is no existing not started object or given + * CVcxConnUtilWait is NULL a new CActiveSchedulerWait + * object is created and appended to the aWait object's + * waitarray. + * + * + * @param aWait wait wait object from where to search + */ + CActiveSchedulerWait* GetActiveSWaitL( CVcxConnUtilWait* aWait ); + + private: + /** + * Array containing all CVcxConnUtilWait objects maintained + * by this object + */ + RPointerArray< CVcxConnUtilWait > iWaits; + + }; + +#endif // __CVCXCONNUTILWAITSCH_H