--- /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 <e32base.h>
+#include <comms-infras/commsdebugutility.h>
+#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<KMaxTagLength> 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<TLogData*>(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<const TDesC8> 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<const TDesC8> 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<const TDesC16> 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<const TDesC16> 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
+ }
+