package net.sourceforge.pain.network.console;
import net.sourceforge.pain.data.type.*;
import net.sourceforge.pain.util.*;
import net.sourceforge.pain.*;
import java.util.*;
public final class Console {
protected static final int STATE_NEW = -1; //new connection
protected static final int STATE_ACTIVE = 0; // active connection
protected static final int STATE_SYSTEM_CLOSED = 1; // connection marked to be closed from system
protected static final int STATE_REMOTE_CLOSED_1 = 2; // remotely closed connection
protected static final int STATE_REMOTE_CLOSED_2 = 3; //
public static int MAX_INACTIVE_TIME = 6000; // in pulses
private Object playerId = null;
protected Object rawCommand = null;
protected LinkedList input = new LinkedList();
protected ConsoleAdapter adapter = null;
protected int expireTime = 0; // in net.sourceforge.pain.Time pulses
protected int state = STATE_NEW;
protected boolean hasBufferedOutput = false;
// private Map attributes = new HashMap();
boolean newLineProcessingStarted = true;
protected Console(ConsoleAdapter adapter) {
this.adapter = adapter;
}
// protected ConsoleAdapter getAdapter() {
// return adapter;
// }
public boolean isRawMode() {
return rawCommand != null;
}
public boolean isCommandMode() {
return rawCommand == null;
}
public void setRawMode(Object rawCommand) {
this.rawCommand = rawCommand;
}
public void setCommandMode() {
rawCommand = null;
}
public Object getRawCommand() {
return rawCommand;
}
public String popInputLine() {
if (input.isEmpty()) {
return null;
}
return (String) input.removeFirst();
}
public Console out(String text) {
if (text == null) {
Log.warn("Console: out 'null'");
return this;
}
if (!hasBufferedOutput && !isRawMode() && !newLineProcessingStarted) { //new console output should starts from new line
adapterOut(ConsoleAdapter.NEW_LINE);
}
hasBufferedOutput = true;
newLineProcessingStarted = false;
adapterOut(text);
return this;
}
private void adapterOut(String text) {
if (adapter != null) {
adapter.outText(text);
}
}
public Player getPlayer() {
return (Player) (playerId == null ? null : Core.getDB().getObject(playerId));
}
public void setPlayer(Player newPlayer) {
if (playerId != null && newPlayer != null) {
throw new RuntimeException("Owner redefinition not supported!");
}
if (playerId == null && newPlayer == null) {
throw new RuntimeException("BUG, newPlayer is null!");
}
playerId = newPlayer == null ? null : newPlayer.getOid();
}
public void flushOutput() {
if (!hasBufferedOutput) {
return;
}
if (adapter != null) {
try {
adapter.flush();
} catch (Exception e) {
Log.error(e.getMessage(), e); // todo: revise ignorance
}
}
hasBufferedOutput = false;
}
public void pushInputLine(String line) {
input.addFirst(line);
}
}