// 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:
// Decodes data into text - platform independent
// 
//

#include "../SERVER/w32cmd.h"
#include "DEBUGLOG.H"

_LIT(LogCloseBracket,")");
_LIT(LogComma,", ");
_LIT(LogString,"%S");
_LIT(LogClose,"Close()");
_LIT(LogSpaces,"  ");

void TDebugLogOverflow::Overflow(TDes &aDes)
	{
	if (!iError)		//Should never be re-entrant but just in case
		{
		_LIT(OverflowThreeDots,"...");
		const TInt LenThreeDots=3;
		iError=ETrue;
		TInt length=aDes.MaxLength();
		if (length>LenThreeDots)
			{
			length-=LenThreeDots;
			if (aDes.Length()>length)
				aDes.SetLength(length);
			}
		aDes.AppendFormat(OverflowThreeDots,this);
		}
	}

class TRawEventX : public TRawEvent
// For bypassing protected members of TRawEvent
	{
public:
	inline TUint Ticks();
	inline TInt posx();
	inline TInt posy();
	inline TInt scanCode();
	};

inline TUint TRawEventX::Ticks()
	{return(iTicks);}
inline TInt TRawEventX::posx()
	{return(iU.pos.x);}
inline TInt TRawEventX::posy()
	{return(iU.pos.y);}
inline TInt TRawEventX::scanCode()
	{return(iU.key.scanCode __REMOVE_WINS_CHARCODE);}


GLDEF_C TInt hHandleToValue(TUint32 handle)
	{
	return(handle&0xFFFF);
	}

TDesC &TWsDecoder::CommandBuf(TInt aApp)
	{
	iText.Format(_L("[start of command buffer from app %d]"), aApp);
	return iText;
	}

TDesC &TWsDecoder::Command(TInt aClass, TInt aOpcode, const TAny *aCmdData, TInt aHandle)
	{
	TPtrC details(commandDetails(aClass, aOpcode, aCmdData, aHandle));
	iText=KNullDesC;
	if (details!=KNullDesC)
		iText=details;
	return iText;
	}

TDesC &TWsDecoder::NewClient(TUint aConnectionHandle)
	{
	iText.Format(_L("Client Connected %d"), aConnectionHandle);
	iRequestFuncClass=ENewClientClass;
	return iText;
	}

TDesC &TWsDecoder::CommandReply(TInt aData)
	{
	iText.Format(_L("returns %d (0x%x)"), aData, aData);
	return iText;
	}

TDesC &TWsDecoder::CommandReplyBuf(const TDesC8 &aDes)
	{
	TPtrC details(replyBufDetails(iRequestFuncClass, iPrevOpcode, &aDes, NULL));
	iText=KNullDesC;
	if (details!=KNullDesC)
		{
		iText=LogSpaces;
		TDebugLogTextHandler::Append(iText, details);
		}
	return iText;
	}

TDesC &TWsDecoder::CommandReplyBuf(const TDesC16 &aDes)
	{
	iOverflowHandler.Reset();
	TPtrC details(replyBufDetails(iRequestFuncClass, iPrevOpcode, NULL, &aDes));
	iText=KNullDesC;
	if (details!=KNullDesC)
		{
		iText=LogSpaces;
		TDebugLogTextHandler::Append(iText, details);
		}
	return iText;
	}

TDesC &TWsDecoder::SignalEvent(TInt aApp)
	{
	iText.Format(_L("Event signalled for App %d"),aApp);
	return iText;
	}

TDesC &TWsDecoder::Panic(TInt aApp, TInt aReason)
	{
	if (aApp==CDebugLogBase::EDummyConnectionId)
		iText.Format(_L("WSERV Internal Panic (%d)"), aReason);
	else
		iText.Format(_L("App %d, Paniced (%d)"),aApp, aReason);
	return iText;
	}

void TWsDecoder::UnKnown()
	{
	}

void TWsDecoder::UnKnownOpcode(TBuf<LogTBufSize> &aText, TInt aOpcode)
	{
	aText.AppendFormat(_L("unknown function (opcode %u)"), aOpcode);
	UnKnown();
	}

void TWsDecoder::UnKnownReplyBuf(TBuf<LogTBufSize> &aText, TInt aOpcode)
	{
	aText.AppendFormat(_L("unknown reply buffer (opcode %u)"), aOpcode);
	UnKnown();
	}

TDesC &TWsDecoder::MiscMessage(const TDesC &aFormat,TInt aParam)
	{
	iText.Format(aFormat,aParam);
	return iText;
	}

void TWsDecoder::AppendPoint(TBuf<LogTBufSize> &aText, const TDesC8 *aReplyDes8)
	{
	TShortBuf buf(TDebugLogTextHandler::FormatPoint(*((TPoint *)aReplyDes8->Ptr())));
	aText.AppendFormat(LogString, &buf);
	}

void TWsDecoder::AppendRect(TBuf<LogTBufSize> &aText, const TDesC8 *aReplyDes8)
	{
	TLongBuf buf(TDebugLogTextHandler::FormatRect(*((TRect *)aReplyDes8->Ptr())));
	aText.AppendFormat(LogString, &buf);
	}

void TWsDecoder::AppendDesc(TBuf<LogTBufSize> &aText, const TDesC8 *aReplyDes8)
	{
	TBuf<LogTBufSize> buf;
	buf.Copy(*aReplyDes8);
	aText.AppendFormat(LogString, &buf);
	}

void TWsDecoder::AppendDesc(TBuf<LogTBufSize> &aText, const TDesC16 *aReplyDes16)
	{
	aText.AppendFormat(LogString, aReplyDes16);
	}

void TWsDecoder::DecodeWindowGroup(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle)
	{
	aText.Format(_L("RWindowGroup[%d]::"),aHandle);
	TWsWinCmdUnion pData;
	pData.any=aCmdData;
	switch (aOpcode)
		{
	case EWsWinOpReceiveFocus:
		aText.AppendFormat(_L("ReceiveFocus(%d)"), *pData.Bool);
		break;
	case EWsWinOpAutoForeground:
		aText.AppendFormat(_L("AutoForeground(%d)"), *pData.Bool);
		break;
	case EWsWinOpCancelCaptureKey:
		aText.AppendFormat(_L("CancelCaptureKey(%d)"), *pData.UInt);
		break;
	case EWsWinOpCaptureKey:
		aText.AppendFormat(_L("CaptureKey(%u, 0x%04x, 0x%04x)"),
									pData.CaptureKey->key,
									pData.CaptureKey->modifiers,
									pData.CaptureKey->modifierMask);
		break;
	case EWsWinOpCancelCaptureKeyUpsAndDowns:
		aText.AppendFormat(_L("CancelCaptureKeyUpsAndDowns(%d)"), *pData.UInt);
		break;
	case EWsWinOpCaptureKeyUpsAndDowns:
		aText.AppendFormat(_L("CaptureKeyUpsAndDowns(%u, 0x%04x, 0x%04x)"),
									pData.CaptureKey->key,
									pData.CaptureKey->modifiers,
									pData.CaptureKey->modifierMask);
		break;
	case EWsWinOpSetTextCursor:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(pData.SetTextCursor->pos));
		aText.AppendFormat(_L("SetTextCursor(%d, %S, {%u,%d,%d,%d,0x%08x})"),
										hHandleToValue(pData.SetTextCursor->window), &buf,
										pData.SetTextCursor->cursor.iType, pData.SetTextCursor->cursor.iHeight,
										pData.SetTextCursor->cursor.iAscent, pData.SetTextCursor->cursor.iWidth,
										pData.SetTextCursor->cursor.iFlags);
		}
		break;
	case EWsWinOpSetTextCursorClipped:
		{
		TShortBuf buf1(TDebugLogTextHandler::FormatPoint(pData.SetTextCursor->pos));
		TLongBuf buf2(TDebugLogTextHandler::FormatRect(pData.SetTextCursor->rect));
		aText.AppendFormat(_L("SetTextCursor(%d, %S, {%u,%d,%d,%d,0x%08x}, %S)"),
										hHandleToValue(pData.SetTextCursor->window), &buf1,
										pData.SetTextCursor->cursor.iType, pData.SetTextCursor->cursor.iHeight,
										pData.SetTextCursor->cursor.iAscent, pData.SetTextCursor->cursor.iWidth,
										pData.SetTextCursor->cursor.iFlags, &buf2);
		}
		break;
	case EWsWinOpCancelTextCursor:
		aText.AppendFormat(_L("CancelTextCursor()"));
		break;
	case EWsWinOpSetOrdinalPriorityAdjust:
		aText.AppendFormat(_L("SetOrdinalPriorityAdjust(%d)"), *pData.Int);
		break;
	case EWsWinOpAddPriorityKey:
		aText.AppendFormat(_L("AddPriorityKey(0x%x,0x%x,%d)"), pData.PriorityKey->modifiers, pData.PriorityKey->modifierMask, pData.PriorityKey->keycode);
		break;
	case EWsWinOpRemovePriorityKey:
		aText.AppendFormat(_L("RemovePriorityKey(0x%x,0x%x,%d)"), pData.PriorityKey->modifiers, pData.PriorityKey->modifierMask, pData.PriorityKey->keycode);
		break;
	case EWsWinOpSetOrdinalPositionErr:
		aText.AppendFormat(_L("SetOrdinalPositionErr(%d, %d)"), pData.OrdinalPos->pos, pData.OrdinalPos->ordinalPriority);	
		break;
	case EWsWinOpDisableKeyClick:
		aText.AppendFormat(_L("DisableKeyClick(%u)"), *pData.UInt);	
		break;
	case EWsWinOpCaptureLongKey:
		aText.AppendFormat(_L("CaptureLongKey(TTimeIntervalMicroSeconds32(%d), %u, %u, %u, %u, %d, %u)"), 
								pData.CaptureLongKey->delay.Int(), pData.CaptureLongKey->inputKey, pData.CaptureLongKey->outputKey, 
								pData.CaptureLongKey->modifierMask, pData.CaptureLongKey->modifiers, pData.CaptureLongKey->priority, pData.CaptureLongKey->flags);	
		break;
	case EWsWinOpCancelCaptureLongKey:
		aText.AppendFormat(_L("CancelCaptureLongKey(%d)"), pData.CaptureKey->key);	
		break;
	case EWsWinOpAllowChildWindowGroup:
		aText.AppendFormat(_L("AllowProcessToCreateChildWindowGroup(%d)"), *pData.Int);	
		break;
	case EWsWinOpClearChildGroup:
		aText.AppendFormat(_L("ClearChildGroup()"));	
		break;
	case EWsWinOpSetChildGroup:
		aText.AppendFormat(_L("SetChildGroup(%d)"), *pData.Int); 	
		break;
	case EWsWinOpEnableVisibilityChangeEvents:
		aText.Append(_L("EnableVisibilityChangeEvents()")); 	
		break;
	case EWsWinOpDisableVisibilityChangeEvents:
		aText.Append(_L("DisableVisibilityChangeEvents()")); 	
		break;
	case EWsWinOpWindowGroupId:
		aText.Append(_L("WindowGroupId()")); 	
		break;
	case EWsWinOpEnableFocusChangeEvents:
		aText.Append(_L("EnableFocusChangeEvents()")); 	
		break;
	case EWsWinOpDisableFocusChangeEvents:
		aText.Append(_L("DisableFocusChangeEvents()")); 	
		break;
	default:
		decodeWindow(aText,aOpcode,aCmdData);
		break;
		}
	}

