windowing/windowserver/nonnga/SERVER/UTILS.CPP
author Faisal Memon <faisal.memon@nokia.com>
Fri, 25 Jun 2010 17:49:58 +0100
branchEGL_MERGE
changeset 105 158b2308cc08
parent 0 5d03bc08d59c
permissions -rw-r--r--
Fix def files so that the implementation agnostic interface definition has no non-standards defined entry points, and change the eglrefimpl specific implementation to place its private entry points high up in the ordinal order space in the implementation region, not the standards based entrypoints region.

// Copyright (c) 1995-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:
// General utility functions that don't belong anywhere else
// 
//

#include "server.h"
#include "rootwin.h"
#include "wstop.h"
#include "panics.h"

GLREF_D CDebugLogBase *wsDebugLog;

GLDEF_C RWsRegion *GetRegionFromClientL(CWsClient *aClient, TInt aCount)
	{
	TInt bufSize=sizeof(TRect)*aCount;
	TUint8* rectList=STATIC_CAST(TUint8*,User::Alloc(bufSize));
	User::LeaveIfNull(rectList);
	CleanupStack::PushL(rectList);
	TPtr8 rectBuf(rectList,bufSize);
	aClient->RemoteRead(rectBuf,0);
	RWsRegion* region=new(ELeave) RWsRegion(aCount,REINTERPRET_CAST(TRect*,rectList));
	CleanupStack::Pop(rectList);
	return(region);
	}

GLDEF_C TInt ExternalizeRegionL(RWriteStream& aWriteStream, const RWsRegion& aRegion)
	{
	TInt dataLen = sizeof(TRect)*aRegion.Count();
	aWriteStream.WriteInt32L(aRegion.Count());
	aWriteStream.WriteL(REINTERPRET_CAST(const TUint8*,aRegion.RectangleList()),dataLen);
	aWriteStream.CommitL();
	return sizeof(TInt32)+dataLen;
	}

GLDEF_C RWsRegion* InternalizeRegionL(RReadStream& aReadStream)
	{
	TInt numRects = aReadStream.ReadInt32L();
	TInt bufSize = sizeof(TRect)*numRects;
	// Allocate buffer for list of clipping rectangles. We leave if we 
	// cannot create the buffer
	TUint8* rectList = static_cast<TUint8*>(User::AllocL(bufSize));
	CleanupStack::PushL(rectList);
	// Read the list of rectangles into the buffer
	aReadStream.ReadL(rectList,bufSize);
	// Point member pointer to our new rectangle list buffer
	RWsRegion* region = new(ELeave) RWsRegion(numRects,reinterpret_cast<TRect*>(rectList));
	CleanupStack::Pop(rectList);
	return region;
	}

void Panic(TWservPanic aPanic)
	{
	if (wsDebugLog)
		wsDebugLog->Panic(CDebugLogBase::EDummyConnectionId,aPanic);		//Dummy value meaning WSERV
	_LIT(KWSERVInternalPanicCategory,"WSERV-INTERNAL");
	User::Panic(KWSERVInternalPanicCategory,aPanic);
	}

_LIT(KWSERVPanicDesc1,"WServ internal Panic %S, in file %S @ line %i");
_LIT(KWSERVPanicDesc2,"Assert condition = \"%S\"");

void PanicWithInfo(TWservPanic aPanic, const TDesC& aFileName, const TDesC& aPanicName, TInt aLine)
	{
	TBuf<256> buf;
	buf.Format(KWSERVPanicDesc1, &aPanicName, &aFileName, aLine);
	RDebug::Print(buf);
	if (wsDebugLog)
		{
		wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant, buf);
		}
	Panic(aPanic);
	}

void PanicWithCondAndInfo(TWservPanic aPanic, const TDesC& aCondition, const TDesC& aFileName, const TDesC& aPanicName, TInt aLine)
	{
	TBuf<256> buf;
	buf.Format(KWSERVPanicDesc1, &aPanicName, &aFileName, aLine);
	RDebug::Print(buf);
	if (wsDebugLog)
		{
		wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant, buf);
		}
	buf.Format(KWSERVPanicDesc2, &aCondition);
	RDebug::Print(buf);
	if (wsDebugLog)
		{
		wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant, buf);
		}
	Panic(aPanic);
	}


GLDEF_C void StateDump()
	{
	CWsTop::StateDump();
	}

GLDEF_C void StateDump(CWsRootWindow* aRootWindow)
	{
	TBool enabled=wsDebugLog!=NULL;
	if (!enabled)
		{
		CWsTop::EnableLogging();
		if (!wsDebugLog)
			return;	//	Failed to enable logging so give up
		}
//
	_LIT(LogLine,"===========");
	_LIT(KWSERVStateLogWindowTree,"Window tree");
	TBuf<128> buf;
	wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,LogLine);
	wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,KWSERVStateLogWindowTree);
	wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,LogLine);

	CWsWindowBase *win=aRootWindow;
	TInt inset=0;
	_LIT(KWSERVStateInsetLevelValue,"%*p");
	FOREVER
		{
		buf.Format(KWSERVStateInsetLevelValue,Min(inset<<1,20));
		win->StatusDump(buf);
		wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,buf);
		if (win->BaseChild())
			{
			++inset;
			win=win->BaseChild();
			continue;
			}
		while(!win->NextSibling() && win!=aRootWindow)
			{
			win=win->BaseParent();
			--inset;
			}
		if (win==aRootWindow)
			break;		//Will break here if there is only the root window or the tree walk has returned to it
		win=win->NextSibling();
		}
	wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,LogLine);
