1 package net.sourceforge.phpeclipse.xdebug.core.xdebug;
 
   3 import java.io.DataInputStream;
 
   4 import java.io.EOFException;
 
   5 import java.io.IOException;
 
   6 import java.io.OutputStreamWriter;
 
   7 import java.io.UnsupportedEncodingException;
 
   8 import java.net.Socket;
 
  10 import net.sourceforge.phpeclipse.xdebug.core.Base64;
 
  11 import net.sourceforge.phpeclipse.xdebug.core.PHPDebugUtils;
 
  12 import net.sourceforge.phpeclipse.xdebug.core.XDebugCorePlugin;
 
  14 import org.eclipse.core.runtime.IStatus;
 
  17  * @author Christian Perkonig
 
  20 public class XDebugConnection {
 
  21         private int fTransactionID;
 
  22         private Socket fDebugSocket;
 
  23         private OutputStreamWriter fDebugWriter;
 
  24         private DataInputStream fDebugReader;
 
  25         private boolean fInitialized;
 
  26         private boolean fIsClosed;
 
  27         private String fSessionID;
 
  29         public String getSessionID() {
 
  33         public boolean isInitialized() {
 
  37         public boolean isClosed() {
 
  41         public XDebugConnection(Socket debugSocket) {
 
  42                 fDebugSocket = debugSocket;
 
  46                         fDebugWriter = new OutputStreamWriter(debugSocket.getOutputStream(), "UTF8");
 
  47                         fDebugReader = new DataInputStream(debugSocket.getInputStream()); 
 
  48                 } catch (UnsupportedEncodingException e) {
 
  50                 } catch (IOException e) {
 
  56                 String initString = readData();
 
  57                 XDebugCorePlugin.log(IStatus.INFO,initString);
 
  59                 int startIdx = initString.indexOf("idekey=\"");
 
  63                 int endIdx=initString.indexOf('"',startIdx);
 
  66                 fSessionID = initString.substring(startIdx,endIdx);
 
  70         protected String readData()     {
 
  74         byte byteBuffer[]=null,b;
 
  78                         while ((b =fDebugReader.readByte()) != 0) {
 
  79                                 count = count * 10 + b - '0';
 
  81                         byteBuffer = new byte[count];
 
  84                         while ((count >0) && (attempts <5)) {
 
  85                                 int rc=fDebugReader.read(byteBuffer,readCount,count);
 
  91                                         } catch (InterruptedException e) {
 
  97                         fDebugReader.readFully(byteBuffer,readCount,count);
 
  99                         if((b= fDebugReader.readByte())!=0) // reads the NULL Byte at the end;
 
 100                                 System.out.println("NULL-Byte missing!!"); 
 
 101                 } catch (IOException e) {
 
 102                         if (e instanceof EOFException == false) {
 
 104 //                                      e.printStackTrace();
 
 109                 return new String(byteBuffer);
 
 112         private /*XDebugResponse*/ int sendRequest(String command, String arguments) {
 
 113                 return _sendRequest(command, arguments);
 
 116         private synchronized int _sendRequest(String command, String arguments) {
 
 117                 if (fDebugSocket == null) {
 
 121                 XDebugCorePlugin.log(IStatus.INFO,command+" -i "+fTransactionID+" "+arguments);
 
 122                 synchronized (fDebugSocket) {
 
 124                                 fDebugWriter.write(command);
 
 125                                 fDebugWriter.write(" -i " + fTransactionID);
 
 126                                 if (!"".equals(arguments))
 
 127                                         fDebugWriter.write(" " + arguments);
 
 128                                 fDebugWriter.write(0);
 
 129                                 fDebugWriter.flush();
 
 130                         } catch (IOException e) {
 
 135                 return fTransactionID++;
 
 138         public /*XDebugResponse*/ int eval(String Expression) {
 
 139                 String encoded = Base64.encodeBytes(Expression.getBytes());
 
 141                 return sendRequest("eval", "-- "+encoded);
 
 144         public /*XDebugResponse*/ int featureGet(String featureName) {
 
 145                 return sendRequest("feature_get","-n "+featureName);
 
 148         public int  featureSet(String featureName, String value) {
 
 149                 return sendRequest("feature_set","-n "+featureName + " -v " + value);
 
 152         public /*XDebugResponse*/ int  breakpointSetOld(String file, int lineNumber) {
 
 153                 String arg = "-t line -f file://"+PHPDebugUtils.escapeString(file)+" -n " + lineNumber;
 
 154                 return sendRequest("breakpoint_set", arg);              
 
 157         public /*XDebugResponse*/ int  breakpointSet(String file, int lineNumber, int hitCount) {
 
 158                 String arg = "-t line -f file://"+PHPDebugUtils.escapeString(file)+" -n " + lineNumber;
 
 160                         arg += " -h " + hitCount;       
 
 162                 return sendRequest("breakpoint_set", arg);              
 
 165         public int  breakpointGet(int id) {
 
 166                 String arg = "-d " + id;
 
 168                 return sendRequest("breakpoint_get", arg);              
 
 171         public /*XDebugResponse*/ int  breakpointRemove(int id) {
 
 172                 return sendRequest("breakpoint_set", "-d " + id);
 
 175         public /*XDebugResponse*/ int  stackGet(/*int Level*/) {
 
 176                 return sendRequest("stack_get", "");                    
 
 179         public void stepOver() {
 
 180                 sendRequest("step_over", "");
 
 183         public void stepInto() {
 
 184                 sendRequest("step_into", "");
 
 187         public void stepOut() {
 
 188                 sendRequest("step_out", "");
 
 192                 sendRequest("run", "");
 
 196                 sendRequest("stop", "");
 
 199         public /*XDebugResponse*/ int  propertySet(String Name, String Value) {
 
 200                 String str = Base64.encodeBytes(Value.getBytes());
 
 201                 int len = str.length();
 
 203                 return sendRequest("property_set", "-n " + Name + " -d 0 -l " + len + " -- " + str);
 
 206         public /*XDebugResponse*/ int  contextGet(int Level, int Type) {
 
 207                 return sendRequest("context_get", "-d " + Level + " -c " + Type);
 
 210         public int setVarValue(String Name, String Value) {
 
 211                 return propertySet(Name, Value);
 
 214         public void close() {
 
 218                                 fDebugSocket.close();
 
 219                                 fDebugReader.close();
 
 220                                 //fDebugReader = null;
 
 221                                 fDebugWriter.close();
 
 222                         } catch (IOException e) {