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      AprDatagramSession(IoService service, IoProcessor<AprSession> processor, long descriptor,
50              InetSocketAddress remoteAddress) throws Exception {
51          super(service, processor, descriptor, remoteAddress);
52          config = new SessionConfigImpl();
53          this.config.setAll(service.getSessionConfig());
54      }
55  
56      /**
57       * {@inheritDoc}
58       */
59      public DatagramSessionConfig getConfig() {
60          return (DatagramSessionConfig) config;
61      }
62  
63      /**
64       * {@inheritDoc}
65       */
66      public TransportMetadata getTransportMetadata() {
67          return METADATA;
68      }
69  
70      /**
71       * The implementation for the {@link org.apache.mina.core.session.IoSessionConfig} related to APR UDP socket.
72       * @author <a href="http://mina.apache.org">Apache MINA Project</a>
73       */
74      private class SessionConfigImpl extends AbstractDatagramSessionConfig {
75          /**
76           * {@inheritDoc}
77           */
78          public boolean isReuseAddress() {
79              try {
80                  return Socket.optGet(getDescriptor(), Socket.APR_SO_REUSEADDR) == 1;
81              } catch (Exception e) {
82                  throw new RuntimeIoException("Failed to get SO_REUSEADDR.", e);
83              }
84          }
85  
86          /**
87           * {@inheritDoc}
88           */
89          public void setReuseAddress(boolean on) {
90              Socket.optSet(getDescriptor(), Socket.APR_SO_REUSEADDR, on ? 1 : 0);
91          }
92  
93          /**
94           * {@inheritDoc}
95           */
96          public int getTrafficClass() {
97              return 0;
98          }
99  
100         /**
101          * {@inheritDoc}
102          */
103         public void setTrafficClass(int tc) {
104         }
105 
106         /**
107          * {@inheritDoc}
108          */
109         public int getSendBufferSize() {
110             try {
111                 return Socket.optGet(getDescriptor(), Socket.APR_SO_SNDBUF);
112             } catch (Exception e) {
113                 throw new RuntimeException("APR Exception", e);
114             }
115         }
116 
117         /**
118          * {@inheritDoc}
119          */
120         public void setSendBufferSize(int size) {
121             Socket.optSet(getDescriptor(), Socket.APR_SO_SNDBUF, size);
122         }
123 
124         /**
125          * {@inheritDoc}
126          */
127         public int getReceiveBufferSize() {
128             try {
129                 return Socket.optGet(getDescriptor(), Socket.APR_SO_RCVBUF);
130             } catch (Exception e) {
131                 throw new RuntimeException("APR Exception", e);
132             }
133         }
134 
135         /**
136          * {@inheritDoc}
137          */
138         public void setReceiveBufferSize(int size) {
139             Socket.optSet(getDescriptor(), Socket.APR_SO_RCVBUF, size);
140         }
141 
142         /**
143          * {@inheritDoc}
144          */
145         public boolean isBroadcast() {
146             return false;
147         }
148 
149         /**
150          * {@inheritDoc}
151          */
152         public void setBroadcast(boolean broadcast) {
153         }
154     }
155 }