hwpluginsimulation/mocksy/inc/cmocksyengine.h
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hwpluginsimulation/mocksy/inc/cmocksyengine.h	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,206 @@
+// Copyright (c) 2007-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 CMOCKSYENGINE_H
+#define CMOCKSYENGINE_H
+
+#include <e32def.h>
+#include <e32base.h>
+class CRotatingStrBuf;
+
+#define KMaxLogLineSize 255
+
+/**
+Listener to CMockSYEngine events
+*/
+class MMockSYEngineListener
+	{
+public:
+	enum TNotificationType
+		{
+		EHandlingTerminated,	//< all messages are handled
+		EFailure,				//< receive message doesn't correspond to the expected one
+		};
+
+	virtual void Notify(TNotificationType aNotification) =0;	
+	};
+
+
+/**
+Abstract class for command data
+*/
+class MMockSyEngineData
+	{
+public:
+	/**
+	Comparator: compare the data with it packaged version from an Event
+	*/
+	virtual TBool operator ==(const TDesC8& aData) const =0;
+	};
+
+
+/**
+Abstract class for the logger
+*/
+
+/**
+Mock SY engine base class
+*/
+class CMockSYEngine : public CBase
+	{
+public:
+	IMPORT_C virtual ~CMockSYEngine();
+
+public:
+	/**
+	Called by the SY, handle received command by verifing that is the expected command
+	and queuing the conresponding completions
+	Return KErrCorrupt it it's not the expected command
+	*/
+	IMPORT_C TInt ExecuteCommandL(TInt aCmdId, MMockSyEngineData& aData);
+	/**
+	Check data or not depending on the aCheckData
+	*/
+    IMPORT_C TInt ExecuteCommandL(TInt aCmdId, MMockSyEngineData& aData, TBool aCheckData);	
+
+public:	
+	inline void SessionClosed();
+	inline void QueueEpectedCallL(TInt aCmdId, TInt aErrorCode, TBool aLeave, HBufC8* aData);
+	inline void QueueReturnCallL(TInt aCmdId,  TInt aErrorCode, TInt aDelay, HBufC8* aData);
+	HBufC* GetNextLogLine();
+	
+	inline TBool HasWaitingEvents() const;
+	inline TBool HasPendingEvents() const;
+	inline TBool HasFailure() const;
+        IMPORT_C void CheckAndUpdateTransId(TUint8 aTransId, TInt aCommandId);
+	
+public: // listener API
+	void AddListenerL(MMockSYEngineListener& aListener);
+	void RemoveListener(MMockSYEngineListener& aListener);
+    TInt PauseCompletion();
+    TInt ResumeCompletion();
+
+protected:
+	IMPORT_C virtual void ConstructL();
+	IMPORT_C CMockSYEngine();
+
+protected:
+	/**
+	A LTSY event.
+	It can be a message as received from the LTSY or a completion to send to CTSY
+	*/
+	class TMockSYEvent
+		{
+	public:
+		enum TEventType
+			{
+			EMessage,
+			ECompletion
+			};
+		TEventType	iEventType;					//< Event type
+		TInt 		iCmdId;						//< expected cmdId or cmdId to complete
+		TInt 		iResultCode;				//< Message or completion result code 
+		TBool		iLeave;						//< If True, leave with iResultCode error
+		TInt		iDelay;						//< for completion: delay before sending the completion
+		RBuf8		iData;						//< Message or completion data
+	public:
+		TDblQueLink	iWaitingEventQueLink;		//< Link for the waiting event queue
+		TDeltaQueLink iPendingEventQueLink;		//< Link for the pending event queue
+		};
+
+protected:
+	/**
+	Complete aEvent. Subclass must implement this function and complete the 
+	SY request
+	*/ 
+	virtual void DoCompleteEventL(const TMockSYEvent& aEvent) =0;
+	/**
+	Queue an event. 
+	*/
+	IMPORT_C virtual void DoQueueEventL(TMockSYEvent::TEventType aType, TInt aCmdId, HBufC8* aData, 
+		TInt aResultCode, TBool aLeave, TInt aDelay);
+	/**
+	 	Returns if MockSY can ignore a given unexpected IPC error.
+	 */
+	IMPORT_C virtual TBool CanIgnoreUnexpectedIpc(TInt aCmdId);
+	
+private:
+	TDblQue<TMockSYEvent> 	iWaitingEventQue;
+	TDeltaQue<TMockSYEvent>	iPendingEventQue;
+	TBool iFailure;
+
+	CPeriodic* iTimer;
+
+	RPointerArray<MMockSYEngineListener> iListeners;
+	
+private:
+	void DoTimerCallbackL();
+
+protected:
+	IMPORT_C virtual void Failure();
+	IMPORT_C virtual void Reset();
+
+private: // listener API
+	void NotifyListeners(MMockSYEngineListener::TNotificationType aNotification);
+	
+protected: // logging: can be override to log specific informations
+	IMPORT_C virtual void LogRequest(TInt aCmdId, const MMockSyEngineData& aData,TInt aResultCode);
+	IMPORT_C virtual void LogCompletion(TInt aCmdId, const TDesC8& aData,TInt aResultCode);
+	IMPORT_C virtual void LogExpectError(TInt aCmdId, const MMockSyEngineData& aData,TInt aExpectedCmd,const TDesC8& aExpectedData, TBool aIsErrorIgnored=EFalse);	
+	IMPORT_C virtual void Log(const TDesC& aDesc);
+	
+private: // static timer callback
+	CRotatingStrBuf* iRotatingLog;
+	static TInt TimerCallbackL(TAny* aPtr);
+	TBool iPaused;
+	};
+	
+
+// inlines
+inline void CMockSYEngine::QueueEpectedCallL(TInt aCmdId, TInt aErrorCode, TBool aLeave, HBufC8* aData)
+	{
+	DoQueueEventL(TMockSYEvent::EMessage, aCmdId, aData, aErrorCode, aLeave, 0);
+	}
+
+inline void CMockSYEngine::QueueReturnCallL(TInt aCmdId, TInt aErrorCode, TInt aDelay, HBufC8* aData)
+	{
+	DoQueueEventL(TMockSYEvent::ECompletion, aCmdId, aData, aErrorCode, EFalse, aDelay);
+	}
+
+inline TBool CMockSYEngine::HasWaitingEvents() const
+	{
+	return !iWaitingEventQue.IsEmpty();
+	}
+	
+inline TBool CMockSYEngine::HasPendingEvents() const
+	{
+	return !iPendingEventQue.IsEmpty();
+	}
+
+inline TBool CMockSYEngine::HasFailure() const
+	{
+	return iFailure;
+	}
+
+/**
+Called when the session using this engine is closed
+*/
+inline void CMockSYEngine::SessionClosed()
+	{
+	iFailure = EFalse;
+	Reset();
+	}
+
+#endif