uiservicetab/inc/uiservicetabtracer.h
branchRCL_3
changeset 23 9a48e301e94b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiservicetab/inc/uiservicetabtracer.h	Wed Sep 01 12:33:36 2010 +0100
@@ -0,0 +1,425 @@
+/*
+* Copyright (c) 2008 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 logs
+ *
+*/
+
+#ifndef UISERVICETABTRACER_H
+#define UISERVICETABTRACER_H
+
+#include <e32base.h>
+#include <flogger.h>
+#include "vimpstbuilddefinitions.h"
+
+#ifdef CHAT_ENABLE_DEBUG_PRINT
+
+// --------------------------------------------------------------------------
+// Define tracer logging method
+// 0    = Logging off
+// 1    = Log to RDebug
+// 2    = Log to file (RFileLogger)
+// --------------------------------------------------------------------------
+//
+
+#ifdef __WINS__
+  #ifdef _DEBUG
+    #define TRACER_LOG_METHOD 1 // for WINS UDEB
+  #else
+    #define TRACER_LOG_METHOD 0 // for WINS UREL
+ #endif
+#else
+  #ifdef _DEBUG
+    #define TRACER_LOG_METHOD 2 // for Armv5 UDEB
+  #else
+    #define TRACER_LOG_METHOD 0 // for Armv5 UREL
+ #endif
+#endif
+
+#endif
+
+// --------------------------------------------------------------------------
+// Whether to use TRAP_INSTRUMENTATIONs to
+// log trapped leaves
+// --------------------------------------------------------------------------
+//
+#define TRACE_TRAPS
+//============================================================================
+
+// Logging off, define empty macros and skip all the rest
+#if TRACER_LOG_METHOD == 0
+
+#define TRACER(func)
+#define TRACER_AUTO
+#define TRACER_RET(func,format)
+#define TRACER_AUTO_RET(format)
+#define TRACER_LEAVE(func)
+#define TRACER_AUTO_LEAVE
+#define TRACE(args...)
+#define TRACE8(args...)
+#define TRACER_TO16(a,b)
+#define TRACER_TO8(a,b)
+#define TRACER_CLOSELOG
+
+#else  // Logging on
+
+// --------------------------------------------------------------------------
+// Change these to modify line syntax
+// --------------------------------------------------------------------------
+//
+_LIT( KLogBase, "UiServiceTab %S(%d): %S");
+_LIT( KLogEnter, "UiServiceTab %S: ENTER" );
+_LIT( KLogExit, "UiServiceTab %S: EXIT" );
+_LIT( KLogLeave, "UiServiceTab %S: LEAVE!" );
+_LIT( KLogTrappedLeave, "UiServiceTab %S(%d): TRAPPED LEAVE, code %d!" );
+_LIT( KLogExitRet, "UiServiceTab %S: EXIT, Returning " );
+_LIT( KLogDir,  "UiServiceTab" ); 
+_LIT( KLogFile, "UiServiceTab.log" );
+
+#define TRACER_PARAMS_LENGTH 200
+
+// --------------------------------------------------------------------------
+// Macro to print only function leaves (not entries or exits). 
+// Example: TRACER_LEAVE( "CMyClass::MyFunction" );
+// --------------------------------------------------------------------------
+//
+#define TRACER_LEAVE(func) TTracer function_tracer( _S(func), _S(""), EFalse )
+
+// --------------------------------------------------------------------------
+// Same as above, except that function name is generated automatically
+// Example: TRACER_AUTO_LEAVE;
+// --------------------------------------------------------------------------
+//
+#define TRACER_AUTO_LEAVE TTracer \
+    function_tracer( ((const TText8*)__PRETTY_FUNCTION__), _S(""), EFalse )
+
+// --------------------------------------------------------------------------
+// Macro to print function entry, exit and leave. 
+// Example: TRACER( "CMyClass::MyFunction" );
+// --------------------------------------------------------------------------
+//
+#define TRACER(func) TTracer function_tracer( _S(func), _S(""), ETrue )
+
+// --------------------------------------------------------------------------
+// Same as above, except that function name is generated automatically
+// Example: TRACER_AUTO;
+// --------------------------------------------------------------------------
+//
+#define TRACER_AUTO \
+    TTracer function_tracer \
+        ( ((const TText8*)__PRETTY_FUNCTION__), _S(""), ETrue )
+
+// --------------------------------------------------------------------------
+// Macro to print function return value in addition to entry, exit 
+// and leave conditions. Second parameter is a formatting string used 
+// to print the return value Example to print an integer return value:
+// TRACER_RET("CMyclass::MyFunction", "%d");
+// --------------------------------------------------------------------------
+//
+#define TRACER_RET(func,format) \
+    TTracer function_tracer( _S(func), _S(format), ETrue )
+
+// --------------------------------------------------------------------------
+// Same as above, except that function name is generated automatically
+// Example: TRACER_AUTO_RET( "%d" );
+// --------------------------------------------------------------------------
+//
+#define TRACER_AUTO_RET(format) \
+    TTracer function_tracer \
+        ( ((const TText8*)__PRETTY_FUNCTION__), _S(format), ETrue )
+
+// --------------------------------------------------------------------------
+// Macro to print custom msg with any number of parameters
+// Either TRACER, TRACER_RET or TRACER_LEAVE 
+// must be called before in same scope
+// It's is assumed that descriptor (pointer) parameters are 16-bit
+// NOTE: It is also assumed that parameter values
+// add no more than TRACE_PARAMS_LENGTH to the traced string
+// --------------------------------------------------------------------------
+//
+#define TRACE( args... ) function_tracer.trace( __LINE__, ## args )
+
+// --------------------------------------------------------------------------
+// Macro to print custom msg with any number of parameters
+// Either TRACER, TRACER_RET or TRACER_LEAVE 
+// must be called before in same scope
+// It's is assumed that descriptor (pointer) parameters are 8-bit
+// NOTE: It is also assumed that parameter values 
+// add no more than TRACE_PARAMS_LENGTH to the traced string
+// --------------------------------------------------------------------------
+//
+#define TRACE8( args... ) function_tracer.trace8(__LINE__, ## args )
+
+// --------------------------------------------------------------------------
+// Just to quickly convert descriptors if needed
+// --------------------------------------------------------------------------
+//
+#define DESCRIPTOR_LENGTH 100
+#define TRACER_TO16( desc8, desc16 ) \
+    TBuf<DESCRIPTOR_LENGTH> desc16;desc16.Copy(desc8) 
+#define TRACER_TO8( desc16, desc8 ) \
+    TBuf8<DESCRIPTOR_LENGTH> desc8;desc8.Copy(desc16) 
+
+#ifdef TRACE_TRAPS
+#undef TRAP_INSTRUMENTATION_LEAVE
+#define TRAP_INSTRUMENTATION_LEAVE(aResult) \
+    TTracer::static_trace( ((const TText8*)__PRETTY_FUNCTION__), \
+                           __LINE__, aResult )
+#endif
+
+
+#if TRACER_LOG_METHOD == 1      // Print to RDebug
+
+#include <e32debug.h>
+
+#define TRACER_PRINT(a)            RDebug::Print(a,&iFunc);
+#define TRACER_PRINT_BASE(a,b,c)   RDebug::Print(a,&iFunc, b, c);
+#define TRACER_PRINT_RET(a,b)      RDebug::Print(a,&iFunc,b);
+#define TRACER_PRINT_STATIC(a, b, c,d ) \
+    RDebug::Print(a, b, c, d);
+
+#elif TRACER_LOG_METHOD == 2    // Print to file
+
+ // needs flogger.lib as DEBUGLIBRARY
+
+// --------------------------------------------------------------------------
+// Log directory under C:\logs
+// --------------------------------------------------------------------------
+//
+//_LIT( KLogDir,  "MeCo" );      
+
+// --------------------------------------------------------------------------
+// Log filename in log directory
+// --------------------------------------------------------------------------
+//
+//_LIT( KLogFile, "MeCo.log" );
+#define TRACER_PRINT(a)         RFileLogger::WriteFormat(KLogDir, \
+                            KLogFile,EFileLoggingModeAppend,a,&iFunc);
+#define TRACER_PRINT_BASE(a,b,c)   RFileLogger::WriteFormat(KLogDir, \
+                            KLogFile,EFileLoggingModeAppend,a,&iFunc,b,c);
+#define TRACER_PRINT_RET(a,b)   RFileLogger::WriteFormat(KLogDir, \
+                            KLogFile,EFileLoggingModeAppend,a,&iFunc,b);
+#define TRACER_PRINT_STATIC(a,b,c,d) \
+    RFileLogger::WriteFormat(KLogDir, \
+        KLogFile,EFileLoggingModeAppend,a,b,c,d);
+
+#endif
+
+
+/**
+ * Simple tracer class that logs function enter, exit or leave
+ */
+class TTracer : public CBase
+    {
+private:
+    
+    /**
+     * Simple helper method to just return if NULL
+     */
+    template<class T> static void ReturnIfNull(T* aNy) 
+        { if ( !aNy ) return; }
+
+public:
+    /**
+     * inline constructor to write log of entering a function
+     */
+    TTracer( const TText* aFunc, 
+             const TText* aRetFormat, 
+             TBool aPrintEnter) :
+        iFunc( aFunc), 
+        iRetFormat( aRetFormat ),
+        iPrintEnterAndExit( aPrintEnter)
+        {
+        iFuncBuf = NULL;
+        //iLogger.Connect();
+        //iLogger.CreateLog(KLogDir, KLogFile, mode);
+        if ( iPrintEnterAndExit )
+            {
+            TRACER_PRINT( KLogEnter );
+            }
+        }
+
+    /**
+     * inline constructor to write log of entering a function (8-bit)
+     */
+    TTracer( const TText8* aFunc, 
+             const TText* aRetFormat, 
+             TBool aPrintEnter) :
+        iRetFormat( aRetFormat ),
+        iPrintEnterAndExit( aPrintEnter )
+        {
+        TInt len = User::StringLength ((const unsigned char*)aFunc );
+        HBufC8* temp = HBufC8::New( len );
+        ReturnIfNull( temp );
+        *temp = (const TUint8*)aFunc;
+        iFuncBuf = HBufC::NewL( len );
+        //iLogger.Connect();
+        //iLogger.CreateLog(KLogDir, KLogFile, EFileLoggingModeAppend);
+        if ( iFuncBuf )
+            {
+            iFuncBuf->Des().Copy( *temp );
+            iFunc.Set( *iFuncBuf );
+            if ( iPrintEnterAndExit )
+                {
+                TRACER_PRINT( KLogEnter );
+                }
+            }
+        delete temp;
+        }
+
+
+    /**
+     * inline destructor to write log of exiting a function 
+     * normally or with a leave
+     */
+    ~TTracer( )
+        {
+        if ( std::uncaught_exception ( ) ) // Leave is an exception
+            {
+            // The function exited with a leave
+            TRACER_PRINT( KLogLeave );
+            }
+        else
+            {
+            // The function exited normally
+            if ( iPrintEnterAndExit )
+                {
+                if ( iRetFormat.Length ( )== 0 )
+                    {
+                    TRACER_PRINT( KLogExit );
+                    }
+                else
+                    {
+                    // Log the return value
+#ifdef __WINS__
+                    TInt32 retVal = 0;
+
+                    // The assembly bit. This needs to be reimplemented
+                    // for every target. 
+                    _asm( mov retVal, ebx );
+
+                    TBuf<100> format( KLogExitRet );
+                    format.Append( iRetFormat );
+                    TRACER_PRINT_RET( format, retVal );
+#else
+                    // ARM assembler to get return value
+                    // could be implemented here..
+                    TRACER_PRINT( KLogExit );
+#endif
+                    }
+                }
+            }
+        //iLogger.Close();
+        delete iFuncBuf;
+        }
+
+public:
+
+    /**
+     * Trace method that assumes 16-bit descriptor parameters
+     */
+    void trace( TInt aLine, const char* aMsg, ... )
+        {
+        ReturnIfNull( iFunc.Ptr() );
+        TInt len = User::StringLength ((const unsigned char*)aMsg );
+        TPtrC8 msg( (const unsigned char*)aMsg, len );
+        HBufC* format = HBufC::New( len );
+        ReturnIfNull( format );
+        format->Des().Copy( msg );
+        HBufC* result = HBufC::New( len + TRACER_PARAMS_LENGTH );
+        if ( result )
+            {
+            VA_LIST list;
+            VA_START( list, aMsg );
+            result->Des().FormatList( *format, list );
+            VA_END(list);
+            TRACER_PRINT_BASE(KLogBase, aLine, result );
+            }
+        delete format;
+        delete result;
+        }
+
+    /**
+     * Trace method that assumes 8-bit descriptor parameters
+     */
+    void trace8(TInt aLine, const char* aMsg, ... )
+        {
+        ReturnIfNull( iFunc.Ptr() );
+        TInt len = User::StringLength ((const unsigned char*)aMsg );
+        TPtrC8 msg( (const unsigned char*)aMsg, len );
+        HBufC8* result8 = HBufC8::New( len + TRACER_PARAMS_LENGTH );
+        ReturnIfNull( result8 );
+        VA_LIST list;
+        VA_START( list, aMsg );
+        result8->Des().FormatList( msg, list );
+        VA_END(list);
+        HBufC* result16 = HBufC::New( result8->Length() );
+        if ( result16 )
+            {
+            result16->Des().Copy( *result8 );
+            TRACER_PRINT_BASE( KLogBase, aLine, result16 );
+            }
+        delete result8;
+        delete result16;
+        }
+    
+    static void static_trace( const TText8* aFunc, 
+                              TInt aLine,
+                              TInt aResult )
+        {
+        TInt len = User::StringLength ((const unsigned char*)aFunc );
+        HBufC8* temp = HBufC8::New( len );
+        ReturnIfNull( temp );
+        *temp = (const TUint8*)aFunc;
+        HBufC* funcBuf = HBufC::NewL( len );
+        if ( funcBuf )
+            {
+            funcBuf->Des().Copy( *temp );
+            TRACER_PRINT_STATIC( 
+                KLogTrappedLeave, funcBuf, aLine, aResult );
+            }
+        delete temp;
+        delete funcBuf;
+        }
+public:
+
+    /** 
+     * Pointer descriptor to function signature that is to be logged.
+     */
+    TPtrC iFunc;
+    //RFileLogger iLogger;
+
+private:
+
+    
+	/**
+     * Formatting string used to print the function return value
+     */
+    TPtrC iRetFormat;
+    
+    /**
+     * If true, method enters and exits are printed
+     */
+    TBool iPrintEnterAndExit;
+    
+    /**
+     * Buffer to store function name when needed
+     */
+    HBufC* iFuncBuf;
+    };
+
+#endif // TRACER_LOG_METHOD != 0 && CHAT_ENABLE_DEBUG_PRINT
+
+#endif // UISERVICETABTRACER_H
+
+// End of file