networkprotocolmodules/common/supldevlogger/src/supldevlogger.cpp
branchRCL_3
changeset 65 a796fdeeb33c
parent 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkprotocolmodules/common/supldevlogger/src/supldevlogger.cpp	Wed Oct 13 16:07:50 2010 +0300
@@ -0,0 +1,479 @@
+// Copyright (c) 2008-2009 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:
+// System
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+ 
+*/
+
+#include <e32base.h>
+#include <e32debug.h>
+#include <flogger.h>
+
+// Component
+#include "supldevlogger.h"
+
+
+const TInt KSuplDevLogMaxBufSize = 300;
+_LIT(KTimeFormat, "%H:%T:%S.%C");
+_LIT(KSuplDevLogFolder, "lbs");
+_LIT(KSuplDevLogFile,"lbs.txt");
+_LIT(KSuplDevLogError, "Error: ");
+_LIT(KSuplDevLogWarning, "Warning: ");
+_LIT(KSuplDevLogSep," | ");
+
+const TInt KSuplHexDumpWidth=16;
+_LIT(KSuplFirstFormatString,"%04x : ");
+_LIT(KSuplSecondFormatString,"%02x ");
+_LIT(KSuplThirdFormatString,"%c");
+_LIT(KSuplThreeSpaces,"   ");
+_LIT(KSuplTwoSpaces,"  ");
+const TText KSuplFullStopChar='.';
+
+// Declare structures which will hold variables on the heap.
+typedef struct
+	{
+	TTime currentTime;
+	TBuf16<32> cTimeStr;
+	TFileName dirName;
+	TInt16 pos;
+	TUint64 procId;
+	TUint32 stackUsage;
+	} 
+TCreateLog16;
+
+typedef struct
+	{
+	TTime currentTime;
+	TBuf8<32> cTimeStr8;
+	TBuf16<32> cTimeStr;
+	TFileName dirName;
+	TInt pos;
+	TUint64 procId;
+	TUint32 stackUsage;
+	} 
+TCreateLog8;
+
+typedef struct
+	{
+	RThread localThread;
+	RProcess localProcess;	
+	TFileName fName;
+	TInt16 pos;
+	}
+TMessageProcessName;
+
+//#define ENABLE_SUPL_DEV_LOGGER_RDEBUG
+//-----------------------------------------------------------------------------
+// SuplDevLogger
+//-----------------------------------------------------------------------------
+
+/** Static function, one parameter, overwrite the previous log
+@param aFmt TDes string reference 
+*/
+EXPORT_C void SuplDevLogger::OverWrite(const TDesC16& aFmt)
+	{
+	TInt stackInt = 0;
+	
+	// Grab some meory off the heap, give up if no memory available.
+	RFileLogger *logger = new RFileLogger;
+	if (logger == NULL)
+		return;
+
+	RBuf16 txt;
+	TInt err = txt.Create(KSuplDevLogMaxBufSize);
+	if (err != KErrNone)
+		{
+		delete logger;
+		return;
+		}
+
+	err = logger->Connect();
+	if (err == KErrNone)		
+		{
+		CreateLogTxt(ELogNormal, ELogP5, &stackInt, txt);
+		txt.Append(aFmt.Left(KSuplDevLogMaxBufSize - txt.Length()));
+		
+		logger->CreateLog(KSuplDevLogFolder, KSuplDevLogFile, EFileLoggingModeOverwrite);
+		logger->SetDateAndTime(EFalse, EFalse);
+		logger->Write(txt);
+		
+		#ifdef ENABLE_SUPL_DEV_LOGGER_RDEBUG
+		txt.Append(_L("\n\r"));
+		RDebug::RawPrint(txt);
+		#endif		
+		}
+	logger->Close();
+
+	// Free up heap space
+	txt.Close();
+	delete logger;
+	}
+
+/** Static function, one parameter
+@param aPrior Log entry priority
+@param aFmt TDes string reference 
+*/
+EXPORT_C void SuplDevLogger::Write(TSuplLogType aType, TSuplLogPriority aPrior, TRefByValue<const TDesC16> aFmt, ...)
+	{
+	TInt stackInt = 0;
+	
+	// Grab space on the heap for varibles we are going to need here.
+	RFileLogger *logger = new RFileLogger;
+	if (logger == NULL)
+		{
+		return;
+		}
+
+	TInt err = logger->Connect();	
+	if (err == KErrNone)
+		{
+		VA_LIST list;
+		VA_START(list, aFmt);
+		RBuf16 strList;
+		err = strList.Create(KSuplDevLogMaxBufSize);
+
+		if (err == KErrNone)
+			{
+			strList.FormatList(aFmt, list);
+			VA_END(list);
+
+			RBuf16 txt;
+			err = txt.Create(KSuplDevLogMaxBufSize);
+			if (err == KErrNone)
+				{
+				CreateLogTxt(aType, aPrior, &stackInt, txt);
+				txt.Append(strList.Left(KSuplDevLogMaxBufSize - txt.Length()));
+
+				logger->CreateLog(KSuplDevLogFolder, KSuplDevLogFile, EFileLoggingModeAppend);
+				logger->SetDateAndTime(EFalse, EFalse);
+				logger->Write(txt);
+				
+				#ifdef ENABLE_SUPL_DEV_LOGGER_RDEBUG
+				txt.Append(_L("\n\r"));
+				RDebug::RawPrint(txt);
+				#endif
+
+				txt.Close();
+				}
+			strList.Close();
+			}
+		}
+		
+	logger->Close();
+	delete logger;
+	}
+
+/** Static function to dump the hex data
+@param aPrior Log entry priority
+@param aPtr TUnit8 pointer to hex data
+@param aLen length of hex data
+*/
+EXPORT_C void SuplDevLogger::HexDump(TSuplLogPriority aPrior, const TUint8 *aPtr, TInt aLen)
+	{
+	TInt stackInt = 0;
+	
+	if (aPtr==NULL)     // nothing to do
+		return;
+
+	RFileLogger* logger = new RFileLogger;
+	if (logger == NULL)
+		return;
+
+	TInt err = logger->Connect();
+	logger->CreateLog(KSuplDevLogFolder, KSuplDevLogFile, EFileLoggingModeAppend);
+	logger->SetDateAndTime(EFalse, EFalse);
+	
+	RBuf buf;
+	err = buf.Create(KSuplDevLogMaxBufSize);
+	if (err == KErrNone)
+		{
+		RBuf8 temp;
+		err= temp.Create(KSuplDevLogMaxBufSize);		
+		if (err == KErrNone)
+			{
+			RBuf8 prefix;
+			if (prefix.Create(KSuplDevLogMaxBufSize) == KErrNone)
+				{
+				CreateLogTxt(ELogNormal, aPrior, &stackInt, prefix);
+				
+				TInt i=0;
+				while (aLen>0)
+					{
+					TInt n=(aLen>KSuplHexDumpWidth ? KSuplHexDumpWidth : aLen);
+					buf.Copy(prefix);
+					buf.AppendFormat(KSuplFirstFormatString,i);
+					
+					TInt j;
+					for (j=0; j<n; j++)
+						buf.AppendFormat(KSuplSecondFormatString,aPtr[i+j]);
+						
+					while (j++<KSuplHexDumpWidth)
+						buf.Append(KSuplThreeSpaces);
+						
+					buf.Append(KSuplTwoSpaces);
+					for (j=0; j<n; j++)
+						buf.AppendFormat(KSuplThirdFormatString,(aPtr[i+j]<32 || aPtr[i+j]>126) ? KSuplFullStopChar : aPtr[i+j]);
+
+					logger->Write(buf);
+					
+					#ifdef ENABLE_SUPL_DEV_LOGGER_RDEBUG
+					buf.Append(_L("\n\r"));
+					RDebug::RawPrint(buf);
+					#endif				
+					
+					buf.SetLength(0);
+					temp.SetLength(0);
+					aLen-=n;
+					i+=n;
+					}
+				prefix.Close();
+				}
+			temp.Close();
+			}
+		buf.Close();
+		}  //end if buf created ok	
+
+	logger->Close();
+	delete logger;
+	}   
+	
+/** private function, create common log text
+@param aPrior Log entry priority
+@param aBuf The log prefix buffer
+@internalTechnology
+*/
+void SuplDevLogger::CreateLogTxt(TSuplLogType aType, TSuplLogPriority aPrior, TInt* aStackPtr, TDes16& aBuf)
+	{
+	// Grab space on the heap for all the varibles we are going to need here.
+	TCreateLog16* vars = new TCreateLog16;
+	if (vars == NULL)
+		return;
+
+	vars->currentTime.UniversalTime();
+	TRAPD(err, vars->currentTime.FormatL(vars->cTimeStr, KTimeFormat));
+	if (err)
+		{
+		User::Panic(KSuplDevLogger, KErrNoMemory);
+		}
+	
+	vars->dirName = RProcess().FileName();	
+	vars->pos = vars->dirName.LocateReverse('\\') + 1;
+	TPtr16 fileName = vars->dirName.MidTPtr(vars->pos);
+	vars->procId = RProcess().Id();
+	
+	aBuf.Append(vars->cTimeStr);
+	aBuf.Append(KSuplDevLogSep);
+
+	aBuf.Append(fileName);
+	aBuf.Append(KSuplDevLogSep);
+	
+	aBuf.AppendFormat(_L16("%LX"),vars->procId);
+	aBuf.Append(KSuplDevLogSep);
+	
+	aBuf.AppendFormat(_L16("P%d"),aPrior);
+	aBuf.Append(KSuplDevLogSep);
+
+	aBuf.AppendFormat(_L16("%08X"), aStackPtr);
+	aBuf.Append(KSuplDevLogSep);
+
+	if (aType == ELogError)
+		{
+		aBuf.Append(KSuplDevLogError);
+		}
+	else if (aType == ELogWarning)
+		{
+		aBuf.Append(KSuplDevLogWarning);
+		}
+
+	delete vars;
+	}
+
+/** Static function, one parameter, overwrite the previous log
+@param aFmt TDes string reference 
+*/
+EXPORT_C void SuplDevLogger::OverWrite(const TDesC8& aFmt)
+	{
+	TInt stackInt = 0;
+	
+	RFileLogger* logger = new RFileLogger;
+	if (logger == NULL)
+		return;
+
+	TInt err = logger->Connect();
+	if (err == KErrNone)
+		{
+		RBuf8 txt;
+		err = txt.Create(KSuplDevLogMaxBufSize);
+
+		if (err == KErrNone)
+			{
+			CreateLogTxt(ELogNormal, ELogP5, &stackInt, txt);
+			txt.Append(aFmt.Left(KSuplDevLogMaxBufSize - txt.Length()));
+
+			logger->CreateLog(KSuplDevLogFolder, KSuplDevLogFile, EFileLoggingModeOverwrite);
+			logger->SetDateAndTime(EFalse, EFalse);
+			logger->Write(txt);
+			
+			#ifdef ENABLE_SUPL_DEV_LOGGER_RDEBUG
+			txt.Append(_L("\n\r"));
+			RDebug::RawPrint(txt);
+			#endif
+
+			txt.Close();
+			}
+		} // end if logger connect ok
+		
+	logger->Close();
+	delete logger;
+	}
+
+/** Static function, one parameter
+@param aPrior Log entry priority
+@param aFmt Log entry
+*/
+EXPORT_C void SuplDevLogger::Write(TSuplLogType aType, TSuplLogPriority aPrior, TRefByValue<const TDesC8> aFmt, ...)
+	{
+	TInt stackInt = 0;
+	
+	RFileLogger* logger = new RFileLogger;
+	if (logger == NULL)
+		return;
+
+	TInt err = logger->Connect();
+	if (err == KErrNone)
+		{
+		VA_LIST list;
+		VA_START(list, aFmt);
+
+		RBuf8 strList;
+		err = strList.Create(KSuplDevLogMaxBufSize);
+		if (err == KErrNone)
+			{
+			strList.FormatList(aFmt, list);
+			VA_END(list);
+
+			RBuf8 txt;
+			err = txt.Create(KSuplDevLogMaxBufSize);
+			
+			if (err == KErrNone)
+				{
+				CreateLogTxt(aType, aPrior, &stackInt, txt);
+				txt.Append(strList.Left(KSuplDevLogMaxBufSize - txt.Length()));
+
+				logger->CreateLog(KSuplDevLogFolder, KSuplDevLogFile, EFileLoggingModeAppend);
+				logger->SetDateAndTime(EFalse, EFalse);
+				logger->Write(txt);
+				
+				#ifdef ENABLE_SUPL_DEV_LOGGER_RDEBUG
+				txt.Append(_L("\n\r"));
+				RDebug::RawPrint(txt);
+				#endif
+
+				txt.Close();
+				}
+
+			strList.Close();
+			} // end if strList memory alloc'd ok
+			
+		} // end if logger connected ok
+
+	logger->Close();
+	delete logger;
+	}
+
+/** private function, create common log text
+@param aPrior Log entry priority
+@param aBuf The log prefix buffer
+@internalTechnology
+*/
+void SuplDevLogger::CreateLogTxt(TSuplLogType aType, TSuplLogPriority aPrior, TInt* aStackPtr, TDes8& aBuf)
+	{
+	// Grab space on the heap for all the varibles we are going to need here.
+	TCreateLog8* vars = new TCreateLog8;
+	if (vars == NULL)
+		{
+		return;
+		}
+
+	vars->currentTime.UniversalTime();	
+	TRAPD(err, vars->currentTime.FormatL(vars->cTimeStr, KTimeFormat));
+	if (err)
+		{
+		User::Panic(KSuplDevLogger, KErrNoMemory);
+		}
+	vars->cTimeStr8.Copy(vars->cTimeStr);
+	
+	vars->dirName = RProcess().FileName();
+	vars->pos = vars->dirName.LocateReverse('\\') + 1;
+	TPtr fileName = vars->dirName.MidTPtr(vars->pos);
+	vars->procId = RProcess().Id();
+	
+	aBuf.Append(vars->cTimeStr8);
+	aBuf.Append(KSuplDevLogSep);
+
+	aBuf.Append(fileName);
+	aBuf.Append(KSuplDevLogSep);
+	
+	aBuf.AppendFormat(_L8("%LX"),vars->procId);
+	aBuf.Append(KSuplDevLogSep);
+	
+	aBuf.AppendFormat(_L8("P%d"),aPrior);
+	aBuf.Append(KSuplDevLogSep);
+	
+	aBuf.AppendFormat(_L8("%08X"), aStackPtr);
+	aBuf.Append(KSuplDevLogSep);
+	
+	if (aType == ELogError)
+		{
+		aBuf.Append(KSuplDevLogError);
+		}
+	else if (aType == ELogWarning)
+		{
+		aBuf.Append(KSuplDevLogWarning);
+		}
+
+	delete vars;
+	}
+
+/**
+ This function uses the message to get the process and thread information in
+ order to get the process name for the log file
+ @param aMessage Client\server message about to be completed
+ @param aName Contains the filename of the process to which this message belongs
+**/
+EXPORT_C void SuplDevLogger::GetMessageProcessName(const RMessage2& aMessage, TFileName& aName)
+	{
+	TMessageProcessName* vars = new TMessageProcessName;
+	if (vars == 0)
+		return;
+
+	//Get the thread and process information
+	if (aMessage.Client(vars->localThread) != KErrNone)
+		return;
+
+	vars->localThread.Process(vars->localProcess);
+
+	aName = vars->localProcess.FileName();
+	vars->pos = aName.LocateReverse('\\') + 1;
+	aName = aName.Mid(vars->pos);
+
+	delete vars;
+
+	return;
+	}