X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/PHPDBGProxy.java b/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/PHPDBGProxy.java index feb5325..5c1f627 100644 --- a/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/PHPDBGProxy.java +++ b/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/PHPDBGProxy.java @@ -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; @@ -39,11 +43,19 @@ public class PHPDBGProxy { 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() { createServerSocket(); this.startPHPLoop(); @@ -52,10 +64,12 @@ public class PHPDBGProxy { public void stop() { phpLoop.setShouldStop(); if(DBGInt != null) DBGInt.setShouldStop(); - try { - getDebugTarget().getProcess().terminate(); - } catch (DebugException e) { - e.printStackTrace(); + if (!remote) { + try { + getDebugTarget().getProcess().terminate(); + } catch (DebugException e) { + e.printStackTrace(); + } } phpLoop.notifyWait(); } @@ -68,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; @@ -99,6 +114,13 @@ public class PHPDBGProxy { } 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(); @@ -117,8 +139,14 @@ public class PHPDBGProxy { try { PHPLineBreakpoint phpLBP; if(breakpoint.getModelIdentifier() == PHPDebugCorePlugin.getDefault().getDescriptor().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) { @@ -136,7 +164,13 @@ public class PHPDBGProxy { PHPLineBreakpoint phpLBP; if(breakpoint.getModelIdentifier() == PHPDebugCorePlugin.getDefault().getDescriptor().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); @@ -146,6 +180,10 @@ public class PHPDBGProxy { stop(); } } + + public void phpLoopNotify (){ + phpLoop.notifyWait(); + } public void startPHPLoop() { phpLoop = new PHPLoop(); @@ -278,77 +316,130 @@ public class PHPDBGProxy { try { char[] buf= new char[16]; int i, pos, timeout; - long interval= 1000*20; + 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(), getPort()); + PHPMainThread = new PHPThread(getDebugTarget(), getPort()); PHPMainThread.setName("Thread [main]"); - timeout= 0; - while((getDebugTarget() == null) && (timeout < 100)) { - sleep(100); - timeout++; - } + timeout = 0; + +// while ((getDebugTarget() == null) && (timeout < 100)) { +// sleep(100); +// timeout++; +// } // Be sure debug target is set - PHPMainThread.setDebugTarget(getDebugTarget()); +// PHPMainThread.setDebugTarget(getDebugTarget()); getDebugTarget().addThread(PHPMainThread); - setDBGInterface(new PHPDBGInterface(getReader(), getOutputStream(), thisProxy)); - - DBGInt.waitResponse(1000); - DBGInt.flushAllPackets(); - - // Check version and session ID - setBreakPoints(); - DBGInt.continueExecution(); - - while (!shouldStop) { - 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())); + + //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; } - PHPMainThread.setStackFrames(StackList); - } - // Fire debug event - PHPMainThread.suspend(); - - synchronized(this) { - wait(); - } - } - if(PHPMainThread.isTerminated() || getDebugTarget().getProcess().isTerminated()) break; + 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(); + + synchronized (this) { + wait(); + } + } + } + if (remote) { + if (PHPMainThread.isTerminated()) + { + shouldStop=true; + break; + } + } else { + if (PHPMainThread.isTerminated() || getDebugTarget().getProcess().isTerminated()) + { + shouldStop=true; + break; + } + } } - } catch (Exception ex) { - PHPDebugCorePlugin.log(ex); - System.out.println(ex); - } finally { - try { - getDebugTarget().terminate(); - closeSocket(); - closeServerSocket(); - } catch (IOException e) { - PHPDebugCorePlugin.log(e); - return; - } - //System.out.println("Socket loop finished."); - } + } + catch (Exception ex) { + PHPDebugCorePlugin.log(ex); + System.out.println(ex); + } + finally { + try { + getDebugTarget().terminate(); + closeSocket(); + closeServerSocket(); + } + catch (IOException e) { + PHPDebugCorePlugin.log(e); + return; + } + //System.out.println("Socket loop finished."); + } } } }