requestURI = sipManCallback.addressFactory.createSipURI(null,
registrarAddress);
}
catch (ParseException ex) {
throw new CommunicationsException("Bad registrar address:"
+ registrarAddress, ex);
}
catch (NullPointerException ex) {
// Do not throw an exc, we should rather silently notify the
// user
// throw new CommunicationsException("A registrar address was
// not specified!", ex);
sipManCallback.fireUnregistered(fromAddress.getURI().toString()
+ " (registrar not specified)");
return;
}
requestURI.setPort(registrarPort);
try {
requestURI.setTransportParam(registrarTransport);
}
catch (ParseException ex) {
throw new CommunicationsException(registrarTransport
+ " is not a valid transport!", ex);
}
// Call ID Header
CallIdHeader callIdHeader = sipManCallback.sipProvider
.getNewCallId();
// CSeq Header
CSeqHeader cSeqHeader = null;
try {
cSeqHeader = sipManCallback.headerFactory.createCSeqHeader(1,
Request.REGISTER);
}
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(SIPConfig.getStackName());
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 viaHeaders = sipManCallback.getLocalViaHeaders();
// MaxForwardsHeader
MaxForwardsHeader maxForwardsHeader = sipManCallback
.getMaxForwardsHeader();
// Request
Request request = null;
try {
request = sipManCallback.messageFactory.createRequest(
requestURI, Request.REGISTER, callIdHeader, cSeqHeader,
fromHeader, toHeader, viaHeaders, maxForwardsHeader);
request.setHeader(uaHeader);
}
catch (ParseException ex) {
// throw was missing - reported by Eero Vaarnas
throw new CommunicationsException(
"Could not create the register request!", ex);
}
// Expires Header
ExpiresHeader expHeader = null;
for (int retry = 0; retry < 2; retry++) {
try {
expHeader = sipManCallback.headerFactory
.createExpiresHeader(expires);
}
catch (InvalidArgumentException ex) {
if (retry == 0) {
expires = 3600;
continue;
}
throw new CommunicationsException(
"Invalid registrations expiration parameter - "
+ expires, ex);
}
}
request.addHeader(expHeader);
// Contact Header should contain IP - bug report - Eero Vaarnas
ContactHeader contactHeader = sipManCallback
.getRegistrationContactHeader();
request.addHeader(contactHeader);
// Transaction
ClientTransaction regTrans = null;
try {
regTrans = sipManCallback.sipProvider
.getNewClientTransaction(request);
}
catch (TransactionUnavailableException ex) {
// throw was missing - reported by Eero Vaarnas
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);
}
this.registerRequest = request;
}
catch (Exception e) {