phonebookengines/VirtualPhonebook/inc/VPbkDebugEntryAndExit.h
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/inc/VPbkDebugEntryAndExit.h	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,173 @@
+/*
+* Copyright (c) 2002-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:  Debugging utilities for logging function entry/exit
+*
+*/
+
+
+
+#ifndef VPBKDEBUG_ENTRYANDEXIT_H
+#define VPBKDEBUG_ENTRYANDEXIT_H
+
+//  INCLUDES
+#include "VPbkConfig.hrh"
+
+#include <e32std.h>
+#include <e32svr.h>
+
+#if defined( VPBK_ENABLE_DEBUG_PRINT ) && defined ( __MODULE__ ) && defined( __LINE__ )
+    // Debug logging is enabled and the required macros are available in the
+    // compiler.
+    // Ps. It seems that these are not available in WINSCW environment.
+
+    /**
+     * Constants for FUNC_ENTRY and FUNC_EXIT macros and examples of the
+     * corresponding output.
+     */
+    _LIT( KFuncEntry,  "%S:%d >>> %S" ); // "example.cpp:609 >>> ExampleL"
+    _LIT( KFuncExit, "%S:%d <<< %S" );   // "example.cpp:642 <<< ExampleL"
+    const TInt KMaxDesC8Length(128);     // limit output to 128 characters
+
+    #ifdef VPBK_ENABLE_DEBUG_LOGGER
+        #include <flogger.h>
+        _LIT( KLogDir, "VPbk" );
+        _LIT( KLogName, "VPbk.log" );
+
+        #define FUNC_ENTRY FuncEntryToLog
+        #define FUNC_EXIT FuncExitToLog
+
+        namespace
+            {
+            /**
+             * Print function entry to log file
+             */
+            void FuncEntryToLog()
+                {
+                TBuf<KMaxDesC8Length> moduleBuf;
+                moduleBuf.Copy( _L8(__MODULE__).Left(KMaxDesC8Length) );
+                TBuf<KMaxDesC8Length> funcBuf;
+                funcBuf.Copy( _L8(__func__).Left(KMaxDesC8Length) );
+                RFileLogger::WriteFormat(
+                    KLogDir(), KLogName(), EFileLoggingModeAppend,
+                    TRefByValue<const TDesC>( KFuncEntry() ),
+                    &moduleBuf, __LINE__, &funcBuf );
+                }
+            /**
+             * Print function exit to log file
+             */
+            void FuncExitToLog()
+                {
+                TBuf<KMaxDesC8Length> moduleBuf;
+                moduleBuf.Copy( _L8(__MODULE__).Left(KMaxDesC8Length) );
+                TBuf<KMaxDesC8Length> funcBuf;
+                funcBuf.Copy( _L8(__func__).Left(KMaxDesC8Length) );
+                RFileLogger::WriteFormat(
+                    KLogDir(), KLogName(), EFileLoggingModeAppend,
+                    TRefByValue<const TDesC>( KFuncExit() ),
+                    &moduleBuf, __LINE__, &funcBuf );
+                }
+            }  // namespace
+    #else // VPBK_ENABLE_DEBUG_LOGGER
+        #define FUNC_ENTRY FuncEntryToRDebug
+        #define FUNC_EXIT FuncExitToRDebug
+
+        namespace
+            {
+            /**
+             * Print function entry to RDebug 
+             */
+            void FuncEntryToRDebug()
+                {
+                TBuf<KMaxDesC8Length> moduleBuf;
+                moduleBuf.Copy( _L8(__MODULE__).Left(KMaxDesC8Length) );
+                TBuf<KMaxDesC8Length> funcBuf;
+                funcBuf.Copy( _L8(__func__).Left(KMaxDesC8Length) );
+                RDebug::Print( KFuncEntry, &moduleBuf, __LINE__, &funcBuf );
+                }
+            /**
+             * Print function exit to RDebug 
+             */
+            void FuncExitToRDebug()
+                {
+                TBuf<KMaxDesC8Length> moduleBuf;
+                moduleBuf.Copy( _L8(__MODULE__).Left(KMaxDesC8Length) );
+                TBuf<KMaxDesC8Length> funcBuf;
+                funcBuf.Copy( _L8(__func__).Left(KMaxDesC8Length) );
+                RDebug::Print( KFuncExit, &moduleBuf, __LINE__, &funcBuf );
+                }
+            }  // namespace
+    #endif // #ifdef VPBK_ENABLE_DEBUG_LOGGER
+
+#else // VPBK_ENABLE_DEBUG_PRINT
+    #define FUNC_ENTRY()
+    #define FUNC_EXIT()
+#endif
+
+
+#ifdef _DEBUG
+    /**
+     * Helper macro for calling invariant on function entry and (normal) exit.
+     * Declare typedef SelfType as the type of the class you're using this
+     * macro in.
+     */
+    #define VPBK_DEBUG_TEST_INVARIANT_ON_ENTRY_AND_EXIT \
+                TPbkDebugCallInvariantOnEntryAndExit<SelfType> \
+                __pbk_debug_test_invariant(this)
+
+#else
+
+    /**
+     * Helper macro for calling invariant on function entry and (normal) exit.
+     * This is empty release build version.
+     */
+    #define VPBK_DEBUG_TEST_INVARIANT_ON_ENTRY_AND_EXIT
+
+#endif
+
+// CLASS DECLARATION
+
+/**
+ * Helper class for calling class invariant automatically on function
+ * entry and exit.
+ */
+template<class T>
+class TPbkDebugCallInvariantOnEntryAndExit
+    {
+    public:
+        /**
+     * Constructor.
+     * @param aObj object
+     */
+    inline TPbkDebugCallInvariantOnEntryAndExit(const T* aObj)
+        : iObj(aObj)
+        {
+        iObj->__DbgTestInvariant();
+        }
+
+    /**
+     * Destructor
+     */
+    inline ~TPbkDebugCallInvariantOnEntryAndExit()
+        {
+        iObj->__DbgTestInvariant();
+        }
+
+private: // data
+    /// Ref: the object
+    const T* iObj;
+    };
+
+#endif // VPBKDEBUG_ENTRYANDEXIT_H
+
+// End of File