package org.nodeclipse.debug.model;
import java.io.IOException;
import org.eclipse.core.resources.IMarkerDelta;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IMemoryBlock;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.core.model.IStreamsProxy;
import org.eclipse.debug.core.model.IThread;
import org.nodeclipse.debug.util.Constants;
import org.nodeclipse.debug.util.LogUtil;
public class DebugTarget extends NodeDebugElement implements IDebugTarget {
private ILaunch launch;
private IProcess process;
private Process p;
private IThread[] threads;
private Thread thread;
private boolean suspended;
public DebugTarget(ILaunch launch, IProcess process, Process p) {
super(null);
this.launch = launch;
this.process = process;
this.p = p;
this.thread = new Thread(this);
threads = new Thread[] { this.thread };
}
@Override
public boolean canTerminate() {
return !isTerminated();
}
@Override
public boolean isTerminated() {
return getProcess().isTerminated();
}
@Override
public void terminate() throws DebugException {
IStreamsProxy streamsProxy = process.getStreamsProxy();
try {
if (!isTerminated()) {
streamsProxy.write(Constants.QUIT + Constants.EOL);
// wait for subprocess exit
p.waitFor();
}
} catch (IOException e) {
LogUtil.error(e);
} catch (InterruptedException e) {
LogUtil.error(e);
}
}
@Override
public boolean canResume() {
return !isTerminated() && isSuspended();
}
@Override
public boolean canSuspend() {
return !isTerminated() && !isSuspended();
}
@Override
public boolean isSuspended() {
return suspended;
}
public void sendCommand(String command) {
IStreamsProxy streamsProxy = process.getStreamsProxy();
try {
if (!isTerminated()) {
streamsProxy.write(command + Constants.EOL);
}
} catch (IOException e) {
LogUtil.error(e);
}
}
@Override
public void resume() throws DebugException {
sendCommand(Constants.CONT);
}
@Override
public void suspend() throws DebugException {
// TODO Auto-generated method stub
}
@Override
public void breakpointAdded(IBreakpoint breakpoint) {
// TODO Auto-generated method stub
}
@Override
public void breakpointRemoved(IBreakpoint breakpoint, IMarkerDelta delta) {
// TODO Auto-generated method stub
}
@Override
public void breakpointChanged(IBreakpoint breakpoint, IMarkerDelta delta) {
// TODO Auto-generated method stub
}
@Override
public boolean canDisconnect() {
return false;
}
@Override
public void disconnect() throws DebugException {
// TODO Auto-generated method stub
}
@Override
public boolean isDisconnected() {
return false;
}
@Override
public boolean supportsStorageRetrieval() {
// TODO Auto-generated method stub
return false;
}
@Override
public IMemoryBlock getMemoryBlock(long startAddress, long length) throws DebugException {
// TODO Auto-generated method stub
return null;
}
@Override
public IDebugTarget getDebugTarget() {
return this;
}
@Override
public ILaunch getLaunch() {
return launch;
}
@Override
public IProcess getProcess() {
return process;
}
@Override
public IThread[] getThreads() throws DebugException {
if (threads == null) {
return new IThread[0];
} else {
return threads;
}
}
@Override
public boolean hasThreads() throws DebugException {
return true;
}
@Override
public String getName() throws DebugException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean supportsBreakpoint(IBreakpoint breakpoint) {
// TODO Auto-generated method stub
return true;
}
}