    001    /*
    002     * Licensed to the Apache Software Foundation (ASF) under one or more
    003     * contributor license agreements.  See the NOTICE file distributed with
    004     * this work for additional information regarding copyright ownership.
    005     * The ASF licenses this file to You under the Apache License, Version 2.0
    006     * (the "License"); you may not use this file except in compliance with
    007     * the License.  You may obtain a copy of the License at
    008     *
    009     *      http://www.apache.org/licenses/LICENSE-2.0
    010     *
    011     * Unless required by applicable law or agreed to in writing, software
    012     * distributed under the License is distributed on an "AS IS" BASIS,
    013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014     * See the License for the specific language governing permissions and
    015     * limitations under the License.
    016     */
    017
    018    package org.apache.commons.net.telnet;
    019
    020    /***
    021     * Implements the telnet window size option RFC 1073.
    022     * <p>
    023     * @author Yuval Kashtan
    024     * @version $Id: WindowSizeOptionHandler.java 1299238 2012-03-10 17:12:28Z sebb $
    025     * @since 2.0
    026     ***/
    027    public class WindowSizeOptionHandler extends TelnetOptionHandler
    028    {
    029        /***
    030         * Horizontal Size
    031         ***/
    032        private int m_nWidth = 80;
    033
    034        /***
    035         * Vertical Size
    036         ***/
    037        private int m_nHeight = 24;
    038
    039        /***
    040         * Window size option
    041         ***/
    042        protected static final int WINDOW_SIZE = 31;
    043
    044        /***
    045         * Constructor for the WindowSizeOptionHandler. Allows defining desired
    046         * initial setting for local/remote activation of this option and
    047         * behaviour in case a local/remote activation request for this
    048         * option is received.
    049         * <p>
    050         * @param nWidth - Window width.
    051         * @param nHeight - Window Height
    052         * @param initlocal - if set to true, a WILL is sent upon connection.
    053         * @param initremote - if set to true, a DO is sent upon connection.
    054         * @param acceptlocal - if set to true, any DO request is accepted.
    055         * @param acceptremote - if set to true, any WILL request is accepted.
    056         ***/
    057        public WindowSizeOptionHandler(
    058            int nWidth,
    059            int nHeight,
    060            boolean initlocal,
    061            boolean initremote,
    062            boolean acceptlocal,
    063            boolean acceptremote
    064        ) {
    065            super (
    066                TelnetOption.WINDOW_SIZE,
    067                initlocal,
    068                initremote,
    069                acceptlocal,
    070                acceptremote
    071            );
    072
    073            m_nWidth = nWidth;
    074            m_nHeight = nHeight;
    075        }
    076
    077        /***
    078         * Constructor for the WindowSizeOptionHandler. Initial and accept
    079         * behaviour flags are set to false
    080         * <p>
    081         * @param nWidth - Window width.
    082         * @param nHeight - Window Height
    083         ***/
    084        public WindowSizeOptionHandler(
    085            int nWidth,
    086            int nHeight
    087        ) {
    088            super (
    089                TelnetOption.WINDOW_SIZE,
    090                false,
    091                false,
    092                false,
    093                false
    094            );
    095
    096            m_nWidth = nWidth;
    097            m_nHeight = nHeight;
    098        }
    099
    100        /***
    101         * Implements the abstract method of TelnetOptionHandler.
    102         * <p>
    103         * @param suboptionData - the sequence received, whithout IAC SB & IAC SE
    104         * @param suboptionLength - the length of data in suboption_data
    105         * <p>
    106         * @return terminal type information
    107         ***/
    108        @Override
    109        public int[] answerSubnegotiation(int suboptionData[], int suboptionLength)
    110        {
    111            return null;
    112        }
    113
    114        /***
    115         * Implements the abstract method of TelnetOptionHandler.
    116         * This will send the client Height and Width to the server.
    117         * <p>
    118         * @return array to send to remote system
    119         ***/
    120        @Override
    121        public int[] startSubnegotiationLocal()
    122        {
    123            int nCompoundWindowSize = m_nWidth * 0x10000 + m_nHeight;
    124            int nResponseSize = 5;
    125            int nIndex;
    126            int nShift;
    127            int nTurnedOnBits;
    128
    129            if ((m_nWidth % 0x100) == 0xFF) {
    130                nResponseSize += 1;
    131            }
    132
    133            if ((m_nWidth / 0x100) == 0xFF) {
    134                nResponseSize += 1;
    135            }
    136
    137            if ((m_nHeight % 0x100) == 0xFF) {
    138                nResponseSize += 1;
    139            }
    140
    141            if ((m_nHeight / 0x100) == 0xFF) {
    142                nResponseSize += 1;
    143            }
    144
    145            //
    146            // allocate response array
    147            //
    148            int response[] = new int[nResponseSize];
    149
    150            //
    151            // Build response array.
    152            // ---------------------
    153            // 1. put option name.
    154            // 2. loop through Window size and fill the values,
    155            // 3.    duplicate 'ff' if needed.
    156            //
    157
    158            response[0] = WINDOW_SIZE;                          // 1 //
    159
    160            for (                                               // 2 //
    161                nIndex=1, nShift = 24;
    162                nIndex < nResponseSize;
    163                nIndex++, nShift -=8
    164            ) {
    165                nTurnedOnBits = 0xFF;
    166                nTurnedOnBits <<= nShift;
    167                response[nIndex] = (nCompoundWindowSize & nTurnedOnBits) >>> nShift;
    168
    169                if (response[nIndex] == 0xff) {                 // 3 //
    170                    nIndex++;
    171                    response[nIndex] = 0xff;
    172                }
    173            }
    174
    175            return response;
    176        }
    177
    178        /***
    179         * Implements the abstract method of TelnetOptionHandler.
    180         * <p>
    181         * @return always null (no response to subnegotiation)
    182         ***/
    183        @Override
    184        public int[] startSubnegotiationRemote()
    185        {
    186            return null;
    187        }
    188    }