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