void TWsDecoder::DecodeClient(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle)
	{
	TWsClCmdUnion pData;

	aText.Format(_L("RWsSession[%d]::"),aHandle);
	pData.any=aCmdData;
	switch (aOpcode)
		{
	case EWsClOpDisconnect:
		aText.AppendFormat(LogClose);
		break;
	case EWsClOpSetHotKey:
		aText.AppendFormat(_L("SetHotKey(%u, %u, 0x%04x, 0x%04x)"),
										pData.SetHotKey->type,
										pData.SetHotKey->keycode,
										pData.SetHotKey->modifiers,
										pData.SetHotKey->modifierMask);
		break;
	case EWsClOpClearHotKeys:
		aText.AppendFormat(_L("ClearHotKeys(%d)"),*pData.UInt);
		break;
	case EWsClOpRestoreDefaultHotKey:
		aText.AppendFormat(_L("ResetDefaultHotKey(%d)"),*pData.UInt);
		break;
	case EWsClOpComputeMode:
		aText.AppendFormat(_L("ComputeMode(%u)"),*pData.UInt);
		break;
	case EWsClOpEventReady:
		aText.AppendFormat(_L("EventReady(TInt *stat)"));
		break;
	case EWsClOpRedrawReady:
		aText.AppendFormat(_L("RedrawReady(TInt *stat)"));
		break;
	case EWsClOpPriorityKeyReady:
		aText.AppendFormat(_L("PriorityKeyReady(TInt *stat)"));
		break;
	case EWsClOpEventReadyCancel:
		aText.AppendFormat(_L("EventReadyCancel()"));
		break;
	case EWsClOpRedrawReadyCancel:
		aText.AppendFormat(_L("RedrawReadyCancel()"));
		break;
	case EWsClOpPriorityKeyReadyCancel:
		aText.AppendFormat(_L("PriorityKeyReadyCancel()"));
		break;
	case EWsClOpGetEvent:
		aText.AppendFormat(_L("GetEvent(TWsEvent *aEvent)"));
		break;
	case EWsClOpGetRedraw:
		aText.AppendFormat(_L("GetRedraw(TWsRedrawEvent *aEvent)"));
		break;
	case EWsClOpGetPriorityKey:
		aText.AppendFormat(_L("GetPriorityKey(TWsPriorityKeyEvent *aEvent)"));
		break;
	case EWsClOpCreateWindow:
	case EWsClOpCreateGc:
	case EWsClOpCreateWindowGroup:
	case EWsClOpCreateAnimDll:
	case EWsClOpCreateScreenDevice:
	case EWsClOpCreateSprite:
	case EWsClOpCreatePointerCursor:
	case EWsClOpCreateBitmap:
	case EWsClOpCreateDirectScreenAccess:
	case EWsClOpCreateClick:
		switch(aOpcode)
			{
			case EWsClOpCreateWindow:
				aText.AppendFormat(_L("CreateWindow(%d,%x)"),hHandleToValue(pData.CreateWindow->parent),pData.CreateWindow->clientHandle);
				break;
			case EWsClOpCreateGc:
				aText.AppendFormat(_L("CreateGc()"));
				break;
			case EWsClOpCreateWindowGroup:
				aText.AppendFormat(_L("CreateWindowGroup(%x)"),pData.CreateWindow->clientHandle);
				break;
			case EWsClOpCreateAnimDll:
				TDebugLogTextHandler::Append(aText, _L("LoadAnimDll(\""));
				if (pData.LoadAnimDll && (pData.LoadAnimDll->length >= 0) && (pData.LoadAnimDll->length < LogTBufSize - 22))
					TDebugLogTextHandler::Append(aText, TPtrC((TText *)(pData.LoadAnimDll+1), pData.LoadAnimDll->length));
				else
					TDebugLogTextHandler::Append(aText, _L("<INVALID DESCRIPTOR>"));
				TDebugLogTextHandler::Append(aText, _L("\")"));
				break;
			case EWsClOpCreateScreenDevice:
				aText.AppendFormat(_L("CreateScreenDevice()"));
				break;
			case EWsClOpCreateSprite:
				aText.AppendFormat(_L("CreateSprite(...)"));
				break;
			case EWsClOpCreatePointerCursor:
				aText.AppendFormat(_L("CreatePointerCursor(...)"));
				break;
			case EWsClOpCreateBitmap:
				aText.AppendFormat(_L("CreateBitmap(...)"));
				break;
			case EWsClOpCreateDirectScreenAccess:
				aText.AppendFormat(_L("CreateDirectScreenAccess()"));
				break;
			case EWsClOpCreateClick:
				aText.AppendFormat(_L("CreateSoundPlugin()"));
				break;
			}
		break;
	case EWsClOpHeapCount:
		aText.AppendFormat(_L("HeapCount()"));
		break;
	case EWsClOpDebugInfo:
		aText.AppendFormat(_L("DebugInfo(%d,%d)"), pData.DebugInfo->iFunction, pData.DebugInfo->iParam);
		break;
	case EWsClOpDebugInfoReplyBuf:
		aText.AppendFormat(_L("DebugInfo(%d,%d,...)"), pData.DebugInfo->iFunction, pData.DebugInfo->iParam);
		break;
	case EWsClOpTestInvariant:
		aText.AppendFormat(_L("unimplemented opcode 'EWsClOpTestInvariant' (%u)"), aOpcode);
		break;
	case EWsClOpSetShadowVector:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(*pData.Point));
		aText.AppendFormat(_L("SetShadowVector(%S)"), &buf);
		break;
		}
	case EWsClOpShadowVector:
		aText.Append(_L("ShadowVector()"));
		break;
	case EWsClOpResourceCount:
		aText.Append(_L("ResourceCount()"));
		break;
	case EWsClOpSetKeyboardRepeatRate:
		aText.Append(_L("SetKeyboardRepeatRate(...,...)"));
		break;
	case EWsClOpGetKeyboardRepeatRate:
		aText.Append(_L("GetKeyboardRepeatRate(...,...)"));
		break;
	case EWsClOpSetDoubleClick:
		aText.AppendFormat(_L("SetDoubleClickSettings(...,%d)"), pData.SetDoubleClick->distance);
		break;
	case EWsClOpGetDoubleClickSettings:
		aText.Append(_L("GetDoubleClickSettings(...,...)"));
		break;
	case EWsClOpHeapSetFail:
		aText.AppendFormat(_L("HeapSetFail(%d, %d)"), pData.HeapSetFail->type, pData.HeapSetFail->value);
		break;
	case EWsClOpNumWindowGroups:
		aText.AppendFormat(_L("NumWindowGroups(%d)"),*pData.UInt);
		break;
	case EWsClOpNumWindowGroupsAllPriorities:
		aText.Append(_L("NumWindowGroups()"));
		break;
	case EWsClOpWindowGroupList:
		aText.AppendFormat(_L("WindowGroupList(...,%d,%d)"),pData.WindowGroupList->priority, pData.WindowGroupList->count);
		break;
	case EWsClOpWindowGroupListAllPriorities:
		aText.AppendFormat(_L("WindowGroupList(...,%d)"),pData.WindowGroupList->count);
		break;
	case EWsClOpGetFocusWindowGroup:
		aText.AppendFormat(_L("GetFocusWindowGroup(%d, ...)"), *pData.UInt);
		break;
	case EWsClOpGetDefaultOwningWindow:
		aText.Append(_L("GetDefaultOwningWindow()"));
		break;
	case EWsClOpSetWindowGroupOrdinalPosition:
		aText.AppendFormat(_L("SetWindowGroupOrdinalPosition(%d, %d)"),
							pData.SetWindowGroupOrdinalPosition->identifier,
							pData.SetWindowGroupOrdinalPosition->position);
		break;
	case EWsClOpGetWindowGroupHandle:
		aText.AppendFormat(_L("GetWindowGroupHandle(%d)"),*pData.Int);
		break;
	case EWsClOpGetWindowGroupOrdinalPriority:
		aText.AppendFormat(_L("GetWindowGroupOrdinalPriority(%d)"),*pData.Int);
		break;
	case EWsClOpGetWindowGroupClientThreadId:
		aText.AppendFormat(_L("GetWindowGroupClientThreadId(%d)"),*pData.Int);
		break;
	case EWsClOpGetWindowGroupNameFromIdentifier:
		aText.AppendFormat(_L("GetWindowGroupNameFromIdentifier(%d)"),pData.GetWindowGroupNameFromIdentifier->identifier);
		break;
	case EWsClOpFindWindowGroupIdentifier:
		aText.AppendFormat(_L("FindWindowGroupIdentifier(%d,...,%d)"),pData.FindWindowGroupIdentifier->identifier,
						pData.FindWindowGroupIdentifier->offset);
		break;
	case EWsClOpFindWindowGroupIdentifierThread:
		aText.AppendFormat(_L("FindWindowGroupIdentifier(%d,0x%x)"),pData.FindWindowGroupIdentifierThread->identifier,
						pData.FindWindowGroupIdentifierThread->threadId.Id());
		break;
	case EWsClOpSendMessageToWindowGroup:
		aText.AppendFormat(_L("SendMessageToWindowGroup(0x%x,0x%x,...)"),pData.SendMessageToWindowGroup->identifierOrPriority,
						pData.SendMessageToWindowGroup->uid, pData.SendMessageToWindowGroup->dataLength);
		break;
	case EWsClOpSendMessageToAllWindowGroups:
		aText.AppendFormat(_L("SendMessageToAllWindowGroups(0x%x,...)"),pData.SendMessageToWindowGroup->uid, pData.SendMessageToWindowGroup->dataLength);
		break;
	case EWsClOpSendMessageToAllWindowGroupsPriority:
		aText.AppendFormat(_L("SendMessageToAllWindowGroups(%d,0x%x,...)"),pData.SendMessageToWindowGroup->identifierOrPriority,
						pData.SendMessageToWindowGroup->uid, pData.SendMessageToWindowGroup->dataLength);
		break;
	case EWsClOpFetchMessage:
		aText.AppendFormat(_L("FetchMessage(...)"));
		break;
	case EWsClOpSetSystemPointerCursor:
		aText.AppendFormat(_L("SetSystemPointerCursor(...,%d)"), pData.SetSystemPointerCursor->number);
		break;
	case EWsClOpClearSystemPointerCursor:
		aText.AppendFormat(_L("ClearSystemPointerCursor(%d)"), *pData.UInt);
		break;
	case EWsClOpClaimSystemPointerCursorList:
		aText.Append(_L("ClaimSystemPointerCursorList()"));
		break;
	case EWsClOpFreeSystemPointerCursorList:
		aText.Append(_L("FreeSystemPointerCursorList()"));
		break;
	case EWsClOpLogMessage:
		aText.Append(_L("LogMessage(...)"));
		break;
	case EWsClOpPasswordEntered:
		aText.Append(_L("PasswordEntered()"));
		break;
	case EWsClOpPurgePointerEvents:
		aText.Append(_L("PurgePointerEvents()"));
		break;
	case EWsClOpRawEvent:
		aText.AppendFormat(_L("SimulateRawEvent(%d,%d,{{%d,%d},%d})"),((TRawEventX *)pData.RawEvent)->Type(),
								((TRawEventX *)pData.RawEvent)->Ticks(),((TRawEventX *)pData.RawEvent)->posx(),
								((TRawEventX *)pData.RawEvent)->posy(),((TRawEventX *)pData.RawEvent)->scanCode());
		break;
	case EWsClOpSendEventToWindowGroup:
		aText.AppendFormat(_L("SendEventToWindowGroup(%d,"),pData.SendEventToWindowGroup->parameter);
		aText.Append(eventDetails(&pData.SendEventToWindowGroup->event));
		aText.Append(LogCloseBracket);
		break;
	case EWsClOpSetModifierState:
		aText.AppendFormat(_L("SetModifierState(%d,%d)"), pData.SetModifierState->modifier, pData.SetModifierState->state);
		break;
	case EWsClOpGetModifierState:
		aText.Append(_L("GetModifierState()"));
		break;
	case EWsClOpSendOffEventsToShell:
		{
		_LIT(LogClientSendOffEventsToShell,"RequestOffEvents(%u,%d)");
		aText.AppendFormat(LogClientSendOffEventsToShell
										,pData.OffEventsToShell->on,hHandleToValue(pData.OffEventsToShell->window));
		}
		break;
	case EWsClOpGetDefModeMaxNumColors:
		{
		_LIT(LogClientGetDefModeMaxNumColors,"GetDefModeMaxNumColors()");
		aText.Append(LogClientGetDefModeMaxNumColors);
		}
		break;
	case EWsClOpGetColorModeList:
		{
		_LIT(LogClientGetColorModeList,"GetColorModeList()");
		aText.Append(LogClientGetColorModeList);
		}
		break;
	case EWsClOpKeyEvent:
		{
		_LIT(LogClientKeyEvent,"SimulateKeyEvent(%d)");
		aText.AppendFormat(LogClientKeyEvent,pData.KeyEvent->iCode);
		}
		break;
	case EWsClOpSendEventToAllWindowGroup:
		{
		_LIT(LogClientSendEventToAllWindowGroups,"SendEventToAllWindowGroups(");
		aText.Append(LogClientSendEventToAllWindowGroups);
		aText.Append(eventDetails(&pData.SendEventToWindowGroup->event));
		aText.Append(LogCloseBracket);
		}
		break;
	case EWsClOpSendEventToAllWindowGroupPriority:
		{
		_LIT(LogClientSendEventToAllWindowGroupPriority,"SendEventToAllWindowGroups(%d,");
		aText.AppendFormat(LogClientSendEventToAllWindowGroupPriority,pData.SendEventToWindowGroup->parameter);
		aText.Append(eventDetails(&pData.SendEventToWindowGroup->event));
		aText.Append(LogCloseBracket);
		}
		break;
	case EWsClOpSetPointerCursorArea:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(pData.SetPointerCursorArea->area));
		_LIT(LogClientSetPointerCursorArea,"SetPointerCursorArea(%d,%S)");
		aText.AppendFormat(LogClientSetPointerCursorArea,pData.SetPointerCursorArea->mode,&buf);
		}
		break;
	case EWsClOpPointerCursorArea:
		{
		_LIT(LogClientPointerCursorArea,"PointerCursorArea(%d)");
		aText.AppendFormat(LogClientPointerCursorArea,*pData.Int);
		}
		break;
	case EWsClOpSetPointerCursorMode:
		{
		_LIT(LogClientSetPointerCursorMode,"SetPointerCursorMode(%d)");
		aText.AppendFormat(LogClientSetPointerCursorMode,*pData.Mode);
		}
		break;
	case EWsClOpPointerCursorMode:
		{
		_LIT(LogClientPointerCursorMode,"PointerCursorMode()");
		aText.Append(LogClientPointerCursorMode);
		}
		break;
	case EWsClOpSetDefaultSystemPointerCursor:
		{
		_LIT(LogClientSetDefaultSystemPointerCursor,"SetDefaultSystemPointerCursor(%d)");
		aText.AppendFormat(LogClientSetDefaultSystemPointerCursor,*pData.Int);
		}
		break;
	case EWsClOpClearDefaultSystemPointerCursor:
		{
		_LIT(LogClientClearDefaultSystemPointerCursor,"ClearDefaultSystemPointerCursor()");
		aText.Append(LogClientClearDefaultSystemPointerCursor);
		}
		break;
	case EWsClOpSetPointerCursorPosition:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(*pData.Point));
		_LIT(LogClientSetPointerCursorPosition,"SetPointerCursorPosition(%S)");
		aText.AppendFormat(LogClientSetPointerCursorPosition,&buf);
		}
		break;
	case EWsClOpPointerCursorPosition:
		{
		_LIT(LogClientPointerCursorPosition,"PointerCursorPosition()");
		aText.Append(LogClientPointerCursorPosition);
		}
		break;
	case EWsClOpSetDefaultFadingParams:
		{
		_LIT(LogClientSetDefaultFadingParams,"SetDefaultFadingParameters(%d,%d)");
		aText.AppendFormat(LogClientSetDefaultFadingParams
								,WservEncoding::ExtractFirst8BitValue(*pData.UInt),WservEncoding::ExtractSecond8BitValue(*pData.UInt));
		}
		break;
	case EWsClOpPrepareForSwitchOff:
		{
		_LIT(LogClientPrepareForSwitchOff,"PrepareForSwitchOff()");
		aText.Append(LogClientPrepareForSwitchOff);
		}
		break;
	case EWsClOpSetFaded:
		{
		_LIT(LogWinSetFade,"SetSystemFade(%d");
		aText.AppendFormat(LogWinSetFade,pData.SetSystemFaded->Faded());
		if (!pData.SetSystemFaded->UseDefaultMap())
			{
			_LIT(LogWinSetFade2,",%d,%d");
			TUint8 blackMap;
			TUint8 whiteMap;
			pData.SetSystemFaded->GetFadingParams(blackMap,whiteMap);
			aText.AppendFormat(LogWinSetFade2,blackMap,whiteMap);
			}
		aText.Append(LogCloseBracket);
		}
		break;
	case EWsClOpLogCommand:
		{
		_LIT(LogClientLogCommand,"LogCommand(%d)");
		aText.AppendFormat(LogClientLogCommand,*pData.UInt);
		}
		break;
	case EWsClOpSendEventToOneWindowGroupPerClient:
		{
		_LIT(LogClientSendEventToOneWindowGroupPerClient,"SendEventToOneWindowGroupsPerClient(");
		aText.Append(LogClientSendEventToOneWindowGroupPerClient);
		aText.Append(eventDetails(&pData.SendEventToWindowGroup->event));
		aText.Append(LogCloseBracket);
		}
		break;
	case EWsClOpStartSetCustomTextCursor:
		{
		_LIT(LogClientStartSetCustomTextCursor,"StartSetCustomTextCursorL(id=0x%08x, flags=0x%08x, align=%d)");
		aText.AppendFormat(LogClientStartSetCustomTextCursor, pData.CustomTextCursorData->identifier, pData.CustomTextCursorData->flags, pData.CustomTextCursorData->alignment);
		}
		break;
	case EWsClOpCompleteSetCustomTextCursor:
		{
		_LIT(LogClientCompleteSetCustomTextCursor,"CompleteSetCustomTextCursorL(err=%d)");
		aText.AppendFormat(LogClientCompleteSetCustomTextCursor, *pData.Int);
		}
		break;
#if defined(__WINS__)
	case EWsClOpRemoveKeyCode:
		{
		_LIT(LogClientRemoveKeyCode,"RemoveKeyCode(%d)");
		aText.AppendFormat(LogClientRemoveKeyCode,*pData.UInt);
		}
		break;
	case EWsClOpSimulateXyInput:
		{
		_LIT(LogClientSimulateXyInput,"SimulateXyInputType(%d)");
		aText.AppendFormat(LogClientSimulateXyInput,*pData.UInt);
		}
		break;
