X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/XDebugTarget.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/XDebugTarget.java deleted file mode 100644 index 995df98..0000000 --- a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/core/XDebugTarget.java +++ /dev/null @@ -1,597 +0,0 @@ -/* - * Created on 23.11.2004 - * - * TODO To change the template for this generated file go to - * Window - Preferences - Java - Code Style - Code Templates - */ -package net.sourceforge.phpeclipse.xdebug.core; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.Socket; -import java.net.ServerSocket; -import java.net.UnknownHostException; -import java.text.MessageFormat; -import org.w3c.dom.*; -import javax.xml.parsers.*; -import javax.xml.parsers.DocumentBuilder; -import org.xml.sax.SAXException; -import java.io.StringBufferInputStream; -import java.io.OutputStreamWriter; - -import org.eclipse.core.resources.IMarkerDelta; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.debug.core.DebugEvent; -import org.eclipse.debug.core.DebugException; -import org.eclipse.debug.core.DebugPlugin; -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.ILineBreakpoint; -import org.eclipse.debug.core.model.IMemoryBlock; -import org.eclipse.debug.core.model.IProcess; -import org.eclipse.debug.core.model.IStackFrame; -import org.eclipse.debug.core.model.IThread; -import org.eclipse.debug.core.model.IValue; -import net.sourceforge.phpdt.internal.debug.core.PHPDebugCorePlugin; - -/** - * @author Axel - * - * TODO To change the template for this generated type comment go to - * Window - Preferences - Java - Code Style - Code Templates - */ -public class XDebugTarget extends XDebugElement implements IDebugTarget { - - // associated system process (VM) - private IProcess fProcess; - - // containing launch object - private ILaunch fLaunch; - - // program name - private String fName; - - // sockets to communicate with XDebug - private ServerSocket fDebugServerSocket; - private Socket fDebugSocket; - private OutputStreamWriter fDebugWriter; - private BufferedReader fDebugReader; - - // suspend state - private boolean fSuspended = true; - - // terminated state - private boolean fTerminated = false; - - // threads - private XDebugThread fThread; - private IThread[] fThreads; - - // event dispatch job - private EventDispatchJob fEventDispatch; - - // Settings for Debug Process - private String transaction_id = ""; - private String fileuri = ""; - - /** - * Listens to events from the XDebug and fires corresponding - * debug events. - */ - class EventDispatchJob extends Job { - - public EventDispatchJob() { - super("XDebug Event Dispatch"); - setSystem(true); - } - - public String getAttributeValue (Node CurrentNode, String AttributeName) { - String strValue = ""; - if (CurrentNode.hasAttributes()) { - NamedNodeMap listAttribute = CurrentNode.getAttributes(); - Node nodeTransactionID = listAttribute.getNamedItem(AttributeName); - strValue = nodeTransactionID.getNodeValue(); - } - return strValue; - } - - /* (non-Javadoc) - * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) - */ - protected IStatus run(IProgressMonitor monitor) { - String event = ""; - int CurrentByte; - boolean ZeroByteFound; - int BytesToRead = 0; - String InputXML; - while (!isTerminated() && event != null) { - try { - ZeroByteFound = false; - event = ""; - while (!ZeroByteFound){ - CurrentByte = fDebugReader.read(); - if (CurrentByte == 0) { - ZeroByteFound = true; - try { - BytesToRead = Integer.parseInt(event); - } catch (NumberFormatException e) { - BytesToRead = 0; - } - } else { - event = event + (char)CurrentByte; - } - } - if (BytesToRead > 0) { - InputXML = ""; - for (int i = 0; i < BytesToRead; i++) { - CurrentByte = fDebugReader.read(); - InputXML = InputXML + (char)CurrentByte; - } - CurrentByte = fDebugReader.read(); // Das Null Byte nach dem String lesen. - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = factory.newDocumentBuilder(); - StringBufferInputStream InputXMLStream = new StringBufferInputStream(InputXML); - Document doc = builder.parse(InputXMLStream); - Node myNode = doc.getFirstChild(); - if (myNode.getNodeName() == "init") { - transaction_id = getAttributeValue(myNode, "appid"); - fileuri = getAttributeValue(myNode, "fileuri"); - fThread.setBreakpoints(null); - fThread.setStepping(false); - started(); - } else if (myNode.getNodeName() == "response") { - - } - - } catch (ParserConfigurationException e) { - - } catch (SAXException e) { - - } - } -/* - event = fDebugReader.readLine(); - if (event != null) { - fThread.setBreakpoints(null); - fThread.setStepping(false); - if (event.equals("started")) { - - } else if (event.equals("terminated")) { - terminated(); - } else if (event.startsWith("resumed")) { - if (event.endsWith("step")) { - fThread.setStepping(true); - resumed(DebugEvent.STEP_OVER); - } else if (event.endsWith("client")) { - resumed(DebugEvent.CLIENT_REQUEST); - } - } else if (event.startsWith("suspended")) { - if (event.endsWith("client")) { - suspended(DebugEvent.CLIENT_REQUEST); - } else if (event.endsWith("step")) { - suspended(DebugEvent.STEP_END); - } else if (event.indexOf("breakpoint") >= 0) { - breakpointHit(event); - } - } - } -*/ - } catch (IOException e) { - terminated(); - } - } - return Status.OK_STATUS; - } - - } - - /** - * Constructs a new debug target in the given launch for the - * associated PDA VM process. - * - * @param launch containing launch - * @param debugPort port to read events from - * @exception CoreException if unable to connect to host - */ - public XDebugTarget(ILaunch launch, int debugPort) throws CoreException { - super(null); - fLaunch = launch; - fTarget = this; - try { - fDebugServerSocket = new ServerSocket(debugPort); - fDebugSocket = fDebugServerSocket.accept(); - fDebugWriter = new OutputStreamWriter(fDebugSocket.getOutputStream(), "UTF8"); - fDebugReader = new BufferedReader(new InputStreamReader(fDebugSocket.getInputStream())); - - } catch (UnknownHostException e) { - abort("Unable to connect to PDA VM", e); - } catch (IOException e) { - abort("Unable to connect to PDA VM", e); - } - fThread = new XDebugThread(this); - fThreads = new IThread[] {fThread}; - fEventDispatch = new EventDispatchJob(); - fEventDispatch.schedule(); - DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(this); - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.IDebugTarget#getProcess() - */ - public IProcess getProcess() { - return fProcess; - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.IDebugTarget#getThreads() - */ - public IThread[] getThreads() throws DebugException { - return fThreads; - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.IDebugTarget#hasThreads() - */ - public boolean hasThreads() throws DebugException { - return false; - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.IDebugTarget#getName() - */ - public String getName() throws DebugException { - if (fName == null) { - fName = "XDebug Core"; - try { - fName = getLaunch().getLaunchConfiguration().getAttribute(IXDebugConstants.ATTR_XDEBUG_PROGRAM, "PDA VM"); - } catch (CoreException e) { - } - } - return fName; - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.IDebugTarget#supportsBreakpoint(org.eclipse.debug.core.model.IBreakpoint) - */ - public boolean supportsBreakpoint(IBreakpoint breakpoint) { - if (breakpoint.getModelIdentifier().equals(PHPDebugCorePlugin.PLUGIN_ID)) { - /* Axel: Weiß nicht ob das wichtig ist. - try { - String program = getLaunch().getLaunchConfiguration().getAttribute(IXDebugConstants.ATTR_XDEBUG_PROGRAM, (String)null); - if (program != null) { - IMarker marker = breakpoint.getMarker(); - if (marker != null) { - IPath p = new Path(program); - return marker.getResource().getFullPath().equals(p); - } - } - } catch (CoreException e) { - } -*/ - return true; - } - return false; - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget() - */ - public IDebugTarget getDebugTarget() { - return this; - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.IDebugElement#getLaunch() - */ - public ILaunch getLaunch() { - return fLaunch; - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.ITerminate#canTerminate() - */ - public boolean canTerminate() { -// return getProcess().canTerminate(); - return false; - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.ITerminate#isTerminated() - */ - public boolean isTerminated() { -// return getProcess().isTerminated(); - return false; - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.ITerminate#terminate() - */ - public void terminate() throws DebugException { - sendRequest ("stop -i " + transaction_id); - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.ISuspendResume#canResume() - */ - public boolean canResume() { - return !isTerminated() && isSuspended(); - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.ISuspendResume#canSuspend() - */ - public boolean canSuspend() { - return !isTerminated() && !isSuspended(); - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended() - */ - public boolean isSuspended() { - return fSuspended; - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.ISuspendResume#resume() - */ - public void resume() throws DebugException { - sendRequest("run -i " + transaction_id); - } - - /** - * Notification the target has resumed for the given reason - * - * @param detail reason for the resume - */ - private void resumed(int detail) { - fSuspended = false; - fThread.fireResumeEvent(detail); - } - - /** - * Notification the target has suspended for the given reason - * - * @param detail reason for the suspend - */ - private void suspended(int detail) { - fSuspended = true; - fThread.fireSuspendEvent(detail); - } - - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.ISuspendResume#suspend() - */ - public void suspend() throws DebugException { - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.IBreakpointListener#breakpointAdded(org.eclipse.debug.core.model.IBreakpoint) - */ - public void breakpointAdded(IBreakpoint breakpoint) { - if (supportsBreakpoint(breakpoint)) { - try { - if (breakpoint.isEnabled()) { - try { - sendRequest("breakpoint_set -i " + transaction_id +" -t line -n " + (((ILineBreakpoint)breakpoint).getLineNumber() - 1)); - } catch (CoreException e) { - } - } - } catch (CoreException e) { - } - } - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.IBreakpointListener#breakpointRemoved(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.resources.IMarkerDelta) - */ - public void breakpointRemoved(IBreakpoint breakpoint, IMarkerDelta delta) { - if (supportsBreakpoint(breakpoint)) { - try { - sendRequest("clear " + ((ILineBreakpoint)breakpoint).getLineNumber()); - } catch (CoreException e) { - } - } - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.IBreakpointListener#breakpointChanged(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.resources.IMarkerDelta) - */ - public void breakpointChanged(IBreakpoint breakpoint, IMarkerDelta delta) { - if (supportsBreakpoint(breakpoint)) { - try { - if (breakpoint.isEnabled()) { - breakpointAdded(breakpoint); - } else { - breakpointRemoved(breakpoint, null); - } - } catch (CoreException e) { - } - } - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.IDisconnect#canDisconnect() - */ - public boolean canDisconnect() { - return false; - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.IDisconnect#disconnect() - */ - public void disconnect() throws DebugException { - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.IDisconnect#isDisconnected() - */ - public boolean isDisconnected() { - return false; - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.IMemoryBlockRetrieval#supportsStorageRetrieval() - */ - public boolean supportsStorageRetrieval() { - return false; - } - /* (non-Javadoc) - * @see org.eclipse.debug.core.model.IMemoryBlockRetrieval#getMemoryBlock(long, long) - */ - public IMemoryBlock getMemoryBlock(long startAddress, long length) throws DebugException { - return null; - } - - /** - * Notification we have connected to the VM and it has started. - * Resume the VM. - */ - private void started() { - fireCreationEvent(); - installDeferredBreakpoints(); - try { - resume(); - } catch (DebugException e) { - } - } - - /** - * Install breakpoints that are already registered with the breakpoint - * manager. - */ - private void installDeferredBreakpoints() { - IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(PHPDebugCorePlugin.PLUGIN_ID); - for (int i = 0; i < breakpoints.length; i++) { - breakpointAdded(breakpoints[i]); - } - } - - /** - * Called when this debug target terminates. - */ - private void terminated() { - fTerminated = true; - fSuspended = false; - DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener(this); - fireTerminateEvent(); - } - - /** - * Returns the current stack frames in the target. - * - * @return the current stack frames in the target - * @throws DebugException if unable to perform the request - */ - protected IStackFrame[] getStackFrames() throws DebugException { - synchronized (fDebugSocket) { - sendRequest("stack -i " + transaction_id); - try { - String framesData = fDebugReader.readLine(); - if (framesData != null) { - String[] frames = framesData.split("#"); - IStackFrame[] theFrames = new IStackFrame[frames.length]; - for (int i = 0; i < frames.length; i++) { - String data = frames[i]; - theFrames[frames.length - i - 1] = new XDebugStackFrame(fThread, data, i); - } - return theFrames; - } - } catch (IOException e) { - abort("Unable to retrieve stack frames", e); - } - } - return new IStackFrame[0]; - } - - /** - * Single step the interpreter. - * - * @throws DebugException if the request fails - */ - protected void step() throws DebugException { - sendRequest("step_into -i " + transaction_id); - } - - /** - * Returns the current value of the given variable. - * - * @param variable - * @return variable value - * @throws DebugException if the request fails - */ - protected IValue getVariableValue(XDebugVariable variable) throws DebugException { - synchronized (fDebugSocket) { - sendRequest("var " + variable.getStackFrame().getIdentifier() + " " + variable.getName()); - try { - String value = fDebugReader.readLine(); - return new XDebugValue(this, value); - } catch (IOException e) { - abort(MessageFormat.format("Unable to retrieve value for variable {0}", new String[]{variable.getName()}), e); - } - } - return null; - } - - /** - * Returns the values on the data stack (top down) - * - * @return the values on the data stack (top down) - */ - public IValue[] getDataStack() throws DebugException { - synchronized (fDebugSocket) { - sendRequest ("data"); - try { - String valueString = fDebugReader.readLine(); - if (valueString != null && valueString.length() > 0) { - String[] values = valueString.split("\\|"); - IValue[] theValues = new IValue[values.length]; - for (int i = 0; i < values.length; i++) { - String value = values[values.length - i - 1]; - theValues[i] = new XDebugValue(this, value); - } - return theValues; - } - } catch (IOException e) { - abort("Unable to retrieve data stack", e); - } - } - return new IValue[0]; - } - - /** - * Sends a request to the PDA VM and waits for an OK. - * - * @param request debug command - * @throws DebugException if the request fails - */ - private void sendRequest(String request) throws DebugException { - synchronized (fDebugSocket) { - try { - fDebugWriter.write(request); - fDebugWriter.write(0); - fDebugWriter.flush(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - /** - * Notification a breakpoint was encountered. Determine - * which breakpoint was hit and fire a suspend event. - * - * @param event debug event - */ - private void breakpointHit(String event) { - // determine which breakpoint was hit, and set the thread's breakpoint - int lastSpace = event.lastIndexOf(' '); - if (lastSpace > 0) { - String line = event.substring(lastSpace + 1); - int lineNumber = Integer.parseInt(line); - IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(PHPDebugCorePlugin.PLUGIN_ID); - for (int i = 0; i < breakpoints.length; i++) { - IBreakpoint breakpoint = breakpoints[i]; - if (supportsBreakpoint(breakpoint)) { - if (breakpoint instanceof ILineBreakpoint) { - ILineBreakpoint lineBreakpoint = (ILineBreakpoint) breakpoint; - try { - if (lineBreakpoint.getLineNumber() == lineNumber) { - fThread.setBreakpoints(new IBreakpoint[]{breakpoint}); - break; - } - } catch (CoreException e) { - } - } - } - } - } - suspended(DebugEvent.BREAKPOINT); - } -} -