photosgallery/inc/glxtracer.h
changeset 0 4e91876724a2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/photosgallery/inc/glxtracer.h	Thu Dec 17 08:45:44 2009 +0200
@@ -0,0 +1,151 @@
+/*
+* Copyright (c) 2008-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:    Logging macros
+*
+*/
+
+
+
+
+#ifndef GLXTRACER_H
+#define GLXTRACER_H
+ 
+/**
+ * This file has been copied from the forum nokia wiki and renamed to glxtracer.h
+ * http://wiki.forum.nokia.com/index.php/Trace_Function_Enter%2C_Exit_and_Leave
+ */
+
+#include <e32base.h>
+ 
+// Define tracer logging method
+// 0    = Logging off
+// 1    = Log to RDebug
+// 2    = Log to file (RFileLogger)
+#define TRACER_LOG_METHOD 0
+ 
+// ============================================================================
+ 
+// Logging off, define empty macros and skip all the rest
+#if TRACER_LOG_METHOD == 0
+ 
+    #define TRACER(func)    
+    #define TRACER_RET(func,format)
+ 
+#else                       // Logging on
+ 
+    // Macro to print function entry, exit and leave. 
+    // Example: TRACER("CMyClass::MyFunction");
+    #define TRACER(func) TTracer function_tracer( _S(func), _S("") );
+ 
+    // 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 func_tracer( _S(func), _S(format) );
+ 
+    #if TRACER_LOG_METHOD == 1      // Print to RDebug
+ 
+        #include <e32debug.h>
+        #define TRACER_PRINT(a)         RDebug::Print(a,&iFunc);
+        #define TRACER_PRINT_RET(a,b)   RDebug::Print(a,&iFunc,b);
+ 
+    #elif TRACER_LOG_METHOD == 2    // Print to file
+ 
+        #include <flogger.h>
+        _LIT( KLogDir,  "tracer" );     // Log directory: C:\logs\tracer
+        _LIT( KLogFile, "tracer.txt" ); // Log file: c:\logs\tracer\tracer.txt
+        #define TRACER_PRINT(a)         RFileLogger::WriteFormat(KLogDir, \
+                            KLogFile,EFileLoggingModeAppend,a,&iFunc);
+        #define TRACER_PRINT_RET(a,b)   RFileLogger::WriteFormat(KLogDir, \
+                            KLogFile,EFileLoggingModeAppend,a,&iFunc,b);
+ 
+    #endif
+ 
+    _LIT( KLogEnter,    "%S: ENTER" );
+    _LIT( KLogExit,     "%S: EXIT" );
+    _LIT( KLogLeave,    "%S: LEAVE!" );
+    _LIT( KLogExitRet,  "%S: EXIT, Returning " );
+ 
+    /**
+     * Simple tracer class that logs function enter, exit or leave
+     */
+    class TTracer
+        {
+    public:
+ 
+        /**
+         * inline constructor to write log of entering a function
+         */
+        TTracer( const TText* aFunc, const TText* aRetFormat )
+            : iFunc( aFunc )
+            , iRetFormat( aRetFormat )
+            {
+            TRACER_PRINT( KLogEnter );
+            }
+ 
+        /**
+         * 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 ( 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
+                        TRACER_PRINT( KLogExit );
+                    #endif
+                    }
+                }
+            }
+ 
+    private:
+ 
+        /** 
+         * Pointer descriptor to function signature that is to be logged.
+         */
+        TPtrC iFunc;
+ 
+        /**
+         * Formatting string used to print the function return value
+         */
+        TPtrC iRetFormat;
+ 
+        };
+ 
+#endif // TRACER_LOG_METHOD == 0
+ 
+#endif // GLXTRACER_H