#endif
	case EWsClOpSetBackgroundColor:
		{		
		TShortBuf buf(TDebugLogTextHandler::FormatRgb(*pData.rgb));
		_LIT(LogClientSetBackgroundColor,"SetBackgroundColor(%S)");
		aText.AppendFormat(LogClientSetBackgroundColor,&buf);
		}
		break;
	case EWsClOpGetBackgroundColor:
		{		
		_LIT(LogClientGetBackgroundColor,"GetBackgroundColor()");
		aText.AppendFormat(LogClientGetBackgroundColor);
		}
		break;
	case EWsClOpSystemInfo:
		{		
		_LIT(LogClientSystemInfo,"SystemInfo(%d, SSystemInfo &aSystemInfo)");
		aText.AppendFormat(LogClientSystemInfo, *pData.UInt);
		}
		break;
	case EWsClOpSetFocusScreen:
		{		
		_LIT(LogClientSetFocusScreen,"SetFocusScreen(%d)");
		aText.AppendFormat(LogClientSetFocusScreen, *pData.UInt);
		}
		break;
	case EWsClOpGetFocusScreen:
		{		
		_LIT(LogClientGetFocusScreen,"GetFocusScreen()");
		aText.AppendFormat(LogClientGetFocusScreen);
		}
		break;
	case EWsClOpWindowGroupListAndChain:
		{		
		_LIT(LogClientWindowGroupListAndChain,"WindowGroupList(%d, RArray<TWindowGroupChainInfo>* aWindowList)");
		aText.AppendFormat(LogClientWindowGroupListAndChain, *pData.UInt);
		}
		break;
	case EWsClOpWindowGroupListAndChainAllPriorities:
		{		
		_LIT(LogClientWindowGroupListAndChainAllPriorities,"WindowGroupListAndChainAllPriorities(RArray<TWindowGroupChainInfo>* aWindowList)");
		aText.AppendFormat(LogClientWindowGroupListAndChainAllPriorities);
		}
		break;
	case EWsClOpSetClientCursorMode:
		{		
		_LIT(LogClientSetClientCursorMode,"SetClientCursorMode(%d)");
		aText.AppendFormat(LogClientSetClientCursorMode, *pData.UInt);
		}
		break;
	case EWsClOpClearAllRedrawStores:
		{		
		_LIT(LogClientClearAllRedrawStores,"ClearAllRedrawStores()");
		aText.AppendFormat(LogClientClearAllRedrawStores);
		}
		break;
	case EWsClOpGraphicMessageReady:
		{		
		_LIT(LogClientGraphicMessageReady,"GraphicMessageReady(%d)");
		aText.AppendFormat(LogClientGraphicMessageReady, *pData.UInt);	
		}
		break;
	case EWsClOpGetGraphicMessage:
		{		
		_LIT(LogClientGraphicMessage,"GetGraphicMessage(%d)");
		aText.AppendFormat(LogClientGraphicMessage, *pData.UInt);	
		}
		break;
	case EWsClOpGraphicMessageCancel:
		{		
		_LIT(LogClientGraphicMessageCancel,"GraphicMessageCancel()");
		aText.AppendFormat(LogClientGraphicMessageCancel);	
		}
		break;		
	case EWsClOpNumWindowGroupsOnScreen:
		{		
		_LIT(LogClientNumWindowGroupsOnScreen,"NumWindowGroups(%d, %d)");
		aText.AppendFormat(LogClientNumWindowGroupsOnScreen, pData.NumWinGroups->screenNumber, pData.NumWinGroups->priority);
		}
		break;
	case EWsClOpGetNumberOfScreens:
		{		
		_LIT(LogClientGetNumberOfScreens,"NumberOfScreens()");
		aText.AppendFormat(LogClientGetNumberOfScreens);		
		}
		break;
	case EWsClOpNoFlickerFree:
		{		
		_LIT(LogNoFlickerFree,"EWsClOpNoFlickerFree enum");
		aText.AppendFormat(LogNoFlickerFree);		
		}
		break;
	case EWsClOpCreateGraphic:
		{		
		_LIT(LogCreateGraphic,"EWsClOpCreateGraphic enum");
		aText.AppendFormat(LogCreateGraphic);		
		}
		break;
	case EWsClOpRegisterSurface:
		{
		TInt screenNumber = pData.SurfaceRegister->screenNumber;
		const TSurfaceId& surfaceId = pData.SurfaceRegister->surfaceId;
		
		_LIT(LogRegisterSurface,"RegisterSurface(aScreenNumber(%d), TSurfaceId{%x,%x,%x,%x})");
		aText.AppendFormat(LogRegisterSurface, screenNumber, surfaceId.iInternal[0], surfaceId.iInternal[1], surfaceId.iInternal[2], surfaceId.iInternal[3]);
		}
		break;
	case EWsClOpUnregisterSurface:
		{
		TInt screenNumber = pData.SurfaceRegister->screenNumber;
		const TSurfaceId& surfaceId = pData.SurfaceRegister->surfaceId;
		
		_LIT(LogUnregisterSurface,"UnregisterSurface(aScreenNumber(%d), TSurfaceId{%x,%x,%x,%x})");
		aText.AppendFormat(LogUnregisterSurface, screenNumber, surfaceId.iInternal[0], surfaceId.iInternal[1], surfaceId.iInternal[2], surfaceId.iInternal[3]);
		}
		break;
	case EWsClOpSetCloseProximityThresholds:
		{
		_LIT(LogSetCloseProximityThresholds,"SetCloseProximityThresholds(%d, %d)");
		aText.AppendFormat(LogSetCloseProximityThresholds, pData.ZThresholdPair->enterThreshold, pData.ZThresholdPair->exitThreshold);
		}
		break;	
	case EWsClOpSetHighPressureThresholds:
		{
		_LIT(LogSetHighPressureThresholds,"SetHighPressureThresholds(%d, %d)");
		aText.AppendFormat(LogSetHighPressureThresholds, pData.ZThresholdPair->enterThreshold, pData.ZThresholdPair->exitThreshold);	
		}
		break;
	case EWsClOpGetEnterCloseProximityThreshold:
		{		
		_LIT(LogGetEnterCloseProximityThreshold,"EWsClOpGetEnterCloseProximityThreshold()");
		aText.AppendFormat(LogGetEnterCloseProximityThreshold);		
		}
		break;	
	case EWsClOpGetExitCloseProximityThreshold:
		{		
		_LIT(LogGetExitCloseProximityThreshold,"EWsClOpGetExitCloseProximityThreshold()");
		aText.AppendFormat(LogGetExitCloseProximityThreshold);		
		}
		break;
	case EWsClOpGetEnterHighPressureThreshold:
		{		
		_LIT(LogGetEnterHighPressureThreshold,"EWsClOpGetEnterHighPressureThreshold()");
		aText.AppendFormat(LogGetEnterHighPressureThreshold);		
		}
		break;	
	case EWsClOpGetExitHighPressureThreshold:
		{		
		_LIT(LogGetExitHighPressureThreshold,"EWsClOpGetExitHighPressureThreshold()");
		aText.AppendFormat(LogGetExitHighPressureThreshold);		
		}
		break;	
	case EWsClOpLastEnumValue:
		{		
		_LIT(LogLastEnumValue,"EWsClOpLastEnumValue enum");
		aText.AppendFormat(LogLastEnumValue);		
		}
		break;
	default:
		UnKnownOpcode(aText, aOpcode);
		break;
		}
	}

void TWsDecoder::DecodeWindow(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle)
	{
	_LIT(LogWindow,"RWindow[%d]::");
	aText.Format(LogWindow,aHandle);
	decodeWindow(aText,aOpcode,aCmdData);
	}

void TWsDecoder::decodeWindow(TBuf<LogTBufSize> &aText,TInt aOpcode,const TAny *aData)
	{
	TWsWinCmdUnion pData;
	pData.any=aData;
	switch (aOpcode)
		{
	case EWsWinOpFree:
		aText.AppendFormat(LogClose);
		break;
	case EWsWinOpSetExtent:
		{
		TShortBuf buf1(TDebugLogTextHandler::FormatPoint(pData.SetEx->pos));
		TShortBuf buf2(TDebugLogTextHandler::FormatSize(pData.SetEx->size));
		aText.AppendFormat(_L("SetExtent(%S, %S)"), &buf1, &buf2);
		}
		break;
	case EWsWinOpSetExtentErr:
		{
		TShortBuf buf1(TDebugLogTextHandler::FormatPoint(pData.SetEx->pos));
		TShortBuf buf2(TDebugLogTextHandler::FormatSize(pData.SetEx->size));
		aText.AppendFormat(_L("SetExtentError(%S, %S)"), &buf1, &buf2);
		}
		break;
	case EWsWinOpOrdinalPosition:
		aText.AppendFormat(_L("OrdinalPosition()"));
		break;
	case EWsWinOpFullOrdinalPosition:
		aText.AppendFormat(_L("FullOrdinalPosition()"));
		break;
	case EWsWinOpSetOrdinalPosition:
		aText.AppendFormat(_L("SetOrdinalPosition(%d)"),*pData.Int);
		break;
	case EWsWinOpSetOrdinalPositionPri:
		aText.AppendFormat(_L("SetOrdinalPosition(%d,%d)"), pData.OrdinalPos->pos, pData.OrdinalPos->ordinalPriority);
		break;
	case EWsWinOpSetPos:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(*pData.pos));
		aText.AppendFormat(_L("SetPosition(%S)"),&buf);
		}
		break;
	case EWsWinOpSetSizeErr:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatSize(*pData.size));
		aText.AppendFormat(_L("SetSizeErr(%S)"), &buf);
		}
		break;
	case EWsWinOpSetSize:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatSize(*pData.size));
		aText.AppendFormat(_L("SetSize(%S)"), &buf);
		}
		break;
	case EWsWinOpPosition:
		aText.AppendFormat(_L("Position()"));
		break;
	case EWsWinOpAbsPosition:
		aText.AppendFormat(_L("AbsPosition()"));
		break;
	case EWsWinOpSize:
		aText.AppendFormat(_L("Size()"));
		break;
	case EWsWinOpActivate:
		aText.AppendFormat(_L("Activate()"));
		break;
	case EWsWinOpInvalidate:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(*pData.rect));
		aText.AppendFormat(_L("Invalidate(%S)"), &buf);
		}
		break;
	case EWsWinOpInvalidateFull:
		aText.AppendFormat(_L("Invalidate()"));
		break;
	case EWsWinOpBeginRedraw:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(*pData.rect));
		aText.AppendFormat(_L("BeginRedraw(%S)"), &buf);
		}
		break;
	case EWsWinOpBeginRedrawFull:
		aText.AppendFormat(_L("BeginRedraw()"));
		break;
	case EWsWinOpEndRedraw:
		aText.AppendFormat(_L("EndRedraw()"));
		break;
	case EWsWinOpTestInvariant:
		aText.AppendFormat(_L("__TestInvariant()"));
		break;
	case EWsWinOpParent:
		aText.AppendFormat(_L("Parent()"));
		break;
	case EWsWinOpNextSibling:
		aText.AppendFormat(_L("NextSibling()"));
		break;
	case EWsWinOpPrevSibling:
		aText.AppendFormat(_L("PrevSibling()"));
		break;
	case EWsWinOpChild:
		aText.AppendFormat(_L("Child()"));
		break;
	case EWsWinOpInquireOffset:
		aText.AppendFormat(_L("InquireOffset(%d)"),hHandleToValue(*pData.UInt));
		break;
	case EWsWinOpPointerFilter:
		aText.AppendFormat(_L("PointerFilter(0x%08x)"), *pData.UInt);
		break;
	case EWsWinOpSetPointerCapture:
		aText.AppendFormat(_L("SetPointerCapture(%u)"), *pData.UInt);
		break;
	case EWsWinOpSetPointerGrab:
		aText.AppendFormat(_L("SetPointerGrab(%u)"), *pData.UInt);
		break;
	case EWsWinOpSetNoBackgroundColor:
		aText.Append(_L("SetBackgroundColor()"));
		break;
	case EWsWinOpSetBackgroundColor:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRgb(*pData.rgb));
		aText.AppendFormat(_L("SetBackgroundColor(%S)"), &buf);
		}
		break;
	case EWsWinOpSetColor:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRgb(*pData.rgb));
		aText.AppendFormat(_L("SetColor(%S)"), &buf);
		}
		break;
	case EWsWinOpSetShadowHeight:
		aText.AppendFormat(_L("SetShadowHeight(%d)"), *pData.Int);
		break;
	case EWsWinOpShadowDisabled:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatBool(*pData.Bool));
		aText.AppendFormat(_L("SetShadowDisabled(%S)"), &buf);
		}
		break;
	case EWsWinOpSetVisible:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatBool(*pData.Bool));
		aText.AppendFormat(_L("SetVisible(%S)"), &buf);
		}
		break;
	case EWsWinOpUpdateScreen:
		aText.Append(_L("UpdateScreen()"));
		break;
	case EWsWinOpUpdateScreenRegion:
		aText.Append(_L("UpdateScreenRegion(TRegion(...))"));
		break;
	case EWsWinOpMaintainBackup:
		aText.Append(_L("MaintainBackup()"));
		break;
	case EWsWinOpGetInvalidRegion:
		aText.Append(_L("GetInvalidRegion(...)"));
		break;
	case EWsWinOpGetInvalidRegionCount:
		aText.Append(_L("GetInvalidRegionCount()"));
		break;
	case EWsWinOpScroll:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(pData.ScrollRect->offset));
		aText.AppendFormat(_L("Scroll(%S)"), &buf);
		}
		break;
	case EWsWinOpScrollClip:
		{
		TLongBuf buf1(TDebugLogTextHandler::FormatRect(pData.ScrollRect->clip));
		TShortBuf buf2(TDebugLogTextHandler::FormatPoint(pData.ScrollRect->offset));
		aText.AppendFormat(_L("Scroll(%S, %S)"), &buf1, &buf2);
		}
		break;
	case EWsWinOpScrollRect:
		{
		TShortBuf buf1(TDebugLogTextHandler::FormatPoint(pData.ScrollRect->offset));
		TLongBuf buf2(TDebugLogTextHandler::FormatRect(pData.ScrollRect->rect));
		aText.AppendFormat(_L("Scroll(%S, %S)"), &buf1, &buf2);
		}
		break;
	case EWsWinOpScrollClipRect:
		{
		TLongBuf buf1(TDebugLogTextHandler::FormatRect(pData.ScrollRect->clip));
		TShortBuf buf2(TDebugLogTextHandler::FormatPoint(pData.ScrollRect->offset));
		TLongBuf buf3(TDebugLogTextHandler::FormatRect(pData.ScrollRect->rect));
		aText.AppendFormat(_L("Scroll(%S, %S, %S)"), &buf1, &buf2, &buf3);
		}
		break;
	case EWsWinOpBitmapHandle:
		aText.Append(_L("BitmapHandle()"));
		break;
	case EWsWinOpUpdateBackupBitmap:
		aText.Append(_L("UpdateBackupBitmap()"));
		break;
	case EWsWinOpRequiredDisplayMode:
		aText.AppendFormat(_L("SetRequiredDisplayMode(%d)"), *pData.UInt);
		break;
	case EWsWinOpSetCornerType:
		aText.AppendFormat(_L("SetCornerType(%d)"), *pData.UInt);
		break;
	case EWsWinOpSetShape:
		aText.AppendFormat(_L("SetWindowShape(%d rects)"), pData.SetShape->count);
		break;
	case EWsWinOpSetName:
		aText.Append(_L("SetName(\"...\")"));
		break;
	case EWsWinOpName:
		aText.Append(_L("Name()"));
		break;
	case EWsWinOpSetOwningWindowGroup:
		aText.AppendFormat(_L("SetOwningWindowGroup(%d)"),*pData.Int);
		break;
	case EWsWinOpDefaultOwningWindow:
		aText.Append(_L("DefaultOwningWindow()"));
		break;
	case EWsWinOpEnableOnEvents:
		aText.AppendFormat(_L("EnableOnEvents(%d)"),*pData.Int);
		break;
	case EWsWinOpDisableOnEvents:
		aText.Append(_L("DisableOnEvents()"));
		break;
	case EWsWinOpEnableErrorMessages:
		aText.AppendFormat(_L("EnableErrorMessages(%d)"),*pData.Int);
		break;
	case EWsWinOpDisableErrorMessages:
		aText.Append(_L("DisableErrorMessages()"));
		break;
	case EWsWinOpEnableModifierChangedEvents:
		aText.Append(_L("EnableModifierChangedEvents()"));
		break;
	case EWsWinOpDisableModifierChangedEvents:
		aText.Append(_L("DisableModifierChangedEvents()"));
		break;
	case EWsWinOpEnableGroupChangeEvents:
		aText.Append(_L("EnableGroupChangeEvents()"));
		break;
	case EWsWinOpDisableGroupChangeEvents:
		aText.Append(_L("DisableGroupChangeEvents()"));
		break;
	case EWsWinOpRequestPointerRepeatEvent:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(pData.RequestPointerRepeatEvent->rect));
		aText.AppendFormat(_L("RequestPointerRepeatEvent(TTimeIntervalMicroSeconds32(%d), %S)"), 
								pData.RequestPointerRepeatEvent->time.Int(), &buf);
		}
		break;
	case EWsWinOpCancelPointerRepeatEventRequest:
		aText.Append(_L("CancelPointerRepeatEventRequest()"));
		break;
	case EWsWinOpSetPointerCursor:
		aText.AppendFormat(_L("SetPointerCursor(%d)"),*pData.UInt);
		break;
	case EWsWinOpSetCustomPointerCursor:
		aText.AppendFormat(_L("SetCustomPointerCursor(%d)"),*pData.UInt);
		break;
	case EWsWinOpPasswordWindow:
		aText.AppendFormat(_L("PasswordWindow(%d)"),*pData.PasswordMode);
		break;
	case EWsWinOpAddKeyRect:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(pData.AddKeyRect->rect));
		aText.AppendFormat(_L("AddKeyRect(%S,%d,%d)"),&buf,pData.AddKeyRect->scanCode,pData.AddKeyRect->activatedByPointerSwitchOn);
		}
		break;
	case EWsWinOpRemoveAllKeyRects:
		aText.Append(_L("RemoveAllKeyRects()"));
		break;
	case EWsWinOpAllocPointerMoveBuffer:
		aText.AppendFormat(_L("AllocPointerMoveBuffer(%d,%d)"),pData.AllocPointerMoveBuffer->maxNumPoints,pData.AllocPointerMoveBuffer->flags);
		break;
	case EWsWinOpFreePointerMoveBuffer:
		aText.Append(_L("FreePointerMoveBuffer()"));
		break;
	case EWsWinOpEnablePointerMoveBuffer:
		aText.Append(_L("EnablePointerMoveBuffer()"));
		break;
	case EWsWinOpDisablePointerMoveBuffer:
		aText.Append(_L("DisablePointerMoveBuffer()"));
		break;
	case EWsWinOpRetrievePointerMoveBuffer:
		aText.Append(_L("RetrievePointerMoveBuffer(...)"));
		break;
	case EWsWinOpDiscardPointerMoveBuffer:
		aText.Append(_L("DiscardPointerMoveBuffer()"));
		break;
	case EWsWinOpEnableBackup:
		aText.Append(_L("EnableBackup()"));
		break;
	case EWsWinOpClaimPointerGrab:
		aText.Append(_L("ClaimPointerGrab()"));
		break;
	case EWsWinOpIdentifier:
		aText.Append(_L("Identifier()"));
		break;
	case EWsWinOpSetFade:
		{
		_LIT(LogWinSetFade,"SetFade(%d,%d");
		aText.AppendFormat(LogWinSetFade,pData.SetFaded->Faded(),pData.SetFaded->IncludeChildren());
		if (!pData.SetFaded->UseDefaultMap())
			{
			_LIT(LogWinSetFade2,",%d,%d");
			TUint8 blackMap;
			TUint8 whiteMap;
			pData.SetFaded->GetFadingParams(blackMap,whiteMap);
			aText.AppendFormat(LogWinSetFade2,blackMap,whiteMap);
			}
		aText.Append(LogCloseBracket);
		}
		break;
	case EWsWinOpSetNonFading:
		{
		_LIT(LogWinSetNonFading,"SetNonFading(%d)");
		aText.AppendFormat(LogWinSetNonFading,*(pData.Bool));
		}
		break;
	case EWsWinOpFadeBehind:
		{
		_LIT(LogWinFadeBehind,"FadeBehind(%d)");
		aText.AppendFormat(LogWinFadeBehind,*(pData.Bool));
		}
		break;
	case EWsWinOpEnableScreenChangeEvents:
		{
		_LIT(LogWinEnableScreenChangeEvents,"EnableScreenChangeEvents()");
		aText.Append(LogWinEnableScreenChangeEvents);
		}
		break;
	case EWsWinOpDisableScreenChangeEvents:
		{
		_LIT(LogWinDisableScreenChangeEvents,"DisableScreenChangeEvents()");
		aText.Append(LogWinDisableScreenChangeEvents);
		}
		break;
	case EWsWinOpSendPointerEvent:
		{
		_LIT(LogWinSendPointerEvent,"SimulatePointerEvent(");
		aText.Append(LogWinSendPointerEvent);
		aText.Append(eventDetails(pData.RawEvent));
		aText.Append(LogCloseBracket);
		}
		break;
	case EWsWinOpSendAdvancedPointerEvent:
		{
		_LIT(LogWinSendPointerEvent,"SimulateAdvancedPointerEvent(");
		aText.Append(LogWinSendPointerEvent);
		aText.Append(eventDetails(pData.RawEvent));
		aText.Append(LogCloseBracket);
		}
		break;
	case EWsWinOpGetDisplayMode:
		{
		_LIT(LogWinGetDisplayMode,"GetDisplayMode()");
		aText.Append(LogWinGetDisplayMode);
		}
		break;
	case EWsWinOpGetIsFaded:
		{
		_LIT(LogWinIsFaded,"IsFaded()");
		aText.Append(LogWinIsFaded);
		}
		break;
	case EWsWinOpGetIsNonFading:
		{
		_LIT(LogWinIsNonFading,"IsNonFading()");
		aText.Append(LogWinIsNonFading);
		}
		break;
	case EWsWinOpOrdinalPriority:
		{
		_LIT(LogWinOrdinalPriority,"OrdinalPriority()");
		aText.Append(LogWinOrdinalPriority);
		}
		break;
	case EWsWinOpClearPointerCursor:
		{
		_LIT(LogWinClearPointerCursor,"ClearPointerCursor()");
		aText.Append(LogWinClearPointerCursor);
		}
		break;
	case EWsWinOpEnableGroupListChangeEvents:
		{
		_LIT(LogWinEnableGroupListChangeEvents,"EnableGroupListChangeEvents()");
		aText.Append(LogWinEnableGroupListChangeEvents);
		}
		break;
	case EWsWinOpDisableGroupListChangeEvents:
		{
		_LIT(LogWinDisableGroupListChangeEvents,"DisableGroupListChangeEvents()");
		aText.Append(LogWinDisableGroupListChangeEvents);
		}
		break;
	case EWsWinOpHandleTransparencyUpdate:
		{
		_LIT(LogWinHandleTransparencyUpdate,"HandleTransparencyUpdate()");
		aText.Append(LogWinHandleTransparencyUpdate);
		}
		break;
	case EWsWinOpSetTransparencyFactor:
		{
		_LIT(LogWinSetTransparencyFactor,"SetTransparencyFactor()");
		aText.Append(LogWinSetTransparencyFactor);
		}
		break;
	case EWsWinOpSetTransparencyBitmap:
		{
		_LIT(LogWinSetTransparencyBitmap,"SetTransparencyBitmap()");
		aText.Append(LogWinSetTransparencyBitmap);
		}
		break;
	case EWsWinOpSetTransparencyBitmapCWs:
		{
		_LIT(LogWinSetTransparencyWsBitmap,"SetTransparencyWsBitmap()");
		aText.Append(LogWinSetTransparencyWsBitmap);
		}
		break;	

	case EWsWinOpSetTransparencyAlphaChannel:
		{
		_LIT(LogWinSetTransparencyAlphaChannel,"SetTransparencyAlphaChannel()");
		aText.Append(LogWinSetTransparencyAlphaChannel);
		}
		break;	
	case EWsWinOpMoveToGroup:
		{
		_LIT(LogWinMoveToGroup,"MoveToGroup(%d)");
		aText.AppendFormat(LogWinMoveToGroup, *pData.Int);
		}
		break;	
	case EWsWinOpStoreDrawCommands:
		{
		_LIT(LogWinStoreDrawCommands,"EnableRedrawStore(%u)");
		aText.AppendFormat(LogWinStoreDrawCommands, *pData.Bool);
		}
		break;	
	case EWsWinOpSetPointerCapturePriority:
		{
		_LIT(LogWinSetPointerCapturePriority,"SetPointerCapturePriority(%d)");
		aText.AppendFormat(LogWinSetPointerCapturePriority, *pData.Int);
		}
		break;	
	case EWsWinOpGetPointerCapturePriority:
		{
		_LIT(LogWinGetPointerCapturePriority,"GetPointerCapturePriority()");
		aText.Append(LogWinGetPointerCapturePriority);
		}
		break;	
	case EWsWinOpSetTransparentRegion:
		{
		_LIT(LogWinSetTransparentRegion,"SetTransparentRegion(%d rects)");
		aText.AppendFormat(LogWinSetTransparentRegion, pData.SetShape->count);
		}
		break;	
	case EWsWinOpSetTransparencyPolicy:
		{
		_LIT(LogWinSetTransparentPolicy,"SetTransparencyPolicy(TransparencyPolicy= %d)");
		aText.AppendFormat(LogWinSetTransparentPolicy, *pData.Int);
		}
		break;	
	case EWsWinOpIsRedrawStoreEnabled:
		{
		_LIT(LogWinIsRedrawStoreEnabled,"IsRedrawStoreEnabled()");
		aText.Append(LogWinIsRedrawStoreEnabled);
		}
		break;		
	case EWsWinOpEnableOSB:
		{
		_LIT(LogOSBEnabled,"EWsWinOpEnableOSB enum");
		aText.Append(LogOSBEnabled);
		}
		break;		
	case EWsWinOpDisableOSB:
		{
		_LIT(LogOSBDisabled,"EWsWinOpDisableOSB enum");
		aText.Append(LogOSBDisabled);
		}
		break;
	case EWsWinOpClientHandle:
		{
		_LIT(LogClientHandle,"ClientHandle()");
		aText.AppendFormat(LogClientHandle);
		}
		break;
    case EWsWinOpSetBackgroundSurface:
        {
        _LIT(LogWinSetBackgroundSurface,"SetBackgroundSurface(TSurfaceId{%x,%x,%x,%x})");
        aText.AppendFormat(LogWinSetBackgroundSurface, pData.Surface->iInternal[0],pData.Surface->iInternal[1],pData.Surface->iInternal[2],pData.Surface->iInternal[3]);
        }
        break;
    case EWsWinOpKeyColor:
        {
        _LIT(LogWinKeyColor,"KeyColor()");
        aText.AppendFormat(LogWinKeyColor);
        }
        break;          
    case EWsWinOpSetBackgroundSurfaceConfig:
        {        
        TSurfaceConfiguration aSurfaceConfig = pData.SurfaceConfigurationAndTrigger->surfaceConfig;
        TSurfaceId surfaceid;
        aSurfaceConfig.GetSurfaceId(surfaceid);
        CFbsBitGc::TGraphicsOrientation orientation = aSurfaceConfig.Orientation();
        TRect extent;
        aSurfaceConfig.GetExtent(extent);
        TRect viewport;
        aSurfaceConfig.GetViewport(viewport);
        TBool flip = aSurfaceConfig.Flip();
        TBool triggerRedraw = pData.SurfaceConfigurationAndTrigger->triggerRedraw;
        
        TLongBuf extentbuf(TDebugLogTextHandler::FormatRect(extent));
        TLongBuf viewportbuf(TDebugLogTextHandler::FormatRect(viewport));
        
        _LIT(LogWinSetBackgroundSurfaceConfig,"SetBackgroundSurface({%x,%x,%x,%x},%d,%S,%S,%d,%d)");
        aText.AppendFormat(LogWinSetBackgroundSurfaceConfig, surfaceid.iInternal[0],
                                                             surfaceid.iInternal[1],
                                                             surfaceid.iInternal[2],
                                                             surfaceid.iInternal[3],
                                                             orientation,
                                                             &extentbuf, 
                                                             &viewportbuf,
                                                             flip,
                                                             triggerRedraw);
        }
        break;
    case EWsWinOpRemoveBackgroundSurface:
        {
        _LIT(LogWinRemoveBackgroundSurface,"RemoveBackgroundSurface(%d)");
        aText.AppendFormat(LogWinRemoveBackgroundSurface, *(pData.Bool));
        }
        break;
    case EWsWinOpGetBackgroundSurfaceConfig:
        {
        _LIT(LogWinGetBackgroundSurfaceConfig,"GetBackgroundSurface()");
        aText.AppendFormat(LogWinGetBackgroundSurfaceConfig);
        }
        break;
    case EWsWinOpClearRedrawStore:
        {
        _LIT(LogWinClearRedrawStore,"ClearRedrawStore()");
        aText.AppendFormat(LogWinClearRedrawStore);
        }
        break;
#ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
    case EWsWinOpFixNativeOrientation:
        {
        _LIT(LogWinFixNativeOrientation,"FixNativeOrientation()");
        aText.AppendFormat(LogWinFixNativeOrientation);        
        }
        break;
#endif // SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION        
	default:
		UnKnownOpcode(aText, aOpcode);
		break;
		}
	}

//#pragma check_stack(on)
void TWsDecoder::DecodeGc(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle)
	{
	_LIT(LogGc,"RGc[%d]::");
	aText.Format(LogGc,aHandle);
    if (aOpcode<EWsGcOpGdiBlt2)
        {
        if (aOpcode<EWsGcOpDrawPolyLineContinued)
            DecodeGc1(aText,aOpcode,aCmdData);
        else
            DecodeGc2(aText,aOpcode,aCmdData);
        }
    else
        DecodeGc3(aText,aOpcode,aCmdData);
    }
    
void TWsDecoder::DecodeGc1(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData)
	{
	TWsGcCmdUnion pData;

	pData.any=aCmdData;
	switch (aOpcode)
		{
	case EWsGcOpFree:
		aText.AppendFormat(LogClose);
		break;
	case EWsGcOpActivate:
		{
		_LIT(LogGcActivate,"Activate(%d)");
		aText.AppendFormat(LogGcActivate,hHandleToValue(*pData.UInt));
		}
		break;
	case EWsGcOpDeactivate:
		{
		_LIT(LogGcDeactivate,"Deactivate()");
		aText.AppendFormat(LogGcDeactivate);
		}
		break;
	case EWsGcOpDrawLine:
		{
		TShortBuf buf1(TDebugLogTextHandler::FormatPoint(pData.DrawLine->pnt1));
		TShortBuf buf2(TDebugLogTextHandler::FormatPoint(pData.DrawLine->pnt2));
		_LIT(LogGcDrawLine,"DrawLine(%S, %S)");
		aText.AppendFormat(LogGcDrawLine, &buf1, &buf2);
		}
		break;
	case EWsGcOpSetBrushStyle:
		{
		_LIT(LogGcSetBrushStyle,"SetBrushStyle(%u)");
		aText.AppendFormat(LogGcSetBrushStyle,*pData.UInt);
		}
		break;
	case EWsGcOpPlot:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(*pData.Point));
		_LIT(LogGcPlot,"Plot(%S)");
		aText.AppendFormat(LogGcPlot, &buf);
		}
		break;
	case EWsGcOpSetPenColor:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRgb(*pData.rgb));
		_LIT(LogGcSetPenColor,"SetPenColor(%S)");
		aText.AppendFormat(LogGcSetPenColor,&buf);
		}
		break;
	case EWsGcOpSetBrushColor:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRgb(*pData.rgb));
		_LIT(LogGcSetBrushColor,"SetBrushColor(%S)");
		aText.AppendFormat(LogGcSetBrushColor,&buf);
		}
		break;
	case EWsGcOpSetPenSize:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(*pData.Point));
		_LIT(LogGcSetPenSize,"SetPenSize(%S)");
		aText.AppendFormat(LogGcSetPenSize,&buf);
		}
		break;
	case EWsGcOpSetPenStyle:
		{
		_LIT(LogGcSetPenStyle,"SetPenStyle(%d)");
		aText.AppendFormat(LogGcSetPenStyle,*pData.UInt);
		}
		break;
	case EWsGcOpSetClippingRegion:
		{
		_LIT(LogGcSetClippingRegion,"SetClippingRegion(...)");
		aText.Append(LogGcSetClippingRegion);
		}
		break;
	case EWsGcOpCancelClippingRegion:
		{
		_LIT(LogGcCancelClippingRegion,"CancelClippingRegion()");
		aText.Append(LogGcCancelClippingRegion);
		}
		break;
	case EWsGcOpSetClippingRect:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(*pData.Rect));
		_LIT(LogGcSetClippingRect,"SetClippingRect(%S)");
		aText.AppendFormat(LogGcSetClippingRect,&buf);
		}
		break;
	case EWsGcOpCancelClippingRect:
		{
		_LIT(LogGcCancelClippingRect,"CancelClippingRect()");
		aText.Append(LogGcCancelClippingRect);
		}
		break;
	case EWsGcOpDrawTo:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(*pData.Point));
		_LIT(LogGcDrawTo,"DrawTo(%S)");
		aText.AppendFormat(LogGcDrawTo,&buf);
		}
		break;
	case EWsGcOpDrawBy:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(*pData.Point));
		_LIT(LogGcDrawBy,"DrawBy(%S)");
		aText.AppendFormat(LogGcDrawBy,&buf);
		}
		break;
	case EWsGcOpDrawPolyLine:
		{
		_LIT(LogGcDrawPolyLine,"DrawPolyLine(%d...)");
		aText.AppendFormat(LogGcDrawPolyLine,pData.PolyLine->numPoints);
		}
		break;
	case EWsGcOpDrawPolyLineContinued:
		{
		_LIT(LogGcDrawPolyLineContinued,"DrawPolyLineContinued(%d...)");
		aText.AppendFormat(LogGcDrawPolyLineContinued,pData.PolyLine->numPoints);
		}
		break;
	case EWsGcOpUseBrushPattern:
		{
		_LIT(LogGcUseBrushPattern,"UseBrushPattern({0x%x})");
		aText.AppendFormat(LogGcUseBrushPattern,hHandleToValue(*pData.handle));
		}
		break;
	case EWsGcOpDrawArc:
		{
		TLongBuf buf1(TDebugLogTextHandler::FormatRect(pData.ArcOrPie->rect));
		TShortBuf buf2(TDebugLogTextHandler::FormatPoint(pData.ArcOrPie->start));
		TShortBuf buf3(TDebugLogTextHandler::FormatPoint(pData.ArcOrPie->end));
		_LIT(LogGcDrawArc,"DrawArc(%S,%S,%S)");
		aText.AppendFormat(LogGcDrawArc,&buf1,&buf2,&buf3);
		}
		break;
	case EWsGcOpSetWordJustification:
		{
		_LIT(LogGcSetWordJustification,"SetWordJustification(%d,%d)");
		aText.AppendFormat(LogGcSetWordJustification,pData.SetJustification->excessWidth,pData.SetJustification->numGaps);
		}
		break;
	case EWsGcOpSetCharJustification:
		{
		_LIT(LogGcSetCharJustification,"SetCharJustification(%d,%d)");
		aText.AppendFormat(LogGcSetCharJustification,pData.SetJustification->excessWidth,pData.SetJustification->numGaps);
		}
		break;
	case EWsGcOpSetBrushOrigin:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(*pData.Point));
		aText.AppendFormat(_L("SetBrushOrigin(%S)"), &buf);		
		}
		break;
	case EWsGcOpDiscardBrushPattern:
		{
		_LIT(LogGcDiscardBrushPattern,"DiscardBrushPattern()");
		aText.Append(LogGcDiscardBrushPattern);
		}	
		break;	
 	default:
		UnKnownOpcode(aText, aOpcode);
		break;
		}
	}

