📄 siptransaction.java
字号:
{ 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 + -