diff options
14 files changed, 568 insertions, 560 deletions
diff --git a/cross/org.eclipse.cdt.launch.remote/META-INF/MANIFEST.MF b/cross/org.eclipse.cdt.launch.remote/META-INF/MANIFEST.MF index f0a07fc5c49..934a9d8f5af 100644 --- a/cross/org.eclipse.cdt.launch.remote/META-INF/MANIFEST.MF +++ b/cross/org.eclipse.cdt.launch.remote/META-INF/MANIFEST.MF @@ -2,15 +2,10 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.launch.remote;singleton:=true -Bundle-Version: 2.4.0.qualifier +Bundle-Version: 2.5.0.qualifier Bundle-Activator: org.eclipse.cdt.internal.launch.remote.Activator Bundle-Localization: plugin -Require-Bundle: org.eclipse.rse.ui;bundle-version="[3.0.0,4.0.0)", - org.eclipse.rse.subsystems.shells.core;bundle-version="[3.0.0,4.0.0)", - org.eclipse.rse.subsystems.files.core;bundle-version="[3.0.0,4.0.0)", - org.eclipse.rse.core;bundle-version="[3.0.0,4.0.0)", - org.eclipse.rse.services;bundle-version="[3.0.0,4.0.0)", - org.eclipse.cdt.launch, +Require-Bundle: org.eclipse.cdt.launch, org.eclipse.cdt.debug.core, org.eclipse.cdt.core, org.eclipse.debug.ui, @@ -19,11 +14,13 @@ Require-Bundle: org.eclipse.rse.ui;bundle-version="[3.0.0,4.0.0)", org.eclipse.core.resources, org.eclipse.core.runtime, org.eclipse.cdt.debug.ui, - org.eclipse.rse.files.ui;bundle-version="[3.0.0,4.0.0)", org.eclipse.cdt.dsf.gdb;bundle-version="3.0.0", org.eclipse.cdt.dsf.gdb.ui;bundle-version="2.1.0", org.eclipse.cdt.dsf;bundle-version="2.1.0", - org.eclipse.core.variables;bundle-version="3.2.300" + org.eclipse.core.variables;bundle-version="3.2.300", + org.eclipse.remote.core;bundle-version="2.0.0", + org.eclipse.remote.ui;bundle-version="2.0.0", + org.eclipse.core.filesystem Bundle-ActivationPolicy: lazy Eclipse-LazyStart: true Bundle-Vendor: %providerName diff --git a/cross/org.eclipse.cdt.launch.remote/pom.xml b/cross/org.eclipse.cdt.launch.remote/pom.xml index 0e2556bc342..a67e1406ecf 100644 --- a/cross/org.eclipse.cdt.launch.remote/pom.xml +++ b/cross/org.eclipse.cdt.launch.remote/pom.xml @@ -11,7 +11,7 @@ <relativePath>../../pom.xml</relativePath> </parent> - <version>2.4.0-SNAPSHOT</version> + <version>2.5.0-SNAPSHOT</version> <artifactId>org.eclipse.cdt.launch.remote</artifactId> <packaging>eclipse-plugin</packaging> </project> diff --git a/cross/org.eclipse.cdt.launch.remote/remotecdt.html b/cross/org.eclipse.cdt.launch.remote/remotecdt.html index 6ea42ead49c..a82428b387f 100644 --- a/cross/org.eclipse.cdt.launch.remote/remotecdt.html +++ b/cross/org.eclipse.cdt.launch.remote/remotecdt.html @@ -4,7 +4,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <meta name="copyright" content="Copyright (c) 2006, 2007 PalmSource, Inc. and others. This page is made available under license. For full details see the LEGAL notice in the documentation book that contains this page." /> -<link rel="stylesheet" type="text/css" href="../org.eclipse.rse.doc.user/book.css" /> +<link rel="stylesheet" type="text/css" href="../org.eclipse.cdt.doc.user/book.css" /> <title>Launching Remote C/C++ Applications</title> </head> <!-- @@ -18,30 +18,30 @@ Contributors: Ewa Matejska (PalmSource) - initial API and implementation Martin Oberhuber (Wind River) - fix 158529: Migrate docs to HTML / TOC format Dave Dykstal (IBM) - fix 174770: SAX Parse exceptions in Eclipse 3.3 +Wainer S. Moschetta (IBM) - bug 452356: replace RSE with org.eclipse.remote --> <body id="tremotecdt"><a name="tremotecdt"><!-- --></a> <h1 class="topictitle1">Launching Remote C/C++ Applications</h1> <div class="p"> -<p>The RSE Remote CDT Plugin builds on top of CDT and integrates with RSE to introduce -a "Remote C/C++ Application" launch configuration. This launch configuration relies -on the shell and file services of the RSE connections.</p> +<p>The remote CDT launch Plugin builds on top of CDT and integrates with Eclipse remote framework (org.eclipse.remote) +to introduce a "Remote C/C++ Application" launch configuration. This launch configuration relies +on the shell and file services of the remote framework's connections.</p> -<p>The "Remote C/C++ Application" launch configuration enables the user to select from a list of RSE -connections which have the shell service available. For a debug launch, the binary is downloaded -to the remote using the file service of the RSE connection, gdbserver is automatically started +<p>The "Remote C/C++ Application" launch configuration enables the user to select from a list of connections which have the shell service available. For a debug launch, the binary is downloaded +to the remote using the file service of the remote framework's connection, gdbserver is automatically started on the remote using the shell service and a gdb debug connection is establised. For a run launch, the binary is downloaded to the remote using the file service and then it is invoked using the shell service.</p> -<p>In the future, an RSE file service should be used to select where the remote download +<p>In the future, a file service should be used to select where the remote download should take place. Right now the remote path is entered manually in a text field.</p> </div> <h2>System Prerequisites</h2> <div class="p"><b>Local Host</b> <ul> - <li>It is necessary to create an RSE connection which has the file and shell services + <li>It is necessary to create an connection which has the file and shell services available.</li> </ul></div> diff --git a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/internal/launch/remote/Activator.java b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/internal/launch/remote/Activator.java index ec9e07f39c3..7e6dc13286d 100644 --- a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/internal/launch/remote/Activator.java +++ b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/internal/launch/remote/Activator.java @@ -14,6 +14,7 @@ package org.eclipse.cdt.internal.launch.remote; import org.eclipse.core.runtime.Plugin; import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; /** * The main plugin class to be used in the desktop. @@ -64,4 +65,16 @@ public class Activator extends Plugin { public static BundleContext getBundleContext() { return getDefault().getBundle().getBundleContext(); } + + /** + * Return the OSGi service with the given service interface. + * + * @param service service interface + * @return the specified service or null if it's not registered + */ + public static <T> T getService(Class<T> service) { + BundleContext context = Activator.getBundleContext(); + ServiceReference<T> ref = context.getServiceReference(service); + return ref != null ? context.getService(ref) : null; + } } diff --git a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/internal/launch/remote/Messages.java b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/internal/launch/remote/Messages.java index 4fafbd9a53f..bd12ac948f3 100644 --- a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/internal/launch/remote/Messages.java +++ b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/internal/launch/remote/Messages.java @@ -43,6 +43,8 @@ public class Messages extends NLS { public static String RemoteCMainTab_ErrorNoConnection; public static String RemoteCMainTab_Connection; public static String RemoteCMainTab_New; + public static String RemoteCMainTab_New_title; + public static String RemoteCMainTab_New_conntype_combo_label; public static String RemoteCMainTab_Edit; public static String RemoteCMainTab_Properties; public static String RemoteCMainTab_Properties_title; diff --git a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/internal/launch/remote/messages.properties b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/internal/launch/remote/messages.properties index b61a5888f95..a9c61cb44d4 100644 --- a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/internal/launch/remote/messages.properties +++ b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/internal/launch/remote/messages.properties @@ -43,6 +43,8 @@ RemoteCMainTab_ErrorNoConnection=Remote Connection must be selected. RemoteCMainTab_Remote_Path_Browse_Button=Browse... RemoteCMainTab_Connection=Connection: RemoteCMainTab_New=New... +RemoteCMainTab_New_title=Create a new connection +RemoteCMainTab_New_conntype_combo_label=Choose connection type: RemoteCMainTab_Edit=Edit... Gdbserver_Settings_Tab_Name=Gdbserver Settings Gdbserver_name_textfield_label=Gdbserver path: diff --git a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/IRemoteConnectionHostConstants.java b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/IRemoteConnectionHostConstants.java index 1d7fdc6aac5..74b5f152d5a 100644 --- a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/IRemoteConnectionHostConstants.java +++ b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/IRemoteConnectionHostConstants.java @@ -26,7 +26,7 @@ package org.eclipse.cdt.launch.remote; */ public interface IRemoteConnectionHostConstants { - public static final String PI_REMOTE_CDT = "org.eclipse.rse.remotecdt"; //$NON-NLS-1$ + public static final String PI_REMOTE_CDT = "org.eclipse.cdt.launch.remote.attr"; //$NON-NLS-1$ public static final String REMOTE_WS_ROOT = "remoteWsRoot"; //$NON-NLS-1$ public static final String DEFAULT_SKIP_DOWNLOAD = "defaultSkipDownload"; //$NON-NLS-1$ diff --git a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RSEHelper.java b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RSEHelper.java deleted file mode 100644 index 2e7dcf70fe4..00000000000 --- a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RSEHelper.java +++ /dev/null @@ -1,354 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2009, 2016 MontaVista Software, Inc. and others. - * 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: - * Anna Dushistova (MontaVista) - initial API and implementation - * Anna Dushistova (Mentor Graphics) - [314659] moved common methods for DSF and CDI launches to this class - * Anna Dushistova (Mentor Graphics) - changed spaceEscapify visibility - * Anna Dushistova (MontaVista) - [318051][remote debug] Terminating when "Remote shell" process is selected doesn't work - ********************************************************************************/ - -package org.eclipse.cdt.launch.remote; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; - -import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; -import org.eclipse.cdt.internal.launch.remote.Activator; -import org.eclipse.cdt.internal.launch.remote.Messages; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.MultiStatus; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.SubProgressMonitor; -import org.eclipse.debug.core.ILaunch; -import org.eclipse.debug.core.ILaunchConfiguration; -import org.eclipse.osgi.util.NLS; -import org.eclipse.rse.core.RSECorePlugin; -import org.eclipse.rse.core.model.IHost; -import org.eclipse.rse.core.subsystems.ISubSystem; -import org.eclipse.rse.services.IService; -import org.eclipse.rse.services.clientserver.messages.SystemOperationCancelledException; -import org.eclipse.rse.services.files.IFileService; -import org.eclipse.rse.services.shells.HostShellProcessAdapter; -import org.eclipse.rse.services.shells.IHostShell; -import org.eclipse.rse.services.shells.IShellService; -import org.eclipse.rse.subsystems.files.core.servicesubsystem.IFileServiceSubSystem; - -public class RSEHelper { - - private final static String EXIT_CMD = "exit"; //$NON-NLS-1$ - private final static String CMD_DELIMITER = ";"; //$NON-NLS-1$ - - - public static IHost getRemoteConnectionByName(String remoteConnection) { - if (remoteConnection == null) - return null; - IHost[] connections = RSECorePlugin.getTheSystemRegistry().getHosts(); - for (int i = 0; i < connections.length; i++) - if (connections[i].getAliasName().equals(remoteConnection)) - return connections[i]; - return null; // TODO Connection is not found in the list--need to react - // somehow, throw the exception? - - } - - public static IService getConnectedRemoteFileService( - IHost currentConnection, IProgressMonitor monitor) throws Exception { - final ISubSystem subsystem = getFileSubsystem(currentConnection); - - if (subsystem == null) - throw new Exception(Messages.RemoteRunLaunchDelegate_4); - - try { - subsystem.connect(monitor, false); - } catch (CoreException e) { - throw e; - } catch (OperationCanceledException e) { - throw new CoreException(Status.CANCEL_STATUS); - } - - if (!subsystem.isConnected()) - throw new Exception(Messages.RemoteRunLaunchDelegate_5); - - return ((IFileServiceSubSystem) subsystem).getFileService(); - } - - public static IService getConnectedRemoteShellService( - IHost currentConnection, IProgressMonitor monitor) throws Exception { - ISubSystem subsystem = getSubSystemWithShellService(currentConnection); - if (subsystem != null) { - try { - subsystem.connect(monitor, false); - } catch (CoreException e) { - throw e; - } catch (OperationCanceledException e) { - throw new CoreException(Status.CANCEL_STATUS); - } - if (!subsystem.isConnected()) - throw new Exception(Messages.RemoteRunLaunchDelegate_5); - - return subsystem.getSubSystemConfiguration() - .getService(currentConnection).getAdapter( - IShellService.class); - } else { - throw new Exception(Messages.RemoteRunLaunchDelegate_4); - } - } - - /** - * Find the first shell service associated with the host. - * - * @param host - * the connection - * @return shell service object, or <code>null</code> if not found. - */ - public static IShellService getShellService(IHost host) { - ISubSystem ss = getSubSystemWithShellService(host); - if (ss != null) { - return ss.getSubSystemConfiguration().getService( - host).getAdapter(IShellService.class); - } - return null; - } - - /** - * Find the first IShellServiceSubSystem service associated with the host. - * - * @param host - * the connection - * @return shell service subsystem, or <code>null</code> if not found. - */ - public static ISubSystem getSubSystemWithShellService(IHost host) { - if (host == null) - return null; - ISubSystem[] subSystems = host.getSubSystems(); - IShellService ssvc = null; - for (int i = 0; subSystems != null && i < subSystems.length; i++) { - IService svc = subSystems[i].getSubSystemConfiguration() - .getService(host); - if (svc != null) { - ssvc = svc.getAdapter(IShellService.class); - if (ssvc != null) { - return subSystems[i]; - } - } - } - return null; - } - - public static ISubSystem getFileSubsystem(IHost host) { - if (host == null) - return null; - ISubSystem[] subSystems = host.getSubSystems(); - for (int i = 0; i < subSystems.length; i++) { - if (subSystems[i] instanceof IFileServiceSubSystem) - return subSystems[i]; - } - return null; - } - - public static IHost[] getSuitableConnections() { - ArrayList shellConnections = new ArrayList(Arrays.asList(RSECorePlugin.getTheSystemRegistry() - .getHostsBySubSystemConfigurationCategory("shells"))); //$NON-NLS-1$ - ArrayList terminalConnections = new ArrayList(Arrays.asList(RSECorePlugin.getTheSystemRegistry() - .getHostsBySubSystemConfigurationCategory("terminals")));//$NON-NLS-1$ - - Iterator iter = terminalConnections.iterator(); - while(iter.hasNext()){ - Object terminalConnection = iter.next(); - if(!shellConnections.contains(terminalConnection)){ - shellConnections.add(terminalConnection); - } - } - - return (IHost[]) shellConnections.toArray(new IHost[shellConnections.size()]); - } - - - public static void remoteFileDownload(ILaunchConfiguration config, - ILaunch launch, String localExePath, String remoteExePath, - IProgressMonitor monitor) throws CoreException { - - boolean skipDownload = config - .getAttribute( - IRemoteConnectionConfigurationConstants.ATTR_SKIP_DOWNLOAD_TO_TARGET, - false); - - if (skipDownload) - // Nothing to do. Download is skipped. - return; - monitor.beginTask(Messages.RemoteRunLaunchDelegate_2, 100); - IFileService fileService; - try { - fileService = (IFileService) RSEHelper - .getConnectedRemoteFileService( - getCurrentConnection(config), - new SubProgressMonitor(monitor, 10)); - File file = new File(localExePath); - Path remotePath = new Path(remoteExePath); - fileService.upload(file, remotePath.removeLastSegments(1) - .toString(), remotePath.lastSegment(), true, null, null, - new SubProgressMonitor(monitor, 85)); - // Need to change the permissions to match the original file - // permissions because of a bug in upload - remoteShellExec( - config, - "", "chmod", "+x " + spaceEscapify(remotePath.toString()), new SubProgressMonitor(monitor, 5)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } catch (SystemOperationCancelledException e) { - abort(e.getLocalizedMessage(), null, IStatus.CANCEL); - } catch (Exception e) { - abort(Messages.RemoteRunLaunchDelegate_6, e, - ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); - } finally { - monitor.done(); - } - } - - public static String spaceEscapify(String inputString) { - if (inputString == null) - return null; - - return inputString.replaceAll(" ", "\\\\ "); //$NON-NLS-1$ //$NON-NLS-2$ - } - - public static IHost getCurrentConnection(ILaunchConfiguration config) - throws CoreException { - String remoteConnection = config.getAttribute( - IRemoteConnectionConfigurationConstants.ATTR_REMOTE_CONNECTION, - ""); //$NON-NLS-1$ - IHost connection = RSEHelper - .getRemoteConnectionByName(remoteConnection); - if (connection == null) { - abort(Messages.RemoteRunLaunchDelegate_13, null, - ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); - } - return connection; - } - - public static Process remoteShellExec(ILaunchConfiguration config, - String prelaunchCmd, String remoteCommandPath, String arguments, - IProgressMonitor monitor) throws CoreException { - // The exit command is called to force the remote shell to close after - // our command - // is executed. This is to prevent a running process at the end of the - // debug session. - // See Bug 158786. - monitor.beginTask(NLS.bind(Messages.RemoteRunLaunchDelegate_8, - remoteCommandPath, arguments), 10); - String realRemoteCommand = arguments == null ? spaceEscapify(remoteCommandPath) - : spaceEscapify(remoteCommandPath) + " " + arguments; //$NON-NLS-1$ - - String remoteCommand = realRemoteCommand + CMD_DELIMITER + EXIT_CMD; - - if (!prelaunchCmd.trim().isEmpty()) - remoteCommand = prelaunchCmd + CMD_DELIMITER + remoteCommand; - - IShellService shellService; - Process p = null; - try { - shellService = (IShellService) RSEHelper - .getConnectedRemoteShellService( - getCurrentConnection(config), - new SubProgressMonitor(monitor, 7)); - - // This is necessary because runCommand does not actually run the - // command right now. - String env[] = new String[0]; - try { - IHostShell hostShell = shellService.launchShell( - "", env, new SubProgressMonitor(monitor, 3)); //$NON-NLS-1$ - hostShell.writeToShell(remoteCommand); - p = new HostShellProcessAdapter(hostShell); - } catch (Exception e) { - if (p != null) { - p.destroy(); - } - abort(Messages.RemoteRunLaunchDelegate_7, e, - ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); - } - } catch (Exception e1) { - abort(e1.getMessage(), e1, - ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); - } - - monitor.done(); - return p; - } - - public static IHostShell execCmdInRemoteShell(ILaunchConfiguration config, - String prelaunchCmd, String remoteCommandPath, String arguments, - IProgressMonitor monitor) throws Exception { - // The exit command is called to force the remote shell to close after - // our command - // is executed. This is to prevent a running process at the end of the - // debug session. - // See Bug 158786. - monitor.beginTask(NLS.bind(Messages.RemoteRunLaunchDelegate_8, - remoteCommandPath, arguments), 10); - String realRemoteCommand = arguments == null ? spaceEscapify(remoteCommandPath) - : spaceEscapify(remoteCommandPath) + " " + arguments; //$NON-NLS-1$ - - String remoteCommand = realRemoteCommand + CMD_DELIMITER + EXIT_CMD; - - if (!prelaunchCmd.trim().isEmpty()) - remoteCommand = prelaunchCmd + CMD_DELIMITER + remoteCommand; - - IShellService shellService = null; - shellService = (IShellService) RSEHelper - .getConnectedRemoteShellService(getCurrentConnection(config), - new SubProgressMonitor(monitor, 7)); - - // This is necessary because runCommand does not actually run the - // command right now. - String env[] = new String[0]; - IHostShell hostShell = null; - if (shellService != null) { - hostShell = shellService.launchShell( - "", env, new SubProgressMonitor(monitor, 3)); //$NON-NLS-1$ - hostShell.writeToShell(remoteCommand); - } - monitor.done(); - return hostShell; - } - - public static String getRemoteHostname(ILaunchConfiguration config) - throws CoreException { - IHost currentConnection = getCurrentConnection(config); - return currentConnection.getHostName(); - } - - /** - * Throws a core exception with an error status object built from the given - * message, lower level exception, and error code. - * - * @param message - * the status message - * @param exception - * lower level exception associated with the error, or - * <code>null</code> if none - * @param code - * error code - */ - public static void abort(String message, Throwable exception, int code) throws CoreException { - IStatus status; - if (exception != null) { - MultiStatus multiStatus = new MultiStatus(Activator.PLUGIN_ID, code, message, exception); - multiStatus.add(new Status(IStatus.ERROR, Activator.PLUGIN_ID, code, exception.getLocalizedMessage(), exception)); - status= multiStatus; - } else { - status= new Status(IStatus.ERROR, Activator.PLUGIN_ID, code, message, null); - } - throw new CoreException(status); - } - - -} diff --git a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RemoteHelper.java b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RemoteHelper.java new file mode 100644 index 00000000000..153c174fa46 --- /dev/null +++ b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RemoteHelper.java @@ -0,0 +1,247 @@ +/******************************************************************************** + * Copyright (c) 2009, 2015 MontaVista Software, Inc. and others. + * 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: + * Anna Dushistova (MontaVista) - initial API and implementation + * Anna Dushistova (Mentor Graphics) - [314659] moved common methods for DSF and CDI launches to this class + * Anna Dushistova (Mentor Graphics) - changed spaceEscapify visibility + * Anna Dushistova (MontaVista) - [318051][remote debug] Terminating when "Remote shell" process is selected doesn't work + * Wainer Moschetta(IBM) - [452356] replace RSE with org.eclipse.remote + ********************************************************************************/ + +package org.eclipse.cdt.launch.remote; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; +import org.eclipse.cdt.internal.launch.remote.Activator; +import org.eclipse.cdt.internal.launch.remote.Messages; +import org.eclipse.core.filesystem.EFS; +import org.eclipse.core.filesystem.IFileStore; +import org.eclipse.core.filesystem.IFileSystem; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.debug.core.ILaunch; +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.osgi.util.NLS; +import org.eclipse.remote.core.IRemoteCommandShellService; +import org.eclipse.remote.core.IRemoteConnection; +import org.eclipse.remote.core.IRemoteConnectionHostService; +import org.eclipse.remote.core.IRemoteFileService; +import org.eclipse.remote.core.IRemoteProcess; +import org.eclipse.remote.core.IRemoteProcessBuilder; +import org.eclipse.remote.core.IRemoteServicesManager; +import org.eclipse.remote.core.RemoteProcessAdapter; + +public class RemoteHelper { + + private final static String EXIT_CMD = "exit"; //$NON-NLS-1$ + private final static String CMD_DELIMITER = ";"; //$NON-NLS-1$ + + public static IRemoteConnection getRemoteConnectionByName(String remoteConnection) { + if (remoteConnection == null) + return null; + IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class); + if (manager == null) { + return null; + } + List<IRemoteConnection> conns = manager.getAllRemoteConnections(); + for (IRemoteConnection conn: conns) { + if (conn.getName().contentEquals(remoteConnection)) { + return conn; + } + } + return null; + } + + public static IRemoteFileService getFileSubsystem(IRemoteConnection conn) { + if (conn == null) { + return null; + } + return conn.getService(IRemoteFileService.class); + } + + public static IRemoteConnection[] getSuitableConnections() { + IRemoteServicesManager manager = Activator.getService(IRemoteServicesManager.class); + if (manager == null) + return null; + ArrayList<IRemoteConnection> suitableConnections = new ArrayList<>(); + List<IRemoteConnection> allConnections = manager.getAllRemoteConnections(); + for (IRemoteConnection conn: allConnections) { + if (conn.hasService(IRemoteCommandShellService.class)) { + suitableConnections.add(conn); + } + } + return suitableConnections.toArray(new IRemoteConnection[]{}); + } + + public static void remoteFileDownload(ILaunchConfiguration config, + ILaunch launch, String localExePath, String remoteExePath, + IProgressMonitor monitor) throws CoreException { + + boolean skipDownload = config + .getAttribute( + IRemoteConnectionConfigurationConstants.ATTR_SKIP_DOWNLOAD_TO_TARGET, + false); + + if (skipDownload) + // Nothing to do. Download is skipped. + return; + monitor.beginTask(Messages.RemoteRunLaunchDelegate_2, 100); + try { + IRemoteConnection conn = getCurrentConnection(config); + IRemoteFileService fs = conn.getService(IRemoteFileService.class); + IFileStore remoteFile = fs.getResource(remoteExePath); + + IFileSystem localfs = EFS.getLocalFileSystem(); + IFileStore localFile = localfs.getStore(new Path(localExePath)); + + if (!localFile.fetchInfo().exists()) { + return; + } + localFile.copy(remoteFile, EFS.OVERWRITE, monitor); + // Need to change the permissions to match the original file + // permissions because of a bug in upload + remoteShellExec( + config, + "", "chmod", "+x " + spaceEscapify(remoteExePath), new SubProgressMonitor(monitor, 5)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } catch (CoreException e) { + abort(Messages.RemoteRunLaunchDelegate_6, e, + ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); + } finally { + monitor.done(); + } + } + + public static String spaceEscapify(String inputString) { + if (inputString == null) + return null; + + return inputString.replaceAll(" ", "\\\\ "); //$NON-NLS-1$ //$NON-NLS-2$ + } + + public static IRemoteConnection getCurrentConnection(ILaunchConfiguration config) + throws CoreException { + String remoteConnection = config.getAttribute( + IRemoteConnectionConfigurationConstants.ATTR_REMOTE_CONNECTION, + ""); //$NON-NLS-1$ + IRemoteConnection connection = getRemoteConnectionByName(remoteConnection); + if (connection == null) { + abort(Messages.RemoteRunLaunchDelegate_13, null, + ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); + } + return connection; + } + + public static Process remoteShellExec(ILaunchConfiguration config, + String prelaunchCmd, String remoteCommandPath, String arguments, + IProgressMonitor monitor) throws CoreException { + // The exit command is called to force the remote shell to close after + // our command + // is executed. This is to prevent a running process at the end of the + // debug session. + // See Bug 158786. + monitor.beginTask(NLS.bind(Messages.RemoteRunLaunchDelegate_8, + remoteCommandPath, arguments), 10); + String realRemoteCommand = arguments == null ? spaceEscapify(remoteCommandPath) + : spaceEscapify(remoteCommandPath) + " " + arguments; //$NON-NLS-1$ + + String remoteCommand = realRemoteCommand + CMD_DELIMITER + EXIT_CMD + "\r\n"; //$NON-NLS-1$ + + if (!prelaunchCmd.trim().equals("")) //$NON-NLS-1$ + remoteCommand = prelaunchCmd + CMD_DELIMITER + remoteCommand; + + IRemoteConnection conn = getCurrentConnection(config); + + IRemoteCommandShellService shellService = conn.getService(IRemoteCommandShellService.class); + IRemoteProcess remoteProcess = null; + Process p = null; + + try { + remoteProcess = shellService.getCommandShell(IRemoteProcessBuilder.ALLOCATE_PTY); + p = new RemoteProcessAdapter(remoteProcess); + OutputStream os = remoteProcess.getOutputStream(); + os.write(remoteCommand.getBytes()); + os.flush(); + } catch (IOException e) { + abort(Messages.RemoteRunLaunchDelegate_7, e, + ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); + } + monitor.done(); + return p; + } + + public static IRemoteProcess execCmdInRemoteShell(ILaunchConfiguration config, + String prelaunchCmd, String remoteCommandPath, String arguments, + IProgressMonitor monitor) throws Exception { + // The exit command is called to force the remote shell to close after + // our command + // is executed. This is to prevent a running process at the end of the + // debug session. + // See Bug 158786. + monitor.beginTask(NLS.bind(Messages.RemoteRunLaunchDelegate_8, + remoteCommandPath, arguments), 10); + String realRemoteCommand = arguments == null ? spaceEscapify(remoteCommandPath) + : spaceEscapify(remoteCommandPath) + " " + arguments; //$NON-NLS-1$ + + String remoteCommand = realRemoteCommand + CMD_DELIMITER + EXIT_CMD + "\r\n"; //$NON-NLS-1$ + + if (!prelaunchCmd.trim().equals("")) //$NON-NLS-1$ + remoteCommand = prelaunchCmd + CMD_DELIMITER + remoteCommand; + + IRemoteConnection conn = getCurrentConnection(config); + + IRemoteCommandShellService shellService = conn.getService(IRemoteCommandShellService.class); + IRemoteProcess p = null; + p = shellService.getCommandShell(IRemoteProcessBuilder.ALLOCATE_PTY); + OutputStream os = p.getOutputStream(); + os.write(remoteCommand.getBytes()); + os.flush(); + monitor.done(); + return p; + } + + + public static String getRemoteHostname(ILaunchConfiguration config) + throws CoreException { + IRemoteConnection currentConnection = getCurrentConnection(config); + IRemoteConnectionHostService hostService = currentConnection.getService(IRemoteConnectionHostService.class); + return hostService.getHostname(); + } + + /** + * Throws a core exception with an error status object built from the given + * message, lower level exception, and error code. + * + * @param message + * the status message + * @param exception + * lower level exception associated with the error, or + * <code>null</code> if none + * @param code + * error code + */ + public static void abort(String message, Throwable exception, int code) throws CoreException { + IStatus status; + if (exception != null) { + MultiStatus multiStatus = new MultiStatus(Activator.PLUGIN_ID, code, message, exception); + multiStatus.add(new Status(IStatus.ERROR, Activator.PLUGIN_ID, code, exception.getLocalizedMessage(), exception)); + status= multiStatus; + } else { + status= new Status(IStatus.ERROR, Activator.PLUGIN_ID, code, message, null); + } + throw new CoreException(status); + } + +} diff --git a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RemoteUIHelper.java b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RemoteUIHelper.java new file mode 100644 index 00000000000..6f40a95438d --- /dev/null +++ b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RemoteUIHelper.java @@ -0,0 +1,182 @@ +/******************************************************************************** + * Copyright (c) 2016 IBM Corporation and others. + * 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: + * Wainer S. Moschetta (IBM) - initial API and implementation + ********************************************************************************/ +package org.eclipse.cdt.launch.remote; + +import java.util.ArrayList; + +import org.eclipse.cdt.internal.launch.remote.Activator; +import org.eclipse.cdt.internal.launch.remote.Messages; +import org.eclipse.core.runtime.ILog; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Plugin; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.remote.core.IRemoteCommandShellService; +import org.eclipse.remote.core.IRemoteConnection; +import org.eclipse.remote.core.IRemoteConnectionType; +import org.eclipse.remote.core.IRemoteConnectionWorkingCopy; +import org.eclipse.remote.core.IRemoteServicesManager; +import org.eclipse.remote.core.exception.RemoteConnectionException; +import org.eclipse.remote.ui.IRemoteUIConnectionService; +import org.eclipse.remote.ui.IRemoteUIConnectionWizard; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; + +public class RemoteUIHelper { + /** + * Open dialog to edit a remote connection. + * + * @param connection - the remote connection + * @param shell - the shell + */ + public static void editConnectionDialog(IRemoteConnection connection, Shell shell) { + if (connection == null) { + return; + } + IRemoteUIConnectionService uiConnServices = connection.getConnectionType().getService(IRemoteUIConnectionService.class); + IRemoteUIConnectionWizard wizard = uiConnServices.getConnectionWizard(shell); + wizard.setConnection(connection.getWorkingCopy()); + IRemoteConnectionWorkingCopy connCopy = wizard.open(); + if (connCopy != null) { + try { + connCopy.save(); + } catch (RemoteConnectionException e) { + logError(e); + } + } + } + + /** + * Open dialog for user to create a new connection. + * + * @param shell - the shell + */ + public static void newConnectionDialog(Shell shell) { + /* + * Evoke native new connection wizard and save connection + * if created by the user. + */ + class NewRemoteConnectionDialog extends Dialog { + private String title; + private Combo fConnSelection; + private IRemoteServicesManager manager; + + protected NewRemoteConnectionDialog(Shell parentShell, String windowTitle) { + super(parentShell); + title = windowTitle; + manager = Activator.getService(IRemoteServicesManager.class); + } + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + newShell.setText(title); + } + @Override + protected Control createDialogArea(Composite parent) { + Composite composite = (Composite) super.createDialogArea(parent); + + Label label = new Label(composite, SWT.WRAP); + label.setText(Messages.RemoteCMainTab_New_conntype_combo_label); + GridData data = new GridData(GridData.GRAB_HORIZONTAL + | GridData.GRAB_VERTICAL + | GridData.HORIZONTAL_ALIGN_FILL + | GridData.VERTICAL_ALIGN_CENTER); + data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH); + label.setLayoutData(data); + label.setFont(parent.getFont()); + fConnSelection = new Combo (composite, SWT.DROP_DOWN | SWT.READ_ONLY); + ArrayList<String> suitableConnections = new ArrayList<>(); + for (IRemoteConnectionType type: manager.getAllConnectionTypes()) { + if (type.canAdd() && + type.getConnectionServices().contains( + IRemoteCommandShellService.class.getName())) { + fConnSelection.setData(type.getName(), type.getId()); + suitableConnections.add(type.getName()); + } + } + fConnSelection.setItems(suitableConnections.toArray(new String[0])); + fConnSelection.select(0); + + applyDialogFont(composite); + return composite; + } + + @Override + protected void buttonPressed(int buttonId) { + if (buttonId == IDialogConstants.OK_ID) { + String connTypeId = (String) fConnSelection.getData(fConnSelection.getText()); + IRemoteConnectionType connType = manager.getConnectionType(connTypeId); + IRemoteUIConnectionService fUIConnectionManager = connType.getService(IRemoteUIConnectionService.class); + IRemoteUIConnectionWizard wizard = fUIConnectionManager.getConnectionWizard(this.getShell()); + + IRemoteConnectionWorkingCopy wc = wizard.open(); + if (wc != null) { + try { + wc.save(); + } catch (RemoteConnectionException e) { + logError(e); + } + } + } + super.buttonPressed(buttonId); + } + } + + NewRemoteConnectionDialog dlg = new NewRemoteConnectionDialog(shell, + Messages.RemoteCMainTab_New_title); + dlg.setBlockOnOpen(true); + dlg.open(); + } + + /** + * Get a property associated with the connection. + * + * @param connection - the connection + * @param property - the property's name + * @return the property's value or empty string if it is not set. + */ + public static String getConnectionProperty(IRemoteConnection connection, String property) { + String key = IRemoteConnectionHostConstants.PI_REMOTE_CDT + "." //$NON-NLS-1$ + + property; + return connection.getAttribute(key); + } + + /** + * Associate a property with the connection. + * + * @param connection - the connection + * @param property - the property's name + * @param value the property's value + */ + public static void setConnectionProperty(IRemoteConnection connection, String property, String value) { + String key = IRemoteConnectionHostConstants.PI_REMOTE_CDT + "." //$NON-NLS-1$ + + property; + IRemoteConnectionWorkingCopy wc = connection.getWorkingCopy(); + wc.setAttribute(key, value); + try { + wc.save(); + } catch (RemoteConnectionException e) { + logError(e); + } + } + + private static void logError(Exception e) { + Plugin plugin = Activator.getDefault(); + ILog logger = plugin.getLog(); + logger.log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, + e.getMessage(), e)); + } +} diff --git a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/launching/RemoteGdbLaunchDelegate.java b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/launching/RemoteGdbLaunchDelegate.java index 8721e16403f..22e2df13a67 100644 --- a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/launching/RemoteGdbLaunchDelegate.java +++ b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/launching/RemoteGdbLaunchDelegate.java @@ -27,41 +27,28 @@ import org.eclipse.cdt.dsf.service.DsfSession; import org.eclipse.cdt.internal.launch.remote.Activator; import org.eclipse.cdt.internal.launch.remote.Messages; import org.eclipse.cdt.launch.remote.IRemoteConnectionConfigurationConstants; -import org.eclipse.cdt.launch.remote.RSEHelper; +import org.eclipse.cdt.launch.remote.RemoteHelper; 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.Status; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.variables.VariablesPlugin; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; +import org.eclipse.debug.core.IStreamListener; import org.eclipse.debug.core.model.IProcess; -import org.eclipse.rse.core.RSECorePlugin; -import org.eclipse.rse.services.shells.HostShellProcessAdapter; -import org.eclipse.rse.services.shells.IHostOutput; -import org.eclipse.rse.services.shells.IHostShell; -import org.eclipse.rse.services.shells.IHostShellChangeEvent; -import org.eclipse.rse.services.shells.IHostShellOutputListener; +import org.eclipse.debug.core.model.IStreamMonitor; +import org.eclipse.debug.core.model.IStreamsProxy; +import org.eclipse.remote.core.IRemoteProcess; +import org.eclipse.remote.core.RemoteProcessAdapter; public class RemoteGdbLaunchDelegate extends GdbLaunchDelegate { @Override public void launch(ILaunchConfiguration config, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException { - // Need to initialize RSE - if (!RSECorePlugin.isInitComplete(RSECorePlugin.INIT_MODEL)) { - monitor.subTask(Messages.RemoteRunLaunchDelegate_10); - try { - RSECorePlugin.waitForInitCompletion(RSECorePlugin.INIT_MODEL); - } catch (InterruptedException e) { - throw new CoreException(new Status(IStatus.ERROR, - getPluginID(), IStatus.OK, e.getLocalizedMessage(), e)); - } - } IPath exePath = checkBinaryDetails(config); Process remoteShellProcess = null; @@ -71,7 +58,7 @@ public class RemoteGdbLaunchDelegate extends GdbLaunchDelegate { IRemoteConnectionConfigurationConstants.ATTR_REMOTE_PATH, ""); //$NON-NLS-1$ monitor.setTaskName(Messages.RemoteRunLaunchDelegate_2); - RSEHelper.remoteFileDownload(config, launch, exePath.toString(), + RemoteHelper.remoteFileDownload(config, launch, exePath.toString(), remoteExePath, new SubProgressMonitor(monitor, 80)); // 2.Launch gdbserver on target String gdbserverPortNumber = config @@ -88,7 +75,7 @@ public class RemoteGdbLaunchDelegate extends GdbLaunchDelegate { IRemoteConnectionConfigurationConstants.ATTR_GDBSERVER_OPTIONS_DEFAULT); String commandArguments = gdbserverOptions + " " //$NON-NLS-1$ + ":" + gdbserverPortNumber + " " //$NON-NLS-1$ //$NON-NLS-2$ - + RSEHelper.spaceEscapify(remoteExePath); + + RemoteHelper.spaceEscapify(remoteExePath); String arguments = getProgramArguments(config); String prelaunchCmd = config .getAttribute( @@ -101,13 +88,13 @@ public class RemoteGdbLaunchDelegate extends GdbLaunchDelegate { // extending HostShellProcessAdapter here final GdbLaunch l = (GdbLaunch)launch; - IHostShell remoteShell = null; + IRemoteProcess remoteShell = null; try { - remoteShell = RSEHelper.execCmdInRemoteShell(config, prelaunchCmd, + remoteShell = RemoteHelper.execCmdInRemoteShell(config, prelaunchCmd, gdbserverCommand, commandArguments, new SubProgressMonitor(monitor, 5)); } catch (Exception e1) { - RSEHelper.abort(e1.getMessage(), e1, + RemoteHelper.abort(e1.getMessage(), e1, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); } @@ -121,23 +108,8 @@ public class RemoteGdbLaunchDelegate extends GdbLaunchDelegate { final Object lock = new Object(); if (remoteShell != null) { - remoteShell.addOutputListener(new IHostShellOutputListener() { - - public void shellOutputChanged(IHostShellChangeEvent event) { - for (IHostOutput line : event.getLines()) { - if (line.getString().contains("Listening on port")) { //$NON-NLS-1$ - synchronized (lock) { - gdbServerReady[0] = true; - lock.notifyAll(); - } - break; - } - } - } - }); - try { - remoteShellProcess = new HostShellProcessAdapter(remoteShell) { + remoteShellProcess = new RemoteProcessAdapter(remoteShell) { @Override public synchronized void destroy() { @@ -168,13 +140,28 @@ public class RemoteGdbLaunchDelegate extends GdbLaunchDelegate { if (remoteShellProcess != null) { remoteShellProcess.destroy(); } - RSEHelper.abort(Messages.RemoteRunLaunchDelegate_7, e, + RemoteHelper.abort(Messages.RemoteRunLaunchDelegate_7, e, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); } IProcess iProcess = DebugPlugin.newProcess(launch, remoteShellProcess, Messages.RemoteRunLaunchDelegate_RemoteShell); + // Listen process' output to determine gdbserver is up and running. + IStreamsProxy streams = iProcess.getStreamsProxy(); + IStreamMonitor monitorStream = streams.getOutputStreamMonitor(); + monitorStream.addListener(new IStreamListener() { + @Override + public void streamAppended(String text, IStreamMonitor monitor) { + if (text.contains("Listening on port")) { //$NON-NLS-1$ + synchronized (lock) { + gdbServerReady[0] = true; + lock.notifyAll(); + } + monitor.removeListener(this); + } + } + }); // Now wait until gdbserver is up and running on the remote host synchronized (lock) { while (gdbServerReady[0] == false) { @@ -196,7 +183,7 @@ public class RemoteGdbLaunchDelegate extends GdbLaunchDelegate { // Session disposed. } - RSEHelper.abort(Messages.RemoteGdbLaunchDelegate_gdbserverFailedToStartErrorMessage, null, + RemoteHelper.abort(Messages.RemoteGdbLaunchDelegate_gdbserverFailedToStartErrorMessage, null, ICDTLaunchConfigurationConstants.ERR_DEBUGGER_NOT_INSTALLED); } try { @@ -211,7 +198,7 @@ public class RemoteGdbLaunchDelegate extends GdbLaunchDelegate { wc.setAttribute(IGDBLaunchConfigurationConstants.ATTR_REMOTE_TCP, true); wc.setAttribute(IGDBLaunchConfigurationConstants.ATTR_HOST, - RSEHelper.getRemoteHostname(config)); + RemoteHelper.getRemoteHostname(config)); wc.setAttribute(IGDBLaunchConfigurationConstants.ATTR_PORT, gdbserverPortNumber); wc.doSave(); diff --git a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/launching/RemoteRunLaunchDelegate.java b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/launching/RemoteRunLaunchDelegate.java index 87f637f76e7..7809a87b751 100644 --- a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/launching/RemoteRunLaunchDelegate.java +++ b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/launching/RemoteRunLaunchDelegate.java @@ -30,7 +30,7 @@ import org.eclipse.cdt.internal.launch.remote.Activator; import org.eclipse.cdt.internal.launch.remote.Messages; import org.eclipse.cdt.launch.AbstractCLaunchDelegate; import org.eclipse.cdt.launch.remote.IRemoteConnectionConfigurationConstants; -import org.eclipse.cdt.launch.remote.RSEHelper; +import org.eclipse.cdt.launch.remote.RemoteHelper; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; @@ -43,7 +43,6 @@ import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchManager; import org.eclipse.osgi.util.NLS; -import org.eclipse.rse.core.RSECorePlugin; public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate { @@ -67,17 +66,6 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate { if (monitor == null) monitor = new NullProgressMonitor(); - if (!RSECorePlugin.isInitComplete(RSECorePlugin.INIT_MODEL)) { - monitor.subTask(Messages.RemoteRunLaunchDelegate_10); - try { - RSECorePlugin - .waitForInitCompletion(RSECorePlugin.INIT_MODEL); - } catch (InterruptedException e) { - throw new CoreException(new Status(IStatus.ERROR, - getPluginID(), IStatus.OK, e.getLocalizedMessage(), - e)); - } - } if (mode.equals(ILaunchManager.RUN_MODE)) { monitor.beginTask(Messages.RemoteRunLaunchDelegate_0, 100); @@ -85,11 +73,11 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate { try { // Download the binary to the remote before debugging. monitor.setTaskName(Messages.RemoteRunLaunchDelegate_2); - RSEHelper.remoteFileDownload(config, launch, exePath.toString(), + RemoteHelper.remoteFileDownload(config, launch, exePath.toString(), remoteExePath, new SubProgressMonitor(monitor, 80)); // Use a remote shell to launch the binary. monitor.setTaskName(Messages.RemoteRunLaunchDelegate_12); - remoteProcess = RSEHelper.remoteShellExec(config, prelaunchCmd, + remoteProcess = RemoteHelper.remoteShellExec(config, prelaunchCmd, remoteExePath, arguments, new SubProgressMonitor( monitor, 20)); DebugPlugin.newProcess(launch, remoteProcess, diff --git a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/tabs/RemoteCDSFMainTab.java b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/tabs/RemoteCDSFMainTab.java index 6e4f12e59e9..33db9e0cc16 100644 --- a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/tabs/RemoteCDSFMainTab.java +++ b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/tabs/RemoteCDSFMainTab.java @@ -31,7 +31,9 @@ import org.eclipse.cdt.internal.launch.remote.Activator; import org.eclipse.cdt.internal.launch.remote.Messages; import org.eclipse.cdt.launch.remote.IRemoteConnectionConfigurationConstants; import org.eclipse.cdt.launch.remote.IRemoteConnectionHostConstants; -import org.eclipse.cdt.launch.remote.RSEHelper; +import org.eclipse.cdt.launch.remote.RemoteHelper; +import org.eclipse.cdt.launch.remote.RemoteUIHelper; +import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; @@ -41,15 +43,9 @@ import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.preference.PreferenceDialog; -import org.eclipse.jface.window.Window; -import org.eclipse.rse.core.IRSESystemType; -import org.eclipse.rse.core.RSECorePlugin; -import org.eclipse.rse.core.model.IHost; -import org.eclipse.rse.core.model.IPropertySet; -import org.eclipse.rse.files.ui.dialogs.SystemRemoteFileDialog; -import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile; -import org.eclipse.rse.ui.actions.SystemNewConnectionAction; +import org.eclipse.remote.core.IRemoteConnection; +import org.eclipse.remote.core.IRemoteServicesManager; +import org.eclipse.remote.ui.dialogs.RemoteResourceBrowser; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; @@ -65,7 +61,6 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.dialogs.PreferencesUtil; public class RemoteCDSFMainTab extends CMainTab { @@ -79,9 +74,6 @@ public class RemoteCDSFMainTab extends CMainTab { /* Defaults */ private static final String REMOTE_PATH_DEFAULT = EMPTY_STRING; private static final boolean SKIP_DOWNLOAD_TO_REMOTE_DEFAULT = false; - - /* SystemConnectionPropertyPage id*/ - private static final String SYSTEM_PAGE_ID = "org.eclipse.rse.SystemPropertyPage"; //$NON-NLS-1$ protected Button newRemoteConnectionButton; protected Button editRemoteConnectionButton; @@ -94,7 +86,6 @@ public class RemoteCDSFMainTab extends CMainTab { protected Button skipDownloadButton; protected Button useLocalPathButton; - SystemNewConnectionAction action = null; private Text preRunText; private Label preRunLabel; @@ -109,7 +100,7 @@ public class RemoteCDSFMainTab extends CMainTab { // TODO Auto-generated method stub super.createControl(parent); Composite comp = (Composite) getControl(); - /* The RSE Connection dropdown with New button. */ + /* The Connection dropdown with New button. */ createVerticalSpacer(comp, 1); createRemoteConnectionGroup(comp, 4); /* The remote binary location and skip download option */ @@ -315,78 +306,63 @@ public class RemoteCDSFMainTab extends CMainTab { } protected void handleNewRemoteConnectionSelected() { - if (action == null) { - action = new SystemNewConnectionAction(getControl().getShell(), - false, false, null); - } - - try { - action.run(); - } catch (Exception e) { - // Ignore - } + RemoteUIHelper.newConnectionDialog(getControl().getShell()); } /** * Opens the <code>SystemConnectionPropertyPage</code> page for the selected connection. */ protected void handleEditRemoteConnectionSelected() { - IHost currentConnectionSelected = getCurrentConnection(); - PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn(getControl().getShell(), currentConnectionSelected, SYSTEM_PAGE_ID, null, null); - if (dialog != null) { - dialog.open(); - } + RemoteUIHelper.editConnectionDialog(getCurrentConnection(), + getControl().getShell()); } - protected IHost getCurrentConnection() { + protected IRemoteConnection getCurrentConnection() { int currentSelection = connectionCombo.getSelectionIndex(); String remoteConnection = currentSelection >= 0 ? connectionCombo .getItem(currentSelection) : null; - return RSEHelper.getRemoteConnectionByName(remoteConnection); + return RemoteHelper.getRemoteConnectionByName(remoteConnection); } protected void handleRemoteBrowseSelected() { - IHost currentConnectionSelected = getCurrentConnection(); - SystemRemoteFileDialog dlg = new SystemRemoteFileDialog(getControl() - .getShell(), - Messages.RemoteCMainTab_Remote_Path_Browse_Button_Title, - currentConnectionSelected); - dlg.setBlockOnOpen(true); - if (dlg.open() == Window.OK) { - Object retObj = dlg.getSelectedObject(); - if (retObj instanceof IRemoteFile) { - IRemoteFile selectedFile = (IRemoteFile) retObj; - String absPath = selectedFile.getAbsolutePath(); - if (selectedFile.isDirectory()) { - // The user selected a destination folder to upload the binary - // Append the Program name as the default file destination - IPath appPath = new Path(fProgText.getText().trim()); - String lastSegment = appPath.lastSegment(); - if (lastSegment != null && lastSegment.trim().length() > 0) { - IPath remotePath = new Path(selectedFile.getAbsolutePath()).append(lastSegment.trim()); - absPath = remotePath.toPortableString(); - } + IRemoteConnection currentConnectionSelected = getCurrentConnection(); + RemoteResourceBrowser b = new RemoteResourceBrowser(getControl().getShell(), + SWT.NONE); + b.setConnection(currentConnectionSelected); + b.setTitle(Messages.RemoteCMainTab_Remote_Path_Browse_Button_Title); + b.open(); + IFileStore selectedFile = b.getResource(); + if (selectedFile != null) { + String absPath = selectedFile.toURI().getPath(); + if (selectedFile.fetchInfo().isDirectory()) { + // The user selected a destination folder to upload the binary + // Append the Program name as the default file destination + IPath appPath = new Path(fProgText.getText().trim()); + String lastSegment = appPath.lastSegment(); + if (lastSegment != null && lastSegment.trim().length() > 0) { + IPath remotePath = new Path(absPath).append(lastSegment.trim()); + absPath = remotePath.toPortableString(); } - remoteProgText.setText(absPath); } - + remoteProgText.setText(absPath); } } protected void handleRemoteConnectionPropertiesSelected() { class RemoteConnectionPropertyDialog extends Dialog { - private IHost fHost; + private IRemoteConnection fHost; boolean fbLocalHost; private Button fSkipDownloadBtn; private Text fWSRoot; private String fDialogTitle; public RemoteConnectionPropertyDialog(Shell parentShell, - String dialogTitle, IHost host) { + String dialogTitle, IRemoteConnection host) { super(parentShell); fDialogTitle = dialogTitle; fHost = host; - fbLocalHost = fHost.getSystemType().isLocal(); + IRemoteServicesManager remoteServicesManager = Activator.getService(IRemoteServicesManager.class); + fbLocalHost = (fHost.getConnectionType() == remoteServicesManager.getLocalConnectionType()); } @Override @@ -418,21 +394,17 @@ public class RemoteCDSFMainTab extends CMainTab { fSkipDownloadBtn .setText(Messages.RemoteCMainTab_Properties_Skip_default); if (!fbLocalHost) { - IPropertySet propertySet = fHost - .getPropertySet(IRemoteConnectionHostConstants.PI_REMOTE_CDT); - if (propertySet != null) { - String value = propertySet - .getPropertyValue(IRemoteConnectionHostConstants.REMOTE_WS_ROOT); - if (value != null) { - fWSRoot.setText(value); - } - fSkipDownloadBtn - .setSelection(Boolean - .valueOf( - propertySet - .getPropertyValue(IRemoteConnectionHostConstants.DEFAULT_SKIP_DOWNLOAD)) - .booleanValue()); + String value = RemoteUIHelper.getConnectionProperty(fHost, + IRemoteConnectionHostConstants.REMOTE_WS_ROOT); + if(!value.isEmpty()) { + fWSRoot.setText(value); } + fSkipDownloadBtn + .setSelection(Boolean + .valueOf( + RemoteUIHelper.getConnectionProperty(fHost, + IRemoteConnectionHostConstants.DEFAULT_SKIP_DOWNLOAD)) + .booleanValue()); } else { fSkipDownloadBtn.setEnabled(false); fWSRoot.setEnabled(false); @@ -444,26 +416,18 @@ public class RemoteCDSFMainTab extends CMainTab { @Override protected void buttonPressed(int buttonId) { if (!fbLocalHost && (buttonId == IDialogConstants.OK_ID)) { - IPropertySet propertySet = fHost - .getPropertySet(IRemoteConnectionHostConstants.PI_REMOTE_CDT); - if (propertySet == null) { - propertySet = fHost - .createPropertySet(IRemoteConnectionHostConstants.PI_REMOTE_CDT); - } - propertySet.addProperty( + RemoteUIHelper.setConnectionProperty(fHost, IRemoteConnectionHostConstants.REMOTE_WS_ROOT, fWSRoot.getText()); - propertySet - .addProperty( - IRemoteConnectionHostConstants.DEFAULT_SKIP_DOWNLOAD, - Boolean.toString(fSkipDownloadBtn - .getSelection())); - fHost.commit(); + RemoteUIHelper.setConnectionProperty(fHost, + IRemoteConnectionHostConstants.DEFAULT_SKIP_DOWNLOAD, + Boolean.toString(fSkipDownloadBtn + .getSelection())); } super.buttonPressed(buttonId); } } - IHost currentConnectionSelected = getCurrentConnection(); + IRemoteConnection currentConnectionSelected = getCurrentConnection(); RemoteConnectionPropertyDialog dlg = new RemoteConnectionPropertyDialog( getControl().getShell(), Messages.RemoteCMainTab_Properties_title, @@ -473,20 +437,10 @@ public class RemoteCDSFMainTab extends CMainTab { } protected void updateConnectionPulldown() { - if (!RSECorePlugin.isInitComplete(RSECorePlugin.INIT_MODEL)) - try { - RSECorePlugin.waitForInitCompletion(RSECorePlugin.INIT_MODEL); - } catch (InterruptedException e) { - return; - } - // already initialized connectionCombo.removeAll(); - IHost[] connections = RSEHelper.getSuitableConnections(); + IRemoteConnection[] connections = RemoteHelper.getSuitableConnections(); for (int i = 0; i < connections.length; i++) { - IRSESystemType sysType = connections[i].getSystemType(); - if (sysType != null && sysType.isEnabled()) { - connectionCombo.add(connections[i].getAliasName()); - } + connectionCombo.add(connections[i].getName()); } if (connections.length > 0) { @@ -505,12 +459,10 @@ public class RemoteCDSFMainTab extends CMainTab { return; } boolean bEnable = false; - IHost currentConnectionSelected = getCurrentConnection(); - if (currentConnectionSelected != null) { - IRSESystemType sysType = currentConnectionSelected.getSystemType(); - if (sysType != null && sysType.isEnabled() && !sysType.isLocal()) { - bEnable = true; - } + IRemoteConnection currentConnectionSelected = getCurrentConnection(); + if (currentConnectionSelected != null && + currentConnectionSelected.getConnectionType().canEdit()) { + bEnable = true; } remoteConnectionPropertiesButton.setEnabled(bEnable); editRemoteConnectionButton.setEnabled(bEnable); @@ -604,14 +556,14 @@ public class RemoteCDSFMainTab extends CMainTab { } if ((skipDownloadButton != null) && !skipDownloadButton.isDisposed()) { skipDownloadButton.setSelection(getDefaultSkipDownload()); - if (RSEHelper.getFileSubsystem(getCurrentConnection()) == null) { + if (RemoteHelper.getFileSubsystem(getCurrentConnection()) == null) { skipDownloadButton.setEnabled(false); } else { skipDownloadButton.setEnabled(true); } } if ((remoteBrowseButton != null) && !remoteBrowseButton.isDisposed()) { - if (RSEHelper.getFileSubsystem(getCurrentConnection()) == null) { + if (RemoteHelper.getFileSubsystem(getCurrentConnection()) == null) { remoteBrowseButton.setEnabled(false); } else { remoteBrowseButton.setEnabled(true); @@ -633,35 +585,27 @@ public class RemoteCDSFMainTab extends CMainTab { } private String getRemoteWSRoot() { - IHost host = getCurrentConnection(); - if (host != null) { - IPropertySet propertySet = host - .getPropertySet(IRemoteConnectionHostConstants.PI_REMOTE_CDT); - if (propertySet != null) { - String value = propertySet - .getPropertyValue(IRemoteConnectionHostConstants.REMOTE_WS_ROOT); - if (value != null) { - return value; - } + IRemoteConnection host = getCurrentConnection(); + if(host != null) { + String value = RemoteUIHelper.getConnectionProperty(host, + IRemoteConnectionHostConstants.REMOTE_WS_ROOT); + if(!value.isEmpty()) { + return value; } } return ""; //$NON-NLS-1$ } private boolean getDefaultSkipDownload() { - IHost host = getCurrentConnection(); + IRemoteConnection host = getCurrentConnection(); if (host != null) { - if (RSEHelper.getFileSubsystem(host) == null) { + if(RemoteHelper.getFileSubsystem(host) == null){ return true; } - IPropertySet propertySet = host - .getPropertySet(IRemoteConnectionHostConstants.PI_REMOTE_CDT); - if (propertySet != null) { - return Boolean - .valueOf( - propertySet - .getPropertyValue(IRemoteConnectionHostConstants.DEFAULT_SKIP_DOWNLOAD)) - .booleanValue(); + String value = RemoteUIHelper.getConnectionProperty(host, + IRemoteConnectionHostConstants.DEFAULT_SKIP_DOWNLOAD); + if(!value.isEmpty()) { + return Boolean.valueOf(value).booleanValue(); } } return SKIP_DOWNLOAD_TO_REMOTE_DEFAULT; diff --git a/cross/org.eclipse.cdt.launch.remote/toc.xml b/cross/org.eclipse.cdt.launch.remote/toc.xml index 1b2611151af..775c22422f2 100644 --- a/cross/org.eclipse.cdt.launch.remote/toc.xml +++ b/cross/org.eclipse.cdt.launch.remote/toc.xml @@ -10,7 +10,7 @@ http://www.eclipse.org/legal/epl-v10.html Contributors: Martin Oberhuber (Wind River) - initial API and implementation --> -<toc link_to="../org.eclipse.rse.doc.user/toc.xml#rse_user_extensions" +<toc link_to="../org.eclipse.cdt.doc.user/toc.xml#cdt_Tasks_Anchor" label="Launching Remote C/C++ Applications"> <topic label="Launching Remote C/C++ Applications" href="remotecdt.html"/> -</toc>
\ No newline at end of file +</toc> |