use of javax.sip.header.ContactHeader in project Spark by igniterealtime.
the class RegisterProcessing method subscribe.
/**
* Synchronize because of timer tasks
*
* @throws CommunicationsException
*/
synchronized void subscribe(String registrarAddress, int registrarPort, String registrarTransport) throws CommunicationsException {
FromHeader fromHeader = sipManCallback.getFromHeader(true);
Address fromAddress = fromHeader.getAddress();
// Request URI
URI requestURI = null;
try {
requestURI = sipManCallback.addressFactory.createSipURI(sipManCallback.getCurrentUsername(), registrarAddress);
} catch (ParseException e) {
Log.error(e);
}
// Call ID Header
CallIdHeader callIdHeader = sipManCallback.sipProvider.getNewCallId();
// CSeq Header
CSeqHeader cSeqHeader = null;
try {
cSeqHeader = sipManCallback.headerFactory.createCSeqHeader((long) 1, Request.SUBSCRIBE);
} catch (ParseException ex) {
// Should never happen
Log.error("register", ex);
} catch (InvalidArgumentException ex) {
// Should never happen
Log.error("register", ex);
}
// To Header
ToHeader toHeader = null;
try {
toHeader = sipManCallback.headerFactory.createToHeader(fromAddress, null);
} catch (ParseException ex) {
// throw was missing - reported by Eero Vaarnas
throw new CommunicationsException("Could not create a To header " + "for address:" + fromHeader.getAddress(), ex);
}
// User Agent Header
UserAgentHeader uaHeader = null;
ArrayList<String> userAgentList = new ArrayList<String>();
userAgentList.add(SoftPhoneManager.userAgent);
try {
uaHeader = sipManCallback.headerFactory.createUserAgentHeader(userAgentList);
} catch (ParseException ex) {
// throw was missing - reported by Eero Vaarnas
throw new CommunicationsException("Could not create a To header " + "for address:" + fromHeader.getAddress(), ex);
}
// Via Headers
ArrayList<ViaHeader> viaHeaders = sipManCallback.getLocalViaHeaders();
// MaxForwardsHeader
MaxForwardsHeader maxForwardsHeader = sipManCallback.getMaxForwardsHeader();
// Request
Request request = null;
try {
request = sipManCallback.messageFactory.createRequest(requestURI, Request.SUBSCRIBE, callIdHeader, cSeqHeader, fromHeader, toHeader, viaHeaders, maxForwardsHeader);
request.setHeader(uaHeader);
} catch (ParseException ex) {
throw new CommunicationsException("Could not create the register request!", ex);
}
// Expires Header
ExpiresHeader expHeader = null;
try {
expHeader = sipManCallback.headerFactory.createExpiresHeader(3000);
} catch (InvalidArgumentException ex) {
}
request.addHeader(expHeader);
try {
EventHeader event = sipManCallback.headerFactory.createEventHeader("message-summary");
request.addHeader(event);
} catch (ParseException e) {
Log.error(e);
}
// Contact Header should contain IP - bug report - Eero Vaarnas
ContactHeader contactHeader = sipManCallback.getRegistrationContactHeader();
request.addHeader(contactHeader);
AllowHeader allow = null;
try {
allow = sipManCallback.headerFactory.createAllowHeader("INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO");
request.addHeader(allow);
} catch (ParseException e) {
Log.error(e);
}
// Transaction
ClientTransaction regTrans = null;
try {
regTrans = sipManCallback.sipProvider.getNewClientTransaction(request);
} catch (TransactionUnavailableException ex) {
throw new CommunicationsException("Could not create a register transaction!\n" + "Check that the Registrar address is correct!");
}
try {
regTrans.sendRequest();
}// we sometimes get a null pointer exception here so catch them all
catch (Exception ex) {
// throw was missing - reported by Eero Vaarnas
throw new CommunicationsException("Could not send out the register request!", ex);
}
}
use of javax.sip.header.ContactHeader in project Spark by igniterealtime.
the class SipManager method processRequest.
// error occurred
// ============================= SIP LISTENER METHODS ==============================
public void processRequest(RequestEvent requestReceivedEvent) {
Log.debug(requestReceivedEvent.getRequest().toString());
ServerTransaction serverTransaction = requestReceivedEvent.getServerTransaction();
Request request = requestReceivedEvent.getRequest();
if (serverTransaction == null) {
try {
serverTransaction = sipProvider.getNewServerTransaction(request);
} catch (TransactionAlreadyExistsException ex) {
return;
} catch (TransactionUnavailableException ex) {
return;
}
}
Dialog dialog = serverTransaction.getDialog();
if (request.getMethod().equals(Request.NOTIFY)) {
Response ok = null;
try {
ok = messageFactory.createResponse(Response.OK, request);
} catch (ParseException ex) {
ex.printStackTrace();
}
ContactHeader contactHeader = null;
try {
contactHeader = getContactHeader();
ok.addHeader(contactHeader);
attachToTag(ok, dialog);
System.err.println(ok.toString());
serverTransaction.sendResponse(ok);
} catch (CommunicationsException e) {
e.printStackTrace();
} catch (InvalidArgumentException e) {
e.printStackTrace();
} catch (SipException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
fireMessageReceived(request);
return;
}
// TODO REMOVE
@SuppressWarnings("unused") Request requestClone = (Request) request.clone();
// INVITE
if (request.getMethod().equals(Request.INVITE)) {
if (serverTransaction.getDialog().getState() == null) {
callProcessing.processInvite(serverTransaction, request);
} else {
callProcessing.processReInvite(serverTransaction, request);
}
} else // ACK
if (request.getMethod().equals(Request.ACK)) {
if (serverTransaction != null && serverTransaction.getDialog().getFirstTransaction().getRequest().getMethod().equals(Request.INVITE)) {
callProcessing.processAck(serverTransaction, request);
} else {
// just ignore
}
} else // BYE
if (request.getMethod().equals(Request.BYE)) {
if (dialog.getFirstTransaction().getRequest().getMethod().equals(Request.INVITE) || dialog.getFirstTransaction().getRequest().getMethod().equals(Request.REFER)) {
callProcessing.processBye(serverTransaction, request);
}
} else // CANCEL
if (request.getMethod().equals(Request.CANCEL)) {
if (dialog.getFirstTransaction().getRequest().getMethod().equals(Request.INVITE)) {
callProcessing.processCancel(serverTransaction, request);
} else {
sendNotImplemented(serverTransaction, request);
fireUnknownMessageReceived(requestReceivedEvent.getRequest());
}
} else // REFER
if (request.getMethod().equals(Request.REFER)) {
transferProcessing.processRefer(serverTransaction, request);
} else if (request.getMethod().equals(Request.INFO)) {
/**
* @todo add proper request handling
*/
fireMessageReceived(request);
} else if (request.getMethod().equals(Request.MESSAGE)) {
messageProcessing.processMessageRequest(serverTransaction, request);
fireMessageReceived(request);
} else if (request.getMethod().equals(Request.OPTIONS)) {
/**
* @todo add proper request handling
*/
sendNotImplemented(serverTransaction, request);
fireUnknownMessageReceived(requestReceivedEvent.getRequest());
} else if (request.getMethod().equals(Request.PRACK)) {
/**
* @todo add proper request handling
*/
sendNotImplemented(serverTransaction, request);
fireUnknownMessageReceived(requestReceivedEvent.getRequest());
} else if (request.getMethod().equals(Request.REGISTER)) {
/**
* @todo add proper request handling
*/
sendNotImplemented(serverTransaction, request);
fireUnknownMessageReceived(requestReceivedEvent.getRequest());
} else if (request.getMethod().equals(Request.SUBSCRIBE)) {
} else if (request.getMethod().equals(Request.UPDATE)) {
/**
* @todo add proper request handling
*/
sendNotImplemented(serverTransaction, request);
fireUnknownMessageReceived(requestReceivedEvent.getRequest());
} else if (request.getMethod().equals(Request.INFO)) {
sendNotImplemented(serverTransaction, request);
fireUnknownMessageReceived(requestReceivedEvent.getRequest());
} else {
// We couldn't recognise the message
sendNotImplemented(serverTransaction, request);
fireUnknownMessageReceived(requestReceivedEvent.getRequest());
}
}
use of javax.sip.header.ContactHeader in project Spark by igniterealtime.
the class CallProcessing method sayOK.
// busy here
// ------------------ say ok
public void sayOK(int callID, String sdpContent) throws CommunicationsException {
Call call = callDispatcher.getCall(callID);
if (call == null) {
throw new CommunicationsException("Failed to find call with id=" + callID);
}
if (!call.isIncoming())
return;
Dialog dialog = call.getDialog();
if (dialog == null) {
call.setState(Call.DISCONNECTED);
throw new CommunicationsException("Failed to extract call's associated dialog! Ending Call!");
}
Transaction transaction = dialog.getFirstTransaction();
if (transaction == null || !dialog.isServer()) {
call.setState(Call.DISCONNECTED);
throw new CommunicationsException("Failed to extract a ServerTransaction " + "from the call's associated dialog!");
}
ServerTransaction serverTransaction = (ServerTransaction) transaction;
Response ok = null;
try {
ok = sipManCallback.messageFactory.createResponse(Response.OK, dialog.getFirstTransaction().getRequest());
sipManCallback.attachToTag(ok, dialog);
} catch (ParseException ex) {
call.setState(Call.DISCONNECTED);
throw new CommunicationsException("Failed to construct an OK response to an INVITE request", ex);
}
// Content
ContentTypeHeader contentTypeHeader = null;
try {
// content type should be application/sdp (not applications)
// reported by Oleg Shevchenko (Miratech)
contentTypeHeader = sipManCallback.headerFactory.createContentTypeHeader("application", "sdp");
} catch (ParseException ex) {
// Shouldn't happen
call.setState(Call.DISCONNECTED);
throw new CommunicationsException("Failed to create a content type header for the OK request", ex);
}
try {
ok.setContent(sdpContent, contentTypeHeader);
} catch (NullPointerException ex) {
call.setState(Call.DISCONNECTED);
throw new CommunicationsException("No sdp data was provided for the ok response to an INVITE request!", ex);
} catch (ParseException ex) {
call.setState(Call.DISCONNECTED);
throw new CommunicationsException("Failed to parse sdp data while creating invite request!", ex);
}
// and should probably be removed
if (((ToHeader) ok.getHeader(ToHeader.NAME)).getTag() == null) {
try {
((ToHeader) ok.getHeader(ToHeader.NAME)).setTag(Integer.toString(dialog.hashCode()));
} catch (ParseException ex) {
call.setState(Call.DISCONNECTED);
throw new CommunicationsException("Unable to set to tag", ex);
}
}
ContactHeader contactHeader = sipManCallback.getContactHeader();
ok.addHeader(contactHeader);
try {
serverTransaction.sendResponse(ok);
} catch (SipException ex) {
call.setState(Call.DISCONNECTED);
throw new CommunicationsException("Failed to send an OK response to an INVITE request", ex);
} catch (InvalidArgumentException e) {
call.setState(Call.DISCONNECTED);
sipManCallback.fireCommunicationsError(new CommunicationsException("Failed to send a NOT_FOUND response to an INVITE request!", e));
}
}
use of javax.sip.header.ContactHeader in project jain-sip.ha by RestComm.
the class SIPDialogCacheData method updateDialogMetaData.
/**
* Update the haSipDialog passed in param with the dialogMetaData and app meta data
* @param dialogMetaData
* @param dialogAppData
* @param haSipDialog
* @throws ParseException
* @throws PeerUnavailableException
*/
private void updateDialogMetaData(Map<String, Object> dialogMetaData, Object dialogAppData, HASipDialog haSipDialog, boolean recreation) throws ParseException, PeerUnavailableException {
haSipDialog.setMetaDataToReplicate(dialogMetaData, recreation);
haSipDialog.setApplicationDataToReplicate(dialogAppData);
final String contactStringified = (String) dialogMetaData.get(AbstractHASipDialog.CONTACT_HEADER);
if (clusteredlogger.isLoggingEnabled(StackLogger.TRACE_DEBUG)) {
clusteredlogger.logDebug("contactStringified " + contactStringified);
}
if (contactStringified != null) {
Address contactAddress = SipFactory.getInstance().createAddressFactory().createAddress(contactStringified);
ContactHeader contactHeader = SipFactory.getInstance().createHeaderFactory().createContactHeader(contactAddress);
if (clusteredlogger.isLoggingEnabled(StackLogger.TRACE_DEBUG)) {
clusteredlogger.logDebug("contactHeader " + contactHeader);
clusteredlogger.logDebug("contactURI " + contactHeader.getAddress().getURI());
}
haSipDialog.setContactHeader(contactHeader);
}
}
use of javax.sip.header.ContactHeader in project jain-sip.ha by RestComm.
the class SIPDialogCacheData method updateDialogMetaData.
/**
* Update the haSipDialog passed in param with the dialogMetaData and app meta data
* @param dialogMetaData
* @param dialogAppData
* @param haSipDialog
* @throws ParseException
* @throws PeerUnavailableException
*/
private void updateDialogMetaData(Map<String, Object> dialogMetaData, Object dialogAppData, HASipDialog haSipDialog, boolean recreation) throws ParseException, PeerUnavailableException {
haSipDialog.setMetaDataToReplicate(dialogMetaData, recreation);
haSipDialog.setApplicationDataToReplicate(dialogAppData);
final String contactStringified = (String) dialogMetaData.get(AbstractHASipDialog.CONTACT_HEADER);
if (clusteredlogger.isLoggingEnabled(StackLogger.TRACE_DEBUG)) {
clusteredlogger.logDebug("contactStringified " + contactStringified);
}
if (contactStringified != null) {
Address contactAddress = SipFactory.getInstance().createAddressFactory().createAddress(contactStringified);
ContactHeader contactHeader = SipFactory.getInstance().createHeaderFactory().createContactHeader(contactAddress);
if (clusteredlogger.isLoggingEnabled(StackLogger.TRACE_DEBUG)) {
clusteredlogger.logDebug("contactHeader " + contactHeader);
clusteredlogger.logDebug("contactURI " + contactHeader.getAddress().getURI());
}
haSipDialog.setContactHeader(contactHeader);
}
}
Aggregations