diff -r 924385140d98 -r c2c61fdca848 startupservices/Startup/syserrcmd/tsrc/syserrcmdtest/inc/asyncrequesthandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/startupservices/Startup/syserrcmd/tsrc/syserrcmdtest/inc/asyncrequesthandler.h Wed Sep 01 12:24:48 2010 +0100 @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "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: + * + */ + +#ifndef ASYNCREQUESTHANDLER_H +#define ASYNCREQUESTHANDLER_H + +// SYSTEM INCLUDE FILES +#include + +// DATA TYPES +_LIT( KPanicCat, "ASYNCREQUESTHANDLER" ); + +/** Panic codes */ +enum TArhPanicCodes + { + EArhNone, + EArhRequestPending + }; + +// CLASS DECLARATION + +/** + * A template class for handling asynchronous requests. + * + * @lib None. + * @since S60 TB9.2 + */ +template +NONSHARABLE_CLASS( CAsyncRequestHandler ): public CActive + { +public: + + // TYPE DEFINTIONS + + /** HandleIssueRequest callback */ + typedef void ( T::*HandleIssueRequest )( TRequestStatus& ); + + /** HandleRunL callback */ + typedef void ( T::*HandleRunL )( TInt ); + + /** HandleRunError callback */ + typedef TInt ( T::*HandleRunError )( TInt ); + + /** HandleDoCancel callback */ + typedef void ( T::*HandleDoCancel )(); + + // DATA TYPES + + /** Request type */ + enum TAsyncRequestType + { + ERequestOneShot, + ERequestContinuous + }; + +public: + + /** + * Symbian two phased constructor. + * + * @since S60 TB9.2 + * @param None. + * @return CAsyncRequestHandler* + */ + static CAsyncRequestHandler* NewL( T& aPtr, + HandleIssueRequest aHandleIssueRequest, + HandleRunL aHandleRunL, + HandleRunError aHandleRunError, + HandleDoCancel aHandleDoCancel, + TAsyncRequestType aType = ERequestContinuous ) + { + CAsyncRequestHandler* self = CAsyncRequestHandler::NewLC( aPtr, + aHandleIssueRequest, + aHandleRunL, + aHandleRunError, + aHandleDoCancel, + aType ); + CleanupStack::Pop( self ); + return self; + } + + /** + * Symbian two phased constructor. + * Instance is left in the cleanup stack. + * + * @since S60 TB9.2 + * @param None. + * @return CAsyncRequestHandler* + */ + static CAsyncRequestHandler* NewLC( T& aPtr, + HandleIssueRequest aHandleIssueRequest, + HandleRunL aHandleRunL, + HandleRunError aHandleRunError, + HandleDoCancel aHandleDoCancel, + TAsyncRequestType aType = ERequestContinuous ) + { + CAsyncRequestHandler* self = new CAsyncRequestHandler( aPtr, + aHandleIssueRequest, + aHandleRunL, + aHandleRunError, + aHandleDoCancel, + aType ); + CleanupStack::PushL( self ); + return self; + } + + /** + * C++ destructor. + */ + virtual ~CAsyncRequestHandler() + { + Cancel(); + } + +public: // New methods + + /** + * Issues a new request. + * Panic will occur if there already is a request pending. + * + * @since TB9.2 + * @param None. + * @return None. + */ + void IssueRequest() + { + __ASSERT_DEBUG( !IsActive(), + User::Panic( KPanicCat, EArhRequestPending ) ); + + // Call the HandleIssueRequest from the template class and set active + ( iPtr.*iHandleIssueRequest )( iStatus ); + SetActive(); + } + +protected: // From base classes + + // @see CActive + void RunL() + { + // Check result and issue request again + TInt status = iStatus.Int(); + if( iType == ERequestContinuous ) + { + IssueRequest(); + } + + // Call the HandleRunL from the template class + ( iPtr.*iHandleRunL )( status ); + } + + // @see CActive + TInt RunError( TInt aError ) + { + // Call the HandleRunError from the template class + TInt err = ( iPtr.*iHandleRunError )( aError ); + return err; + } + + // @see CActive + void DoCancel() + { + // Call the HandleDoCancel from the template class + ( iPtr.*iHandleDoCancel )(); + } + +private: + + CAsyncRequestHandler( T& aPtr, + HandleIssueRequest aHandleIssueRequest, + HandleRunL aHandleRunL, + HandleRunError aHandleRunError, + HandleDoCancel aHandleDoCancel, + TAsyncRequestType aType = ERequestContinuous ): + CActive( CActive::EPriorityStandard ), + iPtr( aPtr ), + iHandleIssueRequest( aHandleIssueRequest ), + iHandleRunL( aHandleRunL ), + iHandleRunError( aHandleRunError ), + iHandleDoCancel( aHandleDoCancel ), + iType( aType ) + { + CActiveScheduler::Add( this ); + } + +private: // Data + + /** Pointer to the template class */ + T& iPtr; + + /** HandleIssueRequest function pointer */ + HandleIssueRequest iHandleIssueRequest; + + /** HandleRunL function pointer */ + HandleRunL iHandleRunL; + + /** HandleRunError function pointer */ + HandleRunError iHandleRunError; + + /** HandleDoCancel function pointer */ + HandleDoCancel iHandleDoCancel; + + /** Request type */ + TAsyncRequestType iType; + }; + +#endif // ASYNCREQUESTHANDLER_H