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: 
  44: public final class ProtocolVersion
  45:   implements Comparable<ProtocolVersion>, Constructed
  46: {
  47: 
  48:   // Constants and fields.
  49:   // -------------------------------------------------------------------------
  50: 
  51:   public static final ProtocolVersion SSL_3 = new ProtocolVersion(3, 0);
  52:   public static final ProtocolVersion TLS_1 = new ProtocolVersion(3, 1);
  53:   public static final ProtocolVersion TLS_1_1 = new ProtocolVersion(3, 2);
  54: 
  55:   private final int major;
  56:   private final int minor;
  57: 
  58:   // Constructor.
  59:   // -------------------------------------------------------------------------
  60: 
  61:   private ProtocolVersion(int major, int minor)
  62:   {
  63:     this.major = major;
  64:     this.minor = minor;
  65:   }
  66: 
  67:   // Class methods.
  68:   // -------------------------------------------------------------------------
  69: 
  70:   public static ProtocolVersion read(InputStream in) throws IOException
  71:   {
  72:     int major = in.read() & 0xFF;
  73:     int minor = in.read() & 0xFF;
  74:     return getInstance(major, minor);
  75:   }
  76: 
  77:   public static ProtocolVersion forName (final String name)
  78:   {
  79:     if (name.equalsIgnoreCase ("SSLv3"))
  80:       return SSL_3;
  81:     if (name.equalsIgnoreCase ("TLSv1"))
  82:       return TLS_1;
  83:     if (name.equalsIgnoreCase("TLSv1.1"))
  84:       return TLS_1_1;
  85:     throw new IllegalArgumentException ("unknown protocol name: " + name);
  86:   }
  87: 
  88:   public static ProtocolVersion getInstance(final int major, final int minor)
  89:   {
  90:     if (major == 3)
  91:       {
  92:         switch (minor)
  93:           {
  94:           case 0: return SSL_3;
  95:           case 1: return TLS_1;
  96:           case 2: return TLS_1_1;
  97:           }
  98:       }
  99:     return new ProtocolVersion(major, minor);
 100:   }
 101: 
 102:   public static ProtocolVersion getInstance (final short raw_value)
 103:   {
 104:     int major = raw_value >>> 8 & 0xFF;
 105:     int minor = raw_value & 0xFF;
 106:     return getInstance (major, minor);
 107:   }
 108: 
 109:   // Instance methods.
 110:   // -------------------------------------------------------------------------
 111: 
 112:   public int length ()
 113:   {
 114:     return 2;
 115:   }
 116: 
 117:   public byte[] getEncoded()
 118:   {
 119:     return new byte[] {
 120:       (byte) major, (byte) minor
 121:     };
 122:   }
 123: 
 124:   public int major()
 125:   {
 126:     return major;
 127:   }
 128: 
 129:   public int minor()
 130:   {
 131:     return minor;
 132:   }
 133: 
 134:   public int rawValue ()
 135:   {
 136:     return (major << 8) | minor;
 137:   }
 138: 
 139:   public boolean equals(Object o)
 140:   {
 141:     if (!(o instanceof ProtocolVersion))
 142:       {
 143:         return false;
 144:       }
 145:     return ((ProtocolVersion) o).major == this.major
 146:         && ((ProtocolVersion) o).minor == this.minor;
 147:   }
 148: 
 149:   public int hashCode()
 150:   {
 151:     return major << 8 | minor;
 152:   }
 153: 
 154:   public int compareTo(ProtocolVersion that)
 155:   {
 156:     if (major > that.major)
 157:       {
 158:         return 1;
 159:       }
 160:     else if (major < that.major)
 161:       {
 162:         return -1;
 163:       }
 164: 
 165:     if (minor > that.minor)
 166:       {
 167:         return 1;
 168:       }
 169:     else if (minor < that.minor)
 170:       {
 171:         return -1;
 172:       }
 173:     return 0;
 174:   }
 175: 
 176:   public String toString (String prefix)
 177:   {
 178:     return toString ();
 179:   }
 180: 
 181:   public String toString()
 182:   {
 183:     if (this == SSL_3)
 184:       {
 185:         return "SSLv3";
 186:       }
 187:     else if (this == TLS_1)
 188:       {
 189:         return "TLSv1";
 190:       }
 191:     else if (this == TLS_1_1)
 192:       {
 193:         return "TLSv1.1";
 194:       }
 195:     else
 196:       {
 197:         return "Unsupported; major=" + major + " minor=" + minor;
 198:       }
 199:   }
 200: }