securitydialogs/lockapp/inc/lockapptrace.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 26 Jan 2010 15:20:08 +0200
changeset 0 164170e6151a
child 25 0cdac1d155ce
permissions -rw-r--r--
Revision: 201004

/*
* Copyright (c) 2007 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:  Trace macro support for lockapp
 *
*/


#ifndef LOCKAPPTRACE_H
#define LOCKAPPTRACE_H

#include "lockapptraceconfiguration.hrh"

#ifdef TRACE_INTO_FILE
#include <flogger.h> // RFileLogger
#else
#include <e32debug.h> // RDebug
#endif

//-----------------------------------------------------------------------------
// Constants
//-----------------------------------------------------------------------------
//

/**
* Prefix trace macro to complete tracing with component name.
* Returns TDesC which can be used directly with RDebug or RFileLogger.
*/
#define _PREFIX_TRACE( aMsg ) TPtrC( (const TText*)L"[LockApp]: " L##aMsg )

/**
* Prefix error trace
*/
#define _PREFIX_ERROR( aMsg ) _PREFIX_TRACE( "[ERROR: %d]: " L##aMsg )

/**
* Prefix info trace.
*/
#define _PREFIX_INFO( aMsg ) _PREFIX_TRACE( "[INFO]: " L##aMsg )

/**
* Prefix macro for strings
*/
#define _PREFIX_CHAR( aMsg ) (const char*)"[LockApp]: " ##aMsg

/**
* Define needed directories if TRACE_INTO_FILE macro in use
*/
#ifdef TRACE_INTO_FILE

	_LIT( KDir, "lockapp" );
	_LIT( KFile, "lockapp_log.txt" );
	_LIT( KFullPath, "c:\\logs\\lockapp\\" );

#endif

//-----------------------------------------------------------------------------
// Error trace macros
//-----------------------------------------------------------------------------
//
#ifdef ERROR_TRACE

	/**
	* Error trace definitions.
	*/
	#ifdef TRACE_INTO_FILE

		#define ERROR( aErr, aMsg )\
			{\
			if( aErr < KErrNone )\
				{\
				RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_ERROR( aMsg ), aErr );\
				}\
			}
		#define ERROR_1( aErr, aMsg, aP1 )\
			{\
			if( aErr < KErrNone )\
				{\
				RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_ERROR( aMsg ), aErr, aP1 );\
				}\
			}
		#define ERROR_2( aErr, aMsg, aP1, aP2 )\
			{\
			if( aErr < KErrNone )\
				{\
				RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_ERROR( aMsg ), aErr, aP1, aP2 );\
				}\
			}
		#define ERROR_3( aErr, aMsg, aP1, aP2, aP3 )\
			{\
			if( aErr < KErrNone )\
				{\
				RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_ERROR( aMsg ), aErr, aP1, aP2, aP3 );\
				}\
			}

	#else//TRACE_INTO_FILE not defined

		#define ERROR( aErr, aMsg )\
			{\
			if( aErr < KErrNone )\
				{\
				RDebug::Print( _PREFIX_ERROR( aMsg ), aErr );\
				}\
			}
		#define ERROR_1( aErr, aMsg, aP1 )\
			{\
			if( aErr < KErrNone )\
				{\
				RDebug::Print( _PREFIX_ERROR( aMsg ), aErr, aP1 );\
				}\
			}
		#define ERROR_2( aErr, aMsg, aP1, aP2 )\
			{\
			if( aErr < KErrNone )\
				{\
				RDebug::Print( _PREFIX_ERROR( aMsg ), aErr, aP1, aP2 );\
				}\
			}
		#define ERROR_3( aErr, aMsg, aP1, aP2, aP3 )\
			{\
			if( aErr < KErrNone )\
				{\
				RDebug::Print( _PREFIX_ERROR( aMsg ), aErr, aP1, aP2, aP3 );\
				}\
			}

	#endif//TRACE_INTO_FILE

	#define ERROR_GEN( aMsg ) ERROR( KErrGeneral, aMsg )
	#define ERROR_GEN_1( aMsg, aP1 ) ERROR_1( KErrGeneral, aMsg, aP1 )
	#define ERROR_GEN_2( aMsg, aP1, aP2 ) ERROR_2( KErrGeneral, aMsg, aP1, aP2 )
	#define ERROR_GEN_3( aMsg, aP1, aP2, aP3 ) ERROR_3( KErrGeneral, aMsg, aP1, aP3 )

