locationtriggering/ltlogger/inc/lbtlogger.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 03 May 2010 12:54:42 +0300
changeset 20 82ee1f804b63
parent 0 667063e416a2
permissions -rw-r--r--
Revision: 201015 Kit: 201018

/*
* Copyright (c) 2007 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:  Defines the macros for logging mechanism in LBT
*
*/


#ifndef LBT_LOGGER_H
#define LBT_LOGGER_H

/**
 * To use this logger mechanism you also need to add flogger.lib to the mmp
 * using,
 * DEBUGLIBRARY flogger.lib
 */


/**
 * The trace level is defined as follows,
 * 0x[moduleid - 4digits][logginglevel-4digits],
 * The currently define logginglevels are
 * 0x0001 - Verbose
 * things like entered method, leaving method etc,
 * logs of the parameters to methods, files 
 * that are being used, creating a key, creating a file,
 * opening a resource, 
 *
 * 0x0002 - Warning
 * things like events, error cases that were not processed 
 * but ignored.
 *
 * 0x0003 - Operations 
 * things like what operation started (create, delete), 
 * manipulations to the data structures, important events like
 * MMC card , app uninstall events which we process,
 * current location, triggers being monitored, psy conked off,
 * any other such important event.
 *
 * 0x0004 - Errors
 * log all _ASSERT_DEBUG kind of cases, basically things which 
 * you don't expect to happen but happened - Sounds like paradox ;-)
 * Also log all error cases with this trace level.
 *
 * 0x0005 - Fatal
 * Use this if the server cannot recover from this error and you 
 * have to crash !! ;-)
 *
 * So for a create trigger operation in server the log should be like
 * LBT_TRACE(KLbtLogOperation|KLbtLogServerLogic,"Creating Trigger");
 */
#define KLbtLogLevelMask    0x0000FFFF
 
#define KLbtLogVerbose      0x00000001
#define KLbtLogWarning      0x00000002
#define KLbtLogOperation    0x00000003
#define KLbtLogError        0x00000004
#define KLbtLogFatal        0x00000005

/**
 *
 * Then for the module id lets use
 * 0x0001 - Lbt Client Library
 * 0x0002 - Lbt Server Core
 * 0x0003 - Lbt Server Logic Base
 * 0x0004 - Lbt Server Logic ( ecom plugin )
 * 0x0005 - Lbt Container
 * 0x0006 - Lbt Strategy Plugin api
 * 0x0007 - Lbt Strategy Implementation ( Ecom plugin )
 * 0x0008 - Lbt Movement detector plugin api
 * 0x0009 - Lbt Cell id Movement Detector
 * Did I miss any component ?
 */
#define KLbtLogComponentMask            0xFFFF0000
 
#define KLbtLogClientLib                0x00010000
#define KLbtLogServerCore               0x00020000
#define KLbtLogServerLogicBase          0x00030000
#define KLbtLogServerLogic              0x00040000
#define KLbtLogContainer                0x00050000
#define KLbtLogStrategyPluginApi        0x00060000
#define KLbtLogStrategyEngine           0x00070000
#define KLbtLogMovementDetectorApi      0x00080000
#define KLbtLogCellIdMovementDetector   0x00090000

#ifdef _DEBUG
#define _LBT_DEBUG
#endif // #ifdef _DEBUG

// define _LBT_DEBUG to enable LBT logging
#define _LBT_DEBUG

#ifdef _LBT_DEBUG

#include <flogger.h>
#include <f32file.h>
#include "lbtloggerimpl.h"

_LIT8( KEndOfLineChars, "\r\n");

