Source for gnu.javax.net.ssl.provider.ProtocolVersion

   1: /* ProtocolVersion.java -- An SSL version number.
   2:    Copyright (C) 2006  Free Software Foundation, Inc.
   3: 
   4: This file is a part of GNU Classpath.
   5: 
   6: GNU Classpath is free software; you can redistribute it and/or modify
   7: it under the terms of the GNU General Public License as published by
   8: the Free Software Foundation; either version 2 of the License, or (at
   9: your option) any later version.
  10: 
  11: GNU Classpath is distributed in the hope that it will be useful, but
  12: WITHOUT ANY WARRANTY; without even the implied warranty of
  13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14: General Public License for more details.
  15: 
  16: You should have received a copy of the GNU General Public License
  17: along with GNU Classpath; if not, write to the Free Software
  18: Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
  19: USA
  20: 
  21: Linking this library statically or dynamically with other modules is
  22: making a combined work based on this library.  Thus, the terms and
  23: conditions of the GNU General Public License cover the whole
  24: combination.
  25: 
  26: As a special exception, the copyright holders of this library give you
  27: permission to link this library with independent modules to produce an
  28: executable, regardless of the license terms of these independent
  29: modules, and to copy and distribute the resulting executable under
  30: terms of your choice, provided that you also meet, for each linked
  31: independent module, the terms and conditions of the license of that
  32: module.  An independent module is a module which is not derived from
  33: or based on this library.  If you modify this library, you may extend
  34: this exception to your version of the library, but you are not
  35: obligated to do so.  If you do not wish to do so, delete this
  36: exception statement from your version.  */
  37: 
  38: 
  39: package gnu.javax.net.ssl.provider;
  40: 
  41: import java.io.InputStream;
  42: import java.io.IOException;
  43: import java.io.OutputStream;
  44: 
  45: public final class ProtocolVersion
  46:   implements Comparable<ProtocolVersion>, Constructed
  47: {
  48: 
  49:   // Constants and fields.
  50:   // -------------------------------------------------------------------------
  51: 
  52:   public static final ProtocolVersion SSL_3 = new ProtocolVersion(3, 0);
  53:   public static final ProtocolVersion TLS_1 = new ProtocolVersion(3, 1);
  54:   public static final ProtocolVersion TLS_1_1 = new ProtocolVersion(3, 2);
  55: 
  56:   private final int major;
  57:   private final int minor;
  58: 
  59:   // Constructor.
  60:   // -------------------------------------------------------------------------
  61: 
  62:   private ProtocolVersion(int major, int minor)
  63:   {
  64:     this.major = major;
  65:     this.minor = minor;
  66:   }
  67: 
  68:   // Class methods.
  69:   // -------------------------------------------------------------------------
  70: 
  71:   public static ProtocolVersion read(InputStream in) throws IOException
  72:   {
  73:     int major = in.read() & 0xFF;
  74:     int minor = in.read() & 0xFF;
  75:     return getInstance(major, minor);
  76:   }
  77: 
  78:   public static ProtocolVersion forName (final String name)
  79:   {
  80:     if (name.equalsIgnoreCase ("SSLv3"))
  81:       return SSL_3;
  82:     if (name.equalsIgnoreCase ("TLSv1"))
  83:       return TLS_1;
  84:     if (name.equalsIgnoreCase("TLSv1.1"))
  85:       return TLS_1_1;
  86:     throw new IllegalArgumentException ("unknown protocol name: " + name);
  87:   }
  88: 
  89:   public static ProtocolVersion getInstance(final int major, final int minor)
  90:   {
  91:     if (major == 3)
  92:       {
  93:         switch (minor)
  94:           {
  95:           case 0: return SSL_3;
  96:           case 1: return TLS_1;
  97:           case 2: return TLS_1_1;
  98:           }
  99:       }
 100:     return new ProtocolVersion(major, minor);
 101:   }
 102: 
 103:   public static ProtocolVersion getInstance (final short raw_value)
 104:   {
 105:     int major = raw_value >>> 8 & 0xFF;
 106:     int minor = raw_value & 0xFF;
 107:     return getInstance (major, minor);
 108:   }
 109: 
 110:   // Instance methods.
 111:   // -------------------------------------------------------------------------
 112: 
 113:   public int length ()
 114:   {
 115:     return 2;
 116:   }
 117: 
 118:   public byte[] getEncoded()
 119:   {
 120:     return new byte[] {
 121:       (byte) major, (byte) minor
 122:     };
 123:   }
 124: 
 125:   public int major()
 126:   {
 127:     return major;
 128:   }
 129: 
 130:   public int minor()
 131:   {
 132:     return minor;
 133:   }
 134: 
 135:   public int rawValue ()
 136:   {
 137:     return (major << 8) | minor;
 138:   }
 139: 
 140:   public boolean equals(Object o)
 141:   {
 142:     if (!(o instanceof ProtocolVersion))
 143:       {
 144:         return false;
 145:       }
 146:     return ((ProtocolVersion) o).major == this.major
 147:         && ((ProtocolVersion) o).minor == this.minor;
 148:   }
 149: 
 150:   public int hashCode()
 151:   {
 152:     return major << 8 | minor;
 153:   }
 154: 
 155:   public int compareTo(ProtocolVersion that)
 156:   {
 157:     if (major > that.major)
 158:       {
 159:         return 1;
 160:       }
 161:     else if (major < that.major)
 162:       {
 163:         return -1;
 164:       }
 165: 
 166:     if (minor > that.minor)
 167:       {
 168:         return 1;
 169:       }
 170:     else if (minor < that.minor)
 171:       {
 172:         return -1;
 173:       }
 174:     return 0;
 175:   }
 176: 
 177:   public String toString (String prefix)
 178:   {
 179:     return toString ();
 180:   }
 181: 
 182:   public String toString()
 183:   {
 184:     if (this == SSL_3)
 185:       {
 186:         return "SSLv3";
 187:       }
 188:     else if (this == TLS_1)
 189:       {
 190:         return "TLSv1";
 191:       }
 192:     else if (this == TLS_1_1)
 193:       {
 194:         return "TLSv1.1";
 195:       }
 196:     else
 197:       {
 198:         return "Unsupported; major=" + major + " minor=" + minor;
 199:       }
 200:   }
 201: }