appfw/viewserver/inc/VWSEVENT.H
changeset 0 2e3d3ce01487
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/appfw/viewserver/inc/VWSEVENT.H	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,285 @@
+// Copyright (c) 1999-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 __VWSEVENT_H__
+#define __VWSEVENT_H__
+
+#include <e32std.h>
+
+#include "VWSQUEUE.H"
+#include "VWSERVER.H"
+#include "VWSSESSN.H"
+#include "VWSADDOB.H"
+#include "VWSSEVNT.H"
+
+
+/**
+ * The CVwsThreadWatcher class actively watches an application thread and makes a call back on thread death.
+ */
+class CVwsThreadWatcher : public CActive
+	{
+public:
+	~CVwsThreadWatcher();
+	CVwsThreadWatcher();
+	TInt StartWatching(const TThreadId& aThreadId, const TCallBack& aCallBack);
+protected:
+	void RunL();
+	void DoCancel();
+protected:
+	RThread iThread;
+	TCallBack iCallBack;
+	};
+
+
+class MVwsEventTimerObserver;
+
+/**
+ * The CVwsEventTimer class times the processing of an event and notifies an observer if the processing time
+ * exceeds server limits.
+ */
+class CVwsEventTimer : public CBase
+	{
+public:
+	enum TTimeOut
+		{
+		EUndefined,
+		EClientRequestTimeOut,
+		EServerEventTimeOut,
+		EIntermediateEventTimeOut
+		};
+public:
+	~CVwsEventTimer();
+	static CVwsEventTimer* NewLC(const TTimeIntervalMicroSeconds32& aClientRequestTimeOut, const TTimeIntervalMicroSeconds32& aServerEventTimeOut);
+	void Start(MVwsEventTimerObserver* aObserver,const TBool& aScreenDeviceChangeEvent);
+public:
+	static TInt TimerCallBack(TAny* aSelf);
+	void DoTimerCallBack();
+private:
+	CVwsEventTimer(const TTimeIntervalMicroSeconds32& aClientRequestTimeOut, const TTimeIntervalMicroSeconds32& aServerEventTimeOut);
+	void ConstructL();
+private:
+	CPeriodic* iPeriodic;
+	MVwsEventTimerObserver* iObserver;
+	TTimeIntervalMicroSeconds32 iClientRequestTimeOut;
+	TTimeIntervalMicroSeconds32 iServerEventTimeOut;
+	TTimeOut iTimeOutState;
+	TBool iScreenDeviceChangeEvent;
+	};
+
+
+/**
+ * The MVwsEventTimerObserver class provides an interface to handle time out call-backs from the CVwsEventTimer
+ *
+ */
+class MVwsEventTimerObserver
+	{
+public:
+	virtual void HandleTimeOut(CVwsEventTimer::TTimeOut aTimeOut)=0;
+	};
+
+
+/**
+ * The CVwsServerEvent class is the base class for server events generated on receipt of requests to the view server.
+ */ 
+class CVwsServerEvent : public CVwsEvent
+	{
+public:
+	CVwsServerEvent(CVwsServer& aServer,TType aType,CVwsEventQueue& aQueue);
+	~CVwsServerEvent();
+private:
+	virtual void HandleLastOnQueue();
+protected:
+	CVwsServer& iServer;
+	CVwsSessionEvent* iObserved;
+	};
+
+
+/**
+ * The CVwsServerEvent_Activate class represents a view activation request in the server. It owns the message contents buffer
+ * associated with a view activation request.
+ */ 
+class CVwsServerEvent_Activate : public CVwsServerEvent, public MVwsSessionObserver, public MVwsViewAdditionObserver, public MVwsEventTimerObserver
+	{
+public:
+	CVwsServerEvent_Activate(CVwsServer& aServer,TType aType,CVwsEventQueue& aQueue,const TVwsViewId& aViewIdToActivate,CVwsClientMessage* aClientMessage,const RMessage2& aMessage,const TThreadId& aClientThreadId,TVwsCompleteRequest aCompleteRequest,CVwsThreadWatcher* aThreadWatcher, CVwsEventTimer* aEventTimer,const RThread& aThreadOfClientInitiatingViewSwitch);
+	~CVwsServerEvent_Activate();
+	static TInt AppThreadWatcherCallBack(TAny* aPtr);
+
+private: // From CVwsServerEvent.
+	virtual void ProcessEventL();
+protected:
+	virtual void HandleSessionRemoval(const TThreadId& aClientThreadId);
+protected: // From MVwsSessionObserver.
+	virtual void RequestCompleted(TRequestType aType,TInt aError,const RMessage2& aMessage);
+	virtual void NowObserving(CVwsSessionEvent* aObserved);
+	virtual void NullifyObserved();
+private: // From MVwsViewAdditionObserver.
+	virtual void HandleViewAdded(const TVwsViewId& aViewId, const TThreadId& aNewViewClientThreadId);
+public: // from MVwsEventTimerObserver
+	virtual void HandleTimeOut(CVwsEventTimer::TTimeOut aTimeOut);
+protected:
+	void RequestActivateNewView();
+	void RequestActivateSystemDefaultView();
+	void DoRequestActivateNewView(CVwsSession& aSessionWithNewView);
+	void RequestDeactivateOldView();
+	void RequestAppStart();
+	void Complete(TInt aError);
+	void StartAppStartProfile();
+	void StopAppStartProfile();
+	void StartActivationProfile();
+	void StopActivationProfile();
+private:
+	enum TState
+		{
+		EPending,
+		EAppStartRequested,
+		EActivationRequested,
+		ESystemDefaultActivationRequested,
+		EDeactivationRequested
+		};
+	enum TWhichProfile
+		{
+		ENone,
+		EAppStart,
+		EActivation
+		};
+private:
+	TInt RequestClientActivation(CVwsSession& aSession,CVwsClientMessage* aClientMessage,TState aNewState);
+	void CustomCrossCheck(CVwsSession& aSessionWithNewView);
+protected:
+	TVwsViewId iViewIdToActivate;
+	CVwsClientMessage* iClientMessage;
+	TThreadId iNewViewClientThreadId;
+private:
+	TState iState;
+	TWhichProfile iWhichProfile;
+	TVwsCompleteRequest iCompleteRequest;
+	CVwsSession* iSessionWithNewView;
+	TThreadId iClientThreadId;
+	const RMessage2 iMessage;
+	CVwsThreadWatcher* iThreadWatcher;
+	CVwsEventTimer* iEventTimer;
+	RThread iThreadOfClientInitiatingViewSwitch;
+	};
+
+
+/**
+ * The CVwsServerEvent_ScreenDeviceChanged class represents a screen device change request in the server.
+ */ 
+class CVwsServerEvent_ScreenDeviceChanged : public CVwsServerEvent_Activate
+	{
+public:
+	CVwsServerEvent_ScreenDeviceChanged(CVwsServer& aServer,CVwsEventQueue& aQueue,CVwsThreadWatcher* aThreadWatcher, CVwsEventTimer* aEventTimer);
+	~CVwsServerEvent_ScreenDeviceChanged();
+	static TInt AppThreadWatcherCallBack(TAny* aPtr);
+private: // From CVwsServerEvent.
+	virtual void ProcessEventL();
+	virtual void HandleAddedToQueue();
+	virtual void HandleSessionRemoval(const TThreadId& aClientThreadId);
+private: // From MVwsSessionObserver.
+	virtual void RequestCompleted(TRequestType aType,TInt aError,const RMessage2& aMessage);
+	virtual void NowObserving(CVwsSessionEvent* aObserved);
+	virtual void NullifyObserved();
+private:
+	virtual void HandleTimeOut(CVwsEventTimer::TTimeOut aTimeOut);
+private:
+	void RequestChangeNotification();
+	void RequestActivationAsRequiredL(const RMessage2& aMessage);
+	void Complete(TInt aError);
+private:
+	enum TScreenDeviceNotificationState
+		{
+		EPending,
+		EScreenDeviceChangeNotificationRequested,
+		EViewActivationRequested,
+		EDefaultSystemViewActivationRequested
+		};
+private:
+	TScreenDeviceNotificationState iScreenDeviceNotificationState;
+	CVwsThreadWatcher* iThreadWatcher;
+	CVwsEventTimer* iEventTimer;
+	};
+
+
+/**
+ * The CVwsServerEvent_DeactivateActiveView class represents a deactivation request in the server. A client view activation is
+ * implemented as an activation followed by a deactivation event in the server.
+ */
+class CVwsServerEvent_DeactivateActiveView : public CVwsServerEvent, public MVwsSessionObserver, public MVwsEventTimerObserver
+	{
+public:
+	CVwsServerEvent_DeactivateActiveView(CVwsServer& aServer,CVwsEventQueue& aQueue,const RMessage2& aMessage,const TThreadId& aClientThreadId,TVwsCompleteRequest aCompleteRequest,CVwsEventTimer* aEventTimer);
+	~CVwsServerEvent_DeactivateActiveView();
+private: // From CVwsServerEvent.
+	virtual void ProcessEventL();
+	virtual void HandleSessionRemoval(const TThreadId& aClientThreadId);
+private: // From MVwsSessionObserver.
+	virtual void RequestCompleted(TRequestType aType,TInt aError,const RMessage2& aMessage);
+	virtual void NowObserving(CVwsSessionEvent* aObserved);
+	virtual void NullifyObserved();
+private: // from MVwsEventTimerObserver
+	virtual void HandleTimeOut(CVwsEventTimer::TTimeOut aTimeOut);
+private:
+	void RequestDeactivationL();
+	void Complete(TInt aError);
+private:
+	enum TState
+		{
+		EPending,
+		EDeactivationRequested
+		};
+private:
+	TState iState;
+	TVwsViewId iActiveView;
+	const RMessage2 iMessage;
+	TThreadId iClientThreadId;
+	TVwsCompleteRequest iCompleteRequest;
+	CVwsEventTimer* iEventTimer;
+	};
+
+
+/**
+ * The CVwsServerEvent_AppStart class represents a direct server-side app start request.
+ */
+class CVwsServerEvent_AppStart : public CVwsServerEvent, public MVwsViewAdditionObserver
+	{
+public:
+	CVwsServerEvent_AppStart(CVwsServer& aServer,CVwsEventQueue& aQueue,const RMessage2& aMessage,const TUid& aAppToStart,CVwsThreadWatcher* aThreadWatcher);
+	~CVwsServerEvent_AppStart();
+	static TInt AppThreadWatcherCallBack(TAny* aPtr);
+private: // From CVwsServerEvent.
+	virtual void ProcessEventL();
+private: // From MVwsViewAdditionObserver.
+	virtual void HandleViewAdded(const TVwsViewId& aViewId, const TThreadId& aNewViewClientThreadId);
+private:
+	void RequestAppStart();
+	void Complete(TInt aError);
+private:
+	enum TState
+		{
+		EPending,
+		EAppStartRequested
+		};
+private:
+	TState iState;
+	TUid iAppToStart;
+	const RMessage2 iMessage;
+	CVwsSession* iSessionWithNewApp;
+	CVwsThreadWatcher* iThreadWatcher;
+	};
+
+
+#endif