sysperfana/memspyext/com.nokia.s60tools.heapanalyser/src/com/nokia/s60tools/heapanalyser/interfaces/HeapAnalyserLauncher.java
author Jussi Ryoma <ext-jussi.s.ryoma@nokia.com>
Tue, 24 Aug 2010 14:01:48 +0300
changeset 16 72f198be1c1d
parent 7 8e12a575a9b5
permissions -rw-r--r--
Crash Analyser Carbide Extension 1.4.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: 
*
*/



package com.nokia.s60tools.heapanalyser.interfaces;

import java.io.File;

import com.nokia.s60tools.heapanalyser.HeapAnalyserPlugin;
import com.nokia.s60tools.util.debug.DbgUtility;

/**
 * Class with static variables and helper method to launch Heap Analyser.
 */
public class HeapAnalyserLauncher {

    /// Indicates an unspecified or general error
    public static final int KErrCommandLineGeneral = -1;

    /// Indicates that one or more mandatory command line arguments was omitted
    public static final int KErrCommandLineArgumentsMissing = -2;

    /// Indicates that an input command was not supported or valid
    public static final int KErrCommandLineInvalidCommand = -3;

    /// Indicates that the specified input file was not found
    public static final int KErrCommandLineArgumentsFileNotFound = -4;

    /// Indicates a fatal problem when attempting to read the input file
    public static final int KErrCommandLineArgumentsFileInvalid = -5;

    /// Indicates source file(s) were not found or specified
    public static final int KErrCommandLineSourceFileNotFound = -6;

    /// Indicates debug meta data was omitted from the inputs
    public static final int KErrCommandLineDebugMetaDataMissing = -7;

    /// Occurs if Heap Analyser cannot find a handler for the specified command
    /// line arguments.
    public static final int KErrCommandLineUINotAvailable = -8;

    /// The requested analysis type is not supported
    public static final int KErrCommandLineAnalysisTypeNotSupported = -9;

    /// The specified analysis thread name is invalid
    public static final int KErrCommandLineAnalysisThreadNameInvalid = -10;

    /// The specified output data is invalid
    public static final int KErrCommandLineAnalysisOutputInvalid = -11;
	
    /// The specified output data is invalid
    public static final int KErrCommandLineLaunchingFailed = -12;
	
	
	private static final String EXE_FOLDER = "Binaries";
	private static final String COMMAND_LINE_COMMAND = " -input "; 

	/**
	 * Launch Heap Analyser application.
	 * @param configurationFilePath
	 * @return {@link Process#exitValue()} or {@link HeapAnalyserLauncher#KErrCommandLineLaunchingFailed} 
	 * if an exception occurs.
	 */
	public static int launchHeapAnalyser( String configurationFilePath ){
		String workingDirectory = getHeapAnalyserPath();
		String heapAnalyserCommand = workingDirectory + "HeapAnalyser.exe";
		
		// surround file paths with quotation marks so that spaces in file names wont cause failure.
		heapAnalyserCommand = surroundWithQuotation( heapAnalyserCommand ); 
		configurationFilePath = surroundWithQuotation( configurationFilePath );
		
		String commandLineCommand = heapAnalyserCommand + COMMAND_LINE_COMMAND + configurationFilePath;
	
		int returnValue = 0;
		
		File file = new File(workingDirectory);
		
		// execute HeapAnalyser.exe
		try {
			DbgUtility.println(DbgUtility.PRIORITY_OPERATION, "Starting Heap Analyser: " + commandLineCommand); //$NON-NLS-N$
			Process p = Runtime.getRuntime().exec(commandLineCommand, null, file);
			p.waitFor();
			returnValue = p.exitValue();
		} 
		catch (Exception e) {
			return KErrCommandLineLaunchingFailed;
		} 
		
		return returnValue;
		
		
	}
	
	/**
	 * Gets the path where HeapAnalyserConsole.exe is located
	 * @return the path where HeapAnalyserConsole.exe is located
	 */
	private static String getHeapAnalyserPath() {
		String heapAnalyserExePath = HeapAnalyserPlugin.getPluginInstallPath();
		if (!heapAnalyserExePath.endsWith(File.separator)){
			heapAnalyserExePath += File.separator;
		}
		heapAnalyserExePath += EXE_FOLDER + File.separator;
		return heapAnalyserExePath;
	}
	
	private static String surroundWithQuotation( String text ){
		String retVal = "\"";
		retVal = retVal + text + retVal;
		return retVal;
	}
	
	/**
	 * Gets HeapAnalyser launcher error message.
	 */
	public static String getErrorMessage(int returnValue ){
		switch(returnValue){
			case HeapAnalyserLauncher.KErrCommandLineLaunchingFailed:{
				return "MemSpy was unable to start analysing imported files.";
			}
			case HeapAnalyserLauncher.KErrCommandLineGeneral:{
				return "Unspecified or general error";
			}
			case HeapAnalyserLauncher.KErrCommandLineArgumentsMissing:{
				return "An error occurred when starting Heap Analyser.(Command line argument missing)";
			}
			case HeapAnalyserLauncher.KErrCommandLineInvalidCommand:{
				return "An error occurred when starting Heap Analyser.(Input command not specified)";
			}
			case HeapAnalyserLauncher.KErrCommandLineArgumentsFileNotFound:{
				return "An error occurred when starting Heap Analyser.(Input.xml file not found)";
			}
			case HeapAnalyserLauncher.KErrCommandLineArgumentsFileInvalid:{
				return "An error occurred when starting Heap Analyser.(Unable to read input file. Perhaps your symbol or map files are moved/renamed. )";
			}
			case HeapAnalyserLauncher.KErrCommandLineSourceFileNotFound:{
				return "An error occurred when starting Heap Analyser.(Unable to read source file)";
			}
			case HeapAnalyserLauncher.KErrCommandLineDebugMetaDataMissing:{
				return "An error occurred when starting Heap Analyser.(Symbol files were not found)";
			}
			case HeapAnalyserLauncher.KErrCommandLineUINotAvailable:{
				return "An error occurred when starting Heap Analyser.(Command line UI not available)";
			}
			case HeapAnalyserLauncher.KErrCommandLineAnalysisTypeNotSupported:{
				return "An error occurred when starting Heap Analyser.(Analysis type not supported)";
			}
			case HeapAnalyserLauncher.KErrCommandLineAnalysisThreadNameInvalid:{
				return "An error occurred when starting Heap Analyser.(Thread name invalid)";
			}
			case HeapAnalyserLauncher.KErrCommandLineAnalysisOutputInvalid:{
				return "An error occurred when starting Heap Analyser.(Output file invalid)";
			}
			default:
				return "An unknown error occurred when starting Heap Analyser. "
				       + "Check software prerequisites from release notes "
				       + "(e.g. check correct version of .NET framework is installed).";
		}
	}
}