windowing/windowserver/nonnga/SERVER/CLIENT.H
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nonnga/SERVER/CLIENT.H	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,295 @@
+// 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:
+// Definition of classes for the class that deals with client communication
+// 
+//
+
+#ifndef __CLIENT_H__
+#define __CLIENT_H__
+
+#include <graphics/wsgraphicdrawerinterface.h>
+#include "WSGRAPHICDRAWERARRAY.H"
+
+#include <e32std.h>
+#include <e32base.h>
+#include <w32std.h>
+#include "w32cmd.h"
+#include "WSOBJIX.H"
+#include "EVQUEUE.H"
+#include "PRIKEY.H"
+#include "wstypes.h"
+
+class CWsWindowBase;
+class CWsClientWindow;
+class CWsPointerCursor;
+class CWsCustomTextCursor;
+class CWsSpriteBase;
+class DWsScreenDevice;
+class CScreen;
+class RHandleBase;
+class CWindowServer;
+class CWsGraphicDrawerObject;
+class CWsGraphicDrawer;
+
+class TWsCursorArrayItem
+	{
+public:
+	CWsSpriteBase *iCursor;
+	TInt iIndex;
+	};
+
+/** Server-side object for a client session.
+
+@internalComponent
+@released
+*/
+class CWsClient : public CSession2, public MWsClient
+	{
+private:
+	enum{EObjectGranularity=5};
+	enum{ENoDefaultSystemPointerCursor=-1};
+public:
+	enum{EPanicLeave=1};
+public:
+	CWsClient(RThread aClient);
+	~CWsClient();
+	inline const RThread& Client() const;
+	inline CWindowServer& WindowServer();
+	void CommandL(TInt aOpcode, const TAny *aCmdData);
+	void StartInitializationL(TUint aConnectionHandle);
+	static const TUint8 *EndOfCommandBuffer();
+	static const TPtrC BufferTPtr(TText *aStart,TInt aLen);
+	static TBool BufferTPtrGc(TText* aStart,TInt aLen,TPtrC& aPtr);
+	static const TPtrC8 BufferTPtr8(TUint8* aStart,TInt aLen);
+	void CommandBufL();
+	static void ReplyBuf(const TAny *aSource, TInt aLength);
+	static void ReplyBuf(const TDesC8 &aDes);
+	static void ReplyBuf(const TDesC16 &aDes);
+	static void ReplySize(const TSize &aSize);
+	static void ReplyPoint(const TPoint &aPoint);
+	static void ReplyRect(const TRect &aRect);
+	static void SetReply(TInt reply);
+	static void PanicCurrentClient(TClientPanic aPanic);
+	void PPanic(TClientPanic aPanic) const;
+	void HandleToWindow(TInt handle,CWsWindowBase **pWin);
+	void HandleToClientWindow(TInt handle,CWsClientWindow **pWin);
+	inline CEventQueue *EventQueue() const;
+	inline CRedrawQueue *RedrawQueue() const;
+	inline CWsObjectIx *ObjectIndex();
+	CWsObject *HandleToObjUntyped(TInt aHandle);
+	CWsObject *HandleToObj(TInt aHandle, WH_HANDLES aType);
+	void RequestComplete(TRequestStatus * &aStatus, TInt aErr);
+//
+	inline void EventReady(const RMessagePtr2& aEventMsg);
+	inline void GetEventData();
+	inline void CancelEvent();
+	inline void PurgePointerEvents();
+
+	inline void RedrawEventReady(const RMessagePtr2& aEventMsg);
+	inline void CancelRedrawEvent();
+	inline void GetRedrawData();
+
+	inline void PriorityKeyEventReady(const RMessagePtr2& aEventMsg);
+	inline void CancelPriorityKeyEvent();
+	inline void GetPriorityKeyData();
+	inline void PriorityKeyPressed(TInt aHandle, const TKeyData &aKey, TInt aScanCode);
+
+	void TriggerRedraw();
+	void SessionPanic(TClientPanic aReason) const;
+	void SessionTerminate();
+	void UpdateWindowOrdinalPrioritys();
+	void CreateNewWindowGroupL(const TWsClCmdCreateWindowGroup &aCmd);
+	void CreateNewWindowL(const TWsClCmdCreateWindow &aCmd);
+	void CreateNewAnimDllL(const TWsClCmdUnion &aParams);
+//
+	void CreateNewSpriteL(const TWsClCmdCreateSprite &aCmd);
+	void CreateNewPointerCursorL(const TWsClCmdCreatePointerCursor &aCmd);
+	void StartSetCustomTextCursorL(const TWsClCmdCustomTextCursorData& aCmd);
+	void CompleteSetCustomTextCursorL(TInt aErr);
+	static CWsCustomTextCursor* FindCustomTextCursor(TInt aIdentifier);
+
+	void CreateNewScreenDeviceL( TInt aDefaultScreenNumber, TUint aClientScreenDevicePointer);
+	void CreateNewBitmapL(const TWsClCmdCreateBitmap &aCmd);
+	void CreateNewClickL(const TUid& aUid);
+//
+	void ReplyGroupName(HBufC *aName, TInt aMaxLength) const;
+	inline TInt ObjectHandle(const CWsObject *aThis);
+	void SetSystemPointerCursorL(TInt aIndex, CWsPointerCursor *aCursor);
+	void ClearSystemPointerCursor(TInt aIndex);
+	void ClaimSystemPointerCursorListL();
+	void FreeSystemPointerCursorList();
+	static CWsPointerCursor *SystemPointerCursor(TInt aIndex);
+	static inline CWsPointerCursor *DefaultSystemPointerCursor();
+	void SetDefaultSystemPointerCursor(TInt aIndex);
+	void SetComputeMode(RWsSession::TComputeMode aComputeMode);
+	void SetClientPriority();
+	inline TInt ConnectionHandle() const;
+	inline DWsScreenDevice *PrimaryScreenDevice() const;
+ 	inline void NotifyScreenDeviceDeleted(DWsScreenDevice* aDeletedScreenDevice);
+	inline CScreen* Screen() const;
+	inline TBool NotClosing() const;
+	inline const RMessage2& ClientMessage() const;
+	void RemoteRead(TDes16& aDes, TInt aOffset);
+	void RemoteRead(TDes8& aDes, TInt aOffset);
+	void RemoteReadL(TDes16& aDes, TInt aOffset);
+	void RemoteReadL(TDes8& aDes, TInt aOffset);
+	static void DeleteStatics();
+	void SetResponseHandle(RHandleBase* aHandle);
+
+	// from MWsClient
+	TBool HasCapability(TCapability aCapability) const;
+	TSecureId SecureId() const;
+	TVendorId VendorId() const;
+	TInt SendMessage(const CWsGraphicDrawer* aOnBehalfOf,const TDesC8& aData);
+	TInt SendMessage(const CWsGraphicDrawer* aOnBehalfOf,CWsMessageData& aData);
+
+	CWsGraphicDrawerObject* DrawerObject(const CWsGraphicDrawer* aDrawer);
+	const CWsGraphicDrawerObject* DrawerObject(const CWsGraphicDrawer* aDrawer) const;
+	static inline CWsClient* CurrentClient();
+	static inline TBool CheckBuffer(TInt aLength, TInt aMaxLength);
+ 	static TBool DebugEnforceRedrawCallingConvention();
+private: // from CSession2
+	void ServiceL(const RMessage2 &aMessage);
+	void ServiceError(const RMessage2& aMessage,TInt aError);
+private:
+	void CompleteInitializationL();
+	static void DeleteSystemPointerListEntry(TInt aIndex);
+	static TBool FindCursorArrayItem (CArrayFixFlat<TWsCursorArrayItem>* aCursorArray,
+									  TInt aIndex, TInt& aPosition);
+	static inline CWsPointerCursor*& PointerCursor (TInt aPosition);
+	static inline CWsCustomTextCursor*& TextCursor (TInt aPosition);
+	void CommandL(TInt aOpcode, const RMessage2& aMessage);
+	void DoServiceL(const RMessage2& aMessage, TBool& aCompleteRequest);
+	void CompleteMessage(const RMessage2& aMessage,TInt aReason);
+	void InitialiseScreenDevices();
+	inline TBool IsInitialised();
+	void DebugInfoL(TInt aFunction, TInt aParam, TBool aHasReplyBuf) const;
+public:
+	static TWsCmdHeaderBase iCurrentCommand;
+private:
+	enum TInternalFlags
+		{
+		EPanicClientAsSoonAsPossible	=0x01,		//The client should be panicked, but we have no way to panic him now
+		EClientIsClosing		=0x02,		//The client is closing down, so the screen device may no longer be valid
+		};
+private:	// Private data
+	RThread iClient;
+	TUint iConnectionHandle; // Connection ID, only needed for logging, could bin this
+	CEventQueue *iEventQueue;
+	CRedrawQueue *iRedrawQueue;
+	CPriorityKey *iPriorityKeyEvent;
+	CWsGraphicMessageQueue iGraphicMessageQueue;
+	RWsSession::TComputeMode iComputeMode;
+	CWsObjectIx *iObjectIndex;
+	DWsScreenDevice *iPrimaryScreenDevice;
+	TWsCursorArrayItem iTempCustomTextCursor;
+	CScreen* iScreen;		//## This needs updating
+	mutable TInt iPanicReason;
+	mutable TInt iInternalFlags;
+	RMessage2 iClientMessage;
+	RHandleBase* iResponseHandle;
+	TInt iMessageIdSeq;
+	TBool iIsInitialised;
+#if defined(_DEBUG)
+	TBool iLastCommand;
+#endif
+	static CWsClient *iCurrentClient;	// Client who's buffer is currently being processed
+	static TInt iReply;					// Value to reply
+	static TInt iReplyOffset;			// Offset into reply to write next block of data
+	static TInt iDefaultSystemPointerCursorIndex;		//Negative when there isn't one
+	static CWsPointerCursor *iDefaultSystemPointerCursor;
+	static CArrayFixFlat<TWsCursorArrayItem> *iSystemPointerCursors;
+	static CWsClient *iSystemPointerCursorListOwner;
+	static CArrayFixFlat<TWsCursorArrayItem> *iTextCursorArray;
+	static TBuf8<EClientBufferMaxSize> iCmdBuf;
+	static TUint iConnectionId;
+ 	static TBool iDebug_EnforceRedrawCallingConvention;
+#if defined(__WINS__)
+	TBool iRemoveKeyCode;
+public:
+	inline TBool RemoveKeyCode();
+#endif
+	};
+
+
+//
+// inlines			//
+//
+
+//
+inline const RThread& CWsClient::Client() const
+	{return iClient;}
+inline CWindowServer& CWsClient::WindowServer()
+	{return *reinterpret_cast<CWindowServer*>(const_cast<CServer2*>(Server()));}
+inline void CWsClient::EventReady(const RMessagePtr2& aEventMsg)
+	{iEventQueue->EventReady(aEventMsg);}
+inline void CWsClient::GetEventData()
+    {iEventQueue->GetData();}
+inline void CWsClient::PurgePointerEvents()
+	{iEventQueue->PurgePointerEvents();}
+inline void CWsClient::CancelEvent()
+	{iEventQueue->CancelRead();}
+inline void CWsClient::RedrawEventReady(const RMessagePtr2& aEventMsg)
+    {iRedrawQueue->EventReady(aEventMsg);}
+inline void CWsClient::GetRedrawData()
+    {iRedrawQueue->GetData();}
+inline void CWsClient::CancelRedrawEvent()
+	{iRedrawQueue->CancelRead();}
+inline void CWsClient::PriorityKeyEventReady(const RMessagePtr2& aEventMsg)
+    {iPriorityKeyEvent->EventReady(aEventMsg);}
+inline void CWsClient::CancelPriorityKeyEvent()
+	{iPriorityKeyEvent->CancelRead();}
+inline void CWsClient::GetPriorityKeyData()
+	{iPriorityKeyEvent->GetData();}
+inline void CWsClient::PriorityKeyPressed(TInt aHandle, const TKeyData &aKey, TInt aScanCode)
+	{iPriorityKeyEvent->PriorityKey(aHandle,aKey,aScanCode);}
+inline TInt CWsClient::ObjectHandle(const CWsObject *aThis)
+	{return(iObjectIndex->At(aThis));}
+#if defined(__WINS__)
+inline TBool CWsClient::RemoveKeyCode()
+	{return iRemoveKeyCode;}
+#endif
+//
+inline CEventQueue *CWsClient::EventQueue() const
+	{return(iEventQueue);}
+inline CRedrawQueue *CWsClient::RedrawQueue() const
+	{return(iRedrawQueue);}
+inline CWsObjectIx *CWsClient::ObjectIndex()
+	{return(iObjectIndex);}
+inline TInt CWsClient::ConnectionHandle() const
+	{return(iConnectionHandle);}
+inline DWsScreenDevice *CWsClient::PrimaryScreenDevice() const
+	{return(iPrimaryScreenDevice);}
+inline void CWsClient::NotifyScreenDeviceDeleted(DWsScreenDevice* aDeletedScreenDevice)
+	{
+	if (iPrimaryScreenDevice == aDeletedScreenDevice)
+		iPrimaryScreenDevice = NULL;
+	}
+inline CWsPointerCursor*& CWsClient::PointerCursor(TInt aIndex)
+	{return (CWsPointerCursor*&)(*iSystemPointerCursors)[aIndex].iCursor;}
+inline CWsCustomTextCursor*& CWsClient::TextCursor(TInt aIndex)
+	{return (CWsCustomTextCursor*&)(*iTextCursorArray)[aIndex].iCursor;}
+inline const RMessage2& CWsClient::ClientMessage() const
+	{return iClientMessage;}
+inline CScreen* CWsClient::Screen() const
+	{return iScreen;}
+inline TBool CWsClient::NotClosing() const
+	{return !(iInternalFlags&EClientIsClosing);}
+inline CWsClient* CWsClient::CurrentClient()
+	{return iCurrentClient;}
+inline TBool CWsClient::CheckBuffer(TInt aLength, TInt aMaxLength)
+	{return TBool((aLength>=0) && (aLength<=aMaxLength));}
+inline TBool CWsClient::IsInitialised()
+	{return iIsInitialised;}
+#endif