diff -r 000000000000 -r b497e44ab2fc syncmlfw/common/debug/src/nsmldebug.cpp --- /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 +#undef __DEBUG_THIS__ + +#include +#include +#include +#include + +#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 +