Package org.jnode.apps.telnetd

Source Code of org.jnode.apps.telnetd.RemoteTextScreen

/*
* $Id$
*
* Copyright (C) 2003-2014 JNode.org
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library 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 Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jnode.apps.telnetd;

import java.io.IOException;

import net.wimpi.telnetd.io.TelnetIO;
import net.wimpi.telnetd.io.TerminalIO;

import org.jnode.driver.textscreen.TextScreen;
import org.jnode.driver.textscreen.x86.AbstractPcTextScreen;

/**
*
* @author Fabien DUMINY (fduminy at jnode.org)
*
*/
public class RemoteTextScreen extends AbstractPcTextScreen {
    private final TerminalIO terminalIO;
    private final char[] buffer;
    private int cursorOffset;

    /**
     * Construct a remote text screen for the given terminal.
     *
     * @param terminalIO
     */
    public RemoteTextScreen(TerminalIO terminalIO) {
        super(terminalIO.getColumns(), terminalIO.getRows());
        this.terminalIO = terminalIO;

        buffer = new char[terminalIO.getColumns() * terminalIO.getRows()];
        for (int i = 0; i < buffer.length; i++) {
            buffer[i] = ' ';
        }
    }

    /**
     * Copy the content of the given rawData into this screen.
     *
     * @param rawData
     * @param rawDataOffset
     */
    @Override
    public void copyFrom(char[] rawData, int rawDataOffset) {
        if (rawDataOffset < 0) {
            // Unsafe.die("Screen:rawDataOffset = " + rawDataOffset);
        }
        char[] cha = new char[rawData.length];
        for (int i = 0; i < cha.length; i++) {
            cha[i] = getCharacter(rawData[i]);
        }
        System.arraycopy(cha, rawDataOffset, buffer, 0, buffer.length);
        sync(0, buffer.length);
    }

    /**
     * {@inheritDoc}
     */
    public void copyContent(int srcOffset, int destOffset, int length) {
        System.arraycopy(buffer, srcOffset * 2, buffer, destOffset * 2, length * 2);
        sync(destOffset * 2, length * 2);
    }

    /**
     * {@inheritDoc}
     */
    public void copyTo(TextScreen dst, int offset, int length) {
        // TODO Auto-generated method stub

    }

    /**
     * {@inheritDoc}
     */
    public char getChar(int offset) {
        return buffer[offset];
    }

    /**
     * {@inheritDoc}
     */
    public int getColor(int offset) {
        return 0;
    }

    /**
     * {@inheritDoc}
     */
    public void set(int offset, char ch, int count, int color) {
        buffer[offset] = getCharacter(ch);
        sync(offset, 1);
    }

    private char getCharacter(char ch) {
        char c = (char) (ch & 0xFF);
        return (c == 0) ? ' ' : c;
    }

    /**
     * {@inheritDoc}
     */
    public void set(int offset, char[] ch, int chOfs, int length, int color) {
        char[] cha = new char[ch.length];
        for (int i = 0; i < cha.length; i++) {
            cha[i] = getCharacter(ch[i]);
        }
        System.arraycopy(cha, chOfs, buffer, offset, length);
        sync(offset, length);
    }

    /**
     * {@inheritDoc}
     */
    public void set(int offset, char[] ch, int chOfs, int length, int[] colors, int colorsOfs) {
        set(offset, ch, chOfs, length, 0);
    }

    /**
     * {@inheritDoc}
     */
    public int setCursor(int x, int y) {
        try {
            terminalIO.setCursor(y, x);
            cursorOffset = getOffset(x, y);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return cursorOffset;
    }

    /**
     * {@inheritDoc}
     */
    public int setCursorVisible(boolean visible) {
        // ignore : cursor will allways be visible
        return cursorOffset;
    }

    /**
     * {@inheritDoc}
     */
    public void sync(int offset, int length) {
        try {
            final int y = offset / getWidth();
            final int x = offset % getWidth();
            terminalIO.setCursor(y, x);

            final TelnetIO telnetIO = terminalIO.getTelnetIO();

            int offs = offset;
            for (int i = 0; i < length; i++) {
                telnetIO.write(buffer[offs++]);
            }
            if (terminalIO.isAutoflushing()) {
                terminalIO.flush();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
TOP

Related Classes of org.jnode.apps.telnetd.RemoteTextScreen

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.