/** Copyright (c) 2002-2005 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: This is the storage of asynchronous imps requests and* background tasks.**/#ifndef CCAREQUESTMAPPER_H#define CCAREQUESTMAPPER_H// INCLUDES#include "PublicEngineDefinitions.h"#include "MCABackgroundInterface.h"#include "MCABackgroundCallback.h"#include "MCABackGroundTaskObserver.h"#include <ImpsDetailed.h>// FORWARD DECLARATIONSclass CCARequest;class TBackgroundNotifier;class CCABackgroundTask;// CLASS DECLARATION/*** Maps requests to responses. Used e.g. CreateGroupL.* Handles background tasks.** @lib CAEngine.lib* @since 1.2*/class CCARequestMapper : public CBase , public MCABackgroundInterface , public MCABackgroundCallback { public: // Constructors and destructor /** * Two-phased constructor. */ static CCARequestMapper* NewL(); /** * Destructor. */ virtual ~CCARequestMapper(); public: // From MCABackgroundInterface /** * @see MCABackgroundInterface */ TInt RegisterBackgroundTask( MCABackgroundTask* aBackgroundTask, TCABackgroundTasks aTaskID, TInt aSubTasks = 1 ); /** * @see MCABackgroundInterface */ TInt RegisterBackgroundObserver( MCABackgroundObserver* BackgroundObserver, TInt aTaskMask, TInt aEventMask ); /** * @see MCABackgroundInterface */ TInt BackgroundTaskStatus( TCABackgroundTasks aTaskID ); /** * @see MCABackgroundInterface */ TInt UnRegisterBackgroundObserver( MCABackgroundObserver* aBackgroundObserver ); private: // From MCABackgroundCallback /** * @see MCABackgroundCallback::HandleBackgroundTask */ TInt HandleBackgroundTask( MCABackgroundInterface::TCABackgroundTasks aTask ); public: // New functions /** * * @param aState specifies the new network state. */ void HandleNetworkStateChange( TNetworkState aState ); /** * Creates request object and starts waiting if wanted. * CCARequestMapper owns the instance of created request, so remember to * call RemoveRequest/RemoveRequestAndLeaveIfErrorL when request is no * longer needed!!! * @since 1.2 * @param aOpId Operation Id of request made * @param aWait Start asynchronous waiting * @param aDestroyAfterComplete Can the request be destroyed after it * has completed * @param aCallBack Callback function to be executed after request is * completed * @return Pointer to request object */ CCARequest* CreateRequestL( TInt aOpId, TBool aWait = ETrue, TBool aDestroyAfterComplete = EFalse, TCallBack aCallBack = NULL ); /** * Finds request according to OpId * @since 1.2 * @param aOpId Operation Id of request * @return Pointer to request object */ const CCARequest* FindRequest( TInt aOpId ); /** * Removes request from queue * @since 1.2 * @param aRequest Request to be removed */ void RemoveRequest( CCARequest* aRequest ); /** * Removes request from queue, and leaves if request's error code * differs from KErrNone * @since 1.2 * @param aRequest Request to be removed */ void RemoveRequestAndLeaveIfErrorL( CCARequest* aRequest ); /** * Handles responses to requests, so remember to call this from your * code if you want request to be processed!!! * @since 1.2 * @param aOpId Operation Id of response * @param aErrorCode Response's error-code */ void HandleRequest( TInt aOpId, TInt aErrorCode ); /** * Cancels all pending requests */ void CancelAllRequests(); /** * Number of waiting requests * @return Number of waiting requests */ TInt WaitCount(); /** * Cancels all pending requests */ void ReportWaitStart(); /** * Cancels all pending requests */ void ReportWaitStop(); /** * Register to receive notifications related to * start and completetion of background task * @param MCABackGroundTaskObserver- object */ void RegisterBackGroundTaskObserver( MCABackGroundTaskObserver* aObserver ); /** * UnRegister from receiving notifications related to * start and completetion of backgroundtask */ void UnRegisterBackGroundTaskObserver( MCABackGroundTaskObserver* aObserver ); /** * To know whether Background task has started * @return TBool */ TBool IsBackgroundTaskPending(); /** * Notify about the state * start and completetion of backgroundtask */ void NotifyBackgroundTaskObservers( ); private: /** * C++ default constructor. */ CCARequestMapper(); /** * Finds request for given operation id * @param aOpId is operation id */ CCARequest* DoFindRequest( TInt aOpId ); /** * Notifies background observers * @param aTaskPosition index of the task in iBackgroundTasks * @param aStatus new status to publis to observers * @param aSubTaksNumber numer of the current subtask * @param aLeaveCode leave code if the subtask if is there any, * KErrNone otherwise */ void NotifyBackgroundObservers( TInt aTaskPosition, TCABackgroundStatus aStatus, TInt aSubTaskNumber, TInt aLeaveCode = 0 ); /** * Registers background task * @param aBackgroundTask pointer of instance * @param aTaskID is id of task * @param aSubTasks is number of subtask, positive * @return KErrNone on success, system wide error code otherwise */ TInt RegisterBackgroundTaskL( MCABackgroundTask* aBackgroundTask, TCABackgroundTasks aTaskID, TInt aSubTasks = 1 ); private: // Data RPointerArray<CCARequest> iRequestArray; TInt iWaitCount; //do own TBool iBackgroundProcessing; RArray<TBackgroundNotifier> iBackgroundObservers; RPointerArray<CCABackgroundTask> iBackgroundTasks; // for background task RPointerArray<MCABackGroundTaskObserver> iBackGroundTaskObserver; };/*** Encapsulates information about a background observer* Internal, used by CCARequestMapper** @lib CAEngine.lib* @since 1.2*/class TBackgroundNotifier { public: // New functions /** * Constructor * @param aBackgroundObserver pointer to background observer * @param aObserverTaskMask task mask ( bitmap ) * @param aObserverEventMask event mask ( bitmap ) */ TBackgroundNotifier( MCABackgroundObserver* aBackgroundObserver , TInt aObserverTaskMask = 0 , TInt aObserverEventMask = 0 ); /** * Equality relation on TBackgroundNotifier * this is required for RArray<TBackgroundNotifier>::Find() * * @param aA for comapre * @param aB for compare * @retrun ETrue if iObservers are the same, EFalse otherwise */ static TBool Identity( const TBackgroundNotifier& aA , const TBackgroundNotifier& aB ); public: //does not own MCABackgroundObserver* iObserver; //for binary and operation, // see MCABackgroundInterface::TCABackgroundTasks TInt iTaskMask; //for binary and operation, // see MCABackgroundInterface::TCABackgroundStatus TInt iEventMask; };#endif // CCAREQUESTMAPPER_H// End of File