Changes for variablemodificatin
[phpeclipse.git] / net.sourceforge.phpeclipse.debug.core / src / net / sourceforge / phpdt / internal / debug / core / PHPDBGProxy.java
index b9bf0f2..1c73cf9 100644 (file)
@@ -8,6 +8,7 @@ http://www.eclipse.org/legal/cpl-v10.html
 Contributors:
        IBM Corporation - Initial implementation
        Vicente Fernando - www.alfersoft.com.ar
+       Christian Perkonig - remote debug
 **********************************************************************/
 package net.sourceforge.phpdt.internal.debug.core;
 
@@ -17,8 +18,11 @@ import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.net.Socket;
 import java.net.ServerSocket;
+import java.net.SocketTimeoutException;
 
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
 import org.eclipse.debug.core.DebugPlugin;
 import org.eclipse.debug.core.DebugException;
 import org.eclipse.debug.core.model.IBreakpoint;
@@ -26,10 +30,7 @@ import net.sourceforge.phpdt.internal.debug.core.model.IPHPDebugTarget;
 import net.sourceforge.phpdt.internal.debug.core.model.PHPStackFrame;
 import net.sourceforge.phpdt.internal.debug.core.model.PHPThread;
 import net.sourceforge.phpdt.internal.debug.core.model.PHPVariable;
-import net.sourceforge.phpdt.internal.debug.core.SocketUtil;
-import net.sourceforge.phpdt.internal.debug.core.PHPDBGInterface;
 import net.sourceforge.phpdt.internal.debug.core.breakpoints.PHPLineBreakpoint;
