windowing/windowserver/nonnga/SERVER/CLIENT.H
author Faisal Memon <faisal.memon@nokia.com>
Thu, 06 May 2010 11:31:11 +0100
branchNewGraphicsArchitecture
changeset 47 48b924ae7197
parent 0 5d03bc08d59c
permissions -rw-r--r--
Applied patch 1, to provide a syborg specific minigui oby file. Need to compare this with the "stripped" version currently in the tree. This supplied version applies for Nokia builds, but need to repeat the test for SF builds to see if pruning is needed, or if the file needs to be device-specific.

// 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