syncmlfw/common/debug/src/nsmldebug.cpp
changeset 0 b497e44ab2fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/common/debug/src/nsmldebug.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,460 @@
+/*
+* Copyright (c) 2002 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:  Debug library
+*
+*/
+
+
+#define __DEBUG_THIS__
+#include <nsmldebug.h>
+#undef __DEBUG_THIS__
+
+#include <f32file.h>
+#include <s32file.h>
+#include <utf.h>
+#include <e32std.h>
+
+#ifdef __WINS__
+_LIT( KNSmlDebugOutputName, "C:\\NSmlDebug.txt" );
+_LIT( KNSmlDebugDumpName, "C:\\NSmlDebugDump.txt" );
+#else
+// In emulator logs are written into D: (or E:) drive (easier to read them using PC)
+_LIT( KNSmlDebugOutputName, ":\\NSmlDebug.txt" );
+_LIT( KNSmlDebugDumpName, ":\\NSmlDebugDump.txt" );
+_LIT( KNSmlDebugDriveLetters, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+
+#endif
+
+_LIT( KNSmlDebugMutexName, "NSmlDebugMutex" );
+_LIT( KNSmlDebugMutexNameDump, "NSmlDebugMutexDump" );
+
+static const TInt KBufferSize = 512;
+
+#pragma warning (push)
+#pragma warning (disable : 4127)
+
+
+// --------------------------------------------------------------------------------
+// void NSmlGrabMutexLC( RMutex& aMutex, const TDesC& aMutexName )
+// --------------------------------------------------------------------------------
+LOCAL_C void NSmlGrabMutexLC( RMutex& aMutex, const TDesC& aMutexName )
+	{
+	while( ETrue )
+		{
+		TInt ret = aMutex.CreateGlobal(aMutexName);
+		if( ret == KErrNone ) // We created the mutex -> Issue wait()
+			{
+			aMutex.Wait();
+			break;
+			}
+		if( ret == KErrAlreadyExists ) // Mutex already existed -> Open it
+			{
+			ret = aMutex.OpenGlobal(aMutexName);
+			if( ret == KErrNone ) // We got handle to the mutex -> Issue wait()
+				{
+				aMutex.Wait();
+				break;
+				}
+			}
+		}
+	CleanupClosePushL(aMutex);
+	}
+
+#pragma warning (pop)
+
+// --------------------------------------------------------------------------------
+// void DumpToFileL( TPtrC8 aBuffer )
+// --------------------------------------------------------------------------------
+void DumpToFileL( TPtrC8 aBuffer )
+	{
+	RFs fileSession;
+	TInt pushed(0);
+	if( fileSession.Connect() == KErrNone )
+		{
+		CleanupClosePushL(fileSession);
+		pushed++;
+		RFile file;
+#ifdef __WINS__
+		if( file.Open(fileSession, KNSmlDebugOutputName(), EFileShareAny|EFileWrite) == KErrNone )
+#else
+		HBufC* outputName = HBufC::NewLC( KNSmlDebugOutputName().Length()+1 );
+		pushed++;
+		TPtr namePtr = outputName->Des();
+		TDriveInfo driveInfo;
+		for ( TUint driveNumber = EDriveA; driveNumber <= EDriveZ; driveNumber++ ) 
+			{
+			fileSession.Drive( driveInfo, driveNumber );
+			if ( KDriveAttRemovable & driveInfo.iDriveAtt ) 
+				{
+				// this is MMC
+				namePtr.Insert( 0, KNSmlDebugDriveLetters().Mid( driveNumber, 1 ));
+				namePtr.Insert( 1, KNSmlDebugOutputName() );
+				break;
+				}
+			}
+		if( file.Open(fileSession, *outputName, EFileShareAny|EFileWrite) == KErrNone )
+#endif
+
+			{
+			CleanupClosePushL(file);
+			TInt pos(0);
+			file.Seek(ESeekEnd, pos);
+			RMutex mutex;
+			NSmlGrabMutexLC(mutex, KNSmlDebugMutexName());
+			TInt result = file.Write(aBuffer);
+			TInt result2 = file.Flush();
+			mutex.Signal();
+			CleanupStack::PopAndDestroy(2); // file, mutex
+			User::LeaveIfError(result);
+			User::LeaveIfError(result2);
+			}
+		CleanupStack::PopAndDestroy( pushed ); // fileSession and (for target) outputName
+		}
+	}
+
+// --------------------------------------------------------------------------------
+// void NSmlGetDateAndTimeL( TDes8& aDateBuffer, TDes8& aTimeBuffer )
+// --------------------------------------------------------------------------------
+LOCAL_C void NSmlGetDateAndTimeL( TDes8& aDateBuffer, TDes8& aTimeBuffer )
+	{
+	TTime time;
+	time.HomeTime();
+	HBufC* dateBuffer = HBufC::NewLC(64);
+	TPtr ptrDateBuffer = dateBuffer->Des();
+	HBufC* timeBuffer = HBufC::NewLC(64);
+	TPtr ptrTimeBuffer = timeBuffer->Des();
+	time.FormatL(ptrDateBuffer, _L("%D%M%Y%/0%1%/1%2%/2%3%/3"));
+	time.FormatL(ptrTimeBuffer, _L("%-B%:0%J%:1%T%:2%S%.%*C4%:3%+B"));
+	CnvUtfConverter::ConvertFromUnicodeToUtf8(aDateBuffer, ptrDateBuffer);
+	CnvUtfConverter::ConvertFromUnicodeToUtf8(aTimeBuffer, ptrTimeBuffer);
+	CleanupStack::PopAndDestroy(2); // dateBuffer, timeBuffer
+	}
+
+// --------------------------------------------------------------------------------
+// void doNSmlDebugInitL() - Windows compilation
+// --------------------------------------------------------------------------------
+
+#ifdef __WINS__
+
+void doNSmlDebugInitL()
+	{
+	RFs fileSession;
+	User::LeaveIfError(fileSession.Connect());
+	CleanupClosePushL(fileSession);
+	fileSession.Delete(KNSmlDebugOutputName());
+	fileSession.Delete(KNSmlDebugDumpName());	
+	RFile file;
+
+#if !defined(__SML_DEVELOPER_DEBUG__)
+		{
+		User::LeaveIfError(file.Create(fileSession, KNSmlDebugOutputName(), EFileShareAny));
+		file.Close();
+		}
+#endif
+		{
+		User::LeaveIfError(file.Create(fileSession, KNSmlDebugDumpName(), EFileShareAny));
+		file.Close();
+		}
+	CleanupStack::PopAndDestroy(); // fileSession
+	}
+
+// --------------------------------------------------------------------------------
+// void doNSmlDebugInitL() - Target compilation
+// --------------------------------------------------------------------------------
+
+#else  // #ifdef __WINS__
+
+void doNSmlDebugInitL()
+	{
+	TInt pushed(0);
+	RFs fileSession;
+	User::LeaveIfError(fileSession.Connect());
+	CleanupClosePushL(fileSession);
+	pushed++;
+
+	TDriveInfo driveInfo;
+	for ( TUint driveNumber = EDriveA; driveNumber <= EDriveZ; driveNumber++ ) 
+		{
+		fileSession.Drive( driveInfo, driveNumber );
+		if ( KDriveAttRemovable & driveInfo.iDriveAtt ) 
+			{
+			RFile file;
+			HBufC* outputName = HBufC::NewLC( KNSmlDebugOutputName().Length()+1 );
+			pushed++;
+			TPtr namePtr = outputName->Des();
+			namePtr.Insert( 0, KNSmlDebugDriveLetters().Mid( driveNumber, 1 ));
+			namePtr.Insert( 1, KNSmlDebugOutputName() );
+			
+			HBufC* outputDumpName = HBufC::NewLC( KNSmlDebugDumpName().Length()+1 );
+			pushed++;
+			TPtr nameDumpPtr = outputDumpName->Des();
+			nameDumpPtr.Insert( 0, KNSmlDebugDriveLetters().Mid( driveNumber, 1 ));
+			nameDumpPtr.Insert( 1, KNSmlDebugDumpName() );
+			
+			fileSession.Delete(*outputName);
+			fileSession.Delete(*outputDumpName);	
+
+#if !defined(__SML_DEVELOPER_DEBUG__)
+				{
+				User::LeaveIfError(file.Create(fileSession, *outputName, EFileShareAny));
+				file.Close();
+				}
+#endif
+				{
+				User::LeaveIfError(file.Create(fileSession, *outputDumpName, EFileShareAny));
+				file.Close();
+				break;
+				}
+			}
+		}
+	CleanupStack::PopAndDestroy( pushed ); // fileSession
+	}
+
+#endif
+
+
+// --------------------------------------------------------------------------------
+// void NSmlDebugInitL()
+// --------------------------------------------------------------------------------
+EXPORT_C void NSmlDebugInitL()
+	{
+	TInt err(KErrNone);
+	TRAP(err, doNSmlDebugInitL());
+	}
+
+// --------------------------------------------------------------------------------
+// void doNSmlDebugPrintL( TInt aCode, const TText8* aMsg, TBool aPrintToFile, TText8* aFile, TInt aLine )
+// --------------------------------------------------------------------------------
+void doNSmlDebugPrintL( TInt aCode, const TText8* aMsg, TBool aPrintToFile, TText8* aFile, TInt aLine )
+	{
+	HBufC8* dateBuffer8 = HBufC8::NewLC(64);
+	TPtr8 ptrDateBuffer8 = dateBuffer8->Des();
+	HBufC8* timeBuffer8 = HBufC8::NewLC(64);
+	TPtr8 ptrTimeBuffer8 = timeBuffer8->Des();
+
+	NSmlGetDateAndTimeL(ptrDateBuffer8, ptrTimeBuffer8);
+	TPtrC8 fileName(aFile);
+	HBufC8* buffer8 = HBufC8::NewLC(KBufferSize);
+	TPtr8 ptrBuffer8 = buffer8->Des();
+	TPtrC8 msg(aMsg);
+
+#if !defined(__SML_DEVELOPER_DEBUG__)
+	ptrBuffer8.Format(_L8("[%S File: %S Line: %d] %S [Code: %d]\r\n"), &ptrTimeBuffer8, &fileName, aLine, &msg, aCode);
+#else
+	ptrBuffer8.Format(_L8("[%S] %S\r\n"), &ptrTimeBuffer8, &msg);
+#endif
+
+	if( aPrintToFile )
+		{
+		DumpToFileL(ptrBuffer8);
+		}
+	else
+		{
+		HBufC* buffer = HBufC::NewLC(KBufferSize);
+		TPtr ptrBuffer = buffer->Des();
+		CnvUtfConverter::ConvertToUnicodeFromUtf8(ptrBuffer, ptrBuffer8);
+		User::InfoPrint(ptrBuffer);
+		CleanupStack::PopAndDestroy(); // buffer
+		}
+	CleanupStack::PopAndDestroy(3); // buffer8, dateBuffer8, timeBuffer8
+	}
+
+// --------------------------------------------------------------------------------
+// void NSmlDebugPrintL( const TText8* aMsg, TBool aPrintToFile, TText8* aFile, TInt aLine )
+// --------------------------------------------------------------------------------
+EXPORT_C void NSmlDebugPrintL( const TText8* aMsg, TBool aPrintToFile, TText8* aFile, TInt aLine )
+	{
+	TInt err(KErrNone);
+	TRAP(err, doNSmlDebugPrintL( 0, aMsg, aPrintToFile, aFile, aLine));
+	}
+
+// --------------------------------------------------------------------------------
+// void NSmlDebugPrint_CodeL( TInt aCode, const TText8* aMsg, TBool aPrintToFile, TText8* aFile, TInt aLine )
+// --------------------------------------------------------------------------------
+EXPORT_C void NSmlDebugPrint_CodeL( TInt aCode, const TText8* aMsg, TBool aPrintToFile, TText8* aFile, TInt aLine )
+	{
+	TInt err(KErrNone);
+	TRAP(err, doNSmlDebugPrintL(aCode, aMsg, aPrintToFile, aFile, aLine));
+	}
+
+// --------------------------------------------------------------------------------
+// void doNSmlDebugDumpL( void* aData, TInt aLength, TText8* aFile, TInt aLine, const TText8* aMsg )
+// --------------------------------------------------------------------------------
+void doNSmlDebugDumpL( void* aData, TInt aLength, TText8* aFile, TInt aLine, const TText8* aMsg )
+	{
+	TInt pushed(0);
+	HBufC8* pDateBuffer8 = HBufC8::NewLC(64);
+	pushed++;
+	TPtr8 dateBuffer8 = pDateBuffer8->Des();
+	HBufC8* pTimeBuffer8 = HBufC8::NewLC(64);
+	pushed++;
+	TPtr8 timeBuffer8 = pTimeBuffer8->Des();
+	NSmlGetDateAndTimeL(dateBuffer8, timeBuffer8);
+	TPtrC8 data(REINTERPRET_CAST(TUint8*, aData), aLength);
+	TPtrC8 fileName(aFile);
+	HBufC8* buffer8 = HBufC8::NewLC(KBufferSize);
+	pushed++;
+	TPtr8 ptrBuffer8 = buffer8->Des();
+	TPtrC8 msg(aMsg);
+	if( !msg.Length() )
+		{
+#if !defined(__SML_DEVELOPER_DEBUG__)
+		ptrBuffer8.Format(_L8("[%S %S File: %S Line: %d Length: %d]\r\n"), &dateBuffer8, &timeBuffer8, &fileName, aLine, aLength);
+#else
+		ptrBuffer8.Format(_L8("[%S %S Length: %d]\r\n"), &dateBuffer8, &timeBuffer8, aLength);
+#endif
+		}
+	else
+		{
+#if !defined(__SML_DEVELOPER_DEBUG__)
+		ptrBuffer8.Format(_L8("[%S %S File: %S Line: %d Length: %d] %S\r\n"), &dateBuffer8, &timeBuffer8, &fileName, aLine, aLength, &msg);
+#else
+		ptrBuffer8.Format(_L8("[%S %S Length: %d] %S\r\n"), &dateBuffer8, &timeBuffer8, aLength, &msg);
+#endif
+		}
+	// Now we're ready to write into file
+	RFs fileSession;
+	if( fileSession.Connect() == KErrNone )
+		{
+		CleanupClosePushL(fileSession);
+		pushed++;
+		RFile file;
+#ifdef __WINS__
+		if( file.Open(fileSession, KNSmlDebugDumpName(), EFileShareAny|EFileWrite) == KErrNone )
+#else
+		HBufC* outputDumpName = HBufC::NewLC( KNSmlDebugDumpName().Length()+1 );
+		pushed++;
+		TPtr nameDumpPtr = outputDumpName->Des();
+		TDriveInfo driveInfo;
+		for ( TUint driveNumber = EDriveA; driveNumber <= EDriveZ; driveNumber++ ) 
+			{
+			fileSession.Drive( driveInfo, driveNumber );
+			if ( KDriveAttRemovable & driveInfo.iDriveAtt ) 
+				{
+				// this is MMC
+				nameDumpPtr.Insert( 0, KNSmlDebugDriveLetters().Mid( driveNumber, 1 ));
+				nameDumpPtr.Insert( 1, KNSmlDebugDumpName() );
+				break;
+				}
+			}
+		if( file.Open(fileSession, *outputDumpName, EFileShareAny|EFileWrite) == KErrNone )
+#endif
+
+			{
+			CleanupClosePushL(file);
+			TInt pos(0);
+			file.Seek(ESeekEnd, pos);
+			RMutex mutex;
+			NSmlGrabMutexLC(mutex, KNSmlDebugMutexNameDump());
+			TInt result1 = file.Write(ptrBuffer8);
+			TInt result2 = file.Write(data);
+			TInt result3 = file.Write(_L8("\r\n\r\n"));
+			TInt result4 = file.Flush();
+			mutex.Signal();
+			CleanupStack::PopAndDestroy(2); // file, mutex
+			User::LeaveIfError(result1);
+			User::LeaveIfError(result2);
+			User::LeaveIfError(result3);
+			User::LeaveIfError(result4);
+			}
+		}
+	CleanupStack::PopAndDestroy( pushed ); // buffer8, pDateBuffer8, pTimeBuffer8
+	}
+
+// --------------------------------------------------------------------------------
+// void NSmlDebugDumpL( void* aData, TInt aLength, TText8* aFile, TInt aLine, const TText8* aMsg )
+// --------------------------------------------------------------------------------
+EXPORT_C void NSmlDebugDumpL( void* aData, TInt aLength, TText8* aFile, TInt aLine, const TText8* aMsg )
+	{
+	TInt err(KErrNone);
+	TRAP(err, doNSmlDebugDumpL(aData, aLength, aFile, aLine, aMsg));
+	}
+
+// --------------------------------------------------------------------------------
+// void NSmlDebugPrintHeaderL( TText8* aFile, TInt aLine )
+// --------------------------------------------------------------------------------
+void _NSmlDebugPrintHeaderL( TText8* aFile, TInt aLine )
+	{
+	HBufC8* pDateBuffer8 = HBufC8::NewLC(64);
+	TPtr8 dateBuffer8 = pDateBuffer8->Des();
+	HBufC8* pTimeBuffer8 = HBufC8::NewLC(64);
+	TPtr8 timeBuffer8 = pTimeBuffer8->Des();
+	NSmlGetDateAndTimeL(dateBuffer8, timeBuffer8);
+	TPtrC8 fileName(aFile);
+	HBufC8* buffer8 = HBufC8::NewLC(KBufferSize);
+	TPtr8 ptrBuffer8 = buffer8->Des();
+#if !defined(__SML_DEVELOPER_DEBUG__)
+	ptrBuffer8.Format(_L8("[%S File: %S Line: %d]"), &timeBuffer8, &fileName, aLine);
+#else
+	ptrBuffer8.Format(_L8("[%S]"), &timeBuffer8);
+#endif
+	ptrBuffer8.Append(_L8(" "));
+	DumpToFileL(ptrBuffer8);
+	CleanupStack::PopAndDestroy(3); // buffer8, pDateBuffer, pTimeBuffer
+	}
+
+EXPORT_C void NSmlDebugPrintHeaderL( TText8* aFile, TInt aLine )
+	{
+	TInt err(KErrNone);
+	TRAP(err, _NSmlDebugPrintHeaderL(aFile, aLine));
+	}
+
+// --------------------------------------------------------------------------------
+// void NSmlDebugPrintArgs8L( TText8* aFmt, ... )
+// --------------------------------------------------------------------------------
+void _NSmlDebugPrintArgs8L( const TDesC8& aFmt, VA_LIST aList )
+	{
+	HBufC8* pBuf = HBufC8::NewLC(1024*2);
+	TPtr8 buf = pBuf->Des();
+	buf.FormatList(aFmt, aList);
+	buf.Append(_L8("\r\n"));
+	DumpToFileL(buf);
+	CleanupStack::PopAndDestroy(); // pBuf
+	}
+
+EXPORT_C void NSmlDebugPrintArgs8L( const TText8* aFmt, ... )
+	{
+	VA_LIST args;
+	VA_START (args, aFmt);
+	TInt err(KErrNone);
+	TRAP(err, _NSmlDebugPrintArgs8L(TPtrC8(aFmt), args));
+	VA_END(args);
+	}
+
+// --------------------------------------------------------------------------------
+// void NSmlDebugPrintArgs16L( TText8* aFmt, ... )
+// --------------------------------------------------------------------------------
+void _NSmlDebugPrintArgs16L( const TDesC16& aFmt, VA_LIST aList )
+	{
+	HBufC16* buf = HBufC16::NewLC(1024*2);
+	buf->Des().FormatList(aFmt, aList);
+	HBufC8* pBuf8 = HBufC8::NewLC(1024*2);
+	TPtr8 buf8 = pBuf8->Des();
+	buf8.Copy(*buf);
+	buf8.Append(_L8("\r\n"));
+	DumpToFileL(buf8);
+	CleanupStack::PopAndDestroy(2); // buf, bBuf8
+	}
+
+EXPORT_C void NSmlDebugPrintArgs16L( const TText16* aFmt, ... )
+	{
+	VA_LIST args;
+	VA_START (args, aFmt);
+	TInt err(KErrNone);
+	TRAP(err, _NSmlDebugPrintArgs16L(TPtrC16(aFmt), args));
+	VA_END(args);
+	}
+
+//End of File
+