diff -r 000000000000 -r d0791faffa3f obex/obexprotocol/obextransport/src/logengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/obex/obexprotocol/obextransport/src/logengine.cpp Tue Feb 02 01:11:40 2010 +0200 @@ -0,0 +1,355 @@ +// Copyright (c) 2005-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: +// + +/** + @file + @internalTechnology +*/ + + +#include +#include +#include "logger.h" + + +#ifdef __FLOG_ACTIVE +_LIT8(KSubsystem, "obex"); +_LIT8(KLogCmpt, "logengine"); +#endif + + +NONSHARABLE_CLASS(TLogData) + { + public: +#ifdef __FLOG_ACTIVE + TLogData(); + + void SetLogTags(const TDesC8& aCmpt); + + TInt iAccessCount; + + RFileLogger iLogEngine; + TBuf8 iCurrentComponent; +#endif + }; + + +#ifdef __FLOG_ACTIVE +TLogData::TLogData() + : iAccessCount(0), iCurrentComponent(KNullDesC8) + {} + +void TLogData::SetLogTags(const TDesC8& aCmpt) + { + if (aCmpt != iCurrentComponent) + { + iLogEngine.SetLogTags(KSubsystem, aCmpt.Left(KMaxTagLength)); + iCurrentComponent = aCmpt.Left(KMaxTagLength); + } + } +#endif + +#define GETLOG TLogData* __logger = static_cast(Dll::Tls()); + + + +EXPORT_C /*static*/ TInt CObexLog::Connect() + { +#ifdef __FLOG_ACTIVE + GETLOG; + + if (!__logger) + { + CObexLog::Write(KLogCmpt, _L8("Opening new logger connection")); + __logger = new TLogData(); + if (!__logger) + { + CObexLog::Write(KLogCmpt, _L8("Opening logger connection failed, no memory")); + return KErrNoMemory; + } + + __logger->iLogEngine.Connect(); + Dll::SetTls(__logger); + } + + __logger->iAccessCount++; + CObexLog::WriteFormat(KLogCmpt, _L8("Opening -- %d instances now open"), __logger->iAccessCount); + + return KErrNone; +#else + return KErrNotSupported; +#endif + } + + +EXPORT_C /*static*/ void CObexLog::Close() + { +#ifdef __FLOG_ACTIVE + GETLOG; + + if (__logger) + { + TInt& count = __logger->iAccessCount; + + if (count) + { + count--; + CObexLog::WriteFormat(KLogCmpt, _L8("Closing -- %d instance(s) left open"), count); + if (!count) + { + __logger->iLogEngine.Close(); + delete __logger; + Dll::SetTls(NULL); + CObexLog::Write(KLogCmpt, _L8("Fully closed and deleted, now flogging statically.")); + } + } + else + { + CObexLog::Write(KLogCmpt, _L8("Not closing -- not opened")); + } + } +#endif + } + + + +EXPORT_C /*static*/ void CObexLog::Write(const TDesC8& IF_FLOGGING(aCmpt), const TDesC8& IF_FLOGGING(aText)) + { +#ifdef __FLOG_ACTIVE + GETLOG; + + if (__logger) + { + __logger->SetLogTags(aCmpt); + __logger->iLogEngine.Write(aText); + } + else + { + RFileLogger::Write(KSubsystem, aCmpt, aText); + } +#endif + } + + +EXPORT_C /*static*/ void CObexLog::WriteFormat(const TDesC8& IF_FLOGGING(aCmpt), TRefByValue IF_FLOGGING(aFmt), ...) + { +#ifdef __FLOG_ACTIVE + VA_LIST list; + VA_START(list, aFmt); + + GETLOG; + + if (__logger) + { + __logger->SetLogTags(aCmpt); + __logger->iLogEngine.WriteFormat(aFmt, list); + } + else + { + RFileLogger::WriteFormat(KSubsystem, aCmpt, aFmt, list); + } +#endif + } + + +EXPORT_C /*static*/ void CObexLog::WriteFormat(const TDesC8& IF_FLOGGING(aCmpt), TRefByValue IF_FLOGGING(aFmt), VA_LIST& IF_FLOGGING(aList)) + { +#ifdef __FLOG_ACTIVE + GETLOG; + + if (__logger) + { + __logger->SetLogTags(aCmpt); + __logger->iLogEngine.WriteFormat(aFmt, aList); + } + else + { + RFileLogger::WriteFormat(KSubsystem, aCmpt, aFmt, aList); + } +#endif + } + + +EXPORT_C /*static*/ void CObexLog::Write(const TDesC8& IF_FLOGGING(aCmpt), const TDesC16& IF_FLOGGING(aText)) + { +#ifdef __FLOG_ACTIVE + GETLOG; + + if (__logger) + { + __logger->SetLogTags(aCmpt); + __logger->iLogEngine.Write(aText); + } + else + { + RFileLogger::WriteFormat(KSubsystem, aCmpt, aText); + } +#endif + } + + +EXPORT_C /*static*/ void CObexLog::WriteFormat(const TDesC8& IF_FLOGGING(aCmpt), TRefByValue IF_FLOGGING(aFmt), ...) + { +#ifdef __FLOG_ACTIVE + VA_LIST list; + VA_START(list, aFmt); + + GETLOG; + + if (__logger) + { + __logger->SetLogTags(aCmpt); + __logger->iLogEngine.WriteFormat(aFmt, list); + } + else + { + RFileLogger::WriteFormat(KSubsystem, aCmpt, aFmt, list); + } +#endif + } + + +EXPORT_C /*static*/ void CObexLog::WriteFormat(const TDesC8& IF_FLOGGING(aCmpt), TRefByValue IF_FLOGGING(aFmt), VA_LIST& IF_FLOGGING(aList)) + { +#ifdef __FLOG_ACTIVE + GETLOG; + + if (__logger) + { + __logger->SetLogTags(aCmpt); + __logger->iLogEngine.WriteFormat(aFmt, aList); + } + else + { + RFileLogger::WriteFormat(KSubsystem, aCmpt, aFmt, aList); + } +#endif + } + + +EXPORT_C /*static*/ void CObexLog::HexDump(const TDesC8& IF_FLOGGING(aCmpt), const TText* IF_FLOGGING(aHeader), const TText* IF_FLOGGING(aMargin), const TUint8* IF_FLOGGING(aPtr), TInt IF_FLOGGING(aLen)) + { +#ifdef __FLOG_ACTIVE + GETLOG; + + if (__logger) + { + __logger->SetLogTags(aCmpt); + __logger->iLogEngine.HexDump(aHeader, aMargin, aPtr, aLen); + } + else + { + RFileLogger::HexDump(KSubsystem, aCmpt, TPtrC8(aPtr, aLen), KNullDesC8); + } +#endif + } + + + + + + + +/** +Leave (if error) verbosely- log name of file and line number just before +leaving. +@param aFile The file we're leaving from. +@param aLine The line number we're leaving from. +@param aReason The leave code. +*/ +EXPORT_C void VerboseLeaveIfErrorL(const TDesC8& IF_FLOGGING(aCpt), + char* IF_FLOGGING(aFile), + TInt IF_FLOGGING(aLine), + TInt IF_FLOGGING(aReason)) + { +#ifdef __FLOG_ACTIVE + // only leave if an error value + if ( aReason >= KErrNone ) + { + return; + } + + _LIT8(KLeavePrefix, "LEAVE: "); + + TPtrC8 fullFileName((const TUint8*)aFile); + TPtrC8 fileName(fullFileName.Ptr()+fullFileName.LocateReverse('\\')+1); + + TBuf8<256> buf; + buf.Append(KLeavePrefix); + buf.AppendFormat(_L8("aReason = %d [file %S, line %d]"), aReason, &fileName, + aLine); + CObexLog::Write(aCpt, buf); + + // finally + User::Leave(aReason); +#endif + } + +/** +Panic verbosely- log name of file and line number just before panicking. +@param aFile The file that's panicking. +@param aLine The line number that's panicking. +@param aReason The panic code. +@param aPanicName The text of the panic code. +@param aPanicCategory The panic category. +*/ +EXPORT_C void VerbosePanic(const TDesC8& IF_FLOGGING(aCpt), + char* IF_FLOGGING(aFile), + TInt IF_FLOGGING(aLine), + TInt IF_FLOGGING(aPanicCode), + TText8* IF_FLOGGING(aPanicName), + const TDesC& IF_FLOGGING(aPanicCategory)) + { +#ifdef __FLOG_ACTIVE + _LIT8(KPanicPrefix, "PANIC: code "); + + TPtrC8 fullFileName((const TUint8*)aFile); + TPtrC8 fileName(fullFileName.Ptr()+fullFileName.LocateReverse('\\')+1); + + TBuf8<256> buf; + buf.Append(KPanicPrefix); + buf.AppendFormat(_L8("%d = %s [file %S, line %d]"), + aPanicCode, + aPanicName, + &fileName, + aLine); + CObexLog::Write(aCpt, buf); + + // finally + User::Panic(aPanicCategory, aPanicCode); +#endif + } + +#ifdef __FLOG_ACTIVE +_LIT8(KInstrumentIn, ">>%S this = [0x%08x]"); +_LIT8(KInstrumentOut, "<<%S"); +#endif + +EXPORT_C TFunctionLogger::TFunctionLogger(const TDesC8& IF_FLOGGING(aCpt), const TDesC8& IF_FLOGGING(aString), TAny* IF_FLOGGING(aThis)) + { +#ifdef __FLOG_ACTIVE + iCpt.Set(aCpt); + iString.Set(aString); + CObexLog::WriteFormat(iCpt, KInstrumentIn, &iString, aThis); +#endif + } + +EXPORT_C TFunctionLogger::~TFunctionLogger() + { +#ifdef __FLOG_ACTIVE + CObexLog::WriteFormat(iCpt, KInstrumentOut, &iString); +#endif + } +