windowing/windowserver/nga/SERVER/UTILS.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nga/SERVER/UTILS.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,187 @@
+// 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
+