diff -r 000000000000 -r bde4ae8d615e os/graphics/windowing/windowserver/nonnga/SERVER/UTILS.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/graphics/windowing/windowserver/nonnga/SERVER/UTILS.CPP Fri Jun 15 03:10:57 2012 +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(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(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; + } + } +