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