void TWsDecoder::DecodeGc2(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData)
	{
	TWsGcCmdUnion pData;

	pData.any=aCmdData;
	switch (aOpcode)
		{
	case EWsGcOpDrawText:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(pData.DrawText->pos));
		_LIT(LogGcDrawText1,"DrawText(\"");
		TDebugLogTextHandler::Append(aText, LogGcDrawText1);
		TDebugLogTextHandler::Append(aText, TPtrC((TText *)(pData.DrawText+1), pData.DrawText->length));
		_LIT(LogGcDrawText2,"\", %S)");
		aText.AppendFormat(LogGcDrawText2,&iOverflowHandler,&buf);
		}
		break;
	case EWsGcOpDrawTextVertical:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(pData.DrawTextVertical->pos));
		_LIT(LogGcDrawTextVertical1,"DrawTextVertical(\"");
		TDebugLogTextHandler::Append(aText, LogGcDrawTextVertical1);
		TDebugLogTextHandler::Append(aText, TPtrC((TText *)(pData.DrawTextVertical+1), pData.DrawTextVertical->length));
		_LIT(LogGcDrawTextVertical2,"\", %S, %d)");
		aText.AppendFormat(LogGcDrawTextVertical2,&iOverflowHandler,&buf,pData.DrawTextVertical->up);
		}
		break;
	case EWsGcOpDrawTextVerticalPtr:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(pData.DrawTextVertical->pos));
		_LIT(LogGcDrawTextVertical1,"DrawTextVertical(...");
		TDebugLogTextHandler::Append(aText, LogGcDrawTextVertical1);
		_LIT(LogGcDrawTextVertical2,", %S, %d)");
		aText.AppendFormat(LogGcDrawTextVertical2,&iOverflowHandler,&buf,pData.DrawTextVertical->up);
		}
		break;
	case EWsGcOpDrawTextPtr:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(pData.DrawText->pos));
		_LIT(LogGcDrawText1,"DrawText(...");
		TDebugLogTextHandler::Append(aText, LogGcDrawText1);
		_LIT(LogGcDrawText2,",%S)");
		aText.AppendFormat(LogGcDrawText2,&iOverflowHandler,&buf);
		}
		break;
	case EWsGcOpDrawBoxTextOptimised1:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(pData.BoxTextO1->box));
		_LIT(LogGcDrawText1,"DrawText(\"");
		aText.Append(LogGcDrawText1);
		TDebugLogTextHandler::Append(aText, TPtrC((TText *)(pData.BoxTextO1+1), pData.BoxTextO1->length));
		_LIT(LogGcDrawText2,"\", %S, %d, %d, 0)");
		aText.AppendFormat(LogGcDrawText2,&iOverflowHandler, &buf,
										pData.BoxTextO1->baselineOffset,CGraphicsContext::ELeft);
		}
		break;
	case EWsGcOpDrawBoxTextOptimised2:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(pData.BoxTextO2->box));
		_LIT(LogGcDrawText1,"DrawText(\"");
		aText.Append(LogGcDrawText1);
		TDebugLogTextHandler::Append(aText, TPtrC((TText *)(pData.BoxTextO2+1), pData.BoxTextO2->length));
		_LIT(LogGcDrawText2,"\", %S, %d, %d, %d)");
		aText.AppendFormat(LogGcDrawText2,&iOverflowHandler, &buf, pData.BoxTextO2->baselineOffset, 
										pData.BoxTextO2->horiz, pData.BoxTextO2->leftMrg);
		}
		break;
	case EWsGcOpDrawBoxTextVertical:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(pData.DrawBoxTextVertical->box));
		_LIT(LogGcDrawTextVertical1,"DrawTextVertical(\"");
		aText.Append(LogGcDrawTextVertical1);
		TDebugLogTextHandler::Append(aText, TPtrC((TText *)(pData.DrawBoxTextVertical+1), pData.DrawBoxTextVertical->length));
		_LIT(LogGcDrawTextVertical2,"\", %S, %d, %d, %d, %d)");
		aText.AppendFormat(LogGcDrawTextVertical2,&iOverflowHandler, &buf,
										pData.DrawBoxTextVertical->baselineOffset, pData.DrawBoxTextVertical->up,
										pData.DrawBoxTextVertical->vert, pData.DrawBoxTextVertical->margin);
		}
		break;
	case EWsGcOpDrawBoxTextPtr:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(pData.BoxText->box));
		_LIT(LogGcDrawText1,"DrawText(...");
		TDebugLogTextHandler::Append(aText, LogGcDrawText1);
		_LIT(LogGcDrawText2,", %S, %d, %d, %d)");
		aText.AppendFormat(LogGcDrawText2,&iOverflowHandler, &buf, pData.BoxText->baselineOffset,
										pData.BoxText->horiz, pData.BoxText->leftMrg);
		}
		break;
	case EWsGcOpDrawBoxTextVerticalPtr:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(pData.DrawBoxTextVertical->box));
		_LIT(LogGcDrawTextVertical1,"DrawTextVertical(...");
		aText.Append(LogGcDrawTextVertical1);
		_LIT(LogGcDrawTextVertical2,", %S, %d, %d, %d, %d)");
		aText.AppendFormat(LogGcDrawTextVertical2,&iOverflowHandler,&buf,
										pData.DrawBoxTextVertical->baselineOffset, pData.DrawBoxTextVertical->up,
										pData.DrawBoxTextVertical->vert, pData.DrawBoxTextVertical->margin);
		}
		break;
	case EWsGcOpCopyRect:
		{
		TShortBuf buf1(TDebugLogTextHandler::FormatPoint(pData.CopyRect->pos));
		TLongBuf buf2(TDebugLogTextHandler::FormatRect(pData.CopyRect->rect));
		_LIT(LogGcCopyRect,"CopyRect(%S, %S)");
		aText.AppendFormat(LogGcCopyRect,&buf1,&buf2);
		}
		break;
	case EWsGcOpDrawEllipse:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(*pData.Rect));
		_LIT(LogGcDrawEllipse,"DrawEllipse(%S)");
		aText.AppendFormat(LogGcDrawEllipse,&buf);
		}
		break;
	case EWsGcOpMoveTo:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(*pData.Point));
		_LIT(LogGcMoveTo,"MoveTo(%S)");
		aText.AppendFormat(LogGcMoveTo,&buf);
		}
		break;
	case EWsGcOpMoveBy:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(*pData.Point));
		_LIT(LogGcMoveBy,"MoveBy(%S)");
		aText.AppendFormat(LogGcMoveBy,&buf);
		}
		break;
	case EWsGcOpDrawPolygon:
		{
		_LIT(LogGcDrawPolygon,"DrawPolygon(...)");
		aText.Append(LogGcDrawPolygon);
		}
		break;
	case EWsGcOpDrawRoundRect:
		{
		TLongBuf buf1(TDebugLogTextHandler::FormatRect(pData.RoundRect->rect));
		TShortBuf buf2(TDebugLogTextHandler::FormatSize(pData.RoundRect->ellipse));
		_LIT(LogGcDrawRoundRect,"DrawRoundRect(%S,%S)");
		aText.AppendFormat(LogGcDrawRoundRect,&buf1,&buf2);
		}
		break;
	case EWsGcOpDrawPie:
		{
		TLongBuf buf1(TDebugLogTextHandler::FormatRect(pData.ArcOrPie->rect));
		TShortBuf buf2(TDebugLogTextHandler::FormatPoint(pData.ArcOrPie->start));
		TShortBuf buf3(TDebugLogTextHandler::FormatPoint(pData.ArcOrPie->end));
		_LIT(LogGcDrawPie,"DrawPie(%S,%S,%S)");
		aText.AppendFormat(LogGcDrawPie,&buf1,&buf2,&buf3);
		}
		break;
	case EWsGcOpSetOrigin:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(*pData.Point));
		_LIT(LogGcSetOrigin,"SetOrigin(%S)");
		aText.AppendFormat(LogGcSetOrigin,&buf);
		}
		break;
	case EWsGcOpStartSegmentedDrawPolygon:
		{
		_LIT(LogGcStartSegmentedDrawPolygon,"StartSegmentedDrawPolygon(%d)");
		aText.AppendFormat(LogGcStartSegmentedDrawPolygon,*pData.StartSegmentedDrawPolygon);
		}
		break;
	case EWsGcOpSegmentedDrawPolygonData:
		{
		_LIT(LogGcSegmentedDrawPolygonData,"SegmentedDrawPolygonData(%d,%d,...)");
		aText.AppendFormat(LogGcSegmentedDrawPolygonData,pData.SegmentedDrawPolygonData->index,
									pData.SegmentedDrawPolygonData->numPoints);
		}
		break;
	case EWsGcOpDrawSegmentedPolygon:
		{
		_LIT(LogGcDrawSegmentedPolygon,"DrawSegmentedPolygon()");
		aText.AppendFormat(LogGcDrawSegmentedPolygon);
		}
		break;
	case EWsGcOpDrawRect:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(*pData.Rect));
		_LIT(LogGcDrawRect,"DrawRect(%S)");
		aText.AppendFormat(LogGcDrawRect,&buf);
		}
		break;
	case EWsGcOpDrawBitmap:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(pData.Bitmap->pos));
		_LIT(KLitGcDrawBitmap, "DrawBitmap({%d}, %S)");
		aText.AppendFormat(KLitGcDrawBitmap, hHandleToValue(pData.Bitmap->handle), &buf);
		}
		break;
	case EWsGcOpDrawBitmap2:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(pData.Bitmap2->rect));
		_LIT(KLitGcDrawBitmap2, "DrawBitmap2({%d}, %S)");
		aText.AppendFormat(KLitGcDrawBitmap2, hHandleToValue(pData.Bitmap2->handle), &buf);
		}
		break;
	case EWsGcOpDrawBitmap3:
		{
		TLongBuf buf1(TDebugLogTextHandler::FormatRect(pData.Bitmap3->rect));
		TLongBuf buf2(TDebugLogTextHandler::FormatRect(pData.Bitmap3->srcRect));
		_LIT(KLitGcDrawBitmap3, "DrawBitmap3({%d}, %S, %S)");
		aText.AppendFormat(KLitGcDrawBitmap3, hHandleToValue(pData.Bitmap3->handle), &buf1, &buf2);
		}
		break;
	case EWsGcOpDrawBitmapMasked:
	case EWsGcOpWsDrawBitmapMasked:
		{
		TLongBuf buf1(TDebugLogTextHandler::FormatRect(pData.iBitmapMasked->iRect));
		TLongBuf buf2(TDebugLogTextHandler::FormatRect(pData.iBitmapMasked->iSrcRect));
		_LIT(KLitGcDrawBitmapMasked, "DrawBitmapMasked(%S, {%d}, %S, {%d}, %d)");
		aText.AppendFormat(KLitGcDrawBitmapMasked, &buf1, hHandleToValue(pData.iBitmapMasked->iHandle), 
			&buf2, hHandleToValue(pData.iBitmapMasked->iMaskHandle), pData.iBitmapMasked->iInvertMask);
		}
		break;
	case EWsGcOpDrawBoxText:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(pData.BoxText->box));
		_LIT(LogGcDrawText1,"DrawText(\"");
		aText.Append(LogGcDrawText1);
		TDebugLogTextHandler::Append(aText, TPtrC((TText *)(pData.BoxText+1), pData.BoxText->length));
		_LIT(LogGcDrawText2,"\", %S, %d, %d, %d)");
		aText.AppendFormat(LogGcDrawText2,&iOverflowHandler, &buf, pData.BoxText->baselineOffset, 
										pData.BoxText->horiz, pData.BoxText->leftMrg);
		}
		break;		
	default:
		UnKnownOpcode(aText, aOpcode);
		break;
		}
	}

void TWsDecoder::DecodeGc3(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData)
	{
	TWsGcCmdUnion pData;

	pData.any=aCmdData;
	switch (aOpcode)
		{
	case EWsGcOpSetDrawMode:
		{
		_LIT(LogGcSetDrawMode,"SetDrawMode(%u)");
		aText.AppendFormat(LogGcSetDrawMode,*pData.UInt);
		}
		break;
	case EWsGcOpClearRect:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(*pData.Rect));
		_LIT(LogGcClear,"Clear(%S)");
		aText.AppendFormat(LogGcClear, &buf);
		}
		break;
	case EWsGcOpClear:
		{
		_LIT(LogGcClear,"Clear()");
		aText.AppendFormat(LogGcClear);
		}
		break;
	case EWsGcOpGdiBlt2:
	case EWsGcOpGdiWsBlt2:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(pData.GdiBlt2->pos));
		_LIT(LogGcGdiBlt,"GdiBlt(%S, {%d})");
		aText.AppendFormat(LogGcGdiBlt,&buf,hHandleToValue(pData.GdiBlt2->handle));
		}
		break;
	case EWsGcOpGdiBlt3:
	case EWsGcOpGdiWsBlt3:
		{
		TShortBuf buf1(TDebugLogTextHandler::FormatPoint(pData.GdiBlt3->pos));
		TLongBuf buf2(TDebugLogTextHandler::FormatRect(pData.GdiBlt3->rect));
		_LIT(LogGcGdiBlt,"GdiBlt(%S, {%d}, %S)");
		aText.AppendFormat(LogGcGdiBlt,&buf1,hHandleToValue(pData.GdiBlt3->handle),&buf2);
		}
		break;
	case EWsGcOpGdiBltMasked:
	case EWsGcOpGdiWsBltMasked:
		{
		TShortBuf buf1(TDebugLogTextHandler::FormatPoint(pData.GdiBltMasked->destination));
		TLongBuf buf2(TDebugLogTextHandler::FormatRect(pData.GdiBltMasked->source));
		_LIT(LogGcBitBltMasked,"BitBltMasked(%S, {%d}, %S, {%d}, %d)");
		aText.AppendFormat(LogGcBitBltMasked, &buf1, hHandleToValue(pData.GdiBltMasked->handle),
										&buf2, hHandleToValue(pData.GdiBltMasked->maskHandle),
										pData.GdiBltMasked->invertMask);
		}
		break;
	case EWsGcOpSize:
		{
		_LIT(LogGcSize,"Size()");
		aText.AppendFormat(LogGcSize);
		}
		break;
	case EWsGcOpUseFont:
		{
		_LIT(LogGcUseFont,"UseFont({0x%x})");
		aText.AppendFormat(LogGcUseFont,hHandleToValue(*pData.handle));
		}
		break;
	case EWsGcOpDiscardFont:
		{
		_LIT(LogGcDiscardFont,"DiscardFont()");
		aText.AppendFormat(LogGcDiscardFont);
		}
		break;
	case EWsGcOpTestInvariant:
		{
		_LIT(LogGcTestInvariant,"unimplemented opcode 'EWsGcOpTestInvariant' (%u)");
		aText.AppendFormat(LogGcTestInvariant, aOpcode);
		}
		break;
	case EWsGcOpReset:
		{
		_LIT(LogGcReset,"Reset()");
		aText.Append(LogGcReset);
		}
		break;
	case EWsGcOpSetDitherOrigin:
		{
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(*pData.Point));
		_LIT(LogGcSetDitherOrigin,"SetDitherOrigin(%S)");
		aText.AppendFormat(LogGcSetDitherOrigin,&buf);
		}
		break;
	case EWsGcOpMapColors:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(pData.MapColors->rect));
		_LIT(LogGcMapColors,"MapColors(%S,?,%d)");
		aText.AppendFormat(LogGcMapColors,&buf,pData.MapColors->numPairs);
		}
		break;
	case EWsGcOpSetUnderlineStyle:
		{
		_LIT(LogGcSetUnderlineStyle,"SetUnderlineStyle(%x)");
		aText.AppendFormat(LogGcSetUnderlineStyle,*pData.SetUnderlineStyle);
		}
		break;
	case EWsGcOpSetStrikethroughStyle:
		{
		_LIT(LogGcSetStrikethroughStyle,"SetStrikethroughStyle(%x)");
		aText.AppendFormat(LogGcSetStrikethroughStyle,*pData.SetStrikethroughStyle);
		}
		break;
	case EWsGcOpDrawWsGraphic:
	case EWsGcOpDrawWsGraphicPtr:
		{
		TLongBuf buf(TDebugLogTextHandler::FormatRect(pData.WsGraphic->iRect));
		_LIT(KLitGcDrawWsGraphic,"DrawWsGraphic(%x, %d, %S, %d)");
		aText.AppendFormat(KLitGcDrawWsGraphic, pData.WsGraphic->iFlags, pData.WsGraphic->iId, &buf, pData.WsGraphic->iDataLen);
		}
		break;
	case EWsGcOpSetFaded:
		{
		_LIT(KLitGcSetFaded, "SetFaded(%d)");
		aText.AppendFormat(KLitGcSetFaded, *pData.Bool);
		}
		break;
	case EWsGcOpSetFadeParams:
		{
		_LIT(KLitGcSetFadeParams, "SetFadeParams(BlackMap %d, WhiteMap %d)");
		const unsigned char *bytePtr = (const unsigned char*)(pData.UInt);
		aText.AppendFormat(KLitGcSetFadeParams, bytePtr[0], bytePtr[1]);
		}
		break;
	case EWsGcOpGdiAlphaBlendBitmaps:
	case EWsGcOpGdiWsAlphaBlendBitmaps:
		{
		TShortBuf buf1(TDebugLogTextHandler::FormatPoint(pData.AlphaBlendBitmaps->point));
		TLongBuf buf2(TDebugLogTextHandler::FormatRect(pData.AlphaBlendBitmaps->source));
		TShortBuf buf3(TDebugLogTextHandler::FormatPoint(pData.AlphaBlendBitmaps->alphaPoint));
		_LIT(KLitGcAlphaBlendBitmaps,"AlphaBlendBitmaps(%S, {%d}, %S, {%d}, %S)");
		aText.AppendFormat(KLitGcAlphaBlendBitmaps, &buf1, hHandleToValue(pData.AlphaBlendBitmaps->bitmapHandle),
										&buf2, hHandleToValue(pData.AlphaBlendBitmaps->alphaHandle),
										&buf3);
		}
		break;
	case EWsGcOpSetOpaque:
		{
		_LIT(KLitGcOpSetOpaque, "SetOpaque(%d)");
		aText.AppendFormat(KLitGcOpSetOpaque, *pData.Bool);
		}
		break;
	default:
		UnKnownOpcode(aText, aOpcode);
		break;
		}
	}

