diff options
Diffstat (limited to 'plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/launch/setup/AbstractRemoteShell.java')
-rw-r--r-- | plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/launch/setup/AbstractRemoteShell.java | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/launch/setup/AbstractRemoteShell.java b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/launch/setup/AbstractRemoteShell.java new file mode 100644 index 000000000..066ab0630 --- /dev/null +++ b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/launch/setup/AbstractRemoteShell.java @@ -0,0 +1,113 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 Wind River Systems, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tm.internal.tcf.debug.ui.launch.setup; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.PrintWriter; + +abstract class AbstractRemoteShell implements IRemoteShell { + + protected boolean debug; + protected BufferedReader inp; + protected PrintWriter out; + + public void setDebug(boolean debug) { + this.debug = debug; + } + + public synchronized void write(String s) { + out.write(s); + } + + public synchronized void expect(String s) throws IOException { + expect(new String[]{ s }); + } + + public synchronized int expect(String s[]) throws IOException { + out.flush(); + int[] pos = new int[s.length]; + for (int i = 0; i < pos.length; i++) pos[i] = 0; + StringBuffer buf = new StringBuffer(); + try { + for (;;) { + int ch = inp.read(); + if (ch < 0) throw new IOException("Unexpected EOF"); + if (ch == '\r') continue; + if (debug) System.out.write(ch); + for (int i = 0; i < pos.length; i++) { + String p = s[i]; + if (ch == p.charAt(pos[i])) { + pos[i]++; + if (pos[i] == p.length()) return i; + } + else { + int nps = pos[i]; + while (nps > 0) { + if (ch == p.charAt(nps - 1)) { + int j = nps - 2; + int k = pos[i] - 1; + while (j >= 0 && p.charAt(j) == p.charAt(k)) { + j--; + k--; + } + if (j < 0) break; + } + nps--; + } + pos[i] = nps; + } + } + buf.append((char)ch); + if (ch == '\n') buf.setLength(0); + } + } + catch (IOException x) { + if (buf.length() == 0) throw x; + IOException y = new IOException("I/O error, last text received: " + buf); + y.initCause(x); + throw y; + } + finally { + if (debug) System.out.flush(); + } + } + + public synchronized String waitPrompt() throws IOException { + StringBuffer res = new StringBuffer(); + StringBuffer buf = new StringBuffer(); + out.flush(); + try { + for (;;) { + int ch = inp.read(); + if (ch < 0) throw new IOException("Unexpected EOF"); + if (ch == '\r') continue; + if (debug) System.out.write(ch); + buf.append((char)ch); + if (buf.length() == PROMPT.length() && buf.toString().equals(PROMPT)) break; + if (ch == '\n') { + res.append(buf); + buf.setLength(0); + } + } + return res.toString(); + } + catch (IOException x) { + if (buf.length() == 0) throw x; + IOException y = new IOException("I/O error, last text received: " + buf); + y.initCause(x); + throw y; + } + finally { + if (debug) System.out.flush(); + } + } +} |