--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stif/Logger/src/RDebugOutput.cpp Tue Feb 02 01:57:15 2010 +0200
@@ -0,0 +1,684 @@
+/*
+* Copyright (c) 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: This module contains implementation of CRDebugOutput
+* class member functions.
+*
+*/
+
+// INCLUDE FILES
+#include <e32std.h>
+#include "Output.h"
+#include "RDebugOutput.h"
+#include "LoggerOverFlow.h"
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// ==================== LOCAL FUNCTIONS =======================================
+// None
+
+
+// ================= MEMBER FUNCTIONS =========================================
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CRDebugOutput
+
+ Method: CRDebugOutput
+
+ Description: Default constructor
+
+ C++ default constructor can NOT contain any code, that
+ might leave.
+
+ Parameters: TLoggerType aLoggerType: in: File type
+ TBool aWithTimeStamp: in: For timestamp
+ TBool aWithLineBreak: in: For line break
+ TBool aWithEventRanking: in: For events ranking to file
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+ Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+CRDebugOutput::CRDebugOutput( CStifLogger::TLoggerType aLoggerType,
+ TBool aWithTimeStamp,
+ TBool aWithLineBreak,
+ TBool aWithEventRanking ) :
+ COutput()
+ {
+ // Indicates file type
+ iLoggerType = aLoggerType;
+
+ // Time stamp indicator
+ iWithTimeStamp = aWithTimeStamp;
+
+ // Line break indicator
+ iWithLineBreak = aWithLineBreak;
+
+ // Log event ranking indicator
+ iWithEventRanking = aWithEventRanking;
+
+ // Data buffer
+ iDataHBuf = NULL;
+ iDataHBuf1 = NULL;
+ iDataHBuf2 = NULL;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CRDebugOutput
+
+ Method: ConstructL
+
+ Description: Symbian OS second phase constructor
+
+ Symbian OS default constructor can leave.
+
+ Parameters: None
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+ Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+void CRDebugOutput::ConstructL( TInt aStaticBufferSize )
+ {
+ if( aStaticBufferSize != 0)
+ {
+ iDataHBuf1 = HBufC::NewL( aStaticBufferSize );
+ iDataHBuf2 = HBufC::NewL( aStaticBufferSize );
+ iStaticBufferSize = aStaticBufferSize;
+ }
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CRDebugOutput
+
+ Method: NewL
+
+ Description: Two-phased constructor.
+
+ Parameters: const TDesC& aTestPath: in: Log path
+ const TDesC& aTestFile: in: Log filename
+ TLoggerType aLoggerType: in: File type
+ TBool aOverWrite: in: For file overwrite
+ TBool aWithTimeStamp: in: For timestamp
+ TBool aWithLineBreak: in: For line break
+ TBool aWithEventRanking: in: For events ranking to file
+ TBool aThreadIdToLogFile: in: Indicator to thread id adding to
+ end of the log file
+ TBool aCreateLogDir: in: Indicator to directory creation
+
+ Return Values: CRDebugOutput*: pointer to CFileOutput object
+
+ Errors/Exceptions: Leaves if ConstructL leaves
+
+ Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+CRDebugOutput* CRDebugOutput::NewL( const TDesC& /* aTestPath */,
+ const TDesC& /* aTestFile */,
+ CStifLogger::TLoggerType aLoggerType,
+ TBool /* aOverWrite */,
+ TBool aWithTimeStamp,
+ TBool aWithLineBreak,
+ TBool aWithEventRanking,
+ TBool /* aThreadIdToLogFile */,
+ TBool /* aCreateLogDir */,
+ TInt aStaticBufferSize)
+ {
+ // Create CFileOutput object fileWriter
+ CRDebugOutput* rdebugWriter = new (ELeave) CRDebugOutput(
+ aLoggerType,
+ aWithTimeStamp,
+ aWithLineBreak,
+ aWithEventRanking );
+
+ CleanupStack::PushL( rdebugWriter );
+ rdebugWriter->ConstructL( aStaticBufferSize );
+ CleanupStack::Pop( rdebugWriter );
+
+ return rdebugWriter;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CRDebugOutput
+
+ Method: ~CRDebugOutput
+
+ Description: Destructor
+
+ Parameters: None
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+ Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+CRDebugOutput::~CRDebugOutput()
+ {
+ delete iDataHBuf1;
+ delete iDataHBuf2;
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CRDebugOutput
+
+ Method: Write
+
+ Description: Write log information or data to the file. 16 bit.
+
+ Parameters: TBool aWithTimeStamp: in: Is time stamp flag used
+ TBool aWithLineBreak: in: Is line break flag used
+ TBool aWithEventRanking: in: Is event ranking flag used
+ const TDesC& aData: in: Logged or saved data
+
+ Return Values: TInt: Symbian error code.
+
+ Errors/Exceptions: None
+
+ Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+TInt CRDebugOutput::Write( TBool aWithTimeStamp,
+ TBool aWithLineBreak,
+ TBool aWithEventRanking,
+ const TDesC& aData )
+ {
+ TInt currentEndPos( 0 ); // Current position in aData parsing
+ // to partitions
+
+ // a logInfo size must be at least the minimumSpace size
+ TInt minimumSpace = ( KMaxTimeStamp + KMaxHtmlLineBreak + KMaxLineBreak +
+ KMaxEventRanking + KMaxSpace );
+
+ TPtr logInfo(0, 0);
+ HBufC* dataHBuf = NULL;
+
+ if(iDataHBuf1 != NULL)
+ {
+ TInt messageLength = aData.Length() + minimumSpace;
+ if( messageLength > iStaticBufferSize )
+ {
+ RDebug::Print(_L("Warning: buffer size too small, not able to log!"));
+ return KErrOverflow;
+ }
+ // Using the HBufC created in ConstructL
+ logInfo.Set( iDataHBuf1->Des() ); // Memory allocation for data
+
+ }
+ else
+ {
+ // Buffer size is minimum space plus aData(aData length may be 0 but
+ // time stamp is used)
+ if( ( aData.Length() + minimumSpace ) < ( KMaxLogData + minimumSpace ) )
+ {
+ dataHBuf = HBufC::New( aData.Length() + minimumSpace );
+ }
+ // Buffer size is over KMaxLogData
+ else
+ {
+ dataHBuf = HBufC::New( aData.Length() );
+ }
+ if( dataHBuf == NULL )
+ {
+ return KErrNoMemory;
+ }
+ logInfo.Set( dataHBuf->Des() ); // Memory allocation for data
+ }
+
+ logInfo.Copy( aData ); // Copy data
+
+ TPtr data( 0, 0 );
+
+ // Add time stamp and/or event ranking if required
+ EventAndTimeCombiner( logInfo, data, aWithTimeStamp,
+ aWithLineBreak, aWithEventRanking );
+
+ while( data.Length() > currentEndPos )
+ {
+ // In this loop round data length is/under 254
+ if( ( data.Length() - currentEndPos ) <= KMaxRDebug )
+ {
+ // Current positions to rest of data position
+ logInfo = data.Mid( currentEndPos, ( data.Length() - currentEndPos ) );
+ // Prevent rdebug from parsing text string as formating string
+ RDebug::Print( _L( "%S" ), &logInfo );
+ }
+ // In this loop round data length is over 254
+ else
+ {
+ // Current positions to KMaxRDebug that includes space for ' ->'
+ logInfo = data.Mid( currentEndPos, KMaxRDebug );
+ // Prevent rdebug from parsing text string as formating string
+ RDebug::Print( _L( "%S ->" ), &logInfo );
+ }
+ currentEndPos = currentEndPos + KMaxRDebug;
+ }
+
+ delete dataHBuf;
+
+ if(iDataHBuf2 == NULL)
+ {
+ delete iDataHBuf;
+ iDataHBuf = NULL;
+ }
+
+ return KErrNone;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CRDebugOutput
+
+ Method: Write
+
+ Description: Write log information or data to the file. 8 bit.
+
+ Parameters: TBool aWithTimeStamp: in: Is time stamp flag used
+ TBool aWithLineBreak: in: Is line break flag used
+ TBool aWithEventRanking: in: Is event ranking flag used
+ const TDesC8& aData: in: Logged or saved data
+
+ Return Values: TInt
+
+ Errors/Exceptions: None
+
+ Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+TInt CRDebugOutput::Write( TBool aWithTimeStamp,
+ TBool aWithLineBreak,
+ TBool aWithEventRanking,
+ const TDesC8& aData )
+ {
+ TInt currentEndPos( 0 ); // Current position in aData parsing
+ // to partitions
+ TPtr logInfo(0, 0);
+
+ // a logInfo size must be at least the minimumSpace size
+ TInt minimumSpace = ( KMaxTimeStamp + KMaxHtmlLineBreak + KMaxLineBreak +
+ KMaxEventRanking + KMaxSpace );
+ HBufC* dataHBuf = NULL;
+ if(iDataHBuf1 != NULL)
+ {
+ if( ( aData.Length() + minimumSpace ) > iStaticBufferSize )
+ {
+ RDebug::Print(_L("Warning: buffer size too small, not able to log!"));
+ return KErrOverflow;
+ }
+ logInfo.Set( iDataHBuf1->Des() ); // Memory allocation for data
+ }
+ else
+ {
+ // 8 bit data to 16 bit because RDebug::Print don't support 8 bit printing
+
+ // Buffer size is minimum space plus aData(aData length may be 0 but
+ // time stamp is used)
+ if( ( aData.Length() + minimumSpace ) < ( KMaxLogData + minimumSpace ) )
+ {
+ dataHBuf = HBufC::New( aData.Length() + minimumSpace );
+ }
+ // Buffer size is over KMaxLogData
+ else
+ {
+ dataHBuf = HBufC::New( aData.Length() );
+ }
+ if( dataHBuf == NULL )
+ {
+ return KErrNoMemory;
+ }
+ logInfo.Set( dataHBuf->Des() ); // Memory allocation for data
+ }
+
+ logInfo.Copy( aData ); // Copy data
+
+ TPtr data( 0, 0 );
+
+ // Add time stamp and/or event ranking if required
+ EventAndTimeCombiner( logInfo, data, aWithTimeStamp,
+ aWithLineBreak, aWithEventRanking );
+ while( data.Length() > currentEndPos )
+ {
+ // In this loop round data length is/under 254
+ if( ( data.Length() - currentEndPos ) <= KMaxRDebug )
+ {
+ // Current positions to rest of data position
+ logInfo = data.Mid( currentEndPos, ( data.Length() - currentEndPos ) );
+ // Prevent rdebug from parsing text string as formating string
+ RDebug::Print( _L( "%S" ), &logInfo );
+ }
+ // In this loop round data length is over 254
+ else
+ {
+ // Current positions to KMaxRDebug that includes space for ' ->'
+ logInfo = data.Mid( currentEndPos, KMaxRDebug );
+ // Prevent rdebug from parsing text string as formating string
+ RDebug::Print( _L( "%S ->" ), &logInfo );
+ }
+ currentEndPos = currentEndPos + KMaxRDebug;
+ }
+
+ delete dataHBuf;
+
+ if(iDataHBuf2 == NULL)
+ {
+ delete iDataHBuf;
+ iDataHBuf = NULL;
+ }
+
+ return KErrNone;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CRDebugOutput
+
+ Method: EventAndTimeCombiner
+
+ Description: Event ranking and time stamp combimer.
+
+ Parameters: TLogInfo aLogInfo: inout: Overflowed data
+ TPtr8& aData: inout: Combined data
+ TBool aWithTimeStamp: in: Is time stamp flag used
+ TBool aWithLineBreak: in: Is line break flag used
+ TBool aWithEventRanking: in: Is event ranking flag used
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+ Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+void CRDebugOutput::EventAndTimeCombiner( TPtr& aLogInfo,
+ TPtr& aData,
+ TBool aWithTimeStamp,
+ TBool aWithLineBreak,
+ TBool aWithEventRanking )
+ {
+ TInt extraLength( 0 );
+
+ // Extra space calculation
+ if( iWithEventRanking && aWithEventRanking )
+ {
+ extraLength = extraLength + KMaxEventRanking + KMaxSpace;
+ }
+ if( ( iLoggerType == CStifLogger::EHtml ) && iWithLineBreak && aWithLineBreak )
+ {
+ extraLength = extraLength + KMaxHtmlLineBreak;
+ }
+ if( iWithLineBreak && aWithLineBreak )
+ {
+ extraLength = extraLength + KMaxLineBreak;
+ }
+ if( aWithTimeStamp && iWithTimeStamp )
+ {
+ extraLength = extraLength + KMaxTimeStamp;
+ }
+
+ // Calculated space
+ TInt space = aLogInfo.Length();
+
+ if(iDataHBuf2 != NULL)
+ {
+ aData.Set( iDataHBuf2->Des() ); // Memory allocation for data
+ aData.Copy( _L("") ); // Initialize aData buffer
+ }
+ else
+ {
+ iDataHBuf = HBufC::New( space + extraLength );
+ if( iDataHBuf == NULL )
+ {
+ return;
+ }
+ aData.Set( iDataHBuf->Des() ); // Memory allocation for data
+ }
+
+ // Event ranking
+ if( iWithEventRanking && aWithEventRanking && !iWithTimeStamp )
+ {
+ EventRanking( aData ); // Event ranking to data
+ aData.Append( aLogInfo ); // Unicode aData to normal text
+ }
+ // Time stamp
+ else if( iWithTimeStamp && aWithTimeStamp )
+ {
+ // With event ranking
+ if( iWithEventRanking && aWithEventRanking )
+ {
+ EventRanking( aData ); // Event ranking to data
+ }
+ AddTimeStampToData( aData ); // Add time stamp
+ aData.Append( aLogInfo ); // Unicode aData to normal text
+ }
+ else
+ {
+ aData.Copy( aLogInfo ); // Unicode aData to normal text
+ }
+
+ // NOTE: If need some special line break do it with logging phase
+
+ // If html logging and line break is used add the line break.
+ if ( ( iLoggerType == CStifLogger::EHtml ) && iWithLineBreak && aWithLineBreak )
+ {
+ aData.Append( _L( "<BR>" ) );
+ aData.Append( _L( "\n" ) ); // To make html file more readable
+ // with text editor
+ }
+
+ // Other cases line break is normal '\n' if logging is used
+ else if( iWithLineBreak && aWithLineBreak )
+ {
+ aData.Append( 0x0D ); // 13 or '\' in Symbian OS
+ aData.Append( 0x0A ); // 10 or 'n' in Symbian OS
+ }
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CFileOutput
+
+ Method: EventRanking
+
+ Description: For event ranking logging.
+
+ Parameters: TPtr8& aData: inout: Data with event ranking
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+ Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+void CRDebugOutput::EventRanking( TPtr& aData )
+ {
+ // Returns the machine's current tick count.
+ TUint tick = User::TickCount();
+ tick &= 0xffff;
+ aData.AppendNum( tick );
+ aData.Append( _L( " " ) );
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CFileOutput
+
+ Method: DateAndTime
+
+ Description: For date and time logging.
+
+ Parameters: TPtr8& aData: inout: Data with time stamps
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+ Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+void CRDebugOutput::AddTimeStampToData( TPtr& aData )
+ {
+ TStifLoggerTimeStamp8 timeStamp;
+ GetDateAndTime( timeStamp );
+ aData.Append( timeStamp );
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CFileOutput
+
+ Method: GetDateAndTime
+
+ Description: For date and time logging.
+
+ Parameters: TStifLoggerTimeStamp& aDataAndTime: inout: Generated date and time
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+ Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+void CRDebugOutput::GetDateAndTime( TStifLoggerTimeStamp8& aDataAndTime )
+ {
+ TInt num( 0 );
+ TInt microseconds( 0 );
+
+ // Append date
+ TTime time;
+ time.HomeTime();
+ TDateTime dateTime( time.DateTime() );
+
+ num = dateTime.Day() + 1;
+ if( num < 10 )
+ {
+ aDataAndTime.Append( '0' );
+ }
+ // Append month
+ aDataAndTime.AppendNum( num );
+ num = dateTime.Month() + 1; // returns enum
+ if( num < 10 )
+ {
+ aDataAndTime.Append( '0' );
+ }
+ aDataAndTime.AppendNum( num );
+ aDataAndTime.AppendNum( dateTime.Year() );
+
+ // Append time
+ aDataAndTime.Append( ' ' );
+ num = dateTime.Hour();
+ if( num < 10 )
+ {
+ aDataAndTime.Append( '0' );
+ }
+ aDataAndTime.AppendNum( num );
+ num = dateTime.Minute();
+ if( num < 10 )
+ {
+ aDataAndTime.Append( '0' );
+ }
+ aDataAndTime.AppendNum( num );
+
+ num = dateTime.Second();
+ microseconds = dateTime.MicroSecond(); // Microseconds
+
+ // Seconds
+ if( num < 10 )
+ {
+ aDataAndTime.Append( '0' );
+ }
+ aDataAndTime.AppendNum( num );
+
+ // Milliseconds
+ aDataAndTime.Append( '.' );
+ aDataAndTime.AppendNumFixedWidth( microseconds, EDecimal, 3 );
+
+ // NOTE: If you add more spaces etc. remember increment KMaxTimeStamp size!
+
+ if ( iLoggerType == CStifLogger::EHtml )
+ {
+ aDataAndTime.Append( _L("....") );
+ }
+ else
+ {
+ aDataAndTime.Append( _L(" ") );
+ }
+
+ }
+
+// ================= OTHER EXPORTED FUNCTIONS =================================
+// None
+
+// End of File