[yocto] [PATCH] Initial commit for remote proof of concept
Ioana Grigoropol
ioanax.grigoropol at intel.com
Thu Feb 14 05:29:56 PST 2013
Signed-off-by: Ioana Grigoropol <ioanax.grigoropol at intel.com>
---
core/org.eclipse.cdt.core/META-INF/MANIFEST.MF | 1 +
.../cdt/internal/core/model/CModelManager.java | 17 +-
.../pdom/indexer/ProjectIndexerInputAdapter.java | 2 +-
core/org.eclipse.cdt.core/plugin.xml | 1 +
.../schema/RemoteProxyManager.exsd | 114 ++++++++++
.../src/org/eclipse/cdt/core/CommandLauncher.java | 31 ++-
.../core/remoteproxy/IRemoteCommandLauncher.java | 31 +++
.../core/remoteproxy/IRemoteFileProxy.java | 26 +++
.../core/remoteproxy/IRemoteProxyManager.java | 23 ++
.../internal/core/remoteproxy/LocalFileProxy.java | 54 +++++
.../internal/core/remoteproxy/LocalLauncher.java | 62 ++++++
.../core/remoteproxy/RemoteProxyManager.java | 112 ++++++++++
core/org.eclipse.cdt.rdt.proxy/.classpath | 7 +
core/org.eclipse.cdt.rdt.proxy/.project | 28 +++
.../.settings/org.eclipse.jdt.core.prefs | 8 +
.../org.eclipse.cdt.rdt.proxy/META-INF/MANIFEST.MF | 15 ++
core/org.eclipse.cdt.rdt.proxy/build.properties | 5 +
core/org.eclipse.cdt.rdt.proxy/plugin.xml | 19 ++
.../src/org/eclipse/cdt/rdt/proxy/Activator.java | 81 +++++++
.../org/eclipse/cdt/rdt/proxy/RDTProxyManager.java | 44 ++++
.../org/eclipse/cdt/rdt/proxy/Resources.properties | 11 +
.../rdt/internal/rdt/proxy/RDTCommandLauncher.java | 227 +++++++++++++++++++
.../rdt/internal/rdt/proxy/RDTFileProxy.java | 51 +++++
.../internal/rdt/proxy/RemoteProcessClosure.java | 234 ++++++++++++++++++++
.../org/eclipse/cdt/debug/core/CDebugUtils.java | 109 +++++++++
launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF | 3 +-
.../cdt/launch/AbstractCLaunchDelegate.java | 121 +++++++++-
.../launch/internal/LocalCDILaunchDelegate.java | 43 +++-
28 files changed, 1465 insertions(+), 15 deletions(-)
create mode 100644 core/org.eclipse.cdt.core/schema/RemoteProxyManager.exsd
create mode 100644 core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/IRemoteCommandLauncher.java
create mode 100644 core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/IRemoteFileProxy.java
create mode 100644 core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/IRemoteProxyManager.java
create mode 100644 core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/LocalFileProxy.java
create mode 100644 core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/LocalLauncher.java
create mode 100644 core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/RemoteProxyManager.java
create mode 100644 core/org.eclipse.cdt.rdt.proxy/.classpath
create mode 100644 core/org.eclipse.cdt.rdt.proxy/.project
create mode 100644 core/org.eclipse.cdt.rdt.proxy/.settings/org.eclipse.jdt.core.prefs
create mode 100644 core/org.eclipse.cdt.rdt.proxy/META-INF/MANIFEST.MF
create mode 100644 core/org.eclipse.cdt.rdt.proxy/build.properties
create mode 100644 core/org.eclipse.cdt.rdt.proxy/plugin.xml
create mode 100644 core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/cdt/rdt/proxy/Activator.java
create mode 100644 core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/cdt/rdt/proxy/RDTProxyManager.java
create mode 100644 core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/cdt/rdt/proxy/Resources.properties
create mode 100644 core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/rdt/internal/rdt/proxy/RDTCommandLauncher.java
create mode 100644 core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/rdt/internal/rdt/proxy/RDTFileProxy.java
create mode 100644 core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/rdt/internal/rdt/proxy/RemoteProcessClosure.java
diff --git a/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF b/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF
index 9130967..adcc8a1 100644
--- a/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF
+++ b/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF
@@ -84,6 +84,7 @@ Export-Package: org.eclipse.cdt.core,
org.eclipse.cdt.internal.core.pdom.dom.cpp;x-internal:=true,
org.eclipse.cdt.internal.core.pdom.export;x-internal:=true,
org.eclipse.cdt.internal.core.pdom.indexer;x-friends:="org.eclipse.cdt.ui",
+ org.eclipse.cdt.internal.core.remoteproxy;x-friends:="org.eclipse.cdt.managedbuilder.core,org.eclipse.cdt.rdt.proxy",
org.eclipse.cdt.internal.core.resources;x-friends:="org.eclipse.cdt.ui,org.eclipse.cdt.make.core,org.eclipse.cdt.codan.ui.cxx",
org.eclipse.cdt.internal.core.settings.model;x-internal:=true,
org.eclipse.cdt.internal.core.util;x-internal:=true,
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java
index 16deb2d..2c47e7d 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java
@@ -61,6 +61,8 @@ import org.eclipse.cdt.core.settings.model.ICProjectDescriptionListener;
import org.eclipse.cdt.core.settings.model.ICSettingObject;
import org.eclipse.cdt.internal.core.CCoreInternals;
import org.eclipse.cdt.internal.core.LocalProjectScope;
+import org.eclipse.cdt.internal.core.remoteproxy.IRemoteFileProxy;
+import org.eclipse.cdt.internal.core.remoteproxy.RemoteProxyManager;
import org.eclipse.cdt.internal.core.resources.ResourceLookup;
import org.eclipse.cdt.internal.core.settings.model.CProjectDescription;
import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager;
@@ -170,9 +172,9 @@ public class CModelManager implements IResourceChangeListener, IContentTypeChang
*/
private HashMap<ICProject, SourceMapper> sourceMappers = new HashMap<ICProject, SourceMapper>();
- public static final IWorkingCopy[] NoWorkingCopy = {};
+ public static final IWorkingCopy[] NoWorkingCopy = new IWorkingCopy[0];
- static volatile CModelManager factory;
+ static volatile CModelManager factory = null;
private CModelManager() {
}
@@ -731,8 +733,17 @@ public class CModelManager implements IResourceChangeListener, IContentTypeChang
}
}
- IPath location = file.getLocation();
+// IPath location = file.getLocation();
+ IRemoteFileProxy proxy;
+ try {
+ proxy = RemoteProxyManager.getInstance().getFileProxy(file.getProject());
+ } catch (CoreException e1) {
+ return null;
+ }
+ URI fileLocationURI = file.getLocationURI();
+ IPath location = new Path(proxy.toPath(fileLocationURI));
+
for (BinaryParserConfig parser2 : parsers) {
try {
IBinaryParser parser = parser2.getBinaryParser();
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ProjectIndexerInputAdapter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ProjectIndexerInputAdapter.java
index e24dce8..9499771 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ProjectIndexerInputAdapter.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ProjectIndexerInputAdapter.java
@@ -318,7 +318,7 @@ public class ProjectIndexerInputAdapter extends IndexerInputAdapter {
@Override
public FileContent getCodeReader(Object tuo) {
ITranslationUnit tu= (ITranslationUnit) tuo;
- if (tu.getLocation() == null)
+ if (tu.getLocationURI() == null)
return null;
final FileContent reader= FileContent.create(tu);
diff --git a/core/org.eclipse.cdt.core/plugin.xml b/core/org.eclipse.cdt.core/plugin.xml
index bb1125c..6515a15 100644
--- a/core/org.eclipse.cdt.core/plugin.xml
+++ b/core/org.eclipse.cdt.core/plugin.xml
@@ -673,6 +673,7 @@
<extension-point id="RefreshExclusionFactory" name="%refreshExclusionFactory.name" schema="schema/RefreshExclusionFactory.exsd"/>
<extension-point id="LanguageSettingsProvider" name="%LanguageSettingsProvider.name" schema="schema/LanguageSettingsProvider.exsd"/>
<extension-point id="UNCPathConverter" name="%uncPathConverter.name" schema="schema/UNCPathConverter.exsd"/>
+ <extension-point id="RemoteProxyManager" name="RemoteProxyManager" schema="schema/RemoteProxyManager.exsd"/>
<extension
point="org.eclipse.cdt.core.templateProcessTypes">
diff --git a/core/org.eclipse.cdt.core/schema/RemoteProxyManager.exsd b/core/org.eclipse.cdt.core/schema/RemoteProxyManager.exsd
new file mode 100644
index 0000000..31a1868
--- /dev/null
+++ b/core/org.eclipse.cdt.core/schema/RemoteProxyManager.exsd
@@ -0,0 +1,114 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.cdt.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.cdt.core" id="RemoteProxyManager" name="Remote Proxy Manager"/>
+ </appinfo>
+ <documentation>
+ Use this to identify a Remote Proxy Manager object of type IRemoteProxyManager.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="manager"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="manager">
+ <annotation>
+ <documentation>
+ A class which implements IRemoteProxyManager.
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+ Identifier of class which implements IRemoteProxyManager interface.
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.linuxtools.profiling.launch.IRemoteProxyManager"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="scheme" type="string" use="required">
+ <annotation>
+ <documentation>
+ Connection type that this RemoteProxyManager supports.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="since"/>
+ </appinfo>
+ <documentation>
+ 1.1.0
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="examples"/>
+ </appinfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="apiinfo"/>
+ </appinfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="implementation"/>
+ </appinfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncher.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncher.java
index a5e0555..5a8b946 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncher.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncher.java
@@ -19,6 +19,7 @@ import org.eclipse.cdt.internal.core.Cygwin;
import org.eclipse.cdt.internal.core.Messages;
import org.eclipse.cdt.internal.core.ProcessClosure;
import org.eclipse.cdt.utils.PathUtil;
+import org.eclipse.cdt.utils.pty.PTY;
import org.eclipse.cdt.utils.spawner.EnvironmentReader;
import org.eclipse.cdt.utils.spawner.ProcessFactory;
import org.eclipse.core.resources.IProject;
@@ -45,6 +46,8 @@ public class CommandLauncher implements ICommandLauncher {
private Properties fEnvironment = null;
protected String fErrorMessage = ""; //$NON-NLS-1$
+
+ private String lineSeparator;
private IProject fProject;
/**
@@ -60,6 +63,7 @@ public class CommandLauncher implements ICommandLauncher {
public CommandLauncher() {
fProcess = null;
fShowCommand = false;
+ lineSeparator = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
}
/* (non-Javadoc)
@@ -157,7 +161,32 @@ public class CommandLauncher implements ICommandLauncher {
return null;
}
-
+ /**
+ * @since 8.0.1
+ * @see org.eclipse.cdt.core.ICommandLauncher#execute(IPath, String[], String[], IPath, IProgressMonitor)
+ */
+ public Process execute(IPath commandPath, String[] args, String[] env, IPath changeToDirectory,
+ boolean usePTY, IProgressMonitor monitor) throws CoreException {
+ try {
+ // add platform specific arguments (shell invocation)
+ fCommandArgs = constructCommandArray(commandPath.toOSString(), args);
+
+ File file = null;
+
+ if(changeToDirectory != null)
+ file = changeToDirectory.toFile();
+
+ if (usePTY && PTY.isSupported())
+ fProcess = ProcessFactory.getFactory().exec(fCommandArgs, env, file, new PTY());
+ else
+ fProcess = ProcessFactory.getFactory().exec(fCommandArgs, env, file);
+ fErrorMessage = ""; //$NON-NLS-1$
+ } catch (IOException e) {
+ setErrorMessage(e.getMessage());
+ fProcess = null;
+ }
+ return fProcess;
+ }
/**
* @since 5.1
* @see org.eclipse.cdt.core.ICommandLauncher#execute(IPath, String[], String[], IPath, IProgressMonitor)
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/IRemoteCommandLauncher.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/IRemoteCommandLauncher.java
new file mode 100644
index 0000000..09a7d9e
--- /dev/null
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/IRemoteCommandLauncher.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat Inc..
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat Incorporated - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.internal.core.remoteproxy;
+
+import java.io.OutputStream;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+public interface IRemoteCommandLauncher {
+
+ public final static int OK = 0;
+ public final static int COMMAND_CANCELED = 1;
+ public final static int ILLEGAL_COMMAND = -1;
+
+ public Process execute(String commandPath, String[] args, String[] env, String changeToDirectory, IProgressMonitor monitor) throws CoreException;
+ public Process execute(String commandPath, String[] args, String[] env, String changeToDirectory, boolean usePTY, IProgressMonitor monitor) throws CoreException;
+ public int waitAndRead(OutputStream output, OutputStream err, IProgressMonitor monitor);
+ public String getErrorMessage();
+ public String getCommandLine();
+
+}
\ No newline at end of file
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/IRemoteFileProxy.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/IRemoteFileProxy.java
new file mode 100644
index 0000000..cac25b3
--- /dev/null
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/IRemoteFileProxy.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat Inc..
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat Incorporated - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.internal.core.remoteproxy;
+
+import java.net.URI;
+
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.IPath;
+
+public interface IRemoteFileProxy {
+
+ public URI toURI(IPath path);
+ public URI toURI(String path);
+ public String toPath(URI uri);
+ public String getDirectorySeparator();
+ public IFileStore getResource(String path);
+
+}
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/IRemoteProxyManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/IRemoteProxyManager.java
new file mode 100644
index 0000000..cc8c0cd
--- /dev/null
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/IRemoteProxyManager.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat Inc..
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat Incorporated - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.internal.core.remoteproxy;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+
+public interface IRemoteProxyManager {
+ String EXTENSION_POINT_ID = "RemoteProxyManager"; //$NON-NLS-1$
+ String MANAGER_NAME = "manager"; //$NON-NLS-1$
+ String SCHEME_ID = "scheme"; //$NON-NLS-1$
+ public IRemoteFileProxy getFileProxy(IProject project) throws CoreException;
+ public IRemoteCommandLauncher getLauncher(IProject project) throws CoreException;
+ public String getOS(IProject project) throws CoreException;
+}
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/LocalFileProxy.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/LocalFileProxy.java
new file mode 100644
index 0000000..e39a636
--- /dev/null
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/LocalFileProxy.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat Inc..
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat Incorporated - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.internal.core.remoteproxy;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+
+public class LocalFileProxy implements IRemoteFileProxy {
+
+ @Override
+ public URI toURI(IPath path) {
+ return path.toFile().toURI();
+ }
+
+ @Override
+ public URI toURI(String path) {
+ try {
+ return new URI(path);
+ } catch (URISyntaxException e) {
+ return null;
+ }
+ }
+
+ @Override
+ public String toPath(URI uri) {
+ return uri.getPath();
+ }
+
+ @Override
+ public String getDirectorySeparator() {
+ // TODO Auto-generated method stub
+ return System.getProperty("file.separator"); //$NON-NLS-1$
+ }
+
+ @Override
+ public IFileStore getResource(String path) {
+ // TODO Auto-generated method stub
+ return EFS.getLocalFileSystem().getStore(new Path(path));
+ }
+
+}
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/LocalLauncher.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/LocalLauncher.java
new file mode 100644
index 0000000..aa83cb8
--- /dev/null
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/LocalLauncher.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat Inc..
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat Incorporated - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.internal.core.remoteproxy;
+
+import java.io.OutputStream;
+
+import org.eclipse.cdt.core.CommandLauncher;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+
+public class LocalLauncher implements IRemoteCommandLauncher {
+
+ private CommandLauncher launcher;
+
+ public LocalLauncher() {
+ launcher = new CommandLauncher();
+ }
+
+ @Override
+ public Process execute(String commandPath, String[] args, String[] env,
+ String changeToDirectory, IProgressMonitor monitor)
+ throws CoreException {
+ launcher.showCommand(true);
+ Process p = launcher.execute(new Path(commandPath), args, env, new Path(changeToDirectory), monitor);
+ return p;
+ }
+
+ @Override
+ public Process execute(String commandPath, String[] args, String[] env,
+ String changeToDirectory, boolean usePTY, IProgressMonitor monitor)
+ throws CoreException {
+ launcher.showCommand(true);
+ Process p = launcher.execute(new Path(commandPath), args, env, new Path(changeToDirectory), usePTY, monitor);
+ return p;
+ }
+
+ @Override
+ public int waitAndRead(OutputStream output, OutputStream err,
+ IProgressMonitor monitor) {
+ return launcher.waitAndRead(output, err, monitor);
+ }
+
+ @Override
+ public String getErrorMessage() {
+ return launcher.getErrorMessage();
+ }
+
+ @Override
+ public String getCommandLine() {
+ return launcher.getCommandLine();
+ }
+
+}
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/RemoteProxyManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/RemoteProxyManager.java
new file mode 100644
index 0000000..bcc20cd
--- /dev/null
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/remoteproxy/RemoteProxyManager.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat Inc..
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat Incorporated - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.internal.core.remoteproxy;
+
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.Platform;
+
+public class RemoteProxyManager implements IRemoteProxyManager {
+
+ private static final String EXT_ATTR_CLASS = "class"; //$NON-NLS-1$
+ private static final String LocalHost = "LOCALHOST"; //$NON-NLS-1$
+
+ private static RemoteProxyManager manager;
+ private LocalFileProxy lfp;
+ private Map<String, IRemoteProxyManager> remoteManagers = new HashMap<String, IRemoteProxyManager>();
+
+ private RemoteProxyManager() {
+ // do nothing
+ }
+
+ public static RemoteProxyManager getInstance() {
+ if (manager == null)
+ manager = new RemoteProxyManager();
+ return manager;
+ }
+
+ LocalFileProxy getLocalFileProxy() {
+ if (lfp == null)
+ lfp = new LocalFileProxy();
+ return lfp;
+ }
+
+ private IRemoteProxyManager getRemoteManager(String schemeId) throws CoreException {
+ IRemoteProxyManager remoteManager = remoteManagers.get(schemeId);
+ if (remoteManager == null) {
+ IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(CCorePlugin.PLUGIN_ID, IRemoteProxyManager.EXTENSION_POINT_ID);
+ IConfigurationElement[] infos = extensionPoint.getConfigurationElements();
+ for(int i = 0; i < infos.length; i++) {
+ IConfigurationElement configurationElement = infos[i];
+ if (configurationElement.getName().equals(IRemoteProxyManager.MANAGER_NAME)) {
+ if (configurationElement.getAttribute(IRemoteProxyManager.SCHEME_ID).equals(schemeId)) {
+ Object obj = configurationElement.createExecutableExtension(EXT_ATTR_CLASS);
+ if (obj instanceof IRemoteProxyManager) {
+ remoteManager = (IRemoteProxyManager)obj;
+ remoteManagers.put(schemeId, remoteManager);
+ break;
+ }
+ }
+ }
+ }
+ }
+ return remoteManager;
+ }
+
+ @Override
+ public IRemoteFileProxy getFileProxy(IProject project) throws CoreException {
+ URI projectURI = project.getLocationURI();
+ String scheme = projectURI.getScheme();
+ if (scheme != null) {
+ IRemoteProxyManager manager = getRemoteManager(scheme);
+ if (manager != null)
+ return manager.getFileProxy(project);
+ }
+ if (LocalHost.equals(projectURI.getHost()))
+ return getLocalFileProxy();
+ return null;
+ }
+
+ @Override
+ public IRemoteCommandLauncher getLauncher(IProject project) throws CoreException {
+ URI projectURI = project.getLocationURI();
+ String scheme = projectURI.getScheme();
+ if (scheme != null) {
+ IRemoteProxyManager manager = getRemoteManager(scheme);
+ if (manager != null)
+ return manager.getLauncher(project);
+ }
+ if (LocalHost.equals(projectURI.getHost()))
+ return new LocalLauncher();
+ return null;
+ }
+
+ @Override
+ public String getOS(IProject project) throws CoreException {
+ URI projectURI = project.getLocationURI();
+ String scheme = projectURI.getScheme();
+ if (scheme != null && !LocalHost.equals(projectURI.getHost())) {
+ IRemoteProxyManager manager = getRemoteManager(scheme);
+ if (manager != null)
+ return manager.getOS(project);
+ }
+ if (LocalHost.equals(projectURI.getHost()))
+ return Platform.getOS();
+ return null;
+ }
+}
diff --git a/core/org.eclipse.cdt.rdt.proxy/.classpath b/core/org.eclipse.cdt.rdt.proxy/.classpath
new file mode 100644
index 0000000..ad32c83
--- /dev/null
+++ b/core/org.eclipse.cdt.rdt.proxy/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/core/org.eclipse.cdt.rdt.proxy/.project b/core/org.eclipse.cdt.rdt.proxy/.project
new file mode 100644
index 0000000..0da1ab2
--- /dev/null
+++ b/core/org.eclipse.cdt.rdt.proxy/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.cdt.rdt.proxy</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/core/org.eclipse.cdt.rdt.proxy/.settings/org.eclipse.jdt.core.prefs b/core/org.eclipse.cdt.rdt.proxy/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..b249467
--- /dev/null
+++ b/core/org.eclipse.cdt.rdt.proxy/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+#Mon Nov 21 18:56:58 EST 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/core/org.eclipse.cdt.rdt.proxy/META-INF/MANIFEST.MF b/core/org.eclipse.cdt.rdt.proxy/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1242325
--- /dev/null
+++ b/core/org.eclipse.cdt.rdt.proxy/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: CDT Remote Proxy
+Bundle-SymbolicName: org.eclipse.cdt.rdt.proxy;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.cdt.rdt.proxy.Activator
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.ptp.rdt.core;bundle-version="3.1.100",
+ org.eclipse.ptp.remote.core;bundle-version="5.0.0",
+ org.eclipse.cdt.core;bundle-version="5.4.0",
+ org.eclipse.core.resources;bundle-version="3.7.100",
+ org.eclipse.core.filesystem;bundle-version="1.3.100",
+ org.eclipse.ui;bundle-version="3.7.0"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/core/org.eclipse.cdt.rdt.proxy/build.properties b/core/org.eclipse.cdt.rdt.proxy/build.properties
new file mode 100644
index 0000000..e9863e2
--- /dev/null
+++ b/core/org.eclipse.cdt.rdt.proxy/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml
diff --git a/core/org.eclipse.cdt.rdt.proxy/plugin.xml b/core/org.eclipse.cdt.rdt.proxy/plugin.xml
new file mode 100644
index 0000000..1c0d7d3
--- /dev/null
+++ b/core/org.eclipse.cdt.rdt.proxy/plugin.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.cdt.core.RemoteProxyManager">
+ <manager
+ class="org.eclipse.cdt.rdt.proxy.RDTProxyManager"
+ scheme="rse">
+ </manager>
+ </extension>
+ <extension
+ point="org.eclipse.cdt.core.RemoteProxyManager">
+ <manager
+ class="org.eclipse.cdt.rdt.proxy.RDTProxyManager"
+ scheme="remotetools">
+ </manager>
+ </extension>
+
+</plugin>
diff --git a/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/cdt/rdt/proxy/Activator.java b/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/cdt/rdt/proxy/Activator.java
new file mode 100644
index 0000000..fad503c
--- /dev/null
+++ b/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/cdt/rdt/proxy/Activator.java
@@ -0,0 +1,81 @@
+package org.eclipse.cdt.rdt.proxy;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.cdt.rdt.proxy"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ private ResourceBundle resourceBundle;
+
+
+ private static BundleContext context;
+
+ static BundleContext getContext() {
+ return context;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ try {
+ resourceBundle = ResourceBundle.getBundle(PLUGIN_ID + ".Resources"); //$NON-NLS-1$
+ } catch (MissingResourceException x) {
+ resourceBundle = null;
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the plugin's resource bundle,
+ */
+ public ResourceBundle getResourceBundle() {
+ return resourceBundle;
+ }
+
+ /**
+ * Returns the string from the plugin's resource bundle,
+ * or 'key' if not found.
+ *
+ * @param key the message key
+ * @return the resource bundle message
+ */
+ public static String getResourceString(String key) {
+ ResourceBundle bundle = plugin.getResourceBundle();
+ try {
+ return bundle.getString(key);
+ } catch (MissingResourceException e) {
+ return key;
+ }
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/cdt/rdt/proxy/RDTProxyManager.java b/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/cdt/rdt/proxy/RDTProxyManager.java
new file mode 100644
index 0000000..5986e60
--- /dev/null
+++ b/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/cdt/rdt/proxy/RDTProxyManager.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat Inc..
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat Incorporated - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.rdt.proxy;
+
+import org.eclipse.cdt.internal.core.remoteproxy.IRemoteCommandLauncher;
+import org.eclipse.cdt.internal.core.remoteproxy.IRemoteFileProxy;
+import org.eclipse.cdt.internal.core.remoteproxy.IRemoteProxyManager;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.rdt.internal.rdt.proxy.RDTCommandLauncher;
+import org.eclipse.rdt.internal.rdt.proxy.RDTFileProxy;
+
+
+public class RDTProxyManager implements IRemoteProxyManager {
+
+ @Override
+ public IRemoteFileProxy getFileProxy(IProject project) throws CoreException {
+ return new RDTFileProxy(project);
+ }
+
+ @Override
+ public IRemoteCommandLauncher getLauncher(IProject project)
+ throws CoreException {
+ return new RDTCommandLauncher(project);
+ }
+
+ @Override
+ public String getOS(IProject project) throws CoreException {
+// // TODO Auto-generated method stub
+// URI uri = project.getLocationURI();
+// IRemoteServices services = PTPRemoteCorePlugin.getDefault().getRemoteServices(uri);
+// IRemoteConnection connection = services.getConnectionManager().getConnection(uri);
+ return "linux"; //FIXME: why doesn't getProperty("os.name") work?
+ }
+
+}
diff --git a/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/cdt/rdt/proxy/Resources.properties b/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/cdt/rdt/proxy/Resources.properties
new file mode 100644
index 0000000..dd85f8f
--- /dev/null
+++ b/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/cdt/rdt/proxy/Resources.properties
@@ -0,0 +1,11 @@
+#*******************************************************************************
+# Copyright (c) 2011 Red Hat Inc..
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Red Hat Incorporated - initial API and implementation
+#*******************************************************************************/
+CommandLauncher.error.commandCanceled=Command canceled
\ No newline at end of file
diff --git a/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/rdt/internal/rdt/proxy/RDTCommandLauncher.java b/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/rdt/internal/rdt/proxy/RDTCommandLauncher.java
new file mode 100644
index 0000000..4a298c4
--- /dev/null
+++ b/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/rdt/internal/rdt/proxy/RDTCommandLauncher.java
@@ -0,0 +1,227 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2009, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ * Red Hat Inc. - modify to use with RDT
+ *******************************************************************************/
+package org.eclipse.rdt.internal.rdt.proxy;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.Map;
+
+import org.eclipse.cdt.internal.core.remoteproxy.IRemoteCommandLauncher;
+import org.eclipse.cdt.rdt.proxy.Activator;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.ptp.remote.core.IRemoteConnection;
+import org.eclipse.ptp.remote.core.IRemoteFileManager;
+import org.eclipse.ptp.remote.core.IRemoteProcess;
+import org.eclipse.ptp.remote.core.IRemoteProcessBuilder;
+import org.eclipse.ptp.remote.core.IRemoteServices;
+import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
+import org.eclipse.ptp.remote.core.RemoteProcessAdapter;
+
+/**
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public class RDTCommandLauncher implements IRemoteCommandLauncher {
+
+ public final static int COMMAND_CANCELED = IRemoteCommandLauncher.COMMAND_CANCELED;
+ public final static int ILLEGAL_COMMAND = IRemoteCommandLauncher.ILLEGAL_COMMAND;
+ public final static int OK = IRemoteCommandLauncher.OK;
+
+
+ protected IRemoteProcess fProcess;
+ protected boolean fShowCommand;
+ protected String[] fCommandArgs;
+
+ protected String fErrorMessage = ""; //$NON-NLS-1$
+
+ private String lineSeparator;
+ private IProject fProject;
+
+ /**
+ * The number of milliseconds to pause between polling.
+ */
+ protected static final long DELAY = 50L;
+
+ /**
+ * Creates a new launcher Fills in stderr and stdout output to the given
+ * streams. Streams can be set to <code>null</code>, if output not
+ * required
+ */
+ public RDTCommandLauncher(IProject project) {
+ fProcess = null;
+ fShowCommand = false;
+ fProject = project;
+ lineSeparator = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public void showCommand(boolean show) {
+ fShowCommand = show;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.ICommandLauncher#getErrorMessage()
+ */
+ public String getErrorMessage() {
+ return fErrorMessage;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.ICommandLauncher#setErrorMessage(java.lang.String)
+ */
+ public void setErrorMessage(String error) {
+ fErrorMessage = error;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.ICommandLauncher#getCommandArgs()
+ */
+ public String[] getCommandArgs() {
+ return fCommandArgs;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.ICommandLauncher#getCommandLine()
+ */
+ public String getCommandLine() {
+ return getCommandLine(getCommandArgs());
+ }
+
+ /**
+ * Constructs a command array that will be passed to the process
+ */
+ protected String[] constructCommandArray(String command, String[] commandArgs) {
+ String[] args = new String[1 + commandArgs.length];
+ args[0] = command;
+ System.arraycopy(commandArgs, 0, args, 1, commandArgs.length);
+ return args;
+ }
+
+
+ /**
+ * @see org.eclipse.cdt.core.IRemoteCommandLauncher#execute(IPath, String[], String[], IPath, IProgressMonitor)
+ */
+ public Process execute(IPath commandPath, String[] args, String[] env, IPath changeToDirectory, IProgressMonitor monitor) throws CoreException {
+ try {
+ // add platform specific arguments (shell invocation)
+ fCommandArgs = constructCommandArray(commandPath.toOSString(), args);
+ fShowCommand = true;
+ URI uri = fProject.getLocationURI();
+ IRemoteServices services = PTPRemoteCorePlugin.getDefault().getRemoteServices(uri);
+ IRemoteConnection connection = services.getConnectionManager().getConnection(uri);
+ IRemoteFileManager fm = services.getFileManager(connection);
+ IRemoteProcessBuilder builder = services.getProcessBuilder(connection, Arrays.asList(fCommandArgs));
+
+ if (changeToDirectory != null)
+ builder.directory(fm.getResource(changeToDirectory.toString()));
+
+ Map<String,String> envMap = builder.environment();
+
+ for (int i = 0; i < env.length; ++i) {
+ String s = env[i];
+ String[] tokens = s.split("=", 2);
+ envMap.put(tokens[0], tokens[1]);
+ }
+
+ fProcess = builder.start();
+ fErrorMessage = ""; //$NON-NLS-1$
+ } catch (IOException e) {
+ setErrorMessage(e.getMessage());
+ return null;
+ }
+ return new RemoteProcessAdapter(fProcess);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.IRemoteCommandLauncher#waitAndRead(java.io.OutputStream, java.io.OutputStream, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public int waitAndRead(OutputStream output, OutputStream err, IProgressMonitor monitor) {
+ if (fShowCommand) {
+ printCommandLine(output);
+ }
+
+ if (fProcess == null) {
+ return ILLEGAL_COMMAND;
+ }
+
+ RemoteProcessClosure closure = new RemoteProcessClosure(fProcess, output, err);
+ closure.runNonBlocking();
+ while (!monitor.isCanceled() && closure.isAlive()) {
+ try {
+ Thread.sleep(DELAY);
+ } catch (InterruptedException ie) {
+ // ignore
+ }
+ }
+
+ int state = OK;
+
+ // Operation canceled by the user, terminate abnormally.
+ if (monitor.isCanceled()) {
+ closure.terminate();
+ state = COMMAND_CANCELED;
+ setErrorMessage(Activator.getResourceString("CommandLauncher.error.commandCanceled")); //$NON-NLS-1$
+ }
+
+ try {
+ fProcess.waitFor();
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ return state;
+ }
+
+ protected void printCommandLine(OutputStream os) {
+ if (os != null) {
+ String cmd = getCommandLine(getCommandArgs());
+ try {
+ os.write(cmd.getBytes());
+ os.flush();
+ } catch (IOException e) {
+ // ignore;
+ }
+ }
+ }
+
+ protected String getCommandLine(String[] commandArgs) {
+ StringBuffer buf = new StringBuffer();
+ if (fCommandArgs != null) {
+ for (String commandArg : commandArgs) {
+ buf.append(commandArg);
+ buf.append(' ');
+ }
+ buf.append(lineSeparator);
+ }
+ return buf.toString();
+ }
+
+ @Override
+ public Process execute(String commandPath, String[] args, String[] env,
+ String changeToDirectory, IProgressMonitor monitor)
+ throws CoreException {
+ // TODO Auto-generated method stub
+ return execute(new Path(commandPath), args, env, new Path(changeToDirectory), monitor);
+ }
+
+ @Override
+ public Process execute(String commandPath, String[] args, String[] env,
+ String changeToDirectory, boolean usePTY, IProgressMonitor monitor)
+ throws CoreException {
+ // TODO Auto-generated method stub
+ return execute(new Path(commandPath), args, env, new Path(changeToDirectory), monitor);
+ }
+
+}
\ No newline at end of file
diff --git a/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/rdt/internal/rdt/proxy/RDTFileProxy.java b/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/rdt/internal/rdt/proxy/RDTFileProxy.java
new file mode 100644
index 0000000..997484b
--- /dev/null
+++ b/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/rdt/internal/rdt/proxy/RDTFileProxy.java
@@ -0,0 +1,51 @@
+package org.eclipse.rdt.internal.rdt.proxy;
+
+import java.net.URI;
+
+import org.eclipse.cdt.internal.core.remoteproxy.IRemoteFileProxy;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.ptp.remote.core.IRemoteConnection;
+import org.eclipse.ptp.remote.core.IRemoteFileManager;
+import org.eclipse.ptp.remote.core.IRemoteServices;
+import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
+
+public class RDTFileProxy implements IRemoteFileProxy {
+
+ private IRemoteFileManager manager;
+
+ public RDTFileProxy(IProject project) {
+ URI uri = project.getLocationURI();
+ IRemoteServices services = PTPRemoteCorePlugin.getDefault().getRemoteServices(uri);
+ services.initialize();
+ IRemoteConnection connection = services.getConnectionManager().getConnection(uri);
+ manager = services.getFileManager(connection);
+ }
+
+ @Override
+ public URI toURI(IPath path) {
+ return manager.toURI(path);
+ }
+
+ @Override
+ public URI toURI(String path) {
+ return manager.toURI(path);
+ }
+
+ @Override
+ public String toPath(URI uri) {
+ return manager.toPath(uri);
+ }
+
+ @Override
+ public String getDirectorySeparator() {
+ return manager.getDirectorySeparator();
+ }
+
+ @Override
+ public IFileStore getResource(String path) {
+ return manager.getResource(path);
+ }
+
+}
diff --git a/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/rdt/internal/rdt/proxy/RemoteProcessClosure.java b/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/rdt/internal/rdt/proxy/RemoteProcessClosure.java
new file mode 100644
index 0000000..cbc7677
--- /dev/null
+++ b/core/org.eclipse.cdt.rdt.proxy/src/org/eclipse/rdt/internal/rdt/proxy/RemoteProcessClosure.java
@@ -0,0 +1,234 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.rdt.internal.rdt.proxy;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+
+import org.eclipse.ptp.remote.core.IRemoteProcess;
+
+/**
+ * Bundled state of a launched process including the threads linking the process
+ * in/output to console documents.
+ */
+public class RemoteProcessClosure {
+
+ /**
+ * Thread which continuously reads from a input stream and pushes the read
+ * data to an output stream which is immediately flushed afterwards.
+ */
+ protected static class ReaderThread extends Thread {
+
+ private InputStream fInputStream;
+ private OutputStream fOutputStream;
+ private boolean fFinished = false;
+ private String lineSeparator;
+ /*
+ * outputStream can be null
+ */
+ public ReaderThread(ThreadGroup group, String name, InputStream in, OutputStream out) {
+ super(group, name);
+ fOutputStream = out;
+ fInputStream = in;
+ setDaemon(true);
+ lineSeparator = System.getProperty("line.separator"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void run() {
+ try {
+ try {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(fInputStream));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ line += lineSeparator;
+ fOutputStream.write(line.getBytes());
+ }
+ } catch (IOException x) {
+ // ignore
+ } finally {
+ try {
+ // writer.flush();
+ fOutputStream.flush();
+ } catch (IOException e) {
+ // ignore
+ }
+ try {
+ fInputStream.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ } finally {
+ complete();
+ }
+ }
+
+ public synchronized boolean finished() {
+ return fFinished;
+ }
+
+ public synchronized void waitFor() {
+ while (!fFinished) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+
+ public synchronized void complete() {
+ fFinished = true;
+ notify();
+ }
+
+ public void close() {
+ try {
+ fOutputStream.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
+
+ protected static int fCounter = 0;
+
+ protected IRemoteProcess fProcess;
+
+ protected OutputStream fOutput;
+ protected OutputStream fError;
+
+ protected ReaderThread fOutputReader;
+ protected ReaderThread fErrorReader;
+
+ /**
+ * Creates a process closure and connects the launched process with a
+ * console document.
+ *
+ * @param outputStream
+ * prcess stdout is written to this stream. Can be
+ * <code>null</code>, if not interested in reading the output
+ * @param errorStream
+ * prcess stderr is written to this stream. Can be
+ * <code>null</code>, if not interested in reading the output
+ */
+ public RemoteProcessClosure(IRemoteProcess process, OutputStream outputStream, OutputStream errorStream) {
+ fProcess = process;
+ fOutput = outputStream;
+ fError = errorStream;
+ }
+
+ /**
+ * Live links the launched process with the configured in/out streams using
+ * reader threads.
+ */
+ public void runNonBlocking() {
+ ThreadGroup group = new ThreadGroup("CBuilder" + fCounter++); //$NON-NLS-1$
+
+ InputStream stdin = fProcess.getInputStream();
+ InputStream stderr = fProcess.getErrorStream();
+
+ fOutputReader = new ReaderThread(group, "OutputReader", stdin, fOutput); //$NON-NLS-1$
+ fErrorReader = new ReaderThread(group, "ErrorReader", stderr, fError); //$NON-NLS-1$
+
+ fOutputReader.start();
+ fErrorReader.start();
+ }
+
+ public void runBlocking() {
+ runNonBlocking();
+
+ boolean finished = false;
+ while (!finished) {
+ try {
+ fProcess.waitFor();
+ } catch (InterruptedException e) {
+ //System.err.println("Closure exception " +e);
+ }
+ try {
+ fProcess.exitValue();
+ finished = true;
+ } catch (IllegalThreadStateException e) {
+ //System.err.println("Closure exception " +e);
+ }
+ }
+
+ // @@@FIXME: Windows 2000 is screwed; double-check using output threads
+ if (!fOutputReader.finished()) {
+ fOutputReader.waitFor();
+ }
+
+ if (!fErrorReader.finished()) {
+ fErrorReader.waitFor();
+ }
+
+ fOutputReader.close();
+ fErrorReader.close();
+ // it seems that thread termination and stream closing is working
+ // without
+ // any help
+ fProcess = null;
+ fOutputReader = null;
+ fErrorReader = null;
+ }
+
+ public boolean isAlive() {
+ if (fProcess != null) {
+ if (fOutputReader.isAlive() || fErrorReader.isAlive()) {
+ return true;
+ }
+ fProcess = null;
+ fOutputReader.close();
+ fErrorReader.close();
+ fOutputReader = null;
+ fErrorReader = null;
+ }
+ return false;
+ }
+
+ /**
+ * The same functionality as "isAlive()"
+ * but does not affect out streams,
+ * because they can be shared among processes
+ */
+ public boolean isRunning() {
+ if (fProcess != null) {
+ if (fOutputReader.isAlive() || fErrorReader.isAlive()) {
+ return true;
+ }
+ fProcess = null;
+ }
+ return false;
+ }
+ /**
+ * Forces the termination the launched process
+ */
+ public void terminate() {
+ if (fProcess != null) {
+ fProcess.destroy();
+ fProcess = null;
+ }
+ if (!fOutputReader.finished()) {
+ fOutputReader.waitFor();
+ }
+ if (!fErrorReader.finished()) {
+ fErrorReader.waitFor();
+ }
+ fOutputReader.close();
+ fErrorReader.close();
+ fOutputReader = null;
+ fErrorReader = null;
+ }
+}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugUtils.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugUtils.java
index f88761e..4d92884 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugUtils.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugUtils.java
@@ -15,6 +15,8 @@ package org.eclipse.cdt.debug.core;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.ArrayList;
@@ -41,6 +43,10 @@ import org.eclipse.cdt.debug.core.model.ICValue;
import org.eclipse.cdt.debug.core.model.ICWatchpoint;
import org.eclipse.cdt.debug.core.model.ICWatchpoint2;
import org.eclipse.cdt.debug.internal.core.model.CFloatingPointValue;
+import org.eclipse.cdt.internal.core.remoteproxy.IRemoteFileProxy;
+import org.eclipse.cdt.internal.core.remoteproxy.RemoteProxyManager;
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
@@ -663,6 +669,98 @@ public class CDebugUtils {
}
return programPath;
}
+ /**
+ * Returns a String path for the file referenced in the <i>C/C++ Application</i>
+ * setting of a CDT launch configuration. Typically, the file is obtained by
+ * combining the <i>C/C++ Application</i> setting with the <i>Project</i>
+ * setting. If unable to combine and resolve these settings to a valid file,
+ * a CoreException is thrown that provides the reason why. There are many
+ * such possible reasons (a problem with the <i>Project</i> setting, an
+ * empty <i>C/C++ Application</i> setting, the combined settings doesn't
+ * resolve to an existing file, etc).
+ *
+ * @param config
+ * the launch configuration
+ * @param ignoreProjectSetting
+ * if true, resolve the file using only the <i>C/C++
+ * Application</i> setting. Do not take the <i>Project</i>
+ * setting into account.
+ * @return the path as String
+ * @throws CoreException
+ * @since 8.0.1
+ */
+ public static String verifyProgramURI(ILaunchConfiguration config, boolean ignoreProjectSetting) throws CoreException {
+ ICProject cproject = null;
+ if (!ignoreProjectSetting) {
+ cproject = verifyCProject(config); // will throw exception if project setting not valid
+ }
+ IPath programPath = CDebugUtils.getProgramPath(config);
+ if (programPath == null || programPath.isEmpty()) {
+ throwCoreException(DebugCoreMessages.getString("CDebugUtils.Program_file_not_specified"), //$NON-NLS-1$
+ ICDTLaunchConfigurationConstants.ERR_UNSPECIFIED_PROGRAM);
+ }
+
+ String progPath = null;
+ if (programPath != null) { // this check is here only to avoid warning; compiler can't tell we'll throw an exception above
+ progPath = programPath.toString();
+ IFileStore progFile = null;
+ if (!programPath.isAbsolute() && (cproject != null)) {
+ // See if we can brute-force append the program path to the
+ // project location. This allows us to support the program file
+ // being outside the project, even outside the workspace, without
+ // requiring a linked resource (e.g., the setting could be
+ // "..\..\some\dir\myprogram.exe")
+ URI projectURI = cproject.getProject().getLocationURI();
+ String location = projectURI.toString();
+ //FIXME: should we use proxy getDirectorySeparator()?
+ String projectPath = projectURI.getPath();
+ URI programURI = null;
+ if (projectPath.endsWith("/")) //$NON-NLS-1$
+ programURI = projectURI.resolve("./" + programPath); //$NON-NLS-1$
+ else
+ programURI = projectURI.resolve("./" + cproject.getProject().getName() + "/" + programPath); //$NON-NLS-1$ //$NON-NLS-2$
+ IRemoteFileProxy proxy = RemoteProxyManager.getInstance().getFileProxy(cproject.getProject());
+ progPath = proxy.toPath(programURI);
+ progFile = proxy.getResource(progPath);
+ if (!progFile.fetchInfo().exists()) {
+ // Try looking in the project for the file. This
+ // supports linked resources.
+ IFile projFile = null;
+ try {
+ projFile = cproject.getProject().getFile(CDebugUtils.getProgramPath(config));
+ } catch (IllegalArgumentException exc) {
+ // thrown if relative path that resolves to a root file (e.g., "..\somefile")
+ }
+ if (projFile != null && projFile.exists()) {
+ URI projFileURI = projFile.getLocationURI();
+ progPath = proxy.toPath(projFileURI);
+ }
+ }
+ }
+
+ if (progPath != null) {
+ if (cproject != null) {
+ IRemoteFileProxy proxy = RemoteProxyManager.getInstance().getFileProxy(cproject.getProject());
+ progFile = proxy.getResource(progPath);
+ } else {
+ try {
+ progFile = EFS.getStore(new URI(progPath));
+ } catch (URISyntaxException e) {
+ progPath = null;
+ }
+ }
+ }
+
+ if (progPath == null || !progFile.fetchInfo().exists()) {
+ throwCoreException(
+ DebugCoreMessages.getString("CDebugUtils.Program_file_does_not_exist"), //$NON-NLS-1$
+ new FileNotFoundException(
+ DebugCoreMessages.getFormattedString("CDebugUtils.PROGRAM_PATH_not_found", programPath.toOSString())), //$NON-NLS-1$
+ ICDTLaunchConfigurationConstants.ERR_PROGRAM_NOT_EXIST);
+ }
+ }
+ return progPath;
+ }
/**
* Variant that expects (requires) the launch configuration to have a valid
@@ -674,6 +772,17 @@ public class CDebugUtils {
public static IPath verifyProgramPath(ILaunchConfiguration config) throws CoreException {
return verifyProgramPath(config, false);
}
+
+ /**
+ * Variant that expects (requires) the launch configuration to have a valid
+ * <i>Project</i> setting. See
+ * {@link #verifyProgramURI(ILaunchConfiguration, boolean)}
+ *
+ * @since 8.0.1
+ * */
+ public static String verifyProgramURI(ILaunchConfiguration config) throws CoreException {
+ return verifyProgramURI(config, false);
+ }
/** Throws a CoreException. Clutter-reducing utility method. */
private static void throwCoreException(String msg, int code) throws CoreException {
diff --git a/launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF b/launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF
index d3de935..262af36 100644
--- a/launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF
+++ b/launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF
@@ -23,7 +23,8 @@ Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)",
org.eclipse.cdt.debug.ui;bundle-version="[7.0.0,8.1.0)",
org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
org.eclipse.core.variables;bundle-version="[3.1.100,4.0.0)",
- org.eclipse.ltk.core.refactoring;bundle-version="[3.5.0,4.0.0)"
+ org.eclipse.ltk.core.refactoring;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.core.filesystem;bundle-version="1.3.100"
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: com.ibm.icu.text
diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/AbstractCLaunchDelegate.java b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/AbstractCLaunchDelegate.java
index ca52c71..4990b64 100644
--- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/AbstractCLaunchDelegate.java
+++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/AbstractCLaunchDelegate.java
@@ -17,6 +17,7 @@ package org.eclipse.cdt.launch;
import java.io.File;
import java.io.FileNotFoundException;
+import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
@@ -39,9 +40,12 @@ import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.debug.core.ICDebugConfiguration;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
+import org.eclipse.cdt.internal.core.remoteproxy.IRemoteFileProxy;
+import org.eclipse.cdt.internal.core.remoteproxy.RemoteProxyManager;
import org.eclipse.cdt.launch.internal.ui.LaunchMessages;
import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin;
import org.eclipse.cdt.ui.newui.CDTPropertyManager;
+import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
@@ -197,6 +201,21 @@ abstract public class AbstractCLaunchDelegate extends LaunchConfigurationDelegat
}
/**
+ * Returns the working directory specified by the given launch
+ * configuration, or <code>null</code> if none.
+ *
+ * @param configuration
+ * launch configuration
+ * @return the working directory specified by the given launch
+ * configuration, or <code>null</code> if none
+ * @exception CoreException
+ * if unable to retrieve the attribute
+ */
+ public String getWorkingDirectoryLocation(ILaunchConfiguration configuration) throws CoreException {
+ return verifyWorkingDirectoryLocation(configuration);
+ }
+
+ /**
* Expands and returns the working directory attribute of the given launch
* configuration. Returns <code>null</code> if a working directory is not
* specified. If specified, the working is verified to point to an existing
@@ -222,6 +241,31 @@ abstract public class AbstractCLaunchDelegate extends LaunchConfigurationDelegat
}
/**
+ * Expands and returns the working directory attribute of the given launch
+ * configuration. Returns <code>null</code> if a working directory is not
+ * specified. If specified, the working is verified to point to an existing
+ * directory in the local file system.
+ *
+ * @param configuration launch configuration
+ * @return an absolute path to a directory in the local file system, or
+ * <code>null</code> if unspecified
+ * @throws CoreException if unable to retrieve the associated launch
+ * configuration attribute, if unable to resolve any variables, or if the
+ * resolved location does not point to an existing directory in the local
+ * file system
+ */
+ protected String getWorkingDirectoryPathLocation(ILaunchConfiguration config) throws CoreException {
+ String location = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, (String)null);
+ if (location != null) {
+ String expandedLocation = LaunchUtils.getStringVariableManager().performStringSubstitution(location);
+ if (expandedLocation.length() > 0) {
+ return expandedLocation;
+ }
+ }
+ return null;
+ }
+
+ /**
* Throws a core exception with an error status object built from the given
* message, lower level exception, and error code.
*
@@ -467,7 +511,10 @@ abstract public class AbstractCLaunchDelegate extends LaunchConfigurationDelegat
ICProject cp = CDebugUtils.getCProject(configuration);
if (cp != null) {
IProject p = cp.getProject();
- return p.getLocation().toFile();
+ IRemoteFileProxy proxy = RemoteProxyManager.getInstance().getFileProxy(p);
+ String projPath = proxy.toPath(p.getLocationURI());
+ path = new Path(projPath);
+ return path.toFile();
}
} else {
if (path.isAbsolute()) {
@@ -483,7 +530,10 @@ abstract public class AbstractCLaunchDelegate extends LaunchConfigurationDelegat
} else {
IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
if (res instanceof IContainer && res.exists()) {
- return res.getLocation().toFile();
+ URI uri = res.getLocationURI();
+ IRemoteFileProxy proxy = RemoteProxyManager.getInstance().getFileProxy(res.getProject());
+ path = new Path(proxy.toPath(uri));
+ return path.toFile();
}
abort(LaunchMessages.AbstractCLaunchDelegate_Working_directory_does_not_exist,
new FileNotFoundException(
@@ -495,6 +545,73 @@ abstract public class AbstractCLaunchDelegate extends LaunchConfigurationDelegat
}
return null;
}
+
+ /**
+ * Verifies the working directory specified by the given launch
+ * configuration exists, and returns the working directory, or
+ * <code>null</code> if none is specified.
+ *
+ * @param configuration
+ * launch configuration
+ * @return the working directory specified by the given launch
+ * configuration, or <code>null</code> if none
+ * @exception CoreException
+ * if unable to retrieve the attribute
+ */
+ public String verifyWorkingDirectoryLocation(ILaunchConfiguration configuration) throws CoreException {
+ String path = getWorkingDirectoryPathLocation(configuration);
+ if (path == null) {
+ // default working dir is the project if this config has a project
+ ICProject cp = CDebugUtils.getCProject(configuration);
+ if (cp != null) {
+ IProject p = cp.getProject();
+ IRemoteFileProxy proxy = RemoteProxyManager.getInstance().getFileProxy(p);
+ String projPath = proxy.toPath(p.getLocationURI());
+ return projPath;
+ }
+ } else {
+ // default working dir is the project if this config has a project
+ ICProject cp = CDebugUtils.getCProject(configuration);
+ if (cp != null) {
+ IProject p = cp.getProject();
+ IRemoteFileProxy proxy = RemoteProxyManager.getInstance().getFileProxy(p);
+ IFileStore f = proxy.getResource(path);
+ if (f.fetchInfo().isDirectory())
+ return path;
+ abort(LaunchMessages.AbstractCLaunchDelegate_Working_directory_does_not_exist,
+ new FileNotFoundException(
+ NLS.bind(LaunchMessages.AbstractCLaunchDelegate_WORKINGDIRECTORY_PATH_not_found,
+ path)),
+ ICDTLaunchConfigurationConstants.ERR_WORKING_DIRECTORY_DOES_NOT_EXIST);
+ }
+ Path p = new Path(path);
+ if (p.isAbsolute()) {
+ File dir = new File(p.toOSString());
+ if (dir.isDirectory()) {
+ return p.toOSString();
+ }
+ abort(LaunchMessages.AbstractCLaunchDelegate_Working_directory_does_not_exist,
+ new FileNotFoundException(
+ NLS.bind(LaunchMessages.AbstractCLaunchDelegate_WORKINGDIRECTORY_PATH_not_found,
+ path)),
+ ICDTLaunchConfigurationConstants.ERR_WORKING_DIRECTORY_DOES_NOT_EXIST);
+ } else {
+ IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
+ if (res instanceof IContainer && res.exists()) {
+ URI uri = res.getLocationURI();
+ IRemoteFileProxy proxy = RemoteProxyManager.getInstance().getFileProxy(res.getProject());
+ return proxy.toPath(uri);
+ }
+ abort(LaunchMessages.AbstractCLaunchDelegate_Working_directory_does_not_exist,
+ new FileNotFoundException(
+ NLS.bind(
+ LaunchMessages.AbstractCLaunchDelegate_WORKINGDIRECTORY_PATH_not_found,
+ path)),
+ ICDTLaunchConfigurationConstants.ERR_WORKING_DIRECTORY_DOES_NOT_EXIST);
+ }
+ }
+ return null;
+ }
/**
* Recursively creates a set of projects referenced by the current project
diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/LocalCDILaunchDelegate.java b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/LocalCDILaunchDelegate.java
index 7be45a8..ad36a0f 100644
--- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/LocalCDILaunchDelegate.java
+++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/LocalCDILaunchDelegate.java
@@ -32,6 +32,8 @@ import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.ICDISession;
import org.eclipse.cdt.debug.core.cdi.model.ICDIRuntimeOptions;
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
+import org.eclipse.cdt.internal.core.remoteproxy.IRemoteCommandLauncher;
+import org.eclipse.cdt.internal.core.remoteproxy.RemoteProxyManager;
import org.eclipse.cdt.launch.AbstractCLaunchDelegate;
import org.eclipse.cdt.launch.internal.ui.LaunchMessages;
import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin;
@@ -82,21 +84,48 @@ public class LocalCDILaunchDelegate extends AbstractCLaunchDelegate {
}
monitor.worked(1);
try {
- IPath exePath = CDebugUtils.verifyProgramPath(config);
- File wd = getWorkingDirectory(config);
+ //IPath exePath = CDebugUtils.verifyProgramPath(config);
+ //File wd = getWorkingDirectory(config);
+ //if (wd == null) {
+ // wd = new File(System.getProperty("user.home", ".")); //$NON-NLS-1$ //$NON-NLS-2$
+ //}
+ //String arguments[] = getProgramArgumentsArray(config);
+ //ArrayList command = new ArrayList(1 + arguments.length);
+ //command.add(exePath.toOSString());
+ //command.addAll(Arrays.asList(arguments));
+ //String[] commandArray = (String[])command.toArray(new String[command.size()]);
+ //boolean usePty = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_USE_TERMINAL, ICDTLaunchConfigurationConstants.USE_TERMINAL_DEFAULT);
+ //monitor.worked(2);
+ //Process process = exec(commandArray, getEnvironment(config), wd, usePty);
+ //monitor.worked(6);
+ //DebugPlugin.newProcess(launch, process, renderProcessLabel(commandArray[0]));
+ String exePath = CDebugUtils.verifyProgramURI(config);
+ String wd = getWorkingDirectoryLocation(config);
if (wd == null) {
- wd = new File(System.getProperty("user.home", ".")); //$NON-NLS-1$ //$NON-NLS-2$
+ wd = System.getProperty("user.home", "."); //$NON-NLS-1$ //$NON-NLS-2$
}
String arguments[] = getProgramArgumentsArray(config);
ArrayList command = new ArrayList(1 + arguments.length);
- command.add(exePath.toOSString());
+ command.add(exePath);
command.addAll(Arrays.asList(arguments));
String[] commandArray = (String[])command.toArray(new String[command.size()]);
boolean usePty = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_USE_TERMINAL, ICDTLaunchConfigurationConstants.USE_TERMINAL_DEFAULT);
monitor.worked(2);
- Process process = exec(commandArray, getEnvironment(config), wd, usePty);
- monitor.worked(6);
- DebugPlugin.newProcess(launch, process, renderProcessLabel(commandArray[0]));
+ // default working dir is the project if this config has a project
+ ICProject cp = CDebugUtils.getCProject(config);
+ if (cp != null) {
+ IProject p = cp.getProject();
+ IRemoteCommandLauncher proxy = RemoteProxyManager.getInstance().getLauncher(p);
+ Process process = proxy.execute(exePath, arguments, getEnvironment(config), wd, usePty, monitor);
+ monitor.worked(6);
+ DebugPlugin.newProcess(launch, process, renderProcessLabel(commandArray[0]));
+ } else {
+ Path wdPath = new Path(wd);
+ File f = wdPath.toFile();
+ Process process = exec(commandArray, getEnvironment(config), f, usePty);
+ monitor.worked(6);
+ DebugPlugin.newProcess(launch, process, renderProcessLabel(commandArray[0]));
+ }
} finally {
monitor.done();
}
--
1.7.9.5
More information about the yocto
mailing list