home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1999 April / DPPCPRO0499.ISO / April / Notes / 50b2wic.exe / DATA1.CAB / NotesProgramFilesJavaSupport / rt.jar / java / net / PlainSocketImpl.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-04-23  |  5.9 KB  |  292 lines

  1. package java.net;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.FileDescriptor;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8.  
  9. class PlainSocketImpl extends SocketImpl {
  10.    int timeout;
  11.    private static final int SOCKS_PROTO_VERS = 4;
  12.    private static final int SOCKS_REPLY_VERS = 4;
  13.    private static final int COMMAND_CONNECT = 1;
  14.    private static final int COMMAND_BIND = 2;
  15.    private static final int REQUEST_GRANTED = 90;
  16.    private static final int REQUEST_REJECTED = 91;
  17.    private static final int REQUEST_REJECTED_NO_IDENTD = 92;
  18.    private static final int REQUEST_REJECTED_DIFF_IDENTS = 93;
  19.    public static final String socksServerProp = "socksProxyHost";
  20.    public static final String socksPortProp = "socksProxyPort";
  21.    public static final String socksDefaultPortStr = "1080";
  22.  
  23.    protected synchronized void create(boolean var1) throws IOException {
  24.       super.fd = new FileDescriptor();
  25.       this.socketCreate(var1);
  26.    }
  27.  
  28.    protected void connect(String var1, int var2) throws UnknownHostException, IOException {
  29.       Object var3 = null;
  30.  
  31.       try {
  32.          InetAddress var4 = InetAddress.getByName(var1);
  33.  
  34.          try {
  35.             this.connectToAddress(var4, var2);
  36.             return;
  37.          } catch (IOException var6) {
  38.             var3 = var6;
  39.          }
  40.       } catch (UnknownHostException var7) {
  41.          var3 = var7;
  42.       }
  43.  
  44.       this.close();
  45.       throw var3;
  46.    }
  47.  
  48.    protected void connect(InetAddress var1, int var2) throws IOException {
  49.       super.port = var2;
  50.       super.address = var1;
  51.  
  52.       try {
  53.          this.connectToAddress(var1, var2);
  54.       } catch (IOException var4) {
  55.          this.close();
  56.          throw var4;
  57.       }
  58.    }
  59.  
  60.    private void connectToAddress(InetAddress var1, int var2) throws IOException {
  61.       if (this.usingSocks()) {
  62.          this.doSOCKSConnect(var1, var2);
  63.       } else {
  64.          this.doConnect(var1, var2);
  65.       }
  66.    }
  67.  
  68.    public void setOption(int var1, Object var2) throws SocketException {
  69.       boolean var3 = true;
  70.       switch (var1) {
  71.          case 1:
  72.             if (var2 == null || !(var2 instanceof Boolean)) {
  73.                throw new SocketException("bad parameter for TCP_NODELAY");
  74.             }
  75.  
  76.             var3 = (Boolean)var2;
  77.             break;
  78.          case 15:
  79.             throw new SocketException("Cannot re-bind socket");
  80.          case 128:
  81.             if (var2 == null || !(var2 instanceof Integer) && !(var2 instanceof Boolean)) {
  82.                throw new SocketException("Bad parameter for option");
  83.             }
  84.  
  85.             if (var2 instanceof Boolean) {
  86.                var3 = false;
  87.             }
  88.             break;
  89.          case 4102:
  90.             if (var2 != null && var2 instanceof Integer) {
  91.                int var4 = (Integer)var2;
  92.                if (var4 < 0) {
  93.                   throw new IllegalArgumentException("timeout < 0");
  94.                }
  95.  
  96.                this.timeout = var4;
  97.                return;
  98.             }
  99.  
  100.             throw new SocketException("Bad parameter for SO_TIMEOUT");
  101.          default:
  102.             throw new SocketException("unrecognized TCP option: " + var1);
  103.       }
  104.  
  105.       this.socketSetOption(var1, var3, var2);
  106.    }
  107.  
  108.    public Object getOption(int var1) throws SocketException {
  109.       if (var1 == 4102) {
  110.          return new Integer(this.timeout);
  111.       } else {
  112.          int var2 = this.socketGetOption(var1);
  113.          switch (var1) {
  114.             case 1:
  115.                if (var2 == -1) {
  116.                   return new Boolean(false);
  117.                }
  118.  
  119.                return new Boolean(true);
  120.             case 15:
  121.                InetAddress var3 = new InetAddress();
  122.                var3.address = var2;
  123.                return var3;
  124.             case 128:
  125.                if (var2 == -1) {
  126.                   return new Boolean(false);
  127.                }
  128.  
  129.                return new Integer(var2);
  130.             default:
  131.                return null;
  132.          }
  133.       }
  134.    }
  135.  
  136.    private void doSOCKSConnect(InetAddress var1, int var2) throws IOException {
  137.       this.connectToSocksServer();
  138.       this.sendSOCKSCommandPacket(1, var1, var2);
  139.       int var3 = this.getSOCKSReply();
  140.       switch (var3) {
  141.          case 90:
  142.             return;
  143.          case 91:
  144.          case 92:
  145.             throw new SocketException("SOCKS server cannot conect to identd");
  146.          case 93:
  147.             throw new SocketException("User name does not match identd name");
  148.          default:
  149.       }
  150.    }
  151.  
  152.    private int getSOCKSReply() throws IOException {
  153.       InputStream var1 = this.getInputStream();
  154.       byte[] var2 = new byte[8];
  155.       if (var1.read(var2) != var2.length) {
  156.          throw new SocketException("Malformed reply from SOCKS server");
  157.       } else if (var2[0] != 0) {
  158.          throw new SocketException("Malformed reply from SOCKS server");
  159.       } else {
  160.          return var2[1];
  161.       }
  162.    }
  163.  
  164.    private void connectToSocksServer() throws IOException {
  165.       String var1 = System.getProperty("socksProxyHost");
  166.       if (var1 != null) {
  167.          InetAddress var2 = InetAddress.getByName(var1);
  168.          String var3 = System.getProperty("socksProxyPort", "1080");
  169.  
  170.          int var4;
  171.          try {
  172.             var4 = Integer.parseInt(var3);
  173.          } catch (Exception var5) {
  174.             throw new SocketException("Bad port number format");
  175.          }
  176.  
  177.          this.doConnect(var2, var4);
  178.       }
  179.    }
  180.  
  181.    private void doConnect(InetAddress var1, int var2) throws IOException {
  182.       ProtocolException var3 = null;
  183.       int var4 = 0;
  184.  
  185.       while(var4 < 3) {
  186.          try {
  187.             this.socketConnect(var1, var2);
  188.             return;
  189.          } catch (ProtocolException var6) {
  190.             this.close();
  191.             super.fd = new FileDescriptor();
  192.             this.socketCreate(true);
  193.             var3 = var6;
  194.             ++var4;
  195.          } catch (IOException var7) {
  196.             this.close();
  197.             throw var7;
  198.          }
  199.       }
  200.  
  201.       this.close();
  202.       throw var3;
  203.    }
  204.  
  205.    private void sendSOCKSCommandPacket(int var1, InetAddress var2, int var3) throws IOException {
  206.       byte[] var4 = this.makeCommandPacket(var1, var2, var3);
  207.       OutputStream var5 = this.getOutputStream();
  208.       var5.write(var4);
  209.    }
  210.  
  211.    private byte[] makeCommandPacket(int var1, InetAddress var2, int var3) {
  212.       ByteArrayOutputStream var4 = new ByteArrayOutputStream(9);
  213.       var4.write(4);
  214.       var4.write(var1);
  215.       var4.write(var3 >> 8 & 255);
  216.       var4.write(var3 & 255);
  217.       byte[] var5 = var2.getAddress();
  218.       var4.write(var5, 0, var5.length);
  219.       String var6 = System.getProperty("user.name");
  220.       byte[] var7 = new byte[var6.length()];
  221.       var6.getBytes(0, var6.length(), var7, 0);
  222.       var4.write(var7, 0, var7.length);
  223.       var4.write(0);
  224.       return var4.toByteArray();
  225.    }
  226.  
  227.    private boolean usingSocks() {
  228.       return System.getProperty("socksProxyHost") != null;
  229.    }
  230.  
  231.    protected synchronized void bind(InetAddress var1, int var2) throws IOException {
  232.       this.socketBind(var1, var2);
  233.    }
  234.  
  235.    protected synchronized void listen(int var1) throws IOException {
  236.       this.socketListen(var1);
  237.    }
  238.  
  239.    protected synchronized void accept(SocketImpl var1) throws IOException {
  240.       this.socketAccept(var1);
  241.    }
  242.  
  243.    protected synchronized InputStream getInputStream() throws IOException {
  244.       return new SocketInputStream(this);
  245.    }
  246.  
  247.    protected synchronized OutputStream getOutputStream() throws IOException {
  248.       return new SocketOutputStream(this);
  249.    }
  250.  
  251.    protected synchronized int available() throws IOException {
  252.       return this.socketAvailable();
  253.    }
  254.  
  255.    protected void close() throws IOException {
  256.       if (super.fd != null) {
  257.          this.socketClose();
  258.          super.fd = null;
  259.       }
  260.  
  261.    }
  262.  
  263.    protected void finalize() throws IOException {
  264.       this.close();
  265.    }
  266.  
  267.    private native void socketCreate(boolean var1) throws IOException;
  268.  
  269.    private native void socketConnect(InetAddress var1, int var2) throws IOException;
  270.  
  271.    private native void socketBind(InetAddress var1, int var2) throws IOException;
  272.  
  273.    private native void socketListen(int var1) throws IOException;
  274.  
  275.    private native void socketAccept(SocketImpl var1) throws IOException;
  276.  
  277.    private native int socketAvailable() throws IOException;
  278.  
  279.    private native void socketClose() throws IOException;
  280.  
  281.    private static native void initProto();
  282.  
  283.    private native void socketSetOption(int var1, boolean var2, Object var3) throws SocketException;
  284.  
  285.    private native int socketGetOption(int var1) throws SocketException;
  286.  
  287.    static {
  288.       System.loadLibrary("net");
  289.       initProto();
  290.    }
  291. }
  292.