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 terminal type option RFC 1091.
022 * <p>
023 * @author Bruno D'Avanzo
024 ***/
025public class TerminalTypeOptionHandler extends TelnetOptionHandler
026{
027    /***
028     * Terminal type
029     ***/
030    private String termType = null;
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}