void TWsDecoder::DecodeScreenDevice(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle)
	{
	TWsSdCmdUnion pData;
	_LIT(LogScreenDevice,"CWsScreenDevice[%d]::");

	aText.Format(LogScreenDevice,aHandle);
	pData.any=aCmdData;
	switch (aOpcode)
		{
	case EWsSdOpFree:
		{
		_LIT(LogScreenDeviceDelete,"~CWsScreenDevice()");
		aText.Append(LogScreenDeviceDelete);
		}
		break;
	case EWsSdOpPixel:
		{
		_LIT(LogScreenDevicePixel,"Pixel(%S)");
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(*pData.Point));
		aText.AppendFormat(LogScreenDevicePixel,&buf);
		}
		break;
	case EWsSdOpGetScanLine:
		{		//This fills up the log two much for test code
		aText=KNullDesC;
		/*_LIT(LogScreenDeviceGetScanLine,"GetScanLine(TRgb *aScanLine, %d, %S)");
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(pData.GetScanLine->pos));
		aText.AppendFormat(LogScreenDeviceGetScanLine,pData.GetScanLine->len,&buf);*/
		}
		break;
	case EWsSdOpHorizontalTwipsToPixels:
		{
		_LIT(LogScreenDeviceHorizontalTwipsToPixels,"HorizontalTwipsToPixels()");
		aText.Append(LogScreenDeviceHorizontalTwipsToPixels);
		}
		break;
	case EWsSdOpVerticalTwipsToPixels:
		{
		_LIT(LogScreenDeviceVerticalTwipsToPixels,"VerticalTwipsToPixels()");
		aText.Append(LogScreenDeviceVerticalTwipsToPixels);
		}
		break;
	case EWsSdOpHorizontalPixelsToTwips:
		{
		_LIT(LogScreenDeviceHorizontalPixelsToTwips,"HorizontalPixelsToTwips()");
		aText.Append(LogScreenDeviceHorizontalPixelsToTwips);
		}
		break;
	case EWsSdOpVerticalPixelsToTwips:
		{
		_LIT(LogScreenDeviceVerticalPixelsToTwips,"VerticalPixelsToTwips()");
		aText.Append(LogScreenDeviceVerticalPixelsToTwips);
		}
		break;
	case EWsSdOpPixelSize:
		{
		_LIT(LogScreenDeviceSizeInPixels,"SizeInPixels()");
		aText.Append(LogScreenDeviceSizeInPixels);
		}
		break;
	case EWsSdOpTwipsSize:
		{
		_LIT(LogScreenDeviceSizeInTwips,"SizeInTwips()");
		aText.Append(LogScreenDeviceSizeInTwips);
		}
		break;
	case EWsSdOpDisplayMode:
		{
		_LIT(LogScreenDeviceDisplayMode,"DisplayMode()");
		aText.Append(LogScreenDeviceDisplayMode);
		}
		break;
	case EWsSdOpRectCompare:
		{
		_LIT(LogScreenDeviceRectCompare,"RectCompare(%S, %S)");
		TLongBuf buf1(TDebugLogTextHandler::FormatRect(pData.RectCompare->rect1));
		TLongBuf buf2(TDebugLogTextHandler::FormatRect(pData.RectCompare->rect2));
		aText.AppendFormat(LogScreenDeviceRectCompare,&buf1,&buf2);
		}
		break;
	case EWsSdOpPointerRect:
		{
		_LIT(LogScreenDevicePointerRect,"PointerRect()");
		aText.Append(LogScreenDevicePointerRect);
		}
		break;
	case EWsSdOpCopyScreenToBitmap:
		{
		_LIT(LogScreenDeviceCopyScreenToBitmap,"CopyScreenToBitmap(%d)");
		aText.AppendFormat(LogScreenDeviceCopyScreenToBitmap,pData.CopyScreenToBitmap->handle);
		}
		break;
	case EWsSdOpCopyScreenToBitmap2:
		{
		_LIT(LogScreenDeviceCopyScreenToBitmap2,"CopyScreenToBitmap(%d,%S)");
		TLongBuf buf(TDebugLogTextHandler::FormatRect(pData.CopyScreenToBitmap2->rect));
		aText.AppendFormat(LogScreenDeviceCopyScreenToBitmap2,pData.CopyScreenToBitmap2->handle,&buf);
		}
		break;
	case EWsSdOpSetScreenSizeAndRotation:
		{
		_LIT(LogScreenDeviceSetScreenSizeAndRotation,"SetScreenSizeAndRotation({%S, %S, %d})");
		TShortBuf buf1(TDebugLogTextHandler::FormatSize(pData.PixelsTwipsAndRotation->iPixelSize));
		TShortBuf buf2(TDebugLogTextHandler::FormatSize(pData.PixelsTwipsAndRotation->iTwipsSize));
		aText.AppendFormat(LogScreenDeviceSetScreenSizeAndRotation,&buf1,&buf2,pData.PixelsTwipsAndRotation->iRotation);
		}
		break;
	case EWsSdOpSetScreenSizeAndRotation2:
		{
		_LIT(LogScreenDeviceSetScreenSizeAndRotation,"SetScreenSizeAndRotation({%S, %d})");
		TShortBuf buf(TDebugLogTextHandler::FormatSize(pData.PixelsAndRotation->iPixelSize));
		aText.AppendFormat(LogScreenDeviceSetScreenSizeAndRotation,&buf,pData.PixelsAndRotation->iRotation);
		}
		break;
	case EWsSdOpGetDefaultScreenSizeAndRotation:
	case EWsSdOpGetDefaultScreenSizeAndRotation2:
		{
		_LIT(LogScreenDeviceGetDefaultScreenSizeAndRotation,"GetDefaultScreenSizeAndRotation(...)");
		aText.Append(LogScreenDeviceGetDefaultScreenSizeAndRotation);
		}
		break;
	case EWsSdOpGetNumScreenModes:
		{
		_LIT(LogScreenDeviceNumScreenModes,"NumScreenModes");
		aText.Append(LogScreenDeviceNumScreenModes);
		}
		break;
	case EWsSdOpSetScreenMode:
		{
		_LIT(LogScreenDeviceSetScreenMode,"ScreenMode(%d)");
		aText.AppendFormat(LogScreenDeviceSetScreenMode,*pData.Int);
		}
		break;
	case EWsSdOpGetScreenModeSizeAndRotation:
	case EWsSdOpGetScreenModeSizeAndRotation2:
		{
		_LIT(LogScreenDeviceGetScreenModeSizeAndRotation,"GetScreenModeSizeAndRotation(%d)");
		aText.AppendFormat(LogScreenDeviceGetScreenModeSizeAndRotation,*pData.Int);
		}
		break;
	case EWsSdOpSetScreenModeEnforcement:
		{
		_LIT(LogScreenDeviceSetScreenModeEnforcement,"SetScreenModeEnforcement(%d)");
		aText.AppendFormat(LogScreenDeviceSetScreenModeEnforcement,*pData.Int);
		}
		break;
	case EWsSdOpScreenModeEnforcement:
		{
		_LIT(LogScreenDeviceScreenModeEnforcement,"ScreenModeEnforcement");
		aText.Append(LogScreenDeviceScreenModeEnforcement);
		}
		break;
	case EWsSdOpSetModeRotation:
		{
		_LIT(LogScreenDeviceSetModeRotation,"SetModeRotation(%d,%d)");
		aText.AppendFormat(LogScreenDeviceSetModeRotation,pData.SetScreenRotation->mode,pData.SetScreenRotation->rotation);
		}
		break;
	case EWsSdOpGetRotationList:
		{
		_LIT(LogScreenDeviceGetRotationList,"GetRotationList(%d)");
		aText.AppendFormat(LogScreenDeviceGetRotationList,*pData.Int);
		}
		break;
	case EWsSdOpPaletteAttributes:
		{
		_LIT(LogScreenDevicePaletteAttributes,"PaletteAttributes(...)");
		aText.Append(LogScreenDevicePaletteAttributes);
		}
		break;
	case EWsSdOpSetPalette:
		{
		_LIT(LogScreenDeviceSetPalette,"SetPalette(...)");
		aText.Append(LogScreenDeviceSetPalette);
		}
		break;
	case EWsSdOpGetPalette:
		{
		_LIT(LogScreenDeviceGetPalette,"GetPalette()");
		aText.Append(LogScreenDeviceGetPalette);
		}
		break;
	case EWsSdOpGetScreenMode:
		{
		_LIT(LogScreenDeviceGetScreenMode,"CurrentScreenMode()");
		aText.Append(LogScreenDeviceGetScreenMode);
		}
		break;
	case EWsSdOpGetDefaultScreenModeOrigin:
		{
		_LIT(LogScreenDeviceGetDefaultScreenModeOrigin,"GetDefaultScreenModeOrigin()");
		aText.Append(LogScreenDeviceGetDefaultScreenModeOrigin);
		}	
		break;
	case EWsSdOpGetScreenModeOrigin:
		{
		_LIT(LogScreenDeviceGetScreenModeOrigin,"GetScreenModeOrigin(%d)");
		aText.AppendFormat(LogScreenDeviceGetScreenModeOrigin, *pData.Int);
		}	
		break;
	case EWsSdOpGetScreenModeScale:
		{
		_LIT(LogScreenDeviceGetScreenModeScale,"GetScreenModeScale(%d)");
		aText.AppendFormat(LogScreenDeviceGetScreenModeScale, *pData.Int);
		}	
		break;
	case EWsSdOpGetCurrentScreenModeScale:
		{
		_LIT(LogScreenDeviceGetCurrentScreenModeScale,"GetCurrentScreenModeScale()");
		aText.Append(LogScreenDeviceGetCurrentScreenModeScale);
		}	
		break;		
	case EWsSdOpSetAppScreenMode:
		{
		_LIT(LogScreenDeviceSetAppScreenMode,"SetAppScreenMode(%d)");
		aText.AppendFormat(LogScreenDeviceSetAppScreenMode, *pData.Int);
		}	
		break;		
	case EWsSdOpGetScreenModeScaledOrigin:
		{
		_LIT(LogScreenDeviceGetScreenModeScaledOrigin,"GetScreenModeScaledOrigin(%d)");
		aText.AppendFormat(LogScreenDeviceGetScreenModeScaledOrigin, *pData.Int);
		}	
		break;		
	case EWsSdOpGetCurrentScreenModeScaledOrigin:
		{
		_LIT(LogScreenDeviceGetCurrentScreenModeScaledOrigin,"GetCurrentScreenModeScaledOrigin()");
		aText.Append(LogScreenDeviceGetCurrentScreenModeScaledOrigin);
		}	
		break;		
	case EWsSdOpSetCurrentScreenModeAttributes:
		{
		_LIT(LogScreenDeviceSetCurrentScreenModeAttributes,"SetCurrentScreenModeAttributes(%S)");
		TShortBuf buf(TDebugLogTextHandler::FormatSize(pData.ScreenSizeMode->iScreenSize));
		aText.AppendFormat(LogScreenDeviceSetCurrentScreenModeAttributes,&buf);
		}	
		break;		
	case EWsSdOpGetCurrentScreenModeAttributes:
		{
		_LIT(LogScreenDeviceGetCurrentScreenModeOrigin,"GetCurrentScreenModeAttributes()");
		aText.Append(LogScreenDeviceGetCurrentScreenModeOrigin);
		}	
		break;		
	case EWsSdOpGetScreenNumber:
		{
		_LIT(LogScreenDeviceGetScreenNumber,"GetScreenNumber()");
		aText.Append(LogScreenDeviceGetScreenNumber);
		}	
		break;		
	case EWsSdOpGetScreenSizeModeList:
		{
		_LIT(LogScreenDeviceGetScreenSizeModeList,"GetScreenSizeModeList(RArray<TInt>* aModeList)");
		aText.Append(LogScreenDeviceGetScreenSizeModeList);
		}	
		break;		
	case EWsSdOpGetScreenModeDisplayMode:
		{
		_LIT(LogScreenDeviceGetScreenModeDisplayMode,"GetScreenModeDisplayMode(%d)");
		aText.AppendFormat(LogScreenDeviceGetScreenModeDisplayMode, *pData.Int);
		}	
		break;		
	case EWsClOpSetBackLight:
		{
		_LIT(LogScreenDeviceSetBackLight,"SetBackLight(%u)");
		aText.AppendFormat(LogScreenDeviceSetBackLight, *pData.UInt);
		}	
		break;		
	default:
		UnKnownOpcode(aText, aOpcode);
		break;
		}
	}

void TWsDecoder::DecodeAnimDll(TBuf<LogTBufSize>& aText,TInt aOpcode,const TAny* /*aCmdData*/,TInt aHandle)
	{
	aText.Format(_L("CAnimDll[%d]::"),aHandle);
	switch (aOpcode)
		{
	case EWsAnimDllOpCreateInstance:
		TDebugLogTextHandler::Append(aText, _L("CreateInstance(...)"));
		break;
	case EWsAnimDllOpDestroyInstance:
		TDebugLogTextHandler::Append(aText, LogClose);
		break;
	case EWsAnimDllOpCommandReply:
		TDebugLogTextHandler::Append(aText, _L("CommandReply(...)"));
		break;
	case EWsAnimDllOpCommand:
		TDebugLogTextHandler::Append(aText, _L("Command(...)"));
		break;
	case EWsAnimDllOpFree:
		aText.Append(_L("~CAnimDll()"));
		break;
	case EWsAnimDllOpCreateInstanceSprite:
		aText.Append(_L("EWsAnimDllOpCreateInstanceSprite enum"));
		break;
	default:
		UnKnownOpcode(aText, aOpcode);
		break;
		}
	}

