⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 siptransaction.java

📁 Java SIP
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    {	laststatus = stat;	//statusUpdated();	remote.remoteStatusUpdated();  // ????    }        /**     * incomingRequest     * @param message     */    void incomingRequest(SipMessage  message)    {	SdpMessage optsdp = new SdpMessage();		if (SipClient.DEBUG) System.out.println( "SipTransaction: Incoming Request" );	if( ( message.getMethod() == Sip.ACK ) ) {	    if (SipClient.DEBUG) System.out.println( "SipTransaction: Received an ACK..." );	    	    // Make sure listeners know in case there was a new session description	    remote.remoteStatusUpdated(); // ????      	} else if( ( message.getMethod() == Sip.CANCEL ) ) {	    if (SipClient.DEBUG) System.out.println( "SipTransaction: CANCEL Received, sending an OK" );	    	    requestmessage.setMethod( Sip.CANCEL );	    sendResponse( new SipStatus( 200 ) );	    	    // Mark request as cancelled and inform listeners	    cancelled = true;	    remote.remoteStatusUpdated();      	} else {	    direction = RemoteRequest;	    requestmessage = message;	    switch( message.getMethod() ) {	    case Sip.INVITE:		parent.setCallType( SipCall.StandardCall );		sendResponse( new SipStatus( 100 ) );		break;	    case Sip.BYE:		if( parent.getCallType() == SipCall.UnknownCall ) {		    parent.setCallType( SipCall.BrokenCall );		}		sendResponse( new SipStatus( 200 ) );		break;	    case Sip.OPTIONS:		if( parent.getCallType() == SipCall.UnknownCall ) {		    parent.setCallType( SipCall.OptionsCall );		}				optsdp.setIpAddress( "0.0.0.0" );		optsdp.setName( "" );		optsdp.setPort( 0 );				sendResponse( new SipStatus( 200 ), optsdp.message(), new MimeContentType( "application/sdp" ) );		break;	    case Sip.MESSAGE:		parent.setCallType( SipCall.MessageCall );		if( message.hasHeader( SipHeader.Subject ) ) {		    parent.setSubject( message.getHeaderData( SipHeader.Subject ) );		}		sendResponse( new SipStatus( 200 ) );		break;	    default:		break;	    }	}	// send the request event	CallListener callListener = SipClient.getSipClient().getCallListener();	if ( callListener != null ) {	    CallEvent ce = new CallEvent( SipClient.getSipClient(), 					  message,					  CallEvent.CALLREQUEST_ID );	    callListener.requestReceived( ce );	}    }        /**     * incomingResponse     * @param message     */    void incomingResponse(SipMessage  message)    {	if (SipClient.DEBUG) System.out.println( "SipTransaction: Incoming Response\n" );	// stop the retransmit timer	stopTimer();	responseList.add( message );		// Grab tags	SipUri newto = new SipUri( message.getHeaderData( SipHeader.To ) ); // *** LOOK AT ****	if( newto.hasTag() ) {	    remote.setUri( newto );	}	// We have a response to our request. If necessary, we'll generate a CallEvent to notify the user	// (when they answer, this in turn will change the local status)	if (SipClient.DEBUG) System.out.println("Sending CallResponseEvent");	if( ( requestmessage.getMethod() == Sip.INVITE ) || ( requestmessage.getMethod() == Sip.REGISTER ) ) {	    // the far end agreed to meet. Signal the user	    CallListener callListener = SipClient.getSipClient().getCallListener();	    if ( callListener != null ) {		CallEvent ce = new CallEvent( SipClient.getSipClient(), message, CallEvent.CALLRESPONSE_ID );		callListener.responseReceived( ce );	    }	}	if( ( requestmessage.getMethod() == Sip.INVITE ) && ( message.getStatus().getCode() >= 200 ) ) {	    sendRequest( Sip.ACK );	}		setStatus( message.getStatus() );    }        /**     * sendRegister     */    void sendRegister( SipUri registerserver, boolean clear, String authentication,			       String proxyauthentication, String body, MimeContentType bodytype)    {	if ( requestmessage == null ) 	    direction = LocalRequest;		requestmessage = new SipMessage();	requestmessage.setType( SipMessage.Request );	requestmessage.setMethod( Sip.REGISTER );		// set request URI	requestmessage.setRequestUri( registerserver );	requestmessage.insertHeader( SipHeader.CSeq, getCSeq() );	requestmessage.insertHeader( SipHeader.To, remote.getUri().nameAddr() );	if ( authentication != null ) 	    requestmessage.insertHeader( SipHeader.Authorization, authentication );		if ( proxyauthentication != null )	    requestmessage.insertHeader( SipHeader.Proxy_Authorization, proxyauthentication );		if ( bodytype != null ) 	    requestmessage.insertHeader( SipHeader.Content_Type, bodytype.type() );		requestmessage.setBody( body );		if ( clear )	    requestmessage.insertHeader( SipHeader.Expires, "0" );		parent.sendRequest( requestmessage, true );	startTimer();  // this handles retransmissions     }    /**     * sendRequest     */    void sendRequest(int method) {	sendRequest(method, null, null, null);    }    void sendRequest(int method, String body, MimeContentType bodytype) {	sendRequest(method, body, bodytype, null);    }        void sendRequest( int method, String body, 			      MimeContentType bodytype, SipUri transferto )    {	if ( method == Sip.INVITE )	    parent.setCallType( SipCall.StandardCall );		if ( requestmessage == null )	    direction = LocalRequest;		// construct message	requestmessage = new SipMessage();	requestmessage.setType( SipMessage.Request );	requestmessage.setMethod( method );		// set request uri	requestmessage.setRequestUri( remote.getContactUri() );	requestmessage.insertHeader( SipHeader.CSeq, getCSeq() );	if ( method == Sip.MESSAGE )	    //	    remote.getUri().setProtocolName( "im" );	requestmessage.insertHeader( SipHeader.To, remote.getUri().nameAddr() );	// figure out the contact info	SipUri contact = new SipUri();	contact.setUsername(remote.getUri().getUsername());	contact.setHostname(Sip.getLocalAddress());	contact.setPortNumber(Sip.getLocalPort());	requestmessage.addContact( contact );		if ( transferto != null )	    requestmessage.insertHeader( SipHeader.Also, transferto.nameAddr() );		if ( bodytype != null ) 	    requestmessage.insertHeader( SipHeader.Content_Type, bodytype.type() );		requestmessage.setBody( body );		parent.sendRequest( requestmessage );	startTimer();  // this handles retransmissions    }        private  void startTimer() {	// initialize	laststatus = new SipStatus( 0 );	// make sure the timer has been created	if (retransmissionTimer == null)	    retransmissionTimer = new Timer();	// create the task to check for when retransmissions are required	retransmissionTimerTask = new TimerTask() {		public void run() {		    auditPending();		}	    };	// schedule this for the specified time	retransmissionTimer.schedule( retransmissionTimerTask, 0, RETRANS_TIMER_CHECK );    }    private void stopTimer() {	retransmissionTimerTask.cancel();    }    /**     * auditPending     */    void auditPending()    {	Date tv;	Date reftv;	long diff;		if( ( laststatus.getCode() < 200 ) && ( direction == LocalRequest ) ) {	    // Check time	  tv = new Date();	  reftv = requestmessage.getTimestamp();	  	  // Check difference	  diff = tv.getTime() - reftv.getTime();	  	  if( requestmessage.getMethod() != Sip.INVITE ) {	      if( diff > requestmessage.lastTimeTick() ) {		  		  // Timeout		  if( requestmessage.sendCount() == 11 ) {		      setStatus( new SipStatus( 408 ) );		      return;		  }		  System.err.println( "SipTransaction: Retransmit " +  requestmessage.sendCount() + " ("				      + requestmessage.lastTimeTick() + ")");		  		  parent.sendRaw( requestmessage );		  requestmessage.setTimestamp();		  requestmessage.incrSendCount();		  		  if( requestmessage.lastTimeTick() < 4000 ) {		      if( laststatus.getCode() < 100 ) {			  requestmessage.setTimeTick( 2 * requestmessage.lastTimeTick() );		      } else {			  requestmessage.setTimeTick( 4000 );		      }		  }	      }	  } else {	      // INVITEs should be retransmitted differently	      if( laststatus.getCode() < 100 ) {		  if( diff > requestmessage.lastTimeTick() ) {		      		      // Timeout		      if ( requestmessage.sendCount() == 7 ) {			  setStatus( new SipStatus( 408 ) );			  return;		      }		      		      if (SipClient.DEBUG) System.out.println( "SipTransaction: Retransmit " + requestmessage.sendCount() + " ("							       + requestmessage.lastTimeTick() + ")");		      		      parent.sendRaw( requestmessage );		      requestmessage.setTimestamp();		      requestmessage.incrSendCount();		      		      requestmessage.setTimeTick( 2 * requestmessage.lastTimeTick() );		  }	      }	  }	}    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -