invitedialog.java

来自「结构非常清晰的SIP协议栈」· Java 代码 · 共 722 行 · 第 1/3 页

JAVA
722
字号
      // invite received
      if (msg.isRequest() && msg.isInvite())      
      {  verifyStatus(statusIs(D_INIT)||statusIs(D_CALL));
         // NOTE: if the invite_ts.listen() is used, you should not arrive here with the D_INIT state..
         //   however state D_INIT has been included for robustness against further changes.
         if (statusIs(D_INIT)) changeStatus(D_INVITED); else changeStatus(D_ReINVITED);
         invite_req=msg;
         invite_ts=new InviteTransactionServer(sip_provider,invite_req,this);
         //((TransactionServer)transaction).listen();
         update(Dialog.UAS,invite_req);
         if (statusIs(D_INVITED)) listener.onDlgInvite(this,invite_req.getToHeader().getNameAddress(),invite_req.getFromHeader().getNameAddress(),invite_req.getBody(),invite_req);
         else listener.onDlgReInvite(this,invite_req.getBody(),invite_req);
      }
      else
      // ack (of 2xx of INVITE)
      if (msg.isRequest() && msg.isAck())      
      {  if (!verifyStatus(statusIs(D_ACCEPTED)||statusIs(D_ReACCEPTED))) return;
         changeStatus(D_CALL);
         // terminates the AckTransactionServer
         ack_ts.terminate();
         listener.onDlgAck(this,msg.getBody(),msg);
         listener.onDlgCall(this);         
      }
      else
      // keep sending ACK (if already sent) for any "200 OK" received
      if (msg.isResponse())
      {  if (!verifyStatus(statusIs(D_CALL))) return;
         int code=msg.getStatusLine().getCode();
         verifyThat(code>=200 && code<300,"code 2xx was expected");
         if (ack_req!=null)
         {  AckTransactionClient ack_tc=new AckTransactionClient(sip_provider,ack_req,null);
            ack_tc.request();
         }
      }   
      else  
      // bye received 
      if (msg.isRequest() && msg.isBye())
      {  if (!verifyStatus(statusIs(D_CALL)||statusIs(D_BYEING))) return;
         changeStatus(D_BYED);
         bye_ts=new TransactionServer(sip_provider,msg,this);
         // automatically sends a 200 OK
         Message resp=MessageFactory.createResponse(msg,200,SipResponses.reasonOf(200),null);
         respond(resp);
         listener.onDlgBye(this,msg);
         changeStatus(D_CLOSE);
         listener.onDlgClose(this);         
      }
      else
      // cancel received
      if (msg.isRequest() && msg.isCancel())
      {  if (!verifyStatus(statusIs(D_INVITED)||statusIs(D_ReINVITED))) return;
         // create a CANCEL TransactionServer and send a 200 OK (CANCEL)
         TransactionServer ts=new TransactionServer(sip_provider,msg,null);
         //ts.listen();
         ts.respondWith(MessageFactory.createResponse(msg,200,SipResponses.reasonOf(200),null));
         // automatically sends a 487 Cancelled
         Message resp=MessageFactory.createResponse(invite_req,487,SipResponses.reasonOf(487),null);
         respond(resp);
         listener.onDlgCancel(this,msg);
      }
      else
      // any other request received
      if (msg.isRequest())
      {  TransactionServer ts=new TransactionServer(sip_provider,msg,null);
         //ts.listen();
         ts.respondWith(MessageFactory.createResponse(msg,405,SipResponses.reasonOf(405),null));
      }
   }
     
   // ************** Inherited from InviteTransactionClientListener **************

   /** Inherited from TransactionClientListener.
     * When the TransactionClientListener is in "Proceeding" state and receives a new 1xx response 
     * <p>
     * For INVITE transaction it fires <i>onFailureResponse(this,code,reason,body,msg)</i>. */
   public void onTransProvisionalResponse(TransactionClient tc, Message msg)
   {  printLog("inside onTransProvisionalResponse(tc,mdg)",LogLevel.LOW);
      if (tc.getTransactionMethod().equals(SipMethods.INVITE))
      {  StatusLine statusline=msg.getStatusLine();
         listener.onDlgInviteProvisionalResponse(this,statusline.getCode(),statusline.getReason(),msg.getBody(),msg);
      }
   }
     
   /** Inherited from TransactionClientListener.
     * When the TransactionClientListener goes into the "Completed" state, receiving a failure response 
     * <p>
     * If called for a INVITE transaction, it moves to D_CLOSE state, removes the listener from SipProvider.
     * <p>
     * If called for a BYE transaction, it moves to D_CLOSE state,
     * removes the listener from SipProvider, and fires <i>onClose(this,msg)</i>. */
   public void onTransFailureResponse(TransactionClient tc, Message msg)
   {  printLog("inside onTransFailureResponse("+tc.getTransactionId()+",msg)",LogLevel.LOW);
      if (tc.getTransactionMethod().equals(SipMethods.INVITE))
      {  if (!verifyStatus(statusIs(D_INVITING)||statusIs(D_ReINVITING))) return;
         StatusLine statusline=msg.getStatusLine();
         int code=statusline.getCode();
         verifyThat(code>=300 && code <700,"error code was expected");
         if (statusIs(D_ReINVITING))
         {  changeStatus(D_CALL);
            listener.onDlgReInviteFailureResponse(this,code,statusline.getReason(),msg);
         }
         else
         {  changeStatus(D_CLOSE);
            if (code>=300 && code<400) listener.onDlgInviteRedirectResponse(this,code,statusline.getReason(),msg.getContacts(),msg);
            else listener.onDlgInviteFailureResponse(this,code,statusline.getReason(),msg);
            listener.onDlgClose(this);
         }
      }
      else
      if (tc.getTransactionMethod().equals(SipMethods.BYE))
      {  if (!verifyStatus(statusIs(D_BYEING))) return;
         StatusLine statusline=msg.getStatusLine();
         int code=statusline.getCode();
         verifyThat(code>=300 && code <700,"error code was expected");
         changeStatus(this.D_CALL);
         listener.onDlgByeFailureResponse(this,code,statusline.getReason(),msg);
      }
   }

   /** Inherited from TransactionClientListener.
     * When an TransactionClientListener goes into the "Terminated" state, receiving a 2xx response 
     * <p>
     * If called for a INVITE transaction, it updates the dialog information, moves to D_CALL state,
     * add a listener to the SipProvider, creates a new AckTransactionClient(ack,this),
     * and fires <i>onSuccessResponse(this,code,body,msg)</i>. 
     * <p>
     * If called for a BYE transaction, it moves to D_CLOSE state,
     * removes the listener from SipProvider, and fires <i>onClose(this,msg)</i>. */
   public void onTransSuccessResponse(TransactionClient tc, Message msg)
   {  printLog("inside onTransSuccessResponse(tc,msg)",LogLevel.LOW);
      if (tc.getTransactionMethod().equals(SipMethods.INVITE))
      {  if (!verifyStatus(statusIs(D_INVITING)||statusIs(D_ReINVITING))) return;
         StatusLine statusline=msg.getStatusLine();
         int code=statusline.getCode();
         if (!verifyThat(code>=200 && code <300 && msg.getTransactionMethod().equals(SipMethods.INVITE),"2xx for invite was expected")) return;
         boolean re_inviting=statusIs(D_ReINVITING);
         changeStatus(D_CALL);
         update(Dialog.UAC,msg);
         if (invite_offer)
         {  //invite_req=MessageFactory.createRequest(SipMethods.ACK,dialog_state,sdp.toString());
            //ack=MessageFactory.createRequest(this,SipMethods.ACK,null);
            ack_req=MessageFactory.create2xxAckRequest(this,null);
            AckTransactionClient ack_tc=new AckTransactionClient(sip_provider,ack_req,null);
            ack_tc.request();
         }
         if (!re_inviting)
         {  listener.onDlgInviteSuccessResponse(this,code,statusline.getReason(),msg.getBody(),msg);
            listener.onDlgCall(this);         
         }
         else
            listener.onDlgReInviteSuccessResponse(this,code,statusline.getReason(),msg.getBody(),msg);
      }
      else
      if (tc.getTransactionMethod().equals(SipMethods.BYE))
      {  if (!verifyStatus(statusIs(D_BYEING))) return;
         StatusLine statusline=msg.getStatusLine();
         int code=statusline.getCode();
         verifyThat(code>=200 && code <300,"2xx for bye was expected");
         changeStatus(D_CLOSE);
         listener.onDlgByeSuccessResponse(this,code,statusline.getReason(),msg);
         listener.onDlgClose(this);         
      }
   }   

   /** Inherited from TransactionClientListener.
     * When the TransactionClient goes into the "Terminated" state, caused by transaction timeout */
   public void onTransTimeout(TransactionClient tc)
   {  printLog("inside onTransTimeout(tc,msg)",LogLevel.LOW);
      if (tc.getTransactionMethod().equals(SipMethods.INVITE))
      {  if (!verifyStatus(statusIs(D_INVITING)||statusIs(D_ReINVITING))) return;
         changeStatus(D_CLOSE);
         listener.onDlgTimeout(this);
         listener.onDlgClose(this);
      }
      else
      if (tc.getTransactionMethod().equals(SipMethods.BYE))
      {  if (!verifyStatus(statusIs(D_BYEING))) return;
         changeStatus(D_CLOSE);
         listener.onDlgClose(this);         
      }
   } 


   // ************** Inherited from InviteTransactionServerListener **************
   
   /** Inherited from TransactionServerListener.
     * When the TransactionServer goes into the "Trying" state receiving a request
     * <p>
     * If called for a INVITE transaction, it initializes the dialog information,
     * <br> moves to D_INVITED state, and add a listener to the SipProvider,
     * <br> and fires <i>onInvite(caller,body,msg)</i>. */
   public void onTransRequest(TransactionServer ts, Message req)
   {  printLog("inside onTransRequest(ts,msg)",LogLevel.LOW);
      if (ts.getTransactionMethod().equals(SipMethods.INVITE))
      {  if (!verifyStatus(statusIs(D_WAITING))) return;
         changeStatus(D_INVITED);
         invite_req=req;
         update(Dialog.UAS,invite_req);
         listener.onDlgInvite(this,invite_req.getToHeader().getNameAddress(),invite_req.getFromHeader().getNameAddress(),invite_req.getBody(),invite_req);
      }
   }
      
   /** Inherited from InviteTransactionServerListener.
     * When an InviteTransactionServer goes into the "Confirmed" state receining an ACK for NON-2xx response 
     * <p>
     * It moves to D_CLOSE state and removes the listener from SipProvider. */
   public void onTransFailureAck(InviteTransactionServer ts, Message msg)
   {  printLog("inside onTransFailureAck(ts,msg)",LogLevel.LOW);
      if (!verifyStatus(statusIs(D_REFUSED)||statusIs(D_ReREFUSED))) return;
      if (statusIs(D_ReREFUSED))
      {  changeStatus(D_CALL);
      }
      else
      {  changeStatus(D_CLOSE);
         listener.onDlgClose(this);
      }
   }
   

   // ************ Inherited from AckTransactionServerListener ************

   /** When the AckTransactionServer goes into the "Terminated" state, caused by transaction timeout */
   public void onTransAckTimeout(AckTransactionServer ts)
   {  printLog("inside onAckSrvTimeout(ts)",LogLevel.LOW);
      if (!verifyStatus(statusIs(D_ACCEPTED)||statusIs(D_ReACCEPTED)||statusIs(D_REFUSED)||statusIs(D_ReREFUSED))) return;
      printLog("No ACK received..",LogLevel.HIGH);
      changeStatus(D_CLOSE);
      listener.onDlgClose(this);
   }


   //**************************** Logs ****************************/

   /** Adds a new string to the default Log */
   protected void printLog(String str, int level)
   {  if (log!=null) log.println("InviteDialog#"+dialog_sqn+": "+str,level+SipStack.LOG_LEVEL_DIALOG);  
   }

}

⌨️ 快捷键说明

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