diff -r 6ca72c0fe49a -r a941bc465d9f wvuing/Inc/IMPSCommonUiDebugPrint.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/Inc/IMPSCommonUiDebugPrint.h Wed Sep 01 12:31:13 2010 +0100 @@ -0,0 +1,331 @@ +/* +* Copyright (c) 2004 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 tools. Uniforms style to write debug data. +* +*/ + + +/** +* Logging tools. Uniforms style to write debug data to +* screen using RDebug or to a file with RFileLogger. +* +* Usage: +* 1.Configuring: +* +* Logging and debug printing is configured with following macros +* IMPSCUI_ENABLE_DEBUG_PRINT (defining this enables debug printing) +* IMPSCUI_DEBUG_OUTPUT_TO_FILE (debug printing goes to file) +* +* Debug printing can be configured on project level by defining desired +* macros in .mmp file like this +* //enable file logging +* MACRO IMPSCUI_ENABLE_DEBUG_PRINT +* MACRO IMPSCUI_DEBUG_OUTPUT_TO_FILE +* +* You may also automate the debug printing to follow current build +* variant like this: +* #ifdef _DEBUG +* MACRO IMPSCUI_ENABLE_DEBUG_PRINT +* #endif // _DEBUG +* +* When using debug printing to file, flogger.lib needs to be added in +* mmp file +* LIBRARY flogger.lib +* and following directory must be manually done before loggin +* (no directory, no logs) Epoc32\Wins\c\logs\IMPSCUI\ +* +* +* 2.Printing: +* // normal string output: +* IMPSCUI_DP( D_IMPSCUI_LIT( "Some text." ) ); >> IMPSCUI: Some text. +* IMPSCUI_DP_TXT( "Some text."); >> IMPSCUI: Some text. +* +* // string with variables +* TInt index( 99 ); +* _LIT( KExample, "Example" ); +* IMPSCUI_DP( D_IMPSCUI_LIT( "Some text: %d" ), 100 ); >> IMPSCUI: Some text: 100 +* IMPSCUI_DP( D_IMPSCUI_LIT( "Some text: %d" ), index ); >> IMPSCUI: Some text: 99 +* IMPSCUI_DP( D_IMPSCUI_LIT( "Some text: %S" ), &KExample ); >> IMPSCUI: Some text: Example +* +*/ +#ifndef __IMPSCUIDEBUGPRINT_H__ +#define __IMPSCUIDEBUGPRINT_H__ +#include "IMPSCommonUiProjectDefinitionMacros.h" + + +// Define macro below to enable the thread name in debug prints +#define IMPSCUI_DEBUG_STR_USE_THREAD_NAME + + +// Debug logging is enabled, you may enable debug printing in release builds also +#ifdef IMPSCUI_ENABLE_DEBUG_PRINT +// no include files if no debug printing --> faster compile time +// INCLUDES +#include +#include +#include + +#ifndef _DEBUG +// warn in release build!! +#if defined(__VC32__) +// Code scanner warning use of #pragma message (Id: 68) ignored +// because we want this message if debug printing is on in release build +#pragma message( "Warning: IMPSCommonUi Debug Printing is _ON_ in release build!" ) // CSI: 68 # See above +#else // __GCC32__ +#warning "IMPSCommonUi Debug Printing is _ON_ in release build!" +#endif // __VC32__ +#endif + +/** + * Depending if the build is UNICODE or not, define the + * helper macros that insert IMPSCUI prefix. + */ +#ifdef _UNICODE +#define IMPSCUI_TOKEN_PASTING(s) L##s +#define IMPSCUI_TO_UNICODE(s) IMPSCUI_TOKEN_PASTING(s) +#define IMPSCUI_DEBUG_STR(m) IMPSCUI_TO_UNICODE("IMPSCUI: ") L##m +#else +#define IMPSCUI_DEBUG_STR "IMPSCUI: " +#endif // _UNICODE + + +#ifdef IMPSCUI_DEBUG_STR_USE_THREAD_NAME +/** + * Helper macro for defining debug strings with plain debug text. + * When we use thread name, we don't need "IMPSCUI:" prefix + */ +#define D_IMPSCUI_LIT(s) _L(s) // CSI: 78 # We need to use _L here +#else +/** + * Helper macro for defining debug strings with "IMPSCUI:" prefix. + */ +#define D_IMPSCUI_LIT(s) TPtrC((const TText *) IMPSCUI_DEBUG_STR(s)) +#endif // IMPSCUI_DEBUG_STR_USE_THREAD_NAME + + + +/*************************************************************************** + * Debug prints to file + ***************************************************************************/ +#ifdef IMPSCUI_DEBUG_OUTPUT_TO_FILE +/** + * Method to handle file writing + */ +_LIT( KIMPSCUIDebugOutputDir, "IMPSCUI" ); +_LIT( KIMPSCUIDebugOutputFileName, "IMPSCUI.log" ); +inline void IMPSCUIDebugWriteFormat( TRefByValue aFmt, ... ) + { + //Use RFileLogger to write log - no time and date + RFileLogger logger; + logger.Connect(); + //use date, use time + logger.SetDateAndTime( EFalse, ETrue ); + logger.CreateLog( KIMPSCUIDebugOutputDir, + KIMPSCUIDebugOutputFileName, + EFileLoggingModeAppend ); + + TBuf< 256 > buffer; +#ifdef IMPSCUI_DEBUG_STR_USE_THREAD_NAME + { + buffer.Append( _L( "[" ) ); // CSI: 78 # We need to use _L here + buffer.Append( RThread().Name() ); + buffer.Append( _L( "] " ) ); // CSI: 78 # We need to use _L here + } +#endif // IMPSCUI_DEBUG_STR_USE_THREAD_NAME + + { + VA_LIST list; + VA_START ( list, aFmt ); + TBuf< 300 > formatted; + formatted.FormatList( aFmt, list ); + buffer.Append( formatted.Left( buffer.MaxLength() - buffer.Length() ) ); + } + + logger.Write( buffer ); + logger.CloseLog(); + logger.Close(); + } + +/** + * Actual debug printters. + * Output to log file. + */ +#define IMPSCUI_DP IMPSCUIDebugWriteFormat +#define IMPSCUI_DP_TXT(s) IMPSCUIDebugWriteFormat( D_IMPSCUI_LIT(s) ) + + + + +/*************************************************************************** + * Debug prints to debug output + ***************************************************************************/ +#else +inline void IMPSCUIDebugWriteFormat( TRefByValue aFmt, ... ) + { + TBuf< 256 > buffer; +#ifdef IMPSCUI_DEBUG_STR_USE_THREAD_NAME + { + buffer.Append( _L( "[" ) ); // CSI: 78 # We need to use _L here + buffer.Append( RThread().Name() ); + buffer.Append( _L( "] " ) ); // CSI: 78 # We need to use _L here + } +#endif // IMPSCUI_DEBUG_STR_USE_THREAD_NAME + + { + VA_LIST list; + VA_START ( list, aFmt ); + TBuf< 300 > formatted; + formatted.FormatList( aFmt, list ); + buffer.Append( formatted.Left( buffer.MaxLength() - buffer.Length() ) ); + } + //prevent crashing if buffer has format directives + RDebug::Print( _L( "%S" ), &buffer ); + } + +/** + * Actual debug printters. + * Output to debugger output. + */ +#define IMPSCUI_DP IMPSCUIDebugWriteFormat +#define IMPSCUI_DP_TXT(s) IMPSCUIDebugWriteFormat( D_IMPSCUI_LIT(s) ) +#endif + + + +#else //IMPSCUI_ENABLE_DEBUG_PRINT + +/** + * + * Empty implementations for non-debug printing build versions. + * + */ + +/** + * Dummy struct for checking that all IMPSCUI_DP's define string + * literals using space-saving D_IMPSCUI_LIT. + */ +struct TIMPSCUIEmptyDebugString { }; + +/** + * Macro for defining debug-only literal strings (empty release version) + */ +#define D_IMPSCUI_LIT(s) TIMPSCUIEmptyDebugString() + +/** + * Macro for empty debug print function + */ +#define IMPSCUI_DP_TXT(s) IMPSCUI_DP( D_IMPSCUI_LIT(s) ) + + +/// Empty debug print function for release builds. +inline void IMPSCUI_DP( TIMPSCUIEmptyDebugString ) + { + } + +template +inline void IMPSCUI_DP( TIMPSCUIEmptyDebugString, T1 ) + { + } + +template +inline void IMPSCUI_DP( TIMPSCUIEmptyDebugString, T1, T2 ) + { + } + +template +inline void IMPSCUI_DP( TIMPSCUIEmptyDebugString, T1, T2, T3 ) + { + } + +template +inline void IMPSCUI_DP( TIMPSCUIEmptyDebugString, T1, T2, T3, T4 ) + { + } + +template +inline void IMPSCUI_DP( TIMPSCUIEmptyDebugString, T1, T2, T3, T4, T5 ) + { + } + +template +inline void IMPSCUI_DP( TIMPSCUIEmptyDebugString, T1, T2, T3, T4, T5, T6 ) + { + } + +template +inline void IMPSCUI_DP( TIMPSCUIEmptyDebugString, T1, T2, T3, T4, T5, T6, T7 ) + { + } + +template +inline void IMPSCUI_DP( TIMPSCUIEmptyDebugString, T1, T2, T3, T4, T5, T6, T7, T8 ) + { + } + + +#endif // IMPSCUI_ENABLE_DEBUG_PRINT + +/* Some general wrappers to IMPSCUI_DP for convenience. + * + * Since these just wrap IMPSCUI_DP, they work transparently: the macros write + * stuff to debug output or to a file, whichever you are using, + * you don't have to care. + * + * Since IMPSCUI_DP is either defined or empty inline, these won't + * matter in either build (no, there is no noticeable penalty in compile time) + * + * There are three types of wrappers, output format is + * + * "filename:linenumber method - enter" when entering function + * "filename:linenumber method - message" when inside function + * "filename:linenumber method - done" when exiting function + * + * Example: + * TInt CSomeClass::SomeMethod() + * { + * IMPSCUI_DP_FUNC_ENTER("SomeMethod"); + * + * TInt i = 41; + * + * IMPSCUI_DP_FUNC_DP("SomeMethod", "Doing intensive calculations"); + * + * i++; + * + * IMPSCUI_DP_FUNC_DONE("SomeMethod"); + * } + * + * You have to provide the method name yourself since the __FUNCTION__ + * preprocessor macro is not understood. + */ + +// workaround 8-bit string to 16-bit unicode +#define WIDEN2(x) L ## x +#define WIDEN(x) WIDEN2(x) +#define __WFILE__ WIDEN(__FILE__) + +// when entering a function +#define IMPSCUI_DP_FUNC_ENTER(method) \ + IMPSCUI_DP( D_IMPSCUI_LIT("%s:%d %s - enter"), __WFILE__, __LINE__, L ## method ); + +// debug print +#define IMPSCUI_DP_FUNC_DP(method,msg) \ + IMPSCUI_DP( D_IMPSCUI_LIT("%s:%d %s - %s"), __WFILE__, __LINE__, L ## method, L ## msg ); + +// when exiting a function +#define IMPSCUI_DP_FUNC_DONE(method) \ + IMPSCUI_DP( D_IMPSCUI_LIT("%s:%d %s - done"), __WFILE__, __LINE__, L ## method ); + +#endif // __IMPSCUIDEBUGPRINT_H__ + +// End of File