commonservices/PlatformEnv/inc/platformenvdebug.h
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonservices/PlatformEnv/inc/platformenvdebug.h	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,258 @@
+/*
+* 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:  Debug definitions
+*
+*/
+
+
+#ifndef PLATFORMENVDEBUG_H
+#define PLATFORMENVDEBUG_H
+
+
+//  INCLUDES
+#include <e32debug.h>
+
+// Function trace
+// #define PLATFORM_ENV_FUNC_LOG
+
+// Informative trace
+// #define PLATFORM_ENV_INFO_LOG
+
+// Error trace
+// #define PLATFORM_ENV_ERROR_LOG
+
+// Client trace (used with function trace)
+#define PLATFORM_ENV_CLIENT_LOG
+
+#ifdef _DEBUG
+ #ifndef PLATFORM_ENV_ERROR_LOG
+  #define PLATFORM_ENV_ERROR_LOG
+ #endif // PLATFORM_ENV_ERROR_LOG
+#endif // _DEBUG
+
+
+// Function logging
+#ifdef PLATFORM_ENV_FUNC_LOG
+
+_LIT8( KFuncNameTerminator, "(" );
+_LIT8( KFuncLeavePatternL, "L" );
+const TInt KFuncCanLeave = 0x1;
+const TInt KFuncLeft = 0x2;
+const TInt KFuncLogClient = 0x4;
+
+class TFuncLog
+    {
+public:
+    static void Cleanup( TAny* aPtr )
+        {
+        TFuncLog* self = static_cast< TFuncLog* >( aPtr );
+        self->iFlags |= KFuncLeft;
+        RDebug::Printf( "%S-LEAVE", &self->iFunc ); // Leave detected
+        }
+
+    inline void LogClientStart()
+        {
+#ifdef PLATFORM_ENV_CLIENT_LOG
+        if ( iFlags & KFuncLogClient )
+            {
+            _LIT( KMsg, "Client=%S-START" );
+            TName name( RThread().Name() );
+            RDebug::Print( KMsg, &name );
+            }
+#endif // PLATFORM_ENV_CLIENT_LOG
+        }
+
+    inline void LogClientEnd()
+        {
+#ifdef PLATFORM_ENV_CLIENT_LOG
+        if ( iFlags & KFuncLogClient )
+            {
+            _LIT( KMsg, "Client=%S-END" );
+            TName name( RThread().Name() );
+            RDebug::Print( KMsg, &name );
+            }
+#endif // PLATFORM_ENV_CLIENT_LOG
+        }
+
+    // For non leaving and L methods
+    inline TFuncLog( const char* aFunc, TUint aFlags ) :
+            iFunc( aFunc ? _S8( aFunc ) : _S8("") ),
+            iFlags( aFlags ),
+            iCleanupItem( Cleanup, this ),
+            iLCPtr( NULL )
+        {
+        TInt pos( iFunc.Find( KFuncNameTerminator ) );
+        if( pos != KErrNotFound )
+            {
+            iFunc.Set( iFunc.Left( pos ) );
+            if( !iFunc.Right( KFuncLeavePatternL().Length() ).Compare( KFuncLeavePatternL ) )
+                {
+                iFlags |= KFuncCanLeave;
+                CleanupStack::PushL( iCleanupItem ); // Ignore warnings
+                }
+            }
+        RDebug::Printf( "%S-START", &iFunc );
+        LogClientStart();
+        }
+
+    // For LC methods only
+    inline TFuncLog( const char* aFunc, TUint aFlags, TAny** aLCPtr ) :
+            iFunc( aFunc ? _S8( aFunc ) : _S8("") ),
+            iFlags( aFlags ),
+            iCleanupItem( Cleanup, this ),
+            iLCPtr( NULL )
+        {
+        TInt pos( iFunc.Find( KFuncNameTerminator ) );
+        if( pos != KErrNotFound )
+            {
+            iFunc.Set( iFunc.Left( pos ) );
+            iFlags |= KFuncCanLeave;
+            iLCPtr = aLCPtr;
+            CleanupStack::PushL( iCleanupItem ); // Ignore warnings
+            }
+        RDebug::Printf( "%S-START", &iFunc );
+        LogClientStart();
+        }
+
+    inline ~TFuncLog()
+        {
+        if ( !( iFlags & KFuncLeft ) )
+            {
+            if ( iFlags & KFuncCanLeave )
+                {
+                if ( iLCPtr && *iLCPtr)
+                    {
+                    CleanupStack::Pop(); // Pop LC ptr first
+                    CleanupStack::Pop( this ); // Pop the cleanup item
+                    CleanupStack::PushL( *iLCPtr ); // Push LC ptr back
+                    }
+                else
+                    {
+                    CleanupStack::Pop( this ); // Pop the cleanup item
+                    }
+                }
+            LogClientEnd();
+            RDebug::Printf( "%S-END", &iFunc ); // Normally finished
+            }
+        }
+
+private: // Data
+    TPtrC8 iFunc;
+    TUint iFlags;
+    TCleanupItem iCleanupItem;
+    TAny** iLCPtr;
+    };
+    
+ #define FUNC_LOG TFuncLog _fl( __PRETTY_FUNCTION__, 0 );
+ 
+ #define FUNC_LOG_LC( ptr ) TFuncLog _fl( __PRETTY_FUNCTION__, 0, (TAny**)&ptr );
+ 
+ #define FUNC_LOG_WITH_CLIENT_NAME TFuncLog _fl( __PRETTY_FUNCTION__, KFuncLogClient );
+ 
+ #define FUNC_LOG_WITH_CLIENT_NAME_LC( ptr )\
+    TFuncLog _fl( __PRETTY_FUNCTION__, KFuncLogClient, (TAny**)&ptr );
+
+#else // PLATFORM_ENV_FUNC_LOG
+
+ #define FUNC_LOG
+ 
+ #define FUNC_LOG_LC( ptr )
+ 
+ #define FUNC_LOG_WITH_CLIENT_NAME
+ 
+ #define FUNC_LOG_WITH_CLIENT_NAME_LC( ptr )
+
+#endif // PLATFORM_ENV_FUNC_LOG
+
+// Informative logging
+#ifdef PLATFORM_ENV_INFO_LOG
+
+ #define INFO_LOG( aMsg ) { _LIT( KMsg, aMsg ); RDebug::Print( KMsg ); }
+
+ #define INFO_LOG1( aMsg, aArg1 )\
+    { _LIT( KMsg, aMsg ); RDebug::Print( KMsg, aArg1 ); }
+
+ #define INFO_LOG2( aMsg, aArg1, aArg2 )\
+    { _LIT( KMsg, aMsg ); RDebug::Print( KMsg, aArg1, aArg2 ); }
+
+ #define INFO_LOG3( aMsg, aArg1, aArg2, aArg3 )\
+    { _LIT( KMsg, aMsg ); RDebug::Print( KMsg, aArg1, aArg2, aArg3 ); }
+
+#else // PLATFORM_ENV_INFO_LOG
+
+ #define INFO_LOG( aMsg )
+
+ #define INFO_LOG1( aMsg, aArg1 )
+
+ #define INFO_LOG2( aMsg, aArg1, aArg2 )
+
+ #define INFO_LOG3( aMsg, aArg1, aArg2, aArg3 )
+
+#endif // PLATFORM_ENV_INFO_LOG
+
+
+// Error logging
+#ifdef PLATFORM_ENV_ERROR_LOG
+
+ #define ERROR_LOG( aMsg ) { _LIT( KMsg, aMsg ); RDebug::Print( KMsg ); }
+
+ #define ERROR_LOG1( aMsg, aArg1 )\
+    { _LIT( KMsg, aMsg ); RDebug::Print( KMsg, aArg1 ); }
+
+ #define ERROR_LOG2( aMsg, aArg1, aArg2 )\
+    { _LIT( KMsg, aMsg ); RDebug::Print( KMsg, aArg1, aArg2 ); }
+
+ #define ERROR_LOG3( aMsg, aArg1, aArg2, aArg3 )\
+    { _LIT( KMsg, aMsg ); RDebug::Print( KMsg, aArg1, aArg2, aArg3 ); }
+
+ #define LOG_IF_ERROR( aErr, aMsg )\
+    if ( ( aErr ) != KErrNone )\
+        { _LIT( KMsg, aMsg ); RDebug::Print( KMsg ); }
+
+ #define LOG_IF_ERROR1( aErr, aMsg, aArg1 )\
+    if ( ( aErr ) != KErrNone )\
+        { _LIT( KMsg, aMsg ); RDebug::Print( KMsg, aArg1 ); }
+        
+ #define LOG_IF_ERROR2( aErr, aMsg, aArg1, aArg2 )\
+    if ( ( aErr ) != KErrNone )\
+        { _LIT( KMsg, aMsg ); RDebug::Print( KMsg, aArg1, aArg2 ); }
+
+ #define LOG_IF_ERROR3( aErr, aMsg, aArg1, aArg2, aArg3 )\
+    if ( ( aErr ) != KErrNone )\
+        { _LIT( KMsg, aMsg ); RDebug::Print( KMsg, aArg1, aArg2, aArg3 ); }
+
+#else // PLATFORM_ENV_ERROR_LOG
+
+ #define ERROR_LOG( aMsg )
+
+ #define ERROR_LOG1( aMsg, aArg1 )
+
+ #define ERROR_LOG2( aMsg, aArg1, aArg2 )
+
+ #define ERROR_LOG3( aMsg, aArg1, aArg2, aArg3 )
+
+ #define LOG_IF_ERROR( aErr, aMsg )
+
+ #define LOG_IF_ERROR1( aErr, aMsg, aArg1 )
+
+ #define LOG_IF_ERROR2( aErr, aMsg, aArg1, aArg2 )
+
+ #define LOG_IF_ERROR3( aErr, aMsg, aArg1, aArg2, aArg3 )
+
+#endif // PLATFORM_ENV_ERROR_LOG
+
+
+#endif // PLATFORMENVDEBUG_H
+
+// End of File