1 package org.linphone.p2pproxy.core.media.jxtaudpproxy;
3 import java.io.IOException;
4 import java.net.DatagramPacket;
5 import java.net.DatagramSocket;
6 import java.net.InetAddress;
7 import java.net.InetSocketAddress;
8 import java.net.SocketException;
9 import java.net.UnknownHostException;
10 import org.apache.log4j.Logger;
11 import org.linphone.p2pproxy.core.GenericUdpSession;
13 import net.jxta.endpoint.ByteArrayMessageElement;
14 import net.jxta.endpoint.MessageElement;
15 import net.jxta.pipe.OutputPipe;
16 import net.jxta.pipe.PipeMsgEvent;
17 import net.jxta.pipe.PipeMsgListener;
19 public class UdpSession implements GenericUdpSession.MessageHandler ,PipeMsgListener{
20 private final static Logger mLog = Logger.getLogger(UdpSession.class);
21 private InetSocketAddress mRemoteAddress;
22 private OutputPipe mRemotePipe;
23 private boolean mExit = false;
24 private final String mMessageName;
25 private final GenericUdpSession mGenericUdpSession;
26 UdpSession(int aPort,String aMessageName) throws SocketException, UnknownHostException {
27 mMessageName = aMessageName;
28 mGenericUdpSession = new GenericUdpSession(new InetSocketAddress(aPort),this);
33 public void pipeMsgEvent(PipeMsgEvent event) {
34 MessageElement lMessageElement = event.getMessage().getMessageElement(mMessageName);
35 if (lMessageElement == null) {
36 //nop, this is not for me
39 //test if we have an address to forward to
40 if (mRemoteAddress == null) {
41 mLog.warn("no remote adress, message discarded");
44 byte[] lBuff = lMessageElement.getBytes(false);
45 DatagramPacket lDatagramPacket = new DatagramPacket(lBuff,(int) lMessageElement.getByteLength());
46 lDatagramPacket.setSocketAddress(mRemoteAddress);
48 mGenericUdpSession.getSocket().send(lDatagramPacket);
49 mLog.debug("message from ["+mMessageName+"] sent to ["+mRemoteAddress+"]");
50 } catch (IOException e) {
51 mLog.error("cannot send message for session ["+this+"]" , e);
55 public void setRemoteAddress( InetSocketAddress aRemoteAddress) {
56 mRemoteAddress = aRemoteAddress;
58 public void setRemotePipe(OutputPipe aRemotePipe) {
59 mRemotePipe = aRemotePipe;
63 mGenericUdpSession.close();
66 public String toString() {
67 return "name ["+mMessageName +"] udp dest ["+mRemoteAddress+"]";
69 public int getPort() {
70 return mGenericUdpSession.getSocket().getPort();
72 public void onMessage(DatagramPacket message) {
74 // if destination is known just send
75 if (mRemotePipe != null) {
76 net.jxta.endpoint.Message lMessage = new net.jxta.endpoint.Message();
77 ByteArrayMessageElement lByteArrayMessageElement = new ByteArrayMessageElement(mMessageName, null,message.getData(),0,message.getLength(), null);
78 lMessage.addMessageElement(mMessageName, lByteArrayMessageElement);
80 mRemotePipe.send(lMessage);
81 mLog.debug("message from ["+message.getAddress()+":"+message.getPort()+"]sent to ["+mRemotePipe.getPipeID()+"]");
83 mLog.warn("output pipe not set for ["+this+"], discarding message");