diff -r 000000000000 -r 08ec8eefde2f featuremgmt/featuremgr/src/inc/featmgrdebug.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/featuremgmt/featuremgr/src/inc/featmgrdebug.h Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,213 @@ +/* +* Copyright (c) 2007-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: +* +*/ + + + +#ifndef FEATMGRDEBUG_H +#define FEATMGRDEBUG_H + + +// INCLUDES +#include + +// Enable macros to support error and/or info logging +#ifdef _DEBUG + //#define FEATMGR_INFO_LOG_ENABLED + //#define FEATMGR_ERROR_LOG_ENABLED + #define FEATMGR_TIMESTAMP_ENABLED +#endif // _DEBUG + + +/** +* Prefix trace macro to complete tracing with component name. +* Returns TDesC which can be used directly with RDebug or RFileLogger. +*/ + #define PREFIX( aMsg ) TPtrC( (const TText*)L"[EFM]: " L##aMsg ) + +/** +* Prefix error trace +*/ + #define ERROR_PREFIX( aMsg ) PREFIX( "[ERROR]: " L##aMsg ) + +/** +* Prefix macro for strings +*/ +#define _PREFIX_CHAR( aMsg ) (const char*)"[EFM]: " ##aMsg + +// Info logging +#ifdef FEATMGR_INFO_LOG_ENABLED + + #define INFO_LOG( aMsg ) { RDebug::Print( PREFIX( aMsg ) ); } + + #define INFO_LOG1( aMsg, aArg1 )\ + { RDebug::Print( PREFIX( aMsg ), aArg1 ); } + + #define INFO_LOG2( aMsg, aArg1, aArg2 )\ + { RDebug::Print( PREFIX( aMsg ), aArg1, aArg2 ); } + + #define INFO_LOG3( aMsg, aArg1, aArg2, aArg3 )\ + { RDebug::Print( PREFIX( aMsg ), aArg1, aArg2, aArg3 ); } + + #define FUNC( aMsg, aP1 )\ + {\ + RDebug::Printf( aMsg, aP1 );\ + }\ +// Function log object +_LIT8( KFuncNameTerminator, "(" ); +_LIT8( KFuncLeavePattern, "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( KFuncLeavePattern().Length() ).Compare( KFuncLeavePattern ); + 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 // FEATMGR_INFO_LOG_ENABLED + + #define INFO_LOG( aMsg ) + + #define INFO_LOG1( aMsg, aArg1 ) + + #define INFO_LOG2( aMsg, aArg1, aArg2 ) + + #define INFO_LOG3( aMsg, aArg1, aArg2, aArg3 ) + + #define FUNC_LOG + +#endif // FEATMGR_INFO_LOG_ENABLED + +// Timestamp logging +#ifdef FEATMGR_TIMESTAMP_ENABLED + + #define TIMESTAMP( aCaption )\ + {\ + TTime t;\ + t.HomeTime();\ + TDateTime dt = t.DateTime();\ + _LIT( KCaption, aCaption );\ + RDebug::Print( PREFIX("[TIMESTAMP] %S %d:%02d:%02d.%d us"),\ + &KCaption, dt.Hour(), dt.Minute(), dt.Second(), dt.MicroSecond() );\ + } + +#else + + #define TIMESTAMP( aCaption ) + +#endif // FEATMGR_TIMESTAMP_ENABLED + +// Error logging +#ifdef FEATMGR_ERROR_LOG_ENABLED + + #define ERROR_LOG( aMsg )\ + {RDebug::Print( ERROR_PREFIX( aMsg ) ); } + + #define ERROR_LOG1( aMsg, aArg1 )\ + {RDebug::Print( ERROR_PREFIX( aMsg ), aArg1 ); } + + #define ERROR_LOG2( aMsg, aArg1, aArg2 )\ + { RDebug::Print( ERROR_PREFIX( aMsg ), aArg1, aArg2 ); } + + #define ERROR_LOG3( aMsg, aArg1, aArg2, aArg3 )\ + { RDebug::Print( ERROR_PREFIX( aMsg ), aArg1, aArg2, aArg3 ); } + + #define LOG_IF_ERROR( aErr, aMsg )\ + if ( ( aErr ) != KErrNone )\ + { RDebug::Print( ERROR_PREFIX( aMsg )); } + + #define LOG_IF_ERROR1( aErr, aMsg, aArg1 )\ + if ( ( aErr ) != KErrNone )\ + { RDebug::Print( ERROR_PREFIX( aMsg ), aArg1 ); } + + #define LOG_IF_ERROR2( aErr, aMsg, aArg1, aArg2 )\ + if ( ( aErr ) != KErrNone )\ + { RDebug::Print( ERROR_PREFIX( aMsg ), aArg1, aArg2 ); } + + #define LOG_IF_ERROR3( aErr, aMsg, aArg1, aArg2, aArg3 )\ + if ( ( aErr ) != KErrNone )\ + { RDebug::Print( ERROR_PREFIX( aMsg ), aArg1, aArg2, aArg3 ); } + +#else // FEATMGR_ERROR_LOG_ENABLED + + #define ERROR_LOG( aMsg ) + + #define ERROR_LOG1( aMsg, aArg1 ) + + #define ERROR_LOG2( aMsg, aArg1, aArg2 ) + + #define ERROR_LOG3( aMsg, aArg1, aArg2, aArg3 ) + + // Remove compiler warning + #define LOG_IF_ERROR( aErr, aMsg ) ( aErr ) = ( aErr ); + + #define LOG_IF_ERROR1( aErr, aMsg, aArg1 ) ( aErr ) = ( aErr ); + + #define LOG_IF_ERROR2( aErr, aMsg, aArg1, aArg2 ) ( aErr ) = ( aErr ); + + #define LOG_IF_ERROR3( aErr, aMsg, aArg1, aArg2, aArg3 ) ( aErr ) = ( aErr ); + +#endif // FEATMGR_ERROR_LOG_ENABLED + + +#endif // FEATMGRDEBUG_H + +// End of File