diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java index 863e8911a86..0ab3b59d209 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java @@ -6,8 +6,6 @@ package org.eclipse.cdt.debug.mi.core.cdi; import java.io.File; -import java.util.ArrayList; -import java.util.List; import org.eclipse.cdt.debug.core.cdi.CDIException; import org.eclipse.cdt.debug.core.cdi.ICDISourceManager; @@ -15,6 +13,8 @@ import org.eclipse.cdt.debug.mi.core.MIException; import org.eclipse.cdt.debug.mi.core.MISession; import org.eclipse.cdt.debug.mi.core.command.CommandFactory; import org.eclipse.cdt.debug.mi.core.command.MIEnvironmentDirectory; +import org.eclipse.cdt.debug.mi.core.command.MIGDBShowDirectories; +import org.eclipse.cdt.debug.mi.core.output.MIGDBShowDirectoriesInfo; import org.eclipse.cdt.debug.mi.core.output.MIInfo; @@ -22,11 +22,8 @@ import org.eclipse.cdt.debug.mi.core.output.MIInfo; */ public class SourceManager extends SessionObject implements ICDISourceManager { - List sourcePaths; - public SourceManager(CSession session) { super(session); - sourcePaths = new ArrayList(); } /** @@ -61,16 +58,22 @@ public class SourceManager extends SessionObject implements ICDISourceManager { } catch (MIException e) { throw new CDIException(e.getMessage()); } - for (int i = 0; i < dirs.length; i++) { - sourcePaths.add(dirs[i]); - } } /** * @see org.eclipse.cdt.debug.core.cdi.ICDISourceManager#getSourcePaths() */ - public String[] getSourcePaths() { - return (String[])sourcePaths.toArray(new String[0]); + public String[] getSourcePaths() throws CDIException { + MISession mi = getCSession().getMISession(); + CommandFactory factory = mi.getCommandFactory(); + MIGDBShowDirectories dir = factory.createMIGDBShowDirectories(); + try { + mi.postCommand(dir); + MIGDBShowDirectoriesInfo info = dir.getMIGDBShowDirectoriesInfo(); + return info.getDirectories(); + } catch (MIException e) { + throw new CDIException(e.getMessage()); + } } /** diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CommandFactory.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CommandFactory.java index ed060f4fccd..61e421abb55 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CommandFactory.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CommandFactory.java @@ -171,6 +171,10 @@ public class CommandFactory { return new MIGDBShowExitCode(); } + public MIGDBShowDirectories createMIGDBShowDirectories() { + return new MIGDBShowDirectories(); + } + public MIStackInfoDepth createMIStackInfoDepth(int depth) { return new MIStackInfoDepth(depth); } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MIGDBShowDirectories.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MIGDBShowDirectories.java new file mode 100644 index 00000000000..5a81d92db8f --- /dev/null +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MIGDBShowDirectories.java @@ -0,0 +1,40 @@ +/* + *(c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + * + */ + +package org.eclipse.cdt.debug.mi.core.command; + +import org.eclipse.cdt.debug.mi.core.MIException; +import org.eclipse.cdt.debug.mi.core.output.MIGDBShowDirectoriesInfo; +import org.eclipse.cdt.debug.mi.core.output.MIInfo; +import org.eclipse.cdt.debug.mi.core.output.MIOutput; + +/** + * + * -gdb-show directories + * + * Show the current value of a GDB variable(directories). + * + */ +public class MIGDBShowDirectories extends MIGDBShow { + public MIGDBShowDirectories() { + super(new String[] { "directories" }); + } + + public MIGDBShowDirectoriesInfo getMIGDBShowDirectoriesInfo() throws MIException { + return (MIGDBShowDirectoriesInfo)getMIInfo(); + } + public MIInfo getMIInfo() throws MIException { + MIInfo info = null; + MIOutput out = getMIOutput(); + if (out != null) { + info = new MIGDBShowDirectoriesInfo(out); + if (info.isError()) { + throw new MIException(info.getErrorMsg()); + } + } + return info; + } +} diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIGDBShowDirectoriesInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIGDBShowDirectoriesInfo.java new file mode 100644 index 00000000000..03534253071 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIGDBShowDirectoriesInfo.java @@ -0,0 +1,59 @@ +/* + * (c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + */ +package org.eclipse.cdt.debug.mi.core.output; + +import java.util.StringTokenizer; + + +/** + * GDB/MI show parsing. + * (gdb) + * -gdb-show directories + * ~"Source directories searched: /tmp:$cdir:$cwd\n" + * ^done + */ +public class MIGDBShowDirectoriesInfo extends MIInfo { + + String[] dirs = new String[0]; + + public MIGDBShowDirectoriesInfo(MIOutput o) { + super(o); + parse(); + } + + public String[] getDirectories() { + return dirs; + } + + void parse() { + if (isDone()) { + MIOutput out = getMIOutput(); + MIOOBRecord[] oobs = out.getMIOOBRecords(); + for (int i = 0; i < oobs.length; i++) { + if (oobs[i] instanceof MIConsoleStreamOutput) { + MIStreamRecord cons = (MIStreamRecord)oobs[i]; + String str = cons.getString(); + if (str.startsWith("Source directories searched:")) { + int j = str.indexOf(':'); + if (j != -1) { + String sub = str.substring(j + 1).trim(); + parseDirectories(sub); + } + } + } + } + } + } + + void parseDirectories(String d) { + String sep = System.getProperty("path.separator", ":"); + StringTokenizer st = new StringTokenizer(d, sep); + int count = st.countTokens(); + dirs = new String[count]; + for (int i = 0; st.hasMoreTokens() && i < count; i++) { + dirs[i] = (String)st.nextToken(); + } + } +}