View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.commons.net.telnet;
19  
20  /**
21   * The TelnetOptionHandler class is the base class to be used for implementing handlers for telnet options.
22   * <p>
23   * TelnetOptionHandler implements basic option handling functionality and defines abstract methods that must be implemented to define subnegotiation behavior.
24   * </p>
25   */
26  public abstract class TelnetOptionHandler {
27      /**
28       * Option code
29       */
30      private int optionCode = -1;
31  
32      /**
33       * true if the option should be activated on the local side
34       */
35      private boolean initialLocal;
36  
37      /**
38       * true if the option should be activated on the remote side
39       */
40      private boolean initialRemote;
41  
42      /**
43       * true if the option should be accepted on the local side
44       */
45      private boolean acceptLocal;
46  
47      /**
48       * true if the option should be accepted on the remote side
49       */
50      private boolean acceptRemote;
51  
52      /**
53       * true if the option is active on the local side
54       */
55      private boolean doFlag;
56  
57      /**
58       * true if the option is active on the remote side
59       */
60      private boolean willFlag;
61  
62      /**
63       * Constructor for the TelnetOptionHandler. Allows defining desired initial setting for local/remote activation of this option and behavior in case a
64       * local/remote activation request for this option is received.
65       *
66       * @param optcode      - Option code.
67       * @param initlocal    - if set to true, a {@code WILL} is sent upon connection.
68       * @param initremote   - if set to true, a {@code DO} is sent upon connection.
69       * @param acceptlocal  - if set to true, any {@code DO} request is accepted.
70       * @param acceptremote - if set to true, any {@code WILL} request is accepted.
71       */
72      public TelnetOptionHandler(final int optcode, final boolean initlocal, final boolean initremote, final boolean acceptlocal, final boolean acceptremote) {
73          optionCode = optcode;
74          initialLocal = initlocal;
75          initialRemote = initremote;
76          acceptLocal = acceptlocal;
77          acceptRemote = acceptremote;
78      }
79  
80      /**
81       * Method called upon reception of a subnegotiation for this option coming from the other end.
82       * <p>
83       * This implementation returns null, and must be overridden by the actual TelnetOptionHandler to specify which response must be sent for the subnegotiation
84       * request.
85       * </p>
86       *
87       * @param suboptionData   - the sequence received, without IAC SB &amp; IAC SE
88       * @param suboptionLength - the length of data in suboption_data
89       * @return response to be sent to the subnegotiation sequence. TelnetClient will add IAC SB &amp; IAC SE. null means no response
90       */
91      public int[] answerSubnegotiation(final int suboptionData[], final int suboptionLength) {
92          return null;
93      }
94  
95      /**
96       * Gets a boolean indicating whether to accept a DO request coming from the other end.
97       *
98       * @return true if a {@code DO} request shall be accepted.
99       */
100     public boolean getAcceptLocal() {
101         return acceptLocal;
102     }
103 
104     /**
105      * Gets a boolean indicating whether to accept a WILL request coming from the other end.
106      *
107      * @return true if a {@code WILL} request shall be accepted.
108      */
109     public boolean getAcceptRemote() {
110         return acceptRemote;
111     }
112 
113     /**
114      * Gets a boolean indicating whether a {@code DO} request sent to the other side has been acknowledged.
115      *
116      * @return true if a {@code DO} sent to the other side has been acknowledged.
117      */
118     boolean getDo() {
119         return doFlag;
120     }
121 
122     /**
123      * Gets a boolean indicating whether to send a WILL request to the other end upon connection.
124      *
125      * @return true if a {@code WILL} request shall be sent upon connection.
126      */
127     public boolean getInitLocal() {
128         return initialLocal;
129     }
130 
131     /**
132      * Gets a boolean indicating whether to send a DO request to the other end upon connection.
133      *
134      * @return true if a {@code DO} request shall be sent upon connection.
135      */
136     public boolean getInitRemote() {
137         return initialRemote;
138     }
139 
140     /**
141      * Gets the option code for this option.
142      *
143      * @return Option code.
144      */
145     public int getOptionCode() {
146         return optionCode;
147     }
148 
149     /**
150      * Gets a boolean indicating whether a {@code WILL} request sent to the other side has been acknowledged.
151      *
152      * @return true if a {@code WILL} sent to the other side has been acknowledged.
153      */
154     boolean getWill() {
155         return willFlag;
156     }
157 
158     /**
159      * Sets behavior of the option for DO requests coming from the other end.
160      *
161      * @param accept - if true, subsequent DO requests will be accepted.
162      */
163     public void setAcceptLocal(final boolean accept) {
164         acceptLocal = accept;
165     }
166 
167     /**
168      * Sets behavior of the option for {@code WILL} requests coming from the other end.
169      *
170      * @param accept - if true, subsequent {@code WILL} requests will be accepted.
171      */
172     public void setAcceptRemote(final boolean accept) {
173         acceptRemote = accept;
174     }
175 
176     /**
177      * Sets this option whether a {@code DO} request sent to the other side has been acknowledged (invoked by TelnetClient).
178      *
179      * @param state - if true, a {@code DO} request has been acknowledged.
180      */
181     void setDo(final boolean state) {
182         doFlag = state;
183     }
184 
185     /**
186      * Sets this option whether to send a {@code WILL} request upon connection.
187      *
188      * @param init - if true, a {@code WILL} request will be sent upon subsequent connections.
189      */
190     public void setInitLocal(final boolean init) {
191         initialLocal = init;
192     }
193 
194     /**
195      * Sets this option whether to send a {@code DO} request upon connection.
196      *
197      * @param init - if true, a {@code DO} request will be sent upon subsequent connections.
198      */
199     public void setInitRemote(final boolean init) {
200         initialRemote = init;
201     }
202 
203     /**
204      * Sets this option whether a {@code WILL} request sent to the other side has been acknowledged (invoked by TelnetClient).
205      *
206      * @param state - if true, a {@code WILL} request has been acknowledged.
207      */
208     void setWill(final boolean state) {
209         willFlag = state;
210     }
211 
212     /**
213      * 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
214      * to specify a subnegotiation sequence that will be sent by TelnetClient when the option is activated.
215      * <p>
216      * This implementation returns null, and must be overriden by the actual TelnetOptionHandler to specify which response must be sent for the subnegotiation
217      * request.
218      * </p>
219      *
220      * @return subnegotiation sequence to be sent by TelnetClient. TelnetClient will add IAC SB &amp; IAC SE. null means no subnegotiation.
221      */
222     public int[] startSubnegotiationLocal() {
223         return null;
224     }
225 
226     /**
227      * 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
228      * used 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 overridden by the actual TelnetOptionHandler to specify which response must be sent for the subnegotiation
231      * request.
232      * </p>
233      *
234      * @return subnegotiation sequence to be sent by TelnetClient. TelnetClient will add IAC SB &amp; IAC SE. null means no subnegotiation.
235      */
236     public int[] startSubnegotiationRemote() {
237         return null;
238     }
239 }