#else//ERROR_TRACE not defined

	#define ERROR( aErr, aMsg )
	#define ERROR_1( aErr, aMsg, aP1 )
	#define ERROR_2( aErr, aMsg, aP1, aP2 )
	#define ERROR_3( aErr, aMsg, aP1, aP2, aP3 )
	#define ERROR_GEN( aMsg )
	#define ERROR_GEN_1( aMsg, aP1 )
	#define ERROR_GEN_2( aMsg, aP1, aP2 )
	#define ERROR_GEN_3( aMsg, aP1, aP2, aP3 )

#endif//ERROR_TRACE

//-----------------------------------------------------------------------------
// Info trace macros
//-----------------------------------------------------------------------------
//
#ifdef INFO_TRACE

	/**
	* Info log message definitions.
	*/
	#ifdef TRACE_INTO_FILE

		#define INFO( aMsg )\
			{\
			RDebug::Print( _PREFIX_INFO( aMsg ) );\
			RFileLogger::Write( KDir, KFile, EFileLoggingModeAppend, _PREFIX_INFO( aMsg ) );\
			}
		#define INFO_1( aMsg, aP1 )\
			{\
			RDebug::Print( _PREFIX_INFO( aMsg ), aP1 );\
			RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_INFO( aMsg ), aP1 );\
			}
		#define INFO_2( aMsg, aP1, aP2 )\
			{\
			RDebug::Print( _PREFIX_INFO( aMsg ), aP1, aP2 );\
			RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_INFO( aMsg ), aP1, aP2 );\
			}
		#define INFO_3( aMsg, aP1, aP2, aP3 )\
			{\
			RDebug::Print( _PREFIX_INFO( aMsg ), aP1, aP2, aP3 );\
			RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_INFO( aMsg ), aP1, aP2, aP3 );\
			}
		#define INFO_4( aMsg, aP1, aP2, aP3, aP4 )\
			{\
			RDebug::Print( _PREFIX_INFO( aMsg ), aP1, aP2, aP3, aP4 );\
			RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_INFO( aMsg ), aP1, aP2, aP3, aP4 );\
			}

	#else//TRACE_INTO_FILE not defined

		#define INFO( aMsg )\
			{\
			RDebug::Print( _PREFIX_INFO( aMsg ) );\
			}
		#define INFO_1( aMsg, aP1 )\
			{\
			RDebug::Print( _PREFIX_INFO( aMsg ), aP1 );\
			}
		#define INFO_2( aMsg, aP1, aP2 )\
			{\
			RDebug::Print( _PREFIX_INFO( aMsg ), aP1, aP2 );\
			}
		#define INFO_3( aMsg, aP1, aP2, aP3 )\
			{\
			RDebug::Print( _PREFIX_INFO( aMsg ), aP1, aP2, aP3 );\
			}
		#define INFO_4( aMsg, aP1, aP2, aP3, aP4 )\
			{\
			RDebug::Print( _PREFIX_INFO( aMsg ), aP1, aP2, aP3, aP4 );\
			}

	#endif//TRACE_INTO_FILE

#else//INFO_TRACE not defined

	#define INFO( aMsg )
	#define INFO_1( aMsg, aP1 )
	#define INFO_2( aMsg, aP1, aP2 )
	#define INFO_3( aMsg, aP1, aP2, aP3 )
	#define INFO_4( aMsg, aP1, aP2, aP3, aP4 )

#endif//INFO_TRACE

//-----------------------------------------------------------------------------
// Trace current client thread name and process id
//-----------------------------------------------------------------------------
//
#ifdef CLIENT_TRACE

	#define CLIENT( aMessage )\
		{\
		RThread thread;\
		TInt err = aMessage.Client( thread );\
		if( err == KErrNone )\
			{\
			RProcess process;\
			err = thread.Process( process );\
			if( err == KErrNone )\
				{\
				TPtrC thredName( thread.Name() );\
				TUid processUid( process.SecureId() );\
				INFO_2( "Current client process UID: [%x], thread name: [%S]",\
					processUid,\
					&thredName );\
				}\
			process.Close();\
			}\
		thread.Close();\
		}

