com.nokia.cdt.debug.cw.symbian.SettingsData.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.cdt.debug.cw.symbian.SettingsData.java

Source

/*
* 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.IBinaryParser.IBinaryObject;
import org.eclipse.cdt.core.ICExtensionReference;
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.internal.api.sdk.ISBSv1BuildContext;
import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
import com.nokia.carbide.cpp.sdk.core.ISymbianSDKFeatures;
import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin;
import com.nokia.carbide.remoteconnections.interfaces.IConnection;
import com.nokia.carbide.remoteconnections.internal.registry.Registry;
import com.nokia.cpp.internal.api.utils.core.PathUtils;

import cwdbg.PreferenceConstants;

@SuppressWarnings("restriction")
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_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 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";
    public static final String AttachToProcessDialog_Selection = PREFIX + ".AttachToProcessName";

    // 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$

    //================ 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$

    //================= End of Shadowed panels ===========================================

    public static final String TARGET_PATH_INCLUDES_FILENAME = "TARGET_PATH_INCLUDES_FILENAME"; //$NON-NLS-1$

    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$
                setLaunchConfigurationName(configuration, 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(ISBSv1BuildContext.EMULATOR_PLATFORM) == 0) {
                    configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME,
                            mainExeHostPath == null ? "" : mainExeHostPath.toOSString());

                    if (isEmulatorRequired(buildConfig, mainExeHostPath, mainExeWorkspaceRelativeMMPPath)) {
                        String winscwudeb = buildConfig.getSDK().getReleaseRoot().toOSString() + File.separator
                                + "WINSCW" + File.separator + buildConfig.getTargetString(); //$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$
        configuration.setAttribute(RemoteConnectionsTRKHelper.CONNECTION_ATTRIBUTE, Registry.CURRENT_CONNECTION_ID);

        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$
                setLaunchConfigurationName(configuration, 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(ISBSv1BuildContext.EMULATOR_PLATFORM) != 0) {
                    configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME,
                            mainExeHostPath == null ? "" : mainExeHostPath.toOSString());
                    configuration.setAttribute(PreferenceConstants.J_PN_RemoteProcessToLaunch,
                            mainExeTargetPath == null ? "" : PathUtils.convertPathToWindows(mainExeTargetPath));
                } 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 != null && 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 =================================================== 
        //      
        configuration.setAttribute(RemoteConnectionsTRKHelper.CONNECTION_ATTRIBUTE, Registry.CURRENT_CONNECTION_ID);

        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$
                setLaunchConfigurationName(configuration, 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(ISBSv1BuildContext.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 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);
    }

    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_RomImgStartAddress, 0);
        configuration.setAttribute(PreferenceConstants.J_PN_DebugRunFromStart,
                PreferenceConstants.J_PV_DebugRunFromStart_Debug);
        configuration.setAttribute(PreferenceConstants.J_PN_TargetProcessor, 8);
        configuration.setAttribute(PreferenceConstants.J_PN_RunTargetInitFile, false);
        configuration.setAttribute(PreferenceConstants.J_PN_TargetInitFilePath, ""); //$NON-NLS-1$
        configuration.setAttribute(PreferenceConstants.J_PN_RunMemConfigFile, false);
        configuration.setAttribute(PreferenceConstants.J_PN_MemConfigFilePath, ""); //$NON-NLS-1$
        configuration.setAttribute(PreferenceConstants.J_PN_ResetTarget, false);
    }

    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)
            RemoteConnectionsTRKHelper.setRemoteConnectionAttribute(configuration, defaultConnection);
    }

    public static void setFileTransferTab(ILaunchConfigurationWorkingCopy configuration, IProject project) {

        //======== File Transfer tab ============================================
        //
        configuration.setAttribute(PreferenceConstants.J_PN_FilesToTransfer, ""); //$NON-NLS-1$
        configuration.setAttribute(TARGET_PATH_INCLUDES_FILENAME, "true"); //$NON-NLS-1$

        // only do this for system TRK configurations
        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().getSupportedFeatures().contains(ISymbianSDKFeatures.IS_EKA2)) {
                    // 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 = PathUtils.createPath(defaultTargetPath).append(hp.lastSegment());
                        }
                        prefsData += hp.toOSString() + "," + PathUtils.convertPathToWindows(tp) + 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) //$NON-NLS-1$
                                + new Path(currHostRSRC).lastSegment() + enabled;
                    }
                }

                // 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);
            }
        }
    }

    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);
        }
    }

    // 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();

                    // do not canonicalize
                    mainExeTargetPath = 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$
        configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_BUILD_BEFORE_LAUNCH,
                ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_USE_WORKSPACE_SETTING);

        if (project != null) {
            configuration.setMappedResources(new IResource[] { project });
            ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo(project);
            configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_BUILD_CONFIG_ID,
                    cpi != null ? cpi.getDefaultConfiguration().getBuildContext().getConfigurationID() : ""); //$NON-NLS-1$
        }

        // set rom log file defaults.  do this for all launch types since it shouldn't hurt
        // and could be easy to miss some launch types that use this tab
        configuration.setAttribute(PreferenceConstants.J_PN_ParseRomLogFile, false);
        configuration.setAttribute(PreferenceConstants.J_PN_RomLogFilePath, ""); //$NON-NLS-1$
        configuration.setAttribute(PreferenceConstants.J_PN_SymbianKitEpoc32Dir, ""); //$NON-NLS-1$

        configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_ID, SymbianDebugger.DEBUGGER_ID);

        setExecutablesTab(configuration, settingsGroup, project);

        setInternalPreferences(configuration, settingsGroup);

        if (settingsGroup.equals(LaunchConfig_Emulator)) {
            setEmulationMainTab(configuration, project);
            setEmulationDebuggerTab(configuration, project);
            setX86ExceptionsTab(configuration, project);
        }

        if (settingsGroup.equals(LaunchConfig_AppTRK) || settingsGroup.equals(LaunchConfig_SysTRK)) {
            setSerialConnTab(configuration, project);
        }

        if (settingsGroup.equals(LaunchConfig_AppTRK)) {
            setInstallationTab(configuration, project);

            // set this so it's there in the config and the apply button doesn't become
            // enabled when switching to the tab
            configuration.setAttribute(PreferenceConstants.J_PN_FilesToTransfer, ""); //$NON-NLS-1$
            configuration.setAttribute(TARGET_PATH_INCLUDES_FILENAME, "true"); //$NON-NLS-1$
        }

        if (settingsGroup.equals(LaunchConfig_SysTRK)) {
            setFileTransferTab(configuration, project);
        }

        if (settingsGroup.equals(LaunchConfig_AppTRK) || settingsGroup.equals(LaunchConfig_SysTRK)) {
            setTrkMainTab(configuration, project);
            setTrkDebuggerTab(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$
        }

        // Add the Symbian OS SDK Mapping.
        addSymbianSDKMapping(project, configuration);

        configuration.setAttribute(ATTR_originalName, configuration.getName());

    }

    /**
     * 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()) //$NON-NLS-1$
                    && !isSharedLib(cpi.getProject(), mainExeHostPath)) {
                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 ("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 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 isSysTRKConfiguration(ILaunchConfiguration configuration) {
        try {
            ILaunchConfigurationType configurationType = configuration.getType();
            String id = configurationType.getIdentifier();
            return id.equals(SYS_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,
                PathUtils.convertPathToWindows(path));
    }

    private static void setLaunchConfigurationName(ILaunchConfigurationWorkingCopy config, String proposedName) {
        String name = proposedName;

        // the call to generateLaunchConfigurationName below will replace all \'s with _'s
        // the code below just removes any \ or : at the end of the SDK name, if for example
        // they gave the SDK a name of "M:" or "M:\".
        if (name.endsWith("\\]")) { //$NON-NLS-1$
            name = name.substring(0, name.length() - 2) + "]"; //$NON-NLS-1$
        }

        if (name.endsWith(":]")) { //$NON-NLS-1$
            name = name.substring(0, name.length() - 2) + "]"; //$NON-NLS-1$
        }

        config.rename(DebugPlugin.getDefault().getLaunchManager().generateLaunchConfigurationName(name));
    }
}