debuggercdi/com.nokia.cdt.debug.cw.symbian/src/com/nokia/cdt/debug/cw/symbian/SettingsData.java
changeset 0 fb279309251b
child 200 08d645f6399f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debuggercdi/com.nokia.cdt.debug.cw.symbian/src/com/nokia/cdt/debug/cw/symbian/SettingsData.java	Fri Apr 03 23:33:03 2009 +0100
@@ -0,0 +1,989 @@
+/*
+* 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 the License "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.cdt.debug.cw.symbian;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.IBinaryParser;
+import org.eclipse.cdt.core.ICExtensionReference;
+import org.eclipse.cdt.core.IBinaryParser.IBinaryObject;
+import org.eclipse.cdt.core.model.CModelException;
+import org.eclipse.cdt.core.model.CoreModel;
+import org.eclipse.cdt.core.model.IBinary;
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationType;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.osgi.framework.Version;
+
+import com.freescale.cdt.debug.cw.core.ProcessFactory;
+import com.freescale.cdt.debug.cw.core.RemoteConnectionsTRKHelper;
+import com.freescale.cdt.debug.cw.core.settings.ConnectionTypeInfo;
+import com.freescale.cdt.debug.cw.core.settings.DebuggerCommonData;
+import com.freescale.cdt.debug.cw.core.settings.Utils;
+import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
+import com.nokia.carbide.cdt.builder.EpocEngineHelper;
+import com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
+import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
+import com.nokia.carbide.cdt.builder.project.ISISBuilderInfo;
+import com.nokia.carbide.cpp.sdk.core.ISymbianBuildContext;
+import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
+import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin;
+import com.nokia.carbide.remoteconnections.interfaces.IConnection;
+
+import cwdbg.PreferenceConstants;
+
+public class SettingsData {
+
+	// NOTE: Many of these constants are mirrored in 
+	// com.freescale.cdt.debug.cw.core.RemoteConnectionsTRKHelper
+	// Due to dependency ordering, they can't be used directly
+	// If you change any of these, please be sure to change them there, as well.
+	
+	public static final String PREFIX = "com.nokia.cdt.debug.cw.symbian.SettingsData"; //$NON-NLS-1$
+	public static final String LaunchConfig_Context= PREFIX + ".LaunchConfig_Context"; //$NON-NLS-1$
+	public static final String LaunchConfig_Emulator = PREFIX + ".LaunchConfig_Emulator"; //$NON-NLS-1$
+	public static final String LaunchConfig_AppTRK = PREFIX + ".LaunchConfig_AppTRK"; //$NON-NLS-1$
+	public static final String LaunchConfig_SysTRK = PREFIX + ".LaunchConfig_SysTRK"; //$NON-NLS-1$
+	public static final String LaunchConfig_CrashDebugger = PREFIX + ".LaunchConfig_CrashDebugger"; //$NON-NLS-1$
+	public static final String LaunchConfig_Trace32 = PREFIX + ".LaunchConfig_Trace32"; //$NON-NLS-1$
+	public static final String LaunchConfig_SophiaSTI = PREFIX + ".LaunchConfig_SophiaSTI"; //$NON-NLS-1$
+
+	public static final String ATTR_originalName = "originalName"; //$NON-NLS-1$
+
+	// Executable targeting
+	public static final int LCS_ExeTargetingRule_AllInSDK = 0;
+	public static final int LCS_ExeTargetingRule_AllInProject = 1;
+	public static final int LCS_ExeTargetingRule_ExeList = 2;
+	public static final int LCS_ExeTargetingRule_All = 3;
+	public static final String LCS_ExecutableTargetingRule = PREFIX + ".LCS_ExecutableTargetingRule";
+
+	// Launch Type IDs
+	private static final String LAUNCH_TYPE_PREFIX = "com.nokia.cdt.debug.launch."; //$NON-NLS-1$
+	public static final String CONTEXT_LAUNCH_TYPE_ID = LAUNCH_TYPE_PREFIX + "contextLaunch"; //$NON-NLS-1$
+	public static final String EMULATION_LAUNCH_TYPE_ID = LAUNCH_TYPE_PREFIX + "emulationLaunch"; //$NON-NLS-1$
+	public static final String APP_TRK_LAUNCH_TYPE_ID = LAUNCH_TYPE_PREFIX + "appTRKLaunch"; //$NON-NLS-1$
+	public static final String SYS_TRK_LAUNCH_TYPE_ID = LAUNCH_TYPE_PREFIX + "systemTRKLaunch"; //$NON-NLS-1$
+	public static final String ATTACH_LAUNCH_TYPE_ID = LAUNCH_TYPE_PREFIX + "attachLaunch"; //$NON-NLS-1$
+	public static final String STI_LAUNCH_TYPE_ID = LAUNCH_TYPE_PREFIX + "stiLaunch"; //$NON-NLS-1$
+	public static final String T32_LAUNCH_TYPE_ID = LAUNCH_TYPE_PREFIX + "t32Launch"; //$NON-NLS-1$
+
+	//================ Shadowed CW Preference Panels =================================
+	// These match prefs in a pref panel that exist in the CodeWarrior IDE. The names
+	// have to match exactly the name of the fields in the C++ pref struct.
+
+	// Utility method: forms Shadowed Pref panel Name (the panel name shared with backend).
+	private static String SPN(String cwPanelName, String cwPrefName)
+	{
+		return Utils.formShadowedPrefName(cwPanelName, cwPrefName);
+	}
+
+	//---< Serial Communication Panel> -------------------
+	
+	public static final String spn_SerialComm = "Serial Communications"; //$NON-NLS-1$
+
+	public static final String spn_SerialComm_port= SPN(spn_SerialComm, "port"); //$NON-NLS-1$
+	public static final String spn_SerialComm_rate= SPN(spn_SerialComm, "rate"); //$NON-NLS-1$
+	public static final String spn_SerialComm_databits= SPN(spn_SerialComm, "databits"); //$NON-NLS-1$
+	public static final String spn_SerialComm_stopbits= SPN(spn_SerialComm, "stopbits"); //$NON-NLS-1$
+	public static final String spn_SerialComm_parity= SPN(spn_SerialComm, "parity"); //$NON-NLS-1$
+	public static final String spn_SerialComm_flowcontrol= SPN(spn_SerialComm, "flowcontrol"); //$NON-NLS-1$
+	public static final String spn_SerialComm_logdata= SPN(spn_SerialComm, "logdata"); //$NON-NLS-1$
+	public static final String spn_SerialComm_serialConn= SPN(spn_SerialComm, "serial"); //$NON-NLS-1$
+	public static final String spn_SerialComm_xtiConn= SPN(spn_SerialComm, "tcpip"); //$NON-NLS-1$
+
+	//---< T32 Connection Panel> -------------------
+	
+	public static final String spn_Trace32Conn= "Trace32 Connection"; //$NON-NLS-1$
+	
+	public static final String spn_Trace32Conn_ExePath= SPN(spn_Trace32Conn, "LauterbachTrace32ExePath"); //$NON-NLS-1$
+	public static final String spn_Trace32Conn_ConfigFilePath= SPN(spn_Trace32Conn, "Trace32ConfigFilePath"); //$NON-NLS-1$
+	public static final String spn_Trace32Conn_BootScriptFile= SPN(spn_Trace32Conn, "Trace32BootConfigFilePath"); //$NON-NLS-1$
+	public static final String spn_Trace32Conn_UdpPort= SPN(spn_Trace32Conn, "LauterbachTrace32UDPPort"); //$NON-NLS-1$
+	public static final String spn_Trace32Conn_LogOption= SPN(spn_Trace32Conn, "Trace32LogOption"); //$NON-NLS-1$	
+	public static final String spn_Trace32Conn_BootConfigArgs= SPN(spn_Trace32Conn, "Trace32BootConfigArgs"); //$NON-NLS-1$
+	
+	//	---< STI Connection Panel> -------------------
+	public static final String spn_SophiaSTIConn= "Sophia Target Interface Connection"; //$NON-NLS-1$
+	
+	public static final String spn_SophiaSTIConn_DllPath= SPN(spn_SophiaSTIConn, "SophiaTargetInterfaceDllPath"); //$NON-NLS-1$
+	public static final String spn_SophiaSTIConn_LogOption= SPN(spn_SophiaSTIConn, "STILogOption"); //$NON-NLS-1
+	public static final String spn_SophiaSTIConn_JtagClock= SPN(spn_SophiaSTIConn,	"STIJTAGClock"); //$NON-NLS-1
+	public static final String spn_SophiaSTIConn_StiEmulatorType= SPN(spn_SophiaSTIConn,	"STIJTAGType"); //$NON-NLS-1
+
+	//================= End of Shadowed panels ===========================================
+
+	public static final int J_PN_TrkTimeout_Default = 2000;
+	
+	private static String[] exceptionPropertyNames = null;
+	private static IPath mainExeTargetPath = null;
+	private static IPath mainExeHostPath = null;
+	private static IPath mainExeWorkspaceRelativeMMPPath = null;
+	
+	public static String[] getExceptionPropertyNames()
+	{
+		if (exceptionPropertyNames == null)
+		{
+			final String[] exceptionPrefNames = { "exc_CONTROL_C", //$NON-NLS-1$
+				"exc_FLT_INEXACT_RESULT", "exc_CONTROL_BREAK", //$NON-NLS-1$ //$NON-NLS-2$
+				"exc_FLT_INVALID_OPERATION", "exc_DATATYPE_MISALIGNMENT", //$NON-NLS-1$ //$NON-NLS-2$
+				"exc_FLT_STACK_CHECK", "exc_ACCESS_VIOLATION", "exc_FLT_OVERFLOW", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				"exc_IN_PAGE_ERROR", "exc_FLT_UNDERFLOW", "exc_NO_MEMORY", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				"exc_INT_DIVIDE_BY_ZERO", "exc_ILLEGAL_INSTRUCTION", //$NON-NLS-1$ //$NON-NLS-2$
+				"exc_INT_OVERFLOW", "exc_NONCONTINUABLE_EXCEPTION", //$NON-NLS-1$ //$NON-NLS-2$
+				"exc_PRIV_INSTRUCTION", "exc_INVALID_DISPOSITION", //$NON-NLS-1$ //$NON-NLS-2$
+				"exc_STACK_OVERFLOW", "exc_ARRAY_BOUNDS_EXCEEDED", //$NON-NLS-1$ //$NON-NLS-2$
+				"exc_DLL_NOT_FOUND", "exc_FLT_DENORMAL_OPERAND", //$NON-NLS-1$ //$NON-NLS-2$
+				"exc_DLL_INIT_FAIL", "exc_FLT_DIVIDE_BY_ZERO", "exc_MS_CPLUS" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+
+		};
+			
+			exceptionPropertyNames = new String[exceptionPrefNames.length];
+			for (int i = 0; i < exceptionPrefNames.length; i++) {
+				final String cwPanelName = "x86 Exceptions Panel"; //$NON-NLS-1$
+				exceptionPropertyNames[i] = Utils.formShadowedPrefName(cwPanelName, exceptionPrefNames[i]);
+			}
+		}
+		return exceptionPropertyNames;
+	}
+
+
+	static private void addSymbianSDKMapping(String epocRoot, ILaunchConfigurationWorkingCopy configuration) {
+		if (epocRoot.length() > 0 && new File(epocRoot).exists())
+			configuration.setAttribute(SymbianPlugin.Epoc_Root, epocRoot);
+}
+
+	static public void addSymbianSDKMapping(Path executable, ILaunchConfigurationWorkingCopy configuration) {
+		
+		String epocRoot = "";
+		String[] segs = executable.segments();
+		for (int i = 0; i < segs.length; i++) {
+			if (segs[i].equalsIgnoreCase("epoc32"))
+				epocRoot = executable.removeLastSegments(segs.length - i).toOSString();				
+		}
+		addSymbianSDKMapping(epocRoot, configuration);
+	}
+
+	static public void addSymbianSDKMapping(IProject project, ILaunchConfigurationWorkingCopy configuration) {
+		if (project != null) {
+	        ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo(project);
+			if (cpi == null){
+				try {
+					String exeLocation = configuration.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, "");
+					Path exePath = new Path(exeLocation);
+					addSymbianSDKMapping(exePath, configuration);
+				} catch (CoreException e) {
+					e.printStackTrace();
+				}
+			}else{
+				String epocRoot = cpi.getDefaultConfiguration().getSDK().getEPOCROOT();
+				addSymbianSDKMapping(epocRoot, configuration);
+			}
+		}
+	}
+	
+	private static IBinary setProgramNameToFirstBinary(ILaunchConfigurationWorkingCopy configuration, IProject project) {
+    	List<IBinary> applicableBinaries = getApplicableBinaries(configuration, project);
+		IBinary binaryToUse = null;
+		// try to find an exe to use
+		for (IBinary binary : applicableBinaries) {
+			if (binary.isExecutable()) {
+				binaryToUse = binary;
+				break;
+			}
+		}
+		// if none, use the first in the list
+		if (binaryToUse == null && !applicableBinaries.isEmpty())
+			binaryToUse = applicableBinaries.get(0);
+		if (binaryToUse != null) {
+			IPath location = binaryToUse.getResource().getLocation();
+			configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, location.toOSString());
+		}
+		return binaryToUse;
+	}
+
+	private static List<IBinary> getApplicableBinaries(ILaunchConfiguration configuration, IProject project) {
+		List<IBinary> applicableBinaries = new ArrayList<IBinary>();
+		boolean isEmulatorConfig = isEmulatorConfiguration(configuration);
+		try {
+			ICProject cProject = CoreModel.getDefault().create(project);
+			if (cProject != null) {
+				IBinary[] binaries = cProject.getBinaryContainer().getBinaries();
+				for (int i = 0; i < binaries.length; i++) {
+					IPath path = getCanonicalPath(binaries[i].getResource().getLocation());
+					int numSegs = path.segmentCount();
+					if (numSegs >= 3) {
+						if (isEmulatorConfig == "WINSCW".equalsIgnoreCase(path.segment(numSegs - 3)))
+							applicableBinaries.add(binaries[i]);
+					}
+				}
+			}
+		} catch (CModelException e) {
+			e.printStackTrace();
+			displayWarningDialog(Messages.getString("SettingsData.38")); //$NON-NLS-1$
+		}
+		return applicableBinaries;
+	}
+
+
+	public static void setEmulationMainTab(ILaunchConfigurationWorkingCopy configuration, IProject project) {
+		//======== Emulator: main tab ======================================
+		//
+		if (project != null) {
+			String projectName = project.getName();
+			configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, projectName);
+			configuration.setMappedResources( new IResource[] { project });
+			
+	        ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo(project);
+			if (cpi != null) {
+				ICarbideBuildConfiguration buildConfig = cpi.getDefaultConfiguration();
+				String configName = projectName + " " + buildConfig.getDisplayString(); //$NON-NLS-1$
+				configuration.rename(DebugPlugin.getDefault().getLaunchManager().generateUniqueLaunchConfigurationNameFrom(configName));
+
+				// make sure the selected build configuration of the current project
+				// is an emulator build, otherwise warn them that we can't set default values.
+				if (buildConfig.getPlatformString().compareTo(ISymbianBuildContext.EMULATOR_PLATFORM) == 0) {
+					configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, mainExeHostPath == null ? "" : mainExeHostPath.toOSString());
+
+					if (isEmulatorRequired(buildConfig, mainExeHostPath, mainExeWorkspaceRelativeMMPPath)) {
+						IPath releaseRoot = buildConfig.getSDK().getReleaseRoot();
+						String winscwudeb = releaseRoot.toOSString() + File.separator + "WINSCW" + File.separator + "UDEB"; //$NON-NLS-1$ //$NON-NLS-2$
+
+						String emulatorPath = winscwudeb + File.separator + "epoc.exe"; //$NON-NLS-1$
+						configuration.setAttribute(DebuggerCommonData.Host_App_Path, getCanonicalPath(emulatorPath));			
+					}
+					else if (mainExeHostPath != null) {
+						configuration.setAttribute(DebuggerCommonData.Host_App_Path, getCanonicalPath(mainExeHostPath.toOSString()));			
+					}
+				} else {
+					displayWarningDialog(Messages.getString("SettingsData.37")); //$NON-NLS-1$
+				}
+			}
+			else {
+				if (mainExeHostPath != null && !mainExeHostPath.isEmpty()) {
+					configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, mainExeHostPath.toOSString()); 				 					
+
+					// launch the emulator for non-"exe" files
+					if ("exe".equalsIgnoreCase(mainExeHostPath.getFileExtension())) {
+	 					configuration.setAttribute(DebuggerCommonData.Host_App_Path, mainExeHostPath.toOSString());			
+					} else {
+	   					String emulatorPath = mainExeHostPath.removeLastSegments(1).append("epoc.exe").toOSString();//$NON-NLS-1$
+	 					configuration.setAttribute(DebuggerCommonData.Host_App_Path, getCanonicalPath(emulatorPath));			
+					}
+				} else {
+					IBinary binary = setProgramNameToFirstBinary(configuration, project);
+					if (binary.isExecutable()) {
+						configuration.setAttribute(DebuggerCommonData.Host_App_Path, 
+								getCanonicalPath(binary.getResource().getLocation()).toOSString());
+					}
+				}
+			}
+		}
+	}
+	
+	private static String getCanonicalPath(String path) {
+		try {
+			return new File(path).getCanonicalPath();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return path;
+	}
+
+	private static IPath getCanonicalPath(IPath path) {
+		try {
+			if (path == null)
+				return null;
+			return new Path(path.toFile().getCanonicalPath());
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return path;
+	}
+
+	public static void setEmulationDebuggerTab(ILaunchConfigurationWorkingCopy configuration, IProject project) {
+		//============= Emulator debugger tab ============================================
+		//
+		configuration.setAttribute( DebugPlugin.ATTR_PROCESS_FACTORY_ID, ProcessFactory.ID );
+		configuration.setAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN );
+		configuration.setAttribute( PreferenceConstants.J_PN_StopAtMainSymbol, "E32Main" ); //$NON-NLS-1$
+		configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, false);
+		configuration.setAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_ENABLE_VARIABLE_BOOKKEEPING, false );
+		configuration.setAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_ENABLE_REGISTER_BOOKKEEPING, false );
+		configuration.setAttribute( PreferenceConstants.J_PN_SymbolLoadingRule, PreferenceConstants.J_PV_SymbolLoadingRule_Auto);
+		configuration.setAttribute( PreferenceConstants.J_PN_ViewProcessOutput, true);
+		configuration.setAttribute( PreferenceConstants.J_PN_ViewSystemMessage, false);
+		configuration.setAttribute( SymbianPlugin.DebugTraceLaunchSetting, true);
+	}
+	
+	public static void setX86ExceptionsTab(ILaunchConfigurationWorkingCopy configuration, IProject project) {
+		//======= Emulator: x86 Exceptions tab ===================================
+		// 
+		String[] exceptionPropertyNames = getExceptionPropertyNames();
+		// turn off all exceptions by default as the new emulators hit
+		// a bunch of recoverable exceptions while starting up
+		for (int i = 0; i < exceptionPropertyNames.length; i++) {
+			configuration.setAttribute(exceptionPropertyNames[i], false);
+		}
+	}
+	
+	public static void setTrkMainTab(ILaunchConfigurationWorkingCopy configuration, IProject project) {
+		//===== TRK :  main tab =================================================== 
+		//
+		configuration.setAttribute(PreferenceConstants.J_PN_RemoteProcessToLaunch, ""); //$NON-NLS-1$
+		configuration.setAttribute(PreferenceConstants.J_PN_ProgramArguments, ""); //$NON-NLS-1$
+
+		if (project != null) {
+			String projectName = project.getName();
+			configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, projectName);
+			configuration.setMappedResources( new IResource[] { project });
+
+	        ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo(project);
+			if (cpi != null) {
+				ICarbideBuildConfiguration buildConfig = cpi.getDefaultConfiguration();
+				String configName = projectName + " " + buildConfig.getDisplayString(); //$NON-NLS-1$
+				configuration.rename(DebugPlugin.getDefault().getLaunchManager().generateUniqueLaunchConfigurationNameFrom(configName));
+
+				// make sure the selected build configuration of the current project is not an emulator build
+				// otherwise warn them that we can't set default values.
+				if (buildConfig.getPlatformString().compareTo(ISymbianBuildContext.EMULATOR_PLATFORM) != 0) {
+					configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, mainExeHostPath == null ? "" : mainExeHostPath.toOSString());
+					configuration.setAttribute(PreferenceConstants.J_PN_RemoteProcessToLaunch, mainExeTargetPath == null ? "" : mainExeTargetPath.toOSString());
+				} else {
+					displayWarningDialog(Messages.getString("SettingsData.37")); //$NON-NLS-1$
+				}
+			} else {
+				IBinary binary = setProgramNameToFirstBinary(configuration, project);
+				String exeName = null;
+				if (mainExeHostPath != null)
+					exeName = mainExeHostPath.lastSegment();
+				else if (binary.isExecutable())
+					exeName = binary.getResource().getLocation().lastSegment();
+				if (exeName != null)	
+					configuration.setAttribute(PreferenceConstants.J_PN_RemoteProcessToLaunch, "C:\\sys\\bin\\" + exeName); //$NON-NLS-1$
+			}
+		}	
+	}
+	
+	public static void setStopModeMainTab(ILaunchConfigurationWorkingCopy configuration, IProject project) {
+		//===== StopMode :  main tab =================================================== 
+		//		
+		if (project != null) {
+			String projectName = project.getName();
+			configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, projectName);
+			configuration.setMappedResources( new IResource[] { project });
+
+	        ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo(project);
+			if (cpi != null) {
+				ICarbideBuildConfiguration buildConfig = cpi.getDefaultConfiguration();
+				String configName = projectName + " " + buildConfig.getDisplayString(); //$NON-NLS-1$
+				configuration.rename(DebugPlugin.getDefault().getLaunchManager().generateUniqueLaunchConfigurationNameFrom(configName));
+
+				// make sure the selected build configuration of the current project is not an emulator build
+				// otherwise warn them that we can't set default values.
+				if (buildConfig.getPlatformString().compareTo(ISymbianBuildContext.EMULATOR_PLATFORM) != 0) {
+					configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, mainExeHostPath == null ? "" : mainExeHostPath.toOSString());					
+				} else {
+					displayWarningDialog(Messages.getString("SettingsData.37")); //$NON-NLS-1$
+				}
+			} else {
+				setProgramNameToFirstBinary(configuration, project);
+			}
+		}	
+	}
+	
+	public static void setRomImgTab(ILaunchConfigurationWorkingCopy configuration, IProject project) {
+		if (project != null) {
+	        ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo(project.getProject());
+	        
+	        if (cpi != null) {
+	        	final ICarbideBuildConfiguration buildConfig = cpi.getDefaultConfiguration();
+	    		if (buildConfig != null){
+	    			if (buildConfig.getPlatformString().compareTo(ISymbianBuildContext.EMULATOR_PLATFORM) != 0) {
+	    				String epoc32Dir = buildConfig.getSDK().getEPOCROOT()+ "epoc32";
+	    				if (new File(epoc32Dir).exists())
+	    					configuration.setAttribute(PreferenceConstants.J_PN_SymbianKitEpoc32Dir, epoc32Dir);
+	    			} else {
+	    				displayWarningDialog(Messages.getString("SettingsData.37")); //$NON-NLS-1$
+	    			}
+	    		}
+	        }
+		}	        
+	}
+
+	public static void setTrkDebuggerTab(ILaunchConfigurationWorkingCopy configuration, IProject project) {
+		//======  TRK:  debugger tab ================================================================
+		//
+		configuration.setAttribute( DebugPlugin.ATTR_PROCESS_FACTORY_ID, ProcessFactory.ID );			
+		configuration.setAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN );
+		configuration.setAttribute( PreferenceConstants.J_PN_StopAtMainSymbol, "E32Main" ); //$NON-NLS-1$
+		configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, false);
+		configuration.setAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_ENABLE_VARIABLE_BOOKKEEPING, false );
+		configuration.setAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_ENABLE_REGISTER_BOOKKEEPING, false );
+		configuration.setAttribute( PreferenceConstants.J_PN_ViewUnframedData, true);
+		configuration.setAttribute( PreferenceConstants.J_PN_ViewCommMessages, false);
+		configuration.setAttribute( PreferenceConstants.J_PN_DefaultInstructionSet, PreferenceConstants.J_PV_DefaultInstructionSet_Auto);
+		configuration.setAttribute( PreferenceConstants.J_PN_TRKMessageTimeout, J_PN_TrkTimeout_Default);
+	}
+	
+	public static void setStopModeDebuggerTab(ILaunchConfigurationWorkingCopy configuration, IProject project) {
+		//======  Stop Mode:  debugger tab ================================================================
+		//
+		configuration.setAttribute( DebugPlugin.ATTR_PROCESS_FACTORY_ID, ProcessFactory.ID );
+		configuration.setAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN );
+		configuration.setAttribute( PreferenceConstants.J_PN_StopAtMainSymbol, "E32Main" ); //$NON-NLS-1$
+		configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, false);
+		configuration.setAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_ENABLE_VARIABLE_BOOKKEEPING, false );
+		configuration.setAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_ENABLE_REGISTER_BOOKKEEPING, false );
+		configuration.setAttribute( PreferenceConstants.J_PN_DefaultInstructionSet, PreferenceConstants.J_PV_DefaultInstructionSet_Auto);
+	}
+	public static void setSerialConnTab(ILaunchConfigurationWorkingCopy configuration, IProject project) {
+		//======== Serial Connection Tab =====================================
+		//
+		configuration.setAttribute(PreferenceConstants.J_PN_TrkConnectionType, PreferenceConstants.J_PV_TrkConnectionType_Serial);
+		configuration.setAttribute(RemoteConnectionsTRKHelper.USES_REMOTE_CONNECTIONS_ATTRIBUTE, true);
+		IConnection defaultConnection = RemoteConnectionsTRKHelper.getFirstCompatibleConnection();
+		if (defaultConnection != null)
+			configuration.setAttribute(RemoteConnectionsTRKHelper.CONNECTION_ATTRIBUTE, defaultConnection.getIdentifier());
+	}
+	
+	public static void setFileTransferTab(ILaunchConfigurationWorkingCopy configuration, IProject project) {
+
+		//======== File Transfer tab ============================================
+		//
+		configuration.setAttribute( PreferenceConstants.J_PN_FilesToTransfer, "" ); //$NON-NLS-1$
+		
+		// only do this for system TRK configurations
+		try {
+			if (configuration.getType().getIdentifier().compareTo(SYS_TRK_LAUNCH_TYPE_ID) == 0 ) {
+				if (project != null) {
+					
+			        ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo(project);
+					if (cpi != null) {
+						ICarbideBuildConfiguration buildConfig = cpi.getDefaultConfiguration();
+						
+						String defaultTargetPath = "C:\\"; //$NON-NLS-1$
+						if (buildConfig.getSDK().isEKA2()) {
+							// C:\\sys\bin for eka2
+							defaultTargetPath += "sys\\bin\\"; //$NON-NLS-1$
+						}
+						String prefsData = "";
+						
+						// we'll add all binaries that could be built by the config, but will only enabled those
+						// that are actually being built.
+						List<IPath> builtComponents = EpocEngineHelper.getComponentsBuiltByConifguration(buildConfig);
+						
+						// add the binaries and any resource-type files generated by all mmp files in the project
+						for (IPath mmp : EpocEngineHelper.getMMPFilesForBuildConfiguration(buildConfig)) {
+							String enabled = builtComponents.contains(mmp) ? ",1," : ",0,";
+							IPath hp = EpocEngineHelper.getHostPathForExecutable(buildConfig, mmp);
+							if (hp != null) {
+								IPath tp = EpocEngineHelper.getTargetPathForExecutable(buildConfig, mmp);
+								if (tp == null) {
+									tp = new Path(defaultTargetPath).append(hp.lastSegment());
+								}
+								prefsData += hp.toOSString() + "," + tp.toOSString() + enabled; //$NON-NLS-1$
+							}
+							
+							HashMap<String, String> hostTargetRSRCMap = EpocEngineHelper.getHostAndTargetResources(buildConfig, mmp);
+							// Add resource files...
+							for (String currHostRSRC : hostTargetRSRCMap.keySet()) {
+								prefsData += currHostRSRC + "," + hostTargetRSRCMap.get(currHostRSRC) + new Path(currHostRSRC).lastSegment() + enabled; //$NON-NLS-1$
+							}
+						}
+						
+						// check the project for image makefiles
+						HashMap<String, String> hostTargetImagesMap = EpocEngineHelper.getHostAndTargetImages(buildConfig);
+						for (String currHostImg : hostTargetImagesMap.keySet()) {
+							prefsData += currHostImg + "," + hostTargetImagesMap.get(currHostImg) + ",1,"; //$NON-NLS-1$ //$NON-NLS-2$
+						}
+						
+						// Add the files to transfer to the pref
+						configuration.setAttribute( PreferenceConstants.J_PN_FilesToTransfer, prefsData );
+					}
+				}
+			}
+		} catch (CoreException e) {
+			SymbianPlugin.log(e);
+		}
+	}
+	
+	public static void setInstallationTab(ILaunchConfigurationWorkingCopy configuration, IProject project) {
+
+		//=========== AppTRK Installation tab ==========================================
+		//
+		configuration.setAttribute( PreferenceConstants.J_PN_SisFileHostPath, "" ); //$NON-NLS-1$
+		configuration.setAttribute( PreferenceConstants.J_PN_SisFileTargetPath, "C:\\data\\" ); //$NON-NLS-1$
+		configuration.setAttribute( PreferenceConstants.J_PN_AlwaysInstallSisFile, false );
+		configuration.setAttribute( PreferenceConstants.J_PN_HideInstallerUI, true );
+		configuration.setAttribute( PreferenceConstants.J_PN_InstallToDrive, 2 ); // C:
+
+		if (project != null) {
+
+	        ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo(project);
+			if (cpi != null) {
+				List<ISISBuilderInfo> sisInfoList = cpi.getDefaultConfiguration().getSISBuilderInfoList();
+				if (sisInfoList != null && sisInfoList.size() > 0) {
+					// grab the last one in case they are embedded earlier built sis files
+					// in later built ones
+					configuration.setAttribute(PreferenceConstants.J_PN_SisFileHostPath, sisInfoList.get(sisInfoList.size() - 1).getFinalSISFullPath().toOSString());
+				}
+			}
+		}
+	
+	}
+
+	public static void setExecutablesTab(ILaunchConfigurationWorkingCopy configuration, String settingsGroup, IProject project) {
+		
+		//======== Executables Tab =====================================
+		// Defaults to all executables from the same SDK
+		configuration.setAttribute( LCS_ExecutableTargetingRule, LCS_ExeTargetingRule_AllInSDK ); //$NON-NLS-1$
+		configuration.setAttribute( PreferenceConstants.J_PN_ExecutablesToDebug, "" ); //$NON-NLS-1$
+		configuration.setAttribute(	PreferenceConstants.J_PN_SymbolLoadingRule,	PreferenceConstants.J_PV_SymbolLoadingRule_Auto);
+	}
+
+	/**
+	 * There are "internal preferences" that are not visible to (hence not changeable by) users. 
+	 * We set the values for them for different launch configurations. But when we change any 
+	 * of the values by re-coding, the change won't be picked up by existing launch configurations.
+	 *      
+	 * This function is supposed to fix that problem. It should be called on every debugger start.
+	 * 
+	 * Any internal preferences should be set here.
+	 * 
+	 */ 
+	public static void setInternalPreferences(ILaunchConfigurationWorkingCopy configuration, String settingsGroup)
+	{
+		// All but emulator debugger support OS Data View (kernel aware view) at present.
+		// 
+		if (settingsGroup.equals(LaunchConfig_Emulator)) 
+			configuration.setAttribute( PreferenceConstants.J_PN_SupportOSView, false);
+		else
+			configuration.setAttribute( PreferenceConstants.J_PN_SupportOSView, true);
+		
+		if (settingsGroup.equals(LaunchConfig_AppTRK) || 
+			    settingsGroup.equals(LaunchConfig_SysTRK) ||
+			    settingsGroup.equals(LaunchConfig_Emulator))
+		{
+			configuration.setAttribute( PreferenceConstants.J_PN_IsSystemModeDebug, false);
+		}
+		else // others like T32, Sophia and crash debugger.
+			configuration.setAttribute( PreferenceConstants.J_PN_IsSystemModeDebug, true);	
+	}
+
+	// a convenience function.
+	public static void setInternalPreferences(ILaunchConfiguration originalConfig, String settingsGroup)
+	{
+		ILaunchConfigurationWorkingCopy wc = null;
+		try {
+			wc = originalConfig.getWorkingCopy();
+			
+			if (wc == null)
+				return;
+			
+			setInternalPreferences(wc, settingsGroup);
+			
+			wc.doSave();
+		} catch (CoreException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public static void setDefaults(ILaunchConfigurationWorkingCopy configuration, String settingsGroup, IProject project)
+	{
+		if (project != null) {
+	        ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo(project);
+			if (cpi != null) {
+				ICarbideBuildConfiguration buildConfig = cpi.getDefaultConfiguration();
+				// get the list of binaries that are being built for the build config and their corresponding mmp's
+				List<IPath> exePaths = new ArrayList<IPath>(0);
+				List<IPath> mmpPaths = new ArrayList<IPath>(0);
+				EpocEngineHelper.getPathToAllExecutables(buildConfig, new ArrayList<IPath>(), exePaths, new ArrayList<IPath>(), mmpPaths);
+				if (exePaths.size() > 0) {
+					// pick the first exe in the list, otherwise the first binary in the list
+					IPath exePath = exePaths.get(0);
+					IPath mmpPath = mmpPaths.get(0);
+					for (int i=0; i<exePaths.size(); i++) {
+						String fileExt = exePaths.get(i).getFileExtension();
+						if (fileExt != null && fileExt.compareToIgnoreCase("exe") == 0) {
+							exePath = exePaths.get(i);
+							mmpPath = mmpPaths.get(i);
+							break;
+						}
+					}
+					
+					setDefaults(configuration, settingsGroup, project, mmpPath, exePath);
+					return;
+				}
+			}
+		}
+
+		setDefaults(configuration, settingsGroup, project, null, null);
+	}
+	
+	/**
+	 * Sets the default values for the launch configuration.
+	 * @param configuration
+	 * @param settingsGroup
+	 * @param project
+	 * @param workspaceRelativeMMPPath should not be null for Carbide project (but can be for debug only projects)
+	 * @param mainExePath should be null for Carbide projects but should not be null for debug projects
+	 */
+	public static void setDefaults(ILaunchConfigurationWorkingCopy configuration, String settingsGroup, IProject project, IPath workspaceRelativeMMPPath, IPath mainExePath)
+	{
+		// set the main executable target and host path here, so that we don't have to call into the EPOC engine every time.
+		// calling into EPOC engine every time could be expensive for large projects..
+		mainExeHostPath = getCanonicalPath(mainExePath);
+		mainExeTargetPath = null;
+		mainExeWorkspaceRelativeMMPPath = workspaceRelativeMMPPath;
+		
+		if (workspaceRelativeMMPPath != null) {
+			if (project != null) {
+				ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo(project);
+				if (cpi != null) {			
+					ICarbideBuildConfiguration buildConfig = cpi.getDefaultConfiguration();
+
+					mainExeTargetPath = getCanonicalPath(EpocEngineHelper.getTargetPathForExecutable(buildConfig, workspaceRelativeMMPPath));
+				}
+			}
+		}
+		
+		// this can be called from various places.  launch configurations can be created by clicking
+		// the New button on the Eclipse launch configuration dialog, from our launch wizard, or from
+		// the import executable wizard.  the import executable wizard creates a non-managed make project
+		// and hence most of the logic below will not work.
+
+		// ==== common to all =======================================================================
+		//
+		
+		// Specify which debugger plugin to use.
+		configuration.setAttribute(DebuggerCommonData.Host_App_Path, ""); //$NON-NLS-1$
+		configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, ""); //$NON-NLS-1$
+		configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, ""); //$NON-NLS-1$
+		if (project != null)
+		{
+			configuration.setMappedResources( new IResource[] { project });
+		    ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo(project);
+			if (cpi != null) {
+				configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_BUILD_CONFIG_ID, cpi.getDefaultBuildConfigName());
+				}
+			
+		}
+		
+		// For all but crash debugger, use our "SymbianDebugger".
+		// Crash debugger will set its own debugger (see CrashDebugConfigurationTabGroup.setDefaults()).
+		// 
+		if (! settingsGroup.equals(LaunchConfig_CrashDebugger)) {
+			configuration.setAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_ID, SymbianDebugger.DEBUGGER_ID);
+			// Executables tab is not shown for crash debugger launch configuration.
+			setExecutablesTab(configuration, settingsGroup, project);
+		}
+		
+		setInternalPreferences(configuration, settingsGroup);
+
+		if (settingsGroup.equals(LaunchConfig_Context)) {
+			setContextMainTab(configuration, project);
+		}
+	
+		if (settingsGroup.equals(LaunchConfig_Emulator)) {
+			setEmulationMainTab(configuration, project);
+			setEmulationDebuggerTab(configuration, project);
+			setX86ExceptionsTab(configuration, project);			
+		}
+		
+		if (settingsGroup.equals(LaunchConfig_AppTRK) || 
+			    settingsGroup.equals(LaunchConfig_SysTRK) ||
+				settingsGroup.equals(LaunchConfig_CrashDebugger))
+		{
+			setSerialConnTab(configuration, project);
+		}
+
+		if (settingsGroup.equals(LaunchConfig_AppTRK)) {
+				setInstallationTab(configuration, project);
+		}
+		
+		if (settingsGroup.equals(LaunchConfig_Trace32) ||
+				settingsGroup.equals(LaunchConfig_SophiaSTI))
+		{
+			setStopModeMainTab(configuration, project);
+			setStopModeDebuggerTab(configuration, project);
+			setRomImgTab(configuration, project);
+		}
+
+		if (settingsGroup.equals(LaunchConfig_AppTRK) || settingsGroup.equals(LaunchConfig_SysTRK)) {
+			setTrkMainTab(configuration, project);
+			setTrkDebuggerTab(configuration, project);
+			setFileTransferTab(configuration, project);
+			
+			
+			// TRK Debugging: specify TRK protocol plugin.
+			//
+			ConnectionTypeInfo connTI = new ConnectionTypeInfo(
+					"Carbide TRK", // Internal ID //$NON-NLS-1$
+					"Symbian MetroTRK", // Display name //$NON-NLS-1$
+					spn_SerialComm); // Pref panel name
+
+			DebuggerCommonData.setLaunchConfigConnSettings(
+					configuration,
+					connTI, 
+					"Symbian MetroTRK Protocol", //$NON-NLS-1$
+					""); // Protocol plugin name //$NON-NLS-1$
+		}
+
+		if (settingsGroup.equals(LaunchConfig_CrashDebugger)) {
+			// Crash debugger: specify crash debugger protocol plugin.
+			//
+			// For crash debugger, we don't need a project. But don't set the name to "" as it would 
+			// cause crasher in CDT if we tries to create CDebugTarget without a project.
+			configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, "Any"); //$NON-NLS-1$
+			
+			ConnectionTypeInfo connTI = new ConnectionTypeInfo(
+					"Carbide CrashDebugger", // Internal ID //$NON-NLS-1$
+					"SymbianCrashDebuggerProtocol", // Display name. see SymbianCrashDebuggerPrefix.h on DE side. //$NON-NLS-1$
+					spn_SerialComm); // Pref panel name
+
+			DebuggerCommonData.setLaunchConfigConnSettings(
+					configuration,
+					connTI, 
+					"SymbianCrashDebuggerProtocol", //$NON-NLS-1$
+					""); // see SymbianCrashDebuggerPrefix.h on DE side //$NON-NLS-1$
+		}
+		
+		if (settingsGroup.equals(LaunchConfig_Trace32))//$NON-NLS-1$
+			{
+			// Stop mode debugging using Trace32 : specify Trace32 debugger protocol plugin.
+			//
+			ConnectionTypeInfo connTI = new ConnectionTypeInfo(
+					"Carbide Trace32", // Internal ID //$NON-NLS-1$
+					"Trace32 Configuration", // Display name. //$NON-NLS-1$
+					"Trace32 Connection"); // Pref panel name
+
+			DebuggerCommonData.setLaunchConfigConnSettings(
+					configuration,
+					connTI, 
+					"LAUTERBACH TRACE32 Plugin", //$NON-NLS-1$
+					""); //$NON-NLS-1$
+		}
+	
+		if (settingsGroup.equals(LaunchConfig_SophiaSTI)) {
+			// Stop mode debugging using STI : specify Sophia STI debugger protocol plugin.
+			//
+			ConnectionTypeInfo connTI = new ConnectionTypeInfo(
+					"Carbide Sophia STI", // Internal ID //$NON-NLS-1$
+					"Sophia STI Configuration", // Display name. //$NON-NLS-1$
+					"Sophia Target Interface Connection"); // Pref panel name
+
+			DebuggerCommonData.setLaunchConfigConnSettings(
+					configuration,
+					connTI, 
+					"Sophia Target Interface Plugin", //$NON-NLS-1$
+					""); //$NON-NLS-1$
+		}
+		
+		// Add the Symbian OS SDK Mapping.
+		addSymbianSDKMapping(project, configuration);
+
+		configuration.setAttribute(ATTR_originalName, configuration.getName());
+
+	}
+
+	private static void setContextMainTab(
+			ILaunchConfigurationWorkingCopy configuration, IProject project) {
+		if (project != null) {
+			String projectName = project.getName();
+			configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, projectName);
+			configuration.setMappedResources( new IResource[] { project });
+			configuration.rename(DebugPlugin.getDefault().getLaunchManager().generateUniqueLaunchConfigurationNameFrom(projectName));
+		}
+	}
+
+
+	/**
+	 * Should the debugger launch the Symbian emulator (epoc.exe) as the debug process?
+	 * This should be true in all cases except when the executable is an '.exe'.
+	 * These can be launched directly. However there is a problem doing this with OS9.1
+	 * (it will fail after the first launch) so we still require the emulator in this case.	
+	 * @param buildConfig - current build config
+	 * @return - true if we should launch epoc.exe as the debug process
+	 */
+	public static boolean isEmulatorRequired(ICarbideBuildConfiguration buildConfig, IPath mainExeHostPath, IPath mainExeWorkspaceRelativeMMPPath) {
+		
+        ICarbideProjectInfo cpi = buildConfig.getCarbideProject();
+        
+		if (cpi != null && mainExeHostPath != null) {
+			if ("exe".equalsIgnoreCase(mainExeHostPath.getFileExtension()) && !isSharedLib(cpi.getProject(), mainExeHostPath)) { //$NON-NLS-1$
+				Version version = cpi.getDefaultConfiguration().getSDK().getOSVersion();
+				if (!(version.getMajor() == 9 && version.getMinor() == 1)) {
+					return false;
+				}
+
+				// for 9.1 only and exe extension, check the UID2 and if it's 0x100039CE then
+				// it needs the emulator, otherwise it doesn't.  see bugzilla #1822 for details.  this
+				// is basically to work around an issue in the 9.1 emulator.
+				if (mainExeWorkspaceRelativeMMPPath != null) {
+					String uid2 = EpocEngineHelper.getUID2(buildConfig, mainExeWorkspaceRelativeMMPPath);
+					if (uid2 != null) {
+						if (uid2.compareToIgnoreCase("0x100039CE") != 0) { //$NON-NLS-1$
+							return false;
+						}
+					}
+				}
+			}
+		}
+		return true;
+	}
+
+	public static boolean isEmulatorRequired(IPath mainExeHostPath)
+	{
+		List<ISymbianSDK> sdkList = new ArrayList<ISymbianSDK>();
+		sdkList = SDKCorePlugin.getSDKManager().getSDKList();
+		
+		for (ISymbianSDK currSDK : sdkList){
+			if (new Path(currSDK.getEPOCROOT()).isPrefixOf(mainExeHostPath))
+			{
+			       // Apparently this only works correctly with the S60 emulator.
+		        if (!currSDK.isS60() &&
+		        		!currSDK.getFamily().equalsIgnoreCase(ISymbianSDK.TECHVIEW_FAMILY_ID))
+		        	return true;
+		        
+				if ("exe".equalsIgnoreCase(mainExeHostPath.getFileExtension())) { //$NON-NLS-1$
+					Version version = currSDK.getOSVersion();
+					if (!(version.getMajor() == 9 && version.getMinor() == 1)) {
+						return false;
+					}
+				}
+				
+			}
+		}
+		
+		return true;
+	}
+		
+	// Check if the given file is a shared library (DLL or APP in Symbian ).
+	//
+	static public boolean isSharedLib(IProject project, IPath exePath) {
+		int fileType;
+		ICExtensionReference[] parserRef;
+		
+		try {
+			parserRef = CCorePlugin.getDefault().getBinaryParserExtensions(project);
+		} catch (Exception e) {
+			return false;
+		};
+		
+		for (int i = 0; i < parserRef.length; i++) {
+			try {
+				IBinaryParser parser = (IBinaryParser)parserRef[i].createExtension();
+				IBinaryObject exe = (IBinaryObject)parser.getBinary(exePath);
+				if (exe != null) {
+					fileType = exe.getType();
+					return fileType == IBinaryParser.IBinaryFile.SHARED;
+				}
+			} catch (Exception e) {
+			}
+		}
+
+		try {
+			IBinaryParser parser = CCorePlugin.getDefault().getDefaultBinaryParser();
+
+			IBinaryObject exe = (IBinaryObject)parser.getBinary(exePath);
+			if (exe != null) {
+				fileType = exe.getType();
+				return fileType == IBinaryParser.IBinaryFile.SHARED;
+			}
+		} catch (Exception e) {
+		}
+		return false;
+	}
+
+	private static void displayWarningDialog(final String msg) {
+		//  Display warning dialog
+		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+		if(window == null){
+			IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows();
+			window = windows[0];
+		}
+
+		final Shell shell = window.getShell();
+		//using syncExec could cause a dead-lock
+		//that is why asyncExec is used
+		shell.getDisplay().asyncExec( new Runnable() {
+			public void run() {
+				MessageDialog.openWarning(shell, Messages.getString("SettingsData.70"), msg); //$NON-NLS-1$
+			}
+		} );
+	}
+	
+	
+	public static boolean isStopModeConfiguration(ILaunchConfiguration configuration) {
+		try {
+			ILaunchConfigurationType configurationType = configuration.getType();
+			String id = configurationType.getIdentifier();
+			return id.equals(T32_LAUNCH_TYPE_ID) ||
+			id.endsWith("T32Launch")||//$NON-NLS-1$
+			id.equals(STI_LAUNCH_TYPE_ID);
+		} catch (CoreException e) {
+		}
+		
+		return false;
+	}
+
+
+	public static boolean isAppTRKConfiguration(ILaunchConfiguration configuration) {
+		try {
+			ILaunchConfigurationType configurationType = configuration.getType();
+			String id = configurationType.getIdentifier();
+			return id.equals(APP_TRK_LAUNCH_TYPE_ID);
+		} catch (CoreException e) {
+		}
+		
+		return false;
+	}
+	
+	public static boolean isEmulatorConfiguration(ILaunchConfiguration configuration) {
+		try {
+			ILaunchConfigurationType configurationType = configuration.getType();
+			String id = configurationType.getIdentifier();
+			return id.equals(EMULATION_LAUNCH_TYPE_ID);
+		} catch (CoreException e) {
+		}
+		
+		return false;
+	}
+	
+	public static void setProcessToLaunch(ILaunchConfigurationWorkingCopy configuration, IPath path) {
+		configuration.setAttribute(PreferenceConstants.J_PN_RemoteProcessToLaunch, path.toOSString());
+	}
+	
+}
\ No newline at end of file