2 p2pproxy Copyright (C) 2007 Jehan Monnier ()
4 SdpProcessorImpl.java - .
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License
8 as published by the Free Software Foundation; either version 2
9 of the License, or (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 package org.linphone.p2pproxy.core.media.jxtaudpproxy;
22 import java.io.IOException;
23 import java.net.InetAddress;
24 import java.net.InetSocketAddress;
27 import net.jxta.pipe.OutputPipe;
29 import org.apache.log4j.Logger;
30 import org.linphone.p2pproxy.api.P2pProxyException;
31 import org.linphone.p2pproxy.core.Configurator;
33 import org.linphone.p2pproxy.core.sipproxy.SdpProcessor;
34 import org.linphone.p2pproxy.core.sipproxy.SipProxyRegistrar;
35 import org.linphone.p2pproxy.core.sipproxy.SipProxyRegistrar.Registration;
36 import org.linphone.p2pproxy.core.sipproxy.peers.NetworkResources;
37 import org.zoolu.sdp.AttributeField;
38 import org.zoolu.sdp.ConnectionField;
39 import org.zoolu.sdp.MediaDescriptor;
40 import org.zoolu.sdp.MediaField;
41 import org.zoolu.sdp.SessionDescriptor;
42 import org.zoolu.sip.message.Message;
44 public class SdpProcessorImpl implements SdpProcessor {
45 private final static Logger mLog = Logger.getLogger(SdpProcessorImpl.class);
46 private final Map<String,Registration> mRegistrationTab;
47 private final Configurator mProperties;
48 public SdpProcessorImpl(Map<String,Registration> aRegistrationTab,Configurator aProperties) {
49 mRegistrationTab = aRegistrationTab;
50 mProperties = aProperties;;
53 * process SDP in mode relay
56 public void processSdpBeforeSendingToSipUA( Message aMessage) throws P2pProxyException {
58 //check if sdp present
59 if (aMessage.hasBody() && "application/sdp".equals(aMessage.getBodyType())) {
60 SessionDescriptor lOrigSessionDescriptor = new SessionDescriptor(aMessage.getBody());
61 SessionDescriptor lNewSessionDescriptor = new SessionDescriptor(aMessage.getBody());
62 lNewSessionDescriptor.removeMediaDescriptors();
63 lNewSessionDescriptor.setConnection(null);
66 if (aMessage.isInvite()) {
67 lUserName = aMessage.getToHeader().getNameAddress().getAddress().toString();
68 } else if (aMessage.isResponse()) {
69 lUserName = aMessage.getFromHeader().getNameAddress().getAddress().toString();
70 } else if (aMessage.isAck()) {
71 lUserName = aMessage.getToHeader().getNameAddress().getAddress().toString();
73 mLog.warn("strange, sdp in message ["+aMessage+"]");
75 // build rtp session if required
76 NetworkResources lNetworkResources = buildRtpSessions(lOrigSessionDescriptor, lUserName);
78 for (Object lMediaDescriptorObject :lOrigSessionDescriptor.getMediaDescriptors()) {
79 MediaDescriptor lMediaDescriptor = (MediaDescriptor)lMediaDescriptorObject;
80 RtpSessionImpl lRtpSession = lNetworkResources.getRtpSession(lMediaDescriptor.getMedia().getMedia());
81 // create new media desc
82 ConnectionField lConnectionField = new ConnectionField("IP4",InetAddress.getLocalHost().getHostAddress());
83 MediaField lOrigMediaField = lMediaDescriptor.getMedia();
84 MediaField lNewMediaField = new MediaField(lOrigMediaField.getMedia()
85 , lRtpSession.getPort() //new port
87 , lOrigMediaField.getTransport()
88 , lOrigMediaField.getFormatList());
89 MediaDescriptor lNewMediaDescriptor = new MediaDescriptor(lNewMediaField,lConnectionField);
90 for (Object lAttributeField:lMediaDescriptor.getAttributes()) {
91 lNewMediaDescriptor.addAttribute((AttributeField) lAttributeField);
93 lNewSessionDescriptor.addMediaDescriptor(lNewMediaDescriptor);
96 aMessage.setBody(lNewSessionDescriptor.toString());
97 mLog.debug("new sdp:" +aMessage.getBody());
100 }catch (Exception e) {
101 throw new P2pProxyException(e);
105 public void processSdpAfterSentToPipe( Message aMessage,OutputPipe lOutputPipe) throws P2pProxyException {
107 if (aMessage.hasBody() && "application/sdp".equals(aMessage.getBodyType())) {
108 SessionDescriptor lOrigSessionDescriptor = new SessionDescriptor(aMessage.getBody());
110 if (aMessage.isInvite()) {
111 lUserName = aMessage.getFromHeader().getNameAddress().getAddress().toString();
112 } else if (aMessage.isResponse()) {
113 lUserName = aMessage.getToHeader().getNameAddress().getAddress().toString();
114 } else if (aMessage.isAck()) {
115 lUserName = aMessage.getFromHeader().getNameAddress().getAddress().toString();
117 mLog.warn("strange, sdp in message ["+aMessage+"]");
119 // build rtp session if required
120 NetworkResources lNetworkResources = buildRtpSessions(lOrigSessionDescriptor, lUserName,lOutputPipe);
122 // check remote address
123 ConnectionField lConnectionField = lOrigSessionDescriptor.getConnection();
124 //search from m blocs
125 for (Object lMediaDescriptorObject :lOrigSessionDescriptor.getMediaDescriptors()) {
126 MediaDescriptor lMediaDescriptor = (MediaDescriptor)lMediaDescriptorObject;
127 if (lConnectionField == null ) {
128 lConnectionField = lMediaDescriptor.getConnection();
130 RtpSession lRtpSession = lNetworkResources.getRtpSession(lMediaDescriptor.getMedia().getMedia());
131 InetAddress lInetAddress = InetAddress.getByName(lConnectionField.getAddress());
132 InetSocketAddress lInetSocketAddress = new InetSocketAddress(lInetAddress,lMediaDescriptor.getMedia().getPort());
133 lRtpSession.setRemoteAddress(lInetSocketAddress);
134 mLog.info("rtp session updated ["+lRtpSession+"]");
139 }catch (Exception e) {
140 throw new P2pProxyException(e);
144 private NetworkResources buildRtpSessions(SessionDescriptor lSessionDescriptor , String aFrom) throws P2pProxyException {
145 return buildRtpSessions(lSessionDescriptor , aFrom,null);
147 private NetworkResources buildRtpSessions(SessionDescriptor lSessionDescriptor , String aFrom,OutputPipe aRemotePipe) throws P2pProxyException {
150 Registration lRegistration = mRegistrationTab.get(aFrom);
152 for (Object lMediaDescriptorObject :lSessionDescriptor.getMediaDescriptors()) {
153 MediaDescriptor lMediaDescriptor = (MediaDescriptor)lMediaDescriptorObject;
154 //1 check if port != 0
155 if (lMediaDescriptor.getMedia().getPort() == 0) {
156 // nothing to change, offers rejected
159 //3 open datagram socket
160 if (lMediaDescriptor.getMedia().getTransport().equalsIgnoreCase("RTP/AVP") == false) {
161 mLog.warn("enable to process non udp mlines ["+lMediaDescriptor.getMedia().getTransport()+"]");
165 String lMLineName = lMediaDescriptor.getMedia().getMedia();
166 RtpSessionImpl lRtpSession = null;
167 if (((NetworkResources) lRegistration.NetResources).hasRtpSession(lMLineName) == false) {
168 // first time, just create
169 int lPortStart = 15000;
170 lRtpSession = new RtpSessionImpl (lPortStart,lMLineName);
171 ((NetworkResources) lRegistration.NetResources).putRtpSession(lMLineName, lRtpSession);
173 lRtpSession = ((NetworkResources) lRegistration.NetResources).getRtpSession(lMLineName);
175 if (aRemotePipe != null) {
176 lRtpSession.setRemotePipe(aRemotePipe);
180 return (NetworkResources) lRegistration.NetResources;
181 }catch (Exception e) {
182 throw new P2pProxyException(e);
186 public void processSdpBeforeSendingToPipe(Message message) throws P2pProxyException {
187 // TODO Auto-generated method stub