browserui/browser/BrowserAppInc/Logger.h
author Simon Howkins <simonh@symbian.org>
Mon, 22 Nov 2010 14:25:13 +0000
branchRCL_3
changeset 73 9437cb201cd0
parent 0 84ad3b177aa3
permissions -rw-r--r--
__WEB_WIDGETS configuration is now done within the component's bld.inf files, not the top/mid level bld.infs

/*
* Copyright (c) 2002-2006 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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:  Implemented logger functionality of the module
*
*/


#ifndef BROWSER_LOGGER_H
#define BROWSER_LOGGER_H

#if defined( I__BROWSER_LOG_ENABLED ) || defined ( I__BROWSER_PERF_LOG_ENABLED )

// INCLUDES
#include <bldvariant.hrh>
#include <e32std.h>
#include <e32def.h>
#include <e32cmn.h>
#include <flogger.h>


// log files are stored to KDebugLogDirFull folder
_LIT(KDebugLogDependency,       "C:\\Logs\\");
_LIT(KDebugLogDoubleBackSlash,  "\\");

_LIT( KDebugLogDir,             "Browser");
_LIT( KDebugLogFile,            "Browser.log");
_LIT( KDebugPerfLogFile,        "BrowserPerf.log");
_LIT( KLogMessageAppBanner,     "Browser: module (%d.%d.%d) started" );
_LIT( KPerLogBanner, 			"*************Performance Logging *****************");
// _LIT( KDebugLogTimeFormatString,"%H:%T:%S:%*C3" );
_LIT( KDebugLogExit,            "Browser: module exit" );

#endif

#if defined( I__BROWSER_LOG_ENABLED )

// MACROS
// indentation is not supported by the hardware at this moment
#if defined( __WINSCW__ )
#define I__BROWSER_LOG_INDENT
#endif

/**
* Use this macro in order to initialize logger :
* - create log directory,
* - write version information into the log file
*/
#define LOG_CREATE { TFileName path( KDebugLogDependency ); \
    path.Append( KDebugLogDir ); \
    path.Append( KDebugLogDoubleBackSlash ); \
    RFs& fs = CEikonEnv::Static()->FsSession(); \
    fs.MkDirAll( path ); \
    RFileLogger::WriteFormat( KDebugLogDir, KDebugLogFile, EFileLoggingModeOverwrite, KLogMessageAppBanner ); \
    }

/**
* Use this macro for writing information about exiting.
*/
#define LOG_DELETE { RFileLogger::Write( KDebugLogDir, KDebugLogFile, EFileLoggingModeAppend, KDebugLogExit ); }

/**
* Use this function at any points of a function for writing a hex dump 
* of the specified data to the log.
* @param p The data the is to be converted to a hex string.
* @param l How many of the characters in p are to be converted. 
* Conversion always starts from position 0 within p.
*/
//#define LOG_WRITE_HEXDUMP( p, l ) { RFileLogger::HexDump( KDebugLogDir, KDebugLogFile, EFileLoggingModeAppend, _S("RLog_Ex"), _S("RL_cont"), p, l ); }

// -------------------------------------------------

class MLoggerProvider
    {
    public:
        virtual TInt* LoggerIndent() = 0;
        virtual void LoggerIndentIncrement( TInt aValue ) = 0;
        virtual void LoggerIndentDecrement( TInt aValue ) = 0;
    };

class CBrowserLogger: public CBase
    {
    public:
        CBrowserLogger( const TDesC& aFunc );
        ~CBrowserLogger();
    
    /**
    * Write formatted log.
    * @param aFmt Format string.
    */
    static void Write( TRefByValue<const TDesC16> aFmt, ... );
    
    /**
    * Write formatted log.
    * @param aFmt Format string.
    * @param aList Variable argument list.
    */
    static void Write( TRefByValue<const TDesC16> aFmt, VA_LIST& aList );

    /**
    * Write formatted log.
    * @param aFmt Format string.
    */
    static void Write(TRefByValue<const TDesC8> aFmt, ... );

    /**
    * Write formatted log.
    * @param aFmt Format string.
    * @param aList Variable argument list.
    */
    static void Write( TRefByValue<const TDesC8> aFmt, VA_LIST& aList );

    protected:
        TPtrC   iFunc;
        const MLoggerProvider* iOwner;
    // make the indentation available by 'static' keyword
#if defined ( I__BROWSER_LOG_INDENT )
        static
#endif
        TInt iIndent;
    };

