[mud4j-commit] SF.net SVN: mud4j: [147] trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet
Status: Pre-Alpha
Brought to you by:
mpurland
From: <mpu...@us...> - 2007-10-04 21:42:00
|
Revision: 147 http://mud4j.svn.sourceforge.net/mud4j/?rev=147&view=rev Author: mpurland Date: 2007-10-04 14:41:58 -0700 (Thu, 04 Oct 2007) Log Message: ----------- Add behaviors for mud4j core, effectable, and tests Add prompt shell for telnet server. Add line terminal input handler. Start fixing terminal screen buffer. Modified Paths: -------------- trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/server/DefaultTelnetServer.java trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/AbstractScreenBuffer.java trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/AbstractTelnetShell.java trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/AbstractTerminalInputHandler.java trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/Mud4jTelnetLoginShell.java trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/TerminalInputHandler.java trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/TerminalScreenBuffer.java Added Paths: ----------- trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/LineTerminalInputHandler.java trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/Mud4jTelnetPromptShell.java Modified: trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/server/DefaultTelnetServer.java =================================================================== --- trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/server/DefaultTelnetServer.java 2007-10-03 04:46:38 UTC (rev 146) +++ trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/server/DefaultTelnetServer.java 2007-10-04 21:41:58 UTC (rev 147) @@ -35,10 +35,10 @@ properties.put("term.vt100.class", "net.wimpi.telnetd.io.terminal.vt100"); properties.put("term.vt100.aliases", "default,vt100-am,vt102,dec-vt10"); - properties.put("shells", "editor,login"); + properties.put("shells", "editor,login,prompt"); properties.put("shell.editor.class", "net.sf.mud4j.telnet.shell.Mud4jTelnetEditorShell"); properties.put("shell.login.class", "net.sf.mud4j.telnet.shell.Mud4jTelnetLoginShell"); - + properties.put("shell.prompt.class", "net.sf.mud4j.telnet.shell.Mud4jTelnetPromptShell"); properties.put("listeners", "std"); properties.put("std.port", "6666"); Modified: trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/AbstractScreenBuffer.java =================================================================== --- trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/AbstractScreenBuffer.java 2007-10-03 04:46:38 UTC (rev 146) +++ trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/AbstractScreenBuffer.java 2007-10-04 21:41:58 UTC (rev 147) @@ -59,14 +59,11 @@ * @return Returns true if the position is valid; false otherwise. */ protected boolean isValidPosition(int x, int y) { - boolean positionValid = true; + boolean positionValid = false; - if (x > screenWidth || x < 0) { - positionValid = false; + if (x < screenWidth && y < screenHeight) { + positionValid = true; } - else if (y > screenHeight || y < 0) { - positionValid = false; - } return positionValid; } @@ -245,7 +242,7 @@ // Check if we can fit more on the current line if (isValidPosition(xPos, yPos)) { - if (isEndOfLine(xPos)) { + if (isEndOfLine(xPos) && isValidPosition(xPos, getNextLine())) { moveCursorToNextLine(); } else { @@ -254,12 +251,17 @@ } } // The current line has too much. Move the cursor to the next line. - else { + else if (isValidPosition(xPos, getNextLine())) { moveCursorToNextLine(); } - StringBuffer buffer = getCurrentLineBuffer(); - buffer.append(character); + // If at end of line with no more lines + if (xPos < screenWidth) { + buffer.append(character); + } + else { + buffer.setCharAt(buffer.length() - 1, character); + } } /** @@ -270,12 +272,16 @@ write(string.charAt(i)); } } + + public int getNextLine() { + return cursorPosition.y + 1; + } /** * {@inheritDoc} */ public void moveCursorToNextLine() { - setCursorPosition(0, cursorPosition.y + 1); + setCursorPosition(0, getNextLine()); } /** Modified: trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/AbstractTelnetShell.java =================================================================== --- trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/AbstractTelnetShell.java 2007-10-03 04:46:38 UTC (rev 146) +++ trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/AbstractTelnetShell.java 2007-10-04 21:41:58 UTC (rev 147) @@ -76,11 +76,18 @@ protected BasicTerminalIO getTerminalIO() { return terminalIO; } + + /** + * Read a command followed by an enter or return. + */ + protected String readWord() { + return readWord(false); + } /** * Read a command followed by an enter or return. */ - protected String readWord() { + protected String readWord(boolean backspaceAllowed) { boolean isInterrupted = false; StringBuffer currentLineBuffer = new StringBuffer(); @@ -93,10 +100,22 @@ if (!TerminalUtil.isControlCharacter(c)) { currentLineBuffer.append(c); + + // Echo to the terminal the character + // @todo Only echo if we have echo turned off as telnet opt terminalIO.write(c); } + if (charValue == BasicTerminalIO.BACKSPACE) { + int index = currentLineBuffer.length() - 1; + + if (currentLineBuffer.length() > 1) { + currentLineBuffer.deleteCharAt(index); + terminalIO.write(c); + } + } + /** * Once we receive a return we have read the word. */ Modified: trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/AbstractTerminalInputHandler.java =================================================================== --- trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/AbstractTerminalInputHandler.java 2007-10-03 04:46:38 UTC (rev 146) +++ trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/AbstractTerminalInputHandler.java 2007-10-04 21:41:58 UTC (rev 147) @@ -16,6 +16,8 @@ package net.sf.mud4j.telnet.shell; import java.awt.Point; +import java.util.HashSet; +import java.util.Set; import net.wimpi.telnetd.io.BasicTerminalIO; @@ -29,6 +31,8 @@ // Internal screen buffer private ScreenBuffer screenBuffer; + private Set<TerminalKey> allowedKeySet; + /** * Construct a new instance with a ScreenBuffer instance. * @@ -36,7 +40,23 @@ */ public AbstractTerminalInputHandler(ScreenBuffer screenBuffer) { this.screenBuffer = screenBuffer; + this.allowedKeySet = new HashSet<TerminalKey>(); + + // Add every terminal key + for (TerminalKey terminalKey : TerminalKey.values()) { + allowedKeySet.add(terminalKey); + } } + + /** + * Construct a new instance with a ScreenBuffer instance with an allowed key set. + * + * @param screenBuffer ScreenBuffer to use. + */ + public AbstractTerminalInputHandler(ScreenBuffer screenBuffer, Set<TerminalKey> allowedKeySet) { + this.screenBuffer = screenBuffer; + this.allowedKeySet = allowedKeySet; + } /** * {@inheritDoc} @@ -47,25 +67,25 @@ // Point cursorPosition = screenBuffer.getCursorPosition(); if (TerminalUtil.isControlCharacter(inputCharacter)) { - if (input == BasicTerminalIO.UP) { + if (allowedKeySet.contains(TerminalKey.UP) && input == BasicTerminalIO.UP) { screenBuffer.moveCursorUp(); } - else if (input == BasicTerminalIO.DOWN) { + else if (allowedKeySet.contains(TerminalKey.DOWN) && input == BasicTerminalIO.DOWN) { screenBuffer.moveCursorDown(); } - else if (input == BasicTerminalIO.LEFT) { + else if (allowedKeySet.contains(TerminalKey.LEFT) && input == BasicTerminalIO.LEFT) { screenBuffer.moveCursorLeft(); } - else if (input == BasicTerminalIO.RIGHT) { + else if (allowedKeySet.contains(TerminalKey.RIGHT) && input == BasicTerminalIO.RIGHT) { screenBuffer.moveCursorRight(); } - else if (TerminalUtil.isBackspaceCharacter(inputCharacter)) { + else if (allowedKeySet.contains(TerminalKey.BACKSPACE) && TerminalUtil.isBackspaceCharacter(inputCharacter)) { screenBuffer.backspace(); } - else if (TerminalUtil.isDeleteCharacter(inputCharacter)) { + else if (allowedKeySet.contains(TerminalKey.DELETE) && TerminalUtil.isDeleteCharacter(inputCharacter)) { screenBuffer.delete(); } - else if (input == BasicTerminalIO.ENTER) { + else if (allowedKeySet.contains(TerminalKey.ENTER) && input == BasicTerminalIO.ENTER) { screenBuffer.enter(); } } Added: trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/LineTerminalInputHandler.java =================================================================== --- trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/LineTerminalInputHandler.java (rev 0) +++ trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/LineTerminalInputHandler.java 2007-10-04 21:41:58 UTC (rev 147) @@ -0,0 +1,12 @@ +package net.sf.mud4j.telnet.shell; + +public class LineTerminalInputHandler extends AbstractTerminalInputHandler { + /** + * Construct a new instance with a ScreenBuffer instance. + * + * @param screenBuffer ScreenBuffer to use. + */ + public LineTerminalInputHandler(ScreenBuffer screenBuffer) { + super(screenBuffer); + } +} \ No newline at end of file Property changes on: trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/LineTerminalInputHandler.java ___________________________________________________________________ Name: svn:keywords + "Author Date Id Revision" Name: svn:eol-style + native Modified: trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/Mud4jTelnetLoginShell.java =================================================================== --- trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/Mud4jTelnetLoginShell.java 2007-10-03 04:46:38 UTC (rev 146) +++ trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/Mud4jTelnetLoginShell.java 2007-10-04 21:41:58 UTC (rev 147) @@ -71,7 +71,7 @@ //getTerminalIO().write("Password read was: " + password); if (username.equals("test") && password.equals("test")) { getTerminalIO().write("Switching to editor...\n"); - connection.setNextShell("editor"); + connection.setNextShell("prompt"); } else { getTerminalIO().write("Failed logon...Please try again.\n\r"); Added: trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/Mud4jTelnetPromptShell.java =================================================================== --- trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/Mud4jTelnetPromptShell.java (rev 0) +++ trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/Mud4jTelnetPromptShell.java 2007-10-04 21:41:58 UTC (rev 147) @@ -0,0 +1,113 @@ +/** + * Copyright 2006 Matthew Purland (m.p...@gm...) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.sf.mud4j.telnet.shell; + +import java.io.IOException; + +/** + * + * + * @todo Auto-generated doc stub for Mud4jTelnetLoginShell. + * + * @author Matthew Purland + */ +public class Mud4jTelnetPromptShell extends AbstractTelnetShell implements + TelnetLoginShell { + + /** + * {@inheritDoc} + */ + public static TelnetShell createShell() { + return new Mud4jTelnetPromptShell(); + } + + /** + * {@inheritDoc} + */ + public String getGreeting() { + /** + * @todo Auto-generated method stub + */ + return null; + } + + /** + * {@inheritDoc} + */ + @Override + public void run() throws IOException { + +// // Initialize the shell +// initialize(); +// +// String command = null; +// boolean promptHasExited = false; +// +// while (!promptHasExited) { +// getTerminalIO().write("> "); +// command = readWord(true); +// +// getTerminalIO().write("Command was: " + command + "\n\r"); +// +// if ("quit".equals(command)) { +// promptHasExited = true; +// } +// } + + try { + terminalIO.setSignalling(true); + + // Erase the screen and place home cursor at 0,0 + terminalIO.eraseScreen(); + terminalIO.homeCursor(); + + ScreenBuffer screenBuffer = new TerminalScreenBuffer(terminalIO, terminalIO.getColumns(), 1); + TerminalInputHandler inputHandler = new LineTerminalInputHandler(screenBuffer); + + // Display the greeting + if (this instanceof TelnetLoginShell) { + TelnetLoginShell loginShell = (TelnetLoginShell) this; + + // terminalIO.write(loginShell.getGreeting()); + } + // terminalIO.write(BasicTerminalIO.CRLF); + + // In order to keep current row we need to monitor + // each write to terminalIO.write to monitor + // for new lines and add 1 for each new line + // already sent + // As commented out as above for login shell to get working +// int currentRow = 1; +// int currentColumn = 1; +// StringBuffer currentLineBuffer = new StringBuffer(); +// screenBuffer.put(Integer.valueOf(currentRow), currentLineBuffer); + boolean isInterrupted = false; + + while (!isInterrupted) { + int input = terminalIO.read(); + + inputHandler.handleInput(input, terminalIO); + } + + // Flush the output to ensure it is sent immediately + terminalIO.flush(); + } + catch (IOException ex) { + // TODO need to redo to not squelch exceptions + } + } + +} Property changes on: trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/Mud4jTelnetPromptShell.java ___________________________________________________________________ Name: svn:keywords + "Author Date Id Revision" Name: svn:eol-style + native Modified: trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/TerminalInputHandler.java =================================================================== --- trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/TerminalInputHandler.java 2007-10-03 04:46:38 UTC (rev 146) +++ trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/TerminalInputHandler.java 2007-10-04 21:41:58 UTC (rev 147) @@ -24,6 +24,16 @@ */ public interface TerminalInputHandler { + public enum TerminalKey { + UP, + DOWN, + LEFT, + RIGHT, + BACKSPACE, + DELETE, + ENTER + } + /** * Input to be handled by the specified input handler. This may include * operations on the given terminal. Modified: trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/TerminalScreenBuffer.java =================================================================== --- trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/TerminalScreenBuffer.java 2007-10-03 04:46:38 UTC (rev 146) +++ trunk/mud4j-telnet/src/java/net/sf/mud4j/telnet/shell/TerminalScreenBuffer.java 2007-10-04 21:41:58 UTC (rev 147) @@ -286,9 +286,13 @@ public void write(char character) { super.write(character); + int xPos = getCursorPosition().x + 1; + int yPos = getCursorPosition().y; + try { - terminalIO.write(character); - + if (isValidPosition(xPos, yPos)) { + terminalIO.write(character); + } System.out.println(character + " was read."); } catch (IOException ex) { @@ -296,4 +300,14 @@ } } + @Override + protected void setCursorPosition(int x, int y) { + int lastXPosition = getCursorPosition().x; + int lastYPosition = getCursorPosition().y; + + super.setCursorPosition(x, y); + + moveTerminalCursorToCurrentPosition(lastXPosition, lastYPosition); + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |