*/ | */ | ||||
package model; | package model; | ||||
import java.util.concurrent.ExecutorService; | |||||
import java.util.concurrent.Executors; | |||||
import java.util.logging.Level; | import java.util.logging.Level; | ||||
import java.util.logging.Logger; | import java.util.logging.Logger; | ||||
import javax.sip.RequestEvent; | import javax.sip.RequestEvent; | ||||
* | * | ||||
* @author Jan | * @author Jan | ||||
*/ | */ | ||||
public class SIP180Ringing implements Runnable | |||||
public class SIP180Ringing | |||||
{ | { | ||||
private RequestEvent requestEvent; | |||||
private ExecutorService threadring; //für wiederholtes senden des Ringing Headers | |||||
private boolean callIncoming; | |||||
private Response responseRing; | private Response responseRing; | ||||
private MessageFactory messageFactory; | |||||
private HeaderFactory headerFactory; | |||||
private String myTag; | |||||
private String proxyTag; | |||||
public static final Logger lgRing = OhmLogger.getLogger(); | public static final Logger lgRing = OhmLogger.getLogger(); | ||||
//private SubmissionPublisher<Integer> publisherZahl; | //private SubmissionPublisher<Integer> publisherZahl; | ||||
public SIP180Ringing(RequestEvent requestEvent, String myTag, String proxyTag, ContactHeader contact, HeaderFactory headerFactory) | |||||
public SIP180Ringing(RequestEvent requestEvent, String myTag, ContactHeader contact, | |||||
HeaderFactory headerFactory, MessageFactory messageFactory) | |||||
{ | { | ||||
this.requestEvent = requestEvent; | |||||
this.headerFactory = headerFactory; | |||||
threadring = Executors.newSingleThreadExecutor(); | |||||
try | try | ||||
{ | { | ||||
responseRing = this.messageFactory.createResponse(180, this.requestEvent.getRequest()); | |||||
responseRing.addHeader((ViaHeader) this.requestEvent.getRequest().getHeader("Via")); | |||||
responseRing.addHeader((FromHeader) this.requestEvent.getRequest().getHeader("From")); | |||||
responseRing = messageFactory.createResponse(180, requestEvent.getRequest()); | |||||
responseRing.addHeader((ViaHeader) requestEvent.getRequest().getHeader("Via")); | |||||
responseRing.addHeader((FromHeader) requestEvent.getRequest().getHeader("From")); | |||||
//persönlichen Tag muss beim To-Header ergänzt werden | //persönlichen Tag muss beim To-Header ergänzt werden | ||||
ToHeader tempTo = ((ToHeader) this.requestEvent.getRequest().getHeader("To")); | |||||
ToHeader tempTo = ((ToHeader) requestEvent.getRequest().getHeader("To")); | |||||
tempTo.setTag(myTag); | tempTo.setTag(myTag); | ||||
responseRing.addHeader(tempTo); | responseRing.addHeader(tempTo); | ||||
responseRing.addHeader((CallIdHeader) requestEvent.getRequest().getHeader("Call-ID")); | responseRing.addHeader((CallIdHeader) requestEvent.getRequest().getHeader("Call-ID")); | ||||
responseRing.addHeader((CSeqHeader) this.requestEvent.getRequest().getHeader("Cseq")); | |||||
responseRing.addHeader((CSeqHeader) requestEvent.getRequest().getHeader("Cseq")); | |||||
responseRing.addHeader(contact); | responseRing.addHeader(contact); | ||||
responseRing.addHeader(headerFactory.createSupportedHeader("replace,path,timer")); | responseRing.addHeader(headerFactory.createSupportedHeader("replace,path,timer")); | ||||
responseRing.addHeader(this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE")); | |||||
responseRing.addHeader(this.headerFactory.createAllowEventsHeader("talk,hold,refer")); //für was wird er gebraucht | |||||
responseRing.addHeader(headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE")); | |||||
responseRing.addHeader(headerFactory.createAllowEventsHeader("talk,hold,refer")); //für was wird er gebraucht | |||||
lgRing.info("180-Ringing Header erstellt"); | lgRing.info("180-Ringing Header erstellt"); | ||||
} | } | ||||
catch (Exception ex) | catch (Exception ex) | ||||
lgRing.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); | lgRing.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); | ||||
} | } | ||||
} | } | ||||
public void start() | |||||
{ | |||||
callIncoming = true; | |||||
} | |||||
public void stop() | |||||
{ | |||||
callIncoming = false; | |||||
} | |||||
@Override | |||||
public void run() | |||||
{ | |||||
while (callIncoming) | |||||
{ | |||||
} | |||||
} | |||||
/** | /** | ||||
* @return the responseRing | * @return the responseRing | ||||
*/ | */ |
private static final Logger lg200Ok = OhmLogger.getLogger(); | private static final Logger lg200Ok = OhmLogger.getLogger(); | ||||
private RequestEvent requestEvent; | private RequestEvent requestEvent; | ||||
private HeaderFactory headerFactory; | private HeaderFactory headerFactory; | ||||
private ContactHeader contactHeader; | |||||
public SIP200Ok(MessageFactory messageFactory, RequestEvent requestEvent, | public SIP200Ok(MessageFactory messageFactory, RequestEvent requestEvent, | ||||
ContactHeader contactHeader, HeaderFactory headerFactory) | ContactHeader contactHeader, HeaderFactory headerFactory) | ||||
{ | { | ||||
this.requestEvent = requestEvent; | this.requestEvent = requestEvent; | ||||
this.headerFactory = headerFactory; | this.headerFactory = headerFactory; | ||||
this.contactHeader = contactHeader; | |||||
try | try | ||||
{ | { | ||||
response = messageFactory.createResponse(Response.OK, this.requestEvent.getRequest()); | response = messageFactory.createResponse(Response.OK, this.requestEvent.getRequest()); | ||||
response.addHeader((ViaHeader) this.requestEvent.getRequest().getHeader("Via")); | response.addHeader((ViaHeader) this.requestEvent.getRequest().getHeader("Via")); | ||||
System.out.println(this.requestEvent.getRequest().getHeader("Via")); | |||||
response.addHeader((FromHeader) this.requestEvent.getRequest().getHeader("From")); | response.addHeader((FromHeader) this.requestEvent.getRequest().getHeader("From")); | ||||
response.addHeader((ToHeader) this.requestEvent.getRequest().getHeader("To")); | response.addHeader((ToHeader) this.requestEvent.getRequest().getHeader("To")); | ||||
response.addHeader((CallIdHeader) this.requestEvent.getRequest().getHeader("Call-ID")); | response.addHeader((CallIdHeader) this.requestEvent.getRequest().getHeader("Call-ID")); | ||||
public void addSDP(SessionDescription sdp, String myTag) | public void addSDP(SessionDescription sdp, String myTag) | ||||
{ | { | ||||
try | try | ||||
{ | |||||
{ | |||||
response.removeHeader("To"); | response.removeHeader("To"); | ||||
ToHeader temptoring = (ToHeader) requestEvent.getRequest().getHeader("To"); | ToHeader temptoring = (ToHeader) requestEvent.getRequest().getHeader("To"); | ||||
temptoring.setTag(myTag); //evtl. besseren Tag | |||||
response.addHeader(temptoring); //evtl noch Ergänzungen | |||||
temptoring.setTag(myTag); | |||||
response.addHeader(temptoring); | |||||
SupportedHeader supp = this.headerFactory.createSupportedHeader("replace,path,timer");//nachschauen für was es gebraucht wird | SupportedHeader supp = this.headerFactory.createSupportedHeader("replace,path,timer");//nachschauen für was es gebraucht wird | ||||
response.addHeader(supp); | response.addHeader(supp); | ||||
ContentTypeHeader content = headerFactory.createContentTypeHeader("application", "sdp"); | ContentTypeHeader content = headerFactory.createContentTypeHeader("application", "sdp"); | ||||
response.addHeader(content); | response.addHeader(content); | ||||
response.setContent(sdp, content); | response.setContent(sdp, content); |
public SIPInvite(String sipaddresse, String proxyaddresse, String myIPAddress, | public SIPInvite(String sipaddresse, String proxyaddresse, String myIPAddress, | ||||
int myPort, | int myPort, | ||||
String myTag, int branch, CallIdHeader callID, long cSequenz, | |||||
AddressFactory addressFactory, SessionDescription sessionDescription, | |||||
HeaderFactory headerFactory, MessageFactory messageFactory, ContactHeader contactHeader) | |||||
String myTag, String branch, CallIdHeader callID, | |||||
long cSequenz, | |||||
AddressFactory addressFactory, | |||||
SessionDescription sessionDescription, | |||||
HeaderFactory headerFactory, MessageFactory messageFactory, | |||||
ContactHeader contactHeader) | |||||
{ | { | ||||
try | try | ||||
{ | { | ||||
Address addressto = addressFactory.createAddress("sip:" + sipaddresse + "@" + proxyaddresse); | Address addressto = addressFactory.createAddress("sip:" + sipaddresse + "@" + proxyaddresse); | ||||
ToHeader to = headerFactory.createToHeader(addressto, null); // Integer.toString(myTag) address + myTag | ToHeader to = headerFactory.createToHeader(addressto, null); // Integer.toString(myTag) address + myTag | ||||
URI requestURI = addressto.getURI(); | URI requestURI = addressto.getURI(); | ||||
FromHeader from = headerFactory.createFromHeader(addressto, String.valueOf(myTag)); //this.contactAddress | |||||
FromHeader from = headerFactory.createFromHeader(addressto, myTag); //this.contactAddress | |||||
ArrayList via = new ArrayList(); //Via needs a List as input | ArrayList via = new ArrayList(); //Via needs a List as input | ||||
ViaHeader viaheader = headerFactory.createViaHeader(myIPAddress, myPort, "UDP", String.valueOf(branch)); | |||||
ViaHeader viaheader = headerFactory.createViaHeader(myIPAddress, myPort, "UDP", branch); | |||||
via.add(viaheader); | via.add(viaheader); | ||||
CSeqHeader cSeq = headerFactory.createCSeqHeader(cSequenz, "INVITE"); | CSeqHeader cSeq = headerFactory.createCSeqHeader(cSequenz, "INVITE"); | ||||
MaxForwardsHeader maxForwards = headerFactory.createMaxForwardsHeader(70); | MaxForwardsHeader maxForwards = headerFactory.createMaxForwardsHeader(70); |
private static final Logger lgRegister = OhmLogger.getLogger(); | private static final Logger lgRegister = OhmLogger.getLogger(); | ||||
public SIPRegister(String proxyAddress, String myTag, String myIPAddress, int myPort, | public SIPRegister(String proxyAddress, String myTag, String myIPAddress, int myPort, | ||||
int branch, AddressFactory addressFactory, HeaderFactory headerFactory, | |||||
String branch, AddressFactory addressFactory, HeaderFactory headerFactory, | |||||
MessageFactory messageFactory, ContactHeader contactHeader, CallIdHeader callID) | MessageFactory messageFactory, ContactHeader contactHeader, CallIdHeader callID) | ||||
{ | { | ||||
try | try | ||||
URI requestURI = addressto.getURI(); | URI requestURI = addressto.getURI(); | ||||
FromHeader from = headerFactory.createFromHeader(addressto, myTag); //this.contactAddress | FromHeader from = headerFactory.createFromHeader(addressto, myTag); //this.contactAddress | ||||
ArrayList via = new ArrayList(); //Via needs a List as input | ArrayList via = new ArrayList(); //Via needs a List as input | ||||
ViaHeader viaheader = headerFactory.createViaHeader(myIPAddress, myPort, "UDP", String.valueOf(branch)); | |||||
ViaHeader viaheader = headerFactory.createViaHeader(myIPAddress, myPort, "UDP", branch); | |||||
via.add(viaheader); | via.add(viaheader); | ||||
CSeqHeader cSeq = headerFactory.createCSeqHeader(1L, "REGISTER"); | CSeqHeader cSeq = headerFactory.createCSeqHeader(1L, "REGISTER"); | ||||
MaxForwardsHeader maxForwards = headerFactory.createMaxForwardsHeader(70); | MaxForwardsHeader maxForwards = headerFactory.createMaxForwardsHeader(70); |
private SdpFactory sdpFactory; | private SdpFactory sdpFactory; | ||||
private SessionDescription sessionDescription; | private SessionDescription sessionDescription; | ||||
private Vector mediavec; | private Vector mediavec; | ||||
private String cods[]; //Hilfsarray für [RTP-Notation] | |||||
private String[][] codecs; //[RTP-Notation][Codec/SampelRate] | |||||
private String codsRTP[]; //[RTP-Notation] | |||||
private String codecs[]; //[Codec/SampelRate] | |||||
private static final Logger lgSessionDescription = OhmLogger.getLogger(); | private static final Logger lgSessionDescription = OhmLogger.getLogger(); | ||||
public SIPSessionDescription(String myName, String myIPAddress, | public SIPSessionDescription(String myName, String myIPAddress, | ||||
RequestEvent requestEvent, Boolean anfrage) | RequestEvent requestEvent, Boolean anfrage) | ||||
{ | { | ||||
//Hier alle unterstützen Codecs eintragen [RTP-Notation][Codec/SampelRate] | //Hier alle unterstützen Codecs eintragen [RTP-Notation][Codec/SampelRate] | ||||
codecs = new String[4][2]; | |||||
codecs[0][0] = "0"; | |||||
codecs[0][1] = "PCMU/8000"; | |||||
codecs[1][0] = "4"; | |||||
codecs[1][1] = "G723/8000"; | |||||
codecs[2][0] = "8"; | |||||
codecs[2][1] = "PCMA/8000"; | |||||
codecs[3][0] = "18"; | |||||
codecs[3][1] = "G729/8000"; | |||||
codsRTP = new String[4]; | |||||
codsRTP[0]= "0"; | |||||
codsRTP[1] ="4"; | |||||
codsRTP[2]= "8"; | |||||
codsRTP[3]= "18"; | |||||
cods = new String[codecs.length]; | |||||
for (int i = 0; i < 4; i++)//Übertragung der RTP-Values in neues Array | |||||
{ | |||||
cods[i] = codecs[i][0]; | |||||
} | |||||
codecs = new String[4]; | |||||
codecs[0] = "PCMU/8000"; | |||||
codecs[1] = "G723/8000"; | |||||
codecs[2]= "PCMA/8000"; | |||||
codecs[3]= "G729/8000"; | |||||
mediavec = new Vector(); | mediavec = new Vector(); | ||||
try | try | ||||
{ | { | ||||
sessionDescription.setSessionName(sdpFactory.createSessionName("SIP Call")); | sessionDescription.setSessionName(sdpFactory.createSessionName("SIP Call")); | ||||
sessionDescription.setConnection(sdpFactory.createConnection("IN", "IP4", myIPAddress)); | sessionDescription.setConnection(sdpFactory.createConnection("IN", "IP4", myIPAddress)); | ||||
//Media Body | |||||
//Media Bod | |||||
if (anfrage == true) | if (anfrage == true) | ||||
{ | { | ||||
mediavec.add(sdpFactory.createMediaDescription("audio", 6022, 1, "RTP/AVP", cods)); //(Übertragungstyp, Port, anzahl der Ports, Verbindungstyp,..) | |||||
mediavec.add(sdpFactory.createMediaDescription("audio", 6022, 1, "RTP/AVP", codsRTP)); //(Übertragungstyp, Port, anzahl der Ports, Verbindungstyp,..) | |||||
mediavec.add(sdpFactory.createAttribute("sendrecv", null)); | mediavec.add(sdpFactory.createAttribute("sendrecv", null)); | ||||
for (int i = 0; i == 4; i++) | |||||
for (int i = 0; i < codsRTP.length; i++) | |||||
{ | { | ||||
System.out.println("Codecs: " + codecs[i][0] + " " + codecs[i][1]); | |||||
mediavec.add(sdpFactory.createAttribute("rtpmap", codecs[i][0] + " " + codecs[i][1])); | |||||
mediavec.add(sdpFactory.createAttribute("rtpmap", codsRTP[i] + " " + codecs[i])); | |||||
} | } | ||||
} | } | ||||
else//Vergleich von eigenen Codecs mit Codecs der anruft -> Rückgabe entsprechend wählen | else//Vergleich von eigenen Codecs mit Codecs der anruft -> Rückgabe entsprechend wählen | ||||
reqSDP.add(req.replace("a=rtpmap:", "")); | reqSDP.add(req.replace("a=rtpmap:", "")); | ||||
} | } | ||||
} | } | ||||
boolean temp = true; //evtl noch was besseres da so erster Codec nicht bester verwendet wird | |||||
int position = 0; | int position = 0; | ||||
for (String stcodec : cods) | |||||
ArrayList<String> tempList = new ArrayList<>(); | |||||
for (String stcodec : codsRTP) | |||||
{ | { | ||||
System.out.println("------Auswahl des codecs----"); | |||||
if (reqSDP.contains(stcodec) && temp == true) | |||||
if (reqSDP.contains(stcodec)) | |||||
{ | { | ||||
String tempcodec[]= new String [1]; | |||||
tempcodec[0] = codecs[position][1]; | |||||
mediavec.add(sdpFactory.createMediaDescription("audio", 6022, 1, "RTP/AVP", tempcodec)); //(Übertragungstyp, Port, anzahl der Ports, Verbindungstyp,..) | |||||
mediavec.add(sdpFactory.createAttribute("sendrecv", null)); | |||||
mediavec.add(sdpFactory.createAttribute("rtpmap", codecs[position][0] + " " + codecs[position][1])); | |||||
temp = false; | |||||
tempList.add(stcodec); | |||||
mediavec.add(sdpFactory.createAttribute("rtpmap", codsRTP[position] + " " + codecs[position])); | |||||
} | } | ||||
position++; | position++; | ||||
} | } | ||||
String[] tempArray = tempList.toArray(new String[tempList.size()]); | |||||
mediavec.add(sdpFactory.createMediaDescription("audio", 6022, 1, "RTP/AVP", tempArray)); //(Übertragungstyp, Port, anzahl der Ports, Verbindungstyp,..) | |||||
mediavec.add(sdpFactory.createAttribute("sendrecv", null)); | |||||
} | } | ||||
sessionDescription.setAttributes(mediavec); | sessionDescription.setAttributes(mediavec); | ||||
lgSessionDescription.info("SDP Header erstellt"); | lgSessionDescription.info("SDP Header erstellt"); |
public SIPUnauthReq(String myName, String proxyAddress, String myTag, | public SIPUnauthReq(String myName, String proxyAddress, String myTag, | ||||
String myIPAddress, | String myIPAddress, | ||||
int branch, long cseq, int myPort, | |||||
String branch, long cseq, int myPort, | |||||
ContactHeader contactHeader, | ContactHeader contactHeader, | ||||
AddressFactory addressFactory, HeaderFactory headerFactory, | AddressFactory addressFactory, HeaderFactory headerFactory, | ||||
ResponseEvent responseEvent, MessageFactory messageFactory) | ResponseEvent responseEvent, MessageFactory messageFactory) | ||||
auth.setUsername(myName); | auth.setUsername(myName); | ||||
ArrayList via = new ArrayList(); //Via needs a List as input | ArrayList via = new ArrayList(); //Via needs a List as input | ||||
ViaHeader viaheader = headerFactory.createViaHeader(myIPAddress, myPort, "UDP", String.valueOf(branch + 2));// String.valueOf(hashCode())string branch | |||||
ViaHeader viaheader = headerFactory.createViaHeader(myIPAddress, myPort, "UDP", branch + 10);// String.valueOf(hashCode())string branch | |||||
via.add(viaheader); | via.add(viaheader); | ||||
CSeqHeader cSeq = headerFactory.createCSeqHeader(cseq, "REGISTER"); | CSeqHeader cSeq = headerFactory.createCSeqHeader(cseq, "REGISTER"); |
import gov.nist.javax.sip.SipListenerExt; | import gov.nist.javax.sip.SipListenerExt; | ||||
import gui.Hauptfenster; | import gui.Hauptfenster; | ||||
import java.net.InetAddress; | import java.net.InetAddress; | ||||
import java.security.SecureRandom; | |||||
import java.text.ParseException; | import java.text.ParseException; | ||||
import java.util.*; | import java.util.*; | ||||
import java.util.logging.Level; | import java.util.logging.Level; | ||||
*/ | */ | ||||
public class SIPmodel implements SipListenerExt | public class SIPmodel implements SipListenerExt | ||||
{ | { | ||||
private static final String TEST = "0123456789abcdefghijklmnopqrstuvwxyz";//für Random String | |||||
private static final SecureRandom RANDOM = new SecureRandom(); //für Random String | |||||
Hauptfenster view; //später entfernen wegen Zugriff | Hauptfenster view; //später entfernen wegen Zugriff | ||||
public static final Logger lg = OhmLogger.getLogger(); | public static final Logger lg = OhmLogger.getLogger(); | ||||
public SipFactory sipFactory; // Used to access the SIP API. | public SipFactory sipFactory; // Used to access the SIP API. | ||||
public String proxyAddress; | public String proxyAddress; | ||||
public CallIdHeader callID; | public CallIdHeader callID; | ||||
Boolean invite; //Bool für SDP falls ich anrufe | |||||
Boolean anrufer; //Hilfsvariable ob ich selbst anrufer bin | |||||
Boolean anrufAngenommen; | |||||
Boolean anrufCancel; | |||||
//Hilfsvariablen wenn ich angerufen werde. evtl. noch optimieren | //Hilfsvariablen wenn ich angerufen werde. evtl. noch optimieren | ||||
RequestEvent evtWerdeAngerufen; | |||||
Boolean werdeAngerufen; | Boolean werdeAngerufen; | ||||
private int countWerdeAngerufen; | |||||
private long cSequenz = 1; | |||||
private long cSequenz; | |||||
private String proxyTag; | private String proxyTag; | ||||
private String myTag = String.valueOf(new Random().nextInt()); | |||||
private int branch = Integer.valueOf(hashCode()); | |||||
private String myTag; | |||||
private String branch; | |||||
private String line; | |||||
private Address contactAddress; | private Address contactAddress; | ||||
private ContactHeader contactHeader; | private ContactHeader contactHeader; | ||||
public SIPmodel(Hauptfenster view) //Konstruktor für eigene Daten | public SIPmodel(Hauptfenster view) //Konstruktor für eigene Daten | ||||
{ | { | ||||
this.view = view; | this.view = view; | ||||
invite = true; | |||||
anrufer = false; | |||||
anrufAngenommen = false; | |||||
anrufCancel = false; | |||||
proxyAddress = ""; | proxyAddress = ""; | ||||
countWerdeAngerufen = 0; | |||||
evtWerdeAngerufen = null; | |||||
proxyTag = ""; | |||||
line = ""; | |||||
cSequenz = 1; | |||||
werdeAngerufen = false; | werdeAngerufen = false; | ||||
myTag = createString(8); //erzeugt Random Tag mit Länge 8 | |||||
branch = createString(18);//erzeugt Random branch mit Länge 18 | |||||
try | try | ||||
{ | { | ||||
//wird an sich erstmal nicht gebraucht aber später sinnvoll um eigene Daten zu initialisieren | //wird an sich erstmal nicht gebraucht aber später sinnvoll um eigene Daten zu initialisieren | ||||
String abc = InetAddress.getLocalHost().getHostAddress(); | |||||
this.myIPAddress = InetAddress.getLocalHost().getHostAddress(); | this.myIPAddress = InetAddress.getLocalHost().getHostAddress(); | ||||
this.sipFactory = SipFactory.getInstance(); | this.sipFactory = SipFactory.getInstance(); | ||||
this.sipFactory.setPathName("gov.nist"); | this.sipFactory.setPathName("gov.nist"); | ||||
this.listeningPoint = this.sipStack.createListeningPoint(this.myIPAddress, this.myPort, this.protocolTyp); | this.listeningPoint = this.sipStack.createListeningPoint(this.myIPAddress, this.myPort, this.protocolTyp); | ||||
this.sipProvider = this.sipStack.createSipProvider(this.listeningPoint); | this.sipProvider = this.sipStack.createSipProvider(this.listeningPoint); | ||||
this.sipProvider.addSipListener(this); | this.sipProvider.addSipListener(this); | ||||
this.contactAddress = this.addressFactory.createAddress("sip:" + myName + "@" + this.myIPAddress + ":" + this.myPort); | |||||
this.contactAddress = this.addressFactory.createAddress("sip:" + this.myName + "@" + this.myIPAddress + ":" + this.myPort); | |||||
this.contactHeader = this.headerFactory.createContactHeader(contactAddress); | this.contactHeader = this.headerFactory.createContactHeader(contactAddress); | ||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
System.exit(-1); | System.exit(-1); | ||||
} | } | ||||
} | } | ||||
public int hashCode() | |||||
private String createString(int anzahl) | |||||
{ | { | ||||
int temp = Integer.valueOf(myTag)* (new Random(100)).nextInt(); | |||||
return temp; | |||||
StringBuilder sb = new StringBuilder(); | |||||
for (int i = 0; i < anzahl; i++) | |||||
{ | |||||
sb.append(TEST.charAt(RANDOM.nextInt(TEST.length()))); | |||||
} | |||||
return sb.toString(); | |||||
} | } | ||||
public void sendRegister(String serverIP, int serverPort) throws ParseException, InvalidArgumentException, SipException | public void sendRegister(String serverIP, int serverPort) throws ParseException, InvalidArgumentException, SipException | ||||
{ | { | ||||
proxyAddress = serverIP + ":" + serverPort; | proxyAddress = serverIP + ":" + serverPort; | ||||
this.sipProvider.sendRequest(register.getRequest()); | this.sipProvider.sendRequest(register.getRequest()); | ||||
lg.info("Erfolgreiches Senden der Registrierung"); | lg.info("Erfolgreiches Senden der Registrierung"); | ||||
} | } | ||||
public void sendInvitation(String sipaddresse, String proxyaddresse, | public void sendInvitation(String sipaddresse, String proxyaddresse, | ||||
int serverPort) throws SipException | int serverPort) throws SipException | ||||
{ //ServerPort wird nicht verwendet? | { //ServerPort wird nicht verwendet? | ||||
invite = true; | |||||
resetCallParameter(); | |||||
anrufer = true; | |||||
callID = this.sipProvider.getNewCallId(); | callID = this.sipProvider.getNewCallId(); | ||||
SIPSessionDescription sdp = new SIPSessionDescription(myName, myIPAddress, evtWerdeAngerufen, true); | |||||
SIPSessionDescription sdp = new SIPSessionDescription(myName, myIPAddress, null, anrufer); | |||||
SIPInvite sipinvite = new SIPInvite(sipaddresse, proxyaddresse, myIPAddress, myPort, myTag, branch, callID, cSequenz, addressFactory, sdp.getSessionDescription(), headerFactory, messageFactory, contactHeader); | SIPInvite sipinvite = new SIPInvite(sipaddresse, proxyaddresse, myIPAddress, myPort, myTag, branch, callID, cSequenz, addressFactory, sdp.getSessionDescription(), headerFactory, messageFactory, contactHeader); | ||||
this.sipProvider.sendRequest(sipinvite.getInviterequest()); | this.sipProvider.sendRequest(sipinvite.getInviterequest()); | ||||
lg.info("Erfolgreiches Senden der Invitation"); | lg.info("Erfolgreiches Senden der Invitation"); | ||||
//Aktive Kommunikation | //Aktive Kommunikation | ||||
else if ((Request.INVITE).equals(requestEvent.getRequest().getMethod())) // Invite von anderem Benutzer | else if ((Request.INVITE).equals(requestEvent.getRequest().getMethod())) // Invite von anderem Benutzer | ||||
{ | { | ||||
resetCallParameter(); | |||||
anrufer = false; | |||||
//Falls Anruf ankommt, wichtige Variablen Zwischenspeichern (Branch, Cseq, CallID, proxyTag) | |||||
branch = ((ViaHeader) requestEvent.getRequest().getHeader("Via")).getBranch(); | |||||
cSequenz = ((CSeqHeader) requestEvent.getRequest().getHeader("Cseq")).getSeqNumber(); | |||||
proxyTag = ((FromHeader) requestEvent.getRequest().getHeader("From")).getTag(); | |||||
callID = ((CallIdHeader) requestEvent.getRequest().getHeader("CallID")); | |||||
//Standartabfolge sobald man angerufen wird | |||||
try | try | ||||
{ | { | ||||
this.sipProvider.sendResponse(create180Ringing(requestEvent)); | |||||
view.getTxtArea().append("Ringing geschickt\n"); | |||||
} | |||||
catch (Exception ex)//Exceptions evtl. genauer definieren | |||||
{ | |||||
lg.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); | |||||
} | |||||
countWerdeAngerufen++; //bessere Lösung muss her!!, was schickt andere User oder Proxy bei nicht erreichen | |||||
FromHeader abc = (FromHeader) requestEvent.getRequest().getHeader("From"); | |||||
//Trying Response erzeugen und abschicken | |||||
SIP100Trying tempTrying = new SIP100Trying(messageFactory, requestEvent, headerFactory); | |||||
sipProvider.sendResponse(tempTrying.getTryResponse()); | |||||
view.getTxtArea().append("Trying geschickt\n"); | |||||
lg.info("Trying ist raus"); | |||||
evtWerdeAngerufen = requestEvent; | |||||
System.out.println(countWerdeAngerufen); | |||||
if (countWerdeAngerufen < 7) | |||||
{ | |||||
werdeAngerufen = true; | |||||
lg.info("Hab Invitation bekommen"); | |||||
view.getTxtArea().append("Werde von " + abc.getAddress() + " angerufen\n"); | |||||
//Ringing Response erzeugen und abschicken noch Schleife mit "Anruf annehmen" | |||||
SIP180Ringing tempRinging = new SIP180Ringing(requestEvent, myTag, contactHeader, headerFactory, messageFactory); | |||||
Timer timer = new Timer(); | |||||
timer.scheduleAtFixedRate(new TimerTask() | |||||
{ | |||||
@Override | |||||
public void run() | |||||
{ | |||||
try | |||||
{ | |||||
if (anrufAngenommen != true) | |||||
{ | |||||
sipProvider.sendResponse(tempRinging.getResponseRing()); | |||||
} | |||||
else if(anrufAngenommen==true) | |||||
{ | |||||
SIP200Ok respcall = new SIP200Ok(messageFactory, requestEvent, contactHeader, headerFactory); | |||||
SIPSessionDescription sdp = new SIPSessionDescription(myName, myIPAddress, requestEvent, anrufer); | |||||
respcall.addSDP(sdp.getSessionDescription(), myTag); | |||||
sipProvider.sendResponse(respcall.getResponse()); | |||||
view.getTxtArea().append("Telefonat beginnt\n"); | |||||
timer.cancel(); | |||||
} | |||||
} | |||||
catch (SipException ex) | |||||
{ | |||||
} | |||||
} | |||||
}, 0, 1000); | |||||
} | } | ||||
else | |||||
catch (SipException ex) | |||||
{ | { | ||||
werdeAngerufen = false; | |||||
lg.info("Leider waren Sie nicht erreichbar"); | |||||
view.getTxtArea().append("Sie waren nicht erreichbar\n"); | |||||
countWerdeAngerufen = 0; | |||||
lg.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); | |||||
} | } | ||||
} | } | ||||
{ | { | ||||
//Cancel Request -> Response 200 Ok + Response 487 Request Terminated | //Cancel Request -> Response 200 Ok + Response 487 Request Terminated | ||||
//200 Ok | //200 Ok | ||||
werdeAngerufen = false; | |||||
evtWerdeAngerufen = null; // sicher ist sicher | |||||
anrufCancel = true; | |||||
SIP200Ok tempOk = new SIP200Ok(messageFactory, requestEvent, contactHeader, headerFactory); | SIP200Ok tempOk = new SIP200Ok(messageFactory, requestEvent, contactHeader, headerFactory); | ||||
this.sipProvider.sendResponse(tempOk.getResponse()); | this.sipProvider.sendResponse(tempOk.getResponse()); | ||||
view.getTxtArea().append("Anrufender canceld Anfrage\n"); | view.getTxtArea().append("Anrufender canceld Anfrage\n"); | ||||
SIP200Ok tempOk = new SIP200Ok(messageFactory, requestEvent, contactHeader, headerFactory); | SIP200Ok tempOk = new SIP200Ok(messageFactory, requestEvent, contactHeader, headerFactory); | ||||
this.sipProvider.sendResponse(tempOk.getResponse()); | this.sipProvider.sendResponse(tempOk.getResponse()); | ||||
} | } | ||||
catch (Exception ex) | |||||
catch (SipException ex) | |||||
{ | { | ||||
Logger.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
{ | { | ||||
lg.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); | lg.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); | ||||
} | } | ||||
} | } | ||||
else if (responseEvent.getResponse().getStatusCode() == Response.OK) | else if (responseEvent.getResponse().getStatusCode() == Response.OK) | ||||
{ | { | ||||
{ | { | ||||
ToHeader temp = (ToHeader) responseEvent.getResponse().getHeader("To"); | ToHeader temp = (ToHeader) responseEvent.getResponse().getHeader("To"); | ||||
proxyTag = temp.getTag(); | proxyTag = temp.getTag(); | ||||
} | |||||
} | |||||
public Response create180Ringing(RequestEvent requestEvent) throws ParseException, SipException | |||||
{ | |||||
Response responsering = this.messageFactory.createResponse(180, requestEvent.getRequest()); | |||||
responsering.addHeader((ViaHeader) requestEvent.getRequest().getHeader("Via")); | |||||
responsering.addHeader((FromHeader) requestEvent.getRequest().getHeader("From")); | |||||
AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE"); | |||||
//Bei Ringing muss persönlicher Tag ergänzt werden | |||||
ToHeader temptoring = (ToHeader) requestEvent.getRequest().getHeader("To"); | |||||
proxyTag = temptoring.getTag(); | |||||
temptoring.setTag(this.myTag); | |||||
responsering.addHeader(temptoring); | |||||
cSequenz = ((CSeqHeader) requestEvent.getRequest().getHeader("Cseq")).getSeqNumber(); | |||||
responsering.addHeader((CSeqHeader) requestEvent.getRequest().getHeader("Cseq")); | |||||
responsering.addHeader(contactHeader); | |||||
responsering.addHeader(allow); | |||||
AllowEventsHeader allowevent = this.headerFactory.createAllowEventsHeader("talk,hold,refer,call-info");// für was gebraucht | |||||
responsering.addHeader(allowevent); | |||||
return responsering; | |||||
} | |||||
public void annehmen() //Fehlende Bedingung | |||||
{ | |||||
RequestEvent requestEvent; | |||||
if ((requestEvent = evtWerdeAngerufen) != null && werdeAngerufen == true) | |||||
{ | |||||
countWerdeAngerufen = 0; | |||||
try | |||||
{ | |||||
//Werte für weitere Kommunikation abspeichern | |||||
callID = (CallIdHeader) requestEvent.getRequest().getHeader("Call-ID"); | |||||
CSeqHeader tempCs = (CSeqHeader) requestEvent.getRequest().getHeader("Cseq"); | |||||
cSequenz = tempCs.getSeqNumber(); | |||||
FromHeader tempFrom = (FromHeader) requestEvent.getRequest().getHeader("From"); | |||||
proxyTag = tempFrom.getTag(); | |||||
//Trying Header erzeugen und abschicken | |||||
SIP100Trying tempTrying = new SIP100Trying(messageFactory, requestEvent, headerFactory); | |||||
this.sipProvider.sendResponse(tempTrying.getTryResponse()); | |||||
view.getTxtArea().append("Trying geschickt\n"); | |||||
lg.info("Trying ist raus"); | |||||
//Ringing Header erzeugen und abschicken From tag: proxyTag; To Tag: persönlicher Tag | |||||
SIP180Ringing tempRinging = new SIP180Ringing(requestEvent, myTag, proxyTag, contactHeader, headerFactory); | |||||
sipProvider.sendResponse(tempRinging.getResponseRing()); | |||||
view.getTxtArea().append("Ringing geschickt\n"); | |||||
//200OK Header mit Session Description erstellen | |||||
invite = false; | |||||
SIP200Ok respcall = new SIP200Ok(messageFactory, requestEvent, contactHeader, headerFactory); | |||||
SIPSessionDescription sdp = new SIPSessionDescription(myName, myIPAddress, requestEvent, false); | |||||
respcall.addSDP(sdp.getSessionDescription(), myTag); | |||||
System.out.println(respcall.getResponse()); | |||||
this.sipProvider.sendResponse(respcall.getResponse()); | |||||
view.getTxtArea().append("Telefonat beginnt\n"); | |||||
evtWerdeAngerufen = null; | |||||
} | |||||
catch (SipException ex) | |||||
{ | |||||
Logger.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
view.getTxtArea().append("Zur Zeit gibt es keinen Anruf\n"); | |||||
} | } | ||||
} | } | ||||
public void byecall(String calluser) throws ParseException, InvalidArgumentException, SipException | public void byecall(String calluser) throws ParseException, InvalidArgumentException, SipException | ||||
{ | { | ||||
invite = false; | |||||
Address addressLine = this.addressFactory.createAddress("sip:" + calluser + "@" + proxyAddress); | Address addressLine = this.addressFactory.createAddress("sip:" + calluser + "@" + proxyAddress); | ||||
URI requestURI = addressLine.getURI(); | URI requestURI = addressLine.getURI(); | ||||
request.addHeader(allow); | request.addHeader(allow); | ||||
request.addHeader(expire); | request.addHeader(expire); | ||||
this.sipProvider.sendRequest(request); | this.sipProvider.sendRequest(request); | ||||
invite = false; | |||||
lg.info("Erfolgreiches Senden des BYE Headers"); | lg.info("Erfolgreiches Senden des BYE Headers"); | ||||
} | } | ||||
public void resetCallParameter() | |||||
{ | |||||
anrufAngenommen = false; | |||||
anrufer = false; | |||||
} | |||||
public void anrufAnnehmen() | |||||
{ | |||||
anrufAngenommen = true; | |||||
} | |||||
//Get Methoden falls man mal die Parameter braucht | //Get Methoden falls man mal die Parameter braucht | ||||
public String getmyName() | public String getmyName() | ||||
{ | { | ||||
/** | /** | ||||
* @return the branch | * @return the branch | ||||
*/ | */ | ||||
public int getBranch() | |||||
public String getBranch() | |||||
{ | { | ||||
return branch; | return branch; | ||||
} | } |