diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/AlfCommandDebug/src/alfcommanddebug.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiacceltk/hitchcock/AlfCommandDebug/src/alfcommanddebug.cpp Tue Feb 02 07:56:43 2010 +0200 @@ -0,0 +1,509 @@ +/* + * Copyright (c) 2008 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: Help class for debugging/optimizing the command stream. + * This is file is not compiled by default. Enable flag + * _ALF_PRINT_WS_COMMANDS_ in alfrenderstageplugin.mmp in order + * to use it. + * + * SEE USAGE INSTRUCTIONS IN ALRCOMMANDDEBUG.H + */ +#include +#include +#include +#include +#include // RDesWriteStream +#include +#include +#include "alfcommanddebug.h" +#include +#include +#include +#include + +_LIT( KRendererCommandDescriptions,"alfcommanddescriptions.rsc" ); + +// --------------------------------------------------------------------------- +// ReadCommandDescriptionsL +// --------------------------------------------------------------------------- +// +EXPORT_C CAlfCommandDebug* CAlfCommandDebug::NewL() + { + CAlfCommandDebug* self = new (ELeave) CAlfCommandDebug; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------------------------- +// ConstructL +// --------------------------------------------------------------------------- +// +void CAlfCommandDebug::ConstructL() + { + iCommandDescriptions = new (ELeave) RHashMap ; + iBridgeCommandDescriptions = new (ELeave) RHashMap ; + ReadCommandDescriptionsL( iCommandDescriptions, R_ALF_COMMAND_DESCRIPTION_ARRAY ); + ReadCommandDescriptionsL( iBridgeCommandDescriptions, R_ALF_BRIDGE_COMMAND_DESCRIPTION_ARRAY ); + + // TODO: define only exe name, TrackProcess can do the parsing +#ifdef __WINSCW__ + _LIT( KTrackThisProcess, "Z:\\sys\\bin\\matrixmenu.exe"); +#else + _LIT( KTrackThisProcess, "C:\\sys\\bin\\matrixmenu.exe"); +#endif + iTrackedProcess.Copy( KTrackThisProcess ); + + // iMode = EPrintOnlyCommands; + iMode = EPrintCommandParameters; + // iMode = EPrintSummary; + //iMode = EPrintStatisticsForLargeBuffers; + + switch( iMode ) + { + default: // 0 + { + iPrint = EFalse; + break; + } + case EPrintCommandParameters: + { + iPrintColors = ETrue; + iPrintRegions = ETrue; + iPrintRects = ETrue; + iPrintPoints = ETrue; + iPrintHandles = ETrue; + iPrintTexts = ETrue; + iPrint = ETrue; + break; + } + case EPrintOnlyCommands: + { + iPrint = ETrue; + break; + } + case EPrintStatistics: + { + iPrintStatistics = ETrue; + iLargeBufferDefinition = 0; + break; + } + case EPrintStatisticsForLargeBuffers: + { + iPrintStatistics = ETrue; + iLargeBufferDefinition = 1500; + break; + } + case EPrintSummary: + { + iPrintSummary = ETrue; + iLargeBufferDefinition = 0; + break; + } + + } + } + +// --------------------------------------------------------------------------- +// ReadCommandDescriptionsL +// --------------------------------------------------------------------------- +// +void CAlfCommandDebug::ReadCommandDescriptionsL( RHashMap* aDescriptionArray, TInt aId ) + { + // Read unsupported command resource + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + RResourceFile resFile; + TInt result; + + TFileName resourceFileName; + TPtrC driveLetter = TParsePtrC(RProcess().FileName()).Drive(); + resourceFileName.Copy(driveLetter); + resourceFileName.Append(KDC_ECOM_RESOURCE_DIR); + resourceFileName.Append(KRendererCommandDescriptions); + + TRAP( result, resFile.OpenL(fs,resourceFileName); ); + if (result == KErrNone) + { + CleanupClosePushL(resFile); + resFile.ConfirmSignatureL(0); // offset value. + TInt resId = aId; + + HBufC8* readData = resFile.AllocReadL(resId); + // now first get rid of RResourceFile and RFs as they are not needed any more + CleanupStack::PopAndDestroy(); // resFile + CleanupStack::PopAndDestroy(); // fs + CleanupStack::PushL(readData); + + // now parse it and store the values in cmdTextArray + TResourceReader reader; + reader.SetBuffer(readData); + const TInt count = reader.ReadInt16(); + TInt8 commandId; + for (TInt i = 0; i < count; i++) + { + commandId = reader.ReadInt8(); + TCommand command; + command.iDescription = reader.ReadHBufC16L(); + + aDescriptionArray->Insert(commandId, command); + } + CleanupStack::PopAndDestroy(readData); + } + else + { + __ALFLOGSTRING1("CAlfRsSendBuffer::ConstructL - WARNING! Failed to read unsupported commands from resource file: %S! Error code:st %d.", &resourceFileName ); + CleanupStack::PopAndDestroy(); // fs + } + } + +// --------------------------------------------------------------------------- +// SetHandle +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfCommandDebug::SetHandle( const TInt& aHandle ) + { + if (!iPrintHandles ) + { + return; + } + iText.AppendFormat( _L("Handle: [%d] "), aHandle ); + } + +// --------------------------------------------------------------------------- +// SetPoint +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfCommandDebug::SetPoint( const TPoint& aPoint ) + { + if (!iPrintPoints ) + { + return; + } + iText.AppendFormat( _L("Point: (%d,%d) "), aPoint.iX, aPoint.iY ); + } + +// --------------------------------------------------------------------------- +// SetRect +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfCommandDebug::SetRect( const TRect& aRect ) + { + if (!iPrintRects ) + { + return; + } + iText.AppendFormat( _L("Rect: (%d,%d)-(%d,%d) "), aRect.iTl.iX, aRect.iTl.iY, aRect.iBr.iX, aRect.iBr.iY ); + } + +// --------------------------------------------------------------------------- +// SetRegion +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfCommandDebug::SetRegion( const TRegion& aRegion) + { + _LIT( KDescRegion, "Region of %d"); + if (!iPrintRegions ) + { + return; + } + /*if ( iText.MaxLength() < iText.Length() + KDescRegion->Length() ) + { + return; + }*/ + iText.AppendFormat( KDescRegion, aRegion.Count() ); + for( TInt i = 0; i < aRegion.Count() ; i++ ) + { + TRect rect = aRegion[i]; + iText.AppendFormat( _L("[%d]: Rect: (%d,%d)-(%d,%d) "), i, rect.iTl.iX, rect.iTl.iY, rect.iBr.iX, rect.iBr.iY ); + } + } + +// --------------------------------------------------------------------------- +// SetRegion +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfCommandDebug::SetText( TPtr& aText ) + { + if (!iPrintTexts ) + { + return; + } + iText.AppendFormat( _L("Text: [%S] "), &aText ); + } + +// --------------------------------------------------------------------------- +// SetColor +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfCommandDebug::SetColor( TRgb& aColor ) + { + if (!iPrintColors ) + { + return; + } + iText.AppendFormat( _L("Color: R[%d]G[%d]B[%d] A[%d] "), aColor.Red(), aColor.Green(), aColor.Blue(), aColor.Alpha() ); + } + +// --------------------------------------------------------------------------- +// Print +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfCommandDebug::Print() + { + if ( iPrint ) + { + RDebug::Print(_L("%S"), &iText ); + } + } + +// --------------------------------------------------------------------------- +// AdjustCommand +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfCommandDebug::SetDescription(const TUint8& aCommand, TInt aDescriptionList ) + { + TInt32 commandId = aCommand; + TCommand* command = NULL; + + if ( aDescriptionList == R_ALF_COMMAND_DESCRIPTION_ARRAY ) + { + command = iCommandDescriptions->Find(commandId); + } + else + { + // assuming, aDescriptionList is R_ALF_BRIDGE_COMMAND_DESCRIPTION_ARRAY + command = iBridgeCommandDescriptions->Find(commandId); + } + iTotalCmdCount++; + + if (command ) + { + HBufC16* buf = command->iDescription; + iText.Format( _L("Cmd: %S - "), buf ); + } + else + { + iText.Format( _L("Cmd: %d - "), aCommand ); + } + } +// --------------------------------------------------------------------------- +// PrintDescription +// +// Note, you can enable/disable command at run-time in debugger by modifying +// printCommands variable. +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfCommandDebug::SetDescriptionAndSize(const TUint8& aCommand, + const TInt& aParametersSize, TInt aDescriptionList ) + { + TInt32 commandId = aCommand; + TCommand* command = NULL; + + if ( aDescriptionList == R_ALF_COMMAND_DESCRIPTION_ARRAY ) + { + command = iCommandDescriptions->Find(commandId); + } + else + { + // assuming, aDescriptionList is R_ALF_BRIDGE_COMMAND_DESCRIPTION_ARRAY + command = iBridgeCommandDescriptions->Find(commandId); + } + + if ( command ) + { + command->iCount++; + command->iSize = sizeof(TUint8) + aParametersSize; + iTotalCmdSize += command->iSize; + } + iTotalCmdCount++; + + if ( !iPrint ) + { + // empty the string. Otherwise parameters start piling up to iText + iText.Format(_L("")); + return; + } + + if (command) + { + HBufC16* buf = command->iDescription; + iText.Format( _L("Cmd: %S (%d/Size: %d) "), buf, aCommand, command->iSize ); + } + else + { + iText.Format( _L("Cmd: %d"), aCommand ); + } + + } + +// --------------------------------------------------------------------------- +// AdjustCommand +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfCommandDebug::AdjustCommand(const TUint8& aCommand, + TInt aAdjustment) + { + TCommand* command = NULL; + + command = iCommandDescriptions->Find(aCommand); + + if (command) + { + command->iCount--; + + iTotalCmdCount--; + iTotalCmdSize += aAdjustment; + } + } + +// --------------------------------------------------------------------------- +// StartFrame +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfCommandDebug::StartFrame() + { + // clear statistics + for (TInt i = 0; i < EAlfLastCommand; i++) + { + TCommand* command = iCommandDescriptions->Find(i); + if (command) + { + command->iCount = 0; + } + } + iTotalCmdCount = 0; + iTotalCmdSize = 0; + + } + +// --------------------------------------------------------------------------- +// EndFrame +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfCommandDebug::EndFrame() + { + if (iPrintSummary) + { + RDebug::Print(_L("CAlfCommandDebug::EndFrame, Commands: %d, Size %d"), + iTotalCmdCount, + iTotalCmdSize ); + + } + } + +// --------------------------------------------------------------------------- +// PrintStatistic +// +// Note, you can enable iPrintStatistics at run-time in debugger +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfCommandDebug::PrintStatistic() + { + if (iPrintStatistics && iTotalCmdSize > iLargeBufferDefinition ) + { + for (TInt i = 0; i < EAlfLastCommand; i++) + { + TCommand* command = iCommandDescriptions->Find(i); + if (command) + { + TInt totalSize = command->iCount * command->iSize; + RDebug::Print( + _L("Cmd: %S - Count: %d - Size: %d (%d)"), command->iDescription, + command->iCount, totalSize, command->iSize); + } + } + iFrameTotalSize += iTotalCmdSize; + iFrameCount++; + TInt averageFrame = iFrameTotalSize / iFrameCount; + RDebug::Print(_L("Total, Count: %d, Size %d (average: %d)"), iTotalCmdCount, + iTotalCmdSize, averageFrame); + } + } + +// --------------------------------------------------------------------------- +// SetPrint +// --------------------------------------------------------------------------- +// +EXPORT_C void CAlfCommandDebug::SetPrint( TBool aPrint ) + { + iPrint = aPrint; + } + +// --------------------------------------------------------------------------- +// destructor +// +// Note, you can enable iPrintStatistics at run-time in debugger +// --------------------------------------------------------------------------- +// +EXPORT_C CAlfCommandDebug::~CAlfCommandDebug() + { + delete iCommandDescriptions; + } + +// --------------------------------------------------------------------------- +// DebugPrintControlGroupOrder +// Can be used only from CAlfBridge +// --------------------------------------------------------------------------- +// +EXPORT_C TFileName CAlfCommandDebug::WServClientFileName( TInt aClientWindowGroupId, RWsSession& aSession ) + { + + TFileName processName; + if( aClientWindowGroupId != KErrNotFound || aClientWindowGroupId != 0 ) + { + TThreadId threadId; + TInt error = aSession.GetWindowGroupClientThreadId( aClientWindowGroupId, threadId ); + if( error ) + { + } + else + { + RThread thread; + TInt err = thread.Open( threadId ); + if( !err ) + { + RProcess process; + err = thread.Process( process ); + if( !err ) + { + processName = process.FileName(); + } + process.Close(); + } + thread.Close(); + } + } + return processName; + } + +// --------------------------------------------------------------------------- +// TrackProcess +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CAlfCommandDebug::TrackProcess( HBufC16* aFileName ) + { + // this is separate function to allow in the future tracking of multiple processes + return aFileName->Compare( iTrackedProcess ) == 0; + } + +// --------------------------------------------------------------------------- +// Text +// --------------------------------------------------------------------------- +// +EXPORT_C TDesC16& CAlfCommandDebug::Text() + { + return iText; + }