// CLASS DECLARATION
class TLogFunc
	{
	public:
		TLogFunc(const char aFunctionName[])
			{
			const unsigned char* string = (unsigned char*)(aFunctionName);
			iBuffer.Zero();
			iBuffer.Copy(string);			
			TBuf8<150> buf;
			buf.Zero();
			buf.Append(_L("=>"));
			buf.Append(iBuffer);
			CLbtLoggerImpl* loggerImpl = CLbtLoggerImpl::CreateLogger();
			if( loggerImpl )
			    {
			    RFileLogger& logger = loggerImpl->GetFileLogger();
			    logger.Write( buf );
			    }
			}

		~TLogFunc()
			{
			RThread thread;
			TInt exitReason = thread.ExitReason();
			if(exitReason != KErrNone)
				{
				TExitCategoryName name = thread.ExitCategory();
				TBuf8<400> buf;
				buf.Zero();
				buf.Append(_L("LBT PANICKED : "));
				buf.Append(name);
				
				CLbtLoggerImpl* loggerImpl = CLbtLoggerImpl::CreateLogger();
				if(loggerImpl)
					{
					RFileLogger& logger = loggerImpl->GetFileLogger();				
					logger.Write( buf);
					}
				// The thread has panicked and hence dont print the exit placeholder
				thread.Close();
				return;
				}
			iBuffer.Append(_L("=>"));
			CLbtLoggerImpl* loggerImpl = CLbtLoggerImpl::CreateLogger();
			if(loggerImpl)
				{
				RFileLogger& logger = loggerImpl->GetFileLogger();				
				logger.Write( iBuffer);
				}
			thread.Close();
			}
		
		static void FileName( TDes& aFileNameBuffer )
		    {
		    TTime currTime;
		    currTime.HomeTime();
		    TDateTime dt = currTime.DateTime();
		    
		    _LIT16( filefmt, "%S_%d%d%d_%d%d%d.log" );
		    
		    TBuf<150> logFileName;
		    logFileName.Append( _L("C:\\Logs\\Epos\\lbt_func") );
		    aFileNameBuffer.AppendFormat( filefmt(), &logFileName, dt.Day(), 
		                                dt.Month(), dt.Year(), dt.Hour(), dt.Minute(), dt.Second() );
		    }

		static void FormatTextToBuffer( TDes8& aTrg, const TDesC8& aText )
		    {
		    TTime currTime;
		    currTime.HomeTime();
		    TDateTime dt = currTime.DateTime();
		    _LIT8( dtFmt, "%d/%d/%d %d:%d:%d ");
		    aTrg.AppendFormat( dtFmt(), dt.Day(), dt.Month(), dt.Year(), dt.Hour(), dt.Minute(), dt.Second() );
		    aTrg.Append( aText );
		    aTrg.Append( KEndOfLineChars );
		    }
		
		static void RenameFileIfRequired()
			{
			RFs fs;
		    RFile file;
		    fs.Connect();
		    
			TInt err = file.Open( fs, _L("C:\\Logs\\Epos\\lbt_func.log"), EFileWrite|EFileShareAny );
	        if( KErrNone == err )
	            {
	            // Check Size of file
	            TInt size;
	            file.Size( size );
	            
	            if( size > 1024 )
	                {
	                file.Close();
	                TBuf<200> fileName;
	                FileName( fileName );
	                //BaflUtils::RenameFile( fs, _L("C:\\Logs\\Epos\\lbt.log"), fileName );
	                fs.Rename(_L("C:\\Logs\\Epos\\lbt_func.log"), fileName );
	                }	            
	            }
	        file.Close();
	        fs.Close();
			}

	private:
		TBuf8<150> iBuffer;
	};

#define FUNC_ENTER(x) //TLogFunc lbtlog(x);

#define STOPLOGGING CLbtLoggerImpl::Destroy();

#define ERROR(x,y)	{ TBuf8<150> buffer; \
					  const unsigned char* string = (unsigned char*)(x); \
					  buffer.Zero(); \
					  buffer.Copy(string); \
					  buffer.Append(_L(": LBT ERROR")); \
					  CLbtLoggerImpl* loggerImpl = CLbtLoggerImpl::CreateLogger(); \
					  if( loggerImpl ) \
					    { \
					    RFileLogger& logger = loggerImpl->GetFileLogger(); \
					    logger.WriteFormat( buffer, y); \
					    } \
					}

#define LOG(x)	{ TBuf8<150> buffer; \
				  const unsigned char* string = (unsigned char*)(x); \
				  buffer.Zero(); \
				  buffer.Copy(string); \
				  CLbtLoggerImpl* loggerImpl = CLbtLoggerImpl::CreateLogger(); \
				  if( loggerImpl ) \
				    { \
				    RFileLogger& logger = loggerImpl->GetFileLogger(); \
				    logger.Write( buffer); \
				    } \
				}
				  
