1 /* 2 * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 package sun.net.ftp; 26 27 /** 28 * This class describes a FTP protocol reply code and associates a meaning 29 * to the numerical value according to the various RFCs (RFC 959 in 30 * particular). 31 * 32 */ 33 public enum FtpReplyCode { 34 35 RESTART_MARKER(110), 36 SERVICE_READY_IN(120), 37 DATA_CONNECTION_ALREADY_OPEN(125), 38 FILE_STATUS_OK(150), 39 COMMAND_OK(200), 40 NOT_IMPLEMENTED(202), 41 SYSTEM_STATUS(211), 42 DIRECTORY_STATUS(212), 43 FILE_STATUS(213), 44 HELP_MESSAGE(214), 45 NAME_SYSTEM_TYPE(215), 46 SERVICE_READY(220), 47 SERVICE_CLOSING(221), 48 DATA_CONNECTION_OPEN(225), 49 CLOSING_DATA_CONNECTION(226), 50 ENTERING_PASSIVE_MODE(227), 51 ENTERING_EXT_PASSIVE_MODE(229), 52 LOGGED_IN(230), 53 SECURELY_LOGGED_IN(232), 54 SECURITY_EXCHANGE_OK(234), 55 SECURITY_EXCHANGE_COMPLETE(235), 56 FILE_ACTION_OK(250), 57 PATHNAME_CREATED(257), 58 NEED_PASSWORD(331), 59 NEED_ACCOUNT(332), 60 NEED_ADAT(334), 61 NEED_MORE_ADAT(335), 62 FILE_ACTION_PENDING(350), 63 SERVICE_NOT_AVAILABLE(421), 64 CANT_OPEN_DATA_CONNECTION(425), 65 CONNECTION_CLOSED(426), 66 NEED_SECURITY_RESOURCE(431), 67 FILE_ACTION_NOT_TAKEN(450), 68 ACTION_ABORTED(451), 69 INSUFFICIENT_STORAGE(452), 70 COMMAND_UNRECOGNIZED(500), 71 INVALID_PARAMETER(501), 72 BAD_SEQUENCE(503), 73 NOT_IMPLEMENTED_FOR_PARAMETER(504), 74 NOT_LOGGED_IN(530), 75 NEED_ACCOUNT_FOR_STORING(532), 76 PROT_LEVEL_DENIED(533), 77 REQUEST_DENIED(534), 78 FAILED_SECURITY_CHECK(535), 79 UNSUPPORTED_PROT_LEVEL(536), 80 PROT_LEVEL_NOT_SUPPORTED_BY_SECURITY(537), 81 FILE_UNAVAILABLE(550), 82 PAGE_TYPE_UNKNOWN(551), 83 EXCEEDED_STORAGE(552), 84 FILE_NAME_NOT_ALLOWED(553), 85 PROTECTED_REPLY(631), 86 UNKNOWN_ERROR(999); 87 private final int value; 88 FtpReplyCode(int val)89 FtpReplyCode(int val) { 90 this.value = val; 91 } 92 93 /** 94 * Returns the numerical value of the code. 95 * 96 * @return the numerical value. 97 */ getValue()98 public int getValue() { 99 return value; 100 } 101 102 /** 103 * Determines if the code is a Positive Preliminary response. 104 * This means beginning with a 1 (which means a value between 100 and 199) 105 * 106 * @return <code>true</code> if the reply code is a positive preliminary 107 * response. 108 */ isPositivePreliminary()109 public boolean isPositivePreliminary() { 110 return value >= 100 && value < 200; 111 } 112 113 /** 114 * Determines if the code is a Positive Completion response. 115 * This means beginning with a 2 (which means a value between 200 and 299) 116 * 117 * @return <code>true</code> if the reply code is a positive completion 118 * response. 119 */ isPositiveCompletion()120 public boolean isPositiveCompletion() { 121 return value >= 200 && value < 300; 122 } 123 124 /** 125 * Determines if the code is a positive internediate response. 126 * This means beginning with a 3 (which means a value between 300 and 399) 127 * 128 * @return <code>true</code> if the reply code is a positive intermediate 129 * response. 130 */ isPositiveIntermediate()131 public boolean isPositiveIntermediate() { 132 return value >= 300 && value < 400; 133 } 134 135 /** 136 * Determines if the code is a transient negative response. 137 * This means beginning with a 4 (which means a value between 400 and 499) 138 * 139 * @return <code>true</code> if the reply code is a transient negative 140 * response. 141 */ isTransientNegative()142 public boolean isTransientNegative() { 143 return value >= 400 && value < 500; 144 } 145 146 /** 147 * Determines if the code is a permanent negative response. 148 * This means beginning with a 5 (which means a value between 500 and 599) 149 * 150 * @return <code>true</code> if the reply code is a permanent negative 151 * response. 152 */ isPermanentNegative()153 public boolean isPermanentNegative() { 154 return value >= 500 && value < 600; 155 } 156 157 /** 158 * Determines if the code is a protected reply response. 159 * This means beginning with a 6 (which means a value between 600 and 699) 160 * 161 * @return <code>true</code> if the reply code is a protected reply 162 * response. 163 */ isProtectedReply()164 public boolean isProtectedReply() { 165 return value >= 600 && value < 700; 166 } 167 168 /** 169 * Determines if the code is a syntax related response. 170 * This means the second digit is a 0. 171 * 172 * @return <code>true</code> if the reply code is a syntax related 173 * response. 174 */ isSyntax()175 public boolean isSyntax() { 176 return ((value / 10) - ((value / 100) * 10)) == 0; 177 } 178 179 /** 180 * Determines if the code is an information related response. 181 * This means the second digit is a 1. 182 * 183 * @return <code>true</code> if the reply code is an information related 184 * response. 185 */ isInformation()186 public boolean isInformation() { 187 return ((value / 10) - ((value / 100) * 10)) == 1; 188 } 189 190 /** 191 * Determines if the code is a connection related response. 192 * This means the second digit is a 2. 193 * 194 * @return <code>true</code> if the reply code is a connection related 195 * response. 196 */ isConnection()197 public boolean isConnection() { 198 return ((value / 10) - ((value / 100) * 10)) == 2; 199 } 200 201 /** 202 * Determines if the code is an authentication related response. 203 * This means the second digit is a 3. 204 * 205 * @return <code>true</code> if the reply code is an authentication related 206 * response. 207 */ isAuthentication()208 public boolean isAuthentication() { 209 return ((value / 10) - ((value / 100) * 10)) == 3; 210 } 211 212 /** 213 * Determines if the code is an unspecified type of response. 214 * This means the second digit is a 4. 215 * 216 * @return <code>true</code> if the reply code is an unspecified type of 217 * response. 218 */ isUnspecified()219 public boolean isUnspecified() { 220 return ((value / 10) - ((value / 100) * 10)) == 4; 221 } 222 223 /** 224 * Determines if the code is a file system related response. 225 * This means the second digit is a 5. 226 * 227 * @return <code>true</code> if the reply code is a file system related 228 * response. 229 */ isFileSystem()230 public boolean isFileSystem() { 231 return ((value / 10) - ((value / 100) * 10)) == 5; 232 } 233 234 /** 235 * Static utility method to convert a value into a FtpReplyCode. 236 * 237 * @param v the value to convert 238 * @return the <code>FtpReplyCode</code> associated with the value. 239 */ find(int v)240 public static FtpReplyCode find(int v) { 241 for (FtpReplyCode code : FtpReplyCode.values()) { 242 if (code.getValue() == v) { 243 return code; 244 } 245 } 246 return UNKNOWN_ERROR; 247 } 248 } 249