stif/Logger/src/RDebugOutput.cpp
branchRCL_3
changeset 59 8ad140f3dd41
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stif/Logger/src/RDebugOutput.cpp	Wed Oct 13 16:17:58 2010 +0300
@@ -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