wvsettings20/group/IMPSSAPSettingsStoreDebugPrint.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:41:52 +0200
changeset 0 094583676ce7
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2003 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 to
*                screen using RDebug or to a file with RFileLogger.
*
*/



/*
*
*  Description:
*
*     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
*           SSS_ENABLE_DEBUG_PRINT         (defining this enables debug printing)
*           SSS_DEBUG_OUTPUT_TO_FILE       (now debug printing goes to file)
*           SSS_DEBUG_FILENAME "Some.log"  (file to store debug log)
*
*       Debug printing can be configured on project level by defining desired
*       macros in .mmp file like this
*           //enable file logging
*           MACRO SSS_ENABLE_DEBUG_PRINT
*           MACRO SSS_DEBUG_OUTPUT_TO_FILE
*
*       You may also automate the debug printing to follow current build
*       variant like this:
*           #ifdef _DEBUG
*           MACRO SSS_ENABLE_DEBUG_PRINT
*           #endif // _DEBUG
*
*       The file to write debug log needs to be defined in file level.
*       (Defining it in mmp file causes errors to build procedure..)
*           #define SSS_DEBUG_FILENAME "Example.log"
*
*       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, not logs).
*           Epoc32\Wins\c\logs\SSS\
*
*
*     2.Printing:
*
*       // normal string                                  output:
*       SSS_DP( D_SSS_LIT("Some text.") );                 >> SSS: Some text.
*       SSS_DP( D_PLAIN_LIT("Some text.") );               >> Some text.
*       SSS_DP_TXT("Some text.");                          >> SSS: Some text.
*
*       // string with variables
*       TInt index( 99 );
*       _LIT( KExample, "Example" );
*       SSS_DP( D_SSS_LIT("Some text: %d"), 100 );         >> SSS: Some text: 100
*       SSS_DP( D_SSS_LIT("Some text: %d"), index );       >> SSS: Some text: 99
*       SSS_DP( D_SSS_LIT("Some text: %S"), &KExample );   >> SSS: Some text: Example
*
*       SSS_DP( D_PLAIN_LIT("Some text: %d"), 100 );       >> Some text: 100
*       SSS_DP( D_PLAIN_LIT("Some text: %d"), index );     >> Some text: 99
*       SSS_DP( D_PLAIN_LIT("Some text: %S"), &KExample ); >> Some text: Example
*/


#ifndef __SSSDEBUGPRINT_H__
#define __SSSDEBUGPRINT_H__
#include "IMPSSAPSettingsStoreDebugDefinitionMacros.h"


// Debug logging is enabled, you may enable debug printing in release builds also
#ifdef SSS_ENABLE_DEBUG_PRINT

// no include files if no debug printing --> faster compile time
// INCLUDES
#include <e32std.h>
#include <e32svr.h>
#include <flogger.h>

#ifndef _DEBUG
// warn in release build!!
#if defined(__VC32__)
#pragma message( "Warning: SSS debug printing is on in release build!" ) // CSI: 68 #
#else // __GCC32__
#warning "SSS debug printing is on in release build!"
#endif // __VC32__
#endif

/**
 * Depending if the build is UNICODE or not, define the
 * helper macros that insert SSS prefix.
 */
#ifdef _UNICODE
#define SSS_TOKEN_PASTING(s) L##s
#define SSS_TO_UNICODE(s) SSS_TOKEN_PASTING(s)
#define SSS_DEBUG_STR(m) SSS_TO_UNICODE("SSS: ") L##m
#else
#define SSS_DEBUG_STR "SSS: "
#endif // _UNICODE


/**
 * Helper macro for defining debug strings with plain debug text.
 */
#define D_PLAIN_LIT(s) _L(s)	// CSI: 78 #


/**
 * Helper macro for defining debug strings with "SSS:" prefix.
 */
#define D_SSS_LIT(s) TPtrC((const TText *) SSS_DEBUG_STR(s))



#ifdef SSS_DEBUG_OUTPUT_TO_FILE

/**
 * Method to handle file writing
 */
