1/*
2* Conditions Of Use
3*
4* This software was developed by employees of the National Institute of
5* Standards and Technology (NIST), an agency of the Federal Government.
6* Pursuant to title 15 Untied States Code Section 105, works of NIST
7* employees are not subject to copyright protection in the United States
8* and are considered to be in the public domain.  As a result, a formal
9* license is not needed to use the software.
10*
11* This software is provided by NIST as a service and is expressly
12* provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
13* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
15* AND DATA ACCURACY.  NIST does not warrant or make any representations
16* regarding the use of the software or the results thereof, including but
17* not limited to the correctness, accuracy, reliability or usefulness of
18* the software.
19*
20* Permission to use this software is contingent upon your acceptance
21* of the terms of this agreement
22*
23* .
24*
25*/
26package gov.nist.core.net;
27
28import java.io.IOException;
29import java.net.DatagramSocket;
30import java.net.InetAddress;
31import java.net.InetSocketAddress;
32import java.net.MulticastSocket;
33import java.net.ServerSocket;
34import java.net.Socket;
35import java.net.SocketException;
36
37/* Added by Daniel J. Martinez Manzano <dani@dif.um.es> */
38import javax.net.ssl.SSLSocket;
39import javax.net.ssl.SSLSocketFactory;
40import javax.net.ssl.SSLServerSocket;
41import javax.net.ssl.SSLServerSocketFactory;
42
43/**
44 * default implementation which passes straight through to java platform
45 *
46 * @author m.andrews
47 * @version 1.2
48 * @since 1.1
49 *
50 */
51public class DefaultNetworkLayer implements NetworkLayer {
52
53    private SSLSocketFactory sslSocketFactory;
54
55    private SSLServerSocketFactory sslServerSocketFactory;
56
57    /**
58     * single default network layer; for flexibility, it may be better not to
59     * make it a singleton, but singleton seems to make sense currently.
60     */
61    public static final DefaultNetworkLayer SINGLETON = new DefaultNetworkLayer();
62
63    private DefaultNetworkLayer() {
64        sslServerSocketFactory = (SSLServerSocketFactory) SSLServerSocketFactory
65                .getDefault();
66        sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
67    }
68
69    public ServerSocket createServerSocket(int port, int backlog,
70            InetAddress bindAddress) throws IOException {
71        return new ServerSocket(port, backlog, bindAddress);
72    }
73
74    public Socket createSocket(InetAddress address, int port)
75            throws IOException {
76        return new Socket(address, port);
77    }
78
79    public DatagramSocket createDatagramSocket() throws SocketException {
80        return new DatagramSocket();
81    }
82
83    public DatagramSocket createDatagramSocket(int port, InetAddress laddr)
84            throws SocketException {
85
86        if ( laddr.isMulticastAddress() ) {
87            try {
88                MulticastSocket ds = new MulticastSocket( port );
89                ds.joinGroup( laddr );
90                return ds;
91            } catch (IOException e) {
92                throw new SocketException( e.getLocalizedMessage() );
93            }
94        } else return new DatagramSocket(port, laddr);
95    }
96
97    /* Added by Daniel J. Martinez Manzano <dani@dif.um.es> */
98    public SSLServerSocket createSSLServerSocket(int port, int backlog,
99            InetAddress bindAddress) throws IOException {
100        return (SSLServerSocket) sslServerSocketFactory.createServerSocket(
101                port, backlog, bindAddress);
102    }
103
104    /* Added by Daniel J. Martinez Manzano <dani@dif.um.es> */
105    public SSLSocket createSSLSocket(InetAddress address, int port)
106            throws IOException {
107        return (SSLSocket) sslSocketFactory.createSocket(address, port);
108    }
109
110    /* Added by Daniel J. Martinez Manzano <dani@dif.um.es> */
111    public SSLSocket createSSLSocket(InetAddress address, int port,
112            InetAddress myAddress) throws IOException {
113        return (SSLSocket) sslSocketFactory.createSocket(address, port,
114                myAddress, 0);
115    }
116
117    public Socket createSocket(InetAddress address, int port,
118            InetAddress myAddress) throws IOException {
119        if (myAddress != null)
120            return new Socket(address, port, myAddress, 0);
121        else
122            return new Socket(address, port);
123    }
124
125    /**
126     * Creates a new Socket, binds it to myAddress:myPort and connects it to
127     * address:port.
128     *
129     * @param address the InetAddress that we'd like to connect to.
130     * @param port the port that we'd like to connect to
131     * @param myAddress the address that we are supposed to bind on or null
132     *        for the "any" address.
133     * @param myPort the port that we are supposed to bind on or 0 for a random
134     * one.
135     *
136     * @return a new Socket, bound on myAddress:myPort and connected to
137     * address:port.
138     * @throws IOException if binding or connecting the socket fail for a reason
139     * (exception relayed from the correspoonding Socket methods)
140     */
141    public Socket createSocket(InetAddress address, int port,
142                    InetAddress myAddress, int myPort)
143        throws IOException
144    {
145        if (myAddress != null)
146            return new Socket(address, port, myAddress, myPort);
147        else if (port != 0)
148        {
149            //myAddress is null (i.e. any)  but we have a port number
150            Socket sock = new Socket();
151            sock.bind(new InetSocketAddress(port));
152            sock.connect(new InetSocketAddress(address, port));
153            return sock;
154        }
155        else
156            return new Socket(address, port);
157    }
158
159}
160