registerprocessing.java
来自「java 开发的sip软电话 源码 jain sip」· Java 代码 · 共 657 行 · 第 1/2 页
JAVA
657 行
//Should never happen
}
//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(SoftPhonePlugin.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.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;
}
finally
{
}
}
/**
* Synchronize because of timer tasks
* @throws CommunicationsException
*/
synchronized void unregister() throws CommunicationsException
{
try
{
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.setSequenceNumber(cSeqHeader.getSequenceNumber()+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 {
unregisterTransaction.sendRequest();
sipManCallback.fireUnregistering(sipManCallback.currentlyUsedURI);
}
catch (SipException ex) {
throw new CommunicationsException(
"Failed to send unregister request", ex);
}
}
finally
{
}
}
public void cancelSchedules(){
if(reRegisterTimer!=null)
reRegisterTimer.cancel();
if(keepAliveTimer!=null)
keepAliveTimer.cancel();
reRegisterTimer=null;
keepAliveTimer=null;
}
boolean isRegistered()
{
return isRegistered;
}
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 {
try {
if(isRegistered())
register(registrarAddress, registrarPort, transport,
expires);
}
catch (CommunicationsException ex) {
sipManCallback.fireCommunicationsError(
new CommunicationsException("Failed to reRegister", ex)
);
}
}
finally {
}
}
}
private class KeepAliveTask
extends TimerTask
{
private int sec=0;
public KeepAliveTask(int s){
sec=s;
System.out.println("NEW ONE");
}
public void run(){
try{
if(SoftPhonePlugin.getStatus().equals(GuiManager.REGISTERED)){
try{
sipManCallback.messageProcessing.sendKeepAlive();//.sendMessage("","0".getBytes(),"text/plain",null);
}catch(Exception e){
System.out.println("KEEP ERROR:" + e.toString());
}
}
}finally{
try{
this.finalize();
}catch(Throwable e){
}
}
//System.out.println("KEEP SENT");
}
}
private void cancelPendingRegistrations()
{
try {
if(reRegisterTimer!=null)
reRegisterTimer.cancel();
if(keepAliveTimer!=null)
keepAliveTimer.cancel();
reRegisterTimer = null;
keepAliveTimer = null;
//reRegisterTimer = new Timer();
//keepAliveTimer = new Timer();
}catch(Exception e){
System.out.println("ERRO CANCEL:" + e);
}finally {
}
}
private void scheduleKeepAlive(int sec){
keepAlivePort=0;
KeepAliveTask kat = new KeepAliveTask(sec);
if(keepAliveTimer!=null)
keepAliveTimer.schedule(kat,sec*1000,sec*1000);
System.out.println("KEEP Schedule");
}
private void scheduleReRegistration(String registrarAddress,
int registrarPort,
String registrarTransport, int expires)
{
try
{
//THIAGO Forces reRegister
// System.out.println("\n\n\n\n\n\n"+expires+"\n\n\n\n\n\n");
// expires=60;
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);
}
finally
{
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?