|
@@ -1,10 +1,24 @@
|
|
|
package de.tudarmstadt.informatik.hostage.protocol;
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
|
|
|
import de.tudarmstadt.informatik.hostage.wrapper.Packet;
|
|
|
|
|
|
public class SIP implements Protocol {
|
|
|
+
|
|
|
+ private String request;
|
|
|
+
|
|
|
+ private static final String VERSION = "SIP/2.0";
|
|
|
+ private static final String INVITE = "INVITE";
|
|
|
+ private static final String ACK= "ACK";
|
|
|
+ private static final String BYE = "BYE";
|
|
|
+ private static final String STATUS_CODE_180 = "180 Ringing";
|
|
|
+ private static final String STATUS_CODE_200 = "200 OK";
|
|
|
+ private static final String STATUS_CODE_505 = "505 Version Not Supported";
|
|
|
+
|
|
|
+ private String header;
|
|
|
+ private String sdpPayload;
|
|
|
|
|
|
@Override
|
|
|
public int getPort() {
|
|
@@ -14,7 +28,7 @@ public class SIP implements Protocol {
|
|
|
@Override
|
|
|
public boolean isClosed() {
|
|
|
// TODO Auto-generated method stub
|
|
|
- return true;
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -23,14 +37,91 @@ public class SIP implements Protocol {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public List<Packet> processMessage(Packet packet) {
|
|
|
+ public List<Packet> processMessage(Packet requestPacket) {
|
|
|
// TODO Auto-generated method stub
|
|
|
- return null;
|
|
|
+ String request = null;
|
|
|
+ if (requestPacket != null) {
|
|
|
+ request = requestPacket.toString();
|
|
|
+ }
|
|
|
+ List<Packet> responsePackets = new ArrayList<Packet>();
|
|
|
+ this.request = request;
|
|
|
+ System.out.println(request);
|
|
|
+ String[] lines = request.split("\r\n");
|
|
|
+ extractLines(lines);
|
|
|
+
|
|
|
+ if(!lines[0].contains(VERSION)) {
|
|
|
+ responsePackets.add(new Packet(STATUS_CODE_505));
|
|
|
+ return responsePackets;
|
|
|
+ } else if(lines[0].contains(INVITE)) {
|
|
|
+ responsePackets.add(getRingResponse());
|
|
|
+ responsePackets.add(getOkResponseWithSDP());
|
|
|
+ } else if(lines[0].contains(BYE)) {
|
|
|
+ responsePackets.add(getOkResponse());
|
|
|
+ }
|
|
|
+
|
|
|
+ return responsePackets;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public TALK_FIRST whoTalksFirst() {
|
|
|
return TALK_FIRST.CLIENT;
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String toString() {
|
|
|
+ return "SIP";
|
|
|
+ }
|
|
|
+
|
|
|
+ private void extractLines(String[] lines) {
|
|
|
+ StringBuffer sbHeader = new StringBuffer();
|
|
|
+ StringBuffer sbSdp = new StringBuffer();
|
|
|
+ boolean recordHeader = false;
|
|
|
+ boolean recordSdp = false;
|
|
|
+ for (String line : lines) {
|
|
|
+ if (line.startsWith("Via:")) {
|
|
|
+ recordHeader = true;
|
|
|
+ } else if (line.startsWith("Max-Forwards:")) {
|
|
|
+ recordHeader = false;
|
|
|
+ } else if(line.startsWith("v=")) {
|
|
|
+ recordSdp = true;
|
|
|
+ }
|
|
|
+ if(recordHeader) {
|
|
|
+ sbHeader.append(line + "\r\n");
|
|
|
+ } else if(recordSdp) {
|
|
|
+ sbSdp.append(line + "\r\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ header = sbHeader.toString();
|
|
|
+ sdpPayload = sbSdp.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ private Packet getRingResponse() {
|
|
|
+ StringBuffer sb = new StringBuffer();
|
|
|
+ sb.append(VERSION + " " + STATUS_CODE_180 + "\r\n");
|
|
|
+ sb.append(header);
|
|
|
+ sb.append("Content-Length: 0\r\n");
|
|
|
+ return new Packet(sb.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ private Packet getOkResponseWithSDP() {
|
|
|
+ StringBuffer sb = new StringBuffer();
|
|
|
+ sb.append(VERSION + " " + STATUS_CODE_200 + "\r\n");
|
|
|
+ sb.append(header);
|
|
|
+ sb.append("Content-Type: application/sdp\r\n");
|
|
|
+ sb.append("Content-Length: " + sdpPayload.length() + "\r\n");
|
|
|
+ sb.append("\r\n");
|
|
|
+ sb.append(sdpPayload);
|
|
|
+ System.out.println(sb.toString());
|
|
|
+ return new Packet(sb.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ private Packet getOkResponse() {
|
|
|
+ StringBuffer sb = new StringBuffer();
|
|
|
+ sb.append(VERSION + " " + STATUS_CODE_200 + "\r\n");
|
|
|
+ sb.append(header);
|
|
|
+ sb.append("Content-Length: 0\r\n");
|
|
|
+
|
|
|
+ return new Packet(sb.toString());
|
|
|
+ }
|
|
|
|
|
|
}
|