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 * The TelnetOptionHandler class is the base class to be used for implementing handlers for telnet options.
022 * <p>
023 * TelnetOptionHandler implements basic option handling functionality and defines abstract methods that must be implemented to define subnegotiation behavior.
024 */
025public abstract class TelnetOptionHandler {
026    /**
027     * Option code
028     */
029    private int optionCode = -1;
030
031    /**
032     * true if the option should be activated on the local side
033     */
034    private boolean initialLocal;
035
036    /**
037     * true if the option should be activated on the remote side
038     */
039    private boolean initialRemote;
040
041    /**
042     * true if the option should be accepted on the local side
043     */
044    private boolean acceptLocal;
045
046    /**
047     * true if the option should be accepted on the remote side
048     */
049    private boolean acceptRemote;
050
051    /**
052     * true if the option is active on the local side
053     */
054    private boolean doFlag;
055
056    /**
057     * true if the option is active on the remote side
058     */
059    private boolean willFlag;
060
061    /**
062     * Constructor for the TelnetOptionHandler. Allows defining desired initial setting for local/remote activation of this option and behavior in case a
063     * local/remote activation request for this option is received.
064     * <p>
065     *
066     * @param optcode      - Option code.
067     * @param initlocal    - if set to true, a WILL is sent upon connection.
068     * @param initremote   - if set to true, a DO is sent upon connection.
069     * @param acceptlocal  - if set to true, any DO request is accepted.
070     * @param acceptremote - if set to true, any WILL request is accepted.
071     */
072    public TelnetOptionHandler(final int optcode, final boolean initlocal, final boolean initremote, final boolean acceptlocal, final boolean acceptremote) {
073        optionCode = optcode;
074        initialLocal = initlocal;
075        initialRemote = initremote;
076        acceptLocal = acceptlocal;
077        acceptRemote = acceptremote;
078    }
079
080    /**
081     * Method called upon reception of a subnegotiation for this option coming from the other end.
082     * <p>
083     * This implementation returns null, and must be overridden by the actual TelnetOptionHandler to specify which response must be sent for the subnegotiation
084     * request.
085     * <p>
086     *
087     * @param suboptionData   - the sequence received, without IAC SB &amp; IAC SE
088     * @param suboptionLength - the length of data in suboption_data
089     *                        <p>
090     * @return response to be sent to the subnegotiation sequence. TelnetClient will add IAC SB &amp; IAC SE. null means no response
091     */
092    public int[] answerSubnegotiation(final int suboptionData[], final int suboptionLength) {
093        return null;
094    }
095
096    /**
097     * Returns a boolean indicating whether to accept a DO request coming from the other end.
098     * <p>
099     *
100     * @return true if a DO request shall be accepted.
101     */
102    public boolean getAcceptLocal() {
103        return acceptLocal;
104    }
105
106    /**
107     * Returns a boolean indicating whether to accept a WILL request coming from the other end.
108     * <p>
109     *
110     * @return true if a WILL request shall be accepted.
111     */
112    public boolean getAcceptRemote() {
113        return acceptRemote;
114    }
115
116    /**
117     * Returns a boolean indicating whether a DO request sent to the other side has been acknowledged.
118     * <p>
119     *
120     * @return true if a DO sent to the other side has been acknowledged.
121     */
122    boolean getDo() {
123        return doFlag;
124    }
125
126    /**
127     * Returns a boolean indicating whether to send a WILL request to the other end upon connection.
128     * <p>
129     *
130     * @return true if a WILL request shall be sent upon connection.
131     */
132    public boolean getInitLocal() {
133        return initialLocal;
134    }
135
136    /**
137     * Returns a boolean indicating whether to send a DO request to the other end upon connection.
138     * <p>
139     *
140     * @return true if a DO request shall be sent upon connection.
141     */
142    public boolean getInitRemote() {
143        return initialRemote;
144    }
145
146    /**
147     * Returns the option code for this option.
148     * <p>
149     *
150     * @return Option code.
151     */
152    public int getOptionCode() {
153        return optionCode;
154    }
155
156    /**
157     * Returns a boolean indicating whether a WILL request sent to the other side has been acknowledged.
158     * <p>
159     *
160     * @return true if a WILL sent to the other side has been acknowledged.
161     */
162    boolean getWill() {
163        return willFlag;
164    }
165
166    /**
167     * Set behavior of the option for DO requests coming from the other end.
168     * <p>
169     *
170     * @param accept - if true, subsequent DO requests will be accepted.
171     */
172    public void setAcceptLocal(final boolean accept) {
173        acceptLocal = accept;
174    }
175
176    /**
177     * Set behavior of the option for WILL requests coming from the other end.
178     * <p>
179     *
180     * @param accept - if true, subsequent WILL requests will be accepted.
181     */
182    public void setAcceptRemote(final boolean accept) {
183        acceptRemote = accept;
184    }
185
186    /**
187     * Tells this option whether a DO request sent to the other side has been acknowledged (invoked by TelnetClient).
188     * <p>
189     *
190     * @param state - if true, a DO request has been acknowledged.
191     */
192    void setDo(final boolean state) {
193        doFlag = state;
194    }
195
196    /**
197     * Tells this option whether to send a WILL request upon connection.
198     * <p>
199     *
200     * @param init - if true, a WILL request will be sent upon subsequent connections.
201     */
202    public void setInitLocal(final boolean init) {
203        initialLocal = init;
204    }
205
206    /**
207     * Tells this option whether to send a DO request upon connection.
208     * <p>
209     *
210     * @param init - if true, a DO request will be sent upon subsequent connections.
211     */
212    public void setInitRemote(final boolean init) {
213        initialRemote = init;
214    }
215
216    /**
217     * Tells this option whether a WILL request sent to the other side has been acknowledged (invoked by TelnetClient).
218     * <p>
219     *
220     * @param state - if true, a WILL request has been acknowledged.
221     */
222    void setWill(final boolean state) {
223        willFlag = state;
224    }
225
226    /**
227     * This method is invoked whenever this option is acknowledged active on the local end (TelnetClient sent a WILL, remote side sent a DO). The method is used
228     * to specify a subnegotiation sequence that will be sent by TelnetClient when the option is activated.
229     * <p>
230     * This implementation returns null, and must be overriden by the actual TelnetOptionHandler to specify which response must be sent for the subnegotiation
231     * request.
232     *
233     * @return subnegotiation sequence to be sent by TelnetClient. TelnetClient will add IAC SB &amp; IAC SE. null means no subnegotiation.
234     */
235    public int[] startSubnegotiationLocal() {
236        return null;
237    }
238
239    /**
240     * This method is invoked whenever this option is acknowledged active on the remote end (TelnetClient sent a DO, remote side sent a WILL). The method is
241     * used to specify a subnegotiation sequence that will be sent by TelnetClient when the option is activated.
242     * <p>
243     * This implementation returns null, and must be overriden by the actual TelnetOptionHandler to specify which response must be sent for the subnegotiation
244     * request.
245     *
246     * @return subnegotiation sequence to be sent by TelnetClient. TelnetClient will add IAC SB &amp; IAC SE. null means no subnegotiation.
247     */
248    public int[] startSubnegotiationRemote() {
249        return null;
250    }
251}