diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/Queue.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/Queue.java index 7848a4d49b4..8d93ed56dd6 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/Queue.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/Queue.java @@ -19,14 +19,14 @@ public class Queue { list = Collections.synchronizedList(new LinkedList()); } - public Command removeCommand(String id) { + public Command removeCommand(int id) { //print("in removeCommand(" + id + ") - entering"); synchronized (list) { int size = list.size(); for (int i = 0; i < size; i++) { Command cmd = (Command)list.get(i); - String token = cmd.getToken(); - if (token.equals(id)) { + int token = cmd.getToken(); + if (token == id) { list.remove(cmd); return cmd; } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/RxThread.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/RxThread.java index c3e006563be..6eab87b7eb9 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/RxThread.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/RxThread.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.io.InputStreamReader; import org.eclipse.cdt.debug.mi.core.command.Command; +import org.eclipse.cdt.debug.mi.core.output.MIAsyncRecord; import org.eclipse.cdt.debug.mi.core.output.MIOOBRecord; import org.eclipse.cdt.debug.mi.core.output.MIOutput; import org.eclipse.cdt.debug.mi.core.output.MIResultRecord; @@ -31,7 +32,8 @@ public class RxThread extends Thread { * search for the corresponding token in rxQueue. */ public void run () { - BufferedReader reader = new BufferedReader(new InputStreamReader(session.getInputStream())); + BufferedReader reader = + new BufferedReader(new InputStreamReader(session.getInputStream())); StringBuffer buffer = new StringBuffer(); try { while (true) { @@ -52,20 +54,36 @@ public class RxThread extends Thread { void processMIOutput(String buffer) { MIOutput response = session.parse(buffer); if (response != null) { - String id = response.getToken(); Queue rxQueue = session.getRxQueue(); - Command cmd = rxQueue.removeCommand(id); - if (cmd != null) { - cmd.setMIOutput(response); - cmd.notifyAll(); + + // Notify any command waiting for a ResultRecord. + MIResultRecord rr = response.getMIResultRecord(); + if (rr != null) { + int id = rr.geToken(); + Command cmd = rxQueue.removeCommand(id); + if (cmd != null) { + cmd.setMIOutput(response); + cmd.notifyAll(); + } } + + // A command may wait on a specific oob, like breakpointhit MIOOBRecord[] oobs = response.getMIOOBRecords(); - if (oobs != null && oobs.length > 0) { - processMIOOBRecords(oobs); + for (int i = 0; i < oobs.length; i++) { + if (oobs[i] instanceof MIAsyncRecord) { + int id = ((MIAsyncRecord)oobs[i]).getToken(); + Command cmd = rxQueue.removeCommand(id); + if (cmd != null) { + cmd.setMIOutput(response); + cmd.notifyAll(); + } + } + processMIOOBRecord(oobs[i]); } } } - void processMIOOBRecords(MIOOBRecord[] oobs) { + void processMIOOBRecord(MIOOBRecord oob) { + // Dispatch a thread to deal with the listeners. } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/TxThread.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/TxThread.java index ad559961e17..14586acdb6e 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/TxThread.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/TxThread.java @@ -40,7 +40,7 @@ public class TxThread extends Thread { // - Move to the RxQueue if (cmd != null) { OutputStream out = session.getOutputStream(); - cmd.setToken(Integer.toString(token)); + cmd.setToken(token); //System.out.println("Tx " + cmd.toString()); try { out.write(cmd.toString().getBytes()); diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CLICommand.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CLICommand.java index aeeff7b123e..a849773ff33 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CLICommand.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CLICommand.java @@ -18,7 +18,7 @@ import org.eclipse.cdt.debug.mi.core.output.MIOutput; */ public class CLICommand extends Command { - String token = ""; + int token = -1; MIOutput miOutput = null; /** @@ -26,11 +26,11 @@ public class CLICommand extends Command * * @return the text representation of this command */ - public String getToken() { + public int getToken() { return token; } - public void setToken(String t) { + public void setToken(int t) { token = t; } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/Command.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/Command.java index e194a943a9d..7e825c7a88f 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/Command.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/Command.java @@ -23,9 +23,9 @@ public abstract class Command * * @return the identifier of this request */ - public abstract String getToken(); + public abstract int getToken(); - public abstract void setToken(String token); + public abstract void setToken(int token); public abstract String toString(); diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MICommand.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MICommand.java index f530ec0009d..ecd3004b7da 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MICommand.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MICommand.java @@ -22,7 +22,7 @@ public class MICommand extends Command String[] options = empty; String[] parameters = empty; String operation = ""; - String token = ""; + int token = -1; MIOutput miOutput = null; public MICommand(String oper) { @@ -95,11 +95,11 @@ public class MICommand extends Command return command + "\n"; } - public String getToken() { + public int getToken() { return token; } - public void setToken(String t) { + public void setToken(int t) { token = t; } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIAsyncRecord.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIAsyncRecord.java index 998b1d46d16..202b19d4fe0 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIAsyncRecord.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIAsyncRecord.java @@ -1,20 +1,53 @@ package org.eclipse.cdt.debug.mi.core.output; /** - * @author alain - * - * To change this generated comment edit the template variable "typecomment": - * Window>Preferences>Java>Templates. - * To enable and disable the creation of type comments go to - * Window>Preferences>Java>Code Generation. */ public class MIAsyncRecord extends MIOOBRecord { - /** - * @see org.eclipse.cdt.debug.mi.core.MIOutput#interpret() - */ - public boolean interpret() { - return super.interpret(); + public final static int EXEC_ASYNC = 0; + public final static int STATUS_ASYNC = 1; + public final static int NOTIFY_ASYNC = 2; + + final static MIResult[] nullResults = new MIResult[0]; + + MIResult[] results = null; + String asynClass = ""; + int token = -1; + int type = 0; + + public int getToken() { + return token; } + public void setToken(int t) { + token = t; + } + + public int getType() { + return type; + } + + public void setType(int t) { + type = t; + } + + + public String getAsyncClass() { + return asynClass; + } + + public void setAsyncClass(String a) { + asynClass = a; + } + + public MIResult[] getResults() { + if (results == null) { + return nullResults; + } + return results; + } + + public void setResults(MIResult[] res) { + results = res; + } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIConsoleStreamOutput.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIConsoleStreamOutput.java index a3b970fc14f..a8783864d29 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIConsoleStreamOutput.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIConsoleStreamOutput.java @@ -1,20 +1,7 @@ package org.eclipse.cdt.debug.mi.core.output; /** - * @author alain - * - * To change this generated comment edit the template variable "typecomment": - * Window>Preferences>Java>Templates. - * To enable and disable the creation of type comments go to - * Window>Preferences>Java>Code Generation. */ public class MIConsoleStreamOutput extends MIStreamRecord { - /** - * @see org.eclipse.cdt.debug.mi.core.MIOutput#interpret() - */ - public boolean interpret() { - return super.interpret(); - } - } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIExecAsyncOutput.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIExecAsyncOutput.java index e9991d5b0dd..cef0f3c4e9c 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIExecAsyncOutput.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIExecAsyncOutput.java @@ -1,20 +1,6 @@ package org.eclipse.cdt.debug.mi.core.output; /** - * @author alain - * - * To change this generated comment edit the template variable "typecomment": - * Window>Preferences>Java>Templates. - * To enable and disable the creation of type comments go to - * Window>Preferences>Java>Code Generation. */ public class MIExecAsyncOutput extends MIAsyncRecord { - - /** - * @see org.eclipse.cdt.debug.mi.core.MIOutput#interpret() - */ - public boolean interpret() { - return super.interpret(); - } - } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MILogStreamOutput.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MILogStreamOutput.java index c6fd9e90dab..698634e8be1 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MILogStreamOutput.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MILogStreamOutput.java @@ -1,20 +1,7 @@ package org.eclipse.cdt.debug.mi.core.output; /** - * @author alain - * - * To change this generated comment edit the template variable "typecomment": - * Window>Preferences>Java>Templates. - * To enable and disable the creation of type comments go to - * Window>Preferences>Java>Code Generation. */ public class MILogStreamOutput extends MIStreamRecord { - /** - * @see org.eclipse.cdt.debug.mi.core.MIOutput#interpret() - */ - public boolean interpret() { - return super.interpret(); - } - } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MINotifyAsyncOutput.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MINotifyAsyncOutput.java index c90f4a215e1..99dd4c44be5 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MINotifyAsyncOutput.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MINotifyAsyncOutput.java @@ -4,12 +4,4 @@ package org.eclipse.cdt.debug.mi.core.output; * */ public class MINotifyAsyncOutput extends MIAsyncRecord { - - /** - * @see org.eclipse.cdt.debug.mi.core.MIOutput#interpret() - */ - public boolean interpret() { - return super.interpret(); - } - } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIOOBRecord.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIOOBRecord.java index 6acb1be844f..24837d588ab 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIOOBRecord.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIOOBRecord.java @@ -3,22 +3,5 @@ package org.eclipse.cdt.debug.mi.core.output; /** * */ -public class MIOOBRecord { - - public final int ASYNC_STOPPED = 0; - - /** - * @see org.eclipse.cdt.debug.mi.core.MIOutput#interpret() - */ - public boolean interpret() { - return false; - } - - public int getAsyncType() { - return ASYNC_STOPPED; - } - - public MIResult[] getResults() { - return null; - } +public abstract class MIOOBRecord { } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIOutput.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIOutput.java index 82c168e9db4..f6bfce2f9f8 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIOutput.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIOutput.java @@ -5,17 +5,26 @@ package org.eclipse.cdt.debug.mi.core.output; public class MIOutput { public static final String terminator = "(gdb)\n"; - String token = ""; + public static final MIOOBRecord[] nullOOBRecord = new MIOOBRecord[0]; + MIResultRecord rr = null; + MIOOBRecord[] oobs = null; - public String getToken() { - return token; - } public MIResultRecord getMIResultRecord() { - return null; + return rr; + } + + public void setMIResultRecord(MIResultRecord res) { + rr = res ; } public MIOOBRecord[] getMIOOBRecords() { - return null; + if (oobs == null) + return nullOOBRecord; + return oobs; + } + + public void setMIOOBRecords(MIOOBRecord [] bands) { + oobs = bands; } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIParser.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIParser.java index 0fee0058580..058d6fa4cce 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIParser.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIParser.java @@ -1,11 +1,84 @@ package org.eclipse.cdt.debug.mi.core.output; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + /** */ public class MIParser { public MIOutput parse(String buffer) { - return new MIOutput(); + MIOutput mi = new MIOutput(); + MIResultRecord rr = null; + List oobs = new ArrayList(1); + int id = -1; + + StringTokenizer st = new StringTokenizer(buffer, "\n"); + while (st.hasMoreTokens()) { + String token = st.nextToken(); + + // Fetch the Token/Id + if (Character.isDigit(token.charAt(0))) { + int i = 1; + while (Character.isDigit(token.charAt(i)) && i < token.length()) { + i++; + } + String numbers = token.substring(i); + try { + id = Integer.parseInt(numbers); + } catch(NumberFormatException e) { + } + token = token.substring(i); + } + + if (token.charAt(0) == '^') { + rr = processMIResultRecord(token.substring(1), id); + } else { + MIOOBRecord br = processMIOOBRecord(token.substring(1), id); + if (br != null) { + oobs.add(br); + } + } + } + MIOOBRecord[] bands = (MIOOBRecord[])oobs.toArray(new MIOOBRecord[oobs.size()]); + mi.setMIOOBRecords(bands); + mi.setMIResultRecord(rr); + return mi; + } + + MIResultRecord processMIResultRecord(String buffer, int id) { + MIResultRecord rr = new MIResultRecord(); + rr.setToken(id); + if (buffer.startsWith("done")) { + rr.setResultClass("done"); + } else if (buffer.startsWith("error")) { + rr.setResultClass("error"); + } else if (buffer.startsWith("exit")) { + rr.setResultClass("exit"); + } else if (buffer.startsWith("running")) { + rr.setResultClass("running"); + } else if (buffer.startsWith("connected")) { + rr.setResultClass("connected"); + } else { + // FIXME: + // Error throw an exception? + } + int i = buffer.indexOf( ',' ); + if (i != -1) { + String s = buffer.substring(i + 1); + MIResult[] res = processMIResults(s); + rr.setResults(res); + } + return rr; + } + + MIOOBRecord processMIOOBRecord(String buffer, int id) { + return null; + } + + MIResult[] processMIResults(String buffer) { + return new MIResult[0]; } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIResultRecord.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIResultRecord.java index dc6cfac6b68..d99459a4653 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIResultRecord.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIResultRecord.java @@ -4,7 +4,18 @@ package org.eclipse.cdt.debug.mi.core.output; */ public class MIResultRecord { + public static final MIResult[] nullResults = new MIResult[0]; + MIResult[] results = null; String resultClass = ""; + int token = -1; + + public int geToken() { + return token; + } + + public void setToken(int t) { + token = t; + } /** */ @@ -12,7 +23,18 @@ public class MIResultRecord { return resultClass; } + public void setResultClass(String type) { + resultClass = type; + } + public MIResult[] getResults() { - return null; + if (results == null) { + return nullResults; + } + return results; + } + + public void setResults(MIResult[] res) { + results = res; } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIStatusAsyncOutput.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIStatusAsyncOutput.java index 650f357264f..90160397b50 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIStatusAsyncOutput.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIStatusAsyncOutput.java @@ -1,20 +1,7 @@ package org.eclipse.cdt.debug.mi.core.output; /** - * @author alain - * - * To change this generated comment edit the template variable "typecomment": - * Window>Preferences>Java>Templates. - * To enable and disable the creation of type comments go to - * Window>Preferences>Java>Code Generation. */ public class MIStatusAsyncOutput extends MIAsyncRecord { - /** - * @see org.eclipse.cdt.debug.mi.core.MIOutput#interpret() - */ - public boolean interpret() { - return super.interpret(); - } - } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIStreamRecord.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIStreamRecord.java index d639be34e1f..26ddc1a17f2 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIStreamRecord.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIStreamRecord.java @@ -1,20 +1,6 @@ package org.eclipse.cdt.debug.mi.core.output; /** - * @author alain - * - * To change this generated comment edit the template variable "typecomment": - * Window>Preferences>Java>Templates. - * To enable and disable the creation of type comments go to - * Window>Preferences>Java>Code Generation. */ public class MIStreamRecord extends MIOOBRecord { - - /** - * @see org.eclipse.cdt.debug.mi.core.MIOutput#interpret() - */ - public boolean interpret() { - return super.interpret(); - } - } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MITargetStreamOutput.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MITargetStreamOutput.java index d10947e12b8..8520a4ab827 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MITargetStreamOutput.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MITargetStreamOutput.java @@ -1,20 +1,6 @@ package org.eclipse.cdt.debug.mi.core.output; /** - * @author alain - * - * To change this generated comment edit the template variable "typecomment": - * Window>Preferences>Java>Templates. - * To enable and disable the creation of type comments go to - * Window>Preferences>Java>Code Generation. */ public class MITargetStreamOutput extends MIStreamRecord { - - /** - * @see org.eclipse.cdt.debug.mi.core.MIOutput#interpret() - */ - public boolean interpret() { - return super.interpret(); - } - }