📄 registerprocessing.java
字号:
sipManCallback.fireRegistrationFailed(registrarAddress == null ? "" : registrarAddress, RegistrationEvent.Type.TimeOut);
}
}
/**
* Synchronize because of timer tasks
*
* @throws CommunicationsException
*/
synchronized void unregister() throws CommunicationsException {
try {
Log.debug("UNREGISTER");
if (!isRegistered) {
return;
}
cancelPendingRegistrations();
isRegistered = false;
isUnregistering = true;
Request registerRequest = getRegisterRequest();
if (this.registerRequest == null) {
throw new CommunicationsException(
"Couldn't find the initial register request");
}
Request unregisterRequest = (Request) registerRequest.clone();
try {
unregisterRequest.getExpires().setExpires(0);
CSeqHeader cSeqHeader = (CSeqHeader) unregisterRequest
.getHeader(CSeqHeader.NAME);
// [issue 1] - increment registration cseq number
// reported by - Roberto Tealdi <roby.tea@tin.it>
cSeqHeader
.setSeqNumber(cSeqHeader.getSeqNumber() + 1);
}
catch (InvalidArgumentException ex) {
// Shouldn't happen
throw new CommunicationsException(
"Unable to set Expires Header", ex);
}
ClientTransaction unregisterTransaction = null;
try {
unregisterTransaction = sipManCallback.sipProvider
.getNewClientTransaction(unregisterRequest);
}
catch (TransactionUnavailableException ex) {
throw new CommunicationsException(
"Unable to create a unregister transaction", ex);
}
try {
sipManCallback
.fireUnregistering(sipManCallback.currentlyUsedURI);
unregisterTransaction.sendRequest();
}
catch (SipException ex) {
throw new CommunicationsException(
"Failed to send unregister request", ex);
}
}
catch (Exception e) {
Log.error("unregister", e);
}
}
/**
* 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 userAgentList = new ArrayList();
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 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);
}
this.registerRequest = request;
}
public void cancelSchedules() {
if (reRegisterTimer != null)
reRegisterTimer.cancel();
if (keepAliveTimer != null)
keepAliveTimer.cancel();
reRegisterTimer = null;
keepAliveTimer = null;
}
/**
* @return
*/
boolean isRegistered() {
return isRegistered;
}
/**
* @return Returns the registerRequest.
*/
private Request getRegisterRequest() {
return registerRequest;
}
private class ReRegisterTask extends TimerTask {
String registrarAddress = null;
int registrarPort = -1;
String transport = null;
int expires = 0;
public ReRegisterTask(String registrarAddress, int registrarPort,
String registrarTransport, int expires) {
this.registrarAddress = registrarAddress;
this.registrarPort = registrarPort;
// don't do this.transport = transport ;)
// bug report and fix by Willem Romijn (romijn at lucent.com)
this.transport = registrarTransport;
this.expires = expires;
}
public void run() {
try {
if (isRegistered())
register(registrarAddress, registrarPort, transport,
expires);
}
catch (CommunicationsException ex) {
sipManCallback
.fireCommunicationsError(new CommunicationsException(
"Failed to reRegister", ex));
}
}
}
private class KeepAliveTask extends TimerTask {
private int sec = 0;
public KeepAliveTask(int s) {
sec = s;
}
public void run() {
try {
if (sipManCallback.isRegistered()) {
try {
sipManCallback.messageProcessing.sendKeepAlive();// .sendMessage("","0".getBytes(),"text/plain",null);
}
catch (Exception e) {
Log.error("KeepAliveTask", e);
}
}
}
finally {
try {
this.finalize();
}
catch (Throwable e) {
}
}
}
}
private void cancelPendingRegistrations() {
try {
if (reRegisterTimer != null)
reRegisterTimer.cancel();
if (keepAliveTimer != null)
keepAliveTimer.cancel();
reRegisterTimer = null;
keepAliveTimer = null;
}
catch (Exception e) {
Log.error("cancelPendingRegistrations", e);
}
}
private void scheduleKeepAlive(int sec) {
KeepAliveTask kat = new KeepAliveTask(sec);
if (keepAliveTimer != null)
keepAliveTimer.schedule(kat, sec * 1000, sec * 1000);
}
private void scheduleReRegistration(String registrarAddress,
int registrarPort, String registrarTransport, int expires) {
ReRegisterTask reRegisterTask = new ReRegisterTask(
registrarAddress, registrarPort, registrarTransport,
expires);
// java.util.Timer thinks in miliseconds
// bug report and fix by Willem Romijn (romijn at lucent.com)
// We keep a margin of 10% when sending re-registrations (1000
// becomes 900)
expires = expires * 900;
reRegisterTimer.schedule(reRegisterTask, expires);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -