    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 terminal type option RFC 1091.
    022     * <p>
    023     * @author Bruno D'Avanzo
    024     ***/
    025    public class TerminalTypeOptionHandler extends TelnetOptionHandler
    026    {
    027        /***
    028         * Terminal type
    029         ***/
    030        private final String termType;
    031
    032        /***
    033         * Terminal type option
    034         ***/
    035        protected static final int TERMINAL_TYPE = 24;
    036
    037        /***
    038         * Send (for subnegotiation)
    039         ***/
    040        protected static final int TERMINAL_TYPE_SEND =  1;
    041
    042        /***
    043         * Is (for subnegotiation)
    044         ***/
    045        protected static final int TERMINAL_TYPE_IS =  0;
    046
    047        /***
    048         * Constructor for the TerminalTypeOptionHandler. Allows defining desired
    049         * initial setting for local/remote activation of this option and
    050         * behaviour in case a local/remote activation request for this
    051         * option is received.
    052         * <p>
    053         * @param termtype - terminal type that will be negotiated.
    054         * @param initlocal - if set to true, a WILL is sent upon connection.
    055         * @param initremote - if set to true, a DO is sent upon connection.
    056         * @param acceptlocal - if set to true, any DO request is accepted.
    057         * @param acceptremote - if set to true, any WILL request is accepted.
    058         ***/
    059        public TerminalTypeOptionHandler(String termtype,
    060                                    boolean initlocal,
    061                                    boolean initremote,
    062                                    boolean acceptlocal,
    063                                    boolean acceptremote)
    064        {
    065            super(TelnetOption.TERMINAL_TYPE, initlocal, initremote,
    066                                          acceptlocal, acceptremote);
    067            termType = termtype;
    068        }
    069
    070        /***
    071         * Constructor for the TerminalTypeOptionHandler. Initial and accept
    072         * behaviour flags are set to false
    073         * <p>
    074         * @param termtype - terminal type that will be negotiated.
    075         ***/
    076        public TerminalTypeOptionHandler(String termtype)
    077        {
    078            super(TelnetOption.TERMINAL_TYPE, false, false, false, false);
    079            termType = termtype;
    080        }
    081
    082        /***
    083         * Implements the abstract method of TelnetOptionHandler.
    084         * <p>
    085         * @param suboptionData - the sequence received, whithout IAC SB & IAC SE
    086         * @param suboptionLength - the length of data in suboption_data
    087         * <p>
    088         * @return terminal type information
    089         ***/
    090        @Override
    091        public int[] answerSubnegotiation(int suboptionData[], int suboptionLength)
    092        {
    093            if ((suboptionData != null) && (suboptionLength > 1)
    094                && (termType != null))
    095            {
    096                if ((suboptionData[0] == TERMINAL_TYPE)
    097                    && (suboptionData[1] == TERMINAL_TYPE_SEND))
    098                {
    099                    int response[] = new int[termType.length() + 2];
    100
    101                    response[0] = TERMINAL_TYPE;
    102                    response[1] = TERMINAL_TYPE_IS;
    103
    104                    for (int ii = 0; ii < termType.length(); ii++)
    105                    {
    106                        response[ii + 2] = termType.charAt(ii);
    107                    }
    108
    109                    return response;
    110                }
    111            }
    112            return null;
    113        }
    114
    115        /***
    116         * Implements the abstract method of TelnetOptionHandler.
    117         * <p>
    118         * @return always null (no response to subnegotiation)
    119         ***/
    120        @Override
    121        public int[] startSubnegotiationLocal()
    122        {
    123            return null;
    124        }
    125
    126        /***
    127         * Implements the abstract method of TelnetOptionHandler.
    128         * <p>
    129         * @return always null (no response to subnegotiation)
    130         ***/
    131        @Override
    132        public int[] startSubnegotiationRemote()
    133        {
    134            return null;
    135        }
    136    }