upnpframework/inc/upnplog.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:52:00 +0200
changeset 0 7f85d04be362
child 38 5360b7ddc251
permissions -rw-r--r--
Revision: 200947 Kit: 200951

/*
* 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:  log/assert facility of upnp framework
*
*/


// **************************************************************************
// *
// *  HOW TO USE THIS LOGGING FACILITY
// *
// * 1. enable log facility in the code.
// *     _LIT( KComponentLogfile, "component.txt");
// *     #include "upnplog.h"
// *
// * 2. have flogger in mmp-file
// *     DEBUGLIBRARY FLOGGER.LIB
// *
// * 3. use the log interface in the source
// *     __LOG( char* strz )
// *     __LOG1( char* strz, p1 )
// *     __LOG2( char* strz, p1, p2 )
// *     __LOG3( char* strz, p1, p2, p3 )
// *     __LOG8( const TDesC8& msg )
// *     __LOG16( const TDesC16& msg )
// *     __ASSERTD( test, file, line )
// *     __ASSERT( test, file, line )
// *     __PANICD( file, line )
// *     __PANIC( file, line )
// *
// * 4. The default logging/assertion modes are following:
// *     DEBUG build:    log to console, assertion mode on.
// *     RELEASE build:  log turned off, assertion mode off.
// *     To override this preset, you can use following macros:
// *     MACRO __UPNP_LOG_FILE          (logging to file)
// *     MACRO __UPNP_LOG_CONSOLE       (logging to console)
// *     MACRO __UPNP_LOG_OFF           (logging turned off in DEBUG build)
// *     MACRO __UPNP_DEBUG_ASSERT      (enable D-panic and D-assert)
// *     MACRO __UPNP_DEBUG_ASSERT_OFF  (disable D-panic and D-assert)
// *     in case of using logging in RELEASE build, remember to switch
// *     LIBRARY FLOGGER.LIB instead of DEBUGLIBRARY.
// *
// **************************************************************************


#ifndef __UPNPLOG_H__
#define __UPNPLOG_H__


#include <e32std.h>


// in DEBUG build activate the default modes
#ifdef _DEBUG

    #if !( defined(__UPNP_LOG_FILE) || \
        defined(__UPNP_LOG_CONSOLE) || \
        defined(__UPNP_LOG_OFF) )
        // activate default logging mode
        #define __UPNP_LOG_CONSOLE
    #endif

    #if !( defined(__UPNP_DEBUG_ASSERT) || \
        defined(__UPNP_DEBUG_ASSERT_OFF) )
        // activate debug assertion mode
        #define __UPNP_DEBUG_ASSERT
    #endif

#endif //_DEBUG


// this dummy function is to avoid compiler warning #177-D:
// variable was declared but never referenced
inline void __Dummy_KComponentLogfile()
    {
    TUint16 c = KComponentLogfile().Size();
    c = 0;
    }

//
// **************************************************************************
// LOGGING MACROS
// **************************************************************************
//

#if defined(__UPNP_LOG_FILE)

    #include <flogger.h>

    // Subdirectory under c:\logs -directory
    _LIT( KLogDir, "upnpframework" );

    #define __LOG( strz ) Print16(_L(strz))
    #define __LOG1( strz,p1 ) Print16(_L(strz),p1)
    #define __LOG2( strz,p1,p2 ) Print16(_L(strz),p1,p2)
    #define __LOG3( strz,p1,p2,p3 ) \
        Print16(_L(strz),p1,p2,p3)
    #define __LOG8( msg ) Print8( _L8( "%S" ), &msg )
    #define __LOG16( msg ) Print16( _L16( "%S" ), &msg )
    #define __LOG8_1( strz,p1 ) Print8(_L8(strz),p1)

    // Writes a log text to a file using file logger
    inline void Print16( const TRefByValue<const TDesC> aFmt, ... )
        {
        VA_LIST list;
        VA_START(list,aFmt);
        RFileLogger::WriteFormat( KLogDir, KComponentLogfile,
            EFileLoggingModeAppend, aFmt, list );
        VA_END( list );
        }    

        // Writes a log text to a file using file logger
    inline void Print8( const TRefByValue<const TDesC8> aFmt, ... )
        {
        VA_LIST list;
        VA_START(list,aFmt);
        RFileLogger::WriteFormat( KLogDir, KComponentLogfile,
            EFileLoggingModeAppend, aFmt, list );
        VA_END( list );
        }

#elif defined(__UPNP_LOG_CONSOLE)

    #include <f32file.h>

    #define __LOG( strz ) RDebug::Print(_L(strz))
    #define __LOG1( strz,p1 ) RDebug::Print(_L(strz),p1)
    #define __LOG2( strz,p1,p2 ) RDebug::Print(_L(strz),p1,p2)
    #define __LOG3( strz,p1,p2,p3 ) \
        RDebug::Print(_L(strz),p1,p2,p3)
    #define __LOG8( msg ) Debug8(msg)
    #define __LOG16( msg ) RDebug::Print(msg)
    #define __LOG8_1( strz,p1 ) RDebug::Printf(strz, p1)

    inline void Debug8( const TDesC8& aMsg )
        {
        __Dummy_KComponentLogfile();
        RDebug::RawPrint( aMsg );
        }

#else // __UPNP_LOG_OFF

    #define __LOG( strz ) __Dummy_KComponentLogfile();
    #define __LOG1( fmt,p1 ) __Dummy_KComponentLogfile();
    #define __LOG2( fmt,p1,p2 ) __Dummy_KComponentLogfile();
    #define __LOG3( fmt,p1,p2,p3 ) __Dummy_KComponentLogfile();
    #define __LOG8( msg ) __Dummy_KComponentLogfile();
    #define __LOG16( msg ) __Dummy_KComponentLogfile();
    #define __LOG8_1( strz,p1 ) __Dummy_KComponentLogfile();

#endif // __UPNP_LOG_FILE || __UPNP_LOG_CONSOLE || __UPNP_LOG_OFF


//
// **************************************************************************
// ASSERTION MACROS
// **************************************************************************
//

#define __ASSERT( test, file, line ) \
    if( !( test ) ) \
        { \
        __LOG2( "Assertion failed: %s %d", \
            file, line ); \
        User::Panic( _L(file), line ); \
        }

#define __PANIC( file, line ) \
    { \
    __LOG2( "Panic: %s %d", \
        file, line ); \
    User::Panic( _L(file), line ) \
    }

#ifdef __UPNP_DEBUG_ASSERT

    #define __ASSERTD( test, file, line ) \
        if( !( test ) ) \
            { \
            __LOG2( "Assertion failed: %s %d", \
                file, line ); \
            User::Panic( _L(file), line ); \
            }

    #define __PANICD( file, line ) \
        { \
        __LOG2( "Panic: %s %d", \
            file, line ); \
        User::Panic( _L(file), line ); \
        }

#else // __UPNP_DEBUG_ASSERT_OFF

    #define __ASSERTD( test, file, line )
    #define __PANICD( file, line )

#endif // __UPNP_DEBUG_ASSERT || __UPNP_DEBUG_ASSERT_OFF



#endif // __UPNPLOG_H__