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