void TWsDecoder::DecodeSpriteBase(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle)
	{
	TWsSpriteCmdUnion pData;

	aText.Format(_L("RWsSpriteBase[%d]::"),aHandle);
	pData.any=aCmdData;
	switch (aOpcode)
		{
	case EWsSpriteOpFree:
		aText.Append(LogClose);
		break;
	case EWsSpriteOpSetPosition:
		aText.Append(_L("SetPosition(...)"));
		break;
	case EWsSpriteOpUpdateMember:
		aText.AppendFormat(_L("UpdateMember(%d)"),pData.UpdateMember->index);
		break;
	case EWsSpriteOpUpdateMember2:
		aText.AppendFormat(_L("UpdateMember(%d,{%d,%d,%d,%d,{%d,%d},%d})"),pData.UpdateMember->index,
								pData.UpdateMember->data.iBitmap,pData.UpdateMember->data.iMaskBitmap,
								pData.UpdateMember->data.iInvertMask,pData.UpdateMember->data.iDrawMode,
								pData.UpdateMember->data.iOffset.iX,pData.UpdateMember->data.iOffset.iY,
								pData.UpdateMember->data.iInterval.Int());
		break;
	case EWsSpriteOpAppendMember:
		aText.Append(_L("AppendMember(...)"));
		break;
	case EWsSpriteOpActivate:
		aText.Append(_L("Activate()"));
		break;
	default:
		UnKnownOpcode(aText, aOpcode);
		break;
		}
	}

void TWsDecoder::DecodeBitmap(TBuf<LogTBufSize>& aText,TInt aOpcode,const TAny* /*aCmdData*/,TInt aHandle)
	{
	aText.Format(_L("CWsBitmap[%d]::"),aHandle);
	switch (aOpcode)
		{
	case EWsBitmapOpFree:
		aText.Append(LogClose);
		break;
	default:
		UnKnownOpcode(aText, aOpcode);
		break;
		}
	}

void TWsDecoder::DecodeDirect(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle)
	{
	TWsDirectCmdUnion pData;
	
	_LIT(KClassName,"RDirectScreenAccess[%d]::");
	aText.Format(KClassName,aHandle);
	pData.any=aCmdData;
	switch (aOpcode)
		{
	case EWsDirectOpFree:
		aText.Append(LogClose);
		break;
	case EWsDirectOpRequest:
		{
		_LIT(LogDirectRequest,"Request(TInt *stat,%d)");
		aText.AppendFormat(LogDirectRequest,hHandleToValue(*pData.Int));
		}
		break;
	case EWsDirectOpInitFailed:
		{
		_LIT(LogDirectInitFailed,"InitFailed()");
		aText.Append(LogDirectInitFailed);
		}
		break;
	case EWsDirectOpGetRegion:
		{
		_LIT(LogDirectGetRegion,"GetRegion(%d)");
		aText.AppendFormat(LogDirectGetRegion,*pData.Int);
		}
		break;
	case EWsDirectOpCancel:
		{
		_LIT(LogDirectCancel,"Cancel()");
		aText.Append(LogDirectCancel);
		}
		break;
	case EWsDirectOpGetSendQueue:
		{
		_LIT(LogGetSendQueue,"EWsDirectOpGetSendQueue enum");
		aText.Append(LogGetSendQueue);
		}
		break;	
	case EWsDirectOpGetRecQueue:
		{
		_LIT(LogGetRecQueue,"EWsDirectOpGetRecQueue enum");
		aText.Append(LogGetRecQueue);
		}
		break;	
	default:
		UnKnownOpcode(aText, aOpcode);
		break;
		}
	}

void TWsDecoder::DecodeClick(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle)
	{
	TWsClickCmdUnion pData;

	_LIT(KClassName,"RSoundPlugIn[%d]::");
	aText.Format(KClassName,aHandle);
	pData.any=aCmdData;
	switch (aOpcode)
		{
	case EWsClickOpFree:
		aText.Append(LogClose);
		break;
	case EWsClickOpIsLoaded:
		{
		_LIT(LogClickIsLoaded,"IsLoaded()");
		aText.Append(LogClickIsLoaded);
		}
		break;
	case EWsClickOpUnLoad:
		{
		_LIT(LogClickUnLoad,"UnLoad()");
		aText.Append(LogClickUnLoad);
		}
		break;
	case EWsClickOpLoad:
		{
		_LIT(LogClickLoad1,"Load(\"");
		_LIT(LogClickLoad2,"\")");
		TDebugLogTextHandler::Append(aText, LogClickLoad1);
		TDebugLogTextHandler::Append(aText, TPtrC((TText *)(pData.Int+1), *pData.Int));
		TDebugLogTextHandler::Append(aText, LogClickLoad2);
		}
		break;
	case EWsClickOpCommandReply:
		{
		_LIT(LogClickCommandReply,"CommandReply(...)");
		aText.Append(LogClickCommandReply);
		}
		break;
	case EWsClickOpSetKeyClick:
		{			
		_LIT(LogSetKeyClick,"SetKeyClick(%u)");
		aText.AppendFormat(LogSetKeyClick, *pData.Bool);
		}
		break;
	case EWsClickOpSetPenClick:
		{			
		_LIT(LogSetPenClick,"SetPenClick(%u)");
		aText.AppendFormat(LogSetPenClick, *pData.Bool);
		}	
		break;
	case EWsClickOpKeyClickEnabled:
		{
		_LIT(LogKeyClickEnabled,"KeyClickEnabled()");
		aText.Append(LogKeyClickEnabled);
		}
		break;
	case EWsClickOpPenClickEnabled:
		{
		_LIT(LogPenClickEnabled,"PenClickEnabled()");
		aText.Append(LogPenClickEnabled);
		}
		break;
	default:
		UnKnownOpcode(aText, aOpcode);
		break;
		}
	}

TDesC &TWsDecoder::replyBufDetails(TInt aClass, TInt aOpcode, const TDesC8 *aReplyDes8, const TDesC *aReplyDesText)
	{
	iCommandDetailsText.Format(_L("Reply Buffer: "));
	switch (aClass)
		{
	case WS_HANDLE_GROUP_WINDOW:
		ReplyBufWindowGroup(iCommandDetailsText, aOpcode, aReplyDes8, aReplyDesText);
		break;
	case WS_HANDLE_CLIENT:
		ReplyBufClient(iCommandDetailsText, aOpcode, aReplyDes8, aReplyDesText);
		break;
	case WS_HANDLE_WINDOW:
		ReplyBufWindow(iCommandDetailsText, aOpcode, aReplyDes8, aReplyDesText);
		break;
	case WS_HANDLE_SCREEN_DEVICE:
		ReplyBufScreenDevice(iCommandDetailsText, aOpcode, aReplyDes8, aReplyDesText);
		break;
	default:
		iCommandDetailsText.Format(_L("Reply buffer not handled (%u)"), aClass);
		UnKnown();
		break;
		}
	return iCommandDetailsText;
	}

TDesC &TWsDecoder::commandDetails(TInt aClass, TInt aOpcode, const TAny *aCmdData, TInt aHandle)
	{
	switch (aClass)
		{
	case WS_HANDLE_ROOT_WINDOW:
		iCommandDetailsText.Format(_L("invalid class"));
		break;
	case WS_HANDLE_GROUP_WINDOW:
		DecodeWindowGroup(iCommandDetailsText, aOpcode, aCmdData, aHandle);
		break;
	case WS_HANDLE_CLIENT:
		DecodeClient(iCommandDetailsText, aOpcode, aCmdData, aHandle);
		break;
	case WS_HANDLE_WINDOW:
		DecodeWindow(iCommandDetailsText, aOpcode, aCmdData, aHandle);
		break;
	case WS_HANDLE_GC:
		DecodeGc(iCommandDetailsText, aOpcode, aCmdData, aHandle);
		break;
	case WS_HANDLE_SCREEN_DEVICE:
		DecodeScreenDevice(iCommandDetailsText, aOpcode, aCmdData, aHandle);
		break;
	case WS_HANDLE_ANIM_DLL:
		DecodeAnimDll(iCommandDetailsText, aOpcode, aCmdData, aHandle);
		break;
	case WS_HANDLE_SPRITE:
	case WS_HANDLE_POINTER_CURSOR:
	case WS_HANDLE_TEXT_CURSOR:
		DecodeSpriteBase(iCommandDetailsText, aOpcode, aCmdData, aHandle);
		break;
	case WS_HANDLE_BITMAP:
		DecodeBitmap(iCommandDetailsText, aOpcode, aCmdData, aHandle);
		break;
	case WS_HANDLE_DIRECT:
		DecodeDirect(iCommandDetailsText, aOpcode, aCmdData, aHandle);
		break;
	case WS_HANDLE_CLICK:
		DecodeClick(iCommandDetailsText, aOpcode, aCmdData, aHandle);
		break;
	default:
		iCommandDetailsText.Format(_L("unknown class (%u)"), aClass);
		UnKnown();
		break;
		}
	iRequestFuncClass=aClass;
	iPrevOpcode=aOpcode;
	return iCommandDetailsText;
	}

TDesC &TWsDecoder::eventDetails(const TWsEvent *aWsEvent)
	{
	switch (aWsEvent->Type())
		{
	case EEventKey:
		iEventDetailsText.Format(_L("EEventKey (code %u, scanCode %u, mdfs 0x%04x, repeats %u)"),
											aWsEvent->Key()->iCode,
											aWsEvent->Key()->iScanCode,
											aWsEvent->Key()->iModifiers,
											aWsEvent->Key()->iRepeats);
		break;
	case EEventKeyUp:
		iEventDetailsText.Format(_L("EEventKeyUp (scanCode %u, mdfs 0x%04x)"),
											aWsEvent->Key()->iScanCode,
											aWsEvent->Key()->iModifiers);
		break;
	case EEventKeyDown:
		iEventDetailsText.Format(_L("EEventKeyDown (scanCode %u, mdfs 0x%04x)"),
											aWsEvent->Key()->iScanCode,
											aWsEvent->Key()->iModifiers);
		break;
	case EEventPointer:
		{
		TShortBuf buf1(TDebugLogTextHandler::PointerEventType(aWsEvent->Pointer()->iType));
		TShortBuf buf2(TDebugLogTextHandler::FormatPoint(aWsEvent->Pointer()->iPosition));
		TShortBuf buf3(TDebugLogTextHandler::FormatPoint(aWsEvent->Pointer()->iParentPosition));
		iEventDetailsText.Format(_L("EEventPointer (type %S, modifiers 0x%x, pos %S, global-pos %S)"),
											&buf1,aWsEvent->Pointer()->iModifiers,&buf2,&buf3);
		}
		break;
	case EEventDragDrop:
		{
		TShortBuf buf1(TDebugLogTextHandler::PointerEventType(aWsEvent->Pointer()->iType));
		TShortBuf buf2(TDebugLogTextHandler::FormatPoint(aWsEvent->Pointer()->iPosition));
		TShortBuf buf3(TDebugLogTextHandler::FormatPoint(aWsEvent->Pointer()->iParentPosition));
		iEventDetailsText.Format(_L("EEventDragDrop (type %S, modifiers 0x%x, pos %S, global-pos %S)"),
											&buf1,aWsEvent->Pointer()->iModifiers,&buf2,&buf3);
		}
		break;
	case EEventPointerEnter:
		iEventDetailsText.Format(_L("EEventPointerEnter"));
		break;
	case EEventPointerExit:
		iEventDetailsText.Format(_L("EEventPointerExit"));
		break;
	case EEventFocusLost:
		iEventDetailsText.Format(_L("EEventFocusLost"));
		break;
	case EEventFocusGained:
		iEventDetailsText.Format(_L("EEventFocusGained"));
		break;
	case EEventModifiersChanged:
		iEventDetailsText.Format(_L("EEventModifiersChanged"));
		break;
	case EEventSwitchOn:
		iEventDetailsText.Format(_L("EEventSwitchOn"));
		break;
	case EEventPassword:
		iEventDetailsText.Format(_L("EEventPassword"));
		break;
	case EEventWindowGroupsChanged:
		iEventDetailsText.Format(_L("EEventWindowGroupsChanged"));
		break;
	case EEventErrorMessage:
		iEventDetailsText.Format(_L("EEventErrorMessage (%d,%d)"),aWsEvent->ErrorMessage()->iErrorCategory,aWsEvent->ErrorMessage()->iError);
		break;
	case EEventMessageReady:
		iEventDetailsText.Format(_L("EEventMessageReady"));
		break;
	case EEventScreenDeviceChanged:
		iEventDetailsText.Format(_L("EEventScreenDeviceChanged"));
		break;
	case EEventSwitchOff:
		{
		_LIT(LogEventSwitchOff,"EEventSwitchOff");
		iEventDetailsText.Format(LogEventSwitchOff);
		}
		break;
	case EEventKeySwitchOff:
		{
		_LIT(LogEventKeySwitchOff,"EEventKeySwitchOff");
		iEventDetailsText.Format(LogEventKeySwitchOff);
		}
		break;
	case EEventFocusGroupChanged:
		{
		_LIT(LogEventFocusGroupChanged,"EEventFocusGroupChanged");
		iEventDetailsText.Format(LogEventFocusGroupChanged);
		}
		break;
	case EEventCaseOpened:
		{
		_LIT(LogEventCaseOpened,"EEventCaseOpened");
		iEventDetailsText.Format(LogEventCaseOpened);
		}
		break;
	case EEventCaseClosed:
		{
		_LIT(LogEventCaseClosed,"EEventCaseClosed");
		iEventDetailsText.Format(LogEventCaseClosed);
		}
		break;
	default:
		if (aWsEvent->Type()>=EEventUser)
			iEventDetailsText.Format(_L("EEventUser[%d]"), aWsEvent->Type()-EEventUser);
		else
			{
			UnKnown();
			iEventDetailsText.Format(_L("Unknown event type=%d "), aWsEvent->Type());
			}
		break;
		}
	return iEventDetailsText;
	}