inline void SSSDebugWriteFormat( TRefByValue<const TDesC> aFmt, ... )
    {
    _LIT( KDir, "SSS" );
#ifdef SSS_DEBUG_FILENAME
    const static TLitC < sizeof( SSS_DEBUG_FILENAME ) > KName = {sizeof( SSS_DEBUG_FILENAME ) - 1, SSS_TO_UNICODE( SSS_DEBUG_FILENAME ) };
#else
    _LIT( KName, "SSSDebug.log" );
#endif // SSS_DEBUG_FILENAME

    //Use RFileLogger to write log - no time and date
    RFileLogger logger;
    logger.Connect();
    //use date, use time
    logger.SetDateAndTime( EFalse, ETrue );
    logger.CreateLog( KDir, KName, EFileLoggingModeAppend );

    // take the ellipsis parameters
    VA_LIST args;
    VA_START( args, aFmt );
    logger.WriteFormat( aFmt, args );
    VA_END( args );
    logger.CloseLog();
    logger.Close();
    }

/**
 * Actual debug printters.
 * Output to log file.
 */
#define SSS_DP SSSDebugWriteFormat
#define SSS_DP_TXT(s) SSSDebugWriteFormat( D_SSS_LIT(s) )



#else
/**
 * Debug prints to debug output
 */
inline void SSSDebugWriteFormat( TRefByValue<const TDesC> aFmt, ... )
    {
    TBuf< 256 > buffer;
    _LIT( KOpenSqBr, "[" );
    _LIT( KCloseSqBr, "] " );

    buffer.Append( KOpenSqBr );

#if defined(__WINS__)
    buffer.Append( RThread().Name() );
#else
    buffer.Append( RProcess().Name() );
#endif

    buffer.Append( KCloseSqBr );
        {
        VA_LIST list;
        VA_START ( list, aFmt );
        TBuf< 300 > formatted;
        formatted.FormatList( aFmt, list );
        buffer.Append( formatted.Left( buffer.MaxLength() - buffer.Length() ) );
        }

    RDebug::Print( _L( "%S" ), &buffer ); //handle format directives correctly
    }

/**
 * Actual debug printters.
 * Output to debugger output.
 */
#define SSS_DP SSSDebugWriteFormat
#define SSS_DP_TXT(s) SSSDebugWriteFormat( D_SSS_LIT(s) )
#endif


#else   //SSS_ENABLE_DEBUG_PRINT

/**
 *
 * Empty implementations for non-debug printing build versions.
 *
 */

/**
 * Dummy struct for checking that all SSS_DP's define string
 * literals using space-saving D_PLAIN_LIT or D_SSS_LIT.
 */
struct TSSSEmptyDebugString { };

/**
 * Macro for defining debug-only literal strings (empty release version)
 */
#define D_PLAIN_LIT(s) TSSSEmptyDebugString()

/**
 * Macro for defining debug-only literal strings (empty release version)
 */
#define D_SSS_LIT(s) TSSSEmptyDebugString()

/**
 * Macro for empty debug print function
 */
#define SSS_DP_TXT(s) SSS_DP( D_SSS_LIT(s) )


/// Empty debug print function for release builds.
inline void SSS_DP( TSSSEmptyDebugString )
    {
    }

template<class T1>
inline void SSS_DP( TSSSEmptyDebugString, T1 )
    {
    }

template<class T1, class T2>
inline void SSS_DP( TSSSEmptyDebugString, T1, T2 )
    {
    }

template<class T1, class T2, class T3>
inline void SSS_DP( TSSSEmptyDebugString, T1, T2, T3 )
    {
    }

template<class T1, class T2, class T3, class T4>
inline void SSS_DP( TSSSEmptyDebugString, T1, T2, T3, T4 )
    {
    }

template<class T1, class T2, class T3, class T4, class T5>
inline void SSS_DP( TSSSEmptyDebugString, T1, T2, T3, T4, T5 )
    {
    }

template<class T1, class T2, class T3, class T4, class T5, class T6>
inline void SSS_DP( TSSSEmptyDebugString, T1, T2, T3, T4, T5, T6 )
    {
    }

template<class T1, class T2, class T3, class T4, class T5, class T6, class T7>
inline void SSS_DP( TSSSEmptyDebugString, T1, T2, T3, T4, T5, T6, T7 )
    {
    }

template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>
inline void SSS_DP( TSSSEmptyDebugString, T1, T2, T3, T4, T5, T6, T7, T8 )
    {
    }


#endif  // SSS_ENABLE_DEBUG_PRINT
#endif  // __SSSDEBUGPRINT_H__


//  End of File