diff --git a/debug/org.eclipse.cdt.debug.application.product/debug.product b/debug/org.eclipse.cdt.debug.application.product/debug.product
index bad7089943d..0b7c6d4e87a 100644
--- a/debug/org.eclipse.cdt.debug.application.product/debug.product
+++ b/debug/org.eclipse.cdt.debug.application.product/debug.product
@@ -226,6 +226,7 @@ Java and all Java-based trademarks are trademarks of Oracle Corporation in the U
+
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/LaunchMessages.properties b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/LaunchMessages.properties
index e8ce5e4aa49..1308970bbed 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/LaunchMessages.properties
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/LaunchMessages.properties
@@ -37,3 +37,9 @@ Launch.common.QualifierColon=Qualifier:
Launch.ILaunchable.Interface.Error=An attempt to instantiate an adapter factory for ILaunchable. By API specification this is not allowed. Use hasAdapter() to determine existense.
+NewGenericTargetWizard_0=New Generic Target
+NewGenericTargetWizardPage.Arch=CPU Architecture:
+NewGenericTargetWizardPage.Desc=Enter name and properties for the target.
+NewGenericTargetWizardPage.Name=Name:
+NewGenericTargetWizardPage.OS=Operating System:
+NewGenericTargetWizardPage.Title=Generic Target
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/NewGenericTargetWizard.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/NewGenericTargetWizard.java
index cd7fc623a2b..d87250367d1 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/NewGenericTargetWizard.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/NewGenericTargetWizard.java
@@ -15,7 +15,6 @@ import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.launchbar.core.target.ILaunchTarget;
import org.eclipse.launchbar.core.target.ILaunchTargetManager;
import org.eclipse.launchbar.core.target.ILaunchTargetWorkingCopy;
-import org.eclipse.launchbar.ui.internal.Activator;
import org.eclipse.launchbar.ui.target.LaunchTargetWizard;
public class NewGenericTargetWizard extends LaunchTargetWizard {
@@ -23,7 +22,7 @@ public class NewGenericTargetWizard extends LaunchTargetWizard {
private NewGenericTargetWizardPage page;
public NewGenericTargetWizard() {
- setWindowTitle("New Generic Target");
+ setWindowTitle(LaunchMessages.getString("NewGenericTargetWizard_0")); //$NON-NLS-1$
}
@Override
@@ -61,10 +60,10 @@ public class NewGenericTargetWizard extends LaunchTargetWizard {
@Override
public void performDelete() {
- ILaunchTargetManager manager = Activator.getService(ILaunchTargetManager.class);
+ ILaunchTargetManager manager = CDebugUIPlugin.getService(ILaunchTargetManager.class);
ILaunchTarget target = getLaunchTarget();
if (target != null) {
- manager.removeLaunchTarget(getLaunchTarget());
+ manager.removeLaunchTarget(target);
}
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/NewGenericTargetWizardPage.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/NewGenericTargetWizardPage.java
index 03bac89a531..1505126f847 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/NewGenericTargetWizardPage.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/launch/NewGenericTargetWizardPage.java
@@ -29,8 +29,8 @@ public class NewGenericTargetWizardPage extends WizardPage {
public NewGenericTargetWizardPage(ILaunchTarget launchTarget) {
super(NewGenericTargetWizardPage.class.getName());
- setTitle("Generic Target");
- setDescription("Enter name and properties for the target.");
+ setTitle(LaunchMessages.getString("NewGenericTargetWizardPage.Title")); //$NON-NLS-1$
+ setDescription(LaunchMessages.getString("NewGenericTargetWizardPage.Desc")); //$NON-NLS-1$
this.launchTarget = launchTarget;
}
@@ -40,7 +40,7 @@ public class NewGenericTargetWizardPage extends WizardPage {
comp.setLayout(new GridLayout(2, false));
Label label = new Label(comp, SWT.NONE);
- label.setText("Name:");
+ label.setText(LaunchMessages.getString("NewGenericTargetWizardPage.Name")); //$NON-NLS-1$
nameText = new Text(comp, SWT.BORDER);
nameText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
@@ -49,7 +49,7 @@ public class NewGenericTargetWizardPage extends WizardPage {
}
label = new Label(comp, SWT.NONE);
- label.setText("Operating System:");
+ label.setText(LaunchMessages.getString("NewGenericTargetWizardPage.OS")); //$NON-NLS-1$
osText = new Text(comp, SWT.BORDER);
osText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
@@ -61,7 +61,7 @@ public class NewGenericTargetWizardPage extends WizardPage {
}
label = new Label(comp, SWT.NONE);
- label.setText("CPU Architecture:");
+ label.setText(LaunchMessages.getString("NewGenericTargetWizardPage.Arch")); //$NON-NLS-1$
archText = new Text(comp, SWT.BORDER);
archText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/META-INF/MANIFEST.MF b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/META-INF/MANIFEST.MF
index edeeaddf009..c37b595367c 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/META-INF/MANIFEST.MF
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/META-INF/MANIFEST.MF
@@ -26,7 +26,9 @@ Require-Bundle: org.eclipse.ui,
org.eclipse.cdt.launch;bundle-version="6.1.0",
org.eclipse.debug.core,
org.eclipse.core.resources,
- org.eclipse.tm.terminal.control;bundle-version="4.0.0"
+ org.eclipse.tm.terminal.control;bundle-version="4.0.0",
+ org.eclipse.cdt.native.serial;bundle-version="1.1.100",
+ org.eclipse.launchbar.ui;bundle-version="2.3.0"
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Export-Package: org.eclipse.cdt.dsf.gdb.internal.ui;x-friends:="org.eclipse.cdt.docker.launcher",
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/icons/full/obj16/connect.gif b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/icons/full/obj16/connect.gif
new file mode 100755
index 00000000000..866ad338250
Binary files /dev/null and b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/icons/full/obj16/connect.gif differ
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml
index 16ca680837c..75ae7454c99 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml
@@ -607,4 +607,27 @@
plugin="org.eclipse.cdt.dsf.gdb">
+
+
+
+
+
+
+
+
+
+
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbUIPlugin.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbUIPlugin.java
index 1bc7d8fdb00..6520f9c888b 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbUIPlugin.java
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/GdbUIPlugin.java
@@ -36,6 +36,7 @@ import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
/**
* The activator class controls the plug-in life cycle
@@ -275,4 +276,11 @@ public class GdbUIPlugin extends AbstractUIPlugin {
reg.put(IGdbUIConstants.IMG_WIZBAN_ADVANCED_TIMEOUT_SETTINGS,
getImageDescriptor("icons/full/wizban/advtosettings_wiz.png")); //$NON-NLS-1$
}
+
+ public static T getService(Class service) {
+ BundleContext context = plugin.getBundle().getBundleContext();
+ ServiceReference ref = context.getServiceReference(service);
+ return ref != null ? context.getService(ref) : null;
+ }
+
}
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/GdbRemoteTargetLabelProvider.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/GdbRemoteTargetLabelProvider.java
new file mode 100644
index 00000000000..f59b0b08777
--- /dev/null
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/GdbRemoteTargetLabelProvider.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2019 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.cdt.dsf.gdb.internal.ui.launching;
+
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.launchbar.core.target.ILaunchTarget;
+import org.eclipse.swt.graphics.Image;
+
+public class GdbRemoteTargetLabelProvider extends LabelProvider {
+
+ @Override
+ public String getText(Object element) {
+ if (element instanceof ILaunchTarget) {
+ return ((ILaunchTarget) element).getId();
+ }
+ return super.getText(element);
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ return LaunchImages.get(LaunchImages.IMG_OBJS_REMOTE);
+ }
+
+}
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/LaunchImages.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/LaunchImages.java
index 3102a08e011..0c74bf6611c 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/LaunchImages.java
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/LaunchImages.java
@@ -50,6 +50,9 @@ public class LaunchImages {
public static String IMG_OBJS_EXEC = NAME_PREFIX + "exec_obj.gif"; //$NON-NLS-1$
public static final ImageDescriptor DESC_OBJS_EXEC = createManaged(T_OBJS, IMG_OBJS_EXEC);
+ public static final String IMG_OBJS_REMOTE = NAME_PREFIX + "connect.gif"; //$NON-NLS-1$
+ public static final ImageDescriptor DESC_OBJS_REMOTE = createManaged(T_OBJS, IMG_OBJS_REMOTE);
+
public static void initialize() {
}
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/LaunchUIMessages.properties b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/LaunchUIMessages.properties
index f511805dc5d..80164ffcc54 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/LaunchUIMessages.properties
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/LaunchUIMessages.properties
@@ -238,6 +238,30 @@ LocalCDILaunchDelegate.7=Core file does not exist or is not readable.
LocalCDILaunchDelegate.8=Error starting process.
LocalCDILaunchDelegate.9=Eclipse runtime does not support working directory.
LocalCDILaunchDelegate.10=Failed to set program arguments, environment or working directory.
+NewGDBRemoteSerialTargetWizard_BaudNotANumber=Baud rate must be a number
+NewGDBRemoteSerialTargetWizard_BaudRate=Baud rate:
+NewGDBRemoteSerialTargetWizard_ConnectionGroup=Connection
+NewGDBRemoteSerialTargetWizard_Desc=Enter the connection information for gdb remote connection.
+NewGDBRemoteSerialTargetWizard_NameGroup=Target Name
+NewGDBRemoteSerialTargetWizard_NoBaudRate=Baud rate must be specified
+NewGDBRemoteSerialTargetWizard_NoSerialPort=Serial port must be specified.
+NewGDBRemoteSerialTargetWizard_NoTargetName=Target name must be specified
+NewGDBRemoteSerialTargetWizard_SameAsSerialPort=Same as serial port
+NewGDBRemoteSerialTargetWizard_SerialPort=Serial port:
+NewGDBRemoteSerialTargetWizard_TargetName=Target name:
+NewGDBRemoteSerialTargetWizard_Title=New GDB Remote over Serial Port target
+NewGdbRemoteTCPTargetWizard.ConnectionGroup=Connection
+NewGdbRemoteTCPTargetWizard.Desc=Enter the connection information for gdb remote connection.
+NewGdbRemoteTCPTargetWizard.HostName=Hostname or IP:
+NewGdbRemoteTCPTargetWizard.NameGroup=Target Name
+NewGdbRemoteTCPTargetWizard.NoHost=Hostname or IP must be specified
+NewGdbRemoteTCPTargetWizard.NoName=Target name must be specified
+NewGdbRemoteTCPTargetWizard.NoPort=Port number must be specified
+NewGdbRemoteTCPTargetWizard.Port=Port:
+NewGdbRemoteTCPTargetWizard.PortNotANumber=Port must be a number
+NewGdbRemoteTCPTargetWizard.SameAsHost=Same as hostname
+NewGdbRemoteTCPTargetWizard.TargetName=Target Name:
+NewGdbRemoteTCPTargetWizard.Title=New GDB Remote over TCP Target
ProcessPrompter.Core=core
ProcessPrompter.Cores=cores
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/NewGdbRemoteSerialTargetWizard.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/NewGdbRemoteSerialTargetWizard.java
new file mode 100644
index 00000000000..8af8bb01a92
--- /dev/null
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/NewGdbRemoteSerialTargetWizard.java
@@ -0,0 +1,217 @@
+/*******************************************************************************
+ * Copyright (c) 2019 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.cdt.dsf.gdb.internal.ui.launching;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
+import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin;
+import org.eclipse.cdt.dsf.gdb.launching.GDBRemoteSerialLaunchTargetProvider;
+import org.eclipse.cdt.serial.SerialPort;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.launchbar.core.target.ILaunchTarget;
+import org.eclipse.launchbar.core.target.ILaunchTargetManager;
+import org.eclipse.launchbar.core.target.ILaunchTargetWorkingCopy;
+import org.eclipse.launchbar.ui.target.LaunchTargetWizard;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+public class NewGdbRemoteSerialTargetWizard extends LaunchTargetWizard {
+
+ private Button sameAsPortname;
+ private Text nameText;
+ private Combo portCombo;
+ private Text baudText;
+
+ private class SerialPage extends WizardPage {
+ public SerialPage() {
+ super(NewGdbRemoteTCPTargetWizard.class.getName());
+ setTitle(LaunchUIMessages.getString("NewGDBRemoteSerialTargetWizard_Title")); //$NON-NLS-1$
+ setDescription(LaunchUIMessages.getString("NewGDBRemoteSerialTargetWizard_Desc")); //$NON-NLS-1$
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ Composite control = new Composite(parent, SWT.NONE);
+ control.setLayout(new GridLayout());
+
+ // Target name
+
+ Group nameGroup = new Group(control, SWT.NONE);
+ nameGroup.setText(LaunchUIMessages.getString("NewGDBRemoteSerialTargetWizard_NameGroup")); //$NON-NLS-1$
+ nameGroup.setLayout(new GridLayout(2, false));
+ nameGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ sameAsPortname = new Button(nameGroup, SWT.CHECK);
+ sameAsPortname.setText(LaunchUIMessages.getString("NewGDBRemoteSerialTargetWizard_SameAsSerialPort")); //$NON-NLS-1$
+ GridData gridData = new GridData();
+ gridData.horizontalSpan = 2;
+ sameAsPortname.setLayoutData(gridData);
+ sameAsPortname.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ boolean same = sameAsPortname.getSelection();
+ if (same) {
+ nameText.setText(portCombo.getText());
+ }
+ nameText.setEnabled(!same);
+ }
+ });
+ sameAsPortname.setSelection(true);
+
+ Label nameLabel = new Label(nameGroup, SWT.NONE);
+ nameLabel.setText(LaunchUIMessages.getString("NewGDBRemoteSerialTargetWizard_TargetName")); //$NON-NLS-1$
+
+ nameText = new Text(nameGroup, SWT.BORDER);
+ nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ nameText.setEnabled(false);
+ nameText.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ validatePage();
+ }
+ });
+
+ // serial port
+
+ Group connGroup = new Group(control, SWT.NONE);
+ connGroup.setText(LaunchUIMessages.getString("NewGDBRemoteSerialTargetWizard_ConnectionGroup")); //$NON-NLS-1$
+ connGroup.setLayout(new GridLayout(2, false));
+ connGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Label portLabel = new Label(connGroup, SWT.NONE);
+ portLabel.setText(LaunchUIMessages.getString("NewGDBRemoteSerialTargetWizard_SerialPort")); //$NON-NLS-1$
+
+ portCombo = new Combo(connGroup, SWT.NONE);
+ portCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ try {
+ String[] portNames = SerialPort.list();
+ for (String portName : portNames) {
+ portCombo.add(portName);
+ }
+ if (portNames.length > 0) {
+ portCombo.select(0);
+ nameText.setText(portCombo.getText());
+ }
+ } catch (IOException e) {
+ GdbUIPlugin.log(e);
+ }
+
+ portCombo.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ if (sameAsPortname.getSelection()) {
+ nameText.setText(portCombo.getText());
+ }
+ validatePage();
+ }
+ });
+
+ Label baudLabel = new Label(connGroup, SWT.NONE);
+ baudLabel.setText(LaunchUIMessages.getString("NewGDBRemoteSerialTargetWizard_BaudRate")); //$NON-NLS-1$
+
+ baudText = new Text(connGroup, SWT.BORDER);
+ baudText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ baudText.setText("115200"); //$NON-NLS-1$
+ baudText.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ validatePage();
+ }
+ });
+
+ setControl(control);
+ validatePage();
+ }
+
+ private void validatePage() {
+ setPageComplete(false);
+
+ String port = portCombo.getText();
+ if (port.isEmpty()) {
+ setErrorMessage(LaunchUIMessages.getString("NewGDBRemoteSerialTargetWizard_NoSerialPort")); //$NON-NLS-1$
+ return;
+ }
+
+ try {
+ String[] ports = SerialPort.list();
+ Arrays.sort(ports);
+ if (Arrays.binarySearch(ports, port) < 0) {
+ setMessage("Serial port not found on this system", WARNING); //$NON-NLS-1$
+ } else {
+ setMessage(null, WARNING);
+ }
+ } catch (IOException e) {
+ setErrorMessage(e.getLocalizedMessage());
+ return;
+ }
+ String baud = baudText.getText();
+ if (baud.isEmpty()) {
+ setErrorMessage(LaunchUIMessages.getString("NewGDBRemoteSerialTargetWizard_NoBaudRate")); //$NON-NLS-1$
+ return;
+ }
+
+ try {
+ Integer.parseInt(baud);
+ } catch (NumberFormatException e) {
+ setErrorMessage(LaunchUIMessages.getString("NewGDBRemoteSerialTargetWizard_BaudNotANumber")); //$NON-NLS-1$
+ return;
+ }
+
+ if (nameText.getText().isEmpty()) {
+ setErrorMessage(LaunchUIMessages.getString("NewGDBRemoteSerialTargetWizard_NoTargetName")); //$NON-NLS-1$
+ return;
+ }
+
+ setErrorMessage(null);
+ setPageComplete(true);
+ }
+ }
+
+ @Override
+ public void addPages() {
+ super.addPages();
+ addPage(new SerialPage());
+ }
+
+ @Override
+ public boolean performFinish() {
+ ILaunchTargetManager manager = GdbUIPlugin.getService(ILaunchTargetManager.class);
+ String id = nameText.getText();
+
+ ILaunchTarget target = getLaunchTarget();
+ if (target == null) {
+ target = manager.addLaunchTarget(GDBRemoteSerialLaunchTargetProvider.TYPE_ID, id);
+ }
+
+ ILaunchTargetWorkingCopy wc = target.getWorkingCopy();
+ wc.setId(id);
+ wc.setAttribute(IGDBLaunchConfigurationConstants.ATTR_DEV, portCombo.getText());
+ wc.setAttribute(IGDBLaunchConfigurationConstants.ATTR_DEV_SPEED, baudText.getText());
+ wc.save();
+
+ return true;
+ }
+
+}
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/NewGdbRemoteTCPTargetWizard.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/NewGdbRemoteTCPTargetWizard.java
new file mode 100644
index 00000000000..8b25a1cad2a
--- /dev/null
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/NewGdbRemoteTCPTargetWizard.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2019 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.cdt.dsf.gdb.internal.ui.launching;
+
+import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
+import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin;
+import org.eclipse.cdt.dsf.gdb.launching.GDBRemoteTCPLaunchTargetProvider;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.launchbar.core.target.ILaunchTarget;
+import org.eclipse.launchbar.core.target.ILaunchTargetManager;
+import org.eclipse.launchbar.core.target.ILaunchTargetWorkingCopy;
+import org.eclipse.launchbar.ui.target.LaunchTargetWizard;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+public class NewGdbRemoteTCPTargetWizard extends LaunchTargetWizard {
+
+ private Button sameAsHostname;
+ private Text nameText;
+ private Text hostText;
+ private Text portText;
+
+ private class TCPPage extends WizardPage {
+ public TCPPage() {
+ super(NewGdbRemoteTCPTargetWizard.class.getName());
+ setTitle(LaunchUIMessages.getString("NewGdbRemoteTCPTargetWizard.Title")); //$NON-NLS-1$
+ setDescription(LaunchUIMessages.getString("NewGdbRemoteTCPTargetWizard.Desc")); //$NON-NLS-1$
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ Composite control = new Composite(parent, SWT.NONE);
+ control.setLayout(new GridLayout());
+
+ // Target name
+
+ Group nameGroup = new Group(control, SWT.NONE);
+ nameGroup.setText(LaunchUIMessages.getString("NewGdbRemoteTCPTargetWizard.NameGroup")); //$NON-NLS-1$
+ nameGroup.setLayout(new GridLayout(2, false));
+ nameGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ sameAsHostname = new Button(nameGroup, SWT.CHECK);
+ sameAsHostname.setText(LaunchUIMessages.getString("NewGdbRemoteTCPTargetWizard.SameAsHost")); //$NON-NLS-1$
+ GridData gridData = new GridData();
+ gridData.horizontalSpan = 2;
+ sameAsHostname.setLayoutData(gridData);
+ sameAsHostname.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ boolean same = sameAsHostname.getSelection();
+ if (same) {
+ nameText.setText(hostText.getText());
+ }
+ nameText.setEnabled(!same);
+ }
+ });
+ sameAsHostname.setSelection(true);
+
+ Label nameLabel = new Label(nameGroup, SWT.NONE);
+ nameLabel.setText(LaunchUIMessages.getString("NewGdbRemoteTCPTargetWizard.TargetName")); //$NON-NLS-1$
+
+ nameText = new Text(nameGroup, SWT.BORDER);
+ nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ nameText.setEnabled(false);
+ nameText.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ validatePage();
+ }
+ });
+
+ // host and port
+
+ Group connGroup = new Group(control, SWT.NONE);
+ connGroup.setText(LaunchUIMessages.getString("NewGdbRemoteTCPTargetWizard.ConnectionGroup")); //$NON-NLS-1$
+ connGroup.setLayout(new GridLayout(4, false));
+ connGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Label hostLabel = new Label(connGroup, SWT.NONE);
+ hostLabel.setText(LaunchUIMessages.getString("NewGdbRemoteTCPTargetWizard.HostName")); //$NON-NLS-1$
+
+ hostText = new Text(connGroup, SWT.BORDER);
+ hostText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ hostText.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ if (sameAsHostname.getSelection()) {
+ nameText.setText(hostText.getText());
+ }
+ validatePage();
+ }
+ });
+
+ Label portLabel = new Label(connGroup, SWT.NONE);
+ portLabel.setText(LaunchUIMessages.getString("NewGdbRemoteTCPTargetWizard.Port")); //$NON-NLS-1$
+
+ portText = new Text(connGroup, SWT.BORDER);
+ portText.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ validatePage();
+ }
+ });
+
+ setControl(control);
+ validatePage();
+ }
+
+ private void validatePage() {
+ setPageComplete(false);
+
+ if (hostText.getText().isEmpty()) {
+ setErrorMessage(LaunchUIMessages.getString("NewGdbRemoteTCPTargetWizard.NoHost")); //$NON-NLS-1$
+ return;
+ }
+
+ String port = portText.getText();
+ if (port.isEmpty()) {
+ setErrorMessage(LaunchUIMessages.getString("NewGdbRemoteTCPTargetWizard.NoPort")); //$NON-NLS-1$
+ return;
+ }
+
+ try {
+ Integer.parseInt(port);
+ } catch (NumberFormatException e) {
+ setErrorMessage(LaunchUIMessages.getString("NewGdbRemoteTCPTargetWizard.PortNotANumber")); //$NON-NLS-1$
+ return;
+ }
+
+ if (nameText.getText().isEmpty()) {
+ setErrorMessage(LaunchUIMessages.getString("NewGdbRemoteTCPTargetWizard.NoName")); //$NON-NLS-1$
+ return;
+ }
+
+ setErrorMessage(null);
+ setPageComplete(true);
+ }
+ }
+
+ @Override
+ public void addPages() {
+ super.addPages();
+ addPage(new TCPPage());
+ }
+
+ @Override
+ public boolean performFinish() {
+ ILaunchTargetManager manager = GdbUIPlugin.getService(ILaunchTargetManager.class);
+ String id = nameText.getText();
+
+ ILaunchTarget target = getLaunchTarget();
+ if (target == null) {
+ target = manager.addLaunchTarget(GDBRemoteTCPLaunchTargetProvider.TYPE_ID, id);
+ }
+
+ ILaunchTargetWorkingCopy wc = target.getWorkingCopy();
+ wc.setId(id);
+ wc.setAttribute(IGDBLaunchConfigurationConstants.ATTR_HOST, hostText.getText());
+ wc.setAttribute(IGDBLaunchConfigurationConstants.ATTR_PORT, portText.getText());
+ wc.save();
+
+ return true;
+ }
+
+ @Override
+ public boolean canDelete() {
+ return true;
+ }
+
+ @Override
+ public void performDelete() {
+ ILaunchTargetManager manager = GdbUIPlugin.getService(ILaunchTargetManager.class);
+ ILaunchTarget target = getLaunchTarget();
+ if (target != null) {
+ manager.removeLaunchTarget(target);
+ }
+ }
+
+}
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/META-INF/MANIFEST.MF b/dsf-gdb/org.eclipse.cdt.dsf.gdb/META-INF/MANIFEST.MF
index aec9fbef1f9..90a14a44145 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/META-INF/MANIFEST.MF
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-Vendor: %providerName
Bundle-SymbolicName: org.eclipse.cdt.dsf.gdb;singleton:=true
-Bundle-Version: 5.6.100.qualifier
+Bundle-Version: 5.7.0.qualifier
Bundle-Activator: org.eclipse.cdt.dsf.gdb.internal.GdbPlugin
Bundle-Localization: plugin
Require-Bundle: org.eclipse.core.runtime,
@@ -16,7 +16,8 @@ Require-Bundle: org.eclipse.core.runtime,
org.eclipse.cdt.gdb;bundle-version="7.0.0",
org.eclipse.core.resources,
org.eclipse.launchbar.core;bundle-version="2.0.0";visibility:=reexport,
- org.eclipse.cdt.core.native;bundle-version="[5.10.0,6.0.0)"
+ org.eclipse.cdt.core.native;bundle-version="[5.10.0,6.0.0)",
+ org.eclipse.cdt.native.serial;bundle-version="1.1.100"
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Export-Package: org.eclipse.cdt.dsf.gdb,
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/plugin.properties b/dsf-gdb/org.eclipse.cdt.dsf.gdb/plugin.properties
index 81803f92b47..6c296d4fa2e 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/plugin.properties
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/plugin.properties
@@ -25,3 +25,4 @@ launchDelegate.attach.description=Attach the GDB debugger, integrated using the
launchDelegate.postmortem.name=GDB (DSF) Postmortem Debugger
launchDelegate.postmortem.description=Load an application dump using the GDB debugger integrated using the Debugger Services Framework (DSF).
cdt.dsf.gdb.component.label = CDT GDB Core
+coreBuildLocalDebug.name=Core Build Local Debug
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/plugin.xml b/dsf-gdb/org.eclipse.cdt.dsf.gdb/plugin.xml
index ea9c3a68a7c..c7061339fec 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/plugin.xml
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/plugin.xml
@@ -17,7 +17,7 @@
id="org.eclipse.cdt.dsf.gdb.launch.remoteCLaunch"
type="org.eclipse.cdt.launch.remoteApplicationLaunchType"
modes="debug"
- delegate="org.eclipse.cdt.dsf.gdb.launching.GdbLaunchDelegate"
+ delegate="org.eclipse.cdt.dsf.gdb.launching.GdbTargetedLaunchDelegate"
name="%launchDelegate.remoteApplication.name"
delegateDescription="%launchDelegate.remoteApplication.description"
sourceLocatorId="org.eclipse.cdt.debug.core.sourceLocator"
@@ -91,7 +91,7 @@
delegate="org.eclipse.cdt.dsf.gdb.internal.launching.CoreBuildLocalDebugLaunchDelegate"
id="org.eclipse.cdt.dsf.gdb.coreBuildLocalDebug"
modes="debug"
- name="Core Build Local Debug"
+ name="%coreBuildLocalDebug.name"
sourceLocatorId="org.eclipse.cdt.debug.core.sourceLocator"
sourcePathComputerId="org.eclipse.cdt.debug.core.sourcePathComputer"
type="org.eclipse.cdt.debug.core.localCoreBuildLaunchConfigType">
@@ -101,4 +101,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/GdbPlugin.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/GdbPlugin.java
index b3adb14e7a8..9b79416996b 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/GdbPlugin.java
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/GdbPlugin.java
@@ -35,6 +35,7 @@ import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
/**
* The activator class controls the plug-in life cycle
@@ -209,4 +210,11 @@ public class GdbPlugin extends Plugin {
public static void log(Throwable e) {
log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, e.getMessage(), e));
}
+
+ public static T getService(Class service) {
+ BundleContext context = plugin.getBundle().getBundleContext();
+ ServiceReference ref = context.getServiceReference(service);
+ return ref != null ? context.getService(ref) : null;
+ }
+
}
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/launching/GdbRemoteLaunchConfigProvider.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/launching/GdbRemoteLaunchConfigProvider.java
new file mode 100644
index 00000000000..9d639b947df
--- /dev/null
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/launching/GdbRemoteLaunchConfigProvider.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2019 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.cdt.dsf.gdb.internal.launching;
+
+import org.eclipse.cdt.dsf.gdb.launching.GDBRemoteSerialLaunchTargetProvider;
+import org.eclipse.cdt.dsf.gdb.launching.GDBRemoteTCPLaunchTargetProvider;
+import org.eclipse.cdt.dsf.gdb.launching.LaunchUtils;
+import org.eclipse.cdt.dsf.gdb.service.SessionType;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.launchbar.core.DefaultLaunchConfigProvider;
+import org.eclipse.launchbar.core.DefaultLaunchDescriptor;
+import org.eclipse.launchbar.core.ILaunchDescriptor;
+import org.eclipse.launchbar.core.target.ILaunchTarget;
+
+public class GdbRemoteLaunchConfigProvider extends DefaultLaunchConfigProvider {
+
+ @Override
+ public boolean supports(ILaunchDescriptor descriptor, ILaunchTarget target) throws CoreException {
+ if (descriptor instanceof DefaultLaunchDescriptor) {
+ ILaunchConfiguration config = descriptor.getAdapter(ILaunchConfiguration.class);
+ if (LaunchUtils.getSessionType(config) != SessionType.REMOTE) {
+ return false;
+ }
+
+ String targetTypeId = target.getTypeId();
+ return targetTypeId.equals(GDBRemoteTCPLaunchTargetProvider.TYPE_ID)
+ || targetTypeId.equals(GDBRemoteSerialLaunchTargetProvider.TYPE_ID);
+ }
+
+ return false;
+ }
+
+}
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/launching/GdbRemoteLaunchDescriptorType.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/launching/GdbRemoteLaunchDescriptorType.java
new file mode 100644
index 00000000000..97fa5318582
--- /dev/null
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/launching/GdbRemoteLaunchDescriptorType.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2019 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.cdt.dsf.gdb.internal.launching;
+
+import org.eclipse.cdt.dsf.gdb.launching.LaunchUtils;
+import org.eclipse.cdt.dsf.gdb.service.SessionType;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.launchbar.core.DefaultLaunchDescriptor;
+import org.eclipse.launchbar.core.ILaunchDescriptor;
+import org.eclipse.launchbar.core.ILaunchDescriptorType;
+
+public class GdbRemoteLaunchDescriptorType implements ILaunchDescriptorType {
+
+ @Override
+ public ILaunchDescriptor getDescriptor(Object launchObject) throws CoreException {
+ if (launchObject instanceof ILaunchConfiguration) {
+ ILaunchConfiguration config = (ILaunchConfiguration) launchObject;
+ if (LaunchUtils.getSessionType(config) == SessionType.REMOTE) {
+ return new DefaultLaunchDescriptor(this, config);
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GDBRemoteSerialLaunchTargetProvider.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GDBRemoteSerialLaunchTargetProvider.java
new file mode 100644
index 00000000000..331dae14b3b
--- /dev/null
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GDBRemoteSerialLaunchTargetProvider.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2019 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.cdt.dsf.gdb.launching;
+
+import java.io.IOException;
+
+import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
+import org.eclipse.cdt.serial.SerialPort;
+import org.eclipse.launchbar.core.target.ILaunchTarget;
+import org.eclipse.launchbar.core.target.ILaunchTargetManager;
+import org.eclipse.launchbar.core.target.ILaunchTargetProvider;
+import org.eclipse.launchbar.core.target.TargetStatus;
+import org.eclipse.launchbar.core.target.TargetStatus.Code;
+
+public class GDBRemoteSerialLaunchTargetProvider implements ILaunchTargetProvider {
+
+ public static final String TYPE_ID = "org.eclipse.cdt.dsf.gdb.remoteSerialLaunchTargetType"; //$NON-NLS-1$
+
+ @Override
+ public void init(ILaunchTargetManager targetManager) {
+ // No automatic targets. Adding all serial ports would be noisy.
+ }
+
+ @Override
+ public TargetStatus getStatus(ILaunchTarget target) {
+ String device = target.getAttribute(IGDBLaunchConfigurationConstants.ATTR_DEV, ""); //$NON-NLS-1$
+ if (device.isEmpty()) {
+ return new TargetStatus(Code.ERROR, LaunchMessages.getString("GDBRemoteSerialLaunchTargetProvider_NoPort")); //$NON-NLS-1$
+ }
+ try {
+ for (String port : SerialPort.list()) {
+ if (device.equals(port)) {
+ return TargetStatus.OK_STATUS;
+ }
+ }
+ return new TargetStatus(Code.ERROR,
+ String.format(LaunchMessages.getString("GDBRemoteSerialLaunchTargetProvider_NotFound"), device)); //$NON-NLS-1$
+ } catch (IOException e) {
+ return new TargetStatus(Code.ERROR, e.getLocalizedMessage());
+ }
+ }
+
+}
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GDBRemoteTCPLaunchTargetProvider.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GDBRemoteTCPLaunchTargetProvider.java
new file mode 100644
index 00000000000..1823fc2fd39
--- /dev/null
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GDBRemoteTCPLaunchTargetProvider.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2019 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.cdt.dsf.gdb.launching;
+
+import org.eclipse.launchbar.core.target.ILaunchTarget;
+import org.eclipse.launchbar.core.target.ILaunchTargetManager;
+import org.eclipse.launchbar.core.target.ILaunchTargetProvider;
+import org.eclipse.launchbar.core.target.TargetStatus;
+
+public class GDBRemoteTCPLaunchTargetProvider implements ILaunchTargetProvider {
+
+ public static final String TYPE_ID = "org.eclipse.cdt.dsf.gdb.remoteTCPLaunchTargetType"; //$NON-NLS-1$
+
+ @Override
+ public void init(ILaunchTargetManager targetManager) {
+ // There are no autodiscovered launches for this type.
+ }
+
+ @Override
+ public TargetStatus getStatus(ILaunchTarget target) {
+ return TargetStatus.OK_STATUS;
+ }
+
+}
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbTargetedLaunchDelegate.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbTargetedLaunchDelegate.java
new file mode 100644
index 00000000000..76caa8c00c0
--- /dev/null
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbTargetedLaunchDelegate.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2019 QNX Software Systems and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.cdt.dsf.gdb.launching;
+
+import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.launchbar.core.target.ILaunchTarget;
+import org.eclipse.launchbar.core.target.ILaunchTargetManager;
+import org.eclipse.launchbar.core.target.launch.ILaunchConfigurationTargetedDelegate;
+import org.eclipse.launchbar.core.target.launch.ITargetedLaunch;
+
+/**
+ * Launch delegate that adds the ILaunchTarget to the GdbLaunch.
+ *
+ * There are other things we could do with this such as make sure the binary we are
+ * launching matches the cpu architecture and OS of the target, and add the launch
+ * checks to do the same. For now, though, we are assuming the user knows what they
+ * are doing when they set this up since it's all manual at this point.
+ */
+public class GdbTargetedLaunchDelegate extends GdbLaunchDelegate implements ILaunchConfigurationTargetedDelegate {
+
+ @Override
+ public ITargetedLaunch getLaunch(ILaunchConfiguration configuration, String mode, ILaunchTarget target)
+ throws CoreException {
+ GdbLaunch launch = (GdbLaunch) super.getLaunch(configuration, mode);
+ launch.setLaunchTarget(target);
+ return launch;
+ }
+
+ @Override
+ public ILaunch getLaunch(ILaunchConfiguration configuration, String mode) throws CoreException {
+ ILaunchTarget target = GdbPlugin.getService(ILaunchTargetManager.class).getDefaultLaunchTarget(configuration);
+ return getLaunch(configuration, mode, target);
+ }
+
+ @Override
+ public boolean buildForLaunch(ILaunchConfiguration configuration, String mode, ILaunchTarget target,
+ IProgressMonitor monitor) throws CoreException {
+ return super.buildForLaunch(configuration, mode, monitor);
+ }
+
+ @Override
+ public boolean finalLaunchCheck(ILaunchConfiguration configuration, String mode, ILaunchTarget target,
+ IProgressMonitor monitor) throws CoreException {
+ return super.finalLaunchCheck(configuration, mode, monitor);
+ }
+
+ @Override
+ public boolean preLaunchCheck(ILaunchConfiguration configuration, String mode, ILaunchTarget target,
+ IProgressMonitor monitor) throws CoreException {
+ return super.preLaunchCheck(configuration, mode, monitor);
+ }
+
+}
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/LaunchMessages.properties b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/LaunchMessages.properties
index 4b3c9c0cdf7..17952d59e59 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/LaunchMessages.properties
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/LaunchMessages.properties
@@ -147,6 +147,8 @@ GdbLaunchDelegate.0=Launching debugger session
GdbLaunchDelegate.1=Debugging remote C/C++ application
GdbLaunchDelegate.2=Post Mortem Debugging of C/C++ application
GdbLaunchDelegate.3=Debugging local C/C++ application
+GDBRemoteSerialLaunchTargetProvider_NoPort=No serial port device specified.
+GDBRemoteSerialLaunchTargetProvider_NotFound=Serial port %s not found
WorkingDirectoryBlock.4=Select a &workspace relative working directory:
WorkingDirectoryBlock.7=Select a working directory for the launch configuration:
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_2.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_2.java
index 7abc6db0a06..d1ce72b90d9 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_2.java
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_2.java
@@ -17,6 +17,7 @@
package org.eclipse.cdt.dsf.gdb.service;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
@@ -47,6 +48,7 @@ import org.eclipse.cdt.dsf.debug.service.command.ICommand;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext;
import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
+import org.eclipse.cdt.dsf.gdb.launching.GDBRemoteTCPLaunchTargetProvider;
import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceRecordSelectedChangedDMEvent;
import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
@@ -67,6 +69,8 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunch;
+import org.eclipse.launchbar.core.target.ILaunchTarget;
+import org.eclipse.launchbar.core.target.launch.ITargetedLaunch;
import com.ibm.icu.text.MessageFormat;
@@ -435,7 +439,7 @@ public class GDBProcesses_7_2 extends GDBProcesses_7_1 implements IMultiTerminat
} else {
super.handleCompleted();
}
- };
+ }
});
return;
}
@@ -535,10 +539,21 @@ public class GDBProcesses_7_2 extends GDBProcesses_7_1 implements IMultiTerminat
ILaunch launch = procCtx.getAdapter(ILaunch.class);
assert launch != null;
if (launch != null) {
- Map attributes = null;
+ Map attributes = new HashMap<>();
try {
- attributes = launch.getLaunchConfiguration().getAttributes();
+ attributes.putAll(launch.getLaunchConfiguration().getAttributes());
} catch (CoreException e) {
+ rm.done(e.getStatus());
+ return;
+ }
+
+ if (launch instanceof ITargetedLaunch) {
+ ILaunchTarget target = ((ITargetedLaunch) launch).getLaunchTarget();
+ if (target != null) {
+ attributes.putAll(target.getAttributes());
+ attributes.put(IGDBLaunchConfigurationConstants.ATTR_REMOTE_TCP,
+ target.getTypeId().equals(GDBRemoteTCPLaunchTargetProvider.TYPE_ID));
+ }
}
boolean isTcpConnection = CDebugUtils.getAttribute(attributes,
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl.java
index c456c372d1d..590e71bbe4b 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl.java
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl.java
@@ -28,6 +28,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
@@ -52,10 +53,12 @@ import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.debug.service.command.ICommandResult;
import org.eclipse.cdt.dsf.debug.service.command.ICommandToken;
+import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
import org.eclipse.cdt.dsf.gdb.IGdbDebugConstants;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.gdb.internal.Messages;
import org.eclipse.cdt.dsf.gdb.launching.FinalLaunchSequence;
+import org.eclipse.cdt.dsf.gdb.launching.GDBRemoteTCPLaunchTargetProvider;
import org.eclipse.cdt.dsf.gdb.service.IGDBBackend;
import org.eclipse.cdt.dsf.gdb.service.IGDBProcesses;
import org.eclipse.cdt.dsf.gdb.service.command.GdbCommandTimeoutManager.ICommandTimeoutListener;
@@ -94,6 +97,8 @@ import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.IStatusHandler;
+import org.eclipse.launchbar.core.target.ILaunchTarget;
+import org.eclipse.launchbar.core.target.launch.ITargetedLaunch;
import org.osgi.framework.BundleContext;
/**
@@ -425,10 +430,22 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
public void completeInitialization(final RequestMonitor rm) {
// We take the attributes from the launchConfiguration
ILaunch launch = (ILaunch) getSession().getModelAdapter(ILaunch.class);
- Map attributes = null;
+ Map attributes = new HashMap<>();
try {
- attributes = launch.getLaunchConfiguration().getAttributes();
+ attributes.putAll(launch.getLaunchConfiguration().getAttributes());
} catch (CoreException e) {
+ rm.done(e.getStatus());
+ return;
+ }
+
+ // And optionally the target
+ if (launch instanceof ITargetedLaunch) {
+ ILaunchTarget target = ((ITargetedLaunch) launch).getLaunchTarget();
+ if (target != null) {
+ attributes.putAll(target.getAttributes());
+ attributes.put(IGDBLaunchConfigurationConstants.ATTR_REMOTE_TCP,
+ target.getTypeId().equals(GDBRemoteTCPLaunchTargetProvider.TYPE_ID));
+ }
}
// We need a RequestMonitorWithProgress, if we don't have one, we create one.