src/java.base/unix/classes/java/net/PlainDatagramSocketImpl.java

Print this page
rev 14282 : 8044773: Refactor jdk.net API so that it can be moved out of the base module
Reviewed-by:


  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 java.net;
  26 
  27 import java.io.IOException;
  28 import java.util.Set;
  29 import java.util.HashSet;
  30 import java.util.Collections;
  31 import jdk.net.*;
  32 import static sun.net.ExtendedOptionsImpl.*;
  33 
  34 /*
  35  * On Unix systems we simply delegate to native methods.
  36  *
  37  * @author Chris Hegarty
  38  */
  39 
  40 class PlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
  41 {
  42     static {
  43         init();
  44     }
  45 



  46     protected <T> void setOption(SocketOption<T> name, T value) throws IOException {
  47         if (!name.equals(ExtendedSocketOptions.SO_FLOW_SLA)) {
  48             if (!name.equals(StandardSocketOptions.SO_REUSEPORT)) {
  49                 super.setOption(name, value);
  50             } else {
  51                if (supportedOptions().contains(name)) {
  52                    super.setOption(name, value);
  53                } else {
  54                    throw new UnsupportedOperationException("unsupported option");
  55                }
  56             }
  57         } else {
  58             if (!flowSupported()) {
  59                 throw new UnsupportedOperationException("unsupported option");
  60             }
  61             if (isClosed()) {
  62                 throw new SocketException("Socket closed");
  63             }
  64             checkSetOptionPermission(name);
  65             checkValueType(value, SocketFlow.class);
  66             setFlowOption(getFileDescriptor(), (SocketFlow)value);
  67         }
  68     }
  69 
  70     @SuppressWarnings("unchecked")
  71     protected <T> T getOption(SocketOption<T> name) throws IOException {
  72         if (!name.equals(ExtendedSocketOptions.SO_FLOW_SLA)) {
  73             if (!name.equals(StandardSocketOptions.SO_REUSEPORT)) {
  74                 return super.getOption(name);
  75             } else {
  76                 if (supportedOptions().contains(name)) {
  77                     return super.getOption(name);
  78                 } else {
  79                     throw new UnsupportedOperationException("unsupported option");
  80                 }
  81             }
  82         }
  83         if (!flowSupported()) {
  84             throw new UnsupportedOperationException("unsupported option");
  85         }
  86         if (isClosed()) {
  87             throw new SocketException("Socket closed");
  88         }
  89         checkGetOptionPermission(name);
  90         SocketFlow flow = SocketFlow.create();
  91         getFlowOption(getFileDescriptor(), flow);
  92         return (T)flow;
  93     }
  94 
  95     protected Set<SocketOption<?>> supportedOptions() {
  96         HashSet<SocketOption<?>> options = new HashSet<>(
  97             super.supportedOptions());
  98 
  99         if (flowSupported()) {
 100             options.add(ExtendedSocketOptions.SO_FLOW_SLA);
 101         }
 102         return options;
 103     }
 104 
 105     protected void socketSetOption(int opt, Object val) throws SocketException {
 106         if (opt == SocketOptions.SO_REUSEPORT && !supportedOptions().contains(StandardSocketOptions.SO_REUSEPORT)) {

 107             throw new UnsupportedOperationException("unsupported option");
 108         }
 109         try {
 110             socketSetOption0(opt, val);
 111         } catch (SocketException se) {
 112             if (!connected)
 113                 throw se;
 114         }
 115     }
 116 
 117     protected synchronized native void bind0(int lport, InetAddress laddr)
 118         throws SocketException;
 119 
 120     protected native void send(DatagramPacket p) throws IOException;
 121 
 122     protected synchronized native int peek(InetAddress i) throws IOException;
 123 
 124     protected synchronized native int peekData(DatagramPacket p) throws IOException;
 125 
 126     protected synchronized native void receive0(DatagramPacket p)




  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 java.net;
  26 
  27 import java.io.IOException;
  28 import java.util.Set;
  29 import java.util.HashSet;
  30 import sun.net.ext.ExtendedSocketOptions;


  31 
  32 /*
  33  * On Unix systems we simply delegate to native methods.
  34  *
  35  * @author Chris Hegarty
  36  */
  37 
  38 class PlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
  39 {
  40     static {
  41         init();
  42     }
  43 
  44     static final ExtendedSocketOptions extendedOptions =
  45             ExtendedSocketOptions.getInstance();
  46 
  47     protected <T> void setOption(SocketOption<T> name, T value) throws IOException {
  48         if (!extendedOptions.isOptionSupported(name)) {
  49             if (!name.equals(StandardSocketOptions.SO_REUSEPORT)) {
  50                 super.setOption(name, value);
  51             } else {
  52                if (supportedOptions().contains(name)) {
  53                    super.setOption(name, value);
  54                } else {
  55                    throw new UnsupportedOperationException("unsupported option");
  56                }
  57             }
  58         } else {



  59             if (isClosed()) {
  60                 throw new SocketException("Socket closed");
  61             }
  62             extendedOptions.setOption(fd, name, value);


  63         }
  64     }
  65 
  66     @SuppressWarnings("unchecked")
  67     protected <T> T getOption(SocketOption<T> name) throws IOException {
  68         if (!extendedOptions.isOptionSupported(name)) {
  69             if (!name.equals(StandardSocketOptions.SO_REUSEPORT)) {
  70                 return super.getOption(name);
  71             } else {
  72                 if (supportedOptions().contains(name)) {
  73                     return super.getOption(name);
  74                 } else {
  75                     throw new UnsupportedOperationException("unsupported option");
  76                 }
  77             }
  78         } else {



  79             if (isClosed()) {
  80                 throw new SocketException("Socket closed");
  81             }
  82             return (T) extendedOptions.getOption(fd, name);
  83         }


  84     }
  85 
  86     protected Set<SocketOption<?>> supportedOptions() {
  87         HashSet<SocketOption<?>> options = new HashSet<>(super.supportedOptions());
  88         options.addAll(extendedOptions.options());




  89         return options;
  90     }
  91 
  92     protected void socketSetOption(int opt, Object val) throws SocketException {
  93         if (opt == SocketOptions.SO_REUSEPORT &&
  94             !supportedOptions().contains(StandardSocketOptions.SO_REUSEPORT)) {
  95             throw new UnsupportedOperationException("unsupported option");
  96         }
  97         try {
  98             socketSetOption0(opt, val);
  99         } catch (SocketException se) {
 100             if (!connected)
 101                 throw se;
 102         }
 103     }
 104 
 105     protected synchronized native void bind0(int lport, InetAddress laddr)
 106         throws SocketException;
 107 
 108     protected native void send(DatagramPacket p) throws IOException;
 109 
 110     protected synchronized native int peek(InetAddress i) throws IOException;
 111 
 112     protected synchronized native int peekData(DatagramPacket p) throws IOException;
 113 
 114     protected synchronized native void receive0(DatagramPacket p)