#else

	#define CLIENT( aMessage )

#endif

//-----------------------------------------------------------------------------
// Function trace macros
//-----------------------------------------------------------------------------
//
#ifdef FUNC_TRACE

	/**
	* Function logging definitions.
	*/
	#ifdef TRACE_INTO_FILE

		#define FUNC( aMsg, aP1 )\
			{\
			TPtrC8 trace( _S8( aMsg ) );\
			RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, trace, aP1 );\
			}\

	#else//TRACE_INTO_FILE not defined

		#define FUNC( aMsg, aP1 )\
			{\
			RDebug::Printf( aMsg, aP1 );\
			}\

	#endif//TRACE_INTO_FILE

	/**
	* Function trace helper class.
	*
	* NOTE:
	* LC -methods cannot be trapped. Therefore if LC -method leaves
	* END trace is used instead of LEAVE trace.
	* If you have an idea how to round this problem please tell.
	*/
	_LIT8( KFuncNameTerminator, "(" );
	_LIT8( KFuncLeavePatternL, "L" );
	class TFuncLog
		{
		public:
			static void Cleanup( TAny* aPtr )
				{
				TFuncLog* self = static_cast< TFuncLog* >( aPtr );
				self->iLeft = ETrue;
				FUNC( _PREFIX_CHAR("%S-LEAVE"), &self->iFunc ); // Leave detected
				}
			inline TFuncLog( const char* aFunc ) :
					iFunc( aFunc ? _S8( aFunc ) : _S8("") ),
					iLeft( EFalse ),
					iCleanupItem( Cleanup, this ),
					iCanLeave( EFalse )
				{
				TInt pos( iFunc.Find( KFuncNameTerminator ) );
				if( pos != KErrNotFound )
					{
					iFunc.Set( iFunc.Left( pos ) );
					iCanLeave = !iFunc.Right( KFuncLeavePatternL().Length() ).Compare( KFuncLeavePatternL );
					if ( iCanLeave )
						{
						CleanupStack::PushL( iCleanupItem ); // Ignore warnings
						}
					}
				FUNC( _PREFIX_CHAR("%S-START"), &iFunc );
				}

			inline ~TFuncLog()
				{
				if ( !iLeft )
					{
					if ( iCanLeave )
						{
						CleanupStack::Pop( this ); // Pop the cleanup item
						}
					FUNC( _PREFIX_CHAR("%S-END"), &iFunc ); // Normally finished
					}
				}

		private: // Data
			TPtrC8 iFunc;
			TBool iLeft;
			TCleanupItem iCleanupItem;
			TBool iCanLeave;
		};
	#define FUNC_LOG TFuncLog _fl( __PRETTY_FUNCTION__ );

#else//FUNC_TRACE not defined

	#define FUNC_LOG

#endif//FUNC_TRACE

//-----------------------------------------------------------------------------
// Timestamp trace macros
//-----------------------------------------------------------------------------
//
#ifdef TIMESTAMP_TRACE

	#ifdef TRACE_INTO_FILE

		#define TIMESTAMP( aCaption )\
			{\
			TTime t;\
			t.HomeTime();\
			TDateTime dt = t.DateTime();\
			_LIT( KCaption, aCaption );\
			RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend,\
				_PREFIX_TRACE("[TIMESTAMP] %S %d:%02d:%02d.%d us"),\
					&KCaption, dt.Hour(), dt.Minute(), dt.Second(), dt.MicroSecond() );\
			}

	#else//TRACE_INTO_FILE not defined

		#define TIMESTAMP( aCaption )\
			{\
			TTime t;\
			t.HomeTime();\
			TDateTime dt = t.DateTime();\
			_LIT( KCaption, aCaption );\
			RDebug::Print( _PREFIX_TRACE("[TIMESTAMP] %S %d:%02d:%02d.%d us"),\
				&KCaption, dt.Hour(), dt.Minute(), dt.Second(), dt.MicroSecond() );\
			}

	#endif//TRACE_INTO_FILE

#else//TIMESTAMP_TRACE not defined

	#define TIMESTAMP( aCaption )

#endif//TIMESTAMP_TRACE

#endif