/*
* This file is part of "JTA - Telnet/SSH for the JAVA(tm) platform".
*
* (c) Matthias L. Jugel, Marcus Meißner 1996-2005. All Rights Reserved.
*
* Please visit http://javatelnet.org/ for updates and contact.
*
* --LICENSE NOTICE--
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* --LICENSE NOTICE--
*
*/
package de.mud.telnet;
import java.io.IOException;
import de.mud.jta.Wrapper;
/**
* The telnet wrapper is a sample class for how to use the telnet protocol
* handler of the JTA source package. To write a program using the wrapper you
* may use the following piece of code as an example:
*
* <PRE>
* TelnetWrapper telnet = new TelnetWrapper();
* try {
* telnet.connect(args[0], 23);
* telnet.login("user", "password");
* telnet.setPrompt("user@host");
* telnet.waitfor("Terminal type?");
* telnet.send("dumb");
* System.out.println(telnet.send("ls -l"));
* } catch (java.io.IOException e) {
* e.printStackTrace();
* }
* </PRE>
*
* Please keep in mind that the password is visible for anyone who can download
* the class file. So use this only for public accounts or if you are absolutely
* sure nobody can see the file.
* <P>
* <B>Maintainer:</B> Matthias L. Jugel
*
* @version $Id: TelnetWrapper.java 499 2005-09-29 08:24:54Z leo $
* @author Matthias L. Jugel, Marcus Mei�ner
*/
public class TelnetWrapper extends Wrapper {
protected TelnetProtocolHandler handler;
/** debugging level */
private final static int debug = 0;
public TelnetWrapper() {
handler = new TelnetProtocolHandler() {
/** get the current terminal type */
public String getTerminalType() {
return "vt320";
}
/** get the current window size */
public Dimension getWindowSize() {
return new Dimension(80, 25);
}
/** notify about local echo */
public void setLocalEcho(boolean echo) {
/* EMPTY */
}
/** write data to our back end */
public void write(byte[] b) throws IOException {
out.write(b);
}
/** sent on IAC EOR (prompt terminator for remote access systems). */
public void notifyEndOfRecord() {
}
};
}
public TelnetProtocolHandler getHandler() {
return handler;
}
public void connect(String host, int port) throws IOException {
super.connect(host, port);
handler.reset();
}
/**
* Send a command to the remote host. A newline is appended and if a prompt
* is set it will return the resulting data until the prompt is encountered.
*
* @param cmd
* the command
* @return output of the command or null if no prompt is set
*/
public String send(String cmd) throws IOException {
byte arr[];
arr = (cmd).getBytes();
return send(arr);
}
public String send(byte[] arr) throws IOException {
handler.transpose(arr);
if (getPrompt() != null)
return waitfor(getPrompt());
return null;
}
/**
* Read data from the socket and use telnet negotiation before returning the
* data read.
*
* @param b
* the input buffer to read in
* @return the amount of bytes read
*/
public int read(byte[] b) throws IOException {
/* process all already read bytes */
int n;
do {
n = handler.negotiate(b);
if (n > 0)
return n;
} while (n == 0);
while (n <= 0) {
do {
n = handler.negotiate(b);
if (n > 0)
return n;
} while (n == 0);
n = in.read(b);
if (n < 0)
return n;
handler.inputfeed(b, n);
n = handler.negotiate(b);
}
return n;
}
public void write(char c) throws IOException {
out.write(c);
}
public void write(int i) throws IOException {
out.write(i);
}
public void flush() throws IOException {
out.flush();
}
}