stif/Logger/src/FileOutput.cpp
changeset 36 813b186005b6
parent 30 86a2e675b80a
child 41 838cdffd57ce
--- 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