adaptation of old eclipse code to Intellij

This commit is contained in:
2024-11-18 13:08:35 +07:00
parent db13021be9
commit c501ebcbb6
70 changed files with 335 additions and 665 deletions

View File

@@ -6,7 +6,7 @@ import com.sun.jna.*;
@SuppressWarnings("unused")
public interface Bass extends Library {
Bass Instance = (Bass) Native.load("bass", Bass.class);
Bass Instance = Native.load("bass", Bass.class);
int BASSVERSION = 0x204; // API version
String BASSVERSIONTEXT = "2.4";
@@ -802,6 +802,7 @@ public interface Bass extends Library {
// gak bisa
int BASS_StreamCreate(int freq, int chans, int flags, int proc, Pointer user);
@SuppressWarnings("DataFlowIssue")
default String GetBassError(String function, int err) {
if (err==0)
return function+": SUCCESS";

View File

@@ -9,9 +9,9 @@ import com.sun.jna.Pointer;
* @author rdkartono
*
*/
@SuppressWarnings("unused")
@SuppressWarnings({"unused", "UnusedReturnValue"})
interface BassEnc extends Library {
BassEnc Instance = (BassEnc) Native.load("bassenc", BassEnc.class);
BassEnc Instance = Native.load("bassenc", BassEnc.class);
interface ENCODEPROC extends Callback
{

View File

@@ -14,7 +14,7 @@ import Audio.BassEnc.ENCODEPROCEX;
@SuppressWarnings("unused")
public interface BassEncAAC extends Library {
BassEncAAC Instance = (BassEncAAC) Native.load("bassenc_aac",BassEncAAC.class);
BassEncAAC Instance = Native.load("bassenc_aac",BassEncAAC.class);
int BASS_Encode_AAC_GetVersion();
int BASS_Encode_AAC_Start(int handle, String options, int flags, ENCODEPROCEX proc, Pointer user);

View File

@@ -14,7 +14,7 @@ import Audio.BassEnc.ENCODEPROCEX;
*/
@SuppressWarnings("unused")
public interface BassEncMP3 extends Library{
BassEncMP3 Instance = (BassEncMP3) Native.load("bassenc_mp3",BassEncMP3.class);
BassEncMP3 Instance = Native.load("bassenc_mp3",BassEncMP3.class);
int BASS_Encode_MP3_GetVersion();

View File

@@ -14,7 +14,7 @@ import Audio.BassEnc.ENCODEPROC;
*/
@SuppressWarnings("unused")
public interface BassEncOGG extends Library {
BassEncOGG Instance = (BassEncOGG) Native.load("bassenc_ogg",BassEncOGG.class);
BassEncOGG Instance = Native.load("bassenc_ogg",BassEncOGG.class);
int BASS_Encode_OGG_GetVersion();
int BASS_Encode_OGG_Start(int handle, String options, int flags, ENCODEPROC proc, Pointer user);

View File

@@ -14,7 +14,7 @@ import Audio.BassEnc.ENCODEPROC;
*/
@SuppressWarnings("unused")
public interface BassEncOPUS extends Library{
BassEncOPUS BASSENC_OPUS = (BassEncOPUS) Native.load("bassenc_opus",BassEncOPUS.class);
BassEncOPUS BASSENC_OPUS = Native.load("bassenc_opus",BassEncOPUS.class);
interface Constant{
// BASS_Encode_OPUS_NewStream flags
int BASS_ENCODE_OPUS_RESET = 0x1000000;

View File

@@ -14,7 +14,7 @@ import Audio.Bass.SYNCPROC;
*/
@SuppressWarnings("unused")
public interface BassMix extends Library {
BassMix Instance = (BassMix) Native.load("bassmix",BassMix.class);
BassMix Instance = Native.load("bassmix",BassMix.class);
interface Constant{
// Additional BASS_SetConfig options

View File

@@ -9,7 +9,7 @@ import Audio.Bass.DOWNLOADPROC;
@SuppressWarnings("unused")
public interface BassOPUS extends Library {
BassOPUS Instance = (BassOPUS) Native.load("bassopus",BassOPUS.class);
BassOPUS Instance = Native.load("bassopus",BassOPUS.class);
interface Constant{
// BASS_CHANNELINFO type
int BASS_CTYPE_STREAM_OPUS = 0x11200;

View File

@@ -24,30 +24,31 @@ import java.net.InetAddress;
import peers.media.MediaMode;
import peers.sip.syntaxencoding.SipURI;
@SuppressWarnings("unused")
public interface Config {
public void save();
public InetAddress getLocalInetAddress();
public InetAddress getPublicInetAddress();
public String getUserPart();
public String getDomain();
public String getPassword();
public SipURI getOutboundProxy();
public int getSipPort();
public MediaMode getMediaMode();
public boolean isMediaDebug();
public String getMediaFile();
public int getRtpPort();
public void setLocalInetAddress(InetAddress inetAddress);
public void setPublicInetAddress(InetAddress inetAddress);
public void setUserPart(String userPart);
public void setDomain(String domain);
public void setPassword(String password);
public void setOutboundProxy(SipURI outboundProxy);
public void setSipPort(int sipPort);
public void setMediaMode(MediaMode mediaMode);
public void setMediaDebug(boolean mediaDebug);
public void setMediaFile(String mediaFile);
public void setRtpPort(int rtpPort);
void save();
InetAddress getLocalInetAddress();
InetAddress getPublicInetAddress();
String getUserPart();
String getDomain();
String getPassword();
SipURI getOutboundProxy();
int getSipPort();
MediaMode getMediaMode();
boolean isMediaDebug();
String getMediaFile();
int getRtpPort();
void setLocalInetAddress(InetAddress inetAddress);
void setPublicInetAddress(InetAddress inetAddress);
void setUserPart(String userPart);
void setDomain(String domain);
void setPassword(String password);
void setOutboundProxy(SipURI outboundProxy);
void setSipPort(int sipPort);
void setMediaMode(MediaMode mediaMode);
void setMediaDebug(boolean mediaDebug);
void setMediaFile(String mediaFile);
void setRtpPort(int rtpPort);
}

View File

@@ -24,6 +24,7 @@ import java.net.InetAddress;
import peers.media.MediaMode;
import peers.sip.syntaxencoding.SipURI;
@SuppressWarnings("unused")
public class JavaConfig implements Config {
private InetAddress localInetAddress;

View File

@@ -18,6 +18,7 @@
*/
package peers.media;
@SuppressWarnings("UnusedReturnValue")
public abstract class AbstractSoundManager implements SoundSource {
public final static String MEDIA_DIR = "media";

View File

@@ -33,11 +33,11 @@ public class Capture implements Runnable {
public static final int SAMPLE_SIZE = 16;
public static final int BUFFER_SIZE = SAMPLE_SIZE * 20;
private PipedOutputStream rawData;
private final PipedOutputStream rawData;
private boolean isStopped;
private SoundSource soundSource;
private final SoundSource soundSource;
private CountDownLatch latch;
private final CountDownLatch latch;
public Capture(PipedOutputStream rawData, SoundSource soundSource,
CountDownLatch latch) {

View File

@@ -25,6 +25,7 @@ import java.io.PipedOutputStream;
import java.util.concurrent.CountDownLatch;
import lombok.Getter;
import org.pmw.tinylog.Logger;
import peers.rtp.RFC3551;
import peers.rtp.RtpSession;
@@ -36,10 +37,10 @@ public class CaptureRtpSender {
public static final int PIPE_SIZE = 4096;
private RtpSession rtpSession;
private final RtpSession rtpSession;
private Capture capture;
private Encoder encoder;
private RtpSender rtpSender;
@Getter private RtpSender rtpSender;
public CaptureRtpSender(RtpSession rtpSession, SoundSource soundSource,
boolean mediaDebug, Codec codec, String peersHome)
@@ -123,8 +124,4 @@ public class CaptureRtpSender {
return rtpSession;
}
public RtpSender getRtpSender() {
return rtpSender;
}
}

View File

@@ -28,7 +28,7 @@ import peers.rtp.RtpPacket;
public class DtmfFactory {
public List<RtpPacket> createDtmfPackets(char digit) {
List<RtpPacket> packets = new ArrayList<RtpPacket>();
List<RtpPacket> packets = new ArrayList<>();
byte[] data = new byte[4];
// RFC4733
if (digit == '*') {

View File

@@ -34,9 +34,9 @@ public class Echo implements Runnable {
public static final int BUFFER_SIZE = 2048;
private DatagramSocket datagramSocket;
private InetAddress remoteAddress;
private int remotePort;
private final DatagramSocket datagramSocket;
private final InetAddress remoteAddress;
private final int remotePort;
private boolean isRunning;

View File

@@ -36,15 +36,15 @@ import java.util.concurrent.CountDownLatch;
public abstract class Encoder implements Runnable {
private PipedInputStream rawData;
private PipedOutputStream encodedData;
private final PipedInputStream rawData;
private final PipedOutputStream encodedData;
private boolean isStopped;
private FileOutputStream encoderOutput;
private FileOutputStream encoderInput;
private boolean mediaDebug;
private final boolean mediaDebug;
private String peersHome;
private CountDownLatch latch;
private final String peersHome;
private final CountDownLatch latch;
public Encoder(PipedInputStream rawData, PipedOutputStream encodedData,
boolean mediaDebug, String peersHome,

View File

@@ -46,6 +46,7 @@ import java.io.IOException;
//
// Validate
@SuppressWarnings("unused")
public class FileReader implements SoundSource {
public final static int BUFFER_SIZE = 256;
@@ -76,7 +77,7 @@ public class FileReader implements SoundSource {
if (fileInputStream == null) {
return null;
}
byte buffer[] = new byte[BUFFER_SIZE];
byte[] buffer = new byte[BUFFER_SIZE];
try {
if (fileInputStream.read(buffer) >= 0) {
Thread.sleep(15);

View File

@@ -31,9 +31,9 @@ import peers.sdp.Codec;
public class IncomingRtpReader implements RtpListener {
private RtpSession rtpSession;
private AbstractSoundManager soundManager;
private Decoder decoder;
private final RtpSession rtpSession;
private final AbstractSoundManager soundManager;
private final Decoder decoder;
public IncomingRtpReader(RtpSession rtpSession,
AbstractSoundManager soundManager, Codec codec)

View File

@@ -27,25 +27,28 @@ import java.util.List;
import Audio.BassFileReader;
import lombok.Getter;
import lombok.Setter;
import org.pmw.tinylog.Logger;
import peers.rtp.RtpPacket;
import peers.rtp.RtpSession;
import peers.sdp.Codec;
import peers.sip.core.useragent.UserAgent;
@SuppressWarnings("unused")
public class MediaManager {
public static final int DEFAULT_CLOCK = 8000; // Hz
private UserAgent userAgent;
private final UserAgent userAgent;
private CaptureRtpSender captureRtpSender;
private IncomingRtpReader incomingRtpReader;
private RtpSession rtpSession;
private DtmfFactory dtmfFactory;
private final DtmfFactory dtmfFactory;
private DatagramSocket datagramSocket;
@Getter @Setter private DatagramSocket datagramSocket;
//private FileReader fileReader;
private BassFileReader fileReader;
@Getter private BassFileReader fileReader;
public MediaManager(UserAgent userAgent) {
this.userAgent = userAgent;
@@ -236,6 +239,7 @@ public class MediaManager {
public void updateRemote(String destAddress, int destPort, Codec codec) {
switch (userAgent.getMediaMode()) {
case file:
case captureAndPlayback:
try {
InetAddress inetAddress = InetAddress.getByName(destAddress);
@@ -248,15 +252,7 @@ public class MediaManager {
case echo:
//TODO update echo socket
break;
case file:
try {
InetAddress inetAddress = InetAddress.getByName(destAddress);
rtpSession.setRemoteAddress(inetAddress);
} catch (UnknownHostException e) {
Logger.error("unknown host: " + destAddress, e);
}
rtpSession.setRemotePort(destPort);
break;
default:
break;
@@ -317,19 +313,10 @@ public class MediaManager {
}
}
public void setDatagramSocket(DatagramSocket datagramSocket) {
this.datagramSocket = datagramSocket;
}
public DatagramSocket getDatagramSocket() {
return datagramSocket;
}
// public FileReader getFileReader() {
// return fileReader;
// }
public BassFileReader getFileReader() {
return fileReader;
}
}

View File

@@ -21,7 +21,7 @@ package peers.media;
public class PcmaDecoder extends Decoder {
private static short aLawDecompressTable[] = new short[]{
private static final short aLawDecompressTable[] = new short[]{
-5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736,
-7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784,
-2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368,

View File

@@ -28,7 +28,7 @@ import java.util.concurrent.CountDownLatch;
public class PcmaEncoder extends Encoder {
private final static int cClip = 32635;
private static byte aLawCompressTable[] = new byte[]{
private final static byte[] aLawCompressTable = new byte[]{
1, 1, 2, 2, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4, 4, 4,
5, 5, 5, 5, 5, 5, 5, 5,

View File

@@ -26,7 +26,7 @@ public class PcmuDecoder extends Decoder {
// private final static int SEG_SHIFT = 4;
// private final static int SEG_MASK = 0x70;
// private final static int SIGN_BIT = 0x80;
private static short muLawDecompressTable[] = new short[]{
private final static short[] muLawDecompressTable = new short[]{
-32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,
-23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,
-15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,

View File

@@ -25,10 +25,11 @@ import java.util.concurrent.CountDownLatch;
@SuppressWarnings("SameParameterValue")
public class PcmuEncoder extends Encoder {
private final static int cBias = 0x84;
private final static short seg_end[] = new short[]{0xFF, 0x1FF, 0x3FF, 0x7FF,
private final static short[] seg_end = new short[]{0xFF, 0x1FF, 0x3FF, 0x7FF,
0xFFF, 0x1FFF, 0x3FFF, 0x7FFF
};

View File

@@ -40,16 +40,16 @@ import peers.sdp.Codec;
public class RtpSender implements Runnable {
private PipedInputStream encodedData;
private RtpSession rtpSession;
private final PipedInputStream encodedData;
private final RtpSession rtpSession;
private boolean isStopped;
private FileOutputStream rtpSenderInput;
private boolean mediaDebug;
private Codec codec;
private List<RtpPacket> pushedPackets;
private final boolean mediaDebug;
private final Codec codec;
private final List<RtpPacket> pushedPackets;
private String peersHome;
private CountDownLatch latch;
private final String peersHome;
private final CountDownLatch latch;
public RtpSender(PipedInputStream encodedData, RtpSession rtpSession,
boolean mediaDebug, Codec codec, String peersHome,
@@ -62,7 +62,7 @@ public class RtpSender implements Runnable {
this.latch = latch;
isStopped = false;
pushedPackets = Collections.synchronizedList(
new ArrayList<RtpPacket>());
new ArrayList<>());
}
public void run() {
@@ -96,7 +96,7 @@ public class RtpSender implements Runnable {
int timestamp = 0;
int numBytesRead;
int tempBytesRead;
long sleepTime = 0;
long sleepTime ;
long offset = 0;
long lastSentTime = System.nanoTime();
// indicate if its the first time that we send a packet (dont wait)
@@ -130,7 +130,7 @@ public class RtpSender implements Runnable {
break;
}
}
if (pushedPackets.size() > 0) {
if (!pushedPackets.isEmpty()) {
RtpPacket pushedPacket = pushedPackets.remove(0);
rtpPacket.setMarker(pushedPacket.isMarker());
rtpPacket.setPayloadType(pushedPacket.getPayloadType());

View File

@@ -23,8 +23,8 @@ public interface SoundSource {
/**
* read raw data linear PCM 8kHz, 16 bits signed, mono-channel, little endian
* @return
* @return raw data
*/
public byte[] readData();
byte[] readData();
}

View File

@@ -24,6 +24,7 @@ import java.net.InetAddress;
import org.w3c.dom.Document;
@Deprecated
public class Client {
private Server server;

View File

@@ -25,6 +25,8 @@ import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import lombok.Setter;
import org.pmw.tinylog.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
@@ -32,25 +34,22 @@ import org.w3c.dom.NodeList;
public class PeerManager extends Thread {
private InetAddress localAddress;
private int localPort;
private Document document;
private final InetAddress localAddress;
private final int localPort;
@Setter private Document document;
public PeerManager(InetAddress localAddress, int localPort) {
this.localAddress = localAddress;
this.localPort = localPort;
}
public void setDocument(Document document) {
this.document = document;
}
public void run() {
DatagramSocket datagramSocket;
try {
datagramSocket = new DatagramSocket(localPort, localAddress);
} catch (SocketException e) {
e.printStackTrace();
Logger.error(e.getMessage());
return;
}
// UDPReceiver udpReceiver = new UDPReceiver(datagramSocket);
@@ -67,7 +66,7 @@ public class PeerManager extends Thread {
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
Logger.error(e.getMessage());
return;
}
}
@@ -103,15 +102,14 @@ public class PeerManager extends Thread {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
Logger.error(e.getMessage());
return;
}
}
//datagramSocket.close();
} catch (IOException e) {
e.printStackTrace();
return;
Logger.error(e.getMessage());
}
}
}

View File

@@ -19,13 +19,16 @@
package peers.nat;
import org.pmw.tinylog.Logger;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
@SuppressWarnings("unused")
public class UDPReceiver extends Thread {
private DatagramSocket datagramSocket;
private final DatagramSocket datagramSocket;
public UDPReceiver(DatagramSocket datagramSocket) {
super();
@@ -43,7 +46,7 @@ public class UDPReceiver extends Thread {
+ new String(packet.getData()));
}
} catch (IOException e) {
e.printStackTrace();
Logger.error(e.getMessage());
}
}
}

View File

@@ -19,8 +19,8 @@
package peers.nat.api;
@SuppressWarnings("unused")
public interface DataReceiver {
public void dataReceived(byte[] data, String peerId);
void dataReceived(byte[] data, String peerId);
}

View File

@@ -19,6 +19,7 @@
package peers.nat.api;
@SuppressWarnings("unused")
public abstract class PeersClient {
/**

View File

@@ -19,7 +19,8 @@
package peers.nat.api;
@SuppressWarnings("unused")
public interface Transport {
public void sendData(byte[] data);
void sendData(byte[] data);
}

View File

@@ -19,6 +19,10 @@
package peers.rtp;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class RtpPacket {
private int version;
@@ -33,92 +37,4 @@ public class RtpPacket {
private long[] csrcList;
private byte[] data;
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
public boolean isPadding() {
return padding;
}
public void setPadding(boolean padding) {
this.padding = padding;
}
public boolean isExtension() {
return extension;
}
public void setExtension(boolean extension) {
this.extension = extension;
}
public int getCsrcCount() {
return csrcCount;
}
public void setCsrcCount(int csrcCount) {
this.csrcCount = csrcCount;
}
public boolean isMarker() {
return marker;
}
public void setMarker(boolean marker) {
this.marker = marker;
}
public int getPayloadType() {
return payloadType;
}
public void setPayloadType(int payloadType) {
this.payloadType = payloadType;
}
public int getSequenceNumber() {
return sequenceNumber;
}
public void setSequenceNumber(int sequenceNumber) {
this.sequenceNumber = sequenceNumber;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public long getSsrc() {
return ssrc;
}
public void setSsrc(long ssrc) {
this.ssrc = ssrc;
}
public long[] getCsrcList() {
return csrcList;
}
public void setCsrcList(long[] csrcList) {
this.csrcList = csrcList;
}
public byte[] getData() {
return data;
}
public void setData(byte[] data) {
this.data = data;
}
}

View File

@@ -34,32 +34,32 @@ public class RtpParser {
return null;
}
RtpPacket rtpPacket = new RtpPacket();
int b = (int)(packet[0] & 0xff);
int b = (packet[0] & 0xff);
rtpPacket.setVersion((b & 0xc0) >> 6);
rtpPacket.setPadding((b & 0x20) != 0);
rtpPacket.setExtension((b & 0x10) != 0);
rtpPacket.setCsrcCount(b & 0x0f);
b = (int)(packet[1] & 0xff);
b = (packet[1] & 0xff);
rtpPacket.setMarker((b & 0x80) != 0);
rtpPacket.setPayloadType(b & 0x7f);
b = (int)(packet[2] & 0xff);
rtpPacket.setSequenceNumber(b * 256 + (int)(packet[3] & 0xff));
b = (int)(packet[4] & 0xff);
rtpPacket.setTimestamp(b * 256 * 256 * 256
+ (int)(packet[5] & 0xff) * 256 * 256
+ (int)(packet[6] & 0xff) * 256
+ (int)(packet[7] & 0xff));
b = (int)(packet[8] & 0xff);
rtpPacket.setSsrc(b * 256 * 256 * 256
+ (int)(packet[9] & 0xff) * 256 * 256
+ (int)(packet[10] & 0xff) * 256
+ (int)(packet[11] & 0xff));
b = (packet[2] & 0xff);
rtpPacket.setSequenceNumber(b * 256 + (packet[3] & 0xff));
b = (packet[4] & 0xff);
rtpPacket.setTimestamp((long) b * 256 * 256 * 256
+ (packet[5] & 0xff) * 256 * 256
+ (packet[6] & 0xff) * 256
+ (packet[7] & 0xff));
b = (packet[8] & 0xff);
rtpPacket.setSsrc((long) b * 256 * 256 * 256
+ (packet[9] & 0xff) * 256 * 256
+ (packet[10] & 0xff) * 256
+ (packet[11] & 0xff));
long[] csrcList = new long[rtpPacket.getCsrcCount()];
for (int i = 0; i < csrcList.length; ++i)
csrcList[i] = (int)(packet[12 + i] & 0xff) << 24
+ (int)(packet[12 + i + 1] & 0xff) << 16
+ (int)(packet[12 + i + 2] & 0xff) << 8
+ (int)(packet[12 + i + 3] & 0xff);
csrcList[i] = (long) (packet[12 + i] & 0xff) << 24
+ (packet[12 + i + 1] & 0xff) << 16
+ (packet[12 + i + 2] & 0xff) << 8
+ (packet[12 + i + 3] & 0xff);
rtpPacket.setCsrcList(csrcList);
int dataOffset = 12 + csrcList.length * 4;
int dataLength = packet.length - dataOffset;

View File

@@ -19,29 +19,16 @@
package peers.sdp;
import lombok.Getter;
import lombok.Setter;
import peers.media.MediaManager;
@Getter @Setter
public class Codec {
private int payloadType;
private String name;
public int getPayloadType() {
return payloadType;
}
public void setPayloadType(int payloadType) {
this.payloadType = payloadType;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Codec)) {

View File

@@ -19,12 +19,16 @@
package peers.sdp;
import lombok.Getter;
import lombok.Setter;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.util.Hashtable;
import java.util.List;
@Getter @Setter
public class MediaDescription {
private String type;
@@ -34,49 +38,9 @@ public class MediaDescription {
private int port;
private List<Codec> codecs;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Hashtable<String, String> getAttributes() {
return attributes;
}
public void setAttributes(Hashtable<String, String> attributes) {
this.attributes = attributes;
}
public InetAddress getIpAddress() {
return ipAddress;
}
public void setIpAddress(InetAddress ipAddress) {
this.ipAddress = ipAddress;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public List<Codec> getCodecs() {
return codecs;
}
public void setCodecs(List<Codec> codecs) {
this.codecs = codecs;
}
@Override
public String toString() {
StringBuffer buf = new StringBuffer();
StringBuilder buf = new StringBuilder();
buf.append(RFC4566.TYPE_MEDIA).append(RFC4566.SEPARATOR);
buf.append(type).append(" ").append(port);
buf.append(" RTP/AVP");
@@ -106,7 +70,7 @@ public class MediaDescription {
buf.append(RFC4566.TYPE_ATTRIBUTE).append(RFC4566.SEPARATOR);
buf.append(attributeName);
String attributeValue = attributes.get(attributeName);
if (attributeValue != null && !"".equals(attributeValue.trim())) {
if (attributeValue != null && !attributeValue.trim().isEmpty()) {
buf.append(":").append(attributeValue);
}
buf.append("\r\n");

View File

@@ -19,34 +19,14 @@
package peers.sdp;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class MediaDestination {
private String destination;
private int port;
private Codec codec;
public String getDestination() {
return destination;
}
public void setDestination(String destination) {
this.destination = destination;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public Codec getCodec() {
return codec;
}
public void setCodec(Codec codec) {
this.codec = codec;
}
}

View File

@@ -19,6 +19,7 @@
package peers.sdp;
@SuppressWarnings("unused")
public class RFC4566 {
public static final char VERSION = '0';

View File

@@ -35,17 +35,17 @@ import peers.sip.core.useragent.UserAgent;
public class SDPManager {
private SdpParser sdpParser;
private UserAgent userAgent;
private List<Codec> supportedCodecs;
private Random random;
private final SdpParser sdpParser;
private final UserAgent userAgent;
private final List<Codec> supportedCodecs;
private final Random random;
public SDPManager(UserAgent userAgent) {
this.userAgent = userAgent;
sdpParser = new SdpParser();
supportedCodecs = new ArrayList<Codec>();
supportedCodecs = new ArrayList<>();
random = new Random();
//TODO retrieve codecs from configuration file
Codec codec = new Codec();
@@ -116,12 +116,12 @@ public class SDPManager {
}
sessionDescription.setIpAddress(inetAddress);
sessionDescription.setName("-");
sessionDescription.setAttributes(new Hashtable<String, String>());
sessionDescription.setAttributes(new Hashtable<>());
List<Codec> codecs;
if (offer == null) {
codecs = supportedCodecs;
} else {
codecs = new ArrayList<Codec>();
codecs = new ArrayList<>();
for (MediaDescription mediaDescription:
offer.getMediaDescriptions()) {
if (RFC4566.MEDIA_AUDIO.equals(mediaDescription.getType())) {
@@ -134,14 +134,14 @@ public class SDPManager {
}
}
MediaDescription mediaDescription = new MediaDescription();
Hashtable<String, String> attributes = new Hashtable<String, String>();
Hashtable<String, String> attributes = new Hashtable<>();
attributes.put(RFC4566.ATTR_SENDRECV, "");
mediaDescription.setAttributes(attributes);
mediaDescription.setType(RFC4566.MEDIA_AUDIO);
mediaDescription.setPort(localRtpPort);
mediaDescription.setCodecs(codecs);
List<MediaDescription> mediaDescriptions =
new ArrayList<MediaDescription>();
new ArrayList<>();
mediaDescriptions.add(mediaDescription);
sessionDescription.setMediaDescriptions(mediaDescriptions);
return sessionDescription;

View File

@@ -19,20 +19,11 @@
package peers.sdp;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class SdpLine {
private char type;
private String value;
public char getType() {
return type;
}
public void setType(char type) {
this.type = type;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

View File

@@ -19,81 +19,30 @@
package peers.sdp;
import lombok.Getter;
import lombok.Setter;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.util.Hashtable;
import java.util.List;
@Getter @Setter
public class SessionDescription {
private long id;
private long version;
private String name;
private String username;
private InetAddress ipAddress;
private List<MediaDescription> mediaDescriptions;
private Hashtable<String, String> attributes;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public InetAddress getIpAddress() {
return ipAddress;
}
public void setIpAddress(InetAddress ipAddress) {
this.ipAddress = ipAddress;
}
public List<MediaDescription> getMediaDescriptions() {
return mediaDescriptions;
}
public void setMediaDescriptions(List<MediaDescription> mediaDescriptions) {
this.mediaDescriptions = mediaDescriptions;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public long getVersion() {
return version;
}
public void setVersion(long version) {
this.version = version;
}
public Hashtable<String, String> getAttributes() {
return attributes;
}
public void setAttributes(Hashtable<String, String> attributes) {
this.attributes = attributes;
}
@Override
public String toString() {
StringBuffer buf = new StringBuffer();
StringBuilder buf = new StringBuilder();
buf.append("v=0\r\n");
buf.append("o=").append(username).append(" ").append(id);
buf.append(" ").append(version);
@@ -115,7 +64,7 @@ public class SessionDescription {
for (String attributeName: attributes.keySet()) {
String attributeValue = attributes.get(attributeName);
buf.append("a=").append(attributeName);
if (attributeValue != null && !"".equals(attributeValue.trim())) {
if (attributeValue != null && !attributeValue.trim().isEmpty()) {
buf.append(":");
buf.append(attributeValue);
buf.append("\r\n");

View File

@@ -32,12 +32,11 @@ public abstract class AbstractState {
}
public void log(AbstractState state) {
StringBuffer buf = new StringBuffer();
buf.append("SM ").append(id).append(" [");
buf.append(JavaUtils.getShortClassName(this.getClass())).append(" -> ");
buf.append(JavaUtils.getShortClassName(state.getClass())).append("] ");
buf.append(new Exception().getStackTrace()[1].getMethodName());
Logger.debug(buf.toString());
String buf = "SM " + id + " [" +
JavaUtils.getShortClassName(this.getClass()) + " -> " +
JavaUtils.getShortClassName(state.getClass()) + "] " +
new Exception().getStackTrace()[1].getMethodName();
Logger.debug(buf);
}
}

View File

@@ -29,13 +29,13 @@ import peers.sip.syntaxencoding.SipHeaderFieldValue;
import peers.sip.syntaxencoding.SipHeaders;
import peers.sip.transport.SipMessage;
@SuppressWarnings("unused")
public class Utils {
public static final String PEERSHOME_SYSTEM_PROPERTY = "peers.home";
public static final String DEFAULT_PEERS_HOME = ".";
public final static SipHeaderFieldValue getTopVia(SipMessage sipMessage) {
public static SipHeaderFieldValue getTopVia(SipMessage sipMessage) {
SipHeaders sipHeaders = sipMessage.getSipHeaders();
SipHeaderFieldName viaName = new SipHeaderFieldName(RFC3261.HDR_VIA);
SipHeaderFieldValue via = sipHeaders.get(viaName);
@@ -45,40 +45,37 @@ public class Utils {
return via;
}
public final static String generateTag() {
public static String generateTag() {
return randomString(8);
}
public final static String generateCallID(InetAddress inetAddress) {
public static String generateCallID(InetAddress inetAddress) {
//TODO make a hash using current time millis, public ip @, private @, and a random string
StringBuffer buf = new StringBuffer();
buf.append(randomString(8));
buf.append('-');
buf.append(String.valueOf(System.currentTimeMillis()));
buf.append('@');
buf.append(inetAddress.getHostName());
return buf.toString();
return randomString(8) +
'-' +
System.currentTimeMillis() +
'@' +
inetAddress.getHostName();
}
public final static String generateBranchId() {
StringBuffer buf = new StringBuffer();
buf.append(RFC3261.BRANCHID_MAGIC_COOKIE);
public static String generateBranchId() {
//TODO must be unique across space and time...
buf.append(randomString(9));
return buf.toString();
return RFC3261.BRANCHID_MAGIC_COOKIE +
//TODO must be unique across space and time...
randomString(9);
}
public final static String getMessageCallId(SipMessage sipMessage) {
public static String getMessageCallId(SipMessage sipMessage) {
SipHeaderFieldValue callId = sipMessage.getSipHeaders().get(
new SipHeaderFieldName(RFC3261.HDR_CALLID));
return callId.getValue();
}
public final static String randomString(int length) {
public static String randomString(int length) {
String chars = "abcdefghijklmnopqrstuvwxyz" +
"ABCDEFGHIFKLMNOPRSTUVWXYZ" +
"0123456789";
StringBuffer buf = new StringBuffer(length);
StringBuilder buf = new StringBuilder(length);
for (int i = 0; i < length; ++i) {
int pos = (int)Math.round(Math.random() * (chars.length() - 1));
buf.append(chars.charAt(pos));
@@ -86,7 +83,7 @@ public class Utils {
return buf.toString();
}
public final static void copyHeader(SipMessage src, SipMessage dst, String name) {
public static void copyHeader(SipMessage src, SipMessage dst, String name) {
SipHeaderFieldName sipHeaderFieldName = new SipHeaderFieldName(name);
SipHeaderFieldValue sipHeaderFieldValue = src.getSipHeaders().get(sipHeaderFieldName);
if (sipHeaderFieldValue != null) {
@@ -94,7 +91,7 @@ public class Utils {
}
}
public final static String getUserPart(String sipUri) {
public static String getUserPart(String sipUri) {
int start = sipUri.indexOf(RFC3261.SCHEME_SEPARATOR);
int end = sipUri.indexOf(RFC3261.AT);
return sipUri.substring(start + 1, end);
@@ -102,9 +99,9 @@ public class Utils {
/**
* adds Max-Forwards Supported and Require headers
* @param headers
* @param headers the headers to add to
*/
public final static void addCommonHeaders(SipHeaders headers) {
public static void addCommonHeaders(SipHeaders headers) {
//Max-Forwards
headers.add(new SipHeaderFieldName(RFC3261.HDR_MAX_FORWARDS),
@@ -114,8 +111,8 @@ public class Utils {
//TODO Supported and Require
}
public final static String generateAllowHeader() {
StringBuffer buf = new StringBuffer();
public static String generateAllowHeader() {
StringBuilder buf = new StringBuilder();
for (String supportedMethod: UAS.SUPPORTED_METHODS) {
buf.append(supportedMethod);
buf.append(", ");

View File

@@ -23,5 +23,5 @@ import peers.sip.transport.SipMessage;
public interface MessageInterceptor {
public void postProcess(SipMessage sipMessage);
void postProcess(SipMessage sipMessage);
}

View File

@@ -19,28 +19,24 @@
package peers.sip.core.useragent;
import lombok.Getter;
import peers.sip.transport.SipMessage;
@SuppressWarnings("unused")
public class SipEvent {
public enum EventType {
ERROR, RINGING, INCOMING_CALL, CALLEE_PICKUP;
ERROR, RINGING, INCOMING_CALL, CALLEE_PICKUP
}
private EventType eventType;
private SipMessage sipMessage;
@Getter private final EventType eventType;
@Getter private final SipMessage sipMessage;
public SipEvent(EventType type, SipMessage sipMessage) {
this.eventType = type;
this.sipMessage = sipMessage;
}
public SipMessage getSipMessage() {
return sipMessage;
}
public EventType getEventType() {
return eventType;
}
}

View File

@@ -25,20 +25,20 @@ import peers.sip.transport.SipResponse;
public interface SipListener {
public void registering(SipRequest sipRequest);
void registering(SipRequest sipRequest);
public void registerSuccessful(SipResponse sipResponse);
void registerSuccessful(SipResponse sipResponse);
public void registerFailed(SipResponse sipResponse);
void registerFailed(SipResponse sipResponse);
public void incomingCall(SipRequest sipRequest, SipResponse provResponse);
void incomingCall(SipRequest sipRequest, SipResponse provResponse);
public void remoteHangup(SipRequest sipRequest);
void remoteHangup(SipRequest sipRequest);
public void ringing(SipResponse sipResponse);
void ringing(SipResponse sipResponse);
public void calleePickup(SipResponse sipResponse);
void calleePickup(SipResponse sipResponse);
public void error(SipResponse sipResponse);
void error(SipResponse sipResponse);
}

View File

@@ -19,6 +19,7 @@
package peers.sip.syntaxencoding;
@SuppressWarnings("unused")
public class RunnableSipParser implements Runnable {
public void run() {

View File

@@ -19,10 +19,14 @@
package peers.sip.syntaxencoding;
import lombok.Getter;
import lombok.Setter;
@Getter
public class SipHeader {
private SipHeaderFieldName name;
private SipHeaderFieldValue value;
private final SipHeaderFieldName name;
private @Setter SipHeaderFieldValue value;
SipHeader(SipHeaderFieldName name, SipHeaderFieldValue value) {
super();
@@ -39,16 +43,4 @@ public class SipHeader {
return false;
}
public SipHeaderFieldName getName() {
return name;
}
public SipHeaderFieldValue getValue() {
return value;
}
public void setValue(SipHeaderFieldValue value) {
this.value = value;
}
}

View File

@@ -19,11 +19,13 @@
package peers.sip.syntaxencoding;
import lombok.Getter;
import java.util.List;
public class SipHeaderFieldMultiValue extends SipHeaderFieldValue {
private List<SipHeaderFieldValue> values;
@Getter private final List<SipHeaderFieldValue> values;
private static String toString(List<SipHeaderFieldValue> list) {
if (list == null) {
@@ -38,9 +40,6 @@ public class SipHeaderFieldMultiValue extends SipHeaderFieldValue {
this.values = values;
}
public List<SipHeaderFieldValue> getValues() {
return values;
}
@Override
public String toString() {

View File

@@ -19,12 +19,14 @@
package peers.sip.syntaxencoding;
import lombok.Getter;
public class SipHeaderFieldName {
private final static SipHeadersTable SIP_HEADER_TABLE =
new SipHeadersTable();
private String name;
@Getter private final String name;
public SipHeaderFieldName(String name) {
super();
@@ -41,10 +43,7 @@ public class SipHeaderFieldName {
return false;
}
String objName = ((SipHeaderFieldName)obj).getName();
if (name.equalsIgnoreCase(objName)) {
return true;
}
return false;
return name.equalsIgnoreCase(objName);
}
@Override
@@ -52,10 +51,6 @@ public class SipHeaderFieldName {
return name.hashCode();
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;

View File

@@ -21,14 +21,16 @@ package peers.sip.syntaxencoding;
import java.util.HashMap;
import lombok.Getter;
import lombok.Setter;
import peers.sip.RFC3261;
public class SipHeaderFieldValue {
private String value;
@Getter @Setter private String value;
private HashMap<SipHeaderParamName, String> params;
private final HashMap<SipHeaderParamName, String> params;
public SipHeaderFieldValue(String value) {
int startPos = value.indexOf(RFC3261.RIGHT_ANGLE_BRACKET);
@@ -46,7 +48,7 @@ public class SipHeaderFieldValue {
this.value = value;
paramsString = "";
}
params = new HashMap<SipHeaderParamName, String>();
params = new HashMap<>();
if (paramsString.contains(RFC3261.PARAM_SEPARATOR)) {
String[] arr = paramsString.split(RFC3261.PARAM_SEPARATOR);
if (arr.length > 1) {
@@ -76,24 +78,18 @@ public class SipHeaderFieldValue {
params.remove(name);
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
if (params == null || params.isEmpty()) {
return value;
}
StringBuffer buf = new StringBuffer(value);
StringBuilder buf = new StringBuilder(value);
for (SipHeaderParamName name: params.keySet()) {
buf.append(RFC3261.PARAM_SEPARATOR).append(name);
String value = params.get(name);
if (!"".equals(value.trim())) {
if (!value.trim().isEmpty()) {
buf.append(RFC3261.PARAM_ASSIGNMENT).append(value);
}
}

View File

@@ -19,19 +19,17 @@
package peers.sip.syntaxencoding;
import lombok.Getter;
public class SipHeaderParamName {
private String name;
@Getter private String name;
public SipHeaderParamName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {

View File

@@ -24,19 +24,19 @@ import java.util.ArrayList;
import peers.sip.RFC3261;
@SuppressWarnings("unused")
public class SipHeaders {
private ArrayList<SipHeader> headers;
private final ArrayList<SipHeader> headers;
public SipHeaders() {
headers = new ArrayList<SipHeader>();
headers = new ArrayList<>();
}
/**
*
* @param name
* @param value
* @param name SipHeaderFieldName
* @param value SipHeaderFieldValue
* @param index -1 to add at the end
*/
public void add(SipHeaderFieldName name, SipHeaderFieldValue value, int index) {
@@ -49,7 +49,7 @@ public class SipHeaders {
SipHeaderFieldMultiValue oldMultiVal = (SipHeaderFieldMultiValue) oldValue;
oldMultiVal.getValues().add(value);
} else {
ArrayList<SipHeaderFieldValue> arr = new ArrayList<SipHeaderFieldValue>();
ArrayList<SipHeaderFieldValue> arr = new ArrayList<>();
arr.add(oldValue);
arr.add(value);
header.setValue(new SipHeaderFieldMultiValue(arr));
@@ -90,7 +90,7 @@ public class SipHeaders {
@Override
public String toString() {
StringBuffer buf = new StringBuffer();
StringBuilder buf = new StringBuilder();
for (SipHeader header : headers) {
buf.append(header.getName().toString());
buf.append(": ");

View File

@@ -26,13 +26,13 @@ import peers.sip.RFC3261;
public class SipHeadersTable {
private HashMap<Character, String> headers;
private final HashMap<Character, String> headers;
/**
* should be instanciated only once, it was a singleton.
*/
public SipHeadersTable() {
headers = new HashMap<Character, String>();
headers = new HashMap<>();
//RFC 3261 Section 10
headers.put(RFC3261.COMPACT_HDR_CALLID, RFC3261.HDR_CALLID);
headers.put(RFC3261.COMPACT_HDR_CONTACT, RFC3261.HDR_CONTACT);

View File

@@ -38,10 +38,10 @@ public class SipParser {
private final static int BUFF_SIZE = 1024;
private List<SipHeaderFieldName> singleValueHeaders;
private final List<SipHeaderFieldName> singleValueHeaders;
public SipParser() {
singleValueHeaders = new ArrayList<SipHeaderFieldName>();
singleValueHeaders = new ArrayList<>();
singleValueHeaders.add(new SipHeaderFieldName(
RFC3261.HDR_WWW_AUTHENTICATE));
singleValueHeaders.add(new SipHeaderFieldName(
@@ -63,7 +63,7 @@ public class SipParser {
reader = new BufferedReader(inputStreamReader);
String startLine = reader.readLine();
while (startLine == null || startLine.equals("")) {
while (startLine == null || startLine.isEmpty()) {
startLine = reader.readLine();
}
SipMessage sipMessage;
@@ -83,7 +83,7 @@ public class SipParser {
if (params.length != 3) {
throw new SipParserException("invalid request line");
}
if (!RFC3261.DEFAULT_SIP_VERSION.equals(params[2].toUpperCase())) {
if (!RFC3261.DEFAULT_SIP_VERSION.equalsIgnoreCase(params[2])) {
throw new SipParserException("unsupported SIP version");
}
SipURI requestUri;
@@ -100,10 +100,10 @@ public class SipParser {
if (params.length < 3) {
throw new SipParserException("incorrect status line");
}
if (!RFC3261.DEFAULT_SIP_VERSION.equals(params[0].toUpperCase())) {
if (!RFC3261.DEFAULT_SIP_VERSION.equalsIgnoreCase(params[0])) {
throw new SipParserException("unsupported SIP version");
}
StringBuffer buf = new StringBuffer();
StringBuilder buf = new StringBuilder();
for (int i = 2; i < params.length; ++i) {
buf.append(params[i]).append(" ");
}
@@ -121,7 +121,7 @@ public class SipParser {
String nextLine = reader.readLine();
if (nextLine != null &&
(nextLine.startsWith(" ") || nextLine.startsWith("\t"))) {
StringBuffer buf = new StringBuffer(headerLine);
StringBuilder buf = new StringBuilder(headerLine);
while (nextLine != null &&
(nextLine.startsWith(" ") || nextLine.startsWith("\t"))) {
buf.append(' ');
@@ -142,10 +142,10 @@ public class SipParser {
String value = headerLine.substring(columnPos + 1).trim();
SipHeaderFieldValue sipHeaderValue;
if (!singleValueHeaders.contains(sipHeaderName) &&
value.indexOf(RFC3261.HEADER_SEPARATOR) > -1) {
value.contains(RFC3261.HEADER_SEPARATOR)) {
String[] values = value.split(RFC3261.HEADER_SEPARATOR);
List<SipHeaderFieldValue> list =
new ArrayList<SipHeaderFieldValue>();
new ArrayList<>();
for (String s: values) {
list.add(new SipHeaderFieldValue(s));
}
@@ -159,7 +159,7 @@ public class SipParser {
sipMessage.setSipHeaders(sipHeaders);
}
public void parseBody(SipMessage sipMessage) throws IOException, SipParserException {
public void parseBody(SipMessage sipMessage) throws IOException {
SipHeaderFieldValue contentLengthValue =
sipMessage.getSipHeaders().get(new SipHeaderFieldName(
RFC3261.HDR_CONTENT_LENGTH));

View File

@@ -19,6 +19,7 @@
package peers.sip.syntaxencoding;
@SuppressWarnings("unused")
public class SipParserException extends Exception {
private static final long serialVersionUID = 1L;

View File

@@ -21,6 +21,7 @@ package peers.sip.syntaxencoding;
import java.util.Hashtable;
import lombok.Getter;
import peers.sip.RFC3261;
@@ -29,24 +30,24 @@ public class SipURI {
public final static int DEFAULT_PORT = -1;
private String stringRepresentation;
private final String stringRepresentation;
/**
* telephone-subscriber and optional port are not managed
*/
private String userinfo;
private String host;
private int port = DEFAULT_PORT;
@Getter private String userinfo;
@Getter private final String host;
@Getter private int port = DEFAULT_PORT;
/**
* Use empty strings in value if the parameter has no value
*/
private Hashtable<String, String> uriParameters;
@Getter private Hashtable<String, String> uriParameters;
//headers not implemented
//private Hashtable<String, String> headers;
public SipURI(String sipUri)
throws SipUriSyntaxException {
stringRepresentation = sipUri;
StringBuffer buf = new StringBuffer(sipUri);
StringBuilder buf = new StringBuilder(sipUri);
String scheme = RFC3261.SIP_SCHEME + RFC3261.SCHEME_SEPARATOR;
if (!sipUri.startsWith(scheme)) {
throw new SipUriSyntaxException("SIP URI must start with " + scheme);
@@ -87,7 +88,7 @@ public class SipURI {
if (buf.length() <= 0) {
return;
}
uriParameters = new Hashtable<String, String>();
uriParameters = new Hashtable<>();
while (buf.length() > 0) {
buf.deleteCharAt(0);//delete the first ';'
int nextSemicolon = buf.indexOf(";");
@@ -117,20 +118,4 @@ public class SipURI {
return stringRepresentation;
}
public String getHost() {
return host;
}
public int getPort() {
return port;
}
public Hashtable<String, String> getUriParameters() {
return uriParameters;
}
public String getUserinfo() {
return userinfo;
}
}

View File

@@ -22,10 +22,10 @@ package peers.sip.transaction;
import peers.sip.transport.SipResponse;
public interface ClientTransactionUser {
public void transactionTimeout(ClientTransaction clientTransaction);
public void provResponseReceived(SipResponse sipResponse, Transaction transaction);
void transactionTimeout(ClientTransaction clientTransaction);
void provResponseReceived(SipResponse sipResponse, Transaction transaction);
//TODO eventually pass transaction to the transaction user
public void errResponseReceived(SipResponse sipResponse);//3XX is considered as an error response
public void successResponseReceived(SipResponse sipResponse, Transaction transaction);
public void transactionTransportError();
void errResponseReceived(SipResponse sipResponse);//3XX is considered as an error response
void successResponseReceived(SipResponse sipResponse, Transaction transaction);
void transactionTransportError();
}

View File

@@ -24,9 +24,9 @@ import peers.sip.transport.SipResponse;
public interface ServerTransaction {
public void start();
void start();
public void receivedRequest(SipRequest sipRequest);
void receivedRequest(SipRequest sipRequest);
public void sendReponse(SipResponse sipResponse);
void sendReponse(SipResponse sipResponse);
}

View File

@@ -21,5 +21,5 @@ package peers.sip.transaction;
public interface ServerTransactionUser {
public void transactionFailure();
void transactionFailure();
}

View File

@@ -19,11 +19,14 @@
package peers.sip.transaction;
import lombok.Getter;
@SuppressWarnings("unused")
@Getter
public class SipListeningPoint {
private int localPort;
private String localTransport;
private final int localPort;
private final String localTransport;
public SipListeningPoint(int localPort, String localTransport) {
super();
@@ -43,9 +46,7 @@ public class SipListeningPoint {
@Override
public String toString() {
StringBuffer buf = new StringBuffer();
buf.append(':').append(localPort).append('/').append(localTransport);
return buf.toString();
return ":" + localPort + '/' + localTransport;
}
@Override
@@ -53,12 +54,4 @@ public class SipListeningPoint {
return toString().hashCode();
}
public int getlocalPort() {
return localPort;
}
public String getlocalTransport() {
return localTransport;
}
}

View File

@@ -34,11 +34,11 @@ import peers.sip.transport.SipResponse;
public class DialogManager {
private Hashtable<String, Dialog> dialogs;
private final Hashtable<String, Dialog> dialogs;
public DialogManager() {
dialogs = new Hashtable<String, Dialog>();
dialogs = new Hashtable<>();
}
/**
@@ -100,13 +100,11 @@ public class DialogManager {
}
private String getDialogId(String callID, String localTag, String remoteTag) {
StringBuffer buf = new StringBuffer();
buf.append(callID);
buf.append(Dialog.ID_SEPARATOR);
buf.append(localTag);
buf.append(Dialog.ID_SEPARATOR);
buf.append(remoteTag);
return buf.toString();
return callID +
Dialog.ID_SEPARATOR +
localTag +
Dialog.ID_SEPARATOR +
remoteTag;
}
public Collection<Dialog> getDialogCollection() {

View File

@@ -24,6 +24,7 @@ import java.net.InetAddress;
import java.util.Timer;
import java.util.TimerTask;
import lombok.Getter;
import org.pmw.tinylog.Logger;
import peers.Config;
@@ -36,10 +37,10 @@ public abstract class MessageSender {
protected InetAddress inetAddress;
protected int port;
protected int localPort;
private Config config;
private String transportName;
private Timer timer;
@Getter protected int localPort;
private final Config config;
private final String transportName;
private final Timer timer;
public MessageSender(int localPort, InetAddress inetAddress,
int port, Config config,
@@ -61,7 +62,7 @@ public abstract class MessageSender {
public abstract void sendBytes(byte[] bytes) throws IOException;
public String getContact() {
StringBuffer buf = new StringBuffer();
StringBuilder buf = new StringBuilder();
InetAddress myAddress = config.getPublicInetAddress();
if (myAddress == null) {
myAddress = config.getLocalInetAddress();
@@ -77,9 +78,7 @@ public abstract class MessageSender {
return buf.toString();
}
public int getLocalPort() {
return localPort;
}
public void stopKeepAlives() {
timer.cancel();

View File

@@ -19,9 +19,9 @@
package peers.sip.transport;
@SuppressWarnings("unused")
public interface SipClientTransportUser {
public void requestTransportError(SipRequest sipRequest, Exception e);
public void responseTransportError(Exception e);
void requestTransportError(SipRequest sipRequest, Exception e);
void responseTransportError(Exception e);
}

View File

@@ -19,15 +19,18 @@
package peers.sip.transport;
import lombok.Getter;
import lombok.Setter;
import peers.sip.RFC3261;
import peers.sip.syntaxencoding.SipHeaderFieldName;
import peers.sip.syntaxencoding.SipHeaderFieldValue;
import peers.sip.syntaxencoding.SipHeaders;
@Getter
public abstract class SipMessage {
protected String sipVersion;
protected SipHeaders sipHeaders;
@Setter protected SipHeaders sipHeaders;
protected byte[] body;
public SipMessage() {
@@ -35,22 +38,6 @@ public abstract class SipMessage {
sipHeaders = new SipHeaders();
}
public String getSipVersion() {
return sipVersion;
}
public void setSipHeaders(SipHeaders sipHeaders) {
this.sipHeaders = sipHeaders;
}
public SipHeaders getSipHeaders() {
return sipHeaders;
}
public byte[] getBody() {
return body;
}
public void setBody(byte[] body) {
SipHeaderFieldName contentLengthName =
new SipHeaderFieldName(RFC3261.HDR_CONTENT_LENGTH);
@@ -68,7 +55,7 @@ public abstract class SipMessage {
@Override
public String toString() {
StringBuffer buf = new StringBuffer();
StringBuilder buf = new StringBuilder();
buf.append(sipHeaders.toString());
buf.append(RFC3261.CRLF);
if (body != null) {

View File

@@ -19,9 +19,11 @@
package peers.sip.transport;
import lombok.Getter;
import peers.sip.RFC3261;
import peers.sip.syntaxencoding.SipURI;
@Getter
public class SipRequest extends SipMessage {
protected String method;
protected SipURI requestUri;
@@ -35,19 +37,9 @@ public class SipRequest extends SipMessage {
@Override
public String toString() {
StringBuffer buf = new StringBuffer();
buf.append(method).append(' ').append(requestUri).append(
' ').append(RFC3261.DEFAULT_SIP_VERSION).append(RFC3261.CRLF);
buf.append(super.toString());
return buf.toString();
}
public String getMethod() {
return method;
}
public SipURI getRequestUri() {
return requestUri;
return method + ' ' + requestUri +
' ' + RFC3261.DEFAULT_SIP_VERSION + RFC3261.CRLF +
super.toString();
}
}

View File

@@ -19,8 +19,10 @@
package peers.sip.transport;
import lombok.Getter;
import peers.sip.RFC3261;
@Getter
public class SipResponse extends SipMessage {
protected int statusCode;
protected String reasonPhrase;
@@ -32,19 +34,9 @@ public class SipResponse extends SipMessage {
@Override
public String toString() {
StringBuffer buf = new StringBuffer();
buf.append(RFC3261.DEFAULT_SIP_VERSION).append(' ').append(statusCode
).append(' ').append(reasonPhrase).append(RFC3261.CRLF);
buf.append(super.toString());
return buf.toString();
}
public int getStatusCode() {
return statusCode;
}
public String getReasonPhrase() {
return reasonPhrase;
return RFC3261.DEFAULT_SIP_VERSION + ' ' + statusCode +
' ' + reasonPhrase + RFC3261.CRLF +
super.toString();
}
}

View File

@@ -21,5 +21,5 @@ package peers.sip.transport;
public interface SipServerTransportUser {
public void messageReceived(SipMessage sipMessage);
void messageReceived(SipMessage sipMessage);
}

View File

@@ -21,19 +21,20 @@ package peers.sip.transport;
import java.net.InetAddress;
import lombok.Getter;
import peers.sip.RFC3261;
public class SipTransportConnection {
public static final int EMPTY_PORT = -1;
private InetAddress localInetAddress;
private int localPort = EMPTY_PORT;
@Getter private final InetAddress localInetAddress;
@Getter private int localPort = EMPTY_PORT;
private InetAddress remoteInetAddress;
private int remotePort = EMPTY_PORT;
@Getter private final InetAddress remoteInetAddress;
@Getter private int remotePort = EMPTY_PORT;
private String transport;// UDP, TCP or SCTP
@Getter private final String transport;// UDP, TCP or SCTP
public SipTransportConnection(InetAddress localInetAddress,
int localPort, InetAddress remoteInetAddress, int remotePort,
@@ -99,25 +100,5 @@ public class SipTransportConnection {
return toString().hashCode();
}
public InetAddress getLocalInetAddress() {
return localInetAddress;
}
public int getLocalPort() {
return localPort;
}
public InetAddress getRemoteInetAddress() {
return remoteInetAddress;
}
public int getRemotePort() {
return remotePort;
}
public String getTransport() {
return transport;
}
}

View File

@@ -22,7 +22,6 @@ package peers.sip.transport;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.security.AccessController;
import java.security.PrivilegedAction;
@@ -36,12 +35,11 @@ import peers.sip.transaction.TransactionManager;
public class UdpMessageReceiver extends MessageReceiver {
private DatagramSocket datagramSocket;
private final DatagramSocket datagramSocket;
public UdpMessageReceiver(DatagramSocket datagramSocket,
TransactionManager transactionManager,
TransportManager transportManager, Config config)
throws SocketException {
TransportManager transportManager, Config config) {
super(datagramSocket.getLocalPort(), transactionManager,
transportManager, config);
this.datagramSocket = datagramSocket;
@@ -56,8 +54,7 @@ public class UdpMessageReceiver extends MessageReceiver {
final int ioException = 2;
// AccessController.doPrivileged added for plugin compatibility
int result = AccessController.doPrivileged(
new PrivilegedAction<Integer>() {
public Integer run() {
(PrivilegedAction<Integer>) () -> {
try {
datagramSocket.receive(packet);
} catch (SocketTimeoutException e) {
@@ -67,15 +64,12 @@ public class UdpMessageReceiver extends MessageReceiver {
return ioException;
}
return noException;
}
});
switch (result) {
case socketTimeoutException:
return;
case ioException:
throw new IOException();
case noException:
break;
default:
break;
}

View File

@@ -19,11 +19,9 @@
package peers.sip.transport;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.security.AccessController;
import java.security.PrivilegedAction;
@@ -35,31 +33,30 @@ import peers.sip.RFC3261;
public class UdpMessageSender extends MessageSender {
private DatagramSocket datagramSocket;
private final DatagramSocket datagramSocket;
public UdpMessageSender(InetAddress inetAddress, int port,
DatagramSocket datagramSocket, Config config) throws SocketException {
DatagramSocket datagramSocket, Config config) {
super(datagramSocket.getLocalPort(), inetAddress, port,
config, RFC3261.TRANSPORT_UDP);
this.datagramSocket = datagramSocket;
}
@Override
public synchronized void sendMessage(SipMessage sipMessage) throws IOException {
public synchronized void sendMessage(SipMessage sipMessage) {
Logger.debug("UdpMessageSender.sendMessage");
if (sipMessage == null) {
return;
}
byte[] buf = sipMessage.toString().getBytes();
sendBytes(buf);
StringBuffer direction = new StringBuffer();
direction.append("SENT to ").append(inetAddress.getHostAddress());
direction.append("/").append(port);
Logger.info(new String(buf), direction.toString());
String direction = "SENT to " + inetAddress.getHostAddress() +
"/" + port;
Logger.info(new String(buf), direction);
}
@Override
public synchronized void sendBytes(byte[] bytes) throws IOException {
public synchronized void sendBytes(byte[] bytes) {
Logger.debug("UdpMessageSender.sendBytes");
final DatagramPacket packet = new DatagramPacket(bytes, bytes.length,
inetAddress, port);
@@ -67,10 +64,7 @@ public class UdpMessageSender extends MessageSender {
+ " " + inetAddress + ":" + port);
// AccessController.doPrivileged added for plugin compatibility
AccessController.doPrivileged(
new PrivilegedAction<Void>() {
@Override
public Void run() {
(PrivilegedAction<Void>) () -> {
try {
Logger.debug(datagramSocket.getLocalAddress().toString());
datagramSocket.send(packet);
@@ -79,7 +73,6 @@ public class UdpMessageSender extends MessageSender {
}
return null;
}
}
);
Logger.debug("UdpMessageSender.sendBytes packet sent");