//
	if (!enabled)
		CWsTop::DisableLogging();
	}

GLDEF_C void HeapDump()
	{
	TBool enabled=(wsDebugLog!=NULL);
	if (!enabled)
		CWsTop::EnableLogging();
	if (wsDebugLog)	// Just in case enable failed
		wsDebugLog->HeapDump();
	if (!enabled)
		CWsTop::DisableLogging();
	}

#if defined(_DEBUG)
//GLREF_C void ForceLog(TInt aPriority,const TDesC &aText,TInt aParam=0);
//ForceLog(CDebugLogBase::ELogImportant,_L("Value=%d"),345);
//TLogMessageText buf;
//_LIT(KLog,"Count=%d, Object=0x%x");
//buf.Format(KLog,Count(),this);
//ForceLog(CDebugLogBase::ELogImportant,buf);
GLDEF_C void ForceLog(TInt aPriority,const TDesC &aText,TInt aParam=0)
	{
	TBool enabled=(wsDebugLog!=NULL);
	if (!enabled)
		CWsTop::EnableLogging();
	if (wsDebugLog)	// Just in case enable failed
		{
		wsDebugLog->MiscMessage(aPriority,aText,aParam);
		if (!enabled)
			CWsTop::DisableLogging();
		}
	}
#endif

LOCAL_C TDisplayMode DisplayMode(TBool aIsColor,TInt aNumColors)
	{

	if (aIsColor)
		{
		switch(aNumColors)
			{
		case 16:
			return EColor16;
		case 256:
			return EColor256;
		case 4096:
			return EColor4K;
		case 65536:
			return EColor64K;
		case 16777216:
			return CFbsDevice::DisplayMode16M();
		default:
			return ENone;
			}
		}
	else
		{
		switch(aNumColors)
			{
		case 2:
			return EGray2;
		case 4:
			return EGray4;
		case 16:
			return EGray16;
		case 256:
			return EGray256;
		default:
			return ENone;
			}
		}
	}

GLDEF_C TDisplayMode ParseDisplayMode(const TDesC& aModeName)
	{
	// Not using _LIT because we only want the string temporarily, not permanently on the heap.
	if (!aModeName.CompareF(_L("EColor16MAP")))
		return EColor16MAP;
	else if (!aModeName.CompareF(_L("EColor16MA")))
		return EColor16MA;
	else if (!aModeName.CompareF(_L("EColor16MU")))
		return EColor16MU;
	else if (!aModeName.CompareF(_L("EColor64K")))
		return EColor64K;
	else if (!aModeName.CompareF(_L("EColor4K")))
		return EColor4K;
	else if (!aModeName.CompareF(_L("EColor256")))
		return EColor256;
	else if (!aModeName.CompareF(_L("EColor16")))
		return EColor16;
	else if (!aModeName.CompareF(_L("EGray256")))
		return EGray256;
	else if (!aModeName.CompareF(_L("EGray16")))
		return EGray16;
	else if (!aModeName.CompareF(_L("EGray4")))
		return EGray4;
	else if (!aModeName.CompareF(_L("EGray2")))
		return EGray2;
	else	// old wserv magic
		{	// this code supports the old "ColorXXX" and "GrayXXX" formats etc
		TPtrC ptr(aModeName);
		TBool isColor=EFalse;

		if (ptr[0]=='C' || ptr[0]=='c')
			isColor=ETrue;
		else if (ptr[0]=='A' || ptr[0]=='a')
			return EColor16MA;
		else if (ptr[0]=='P' || ptr[0]=='p')
			return EColor16MAP;
		else if (ptr[0]!='G' && ptr[0]!='g')
			return ENone;
		
		TInt pos=0;
		while (!TChar(ptr[++pos]).IsDigit())
			{}
		TLex lex(ptr.Mid(pos));
		TInt numCols;
		if (lex.Val(numCols)!=KErrNone)
			return ENone;
		lex.SkipSpace();
		TChar units=lex.Get();
		if (units=='K' || units=='k')
			numCols<<=10;
		else if (units=='M' || units=='m')
			numCols<<=20;
		TDisplayMode mode = DisplayMode(isColor,numCols);

		#if defined(__WINS__)
			//This is a special case for the emulator since the default
			//screen packing can be overridden by the wsini.ini setting

			//This code does nothing is iDefaultDisplayMode is not
			//EColor16M.- see graphics/screendriver/swins/scnew.cpp
			//function CFbsDrawDevice::DisplayMode16M().
			if(mode==EColor16M)
				{
				TChar packed=lex.Get();
				if ((packed=='U')||(packed=='u'))
					{
					mode=EColor16MU;
					}
				}

			//However setting this will give four shades of grey since
			//the code does not support 16MU and 16M at the same time.
		#endif
		return mode;
		}
	}