taskswitcher/taskswitcherui/trace/tslogutils.h
changeset 4 4d54b72983ae
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/taskswitcher/taskswitcherui/trace/tslogutils.h	Tue Jan 26 11:48:23 2010 +0200
@@ -0,0 +1,211 @@
+/*
+* 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:  Logging behavior
+*
+*/
+
+
+#ifndef TSLOGUTILS_H
+#define TSLOGUTILS_H
+
+/**
+ * NOTE: This file contains the logic related to logging. Change only if you
+ * know what you're doing.
+ */
+
+
+
+
+
+
+
+
+
+
+#ifdef _DEBUG
+
+#include <e32debug.h>
+#include <e32std.h>
+
+static const TUint TSLOGERR   = 2;  /**< Used to create an error message */
+
+// These macros are real macros, that should be used. For temporary purposes, these
+// are left out and the logging is done by simple entry logging
+#define _TSLOG_UNCONTROLLED_INPUT_MSG  L"%s%d[%x:%x:%x]>%s UNCONTROLLED ENTRY!"
+#define _TSLOG_MULTIPLE_ENTRY_MSG      L"%s%d[%x:%x:%x]%s  ADDITIONAL ENTRY!"
+#define _TSLOG_UNCONTROLLER_EXIT_MSG   L"%s%d[%x:%x:%x]<%s UNCONTROLLED EXIT!"
+#define _TSLOG_MULTIPLE_EXIT_MSG       L"%s%d[%x:%x:%x]%s  ADDITIONAL EXIT!"
+#define _TSLOG_TRAP_HARNESS_ENTRY      L"_D%d[%x:%x:%x]TraceFramework: Entering trap harness"
+#define _TSLOG_TRAP_HARNESS_EXIT       L"_D%d[%x:%x:%x]TraceFramework: Exiting trap harness"
+#define _TSLOG_TRAP_HARNESS_LEAVE      L"_D%d[%x:%x:%x]TraceFramework: ---------- LEAVE OCCURRED !!! ---------- "
+#define _TSLOG_API_PREFIX              L"_A"
+#define _TSLOG_LOCAL_PREFIX            L"_L"
+
+/**
+* @file 
+* trace_utils.h contains definitions needed for advanced tracing features.
+* Tracing can be customized using the following compile time flags:
+* - <b>_DEBUG</b>
+*   - With this flag undefined, all traces are disabled
+* - <b>__KERNEL_MODE__</b>
+*   - if kernel mode flag is defined, kernel macro variants are used (no unicode or shared heap related stuff, faster)
+* - <b>DISABLE_SYNTAX_CHECK</b>
+*   - If this flag is defined, runtime syntax checking features are disabled from traces
+*/
+#ifndef DISABLE_SYNTAX_CHECK
+    #define _MARK_ENTRY() _dc.inOk=ETrue
+    #define _DOINCHK() _dc.DoInChk()
+    #define _CHK_MULTIIN() _dc.ChkMultiIn()
+    #define _CHK_MULTIOUT() _dc.ChkMultiOut()
+    #define _MARK_EXIT() _dc.outOk=ETrue
+#else
+    #define _MARK_ENTRY()
+    #define _DOINCHK()
+    #define _CHK_MULTIIN()
+    #define _CHK_MULTIOUT()
+    #define _MARK_EXIT()
+#endif // DISABLE_SYNTAX_CHECK
+    
+/** For tracing */
+#ifdef _TSLOG_RDEBUG
+    #define _IT(a) (TPtrC((const TText *)(a)))
+    #define _TSLOGPRINTER RDebug::Print        
+        
+/** For filedebug */
+#else   // _TSLOG_RDEBUG
+
+    /** Includes */
+    #include <e32base.h>
+    #include <e32std.h>
+    #include <e32def.h>
+    #include <e32svr.h>
+
+// both of headers defines KLogBufferSize
+#ifndef __COMMSDEBUGUTILITY_H__
+    #include <flogger.h>
+#endif
+
+    #define _IT(a) KTsLogPath, KTsLogFile, EFileLoggingModeAppend, (TPtrC((const TText *)(a)))    
+    #define _TSLOGPRINTER RFileLogger::WriteFormat    
+#endif // _TSLOG_RDEBUG    
+
+class _TTsLogContext
+    {
+    public:
+        _TTsLogContext(
+            const TText* _fn, 
+            const TUint _id, 
+            const TUint _vis, 
+            const TUint _addr, 
+            const TUint _thdId, 
+            const TUint _category=0 )
+            : 
+            iFn(_fn), 
+            iId(_id), 
+            iApi((TBool)_vis), 
+            iAddr(_addr), 
+            iThdId(_thdId), 
+            iVis((_vis == 0 ? (TText*)_TSLOG_API_PREFIX : (TText*)_TSLOG_LOCAL_PREFIX)),
+            iCategory(_category)            
+        #ifndef DISABLE_SYNTAX_CHECK
+            ,outOk(EFalse), inOk(EFalse)
+        #endif
+            {
+            }
+        ~_TTsLogContext() 
+            {
+            #ifndef DISABLE_SYNTAX_CHECK
+                do
+                    {                   
+                    DoInChk();
+                    if (!outOk)
+                        {
+                        _TSLOGPRINTER(_IT(_TSLOG_UNCONTROLLER_EXIT_MSG), iVis, iCategory, iId, iThdId, iAddr, iFn);
+                        }
+                    } while (0);
+            #endif // DISABLE_SYNTAX_CHECK
+            }
+
+        const TText* iFn;
+        const TUint iId;
+        const TText* iVis;
+        const TUint iAddr;
+        const TInt iThdId;
+        const TBool iApi;
+        const TUint iCategory;
+        
+        #ifndef DISABLE_SYNTAX_CHECK
+            inline void DoInChk()
+                {
+                if (!inOk)
+                    {
+                    _TSLOGPRINTER(_IT(_TSLOG_UNCONTROLLED_INPUT_MSG), iVis, iCategory, iId, iThdId, iAddr, iFn);
+                    inOk = ETrue;
+                    }
+                }
+                        
+            inline void ChkMultiIn()
+                {
+                if (inOk)
+                    {
+                    _TSLOGPRINTER(_IT(_TSLOG_MULTIPLE_ENTRY_MSG), iVis, iCategory, iId, iThdId, iAddr, iFn);                
+                    }
+                }
+    
+            inline void ChkMultiOut()
+                {
+                if (outOk)
+                    {           
+                    _TSLOGPRINTER(_IT(_TSLOG_MULTIPLE_EXIT_MSG), iVis, iCategory, iId, iThdId, iAddr, iFn);                                        
+                    }
+                }
+
+            TBool inOk;
+            TBool outOk;
+        #endif // DISABLE_SYNTAX_CHECK
+    };
+    
+class _TTsLogTrapHandler: public TTrapHandler
+    {
+    public:
+
+        _TTsLogTrapHandler(_TTsLogContext& _context) : _dc( _context ) 
+            {
+            RThread me;
+            iThdId = (TInt)me.Id();
+            }
+    	void Trap() 
+    	    {
+    	    _TSLOGPRINTER(_IT(_TSLOG_TRAP_HARNESS_ENTRY), 0, TSLOGERR, iThdId, this);
+    	    oldHandler->Trap();
+    	    } 
+    	void UnTrap()
+    	    {
+    	    _TSLOGPRINTER(_IT(_TSLOG_TRAP_HARNESS_EXIT), 0, TSLOGERR, iThdId, this);
+    	    oldHandler->UnTrap();
+    	    }	
+    	void Leave(TInt aValue)
+    	    {
+    	    _TSLOGPRINTER(_IT(_TSLOG_TRAP_HARNESS_LEAVE), 0, TSLOGERR, iThdId, this);
+    	    oldHandler->Leave(aValue);
+    	    }	
+    	TTrapHandler* oldHandler;
+    private:
+        _TTsLogContext& _dc;
+        TInt iThdId;
+    };
+    
+#endif // _DEBUG    
+
+#endif // TSLOGUTILS_H