TDesC &TWsDecoder::eventDetails(const TRawEvent *aEvent)
	{
	iEventDetailsText.Zero();
	switch (aEvent->Type())
		{
	case TRawEvent::ENone:
		{
		_LIT(LogEventDetailsNone,"ENone");
		iEventDetailsText.Append(LogEventDetailsNone);
		}
		break;
	case TRawEvent::EPointerMove:
		{
		_LIT(LogEventDetailsPointerMove,"EPointerMove(");
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(aEvent->Pos()));
		iEventDetailsText.Append(LogEventDetailsPointerMove);
		iEventDetailsText.Append(buf);
		iEventDetailsText.Append(LogCloseBracket);
		}
		break;
    case TRawEvent::EPointerSwitchOn:
		{
		_LIT(LogEventDetailsPointerSwitchOn,"EPointerSwitchOn(");
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(aEvent->Pos()));
		iEventDetailsText.Append(LogEventDetailsPointerSwitchOn);
		iEventDetailsText.Append(buf);
		iEventDetailsText.Append(LogCloseBracket);
		}
		break;
	case TRawEvent::EKeyDown:
		{
		_LIT(LogEventDetailsKeyDown,"EKeyDown(%d)");
		iEventDetailsText.Format(LogEventDetailsKeyDown,aEvent->ScanCode());
		}
		break;
	case TRawEvent::EKeyUp:
		{
		_LIT(LogEventDetailsKeyUp,"EKeyUp(%d)");
		iEventDetailsText.Format(LogEventDetailsKeyUp,aEvent->ScanCode());
		}
		break;
	case TRawEvent::ERedraw:
		{
		_LIT(LogEventDetailsRedraw,"ERedraw");
		iEventDetailsText.Append(LogEventDetailsRedraw);
		}
		break;
	case TRawEvent::ESwitchOn:
 		{
		_LIT(LogEventDetailsSwitchOn,"ESwitchOn");
		iEventDetailsText.Append(LogEventDetailsSwitchOn);
		}
		break;
	case TRawEvent::EActive:
		{
		_LIT(LogEventDetailsActive,"EActive");
		iEventDetailsText.Append(LogEventDetailsActive);
		}
		break;
	case TRawEvent::EInactive:
		{
		_LIT(LogEventDetailsInactive,"EInactive");
		iEventDetailsText.Append(LogEventDetailsInactive);
		}
		break;
	case TRawEvent::EUpdateModifiers:
		{
		_LIT(LogEventDetailsModifiers,"EUpdateModifiers(%d)");
		iEventDetailsText.Format(LogEventDetailsModifiers,aEvent->Modifiers());
		}
		break;
	case TRawEvent::EButton1Down:
		{
		_LIT(LogEventDetailsButton1Down,"EButton1Down(");
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(aEvent->Pos()));
		iEventDetailsText.Append(LogEventDetailsButton1Down);
		iEventDetailsText.Append(buf);
		iEventDetailsText.Append(LogCloseBracket);
		}
		break;
	case TRawEvent::EButton1Up:
		{
		_LIT(LogEventDetailsButton1Up,"EButton1Up(");
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(aEvent->Pos()));
		iEventDetailsText.Append(LogEventDetailsButton1Up);
		iEventDetailsText.Append(buf);
		iEventDetailsText.Append(LogCloseBracket);
		}
		break;
	case TRawEvent::EButton2Down:
		{
		_LIT(LogEventDetailsButton2Down,"EButton2Down(");
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(aEvent->Pos()));
		iEventDetailsText.Append(LogEventDetailsButton2Down);
		iEventDetailsText.Append(buf);
		iEventDetailsText.Append(LogCloseBracket);
		}
		break;
	case TRawEvent::EButton2Up:
		{
		_LIT(LogEventDetailsButton2Up,"EButton2Up(");
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(aEvent->Pos()));
		iEventDetailsText.Append(LogEventDetailsButton2Up);
		iEventDetailsText.Append(buf);
		iEventDetailsText.Append(LogCloseBracket);
		}
		break;
	case TRawEvent::EButton3Down:
		{
		_LIT(LogEventDetailsButton3Down,"EButton3Down(");
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(aEvent->Pos()));
		iEventDetailsText.Append(LogEventDetailsButton3Down);
		iEventDetailsText.Append(buf);
		iEventDetailsText.Append(LogCloseBracket);
		}
		break;
	case TRawEvent::EButton3Up:
		{
		_LIT(LogEventDetailsButton3Up,"EButton3Up(");
		TShortBuf buf(TDebugLogTextHandler::FormatPoint(aEvent->Pos()));
		iEventDetailsText.Append(LogEventDetailsButton3Up);
		iEventDetailsText.Append(buf);
		iEventDetailsText.Append(LogCloseBracket);
		}
		break;
	case TRawEvent::ESwitchOff:
		{
		_LIT(LogEventDetailsSwitchOff,"ESwitchOff");
		iEventDetailsText.Append(LogEventDetailsSwitchOff);
		}
		break;
	case TRawEvent::EKeyRepeat:
 		{
  		_LIT(LogEventDetailsKeyRepeat,"ERepeatKey(scancode=%d,repeat=%d");
 		iEventDetailsText.Format(LogEventDetailsKeyRepeat,aEvent->ScanCode(),aEvent->Repeats());
 		}
		break;
	case TRawEvent::EPointer3DOutOfRange:
 		{
  		_LIT(LogEventDetailsOutOfRange,"EPointer3DOutOfRange");
 		iEventDetailsText.Format(LogEventDetailsOutOfRange);
 		}
		break;
	default:
		{
		_LIT(LogEventDetailsUnknown,"Unknown event type: %d");
		iEventDetailsText.Format(LogEventDetailsUnknown,aEvent->Type());
		UnKnown();
		}
		break;
		}
	return iEventDetailsText;
	}

void TWsDecoder::ReplyBufWindowGroup(TBuf<LogTBufSize> &aText, TInt aOpcode, const TDesC8 *aReplyDes8, const TDesC *aReplyDesText)
	{
	ReplyBufWindow(aText, aOpcode, aReplyDes8, aReplyDesText);
	}

void TWsDecoder::ReplyBufWindow(TBuf<LogTBufSize> &aText, TInt aOpcode, const TDesC8 *aReplyDes8, const TDesC *aReplyDesText)
	{
	switch (aOpcode)
		{
	case EWsWinOpPosition:
		AppendPoint(aText,aReplyDes8);
		break;
	case EWsWinOpAbsPosition:
		AppendPoint(aText,aReplyDes8);
		break;
	case EWsWinOpSize:
		AppendPoint(aText,aReplyDes8);
		break;
	case EWsWinOpInquireOffset:
		AppendPoint(aText,aReplyDes8);
		break;
	case EWsWinOpName:
		AppendDesc(aText, aReplyDesText);
		break;
	case EWsWinOpRetrievePointerMoveBuffer:
		aText.Append(_L("..."));
		break;
	case EWsWinOpGetInvalidRegion:
		{
		TRect *rect=(TRect *)aReplyDes8->Ptr();
		TInt count=aReplyDes8->Size()/sizeof(TRect);
		TBuf<2> comma;
		_LIT(LogTwoStrings,"%S%S");
		for(TInt index=0;index<count && !iOverflowHandler.IsError();index++)
			{
			TLongBuf buf(TDebugLogTextHandler::FormatRect(*rect++));
			aText.AppendFormat(LogTwoStrings,&iOverflowHandler,&comma,&buf);
			if (index==0)
				comma=LogComma;
			}
		break;
		}
	default:
		UnKnownReplyBuf(aText, aOpcode);
		break;
		}
	}

void TWsDecoder::ReplyBufClient(TBuf<LogTBufSize> &aText, TInt aOpcode, const TDesC8 *aReplyDes8, const TDesC *aReplyDesText)
	{
	switch (aOpcode)
		{
	case EWsClOpGetEvent:
		{
		const TWsEvent *wsEvent=(TWsEvent *)aReplyDes8->Ptr();
		TPtrC details(eventDetails(wsEvent));
		aText=KNullDesC;
		if (details!=KNullDesC)
			{
			TDebugLogTextHandler::Append(aText, details);
			TBuf<128> buf;
			_LIT(LogReplyClientDestTime,"(dest %d, time ");
			_LIT(LogReplyClientTime,"%D%M%Y%/0%1%/1%2%/2%3%/3 %:0%H%:1%T%:2%S%.%*C2%:3)");
			buf.Format(LogReplyClientDestTime, wsEvent->Handle());
			TDebugLogTextHandler::Append(aText, buf);
			TRAPD(err,wsEvent->Time().FormatL(buf,LogReplyClientTime));
			if (err==KErrNone)
				TDebugLogTextHandler::Append(aText, buf);
			else
				{
				_LIT(LogReplyClientTimeErr,"######)");
				TDebugLogTextHandler::Append(aText,LogReplyClientTimeErr);
				}
			}
		}
		break;
	case EWsClOpGetRedraw:
		{
		const TWsRedrawEvent *redrawEvent=(TWsRedrawEvent *)aReplyDes8->Ptr();
		TLongBuf buf(TDebugLogTextHandler::FormatRect(redrawEvent->Rect()));
		aText.Format(_L("Redraw (handle %d): "), redrawEvent->Handle());
		aText.AppendFormat(_L("rect %S"), &buf);
		}
		break;
	case EWsClOpGetPriorityKey:
		{
		const TWsPriorityKeyEvent *abortEvent=(TWsPriorityKeyEvent *)aReplyDes8->Ptr();
		aText.Format(_L("Abort key handle %d"), abortEvent->Handle());
		}
		break;
	case EWsClOpShadowVector:
		AppendPoint(aText,aReplyDes8);
		break;
	case EWsClOpGetWindowGroupClientThreadId:
		{
		const TThreadId *threadId=(TThreadId *)aReplyDes8->Ptr();
		aText.Format(_L("TThreadId=%d"), *(TInt *)threadId);
		}
		break;
	case EWsClOpGetWindowGroupNameFromIdentifier:
		AppendDesc(aText, aReplyDesText);
		break;
	case EWsClOpWindowGroupList:
	case EWsClOpWindowGroupListAndChain: 
	case EWsClOpWindowGroupListAllPriorities:
		{
		TInt *handlPtr=(TInt *)aReplyDes8->Ptr();
		TInt count=aReplyDes8->Size()/sizeof(TInt);
		TBuf<2> comma;
		_LIT(LogStringInt,"%S%d");
		for(TInt index=0;index<count && !iOverflowHandler.IsError();index++)
			{
			aText.AppendFormat(LogStringInt,&iOverflowHandler,&comma,*handlPtr++);
			if (index==0)
				comma=LogComma;
			}
		}
		break;
	case EWsClOpGetKeyboardRepeatRate:
		{
		SKeyRepeatSettings *settings=(SKeyRepeatSettings *)aReplyDes8->Ptr();
		aText.AppendFormat(_L("initial=%d,normal=%d"),settings->iInitialTime.Int(),settings->iTime.Int());
		}
		break;
	case EWsClOpGetDoubleClickSettings:
		{
		SDoubleClickSettings *settings=(SDoubleClickSettings *)aReplyDes8->Ptr();
		aText.AppendFormat(_L("interval=%d,distance=%d"),settings->iInterval.Int(),settings->iDistance);
		}
		break;
	case EWsClOpFetchMessage:
		{
		_LIT(LogClientRetFetchMessage,"FetchMessage");
		aText.Append(LogClientRetFetchMessage);
		}
		break;
	case EWsClOpCreateGraphic:
		aText.AppendFormat(_L("Creating graphic: %s"), aReplyDes8);
		break;
	case EWsClOpGetGraphicMessage: 
		aText.AppendFormat(_L("Graphic message: %s"), aReplyDes8);
		break;
	case EWsClOpPointerCursorPosition:
		{
		TWsClCmdSetPointerCursorArea *settings=(TWsClCmdSetPointerCursorArea*)aReplyDes8->Ptr();
		TLongBuf buf1(TDebugLogTextHandler::FormatRect(settings->area));
		aText.AppendFormat(_L("Cursor position area=%S"), &buf1);
		}
		break;
	case EWsClOpPointerCursorArea:
		{
		TWsClCmdSetPointerCursorArea *settings=(TWsClCmdSetPointerCursorArea*)aReplyDes8->Ptr();
		TLongBuf buf1(TDebugLogTextHandler::FormatRect(settings->area));
		aText.AppendFormat(_L("Cursor area=%S"), &buf1);
		}
		break;
	case EWsClOpGetDefModeMaxNumColors:
		{
		SDefModeMaxNumColors *settings=(SDefModeMaxNumColors*)aReplyDes8->Ptr();
		aText.AppendFormat(_L("Num of colors=%d, num of grays=%d, display mode=%d"),settings->iColors, settings->iGrays, settings->iDisplayMode);
		}
		break;
	default:
		UnKnownReplyBuf(aText, aOpcode);
		break;
		}
	}

void TWsDecoder::ReplyBufScreenDevice(TBuf<LogTBufSize> &aText, TInt aOpcode, const TDesC8 *aReplyDes8, const TDesC *)
	{
	switch (aOpcode)
		{
	case EWsSdOpGetScanLine:
		{			//This fills up the log two much for test code
		aText=KNullDesC;
		//Alternate code that would log this information.
		/*_LIT(LogScreenDeviceReplyBufGetScanLine,"aScanLine set to ...");
		aText=LogScreenDeviceReplyBufGetScanLine;*/
		/*TDebugLogTextHandler::Append(aText, TDebugLogTextHandler::FormatArray(TDebugLogTextHandler::ERgb,
														((TDesC8 *)aReplyData)->Ptr(),((TDesC8 *)aReplyData)->Length()*sizeof(TRgb)));*/
		}
		break;
	case EWsSdOpHorizontalTwipsToPixels:
	case EWsSdOpVerticalTwipsToPixels:
	case EWsSdOpHorizontalPixelsToTwips:
	case EWsSdOpVerticalPixelsToTwips:
	case EWsSdOpPixelSize:
	case EWsSdOpTwipsSize:
		AppendPoint(aText,aReplyDes8);
		break;
	case EWsSdOpPointerRect:
		AppendRect(aText,aReplyDes8);
		break;
	case EWsSdOpGetDefaultScreenSizeAndRotation:
	case EWsSdOpGetScreenModeSizeAndRotation:
		{
		_LIT(LogScreenDeviceReplyBufPTR,"%S %S %d");
		const TPixelsTwipsAndRotation *sar=(TPixelsTwipsAndRotation *)aReplyDes8->Ptr();
		TShortBuf buf1(TDebugLogTextHandler::FormatSize(sar->iPixelSize));
		TShortBuf buf2(TDebugLogTextHandler::FormatSize(sar->iTwipsSize));
		aText.AppendFormat(LogScreenDeviceReplyBufPTR,&buf1,&buf2,sar->iRotation);
		}
		break;
	case EWsSdOpGetDefaultScreenSizeAndRotation2:
	case EWsSdOpGetScreenModeSizeAndRotation2:
		{
		_LIT(LogScreenDeviceReplyBufPR,"%S %d");
		const TPixelsAndRotation *sar=(TPixelsAndRotation *)aReplyDes8->Ptr();
		TShortBuf buf(TDebugLogTextHandler::FormatSize(sar->iPixelSize));
		aText.AppendFormat(LogScreenDeviceReplyBufPR,&buf,sar->iRotation);
		}
		break;
	case EWsSdOpGetPalette:
		{
		_LIT(LogScreenDeviceReplyBufGetPalette,"Palette returned ...");
		aText.Append(LogScreenDeviceReplyBufGetPalette);
		}
		break;
	case EWsSdOpGetDefaultScreenModeOrigin:	
		{
		const TPoint *point = reinterpret_cast<const TPoint*>(aReplyDes8->Ptr());
		TShortBuf buf1(TDebugLogTextHandler::FormatPoint(*point));
		_LIT(LogScreenDeviceReplyBufGetDefaultScreenModeOrigin,"Default screen mode origin=%S");
		aText.AppendFormat(LogScreenDeviceReplyBufGetDefaultScreenModeOrigin, &buf1);
		}
		break;
	case EWsSdOpGetScreenModeOrigin:	
		{
		const TPoint *point = reinterpret_cast<const TPoint*>(aReplyDes8->Ptr());
		TShortBuf buf1(TDebugLogTextHandler::FormatPoint(*point));
		_LIT(LogScreenDeviceReplyBufGetScreenModeOrigin,"Screen mode origin=%S");
		aText.AppendFormat(LogScreenDeviceReplyBufGetScreenModeOrigin, &buf1);
		}
		break;
	case EWsSdOpGetScreenModeScale: 	
	case EWsSdOpGetCurrentScreenModeScale:	
		{
		const TSize *size = reinterpret_cast<const TSize*>(aReplyDes8->Ptr());
		TShortBuf buf1(TDebugLogTextHandler::FormatSize(*size));
		_LIT(LogScreenDeviceReplyBufGetScreenScale,"Screen scale=%S");
		aText.AppendFormat(LogScreenDeviceReplyBufGetScreenScale, &buf1);
		}
		break;
	case EWsSdOpGetScreenModeScaledOrigin: 
		{
		const TPoint *point = reinterpret_cast<const TPoint*>(aReplyDes8->Ptr());
		TShortBuf buf1(TDebugLogTextHandler::FormatPoint(*point));
		_LIT(LogScreenDeviceReplyBufGetScreenModeScaledOrigin,"Screen mode scaled origin=%S");
		aText.AppendFormat(LogScreenDeviceReplyBufGetScreenModeScaledOrigin, &buf1);
		}
		break;
	case EWsSdOpGetCurrentScreenModeAttributes:	
		{
		TSizeMode *settings=(TSizeMode*)aReplyDes8->Ptr();
		TShortBuf origin(TDebugLogTextHandler ::FormatPoint(settings->iOrigin));
		TShortBuf size(TDebugLogTextHandler ::FormatSize(settings->iScreenSize));
		TShortBuf area(TDebugLogTextHandler ::FormatRect(settings->iPointerCursorArea));
		aText.AppendFormat(_L("Screen attribute: origin=%S, size=%s, rotation=%d, area=$s, display mode = %d"), 
							   &origin, &size, settings->iAlternativeRotations, &area, settings->iDefaultDisplayMode);
		}
		break;
	case EWsSdOpGetScreenSizeModeList:	
		AppendDesc(aText, aReplyDes8);
		break;	
	default:
		UnKnownReplyBuf(aText, aOpcode);
		break;
		}
	}
