]> sjero.net Git - linphone/blob - p2pproxy/dependencies-src/jxse-src-2.5/impl/src/net/jxta/impl/endpoint/tls/TlsMessenger.java
remove mediastreamer2 and add it as a submodule instead.
[linphone] / p2pproxy / dependencies-src / jxse-src-2.5 / impl / src / net / jxta / impl / endpoint / tls / TlsMessenger.java
1 /*
2  * Copyright (c) 2001-2007 Sun Microsystems, Inc.  All rights reserved.
3  *  
4  *  The Sun Project JXTA(TM) Software License
5  *  
6  *  Redistribution and use in source and binary forms, with or without 
7  *  modification, are permitted provided that the following conditions are met:
8  *  
9  *  1. Redistributions of source code must retain the above copyright notice,
10  *     this list of conditions and the following disclaimer.
11  *  
12  *  2. Redistributions in binary form must reproduce the above copyright notice, 
13  *     this list of conditions and the following disclaimer in the documentation 
14  *     and/or other materials provided with the distribution.
15  *  
16  *  3. The end-user documentation included with the redistribution, if any, must 
17  *     include the following acknowledgment: "This product includes software 
18  *     developed by Sun Microsystems, Inc. for JXTA(TM) technology." 
19  *     Alternately, this acknowledgment may appear in the software itself, if 
20  *     and wherever such third-party acknowledgments normally appear.
21  *  
22  *  4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must 
23  *     not be used to endorse or promote products derived from this software 
24  *     without prior written permission. For written permission, please contact 
25  *     Project JXTA at http://www.jxta.org.
26  *  
27  *  5. Products derived from this software may not be called "JXTA", nor may 
28  *     "JXTA" appear in their name, without prior written permission of Sun.
29  *  
30  *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
31  *  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
32  *  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SUN 
33  *  MICROSYSTEMS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
34  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
35  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
36  *  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
37  *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
38  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
39  *  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40  *  
41  *  JXTA is a registered trademark of Sun Microsystems, Inc. in the United 
42  *  States and other countries.
43  *  
44  *  Please see the license information page at :
45  *  <http://www.jxta.org/project/www/license.html> for instructions on use of 
46  *  the license in source files.
47  *  
48  *  ====================================================================
49  *  
50  *  This software consists of voluntary contributions made by many individuals 
51  *  on behalf of Project JXTA. For more information on Project JXTA, please see 
52  *  http://www.jxta.org.
53  *  
54  *  This license is based on the BSD license adopted by the Apache Foundation. 
55  */
56
57 package net.jxta.impl.endpoint.tls;
58
59
60 import java.io.*;
61
62 import java.util.logging.Logger;
63 import java.util.logging.Level;
64 import net.jxta.logging.Logging;
65
66 import net.jxta.endpoint.*;
67 import net.jxta.impl.endpoint.*;
68 import net.jxta.impl.endpoint.tls.TlsConn.HandshakeState;
69
70
71 /**
72  * This class implements sending messages through a TLS connection.
73  */
74 public class TlsMessenger extends BlockingMessenger {
75     
76     private static final Logger LOG = Logger.getLogger(TlsMessenger.class.getName());
77     
78     private TlsTransport transport = null;
79     private TlsConn conn = null;
80     
81     /**
82      *  The source address of messages sent on this messenger.
83      */
84     private final EndpointAddress srcAddress;
85     
86     private final MessageElement srcAddressElement;
87     
88     TlsMessenger(EndpointAddress destAddress, TlsConn conn, TlsTransport tp) {
89         
90         // No need for self destruction.
91         super(tp.getPeerGroup().getPeerGroupID(), destAddress, false);
92         
93         if (conn == null) {
94             if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
95                 LOG.fine("null TLS connection!");
96             }
97             throw new IllegalArgumentException("null TLS connection!");
98         }
99         
100         this.conn = conn;
101         this.transport = tp;
102         
103         this.srcAddress = transport.getPublicAddress();
104         
105         srcAddressElement = new StringMessageElement(EndpointServiceImpl.MESSAGE_SOURCE_NAME, srcAddress.toString()
106                 ,
107                 (MessageElement) null);
108     }
109     
110     /*
111      * The cost of just having a finalize routine is high. The finalizer is
112      * a bottleneck and can delay garbage collection all the way to heap
113      * exhaustion. Leave this comment as a reminder to future maintainers.
114      * Below is the reason why finalize is not needed here.
115      *
116      * These messengers never go to the application layer. The endpoint code
117      * always invokes close when needed.
118
119      protected void finalize() {
120      }
121
122      */
123     
124     /**
125      * {@inheritDoc}
126      */
127     @Override
128     public synchronized void closeImpl() {
129         super.close();
130         conn = null;
131     }
132
133     /**
134      * {@inheritDoc}
135      */
136     @Override
137     public boolean isIdleImpl() {
138         // No need for self destruction.
139         return false;
140     }
141     
142     /**
143      * {@inheritDoc}
144      *
145      * <p/>The peer that is the destination is the logical address
146      */
147     @Override
148     public EndpointAddress getLogicalDestinationImpl() {
149         return new EndpointAddress("jxta", dstAddress.getProtocolAddress(), null, null);
150     }
151     
152     /**
153      * {@inheritDoc}
154      */
155     @Override
156     public synchronized void sendMessageBImpl(Message message, String service, String serviceParam) throws IOException {
157         
158         if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
159             LOG.fine("Starting send for " + message);
160         }
161         
162         // check if the connection has died.
163         if (HandshakeState.CONNECTIONDEAD == conn.getHandshakeState()) {
164
165             // FIXME - jice@jxta.org 20040413: This will do but it causes the below exception to be shown as the cause of the
166             // failure, which is not true: nobody realy closed the messenger before it failed. It failed first.  Also, it used to
167             // shutdown this messenger, now it does not. What does is the call to closeImpl() that follows our IOException...(and
168             // that's how it should be). Transports should get a deeper retrofit eventually.
169
170             close();
171         }
172         
173         if (isClosed()) {
174             IOException failure = new IOException("Messenger is closed, it cannot be used to send messages.");
175             
176             if (Logging.SHOW_WARNING && LOG.isLoggable(Level.WARNING)) {
177                 LOG.log(Level.WARNING, failure.getMessage(), failure);
178             }
179             
180             throw failure;
181         }
182         
183         // Set the message with the appropriate src and dest address
184         message.replaceMessageElement(EndpointServiceImpl.MESSAGE_SOURCE_NS, srcAddressElement);
185         
186         MessageElement dstAddressElement = new StringMessageElement(EndpointServiceImpl.MESSAGE_DESTINATION_NAME
187                 ,
188                 getDestAddressToUse(service, serviceParam).toString(), (MessageElement) null);
189         
190         message.replaceMessageElement(EndpointServiceImpl.MESSAGE_DESTINATION_NS, dstAddressElement);
191         
192         // Give the message to the TLS connection
193         try {
194             conn.sendMessage(message);
195         } catch (IOException caught) {
196             close();
197             if (Logging.SHOW_SEVERE && LOG.isLoggable(Level.SEVERE)) {
198                 LOG.log(Level.SEVERE, "Message send to \'" + dstAddress + "\' failed for " + message, caught);
199             }
200             throw caught;
201         }
202         
203         if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
204             LOG.fine("Message send to \'" + dstAddress + "\' succeeded for " + message);
205         }
206     }    
207 }