/* * 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.php.model; import java.net.URI; import java.net.URISyntaxException; import net.sourceforge.phpeclipse.xdebug.core.PHPDebugUtils; import net.sourceforge.phpeclipse.xdebug.core.DebugConnection.DebugResponse; import org.eclipse.core.runtime.Path; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IRegisterGroup; import org.eclipse.debug.core.model.IStackFrame; import org.eclipse.debug.core.model.IThread; import org.eclipse.debug.core.model.IVariable; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * @author Axel * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ public class XDebugStackFrame extends XDebugElement implements IStackFrame { private XDebugThread fThread; // private String fName; private int fLineNo; private String fFileName; private int fId; private IVariable[] fVariables; private String fLevel; private String fType; private String fWhere; /** * Constructs a stack frame in the given thread with the given * frame data. * * @param thread * @param data frame data * @param id stack frame id (0 is the bottom of the stack) */ public XDebugStackFrame(XDebugThread thread, Node stackNode, int id) { super((XDebugTarget) thread.getDebugTarget()); fId = id; fThread = thread; init(stackNode); } /** * Initializes this frame based on its data * * @param data */ private void init(Node stackNode) { fLevel=PHPDebugUtils.getAttributeValue(stackNode,"level"); fType=PHPDebugUtils.getAttributeValue(stackNode,"type"); String fileName=PHPDebugUtils.unescapeString(PHPDebugUtils.getAttributeValue(stackNode,"filename")); String lineNo=PHPDebugUtils.getAttributeValue(stackNode,"lineno"); if (lineNo!="") fLineNo= Integer.parseInt(lineNo); fWhere=PHPDebugUtils.getAttributeValue(stackNode,"where"); fFileName = (new Path(fileName)).lastSegment(); int id=-1; try { id=((XDebugTarget)getDebugTarget()).sendRequest("context_get","-d "+fLevel); } catch (DebugException e) { // TODO Auto-generated catch block e.printStackTrace(); } DebugResponse response=((XDebugTarget)getDebugTarget()).getResponse(id); Node responseNode = response.getParentNode(); NodeList property = responseNode.getChildNodes(); fVariables = new IVariable[property.getLength()]; for (int i = 0; i < property.getLength(); i++) { Node propertyNode = property.item(i); fVariables[i] = new XDebugVariable(this, propertyNode); } // int numVars = strings.length - 3; // fVariables = new IVariable[numVars]; // for (int i = 0; i < numVars; i++) { // fVariables[i] = new XDebugVariable(this, strings[i + 3]); // } } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getThread() */ public IThread getThread() { return fThread; } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getVariables() */ public IVariable[] getVariables() throws DebugException { return fVariables; } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#hasVariables() */ public boolean hasVariables() throws DebugException { return fVariables.length > 0; } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getLineNumber() */ public int getLineNumber() throws DebugException { return fLineNo; } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getCharStart() */ public int getCharStart() throws DebugException { return -1; } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getCharEnd() */ public int getCharEnd() throws DebugException { return -1; } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getName() */ public String getName() throws DebugException { return fFileName+"::"+fWhere+ " : lineno "+ fLineNo; } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getRegisterGroups() */ public IRegisterGroup[] getRegisterGroups() throws DebugException { return null; } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#hasRegisterGroups() */ public boolean hasRegisterGroups() throws DebugException { return false; } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#canStepInto() */ public boolean canStepInto() { return getThread().canStepInto(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#canStepOver() */ public boolean canStepOver() { return getThread().canStepOver(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#canStepReturn() */ public boolean canStepReturn() { return getThread().canStepReturn(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#isStepping() */ public boolean isStepping() { return getThread().isStepping(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#stepInto() */ public void stepInto() throws DebugException { getThread().stepInto(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#stepOver() */ public void stepOver() throws DebugException { getThread().stepOver(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#stepReturn() */ public void stepReturn() throws DebugException { getThread().stepReturn(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#canResume() */ public boolean canResume() { return getThread().canResume(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#canSuspend() */ public boolean canSuspend() { return getThread().canSuspend(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended() */ public boolean isSuspended() { return getThread().isSuspended(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#resume() */ public void resume() throws DebugException { getThread().resume(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#suspend() */ public void suspend() throws DebugException { getThread().suspend(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ITerminate#canTerminate() */ public boolean canTerminate() { return getThread().canTerminate(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ITerminate#isTerminated() */ public boolean isTerminated() { return getThread().isTerminated(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ITerminate#terminate() */ public void terminate() throws DebugException { getThread().terminate(); } /** * Returns the name of the source file this stack frame is associated * with. * * @return the name of the source file this stack frame is associated * with */ public String getSourceName() { return fFileName; } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object obj) { if (obj instanceof XDebugStackFrame) { XDebugStackFrame sf = (XDebugStackFrame)obj; try { return sf.getSourceName().equals(getSourceName()) && sf.getLineNumber() == getLineNumber() && sf.fId == fId; } catch (DebugException e) { } } return false; } /* (non-Javadoc) * @see java.lang.Object#hashCode() */ public int hashCode() { return getSourceName().hashCode() + fId; } /** * Returns this stack frame's unique identifier within its thread * * @return this stack frame's unique identifier within its thread */ protected int getIdentifier() { return fId; } }