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