Initial implementation of the new Debug Plugin
[phpeclipse.git] / net.sourceforge.phpeclipse.xdebug.core / src / net / sourceforge / phpeclipse / xdebug / php / model / XDebugStackFrame.java
diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugStackFrame.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugStackFrame.java
new file mode 100644 (file)
index 0000000..ece6842
--- /dev/null
@@ -0,0 +1,283 @@
+/*
+ * 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;
+       }
+}