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 22 * for implementing handlers for telnet options. 23 * <p> 24 * TelnetOptionHandler implements basic option handling 25 * functionality and defines abstract methods that must be 26 * implemented to define subnegotiation behaviour. 27 * <p> 28 * @author Bruno D'Avanzo 29 ***/ 30 public abstract class TelnetOptionHandler 31 { 32 /*** 33 * Option code 34 ***/ 35 private int optionCode = -1; 36 37 /*** 38 * true if the option should be activated on the local side 39 ***/ 40 private boolean initialLocal = false; 41 42 /*** 43 * true if the option should be activated on the remote side 44 ***/ 45 private boolean initialRemote = false; 46 47 /*** 48 * true if the option should be accepted on the local side 49 ***/ 50 private boolean acceptLocal = false; 51 52 /*** 53 * true if the option should be accepted on the remote side 54 ***/ 55 private boolean acceptRemote = false; 56 57 /*** 58 * true if the option is active on the local side 59 ***/ 60 private boolean doFlag = false; 61 62 /*** 63 * true if the option is active on the remote side 64 ***/ 65 private boolean willFlag = false; 66 67 /*** 68 * Constructor for the TelnetOptionHandler. Allows defining desired 69 * initial setting for local/remote activation of this option and 70 * behaviour in case a local/remote activation request for this 71 * option is received. 72 * <p> 73 * @param optcode - Option code. 74 * @param initlocal - if set to true, a WILL is sent upon connection. 75 * @param initremote - if set to true, a DO is sent upon connection. 76 * @param acceptlocal - if set to true, any DO request is accepted. 77 * @param acceptremote - if set to true, any WILL request is accepted. 78 ***/ 79 public TelnetOptionHandler(int optcode, 80 boolean initlocal, 81 boolean initremote, 82 boolean acceptlocal, 83 boolean acceptremote) 84 { 85 optionCode = optcode; 86 initialLocal = initlocal; 87 initialRemote = initremote; 88 acceptLocal = acceptlocal; 89 acceptRemote = acceptremote; 90 } 91 92 93 /*** 94 * Returns the option code for this option. 95 * <p> 96 * @return Option code. 97 ***/ 98 public int getOptionCode() 99 { 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 }