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 + -
显示快捷键?