]> sjero.net Git - linphone/blob - p2pproxy/src/org/linphone/p2pproxy/core/media/jxtaudpproxy/SdpProcessorImpl.java
36da0dc283ea7f5287b58e751c56b8a4523afbc9
[linphone] / p2pproxy / src / org / linphone / p2pproxy / core / media / jxtaudpproxy / SdpProcessorImpl.java
1 /*
2 p2pproxy Copyright (C) 2007  Jehan Monnier ()
3
4 SdpProcessorImpl.java - .
5
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.
10
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.
15
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.
19 */
20 package org.linphone.p2pproxy.core.media.jxtaudpproxy;
21
22 import java.io.IOException;
23 import java.net.InetAddress;
24 import java.net.InetSocketAddress;
25 import java.util.Map;
26
27 import net.jxta.pipe.OutputPipe;
28
29 import org.apache.log4j.Logger;
30 import org.linphone.p2pproxy.api.P2pProxyException;
31 import org.linphone.p2pproxy.core.Configurator;
32
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;
43
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;;
51    }
52    /*
53     * process SDP in mode relay
54     * rewrite sdp.
55     */
56    public void processSdpBeforeSendingToSipUA( Message aMessage) throws P2pProxyException {
57       try {
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);
64
65             String lUserName="";
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();
72             } else {
73                mLog.warn("strange, sdp in message ["+aMessage+"]");
74             }
75             // build rtp session if required
76             NetworkResources lNetworkResources = buildRtpSessions(lOrigSessionDescriptor, lUserName);
77
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
86                      , 0
87                      , lOrigMediaField.getTransport()
88                      , lOrigMediaField.getFormatList());
89                MediaDescriptor lNewMediaDescriptor = new MediaDescriptor(lNewMediaField,lConnectionField);
90                for (Object lAttributeField:lMediaDescriptor.getAttributes()) {
91                   lNewMediaDescriptor.addAttribute((AttributeField) lAttributeField);
92                }
93                lNewSessionDescriptor.addMediaDescriptor(lNewMediaDescriptor);
94
95             }
96             aMessage.setBody(lNewSessionDescriptor.toString());
97             mLog.debug("new sdp:" +aMessage.getBody());
98
99          }
100       }catch (Exception e) {
101          throw new P2pProxyException(e);
102       }
103
104    }
105    public void processSdpAfterSentToPipe( Message aMessage,OutputPipe lOutputPipe) throws P2pProxyException {
106       try {
107          if (aMessage.hasBody() && "application/sdp".equals(aMessage.getBodyType())) {
108             SessionDescriptor lOrigSessionDescriptor = new SessionDescriptor(aMessage.getBody());
109             String lUserName="";
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();
116             } else {
117                mLog.warn("strange, sdp in message ["+aMessage+"]");
118             }
119             // build rtp session if required
120             NetworkResources lNetworkResources = buildRtpSessions(lOrigSessionDescriptor, lUserName,lOutputPipe);
121             
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();
129                }
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+"]");
135             }
136             // 
137
138          }       
139       }catch (Exception e) {
140          throw new P2pProxyException(e);
141       }
142
143    }
144    private NetworkResources buildRtpSessions(SessionDescriptor lSessionDescriptor , String aFrom) throws P2pProxyException {
145            return buildRtpSessions(lSessionDescriptor , aFrom,null);
146    }
147    private NetworkResources buildRtpSessions(SessionDescriptor lSessionDescriptor , String aFrom,OutputPipe aRemotePipe) throws P2pProxyException {
148       try { 
149          // get Registration 
150          Registration lRegistration = mRegistrationTab.get(aFrom);
151
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
157                break;
158             }
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()+"]");
162                break;
163             }
164
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);
172             } else {
173                lRtpSession = ((NetworkResources) lRegistration.NetResources).getRtpSession(lMLineName);
174             }
175             if (aRemotePipe != null) {
176                  lRtpSession.setRemotePipe(aRemotePipe);
177             }
178
179          }
180          return (NetworkResources) lRegistration.NetResources;
181       }catch (Exception e) {
182          throw new P2pProxyException(e);
183       }
184
185    }
186    public void processSdpBeforeSendingToPipe(Message message) throws P2pProxyException {
187       // TODO Auto-generated method stub
188
189    }
190 }