// -------------------------------------------------
// Usage:
// - call LOG_ENTERFN( "function name" ); at entry point of a function
// otherwise BROWSER_LOG call won't work
// - call BROWSER_LOG( ( _L( "log string" ) ) ); OR
// you can add parameters to this call like this:
// - BROWSER_LOG( ( _L( "format string: %d" ), value ) );
// -------------------------------------------------
// future development if _L() will be removed:
// #define _BL( a ) TPtrC( _S( a ) )
// BROWSER_LOG( ( _BL( "format string: %d" ), a ) )
// -------------------------------------------------

#define LOG_ENTERFN( a ) _LIT( _br_temp_log_string18, a ); \
    CBrowserLogger _br_entry_exit( _br_temp_log_string18 )
#define BROWSER_LOG( _params_ ) \
    _br_entry_exit.Write _params_
#define LOG_WRITE( _params_ ) \
    BROWSER_LOG( ( _L( _params_ ) ) )
#define LOG_WRITE_FORMAT( _format_, _params_ ) \
    BROWSER_LOG( ( _L( _format_ ), _params_ ) )

#else // I__BROWSER_LOG_ENABLED

// Empty macros
#define LOG_CREATE
#define LOG_DELETE
#define LOG_ENTERFN( a )
#define LOG_WRITE( a )
#define LOG_WRITE_FORMAT( a, b )
#define LOG_WRITE_TIMESTAMP( a )
#define LOG_WRITE_HEXDUMP( p, l )
#define BROWSER_LOG( a )

#endif // I__BROWSER_LOG_ENABLED


#ifdef I__BROWSER_PERF_LOG_ENABLED

/**
* Use this macro in order to initialize performance logger:
* - create log directory,
* 
*/
#define PERFLOG_CREATE { TFileName path( KDebugLogDependency ); \
    path.Append( KDebugLogDir ); \
    path.Append( KDebugLogDoubleBackSlash ); \
    RFs& fs = CEikonEnv::Static()->FsSession(); \
    fs.MkDirAll( path ); \
    RFileLogger::WriteFormat( KDebugLogDir, KDebugPerfLogFile, EFileLoggingModeOverwrite, KPerLogBanner);\
    }

#define PERFLOG_LOCAL_INIT \
	TTime __time1_brbrbr;\
	TTime __time2_brbrbr;\
	TTimeIntervalMicroSeconds diff_brbrbr;


#define PERFLOG_STOPWATCH_START \
	__time1_brbrbr.HomeTime();
	
#define PERFLOG_STOPWATCH_STOP \
	__time2_brbrbr.HomeTime();\
	diff_brbrbr = __time2_brbrbr.MicroSecondsFrom( __time1_brbrbr );

#define PERFLOG_WRITE( _param_ ){\
	_LIT( __perf_temp_1234_, "%S took %Ld ms" );\
	_LIT(__perf_temp_param, _param_ );\
	RFileLogger::WriteFormat( KDebugLogDir, KDebugPerfLogFile, EFileLoggingModeAppend, __perf_temp_1234_, &__perf_temp_param(), diff_brbrbr .Int64() );\
	}
	
#define PERFLOG_STOP_WRITE( _params_ )\
	PERFLOG_STOPWATCH_STOP\
	PERFLOG_WRITE( _params_ )

//It may look ugly in code
#define PERF( _a, _b ) \
	{\
	PERFLOG_LOCAL_INIT\
	PERFLOG_STOPWATCH_START\
	_b;\
	PERFLOG_STOP_WRITE( _a )\
	}


#else

#define PERFLOG_CREATE
#define PERFLOG_LOCAL_INIT
#define PERFLOG_STOPWATCH_START
#define PERFLOG_STOPWATCH_STOP
#define PERFLOG_WRITE(a)
#define PERFLOG_STOP_WRITE(a)
#define PERF( _a, _b ) _b
#endif
	
	

#endif	// BROWSER_LOGGER_H

// End of file