View Javadoc

    1   /*
    2    *  Licensed to the Apache Software Foundation (ASF) under one
    3    *  or more contributor license agreements.  See the NOTICE file
    4    *  distributed with this work for additional information
    5    *  regarding copyright ownership.  The ASF licenses this file
    6    *  to you under the Apache License, Version 2.0 (the
    7    *  "License"); you may not use this file except in compliance
    8    *  with the License.  You may obtain a copy of the License at
    9    *
    10   *    http://www.apache.org/licenses/LICENSE-2.0
    11   *
    12   *  Unless required by applicable law or agreed to in writing,
    13   *  software distributed under the License is distributed on an
    14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    15   *  KIND, either express or implied.  See the License for the
    16   *  specific language governing permissions and limitations
    17   *  under the License.
    18   *
    19   */
    20  package org.apache.mina.transport.socket.apr;
    21
    22  import java.net.InetSocketAddress;
    23
    24  import org.apache.mina.core.RuntimeIoException;
    25  import org.apache.mina.core.buffer.IoBuffer;
    26  import org.apache.mina.core.service.DefaultTransportMetadata;
    27  import org.apache.mina.core.service.IoProcessor;
    28  import org.apache.mina.core.service.IoService;
    29  import org.apache.mina.core.service.TransportMetadata;
    30  import org.apache.mina.core.session.IoSession;
    31  import org.apache.mina.transport.socket.AbstractDatagramSessionConfig;
    32  import org.apache.mina.transport.socket.DatagramSessionConfig;
    33  import org.apache.tomcat.jni.Socket;
    34
    35  /**
    36   * An {@link IoSession} for APR UDP datagram based session.
    37   * It's implementing the usual common features for {@link DatagramSessionConfig}.
    38   *
    39   * @author <a href="http://mina.apache.org">Apache MINA Project</a>
    40   */
    41  class AprDatagramSession extends AprSession {
    42
    43      static final TransportMetadata METADATA = new DefaultTransportMetadata("apr", "datagram", true, false,
    44              InetSocketAddress.class, DatagramSessionConfig.class, IoBuffer.class);
    45
    46      /**
    47       * Create an instance of {@link AprDatagramSession}.
    48       *
    49       * {@inheritDoc}
    50       */
    51      AprDatagramSession(IoService service, IoProcessor<AprSession> processor, long descriptor,
    52              InetSocketAddress remoteAddress) throws Exception {
    53          super(service, processor, descriptor, remoteAddress);
    54          config = new SessionConfigImpl();
    55          this.config.setAll(service.getSessionConfig());
    56      }
    57
    58      /**
    59       * {@inheritDoc}
    60       */
    61      public DatagramSessionConfig getConfig() {
    62          return (DatagramSessionConfig) config;
    63      }
    64
    65      /**
    66       * {@inheritDoc}
    67       */
    68      public TransportMetadata getTransportMetadata() {
    69          return METADATA;
    70      }
    71
    72      /**
    73       * The implementation for the {@link org.apache.mina.core.session.IoSessionConfig} related to APR UDP socket.
    74       * @author <a href="http://mina.apache.org">Apache MINA Project</a>
    75       */
    76      private class SessionConfigImpl extends AbstractDatagramSessionConfig {
    77          /**
    78           * {@inheritDoc}
    79           */
    80          public boolean isReuseAddress() {
    81              try {
    82                  return Socket.optGet(getDescriptor(), Socket.APR_SO_REUSEADDR) == 1;
    83              } catch (Exception e) {
    84                  throw new RuntimeIoException("Failed to get SO_REUSEADDR.", e);
    85              }
    86          }
    87
    88          /**
    89           * {@inheritDoc}
    90           */
    91          public void setReuseAddress(boolean on) {
    92              Socket.optSet(getDescriptor(), Socket.APR_SO_REUSEADDR, on ? 1 : 0);
    93          }
    94
    95          /**
    96           * {@inheritDoc}
    97           */
    98          public int getTrafficClass() {
    99              return 0;
    100         }
    101
    102         /**
    103          * {@inheritDoc}
    104          */
    105         public void setTrafficClass(int tc) {
    106         }
    107
    108         /**
    109          * {@inheritDoc}
    110          */
    111         public int getSendBufferSize() {
    112             try {
    113                 return Socket.optGet(getDescriptor(), Socket.APR_SO_SNDBUF);
    114             } catch (Exception e) {
    115                 throw new RuntimeException("APR Exception", e);
    116             }
    117         }
    118
    119         /**
    120          * {@inheritDoc}
    121          */
    122         public void setSendBufferSize(int size) {
    123             Socket.optSet(getDescriptor(), Socket.APR_SO_SNDBUF, size);
    124         }
    125
    126         /**
    127          * {@inheritDoc}
    128          */
    129         public int getReceiveBufferSize() {
    130             try {
    131                 return Socket.optGet(getDescriptor(), Socket.APR_SO_RCVBUF);
    132             } catch (Exception e) {
    133                 throw new RuntimeException("APR Exception", e);
    134             }
    135         }
    136
    137         /**
    138          * {@inheritDoc}
    139          */
    140         public void setReceiveBufferSize(int size) {
    141             Socket.optSet(getDescriptor(), Socket.APR_SO_RCVBUF, size);
    142         }
    143
    144         /**
    145          * {@inheritDoc}
    146          */
    147         public boolean isBroadcast() {
    148             return false;
    149         }
    150
    151         /**
    152          * {@inheritDoc}
    153          */
    154         public void setBroadcast(boolean broadcast) {
    155         }
    156     }
    157 }