#define LOG1(x,y)	{ TBuf8<150> buffer; \
					  const unsigned char* string = (unsigned char*)(x); \
					  buffer.Zero(); \
					  buffer.Copy(string); \
					  CLbtLoggerImpl* loggerImpl = CLbtLoggerImpl::CreateLogger(); \
					  if( loggerImpl ) \
					    { \
					    RFileLogger& logger = loggerImpl->GetFileLogger(); \
					    logger.WriteFormat( buffer, y); \
					    } \
					}
					  
#define LOGSTRING(x, y)  {  \
						 _LIT(KTmpStr, x); \
						 CLbtLoggerImpl* loggerImpl = CLbtLoggerImpl::CreateLogger(); \
						 if( loggerImpl ) \
						    { \
						    RFileLogger& logger = loggerImpl->GetFileLogger(); \
						    logger.WriteFormat( TRefByValue<const TDesC>(KTmpStr()), y); \
						    } \
					  	 } \


#define LBT_FILE_LOGGER 1 // Always log to file

const char* const LbtLogLevelStr[] = 
    {
    "",
    "Verbose",
    "Warning",
    "Operation",
    "Error",
    "Fatal"
    };

const char* const LbtLogComponentStr[] = 
    {
    "",
    "client lib",
    "server core",
    "server logic api",
    "server logic",
    "container",
    "strategy api",
    "strategy engine",
    "movement detector api",
    "cell id movement detector"
    };


#define LENGTH(str,len) for(len = 0; str[len]; len++) {}


NONSHARABLE_CLASS( TLbtDesOverflow ) : public TDes8Overflow
    {
    void Overflow(TDes8 &/*aDes*/)
        {
        // Dummy Implementation to prevent User panic 23
        }
    };
    
#define LBT_TRACE(level, file, lineno, desc...) 

/*
LOCAL_C void LBT_TRACE(TInt level, const char* file, TInt lineno, const char* desc,...)
    {
    _LIT8(fmt, "!%s %s %s:%d ");
    TInt desclength, filelength, fmtlength;
    fmtlength = fmt().Length();
    LENGTH(desc,desclength);
    LENGTH(file,filelength);

    HBufC8* str = NULL;
    TRAPD(error, str = HBufC8::NewL(desclength+fmtlength+filelength+10+25+200));
    if ( error != KErrNone )
        {
        return;
        }
    
    TPtr8 ptr(str->Des());
    ptr.Zero();

    TLbtDesOverflow ovrflowHandler;
    ptr.AppendFormat(fmt(),
                     &ovrflowHandler,
                     LbtLogLevelStr[(level&KLbtLogLevelMask)],
                     LbtLogComponentStr[(level&KLbtLogComponentMask) >> 16],
                     file,
                     lineno);

    HBufC8* descbuf = HBufC8::NewL(desclength);
    if ( error == KErrNone )
        {
        descbuf->Des().Append(reinterpret_cast<const TUint8 *>(desc), desclength);
        VA_LIST list;
        VA_START(list, desc);
        ptr.AppendFormat(*descbuf,
                         &ovrflowHandler,
                         list );
        delete descbuf;
        }

#ifdef LBT_FILE_LOGGER
    _LIT(KLbtTraceDir,"epos");
    _LIT(KLbtTraceFile,"lbt.log");
    RFileLogger::Write(KLbtTraceDir(), KLbtTraceFile(), EFileLoggingModeAppend, *str);
#else
    RDebug::RawPrint(*str);
#endif
    delete str;
    }
*/

#else // if _DEBUG flag is not defined

#define LBT_TRACE(level, file, lineno, desc...) 
#define FUNC_ENTER(x)
#define STOPLOGGING
#define LOG(x)
#define LOG1(x,y)
#define ERROR(x,y)
#define LOGSTRING(x, y)

#endif // end of #ifdef _DEBUG 


#endif // LBT_LOGGER_H