--- a/stif/Logger/src/FileOutput.cpp Mon Jun 28 15:36:07 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1214 +0,0 @@
-/*
-* 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 CFileOutput
-* class member functions.
-*
-*/
-
-
-// INCLUDE FILES
-#include "FileOutput.h"
-
-// EXTERNAL DATA STRUCTURES
-// None
-
-// EXTERNAL FUNCTION PROTOTYPES
-// None
-
-// CONSTANTS
-// None
-
-// MACROS
-// None
-//#define RDEBUG_FILEWRITECRASH(a) RDebug::Print(a)
-#define RDEBUG_FILEWRITECRASH(a)
-
-// LOCAL CONSTANTS AND MACROS
-// None
-
-// MODULE DATA STRUCTURES
-// None
-
-// LOCAL FUNCTION PROTOTYPES
-// None
-
-// FORWARD DECLARATIONS
-// None
-
-// ==================== LOCAL FUNCTIONS =======================================
-// None
-
-// ================= MEMBER FUNCTIONS =========================================
-
-/*
--------------------------------------------------------------------------------
-
- Class: CFileOutput
-
- Method: CFileOutput
-
- 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
- TBool aThreadIdToLogFile: in: Indicator to thread id adding to
- end of the log file
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CFileOutput::CFileOutput( CStifLogger::TLoggerType aLoggerType,
- TBool aWithTimeStamp,
- TBool aWithLineBreak,
- TBool aWithEventRanking,
- TBool aThreadIdToLogFile ) :
- COutput()
- {
- // Indicates file type
- iLoggerType = aLoggerType;
-
- // Time stamp indicator
- iWithTimeStamp = aWithTimeStamp;
-
- // Line break indicator
- iWithLineBreak = aWithLineBreak;
-
- // Log event ranking indicator
- iWithEventRanking = aWithEventRanking;
-
- // Indicator to thread id adding to end of the log file
- iThreadIdToLogFile = aThreadIdToLogFile;
-
- // Is file open indicator
- iIsFileOpen = 0;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CFileOutput
-
- Method: ConstructL
-
- Description: Symbian OS second phase constructor
-
- Symbian OS default constructor can leave.
-
- Parameters: const TDesC& aTestPath: in: Log path
- const TDesC& aTestFile: in: Log filename
- TBool aOverWrite: in: For file overwrite
- TBool aCreateLogDir: in: Indicator to directory creation
- TInt aStaticBufferSize
- TBool aUnicode: in: Indicator if file has to be in unicode format
-
- Return Values: None
-
- Errors/Exceptions: Leaves if called CreateNewFileL method fails
- Leaves if called OpenExistingFileL method fails
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CFileOutput::ConstructL( const TDesC& aTestPath,
- const TDesC& aTestFile,
- TBool aOverWrite,
- TBool aCreateLogDir,
- TInt aStaticBufferSize,
- TBool aUnicode)
- {
- iUnicode = aUnicode;
-
- // Open file session
- User::LeaveIfError( iFileSession.Connect() );
-
- // Create a log directory
- if( aCreateLogDir )
- {
- CreateDirectoryL( aTestPath );
- }
-
- // Create a new file
- if ( aOverWrite )
- {
- CreateNewFileL( aTestPath, aTestFile );
- }
- // Open an existing file
- else
- {
- OpenExistingFileL( aTestPath, aTestFile );
- }
-
- if( aStaticBufferSize != 0)
- {
- iDataHBuf8 = HBufC8::NewL( aStaticBufferSize );
- iDataHBuf16 = HBufC::NewL(aStaticBufferSize);
- iStaticBufferSize = aStaticBufferSize;
- }
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CFileOutput
-
- 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
- TInt aStaticBufferSize
- TBool aUnicode: in: Indicator if file has to be in unicode format
-
- Return Values: CFileOutput*: pointer to CFileOutput object
-
- Errors/Exceptions: Leaves if ConstructL leaves
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-CFileOutput* CFileOutput::NewL( const TDesC& aTestPath,
- const TDesC& aTestFile,
- CStifLogger::TLoggerType aLoggerType,
- TBool aOverWrite,
- TBool aWithTimeStamp,
- TBool aWithLineBreak,
- TBool aWithEventRanking,
- TBool aThreadIdToLogFile,
- TBool aCreateLogDir,
- TInt aStaticBufferSize,
- TBool aUnicode )
- {
- // Create CFileOutput object fileWriter
- CFileOutput* fileWriter = new (ELeave) CFileOutput( aLoggerType,
- aWithTimeStamp,
- aWithLineBreak,
- aWithEventRanking,
- aThreadIdToLogFile );
-
- CleanupStack::PushL( fileWriter );
- fileWriter->ConstructL( aTestPath, aTestFile, aOverWrite, aCreateLogDir, aStaticBufferSize,
- aUnicode );
- CleanupStack::Pop( fileWriter );
-
- return fileWriter;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CFileOutput
-
- Method: ~CFileOutput
-
- Description: Destructor
-
- Parameters: None
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-CFileOutput::~CFileOutput()
- {
- // Close file
- iFile.Close();
- // Close file session
- iFileSession.Close();
-
- delete iDataHBuf8;
- delete iDataHBuf16;
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CFileOutput
-
- Method: FileType
-
- Description: Check file type.
-
- Check is file type set with a aTestFile's name. If file type is not set
- the type will set according to StifLogger's type.
-
- Parameters: const TDesC& aTestFile: in: Log filename
- TFileType& fileType: inout: Generated file type
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CFileOutput::FileType( const TDesC& aTestFile,
- TFileType& aFileType )
- {
- TBool fileTypeIsSet( EFalse ); // File type indicator
-
- // Check is file type set to aTestFile parameter
- TInt ret = aTestFile.Find( _L( "." ) );
- if( ret != KErrNotFound )
- {
- fileTypeIsSet = ETrue;
- }
- // If not, add thread id name if allowed
- else if ( iThreadIdToLogFile )
- {
- // Thread id maximum length is 8 in hexadesimal format
- // Construct unique thread name
- aFileType.Append( _L("_") );
- RThread threadHandle; // A handle to a thread
- TThreadId id = threadHandle.Id(); // Encapsulates the
- // Id of a thread
- // Appends id in hexadesimal format
- aFileType.AppendFormat( _L( "%x" ), (TInt)id );
- }
-
- // Add file type after the thread id name
- if ( iLoggerType == CStifLogger::ETxt && !fileTypeIsSet )
- {
- // ".txt"
- aFileType.Append( _L( "." ) );
- aFileType.Append( _L( "txt" ) );
- }
- else if ( iLoggerType == CStifLogger::EHtml && !fileTypeIsSet )
- {
- // ".html"
- aFileType.Append( _L( "." ) );
- aFileType.Append( _L( "html" ) );
- }
- // EData file type comes from the aTestFile name. If not the file type
- // will be empty
- else if ( iLoggerType == CStifLogger::EData )
- {
- aFileType.Append( _L( "" ) );
- }
- else
- {
- aFileType.Append( _L( "" ) );
- }
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CFileOutput
-
- Method: TestFileWithThreadId
-
- Description: Generate thread id
-
- Generate thread id name between the test file name and test file type.
-
- Parameters: TDesC& aTestFile: in: Test file name
- TFileName& aNewTestFile: inout: Generated test file name
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CFileOutput::TestFileWithThreadId( const TDesC& aTestFile,
- TFileName& aNewTestFile )
- {
- for( TInt a = 0; a < aTestFile.Length(); a++ )
- {
- // Find a dot
- if( aTestFile[a] == '.' )
- {
- TPtrC parsedFileType = aTestFile.Mid( a ); // Take rest of the
- // aTestFile
- aNewTestFile.Append( _L( "_" ) );
- RThread threadHandle; // A handle to a thread
- TThreadId id = threadHandle.Id(); // Encapsulates the
- // Id of a thread
- aNewTestFile.AppendFormat( _L( "%x" ), (TInt)id );// Appends id in
- // hexadesimal format
- aNewTestFile.Append( parsedFileType );
- break;
- }
- // Dot not found yet
- else
- {
- aNewTestFile.Append( aTestFile[a] );
- }
- }
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CFileOutput
-
- Method: CreateDirectoryL
-
- Description: Create a log directory.
-
- Method creates directory if not allready exist.
-
- Parameters: const TDesC& aTestPath: in: Test path definition
-
- Return Values: None
-
- Errors/Exceptions: Leaves if directory creation fails
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CFileOutput::CreateDirectoryL( const TDesC& aTestPath )
- {
- __TRACE( KInfo, ( _L( "STIFLOGGER: Create a directory" ) ) );
-
- TInt ret = iFileSession.MkDirAll( aTestPath );
- if( ret != KErrNone && ret != KErrAlreadyExists )
- {
- __TRACE( KError,
- ( _L( "STIFLOGGER: Directory creation fails with error: %d" ), ret ) );
- User::Leave( ret );
- }
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CFileOutput
-
- Method: OpenExistingFileL
-
- Description: Open an existing file.
-
- Method is used when is need for log new information after the existing
- log file.
-
- Parameters: const TDesC& aTestPath: in: Test path definition
- const TDesC& aTestFile: in: Test file name
-
- Return Values: None
-
- Errors/Exceptions: Leaves if path or file lengths are over KMaxFileName
- Leaves if file Replace method fails
- Leaves if file Open method fails
- Leaves if file path not found
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CFileOutput::OpenExistingFileL( const TDesC& aTestPath,
- const TDesC& aTestFile )
- {
- __TRACE( KInfo, ( _L( "STIFLOGGER: Opening an existing file for logging" ) ) );
-
- // If path and file name lengths are over KMaxFileName(TFileName)
- __ASSERT_ALWAYS(
- ( aTestPath.Length() + aTestFile.Length() ) < KMaxFileName,
- User::Leave( KErrArgument ) );
-
- // Check file type and generate threat id name
- TFileType fileType;
- FileType( aTestFile, fileType );
-
- // File directory name, file name and file type definitions
- TPtrC dirNamePrt( aTestPath );
- iFileAndDirName.Copy( dirNamePrt );
-
- TInt isDotFound = aTestFile.Find( _L( "." ) );
- // If dot is found and iThreadIdToLogFile is true
- if( isDotFound != KErrNotFound && iThreadIdToLogFile )
- {
- TFileName testFileWithThreadId;
- // Generate thread id name
- TestFileWithThreadId( aTestFile, testFileWithThreadId );
- iFileAndDirName.Insert(
- iFileAndDirName.Length(), testFileWithThreadId );
- }
- else
- {
- TPtrC txtPrt( fileType );
- iFileAndDirName.Insert( iFileAndDirName.Length(), aTestFile );
- iFileAndDirName.Insert( iFileAndDirName.Length(), txtPrt );
- }
-
-// TBool isOpen( EFalse );
- TInt ret( KErrNone );
-
-
- iIsFileOpen=iFile.Open( iFileSession, iFileAndDirName,
- EFileWrite | EFileStreamText |
- EFileShareAny );
- if( iIsFileOpen == KErrNotFound )
- {
- ret = iFile.Create( iFileSession, iFileAndDirName,
- EFileWrite | EFileStreamText |
- EFileShareAny );
- if(iUnicode && ret == KErrNone)
- {
- char FF = 0xFF;
- char FE = 0xFE;
- TBuf8<2> beg;
- beg.Append(FF);
- beg.Append(FE);
- if(iFile.Write(beg) == KErrNone)
- iFile.Flush();
- }
- }
- else if( iIsFileOpen == KErrNone )
- {
-
- ret=KErrNone;
- }
- // Probably path not found
- else
- {
- User::Leave( iIsFileOpen );
- }
-
- if ( ret != KErrNone )
- {
- User::Leave( ret );
- }
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CFileOutput
-
- Method: CreateNewFileL
-
- Description: Create a new file.
-
- Method creates new file to the log information.
-
- Parameters: const TDesC& aTestPath: in: Test path definition
- const TDesC& aTestFile: in: Test file name
-
- Return Values: None
-
- Errors/Exceptions: Leaves if path or file lengths are over KMaxFileName
- Leaves if file server Connect method fails
- Leaves if file Replace method fails
- Leaves if file Open method fails
- Leaves if file path not found
-
- Status: Proposal
-
--------------------------------------------------------------------------------
-*/
-void CFileOutput::CreateNewFileL( const TDesC& aTestPath,
- const TDesC& aTestFile )
- {
- __TRACE( KInfo, ( _L( "STIFLOGGER: Create a new file for logging" ) ) );
-
- // If path and file name lengths are over KMaxFileName(TFileName)
- __ASSERT_ALWAYS(
- ( aTestPath.Length() + aTestFile.Length() ) < KMaxFileName,
- User::Leave( KErrArgument ) );
-
- // Check file type and generate threat id name
- TFileType fileType;
- FileType( aTestFile, fileType );
-
- // File directory name, file name and file type definitions
- TPtrC dirNamePrt( aTestPath );
- iFileAndDirName.Copy( dirNamePrt );
-
- TInt isDotFound = aTestFile.Find( _L( "." ) );
- // If dot is found and iThreadIdToLogFile is true
- if( isDotFound != KErrNotFound && iThreadIdToLogFile )
- {
- TFileName testFileWithThreadId;
- // Generate thread id name
- TestFileWithThreadId( aTestFile, testFileWithThreadId );
- iFileAndDirName.Insert(
- iFileAndDirName.Length(), testFileWithThreadId );
- }
- else
- {
- TPtrC txtPrt( fileType );
- iFileAndDirName.Insert( iFileAndDirName.Length(), aTestFile );
- iFileAndDirName.Insert( iFileAndDirName.Length(), txtPrt );
- }
-
- // Delete file if exist
- iFileSession.Delete( iFileAndDirName );
-
- TBool isOpen( EFalse );
- TInt ret( KErrNone );
-
- iIsFileOpen = iFileSession.IsFileOpen( iFileAndDirName, isOpen );
- if( ( iIsFileOpen == KErrNotFound ) ||
- ( iIsFileOpen == KErrNone ) )
- {
- ret = iFile.Replace( iFileSession, iFileAndDirName,
- EFileWrite | EFileStreamText |
- EFileShareAny );
- if(iUnicode && ret == KErrNone)
- {
- char FF = 0xFF;
- char FE = 0xFE;
- TBuf8<2> beg;
- beg.Append(FF);
- beg.Append(FE);
- if(iFile.Write(beg) == KErrNone)
- iFile.Flush();
- }
- }
- // Probably path not found
- else
- {
- User::Leave( iIsFileOpen );
- }
-
- if ( ret != KErrNone )
- {
- User::Leave( ret );
- }
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CFileOutput
-
- 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: Approved
-
--------------------------------------------------------------------------------
-*/
-TInt CFileOutput::Write( TBool aWithTimeStamp, TBool aWithLineBreak,
- TBool aWithEventRanking, const TDesC& aData )
- {
- TInt extraLength( 0 ); // Line and/or event required length
-
- TPtr data16(0, 0);
- TPtr8 data8(0, 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 = aData.Length();
-
- HBufC8* dataHBuf8 = NULL;
- HBufC16* dataHBuf16 = NULL;
-
- if( iDataHBuf8 != NULL )
- {
- // We'll use HBufC created in ConstructL
- data8.Set(iDataHBuf8->Des());
- data16.Set(iDataHBuf16->Des());
- data16.Copy(_L("")); // Initialize aData buffer
-
- if( (aData.Length() + extraLength) > iStaticBufferSize )
- {
- RDebug::Print(_L("Warning: buffer size too small, not able to log!"));
- return KErrOverflow;
- }
- }
- else
- {
- // We'll create a local HBufC, deleting it in the end of this method
- dataHBuf8 = HBufC8::New( space + extraLength );
- if( dataHBuf8 == NULL )
- {
- return KErrNoMemory;
- }
- dataHBuf16 = HBufC16::New(space + extraLength);
- if(dataHBuf16 == NULL)
- {
- delete dataHBuf8;
- return KErrNoMemory;
- }
- data8.Set(dataHBuf8->Des());
- data16.Set(dataHBuf16->Des());
- }
-
- // Event ranking
- if( iWithEventRanking && aWithEventRanking && !iWithTimeStamp )
- {
- EventRanking( data16 ); // Event ranking to data
- data16.Append( aData ); // Unicode aData to normal text
- }
- // Time stamp
- else if( iWithTimeStamp && aWithTimeStamp )
- {
- // With event ranking
- if( iWithEventRanking && aWithEventRanking )
- {
- EventRanking( data16 ); // Event ranking to data
- }
- AddTimeStampToData( data16 );// Add time stamp
- data16.Append( aData ); // Unicode aData to normal text
- }
- else
- {
- data16.Copy( aData ); // 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 )
- {
- data16.Append( _L( "<BR>" ) );
- data16.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 )
- {
- data16.Append( 0x0D ); // 13 or '\' in Symbian OS
- data16.Append( 0x0A ); // 10 or 'n' in Symbian OS
- }
-
- // Write the data to file
- TInt tmp = 0;
- if( iFile.Seek( ESeekEnd, tmp ) == KErrNone )
- {
- RDEBUG_FILEWRITECRASH(_L("iFile.Write 1 in"));
- TPtrC8 dataToFile(0, 0);
- if(iUnicode)
- {
- dataToFile.Set((TUint8 *)(data16.Ptr()), data16.Length() * 2);
- }
- else
- {
- data8.Copy(data16);
- dataToFile.Set(data8);
- }
- if(iFile.Write(dataToFile) == KErrNone)
- iFile.Flush();
- RDEBUG_FILEWRITECRASH(_L("iFile.Write 1 out"));
- }
- if( iDataHBuf8 == NULL )
- {
- delete dataHBuf8;
- dataHBuf8 = 0;
- delete dataHBuf16;
- dataHBuf16 = 0;
- }
-
- return KErrNone;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CFileOutput
-
- 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: Symbian error code.
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-TInt CFileOutput::Write( TBool aWithTimeStamp, TBool aWithLineBreak,
- TBool aWithEventRanking, const TDesC8& aData )
- {
- TInt extraLength( 0 ); // Line and/or event required length
-
- TPtr data16(0, 0);
- TPtr8 data8(0, 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;
- }
-
- // aData straight to the file
- if ( extraLength == 0 && !iUnicode)
- {
- // Write the data to file
- TInt tmp = 0;
- if( iFile.Seek( ESeekEnd, tmp ) == KErrNone )
- {
- RDEBUG_FILEWRITECRASH(_L("iFile.Write 2 in"));
- if( iFile.Write( aData ) == KErrNone )
- iFile.Flush();
- RDEBUG_FILEWRITECRASH(_L("iFile.Write 2 out"));
- }
- return KErrNone;
- }
-
- // Calculated space
- TInt space = aData.Length();
- HBufC8* dataHBuf8 = NULL;
- HBufC* dataHBuf16 = NULL;
-
- if( iDataHBuf8 != NULL )
- {
- // We'll use HBufC created in ConstructL
- data8.Set(iDataHBuf8->Des());
- data8.Copy(_L("")); // Initialize aData buffer
- data16.Set(iDataHBuf16->Des());
-
- if( (aData.Length() + extraLength) > iStaticBufferSize )
- {
- RDebug::Print(_L("Warning: buffer size too small, not able to log!"));
- return KErrOverflow;
- }
- }
- else
- {
- // We'll create a local HBufC, deleting it in the end of this method
- dataHBuf8 = HBufC8::New( space + extraLength );
- if( dataHBuf8 == NULL )
- {
- return KErrNoMemory;
- }
- dataHBuf16 = HBufC16::New(space + extraLength);
- if(dataHBuf16 == NULL)
- {
- delete dataHBuf8;
- return KErrNoMemory;
- }
- data8.Set(dataHBuf8->Des()); // Memory allocation for data
- data16.Set(dataHBuf16->Des()); // Memory allocation for data
- }
-
- // Event ranking
- if( iWithEventRanking && aWithEventRanking && !iWithTimeStamp )
- {
- EventRanking( data8 ); // Event ranking to data
- data8.Append( aData ); // Unicode aData to normal text
- }
- // Time stamp
- else if( iWithTimeStamp && aWithTimeStamp )
- {
- // With event ranking
- if( iWithEventRanking && aWithEventRanking )
- {
- EventRanking( data8 ); // Event ranking to data
- }
- AddTimeStampToData( data8 );// Add time stamp
- data8.Append( aData ); // Unicode aData to normal text
- }
- else
- {
- data8.Copy( aData ); // 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 )
- {
- data8.Append( _L( "<BR>" ) );
- data8.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 )
- {
- data8.Append( 0x0D ); // 13 or '\' in Symbian OS
- data8.Append( 0x0A ); // 10 or 'n' in Symbian OS
- }
-
- // Write the data to file
- TInt tmp = 0;
- if( iFile.Seek( ESeekEnd, tmp ) == KErrNone )
- {
- RDEBUG_FILEWRITECRASH(_L("iFile.Write 3 in"));
- TPtrC8 dataToFile(0, 0);
- if(iUnicode)
- {
- data16.Copy(data8);
- dataToFile.Set((TUint8 *)(data16.Ptr()), data16.Length() * 2);
- }
- else
- {
- dataToFile.Set(data8);
- }
- if(iFile.Write(dataToFile) == KErrNone)
- iFile.Flush();
- RDEBUG_FILEWRITECRASH(_L("iFile.Write 3 out"));
- }
- if( iDataHBuf8 == NULL )
- {
- delete dataHBuf8;
- dataHBuf8 = 0;
- delete dataHBuf16;
- dataHBuf16 = 0;
- }
-
- return KErrNone;
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CFileOutput
-
- Method: EventRanking
-
- Description: For event ranking logging.
-
- Parameters: TPtr& aData: inout: Data with event ranking
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CFileOutput::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: EventRanking
-
- Description: For event ranking logging.
-
- Parameters: TPtr8& aData: inout: Data with event ranking
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CFileOutput::EventRanking( TPtr8& aData )
- {
- // Returns the machine's current tick count.
- TUint tick = User::TickCount();
- tick &= 0xffff;
- aData.AppendNum( tick );
- aData.Append( _L8( " " ) );
-
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CFileOutput
-
- Method: AddTimeStampToData
-
- Description: For date and time logging.
-
- Parameters: TPtr& aData: inout: Data with time stamps
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CFileOutput::AddTimeStampToData( TPtr& aData )
- {
- TStifLoggerTimeStamp timeStamp;
- GetDateAndTime( timeStamp );
-
- TStifLoggerTimeStamp8 tStamp16;
- tStamp16.Copy(timeStamp);
-
- aData.Append( tStamp16 );
- }
-
-/*
--------------------------------------------------------------------------------
-
- Class: CFileOutput
-
- Method: AddTimeStampToData
-
- Description: For date and time logging.
-
- Parameters: TPtr8& aData: inout: Data with time stamps
-
- Return Values: None
-
- Errors/Exceptions: None
-
- Status: Approved
-
--------------------------------------------------------------------------------
-*/
-void CFileOutput::AddTimeStampToData( TPtr8& aData )
- {
- TStifLoggerTimeStamp 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 CFileOutput::GetDateAndTime( TStifLoggerTimeStamp& 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 );
- aDataAndTime.Append( '.' );
- num = 0;
- num = dateTime.Month();
- switch( num )
- {
- case EJanuary: // 1
- {
- aDataAndTime.Append( _L( "Jan" ) );
- break;
- }
- case EFebruary: // 2
- {
- aDataAndTime.Append( _L( "Feb" ) );
- break;
- }
- case EMarch: // 3
- {
- aDataAndTime.Append( _L( "Mar" ) );
- break;
- }
- case EApril: // 4
- {
- aDataAndTime.Append( _L( "Apr" ) );
- break;
- }
- case EMay: // 5
- {
- aDataAndTime.Append( _L( "May" ) );
- break;
- }
- case EJune: // 6
- {
- aDataAndTime.Append( _L( "Jun" ) );
- break;
- }
- case EJuly: // 7
- {
- aDataAndTime.Append( _L( "Jul" ) );
- break;
- }
- case EAugust: // 8
- {
- aDataAndTime.Append( _L( "Aug" ) );
- break;
- }
- case ESeptember: // 9
- {
- aDataAndTime.Append( _L( "Sep" ) );
- break;
- }
- case EOctober: // 10
- {
- aDataAndTime.Append( _L( "Oct" ) );
- break;
- }
- case ENovember: // 11
- {
- aDataAndTime.Append( _L( "Nov" ) );
- break;
- }
- case EDecember: // 12
- {
- aDataAndTime.Append( _L( "Dec" ) );
- break;
- }
- default:
- {
- aDataAndTime.Append( '-' );
- break;
- }
- }
- // Append year
- aDataAndTime.Append( '.' );
- aDataAndTime.AppendNum( dateTime.Year() );
-
- // Append time
- aDataAndTime.Append( ' ' );
- num = dateTime.Hour();
- if( num < 10 )
- {
- aDataAndTime.Append( '0' );
- }
- aDataAndTime.AppendNum( num );
- aDataAndTime.Append( ':' );
- num = dateTime.Minute();
- if( num < 10 )
- {
- aDataAndTime.Append( '0' );
- }
- aDataAndTime.AppendNum( num );
- aDataAndTime.Append( ':' );
-
- num = dateTime.Second(); // Seconds
- 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