-import net.sourceforge.phpdt.internal.debug.core.PHPDebugCorePlugin;
 
 public class PHPDBGProxy {
 
@@ -40,9 +41,19 @@ public class PHPDBGProxy {
        private IPHPDebugTarget debugTarget= null;
        private PHPLoop phpLoop;
        private PHPThread PHPMainThread;
+       private PHPDBGProxy thisProxy= null;
        private int port;
+       private boolean remote;
+       private IPath remoteSourcePath;
 
        public PHPDBGProxy() {
+               thisProxy= this;
+       }
+
+       public PHPDBGProxy(boolean remote,String remoteSourcePath) {
+               thisProxy= this;
+               this.remote=remote;
+               this.remoteSourcePath= new Path(remoteSourcePath);
        }
 
        public void start() {
@@ -53,6 +64,13 @@ public class PHPDBGProxy {
        public void stop() {
                phpLoop.setShouldStop();
                if(DBGInt != null) DBGInt.setShouldStop();
+               if (!remote) {
+                       try {
+                               getDebugTarget().getProcess().terminate();
+                       } catch (DebugException e) {
+                               e.printStackTrace();
+                       }
+               }
                phpLoop.notifyWait();
        }
 
@@ -64,7 +82,8 @@ public class PHPDBGProxy {
        }
 
        protected void createServerSocket() {
-               port = SocketUtil.findUnusedLocalPort("localhost", 10001, 10101);
+//             port = SocketUtil.findUnusedLocalPort("localhost", 10001, 10101);
+    port =     10001;
                if (port == -1) {
                        PHPDebugCorePlugin.log(5, "Cannot find free port!!!!");
                        return;
@@ -81,7 +100,7 @@ public class PHPDBGProxy {
                }
        }
 
-       protected Socket getSocket() throws IOException {
+       public Socket getSocket() throws IOException {
                return socket;
        }
 
@@ -90,11 +109,18 @@ public class PHPDBGProxy {
        }
 
        public BufferedReader getReader() throws IOException {
-               if (reader == null) {                   
+               if (reader == null) {
                        reader = new BufferedReader(new InputStreamReader(this.getSocket().getInputStream(), "ISO8859_1"));
                }
                return reader;
        }
+       
+       public BufferedReader getReader(Socket socket) throws IOException {
+               if (socket != null)
+                 return new BufferedReader(new InputStreamReader(socket.getInputStream(), "ISO8859_1"));
+               else
+                 return null;
+       }
 
        public OutputStream getOutputStream() throws IOException {
                return this.getSocket().getOutputStream();
@@ -112,9 +138,15 @@ public class PHPDBGProxy {
                int bpNo= 0;
                try {
                        PHPLineBreakpoint phpLBP;
-                       if(breakpoint.getModelIdentifier() == PHPDebugCorePlugin.getDefault().getDescriptor().getUniqueIdentifier()) {
+                       if(breakpoint.getModelIdentifier() == PHPDebugCorePlugin.getUniqueIdentifier()) {
+                               IPath filename;
                                phpLBP= (PHPLineBreakpoint)breakpoint;
-                               bpNo= DBGInt.addBreakpoint(phpLBP.getMarker().getResource().getLocation().toOSString(), phpLBP.getLineNumber());
+                               //                              bpNo= DBGInt.addBreakpoint(phpLBP.getMarker().getResource().getLocation().toOSString(), phpLBP.getLineNumber());
+                               if (remote)
+                                       filename=remoteSourcePath.append(phpLBP.getMarker().getResource().getProjectRelativePath());
+                               else
+                                       filename=phpLBP.getMarker().getResource().getLocation();
+                               bpNo= DBGInt.addBreakpoint(filename.toOSString(), phpLBP.getLineNumber());
                                phpLBP.setDBGBpNo(bpNo);
                        }
                } catch (IOException e) {
@@ -130,9 +162,15 @@ public class PHPDBGProxy {
                if (DBGInt == null) return;
                try {
                        PHPLineBreakpoint phpLBP;
-                       if(breakpoint.getModelIdentifier() == PHPDebugCorePlugin.getDefault().getDescriptor().getUniqueIdentifier()) {
+                       if(breakpoint.getModelIdentifier() == PHPDebugCorePlugin.getUniqueIdentifier()) {
                                phpLBP= (PHPLineBreakpoint)breakpoint;
-                               DBGInt.removeBreakpoint(phpLBP.getMarker().getResource().getLocation().toOSString(), phpLBP.getLineNumber(), phpLBP.getDBGBpNo());
+                               IPath filename;
+                               if (remote)
+                                       filename=remoteSourcePath.append(phpLBP.getMarker().getResource().getProjectRelativePath());
+                               else
+                                       filename=phpLBP.getMarker().getResource().getLocation();
+//                                     bpNo= DBGInt.addBreakpoint(filename.toOSString(), phpLBP.getLineNumber());                              
+                               DBGInt.removeBreakpoint(filename.toOSString(), phpLBP.getLineNumber(), phpLBP.getDBGBpNo());
                        }
                } catch (IOException e) {
                        PHPDebugCorePlugin.log(e);
@@ -142,13 +180,17 @@ public class PHPDBGProxy {
                        stop();
                }
        }
+       
+       public void phpLoopNotify (){
+               phpLoop.notifyWait();
+       }
 
        public void startPHPLoop() {
                phpLoop = new PHPLoop();
                phpLoop.start();
        }
 
-       public void resume(PHPThread thread) {
+       public void resume() {
                try {
                        DBGInt.continueExecution();
                        phpLoop.notifyWait();
@@ -158,6 +200,14 @@ public class PHPDBGProxy {
                }
        }
 
+       public void pause() {
+               try {
+                       DBGInt.pauseExecution();
+               } catch (IOException e) {
+                       PHPDebugCorePlugin.log(e);
+                       stop();
+               }
+       }
        protected IPHPDebugTarget getDebugTarget() {
                return debugTarget;
        }
@@ -178,15 +228,18 @@ public class PHPDBGProxy {
                        throw new RuntimeException(ex.getMessage());
                }
        }
-
-       public PHPVariable[] readInstanceVariables(PHPVariable variable) {
+       
+       public PHPVariable[] eval(PHPStackFrame frame,String evalString) {
                try {
-                       return DBGInt.getInstVars(variable);
+                       return DBGInt.evalBlock(frame,evalString);
+                       //                      return DBGInt.getVariables(frame);
+               } catch (IOException ioex) {
+                       ioex.printStackTrace();
+                       throw new RuntimeException(ioex.getMessage());
                } catch (DebugException ex) {
                        ex.printStackTrace();
                        throw new RuntimeException(ex.getMessage());
                }
-
        }
 
        public void readStepOverEnd(PHPStackFrame stackFrame) {
@@ -265,60 +318,118 @@ public class PHPDBGProxy {
                public void run() {
                        try {
                                char[] buf= new char[16];
-                               int i, pos;
-                               long interval= 1000*20;
+                               int i, pos, timeout;
+                               long interval= 200; // 200ms
                                String line;
                                PHPStackFrame[] StackList;
+                               boolean endFile=false;
+                               boolean newconnect=false;
+                               Socket newSocket=null;
+                               PHPDBGInterface newDBGInt;
+                               int sid=-1;
                                
-                               //System.out.println("Waiting for breakpoints.");                       
-                               try{
-                                       socket = server.accept();
-                                       //System.out.println("Accepted! : " + socket.toString());
-                               } catch (IOException e) {
-                                       PHPDebugCorePlugin.log(e);
-                                       return;                 
-                               }
+//                             synchronized (this) {
+//                                     wait();
+//                             }
                                
-                               PHPMainThread= new PHPThread(getDebugTarget(), 100);
+                               PHPMainThread = new PHPThread(getDebugTarget(), getPort());
                                PHPMainThread.setName("Thread [main]");
-                               while(getDebugTarget() == null) {
-                                       sleep(1000);
-                               }
+                               timeout = 0;
+                               
+//                             while ((getDebugTarget() == null) && (timeout < 100)) {
+//                                     sleep(100);
+//                                     timeout++;
+//                             }
+                               // Be sure debug target is set
+//                             PHPMainThread.setDebugTarget(getDebugTarget());
                                getDebugTarget().addThread(PHPMainThread);
-                               setDBGInterface(new PHPDBGInterface(getReader(), getOutputStream()));
-
-                               DBGInt.waitResponse(1000);
-                               DBGInt.flushAllPackets();
-
-                               // Check version and session ID
-                               setBreakPoints();
-                               DBGInt.continueExecution();
-
-                               while (!shouldStop) {
-                                       DBGInt.waitResponse(interval);
-                                       DBGInt.flushAllPackets();
+                               
+                               //System.out.println("Waiting for breakpoints.");       
+                               while (!shouldStop)     
+                               {       
+                                       newconnect=true;
+                                       try {
+                                               newSocket = server.accept();
+                //System.out.println("Accepted! : " + socket.toString());
+                                       } catch (SocketTimeoutException e) {
+                                               // no one wants to connect
+                                               newconnect=false;
+                                       } catch (IOException e) {
+                                               PHPDebugCorePlugin.log(e);
+                                               return;
+                                       }
+       
+                                       if (newconnect)
+                                       {
+                                               if (DBGInt==null)
+                                                       server.setSoTimeout(1);
+                                               newDBGInt= new PHPDBGInterface(getReader(newSocket), newSocket.getOutputStream(), thisProxy);
+                                               newDBGInt.waitResponse(1000);
+                                               newDBGInt.flushAllPackets();
+                                               // Check version and session ID
+                                               if ((DBGInt==null) || (DBGInt.getSID()==newDBGInt.getSID()))
+                                               {
+                                                       DBGInt=newDBGInt;
+                                                       try     {
+                                                               closeSocket();
+                                                       }       catch (IOException e) {
+                                                               PHPDebugCorePlugin.log(e);
+                                                               shouldStop=true;
+                                                       }
+                                                       socket=newSocket;
+                                                       setBreakPoints();
+                                                       DBGInt.continueExecution();                     
+                                               } else
+                                               {
+                                                       newDBGInt.continueExecution();
+                                                       newSocket.close();
+                                               }
+                                       }
+
+                                       if(DBGInt.waitResponse(interval))
+                                       {
+               
+                                               DBGInt.flushAllPackets();
+
+                                               if (DBGInt.BPUnderHit != 0) {
+                                                       StackList = DBGInt.getStackList();
+                                                       if (StackList.length > 0) {
+                                                               for (i = 0; i < StackList.length; i++) {
+                                                                       StackList[i].setThread(PHPMainThread);
+                                                                       if (DBGInt.getModByNo(StackList[i].getModNo()).equals("")) {
+                                                                               DBGInt.getSourceTree();
+                                                                       }
+                                                                       StackList[i].setFile(
+                                                                                       DBGInt.getModByNo(StackList[i].getModNo()));
+                                                               }
+                                                               PHPMainThread.setStackFrames(StackList);
+                                                       }
+                                                       // Fire debug event
+                                                       PHPMainThread.suspend();
 
-                                       if (DBGInt.BPUnderHit != 0) {
-                                               StackList= DBGInt.getStackList();
-                                               if(StackList.length > 0) {
-                                                       for(i=0; i < StackList.length; i++) {
-                                                               StackList[i].setThread(PHPMainThread);
-                                                               StackList[i].setFile(DBGInt.getModByNo(StackList[i].getModNo()));
+                                                       synchronized (this) {
+                                                               wait();
                                                        }
-                                                       PHPMainThread.setStackFrames(StackList);
                                                }
-                                               PHPMainThread.suspend();
-                                               
-                                               synchronized(this) {
-                                                       wait();
+                                       }
+                                       if (remote) {
+                                               if (PHPMainThread.isTerminated()) {
+                                                       shouldStop=true;
+                                                       break;
                                                }
-                                       }                                       
-                                       if(PHPMainThread.isTerminated() || getDebugTarget().getProcess().isTerminated()) break;
+                                       } else {
+                                               if (PHPMainThread.isTerminated() || getDebugTarget().getProcess().isTerminated()) {
+                                                       shouldStop=true;
+                                                       break;                   
+                                               }
+                                       }
                                }
-                       } catch (Exception ex) {
+                       } 
+                       catch (Exception ex) {
                                PHPDebugCorePlugin.log(ex);
                                System.out.println(ex);
-                       } finally {
+                       } 
+                       finally {
                                try {
                                        getDebugTarget().terminate();
                                        closeSocket();
@@ -327,8 +438,8 @@ public class PHPDBGProxy {
                                        PHPDebugCorePlugin.log(e);
                                        return;
                                }
-                               //System.out.println("Socket loop finished.");
+        //System.out.println("Socket loop finished.");
                        }
                }
-       }       
+       }
 }