memana/analyzetoolclient/dynamicmemoryhook/src/customuser.cpp
changeset 2 6a82cd05fb1e
parent 1 3ff3fecb12fe
--- a/memana/analyzetoolclient/dynamicmemoryhook/src/customuser.cpp	Thu Feb 11 15:52:57 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,490 +0,0 @@
-/*
-* Copyright (c) 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:  Definitions for the class CustomUser.
-*
-*/
-
-#include <f32file.h>
-#include <utf.h>
-#include "customuser.h"
-#include "analyzetoolmainallocator.h"
-#include "analyzetoolallocator.h"
-#include "atlog.h"
-#include "analyzetoolmemoryallocator.h"
-#include "analyzetoolpanics.pan"
-#include "atstorageservercommon.h"
-#include "atdriveinfo.h"
-
-// CONSTANTS
-// When needed, update the version number directly inside _LIT macro.
-// Constant for the atool API(staticlib) version.
-_LIT( KAtoolApiVersion, "1.7.4" );
-
-// Version number buffer length
-const TInt KAtoolVersionNumberLength = 10;
-
-// Wrong version error code
-const TInt KAtoolVersionError = -1999;
-
-// Version number separator
-_LIT( KVersionSeparator, ";" );
-
-// Incorrect version error strings 
-_LIT8( KDataFileVersion, "DATA_FILE_VERSION 10\r\n" );
-_LIT( KIncorrectText, "ERROR_OCCURED INCORRECT_ATOOL_VERSION [API v.%S][ATOOL v.%S]" );
-_LIT( KIncorrectTextXti, "PCSS " );
-
-// -----------------------------------------------------------------------------
-// CustomUser::Panic()
-// Overloaded User::Panic() function
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CustomUser::Panic( const TDesC& aCategory, TInt aReason )
-    {
-    LOGSTR3( "ATMH CustomUser::Panic() %S %i", &aCategory, aReason );
-    
-    // Uninstall thread's RAllocator
-    ( (RAnalyzeToolMemoryAllocator&) User::Allocator() ).Uninstall();
-       
-    // Call the "real" User::Panic()
-    User::Panic( aCategory, aReason );
-    }
-
-// -----------------------------------------------------------------------------
-// CustomUser::Exit()
-// Overloaded User::Exit() function
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CustomUser::Exit( TInt aReason )
-    {
-    LOGSTR3( "ATMH CustomUser::Exit() %i %i", aReason, RThread().Id().Id() );
-    
-    if ( aReason != KAtoolVersionError )
-    	{
-    	// Uninstall thread's RAllocator
-    	( (RAnalyzeToolMemoryAllocator&) User::Allocator() ).Uninstall();
-    	LOGSTR1( "ATMH CustomUser::Exit() - about to User::Exit" );
-    	}
-    
-    // Call the "real" User::Exit()
-    User::Exit( aReason );
-    }
-
-// -----------------------------------------------------------------------------
-// CustomUser::SetCritical()
-// Overloaded User::SetCritical() function which returns
-// KErrNone, if successful; KErrArgument, if EAllThreadsCritical is 
-// passed - this is a state associated with a process, and you use 
-// User::SetProcessCritical() to set it.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TInt CustomUser::SetCritical( User::TCritical aCritical )
-    {
-    LOGSTR1( "ATMH CustomUser::SetCritical()" );
-    // Check the given User::TCritical type
-    if ( aCritical == User::EAllThreadsCritical )
-        {
-        return KErrArgument;
-        }
-    else
-        {
-        return KErrNone;
-        }
-    }
-  
-// -----------------------------------------------------------------------------
-// CustomUser::SetProcessCritical()
-// Overloaded User::SetProcessCritical() function
-// KErrNone, if successful; KErrArgument, if either EProcessCritical or 
-// EProcessPermanent is passed - these are states associated with a 
-// thread, and you use User::SetCritical() to set them.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TInt CustomUser::SetProcessCritical( User::TCritical aCritical )
-    {
-    LOGSTR1( "ATMH CustomUser::SetProcessCritical()" );
-     // Check the given User::TCritical type 
-    if ( aCritical == User::EProcessCritical || 
-         User::EProcessPermanent == aCritical )
-        {
-        return KErrArgument;
-        }
-    else
-        {
-        return KErrNone;
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CustomUser::SetupThreadHeap()
-// Overloaded UserHeap::SetupThreadHeap function
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TInt CustomUser::SetupThreadHeap( TBool aNotFirst, 
-    SStdEpocThreadCreateInfo& aInfo, const TFileName aFileName,
-    TUint32 aLogOption, TUint32 aIsDebug, const TFileName aVersion,
-    TUint32 aAllocCallStackSize, TUint32 aFreeCallStackSize )
-    {
-    LOGSTR1( "ATMH CustomUser::SetupThreadHeap()" );
-    LOGSTR2( "ATMH > Thread id(%d)", RThread().Id().operator TUint() );
-    
-    TInt ret( KErrNone );    
-    // Check version number
-    TBuf<KAtoolVersionNumberLength> atoolVer;
-    if ( CheckVersion( aVersion, atoolVer ) != KErrNone )
-    	{
-    	LOGSTR1( "ATMH > Wrong API version > Inform user and Exit." );
-    	ReportIncorrectVersion( aLogOption, aFileName, atoolVer );
-    	return KAtoolVersionError;
-    	}
-    
-    // Check is this shared heap
-    if ( aInfo.iAllocator == NULL )
-        {
-        LOGSTR1( "ATMH creating a new heap" );
-        // RAllocator is NULL so heap is not shared, creating a new heap
-        ret = UserHeap::SetupThreadHeap( aNotFirst, aInfo );
-        __ASSERT_ALWAYS( KErrNone == ret, AssertPanic( EFailedToCreateHeap ) );
-        
-#if ( SYMBIAN_VERSION_SUPPORT >= SYMBIAN_3 )
-    #ifndef __WINS__
-        // Set dummy Tls value
-        TAny* dummyPtr( NULL );
-        TInt setErr( UserSvr::DllSetTls( KDummyHandle, dummyPtr ) );
-        LOGSTR2( "ATMH > Set Tls err(%i)", setErr );
-    #endif
-#endif
-        // Install the RAllocator
-        aInfo.iAllocator = &InstallAllocator( aNotFirst, aFileName, aLogOption, aIsDebug,
-                aAllocCallStackSize, aFreeCallStackSize );
-        }
-    else
-        {
-        LOGSTR1( "ATMH sharing the heap" );
-        // The heap is shared. Acquire pointer to the original heap
-        RAnalyzeToolMemoryAllocator* allocator = 
-			(RAnalyzeToolMemoryAllocator*) aInfo.iAllocator;
-        // Share the heap
-        allocator->ShareHeap();
-        // Switch thread heap 
-        User::SwitchAllocator( allocator );
-        }
-    return ret;
-    }
-
-// -----------------------------------------------------------------------------
-// CustomUser::InstallAllocator
-// Installs the RAllocator
-// -----------------------------------------------------------------------------
-//
-//lint -e{429} suppress "Custodial pointer 'allocator' has not been freed or returned"
-EXPORT_C RAllocator& CustomUser::InstallAllocator( TBool aNotFirst, 
-	const TFileName aFileName, TUint32 aLogOption, TUint32 aIsDebug,
-	TUint32 aAllocCallStackSize, TUint32 aFreeCallStackSize )
-    {
-    LOGSTR1( "ATMH CustomUser::InstallAllocator()" );
-    
-    // Open handle to the device driver
-    RAnalyzeTool analyzetool;
-    TInt error = analyzetool.Open();
-    
-    // Check if the device driver has already loaded
-    if ( KErrNone == error )
-        {
-        LOGSTR1( "ATMH CustomUser::InstallAllocator() - analyzetool.Open() returned KErrNone" );
-        // The device driver has already loaded
-        // Get pointer to the main thread allocator
-        TMainThreadParamsBuf params;
-        params().iProcessId = RProcess().Id().operator TUint();
-        error = analyzetool.MainThreadAlloctor( params );
-
-        __ASSERT_ALWAYS( KErrNone == error, AssertPanic( ECantOpenHandle ) );
-        
-        // Close handle to the device driver
-        analyzetool.Close();
-        
-        // Is this the first thread of the program
-        if ( params().iAlone )
-            {
-            LOGSTR1( "ATMH CustomUser::InstallAllocator() - first thread of the program" );
-            // Only one thread in the program. Must be main thread
-            RAnalyzeToolMainAllocator* allocator = 
-				new RAnalyzeToolMainAllocator( aNotFirst, aFileName, aLogOption,
-				                               aIsDebug, aAllocCallStackSize, aFreeCallStackSize );
-            
-            __ASSERT_ALWAYS( allocator != NULL, AssertPanic( ENoMemory ) );
-            
-            // Change threads allocator
-            User::SwitchAllocator( allocator );
-            
-            // Return reference to the RAllocator
-            return *allocator;
-            }
-        // This is not the first thread. A new thread with a new heap created
-        else
-            {
-            LOGSTR1( "ATMH CustomUser::InstallAllocator() - create a new allocator for the new thread" );
-            // Create new RAllocator with handles from the main thread
-            RAnalyzeToolAllocator* allocator = new RAnalyzeToolAllocator( 
-                    aNotFirst,
-                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->StorageServer(), 
-                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->Codeblocks(), 
-                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->Mutex(), 
-                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->ProcessId(), 
-                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->AnalyzeTool(),
-                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->StorageServerOpen(),
-                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->LogOption(),
-                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->AllocMaxCallStack(),
-                    ((RAnalyzeToolMainAllocator*)params().iAllocator)->FreeMaxCallStack() );
-
-            __ASSERT_ALWAYS( allocator != NULL, AssertPanic( ENoMemory ) );
-            
-            // Change threads allocator
-            User::SwitchAllocator( allocator );
-            
-            // Return reference to the RAllocator
-            return *allocator;
-            }
-        }
-    // The device driver does not exists so this must be the first thread
-    else
-        {
-        LOGSTR1( "ATMH CustomUser::InstallAllocator() - analyzetool.Open() returned error, creating DD" );
-        RAnalyzeToolMainAllocator* allocator = 
-			new RAnalyzeToolMainAllocator( aNotFirst, aFileName, aLogOption, aIsDebug,
-			        aAllocCallStackSize, aFreeCallStackSize );
-        
-        __ASSERT_ALWAYS( allocator != NULL, AssertPanic( ENoMemory ) );
-        
-        // Change threads allocator
-        User::SwitchAllocator( allocator );
-
-        // Return reference to the RAllocator
-        return *allocator;
-        }
-    } 
-    
-// -----------------------------------------------------------------------------
-// AnalyzeToolInterface::StartSubTest
-// Function for starting a subtest with a given name
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void AnalyzeToolInterface::StartSubTest( const TDesC8& aSubtestId )
-    {
-    LOGSTR1( "ATMH AnalyzeToolInterface::StartSubTest()" );
-    // Open handle to the device driver
-    RAnalyzeTool analyzetool;
-    TInt error = analyzetool.Open();
-    if ( KErrNone == error )
-        {
-        LOGSTR1( "ATMH AnalyzeToolInterface::StartSubTest() - DD opened" );
-        // The device driver has already loaded
-        // Get pointer to the main thread allocator
-        TMainThreadParamsBuf params;
-        params().iProcessId = RProcess().Id().operator TUint();
-        error = analyzetool.MainThreadAlloctor( params );
-
-        __ASSERT_ALWAYS( KErrNone == error, AssertPanic( ECantOpenHandle ) );
-        
-        // Close handle to the device driver
-        analyzetool.Close();
-
-        if ( ( ( RAnalyzeToolMainAllocator* )params().iAllocator )->StorageServerOpen() )
-            {
-                LOGSTR1( "ATMH AnalyzeToolInterface::StartSubTest() - SS open -> try to start subtest" );
-            // Start subtest
-            ( ( RAnalyzeToolMainAllocator* )params().iAllocator )->
-                        StorageServer().StartSubTest( aSubtestId );
-            }
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// AnalyzeToolInterface::StopSubTest
-// Function for stopping a subtest with a given name
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void AnalyzeToolInterface::StopSubTest( const TDesC8& aSubtestId )
-    {
-    LOGSTR1( "ATMH AnalyzeToolInterface::StopSubTest()" );
-    // Open handle to the device driver
-    RAnalyzeTool analyzetool;
-    TInt error = analyzetool.Open();
-    if ( KErrNone == error )
-        {
-        LOGSTR1( "ATMH AnalyzeToolInterface::StopSubTest() - DD opened" );
-        // The device driver has already loaded
-        // Get pointer to the main thread allocator
-        TMainThreadParamsBuf params;
-        params().iProcessId = RProcess().Id().operator TUint();
-        error = analyzetool.MainThreadAlloctor( params );
-
-        __ASSERT_ALWAYS( KErrNone == error, AssertPanic( ECantOpenHandle ) );
-        
-        // Close handle to the device driver
-        analyzetool.Close();
-
-        if ( ( ( RAnalyzeToolMainAllocator* )params().iAllocator )->StorageServerOpen() )
-            {
-                LOGSTR1( "ATMH AnalyzeToolInterface::StopSubTest() - SS open -> try to stop subtest" );
-            // Start subtest
-            ( ( RAnalyzeToolMainAllocator* )params().iAllocator )->
-                        StorageServer().StopSubTest( aSubtestId );
-            }
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CustomUser::__DbgMarkEnd
-// Marks the end of heap cell checking at the current nested level 
-// for the current thread's default heap, or the kernel heap.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TUint32 CustomUser::__DbgMarkEnd( TBool /*aKernel*/, TInt /*aCount*/ )
-    {
-    LOGSTR1( "ATMH CustomUser::__DbgMarkEnd()");
-    // Return just zero to override system's memory leak check
-    return 0;
-    }
-
-// -----------------------------------------------------------------------------
-// CustomUser::CheckVersion
-// Check atool version
-// -----------------------------------------------------------------------------
-//
-TInt CustomUser::CheckVersion( const TFileName aVersion, TDes& aToolVersion )
-    { 
-    LOGSTR2( "ATMH CustomUser::CheckVersion(), aVersion( %S )", &aVersion );
-    
-    TFileName version;
-    version.Copy( aVersion );
-    TBuf<KAtoolVersionNumberLength> apiVer;
-    	
-    // Find separator place
-    TInt findplace( version.Find( KVersionSeparator() ) );
-    // Parse API version first [x.x.x;x.x.x]
-    if ( findplace >= 0 && findplace <= apiVer.MaxLength() )
-		{
-		apiVer.Copy( version.Mid( 0, findplace ) ); 
-		version.Delete( 0, findplace + KVersionSeparator().Length() );
-		}
- 
-    if ( version.Length() <= aToolVersion.MaxLength() )
-    	{
-    	aToolVersion.Copy( version );
-    	if ( aToolVersion.Compare( KAtoolApiVersion ) == KErrNone &&
-    		 apiVer.Length() == 0 )
-    		{
-    		// Support 1.5.0 version (Version info: [1.5.0])
-    		apiVer.Copy( version );
-    		}
-    	}
-    
-    LOGSTR3( "ATMH > API version( %S ), ATOOL version( %S )", 
-    		&apiVer, &aToolVersion );
-        
-    // Check version numbers 
-    if ( apiVer.Compare( KAtoolApiVersion ) == KErrNone )
-    	{
-    	return KErrNone;
-    	}
-    return KErrCancel;    
-    }
-
-// -----------------------------------------------------------------------------
-// CustomUser::ReportIncorrectVersion
-// Function for showing incorrect version information
-// -----------------------------------------------------------------------------
-//
-void CustomUser::ReportIncorrectVersion( const TUint32 aLogOption,
-	const TFileName aFileName, const TDes& aToolVersion )
-	{
-	LOGSTR2( "ATMH CustomUser::ReportIncorrectVersion(), aFileName( %S )", 
-			&aFileName );
-	
-	switch ( aLogOption )
-		{
-		case EATLogToFile:
-			{
-			LOGSTR1( "ATMH ReportIncorrectVersion > EATLogToFile" );			
-			
-			// A handle to a file server session.
-			RFs fs;
-			// Creates and opens a file, 
-			// and performs all operations on a single open file.
-			RFile file;	
-			// Create full path buffer
-			TBuf<KMaxFileName> logFileBuf;
-			// Connects a client to the file server.
-			TInt err( fs.Connect() );
-			
-			if ( !err )
-				{				
-                err = TATDriveInfo::CreatePath( logFileBuf, aFileName, fs );
-			    
-				// Replace file if exists
-				if ( err && err != KErrAlreadyExists )
-					{
-					LOGSTR2( "ATMH > TATDriveInfo::CreatePath() err( %i )", err );
-					return;
-					}
-				
-				// Replace file if exists (drive C)
-				err = file.Replace( fs, logFileBuf, EFileWrite );
-										
-				// Write to file
-				if ( !err )
-					{
-					err = file.Write( KDataFileVersion );
-					// Error msg buffer
-					TBuf8<KMaxFileName> msg;				     
-					// Write the error code to the buffer  
-					logFileBuf.Format( KIncorrectText, &KAtoolApiVersion, &aToolVersion );	
-					CnvUtfConverter::ConvertFromUnicodeToUtf8( msg, logFileBuf );
-					err = file.Write( msg );
-					}
-				// Closes the file.
-				file.Close();
-				}
-			
-			LOGSTR2( "ATMH > File err( %i )", err );			
-			// Closes the handle.
-			fs.Close();
-			}
-			break;
-			
-		case EATUseDefault:
-		case EATLogToXti:
-			{
-			LOGSTR1( "ATMH > ReportIncorrectVersion > EATLogToXti" );
-			// Error msg buffer
-			TBuf<KMaxFileName> msg;	
-			msg.Copy( KIncorrectTextXti );
-			msg.Append( KIncorrectText );
-			TBuf<KMaxFileName> xtiMsg;	
-			// Write the error code to the buffer  
-			xtiMsg.Format( msg, &KAtoolApiVersion, &aToolVersion );
-			RDebug::Print( xtiMsg );
-			}
-			break;
-		
-		default:
-			{
-			LOGSTR1( "ATMH > ReportIncorrectVersion > default" );
-			}
-			break;
-		}	
-	}
-
-// End of File