/** * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package com.python.pydev.debug.model; import org.eclipse.core.runtime.IPath; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.IBreakpointManager; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.IProcess; import org.python.pydev.debug.model.AbstractDebugTarget; import org.python.pydev.debug.model.PyExceptionBreakPointManager; import org.python.pydev.debug.model.PyPropertyTraceManager; import org.python.pydev.debug.model.PyThread; import org.python.pydev.debug.model.remote.AbstractDebuggerCommand; import com.aptana.shared_core.structure.Tuple; import com.python.pydev.debug.remote.RemoteDebuggerServer; public class PyDebugTargetServer extends AbstractDebugTarget { private boolean isTerminated; public PyDebugTargetServer(ILaunch launch, IPath[] file, RemoteDebuggerServer debugger) { this.file = file; this.debugger = debugger; this.threads = new PyThread[0]; this.launch = launch; if (launch != null) { for (IDebugTarget target : launch.getDebugTargets()) { if (target instanceof PyDebugTargetServer && target.isTerminated()) { launch.removeDebugTarget(target); } } launch.addDebugTarget(this); } debugger.addTarget(this); PyExceptionBreakPointManager.getInstance().addListener(this); PyPropertyTraceManager.getInstance().addListener(this); IBreakpointManager breakpointManager = DebugPlugin.getDefault().getBreakpointManager(); breakpointManager.addBreakpointListener(this); // we have to know when we get removed, so that we can shut off the debugger DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this); } public boolean canTerminate() { return !isTerminated; } public boolean isTerminated() { return isTerminated; } public void terminate() { isTerminated = true; super.terminate(); } public void setTerminated() { isTerminated = true; } public void launchRemoved(ILaunch launch) { // shut down the remote debugger when parent launch if (launch == this.launch) { IBreakpointManager breakpointManager = DebugPlugin.getDefault().getBreakpointManager(); breakpointManager.removeBreakpointListener(this); PyExceptionBreakPointManager.getInstance().removeListener(this); PyPropertyTraceManager.getInstance().removeListener(this); } } public void processCommand(String sCmdCode, String sSeqCode, String payload) { if (Integer.parseInt(sCmdCode) == AbstractDebuggerCommand.CMD_WRITE_TO_CONSOLE) { ProcessServer serverProcess = getDebugger().getServerProcess(); //payload = <xml><io s="%s" ctx="%s"/></xml> Tuple<String, Integer> message = XMLMessage.getMessage(payload); if (message.o2 == 1) { serverProcess.writeToStdOut(message.o1); } else { serverProcess.writeToStdErr(message.o1); } } else { super.processCommand(sCmdCode, sSeqCode, payload); } } public RemoteDebuggerServer getDebugger() { return (RemoteDebuggerServer) super.getDebugger(); } public IProcess getProcess() { return getDebugger().getIProcess(); } }