diff --git a/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/launching/FinalLaunchSequence.java b/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/launching/FinalLaunchSequence.java index 66ebbe93e6e..b2a0b56f2f6 100644 --- a/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/launching/FinalLaunchSequence.java +++ b/plugins/org.eclipse.dd.gdb/src/org/eclipse/dd/gdb/internal/provisional/launching/FinalLaunchSequence.java @@ -10,18 +10,26 @@ *******************************************************************************/ package org.eclipse.dd.gdb.internal.provisional.launching; +import java.io.File; +import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.IProcessInfo; import org.eclipse.cdt.core.IProcessList; +import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupDirector; +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.variables.VariablesPlugin; @@ -39,8 +47,9 @@ import org.eclipse.dd.mi.service.MIBreakpointsManager; import org.eclipse.dd.mi.service.command.commands.CLIAttach; import org.eclipse.dd.mi.service.command.commands.CLIMonitorListProcesses; import org.eclipse.dd.mi.service.command.commands.CLISource; -import org.eclipse.dd.mi.service.command.commands.MIGDBSetArgs; +import org.eclipse.dd.mi.service.command.commands.MIEnvironmentCD; import org.eclipse.dd.mi.service.command.commands.MIFileExecAndSymbols; +import org.eclipse.dd.mi.service.command.commands.MIGDBSetArgs; import org.eclipse.dd.mi.service.command.commands.MIGDBSetAutoSolib; import org.eclipse.dd.mi.service.command.commands.MIGDBSetSolibSearchPath; import org.eclipse.dd.mi.service.command.commands.MITargetSelect; @@ -136,6 +145,68 @@ public class FinalLaunchSequence extends Sequence { requestMonitor.done(); } }}, + /* + * Specify GDB's working directory + */ + new Step() { + + private File getWorkingDirectory(RequestMonitor requestMonitor) { + IPath path = null; + try { + String location = fLaunch.getLaunchConfiguration().getAttribute(ICDTLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, + (String)null); + if (location != null) { + String expandedLocation = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(location); + if (expandedLocation.length() > 0) { + path = new Path(expandedLocation); + } + } + + if (path == null) { + // default working dir is the project if this config has a project + ICProject cp = LaunchUtils.getCProject(fLaunch.getLaunchConfiguration()); + if (cp != null) { + IProject p = cp.getProject(); + return p.getLocation().toFile(); + } + } else { + if (path.isAbsolute()) { + File dir = new File(path.toOSString()); + if (dir.isDirectory()) { + return dir; + } + } else { + IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(path); + if (res instanceof IContainer && res.exists()) { + return res.getLocation().toFile(); + } + } + + requestMonitor.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, -1, + LaunchMessages.getString("AbstractCLaunchDelegate.Working_directory_does_not_exist"), //$NON-NLS-1$ + new FileNotFoundException(LaunchMessages.getFormattedString( + "AbstractCLaunchDelegate.WORKINGDIRECTORY_PATH_not_found", path.toOSString())))); //$NON-NLS-1$ + requestMonitor.done(); + } + } catch (CoreException e) { + requestMonitor.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, -1, "Cannot get working directory", e)); //$NON-NLS-1$ + requestMonitor.done(); + } + + return null; + } + + @Override + public void execute(final RequestMonitor requestMonitor) { + File dir = getWorkingDirectory(requestMonitor); + if (dir != null) { + fCommandControl.queueCommand( + new MIEnvironmentCD(fCommandControl.getControlDMContext(), dir.getAbsolutePath()), + new DataRequestMonitor(getExecutor(), requestMonitor)); + } else { + requestMonitor.done(); + } + }}, /* * Tell GDB to automatically load or not the shared library symbols */ diff --git a/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/command/commands/MIEnvironmentCD.java b/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/command/commands/MIEnvironmentCD.java new file mode 100644 index 00000000000..5969386ba0d --- /dev/null +++ b/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/command/commands/MIEnvironmentCD.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2000, 2008 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * QNX Software Systems - Initial API and implementation' + * Ericsson - Updated for DSF + *******************************************************************************/ +package org.eclipse.dd.mi.service.command.commands; + +import org.eclipse.dd.mi.service.command.MIControlDMContext; +import org.eclipse.dd.mi.service.command.output.MIInfo; + +/** + * -environment-cd PATHDIR + * + * Set GDB's working directory. + * + */ +public class MIEnvironmentCD extends MICommand +{ + public MIEnvironmentCD(MIControlDMContext ctx, String path) { + super(ctx, "-environment-cd", new String[]{path}); //$NON-NLS-1$ + } +} \ No newline at end of file