hti/HtiServicePlugins/HtiIpProxyServicePlugin/IPProxyEngine/Src/DebugPrint.h
branchRCL_3
changeset 59 8ad140f3dd41
parent 0 a03f92240627
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hti/HtiServicePlugins/HtiIpProxyServicePlugin/IPProxyEngine/Src/DebugPrint.h	Wed Oct 13 16:17:58 2010 +0300
@@ -0,0 +1,230 @@
+/*
+* Copyright (c) 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:  Debugging support
+*
+*/
+
+
+/*
+Idea:
+
+    Logging tool for developers, uniform style to write debug log to RDebug or to a File
+
+Usage:
+
+    Configuring:
+     - add to .mmp file
+        // define logging on and logging into file, file must be defined in code
+        // the macros can also be in a header file
+        // and inside ifdef if printing wanted in debug builds
+        MACRO ENABLE_DEBUG_PRINT
+        MACRO DEBUG_OUTPUT_TO_FILE
+        // this library is needed for the file logging, remove if/when not using
+        LIBRARY flogger.lib
+
+        Alternatively you may enable debug print in a header with:
+        #ifdef _DEBUG // comment this if you want logging in release build
+        #define ENABLE_DEBUG_PRINT
+        #define DEBUG_OUTPUT_TO_FILE
+        #endif // _DEBUG
+
+     - make a directory: Epoc32\Wins\c\logs\hti\
+
+    Enabling:
+     - in some source header
+        // log file name if using file logging
+        #define DEBUG_FILENAME "Example.log"
+        // include the printing macros
+        #include "DebugPrint.h"
+
+    Printing:
+
+        // normal string
+        DEBUG_PRINT( DEBUG_STRING( "Debug Print" ) );
+        // string with variables
+        DEBUG_PRINT( DEBUG_LINE( "Debug Print %d" ), 100 );
+        TInt index( 100 );
+        DEBUG_PRINT( DEBUG_STRING( "Debug Print %d" ), index );
+
+        // DEBUG_LINE automatically adds filename and linenumber to output
+        _LIT( KDebugPrintExample, "Example" );
+        DEBUG_PRINT( DEBUG_LINE( "Debug Print %S" ), &KDebugPrintExample );
+
+Known issues:
+
+    - If you use macros from .mmp file remember to abld makefile <target> to change flags from project
+    - Using lots of DEBUG_LINE macros slows down compiling due to excessive preprocessing
+
+Ideas & further development:
+
+    - make rdebug and file logging work simultaneously, currently not possible
+    - enable optional run-time configuring of debug info writing
+
+*/
+
+#ifndef __DEBUGPRINT_H__
+#define __DEBUGPRINT_H__
+
+// Debug logging is enabled, you may enable debug printing in release builds also
+#ifdef ENABLE_DEBUG_PRINT
+
+    // warn if this is a release build!!
+    #ifndef _DEBUG
+        #if defined(__VC32__)
+            #pragma message( "Warning: debug printing is on in release build!" )
+        #else // __GCC32__
+            #warning "debug printing is on in release build!"
+        #endif // __VC32__
+    #endif
+
+// no include files if no debug printing --> faster compile time
+// INCLUDES
+#include <e32std.h>
+#include <e32svr.h>
+#include <flogger.h>
+
+    /**
+     * Depending if the build is UNICODE or not, define the
+     * helper macros that display the source code filename and
+     * linenumber as a part of the debug message.
+     */
+    #ifdef _UNICODE
+        #define STRINGIZE(l) L#l
+        #define TO_NUMBER(l) STRINGIZE(l)
+        #define TOKEN_PASTING(s) L##s
+        #define TO_UNICODE(s) TOKEN_PASTING(s)
+        #define DEBUG_STR(m) TO_UNICODE(__FILE__) L"(" TO_NUMBER(__LINE__) L") : " L##m
+    #else
+        #define STRINGIZE(l) #l
+        #define TO_NUMBER(l) STRINGIZE(l)
+        #define DEBUG_STR __FILE__ "(" TO_NUMBER(__LINE__) ") : "
+    #endif // _UNICODE
+
+    /**
+     * Helper macro for defining debug strings with just the debug text.
+     */
+    #define DEBUG_STRING(s) _L(s)
+
+    /**
+     * Helper macro for defining debug string with filename and linenumber.
+     */
+    #define DEBUG_LINE(s) TPtrC((const TText *) DEBUG_STR(s))
+
+    #ifdef DEBUG_OUTPUT_TO_FILE
+
+        /**
+         * Method to handle file writing
+         */
+        inline void DebugWriteFormat(TRefByValue<const TDesC> aFmt,...)
+            {
+            _LIT(KDir, "hti");
+            #ifdef DEBUG_FILENAME
+                const static TLitC<sizeof(DEBUG_FILENAME)> KName={sizeof(DEBUG_FILENAME)-1, TO_UNICODE( DEBUG_FILENAME ) };
+            #else
+                _LIT(KName, "DebugOutput.log" );
+            #endif // DEBUG_FILENAME
+
+            // take the ellipsis parameters
+            VA_LIST args;
+            VA_START(args,aFmt);
+            RFileLogger::WriteFormat( KDir, KName, EFileLoggingModeAppend, aFmt, args );
+            VA_END(args);
+            }
+
+        /**
+         * Output to log file
+         */
+        #define DEBUG_PRINT DebugWriteFormat
+
+    #else
+        /**
+         * Output to debugger output
+         */
+        #define DEBUG_PRINT RDebug::Print
+    #endif
+
+#else   // ENABLE_DEBUG_PRINT
+
+    /**
+     * Dummy struct for checking that all DEBUG_PRINT's define string
+     * literals using space-saving DEBUG_STRING.
+     */
+    struct TEmptyDebugString { };
+
+    /**
+     * Macro for defining debug-only literal strings (empty release version)
+     */
+    #define DEBUG_STRING(s) TEmptyDebugString()
+
+    /**
+     * Macro for defining debug-only literal strings (empty release version)
+     */
+    #define DEBUG_LINE(s) TEmptyDebugString()
+
+    /// Empty debug print function for release builds.
+    inline void DEBUG_PRINT(TEmptyDebugString)
+        {
+        }
+
+    /// Empty debug print function for release builds.
+    template<class T1>
+    inline void DEBUG_PRINT(TEmptyDebugString,T1)
+        {
+        }
+
+    /// Empty debug print function for release builds.
+    template<class T1,class T2>
+    inline void DEBUG_PRINT(TEmptyDebugString,T1,T2)
+        {
+        }
+
+    /// Empty debug print function for release builds.
+    template<class T1,class T2,class T3>
+    inline void DEBUG_PRINT(TEmptyDebugString,T1,T2,T3)
+        {
+        }
+
+    /// Empty debug print function for release builds.
+    template<class T1,class T2,class T3,class T4>
+    inline void DEBUG_PRINT(TEmptyDebugString,T1,T2,T3,T4)
+        {
+        }
+
+    /// Empty debug print function for release builds.
+    template<class T1,class T2,class T3,class T4,class T5>
+    inline void DEBUG_PRINT(TEmptyDebugString,T1,T2,T3,T4,T5)
+        {
+        }
+
+    /// Empty debug print function for release builds.
+    template<class T1,class T2,class T3,class T4,class T5,class T6>
+    inline void DEBUG_PRINT(TEmptyDebugString,T1,T2,T3,T4,T5,T6)
+        {
+        }
+
+    /// Empty debug print function for release builds.
+    template<class T1,class T2,class T3,class T4,class T5,class T6,class T7>
+    inline void DEBUG_PRINT(TEmptyDebugString,T1,T2,T3,T4,T5,T6,T7)
+        {
+        }
+
+    /// Empty debug print function for release builds.
+    template<class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
+    inline void DEBUG_PRINT(TEmptyDebugString,T1,T2,T3,T4,T5,T6,T7,T8)
+        {
+        }
+
+#endif  // ENABLE_DEBUG_PRINT
+
+#endif //  __DEBUGPRINT_H__