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
018package 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 658520 2008-05-21 01:14:11Z sebb $
025 * @since 2.0
026 ***/
027public 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 always null (no response to subnegotiation)
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}