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