+++ /dev/null
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp. and others.
-All rights reserved. This program and the accompanying materials
-are made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-
-Contributors:
- Vicente Fernando - www.alfersoft.com.ar - Initial implementation
- Christian Perkonig - remote debug
-**********************************************************************/
-package net.sourceforge.phpdt.internal.debug.core;
-
-import java.io.IOException;
-import java.io.BufferedReader;
-import java.io.OutputStream;
-import java.util.Vector;
-import java.lang.System;
-import org.eclipse.debug.core.DebugException;
-import net.sourceforge.phpdt.internal.debug.core.model.PHPStackFrame;
-import net.sourceforge.phpdt.internal.debug.core.model.PHPVariable;
-import net.sourceforge.phpdt.internal.debug.core.model.PHPValue;
-import net.sourceforge.phpdt.internal.debug.core.PHPDBGMod;
-
-public class PHPDBGInterface {
-
- // Public
- public boolean sessionEnded= false;
- public int sessType= -1;
- public int BPUnderHit= 0;
- public String sessID= new String();
-
- // Private
- private int[] LastBPRead= new int[10];
- private Vector DBGBPList= new Vector();
- private PHPStackFrame[] DBGStackList;
- private PHPVariable[] DBGVariableList;
- private Vector DBGMods= new Vector();
- private Vector DBGVars= new Vector();
- private BufferedReader in;
- private OutputStream os;
- private boolean shouldStop= false, isRef= false, hasChildren= false, isObject= false;
- private String evalRet= new String("");
- private String serGlobals= new String("");
- private String typeRead= new String("");
- private String className= new String("");
- private int finalPos=0, refCounter=0, rawCounter=1000;
- private PHPDBGProxy proxy= null;
- private int lastCmd=-1;
- private int sid=0;
-
- public PHPDBGInterface(BufferedReader in, OutputStream os, PHPDBGProxy proxy) {
- DBGBPList.clear();
- this.in= in;
- this.os= os;
- this.proxy= proxy;
- }
-
- public int addBreakpoint(String mod_name, int line) throws IOException {
- return setBreakpoint(mod_name, "", line, PHPDBGBase.BPS_ENABLED + PHPDBGBase.BPS_UNRESOLVED, 0, 0, 0, 0, 0);
- }
-
- public void removeBreakpoint(String mod_name, int line, int bpNo) throws IOException {
- setBreakpoint(mod_name, "", line, PHPDBGBase.BPS_DISABLED, 0, 0, 0, bpNo, 0);
- }
-
- public void requestDBGVersion() throws IOException {
- PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST);
- PHPDBGFrame DBGFrame= new PHPDBGFrame(PHPDBGBase.FRAME_VER);
-
- DBGPacket.addFrame(DBGFrame);
-
- if(proxy.getSocket().isClosed()) return;
- DBGPacket.sendPacket(os);
- }
-
- public void getSourceTree() throws IOException {
- PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST);
- PHPDBGFrame DBGFrame= new PHPDBGFrame(PHPDBGBase.FRAME_SRC_TREE);
-
- DBGPacket.addFrame(DBGFrame);
-
- if(proxy.getSocket().isClosed()) return;
- DBGPacket.sendPacket(os);
-
- // Wait response (1 second) and read response
- waitResponse(1000);
- flushAllPackets();
- }
-
- public void addDBGModName(String modName) throws IOException {
- PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST);
- PHPDBGFrame DBGFrame= new PHPDBGFrame(PHPDBGBase.FRAME_RAWDATA);
-
- rawCounter++;
- DBGFrame.addInt(rawCounter); // FRAME_RAWDATA ID
- DBGFrame.addInt(modName.length() + 1); // length of rawdata (+ null char)
- DBGFrame.addString(modName); // file name
- DBGFrame.addChar('\0'); // null char
-
- DBGPacket.addFrame(DBGFrame);
-
- if(proxy.getSocket().isClosed()) return;
- DBGPacket.sendPacket(os);
- }
-
- // Returns DBG Breakpoint ID
- private int setBreakpoint(String mod_name, String condition, int line, int state, int istemp, int hitcount, int skiphits, int bpno, int isunderhit) throws IOException {
- int modNo= 0;
-
- PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST);
- PHPDBGFrame DBGFrame1= new PHPDBGFrame(PHPDBGBase.FRAME_BPS);
- PHPDBGFrame DBGFrame2= new PHPDBGFrame(PHPDBGBase.FRAME_RAWDATA);
-
- modNo= getModByName(mod_name);
-
- if(modNo >= 0) {
- DBGFrame1.addInt(modNo); // mod number
- } else {
- DBGFrame1.addInt(0); // mod number (0 use file name)
- }
-
- DBGFrame1.addInt(line); // line number
-
- if(modNo >= 0) {
- DBGFrame1.addInt(0); // use mod number
- } else {
- rawCounter++;
- DBGFrame1.addInt(rawCounter); // ID of FRAME_RAWDATA to send file name
- }
-
- DBGFrame1.addInt(state); // state BPS_*
- DBGFrame1.addInt(istemp); // istemp
- DBGFrame1.addInt(hitcount); // hit count
- DBGFrame1.addInt(skiphits); // skip hits
- DBGFrame1.addInt(0); // ID of condition
- DBGFrame1.addInt(bpno); // breakpoint number
- DBGFrame1.addInt(isunderhit); // is under hit
-
- if(modNo < 0) {
- DBGFrame2.addInt(rawCounter); // FRAME_RAWDATA ID
- DBGFrame2.addInt(mod_name.length() + 1); // length of rawdata (+ null char)
- DBGFrame2.addString(mod_name); // file name
- DBGFrame2.addChar('\0'); // null char
- // First add file name data
- DBGPacket.addFrame(DBGFrame2);
- }
-
- // Second add command data
- DBGPacket.addFrame(DBGFrame1);
-
- if(proxy.getSocket().isClosed()) return 0;
- DBGPacket.sendPacket(os);
-
- clearLastBP();
-
- // Wait response (1 second) and read response
- waitResponse(1000);
- flushAllPackets();
-
- return LastBPRead[8];
- }
-
- private void clearLastBP() {
- int i;
-
- for(i=0; i < LastBPRead.length; i++)
- LastBPRead[i]= 0;
- }
-
- private void copyToLastBP(int[] BPBody) {
- int i;
-
- for(i=0; i < LastBPRead.length; i++)
- LastBPRead[i]= BPBody[i];
- }
-
- public void continueExecution() throws IOException {
- BPUnderHit= 0;
- PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_CONTINUE);
- if(proxy.getSocket().isClosed()) return;
- DBGPacket.sendPacket(os);
- }
-
- private int getBPUnderHit() {
- int i, BPUnder=0;
- int[] dbg_bpl_body= new int[10];
-
- // look for bp under hit
- for(i=0; i < DBGBPList.size(); i++) {
- dbg_bpl_body= (int[]) DBGBPList.get(i);
- if(dbg_bpl_body[9] == 1) {
- BPUnder= dbg_bpl_body[8];
- }
- }
- return BPUnder;
- }
-
- public int getLastCmd()
- {
- return lastCmd;
- }
-
- public int getSID()
- {
- return sid;
- }
-
- public void setLastCmd(int cmd)
- {
- lastCmd=cmd;
- }
-
- public void stepInto() throws IOException {
- BPUnderHit= 0;
- PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_STEPINTO);
- if(proxy.getSocket().isClosed()) return;
- DBGPacket.sendPacket(os);
- }
-
- public void stepOver() throws IOException {
- BPUnderHit= 0;
- PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_STEPOVER);
- if(proxy.getSocket().isClosed()) return;
- DBGPacket.sendPacket(os);
- }
-
- public void stepOut() throws IOException {
- BPUnderHit= 0;
- PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_STEPOUT);
- if(proxy.getSocket().isClosed()) return;
- DBGPacket.sendPacket(os);
- }
-
- public void stopExecution() throws IOException {
- BPUnderHit= 0;
- PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_STOP);
- if(proxy.getSocket().isClosed()) return;
- DBGPacket.sendPacket(os);
- }
-
- public PHPVariable[] getVariables(PHPStackFrame stack) throws IOException, DebugException {
- PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST);
- PHPDBGFrame DBGFrame1= new PHPDBGFrame(PHPDBGBase.FRAME_EVAL);
- //PHPDBGFrame DBGFrame2= new PHPDBGFrame(PHPDBGBase.FRAME_RAWDATA);
-
- DBGFrame1.addInt(0); // istr = raw data ID
- DBGFrame1.addInt(1); // scope_id = -1 means current location, 0 never used, +1 first depth
-
- /*
- String evalBlock= new String("$GLOBALS");
- DBGFrame2.addInt(1); // FRAME_RAWDATA ID
- DBGFrame2.addInt(evalBlock.length() + 1); // length of rawdata (+ null char)
- DBGFrame2.addString(evalBlock); // eval block
- DBGFrame2.addChar('\0'); // null char
- */
-
- // Add command data
- DBGPacket.addFrame(DBGFrame1);
-
- if(proxy.getSocket().isClosed()) return null;
- DBGPacket.sendPacket(os);
-
- waitResponse(1000);
- flushAllPackets();
-
- // Process serialized variables
- DBGVariableList= procVars(stack);
-
- return DBGVariableList;
- }
-
- public void evalBlock(String evalString) throws IOException, DebugException {
- PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST);
- PHPDBGFrame DBGFrame1= new PHPDBGFrame(PHPDBGBase.FRAME_EVAL);
- PHPDBGFrame DBGFrame2= new PHPDBGFrame(PHPDBGBase.FRAME_RAWDATA);
-
- rawCounter++;
- DBGFrame1.addInt(rawCounter); // istr = raw data ID
- DBGFrame1.addInt(1); // scope_id = -1 means current location, 0 never used, +1 first depth
-
- DBGFrame2.addInt(rawCounter); // FRAME_RAWDATA ID
- DBGFrame2.addInt(evalString.length() + 1); // length of rawdata (+ null char)
- DBGFrame2.addString(evalString); // eval block
- DBGFrame2.addChar('\0'); // null char
-
- // Add raw data first
- DBGPacket.addFrame(DBGFrame2);
- // Add command data
- DBGPacket.addFrame(DBGFrame1);
-
- if(proxy.getSocket().isClosed()) return;
- DBGPacket.sendPacket(os);
-
- waitResponse(1000);
- flushAllPackets();
- }
-
- public void flushAllPackets() throws IOException {
- while(readResponse() != 0);
- }
-
- public String getModByNo(int modNo) {
- int i;
- PHPDBGMod dbg_mod;
-
- // look for mod
- for(i=0; i < DBGMods.size(); i++) {
- dbg_mod= (PHPDBGMod) DBGMods.get(i);
- if(dbg_mod.getNo() == modNo) {
- return dbg_mod.getName();
- }
- }
- return "";
- }
-
- private int getModByName(String modName) {
- int i;
- PHPDBGMod dbg_mod;
-
- // look for mod
- for(i=0; i < DBGMods.size(); i++) {
- dbg_mod= (PHPDBGMod) DBGMods.get(i);
- if(dbg_mod.getName().equalsIgnoreCase(modName)) {
- return dbg_mod.getNo();
- }
- }
- return -1;
- }
-
- private String getRawFrameData(char[] framesInfo, int frameNo) {
- int nextFrame= 0;
- int[] dbg_frame= new int[2];
-
- while(nextFrame < framesInfo.length) {
- dbg_frame[0] = PHPDBGBase.Char4ToInt(framesInfo, nextFrame); // frame name
- dbg_frame[1] = PHPDBGBase.Char4ToInt(framesInfo, nextFrame + 4); // frame size
-
- nextFrame += 8;
- if(dbg_frame[1] == 0) return "";
-
- switch(dbg_frame[0]) {
- case PHPDBGBase.FRAME_RAWDATA:
- if(frameNo == PHPDBGBase.Char4ToInt(framesInfo, nextFrame)) {
- int toRead= PHPDBGBase.Char4ToInt(framesInfo, nextFrame + 4);
- return String.copyValueOf(framesInfo, nextFrame + 8, toRead);
- }
- break;
- }
- // go to next frame
- nextFrame += dbg_frame[1];
- }
- return "";
- }
-
- public PHPVariable[] getInstVars(PHPVariable phpVar) throws DebugException {
- Vector vecVars= new Vector();
- PHPVariable localPHPVar;
- int i=0;
-
- // already unserialized
- for(i=0; i < DBGVars.size(); i++) {
- localPHPVar= (PHPVariable)DBGVars.get(i);
- if(localPHPVar.getParent() == phpVar) {
- vecVars.add(localPHPVar);
- }
- }
- PHPVariable[] arrVars= new PHPVariable[vecVars.size()];
- arrVars= (PHPVariable[]) vecVars.toArray(arrVars);
-
- return arrVars;
- }
-
- private PHPVariable[] procVars(PHPStackFrame stack) throws DebugException {
- Vector vecVars= new Vector();
-
- // unserialize
- finalPos= 0;
- refCounter= 0;
- doUnserialize(stack, vecVars, null);
-
- DBGVars= vecVars;
-
- return(getInstVars(null));
- }
-
- private String readValue(String serialVars) throws DebugException {
- int startPos=0, endPos=0, lenStr=0, i=0, elements=0;
- String ret= new String("");
-
- switch(serialVars.charAt(0)) {
- case 'a': // associative array, a:elements:{[index][value]...}
- typeRead= "hash";
- startPos= 1;
- endPos= serialVars.indexOf(':', startPos + 1);
- if(endPos == -1) return "";
- finalPos += endPos + 2;
- ret= new String(serialVars.substring(startPos + 1, endPos));
-
- hasChildren= true;
- break;
- case 'O': // object, O:name_len:"name":elements:{[attribute][value]...}
- typeRead= "object";
-
- startPos= 1;
- endPos= serialVars.indexOf(':', startPos + 1);
- if(endPos == -1) return "";
-
- // get object class
- lenStr= Integer.parseInt(serialVars.substring(startPos + 1, endPos));
- startPos= endPos + 2;
- endPos= lenStr + startPos;
- className= new String(serialVars.substring(startPos, endPos).toString());
-
- // get num of elements
- startPos= endPos + 1;
- endPos= serialVars.indexOf(':', startPos + 1);
- if(endPos == -1) return "";
- finalPos += endPos + 2;
- ret= new String(serialVars.substring(startPos + 1, endPos));
-
- isObject= true;
- hasChildren= true;
- break;
- case 's': // string, s:length:"data";
- typeRead= "string";
- startPos= 1;
- endPos= serialVars.indexOf(':', startPos + 1);
- if(endPos == -1) return "";
-
- lenStr= Integer.parseInt(serialVars.substring(startPos + 1, endPos));
- startPos= endPos + 2;
- endPos= lenStr + startPos;
- ret= new String(serialVars.substring(startPos, endPos).toString());
- finalPos += endPos + 2;
- break;
- case 'i': // integer, i:123;
- typeRead= "integer";
- startPos= 1;
- endPos= serialVars.indexOf(';', startPos + 1);
- if(endPos == -1) return "";
-
- ret= new String(serialVars.substring(startPos + 1, endPos).toString());
- finalPos += endPos + 1;
- break;
- case 'd': // double (float), d:1.23;
- typeRead= "double";
- startPos= 1;
- endPos= serialVars.indexOf(';', startPos + 1);
- if(endPos == -1) return "";
-
- ret= new String(serialVars.substring(startPos + 1, endPos).toString());
- finalPos += endPos + 1;
- break;
- case 'N': // NULL, N;
- typeRead= "null";
- ret= "nil";
- finalPos += 2;
- break;
- case 'b': // bool, b:0 or 1
- typeRead= "boolean";
- ret= (serialVars.charAt(2) == '1')?"true":"false";
- finalPos += endPos + 4;
- break;
- case 'z': // resource, z:typename_len:"typename":valres;
- typeRead= "resource";
-
- startPos= 1;
- endPos= serialVars.indexOf(':', startPos + 1);
- if(endPos == -1) return "";
-
- // get resource type name
- lenStr= Integer.parseInt(serialVars.substring(startPos + 1, endPos));
- startPos= endPos + 2;
- endPos= lenStr + startPos;
- className= new String(serialVars.substring(startPos, endPos).toString());
-
- // get resource value
- startPos= endPos + 1;
- endPos= serialVars.indexOf(';', startPos + 1);
- if(endPos == -1) return "";
- ret= new String(serialVars.substring(startPos + 1, endPos));
- finalPos += endPos + 1;
- break;
- case 'r':
- case 'R':
- typeRead= "reference";
- startPos= 1;
- endPos= serialVars.indexOf(';', startPos + 1);
- if(endPos == -1) return "0";
-
- ret= new String(serialVars.substring(startPos + 1, endPos));
- finalPos += endPos + 1;
- isRef= true;
- break;
- case ';':
- typeRead= "unknown";
- finalPos+= 1;
- break;
- case '?':
- finalPos+= 1;
- default:
- finalPos+= 1;
- typeRead= "unknown";
- break;
- }
- return ret;
- }
-
- private void doUnserialize(PHPStackFrame stack, Vector vecVars, PHPVariable parent) throws DebugException {
- int i, elements= 0;
- PHPVariable newVar= null;
- String value= new String("");
- String name= new String("");
- String tmp= new String("");
- String[] tmpSplit;
-
- if(finalPos > serGlobals.length() || serGlobals.equals("") || serGlobals.substring(finalPos).equals("")) return;
-
- isRef= false;
- hasChildren= false;
- isObject= false;
- name= readValue(serGlobals.substring(finalPos));
-
- if(hasChildren) {
- // main array
- if(refCounter == 0) {
- value= name;
- name= "";
- }
- } else {
- hasChildren= false;
- isRef= false;
- value= readValue(serGlobals.substring(finalPos));
- // replaceAll doesn't work, why???
- tmpSplit= value.split("\\\\");
- value= "";
- for(i= 0; i < tmpSplit.length; i++) {
- value= value + tmpSplit[i];
- if(!tmpSplit[i].equals("")) {
- if(i < (tmpSplit.length - 1)) {
- value= value + "\\";
- }
- }
- }
- }
-
- if(!name.equals("")) {
- if(isRef) {
- PHPVariable varPHP;
- for(i=0; i < vecVars.size(); i++) {
- varPHP= (PHPVariable) vecVars.get(i);
- if(varPHP.getObjectId().equals(value)) {
- newVar= new PHPVariable(stack, name, "local", true, (PHPValue)varPHP.getValue());
- break;
- }
- }
- if(newVar == null) {
- newVar= new PHPVariable(stack, name, "local", false, null);
- }
- } else {
- refCounter++;
- newVar= new PHPVariable(stack, name, "local", value, typeRead, hasChildren, Integer.toString(refCounter), className);
- }
- newVar.setParent(parent);
- vecVars.add(newVar);
- }
- if(hasChildren) {
- elements= Integer.parseInt(value);
- for(i=0; i < elements; i++)
- doUnserialize(stack, vecVars, newVar);
-
- // skip "}"
- finalPos += 1;
- }
- }
-
- public int readResponse() throws IOException {
- int bytesToRead=0, nextFrame=0, i=0, cmdReceived=0, stackIndex=0;
- char[] dbg_header_struct_read= new char[16];
- int[] dbg_header_struct= new int[4];
- int[] dbg_bpl_tmp= new int[10];
- int[] dbg_frame= new int[2];
- int[] dbg_eval_tmp= new int[3];
- int[] dbg_src_tree_tmp= new int[4];
- Vector rawList= new Vector();
- Vector stackList= new Vector();
- PHPStackFrame[] newStackList;
-
- rawList.clear();
- stackList.clear();
- // Read from input
- while(readInput(dbg_header_struct_read, 16) != 0) {
- dbg_header_struct[0] = PHPDBGBase.Char4ToInt(dbg_header_struct_read, 0);
- dbg_header_struct[1] = PHPDBGBase.Char4ToInt(dbg_header_struct_read, 4);
- dbg_header_struct[2] = PHPDBGBase.Char4ToInt(dbg_header_struct_read, 8);
- dbg_header_struct[3] = PHPDBGBase.Char4ToInt(dbg_header_struct_read, 12);
-
- // Check DBG sync bytes
- if(dbg_header_struct[0] != 0x5953) return 0;
-
- cmdReceived= dbg_header_struct[1];
- setLastCmd(cmdReceived);
- bytesToRead= dbg_header_struct[3];
-
- //System.out.println("Response Received: " + cmdReceived);
- char[] entirePack= new char[bytesToRead];
-
- if(bytesToRead > 0) {
- if(readInput(entirePack, bytesToRead) < bytesToRead) return 0;
- }
-
- // First process frames
- nextFrame= 0;
- while(nextFrame < bytesToRead) {
- dbg_frame[0] = PHPDBGBase.Char4ToInt(entirePack, nextFrame); // frame name
- dbg_frame[1] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 4); // frame size
- nextFrame += 8;
- if(dbg_frame[1] == 0) return 0;
- switch(dbg_frame[0]) {
- case PHPDBGBase.FRAME_STACK:
- int[] dbg_stack_new= new int[4];
- dbg_stack_new[0] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 0); // line no
- dbg_stack_new[1] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 4); // mod no
- dbg_stack_new[2] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 8); // scope id
- dbg_stack_new[3] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 12); // id of description string
-
- stackIndex++;
- if(dbg_stack_new[1] != 0) {
- PHPStackFrame newStack= new PHPStackFrame(null, getModByNo(dbg_stack_new[1]), dbg_stack_new[0], stackIndex, getRawFrameData(entirePack, dbg_stack_new[3]), dbg_stack_new[1]);
- stackList.add(newStack);
- }
- break;
- case PHPDBGBase.FRAME_SOURCE:
- break;
- case PHPDBGBase.FRAME_SRC_TREE:
- dbg_src_tree_tmp[0] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 0); // parent_mod_no
- dbg_src_tree_tmp[1] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 4); // parent_line_no /* NOT USED */
- dbg_src_tree_tmp[2] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 8); // mod_no
- dbg_src_tree_tmp[3] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 12); // imod_name
-
- if(getModByNo(dbg_src_tree_tmp[2]).equals("")) {
- String fileName= new String(getRawFrameData(entirePack, dbg_src_tree_tmp[3]));
- // Remove '\0' char
- if(fileName.length() > 0) fileName= fileName.substring(0, fileName.length() - 1);
-
- if(dbg_src_tree_tmp[2] != 0) {
- PHPDBGMod modNew= new PHPDBGMod(dbg_src_tree_tmp[2], fileName);
- DBGMods.add(modNew);
- }
- }
- break;
- case PHPDBGBase.FRAME_RAWDATA:
- break;
- case PHPDBGBase.FRAME_ERROR:
- break;
- case PHPDBGBase.FRAME_EVAL:
- String evalString= new String("");
- dbg_eval_tmp[0] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 0); // istr
- dbg_eval_tmp[1] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 4); // iresult
- dbg_eval_tmp[2] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 8); // ierror
-
- evalRet= getRawFrameData(entirePack, dbg_eval_tmp[1]);
- evalString= getRawFrameData(entirePack, dbg_eval_tmp[0]);
- serGlobals= evalRet;
- break;
- case PHPDBGBase.FRAME_BPS:
- break;
- case PHPDBGBase.FRAME_BPL:
- int[] dbg_bpl_new= new int[10];
- dbg_bpl_new[0] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 0);
- dbg_bpl_new[1] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 4);
- dbg_bpl_new[2] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 8);
- dbg_bpl_new[3] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 12);
- dbg_bpl_new[4] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 16);
- dbg_bpl_new[5] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 20);
- dbg_bpl_new[6] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 24);
- dbg_bpl_new[7] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 28);
- dbg_bpl_new[8] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 32);
- dbg_bpl_new[9] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 36);
-
- // look if breakpoint already exists in vector
- for(i=0; i < DBGBPList.size(); i++) {
- dbg_bpl_tmp= (int[]) DBGBPList.get(i);
- if(dbg_bpl_tmp[8] == dbg_bpl_new[8]) {
- DBGBPList.remove(i);
- break;
- }
- }
-
- // add breakpoint to vector
- DBGBPList.add(dbg_bpl_new);
- copyToLastBP(dbg_bpl_new);
-
- // mod no returned?
- if(getModByNo(dbg_bpl_new[0]).equals("")) {
- String fileName= new String(getRawFrameData(entirePack, dbg_bpl_new[2]));
- // Remove '\0' char
- if(fileName.length() > 0) fileName= fileName.substring(0, fileName.length() - 1);
- if(dbg_bpl_new[0] != 0) {
- PHPDBGMod modNew= new PHPDBGMod(dbg_bpl_new[0], fileName);
- DBGMods.add(modNew);
- }
- }
- break;
- case PHPDBGBase.FRAME_VER:
- break;
- case PHPDBGBase.FRAME_SID:
- sid = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 0);
- break;
- case PHPDBGBase.FRAME_SRCLINESINFO:
- break;
- case PHPDBGBase.FRAME_SRCCTXINFO:
- break;
- case PHPDBGBase.FRAME_LOG:
- break;
- case PHPDBGBase.FRAME_PROF:
- break;
- case PHPDBGBase.FRAME_PROF_C:
- break;
- case PHPDBGBase.FRAME_SET_OPT:
- break;
- }
- // go to next frame
- nextFrame += dbg_frame[1];
- }
-
- // Now process command
- switch(cmdReceived) {
- case PHPDBGBase.DBGC_REPLY:
- break;
- case PHPDBGBase.DBGC_STARTUP:
- break;
- case PHPDBGBase.DBGC_END:
- sessionEnded= true;
- break;
- case PHPDBGBase.DBGC_BREAKPOINT:
- newStackList= new PHPStackFrame[stackList.size()];
- newStackList= (PHPStackFrame[]) stackList.toArray(newStackList);
- DBGStackList= newStackList;
- BPUnderHit= getBPUnderHit();
- break;
- case PHPDBGBase.DBGC_STEPINTO_DONE:
- case PHPDBGBase.DBGC_STEPOVER_DONE:
- case PHPDBGBase.DBGC_STEPOUT_DONE:
- case PHPDBGBase.DBGC_EMBEDDED_BREAK:
- BPUnderHit= 1;
- newStackList= new PHPStackFrame[stackList.size()];
- newStackList= (PHPStackFrame[]) stackList.toArray(newStackList);
- DBGStackList= newStackList;
- break;
- case PHPDBGBase.DBGC_ERROR:
- newStackList= new PHPStackFrame[stackList.size()];
- newStackList= (PHPStackFrame[]) stackList.toArray(newStackList);
- DBGStackList= newStackList;
- break;
- case PHPDBGBase.DBGC_LOG:
- break;
- case PHPDBGBase.DBGC_SID:
- break;
- case PHPDBGBase.DBGC_PAUSE:
- break;
- }
- }
-
- return cmdReceived;
- }
-
- public PHPStackFrame[] getStackList() {
- return DBGStackList;
- }
-
- private int readInput(char[] buffer, int bytes) throws IOException {
- int bytesRead= 0;
-
- for(int i=0; i < bytes; i++) {
- if(in.ready()) {
- buffer[i]= (char) (in.read() & 0x00FF);
- bytesRead++;
- }
- else
- break;
- }
- return bytesRead;
- }
-
- public void setShouldStop() {
- this.shouldStop= true;
- }
-
- public boolean waitResponse(long milliseconds) throws IOException {
- long timeout= System.currentTimeMillis() + milliseconds;
- while(System.currentTimeMillis() < timeout) {
- if(in.ready() || shouldStop) {
- break;
- }
- }
- return in.ready();
- }
-}
\ No newline at end of file
+++ /dev/null
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp. and others.
-All rights reserved. This program and the accompanying materials
-are made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-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;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-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;
-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.breakpoints.PHPLineBreakpoint;
-
-public class PHPDBGProxy {
-
- private ServerSocket server= null;
- private Socket socket;
- private BufferedReader reader= null;
- private PHPDBGInterface DBGInt= null;
- 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() {
- createServerSocket();
- this.startPHPLoop();
- }
-
- public void stop() {
- phpLoop.setShouldStop();
- if(DBGInt != null) DBGInt.setShouldStop();
- phpLoop.notifyWait();
- }
-
- protected ServerSocket getServerSocket() throws IOException {
- if (server == null) {
- createServerSocket();
- }
- return server;
- }
-
- protected void createServerSocket() {
-// port = SocketUtil.findUnusedLocalPort("localhost", 10001, 10101);
- port = 10001;
- if (port == -1) {
- PHPDebugCorePlugin.log(5, "Cannot find free port!!!!");
- return;
- }
- try {
- if (server == null) {
- server = new ServerSocket(port);
- //System.out.println("ServerSocket on port: " + port);
- }
- } catch (IOException e) {
- // IO Error
- PHPDebugCorePlugin.log(e);
- stop();
- }
- }
-
- public Socket getSocket() throws IOException {
- return socket;
- }
-
- protected void setDBGInterface(PHPDBGInterface DBGInt) {
- this.DBGInt= DBGInt;
- }
-
- public BufferedReader getReader() throws IOException {
- 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();
- }
-
- protected void setBreakPoints() throws IOException, CoreException {
- IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints();
- for (int i = 0; i < breakpoints.length; i++) {
- addBreakpoint(breakpoints[i]);
- }
- }
-
- public void addBreakpoint(IBreakpoint breakpoint) {
- if (DBGInt == null) return;
- int bpNo= 0;
- 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());
- 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) {
- PHPDebugCorePlugin.log(e);
- stop();
- } catch (CoreException e) {
- PHPDebugCorePlugin.log(e);
- stop();
- }
- }
-
- public void removeBreakpoint(IBreakpoint breakpoint) {
- if (DBGInt == null) return;
- try {
- PHPLineBreakpoint phpLBP;
- if(breakpoint.getModelIdentifier() == PHPDebugCorePlugin.getDefault().getDescriptor().getUniqueIdentifier()) {
- phpLBP= (PHPLineBreakpoint)breakpoint;
- 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);
- stop();
- } catch (CoreException e) {
- PHPDebugCorePlugin.log(e);
- stop();
- }
- }
-
- public void startPHPLoop() {
- phpLoop = new PHPLoop();
- phpLoop.start();
- }
-
- public void resume(PHPThread thread) {
- try {
- DBGInt.continueExecution();
- phpLoop.notifyWait();
- } catch (IOException e) {
- PHPDebugCorePlugin.log(e);
- stop();
- }
- }
-
- protected IPHPDebugTarget getDebugTarget() {
- return debugTarget;
- }
-
- public void setDebugTarget(IPHPDebugTarget debugTarget) {
- this.debugTarget = debugTarget;
- debugTarget.setPHPDBGProxy(this);
- }
-
- public PHPVariable[] readVariables(PHPStackFrame frame) {
- try {
- 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 PHPVariable[] readInstanceVariables(PHPVariable variable) {
- try {
- return DBGInt.getInstVars(variable);
- } catch (DebugException ex) {
- ex.printStackTrace();
- throw new RuntimeException(ex.getMessage());
- }
-
- }
-
- public void readStepOverEnd(PHPStackFrame stackFrame) {
- try {
- DBGInt.stepOver();
- phpLoop.notifyWait();
- } catch (Exception e) {
- PHPDebugCorePlugin.log(e);
- }
- }
-
- public void readStepReturnEnd(PHPStackFrame stackFrame) {
- try {
- DBGInt.stepOut();
- phpLoop.notifyWait();
- } catch (Exception e) {
- PHPDebugCorePlugin.log(e);
- }
- }
-
- public void readStepIntoEnd(PHPStackFrame stackFrame) {
- try {
- DBGInt.stepInto();
- phpLoop.notifyWait();
- } catch (Exception e) {
- PHPDebugCorePlugin.log(e);
- }
- }
-
-/*
- public PHPStackFrame[] readFrames(PHPThread thread) {
- //try {
- //this.println("th " + thread.getId() + " ; f ");
- //return new FramesReader(getMultiReaderStrategy()).readFrames(thread);
- return null;
- //} catch (IOException e) {
- // PHPDebugCorePlugin.log(e);
- // return null;
- //}
-
- }
-*/
-
- public void closeSocket() throws IOException {
- if (socket != null) {
- socket.close();
- }
- }
-
- public void closeServerSocket() throws IOException {
- if (server != null) {
- server.close();
- }
- }
-
- public int getPort() {
- return port;
- }
-
- class PHPLoop extends Thread {
- private boolean shouldStop;
-
- public PHPLoop() {
- shouldStop = false;
- this.setName("PHPDebuggerLoop");
- }
-
- public synchronized void setShouldStop() {
- shouldStop = true;
- }
-
- public synchronized void notifyWait() {
- notify();
- }
-
- public void run() {
- try {
- char[] buf= new char[16];
- 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;
-
- PHPMainThread = new PHPThread(getDebugTarget(), getPort());
- PHPMainThread.setName("Thread [main]");
- timeout = 0;
- while ((getDebugTarget() == null) && (timeout < 100)) {
- sleep(100);
- timeout++;
- }
- // Be sure debug target is set
- PHPMainThread.setDebugTarget(getDebugTarget());
- getDebugTarget().addThread(PHPMainThread);
-
- //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();
-
- synchronized (this) {
- wait();
- }
- }
- }
- if (remote) {
- if (PHPMainThread.isTerminated())
- {
- shouldStop=true;
- break;
- }
- } else {
- if (PHPMainThread.isTerminated() || getDebugTarget().getProcess().isTerminated())
- {
- shouldStop=true;
- break;
- }
- }
-// if (DBGInt.getLastCmd()==PHPDBGBase.DBGC_LOG)
-// endFile=true;
-// }
-// try
-// {
-// closeSocket();
-// }
-// catch (IOException e) {
-// PHPDebugCorePlugin.log(e);
-// shouldStop=true;
-// }
-// endFile=false;
- }
- }
- 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.");
- }
- }
- }
-}