securitydialogs/lockapp/inc/lockapptrace.h
changeset 0 164170e6151a
child 25 0cdac1d155ce
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/securitydialogs/lockapp/inc/lockapptrace.h	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,392 @@
+/*
+* 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