wlanutilities/wlansniffer/inc/wsflogger.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:20:32 +0100
branchRCL_3
changeset 55 f28ada11abbf
parent 0 56b72877c1cb
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201029 Kit: 201035

/*
* Copyright (c) 2007-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:  Class header for CWsfModel
*
*/

#ifndef WSFLOGGER_H
#define WSFLOGGER_H


#ifdef _DEBUG
#define USE_WSFLOGGER
#endif


#ifdef USE_WSFLOGGER

// undef this if you want logs into file
#define WSFLOGGER_LOGGING_METHOD_RDEBUG

//  EXTERNAL INCLUDES
#include <flogger.h>
#include <e32debug.h>


//  CONSTANTS
_LIT( KLogDir,                  "Sniffer" );
_LIT( KLogFile,                 "Sniffer.txt" );
_LIT( KLogBanner,               "Sniffer 0.1.0" );
_LIT( KLogEnterFn,              "%04x\t% *S-> %S" );
_LIT( KLogLeaveFn,              "%04x\t% *S<- %S" );
_LIT( KLogExit,                 "Sniffer: Application exit" );
_LIT( KLogFormat,               "%04x\t% *S%S" );


//  CLASS DEFINITION
/**
* Class to log functionentry/exit
*
* Example usage:
*
* @code
* #include "wsflogger.h"
*
* ...
* 
* void MyClass::DoIt() 
*     {
*     LOG_ENTERFN( "MyClass::DoIt" );
*     // doing it...
*     }
*
* @endcode
*
* Since the macros create instances on the stack, the class is destructed when
* the stack is unwound. Thus, if LOG_ENTERFN was called at the highest level 
* within the function then the destructor can detect the exit from the 
* function without the need of an explicit "LOG_LEAVEFN" to each exit point.
*
* Note: the destructor is not called if a leave occurs.
*
* @since S60 5.0
*/
NONSHARABLE_CLASS( CFunctionEntryExit ): public CBase
    {
    public:

        /**
        * Constructor
        * @since S60 5.0
        * @param aFunc Name of the function being entered
        */
        CFunctionEntryExit( TRefByValue<const TDesC> aFunc )
            {
            iFunc.Set( aFunc );

            RThread thread;
            TUint tid = TUint( thread.Id() ) & 0xffff;

#ifndef WSFLOGGER_LOGGING_METHOD_RDEBUG
            RFileLogger::WriteFormat( KLogDir, 
                                      KLogFile, 
                                      EFileLoggingModeAppend, 
                                      KLogEnterFn, 
                                      tid,
                                      4*((tid>>2)&0x3),
                                      &KNullDesC,
                                      &iFunc);
#else
            RDebug::Print( KLogEnterFn, tid,
                           4*((tid>>2)&0x3),
                           &KNullDesC,
                           &iFunc);
#endif
            }
    
        /**
        * Destructor
        * @since S60 5.0
        */
        ~CFunctionEntryExit()
            {
            RThread thread;
            TUint tid = TUint( thread.Id() ) & 0xffff;

#ifndef WSFLOGGER_LOGGING_METHOD_RDEBUG
            RFileLogger::WriteFormat( KLogDir, 
                                      KLogFile, 
                                      EFileLoggingModeAppend, 
                                      KLogLeaveFn, 
                                      tid,
                                      4*((tid>>2)&0x3),
                                      &KNullDesC,
                                      &iFunc);
#else
            RDebug::Print( KLogLeaveFn, 
                           tid,
                           4*((tid>>2)&0x3),
                           &KNullDesC,
                           &iFunc );
#endif
            }

    public:     // data
        /**
        * Function name
        */
        TPtrC iFunc;
    };
       

//  LOG MACROS       
#ifndef WSFLOGGER_LOGGING_METHOD_RDEBUG
// Create/overwrite the log file
#define LOG_CREATE                                                      \
            {                                                           \
            TFileName path( _L( "c:\\logs\\" ) );                       \
            path.Append( KLogDir );                                     \
            path.Append( _L( "\\" ) );                                  \
            RFileLogger::WriteFormat( KLogDir, KLogFile,                \
                           EFileLoggingModeOverwrite, KLogBanner );     \
            }


// Close the log
#define LOG_DELETE                                                      \
            RFileLogger::Write( KLogDir, KLogFile,                      \
                           EFileLoggingModeAppend, KLogExit );          \


// Place a function entry/exit watchdog            
#define LOG_ENTERFN(a)                                                  \
            CFunctionEntryExit entryExit( _L(a) );


// Write a solid string to the log
#define LOG_WRITE(a)                                                    \
            {                                                           \
            _LIT( temp, a );                                            \
            RThread thread;                                             \
            TUint tid = TUint( thread.Id() ) & 0xffff;                  \
            TBuf<5+12+sizeof(L##a)/2-1> buf;                            \
            buf.Format( KLogFormat,                                     \
                        tid, 4*((tid>>2)&0x3), &KNullDesC, &temp );     \
            RFileLogger::Write( KLogDir, KLogFile,                      \
                                EFileLoggingModeAppend, buf );          \
            }
            

// Write a formatted string to the log
#define LOG_WRITEF(a, s...)                                             \
            {                                                           \
            _LIT( temp, a );                                            \
            RThread thread;                                             \
            TUint tid = TUint( thread.Id() ) & 0xffff;                  \
            TBuf<5+12+sizeof(L##a)/2-1> buf;                            \
            buf.Format( KLogFormat,                                     \
                        tid, 4*((tid>>2)&0x3), &KNullDesC, &temp );     \
            RFileLogger::WriteFormat( KLogDir, KLogFile,                \
                        EFileLoggingModeAppend, buf, s );               \
            }

#else // WSFLOGGER_LOGGING_METHOD_RDEBUG

// Create/overwrite the log file
#define LOG_CREATE                                                      \
            RDebug::Print(_L("%S"), &KLogBanner);


// Close the log
#define LOG_DELETE                                                      \
            RDebug::Print(_L("%S"), &KLogExit);


// Place a function entry/exit watchdog            
#define LOG_ENTERFN(a)                                                  \
            CFunctionEntryExit entryExit( _L(a) );


// Write a solid string to the log
#define LOG_WRITE(a)                                                    \
            {                                                           \
            _LIT( temp, a );                                            \
            RThread thread;                                             \
            TUint tid = TUint( thread.Id() ) & 0xffff;                  \
            TBuf<5+12+sizeof(L##a)/2-1> buf;                            \
            buf.Format( KLogFormat,                                     \
                        tid, 4*((tid>>2)&0x3), &KNullDesC, &temp );     \
            RDebug::Print(buf);                                         \
            }
            

// Write a formatted string to the log
#define LOG_WRITEF(a, s...)                                             \
            {                                                           \
            _LIT( temp, a );                                            \
            RThread thread;                                             \
            TUint tid = TUint( thread.Id() ) & 0xffff;                  \
            TBuf<5+12+sizeof(L##a)/2-1> buf;                            \
            buf.Format( KLogFormat,                                     \
                        tid, 4*((tid>>2)&0x3), &KNullDesC, &temp );     \
            RDebug::Print( buf, s);                                     \
            }

#endif // WSFLOGGER_LOGGING_METHOD_RDEBUG


#else // _DEBUG


#define LOG_CREATE
#define LOG_DELETE
#define LOG_ENTERFN(a)
#define LOG_WRITE(a)
#define LOG_WRITEF(a, s...)


#endif // _DEBUG




#endif // WSFLOGGER_H


// End of File