📄 cwtpresponder.java
字号:
// TID OK
a_timer.restart();
CWTPEvent initPacket = new CWTPEvent(pdu.getPayload(),
CWTPEvent.TR_INVOKE_IND);
initPacket.setTransaction(this);
upperLayer.tr_process(initPacket);
setState(STATE_INVOKE_RESP_WAIT);
}
else {
// TID not OK
CWTPAck ack = new CWTPAck(sendTID);
ack.setTve_tok(true);
wtpSocket.send(ack);
setState(STATE_TIDOK_WAIT);
}
}
else if (classType == CLASS_TYPE_0){
CWTPEvent initPacket = new CWTPEvent(pdu.getPayload(),
CWTPEvent.TR_INVOKE_IND);
initPacket.setTransaction(this);
upperLayer.tr_process(initPacket);
setState(STATE_LISTEN);
}
}// end invoke PDU in listen
break;
//////////////////// STATE TIDOK WAIT ////////////////////////////////////
case 0x01:
if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_ACK &&
(classType == CLASS_TYPE_1 || classType == CLASS_TYPE_2) &&
(true) /** @todo TID ok? */){
CWTPEvent initPacket = new CWTPEvent(pdu.getPayload(),
CWTPEvent.TR_INVOKE_IND);
initPacket.setTransaction(this);
upperLayer.tr_process(initPacket);
a_timer.restart();
setState(STATE_INVOKE_RESP_WAIT);
}
else if(pdu.getPDUType() == CWTPPDU.PDU_TYPE_ABORT){
short abortReason = ((CWTPAbort)pdu).getAbortReason();
close(abortReason);
upperLayer.tr_abort(abortReason);
setState(STATE_LISTEN);
}
else if(pdu.getPDUType() == CWTPPDU.PDU_TYPE_INVOKE){
if(pdu.getRID()){
CWTPAck ack = new CWTPAck(sendTID);
ack.setTve_tok(true);
wtpSocket.send(ack);
setState(STATE_TIDOK_WAIT);
}
else {
// ignore
setState(STATE_TIDOK_WAIT);
}
}
break;
///////////////////// STATE INVOKE RESP WAIT /////////////////////////////
case 0x02:
if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_ABORT){
short abortReason = ((CWTPAbort)pdu).getAbortReason();
close(abortReason);
upperLayer.tr_abort(abortReason);
setState(STATE_LISTEN);
}
else if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_INVOKE){
// ignore
setState(STATE_INVOKE_RESP_WAIT);
}
break;
///////////////////// STATE RESULT WAIT //////////////////////////////////
case 0x03:
if(pdu.getPDUType() == CWTPPDU.PDU_TYPE_INVOKE){
if(pdu.getRID()){
if(true/** @todo ack pdu already sent? */){
// resend Ack PDU
setState(STATE_RESULT_WAIT);
}
else{
// ignore
setState(STATE_RESULT_WAIT);
}
}
else{
// ignore
setState(STATE_RESULT_WAIT);
}
}
else if(pdu.getPDUType() == CWTPPDU.PDU_TYPE_ABORT){
short abortReason = ((CWTPAbort)pdu).getAbortReason();
close(abortReason);
upperLayer.tr_abort(abortReason);
setState(STATE_LISTEN);
}
break;
///////////////////// STATE RESULT RESP WAIT /////////////////////////////
case 0x04:
if(pdu.getPDUType() == CWTPPDU.PDU_TYPE_ABORT){
short abortReason = ((CWTPAbort)pdu).getAbortReason();
close(abortReason);
upperLayer.tr_abort(abortReason);
setState(STATE_LISTEN);
}
else if(pdu.getPDUType() == CWTPPDU.PDU_TYPE_ACK){
CWTPAck pduAck = (CWTPAck)pdu;
if(pduAck.getTve_tok()){
// ignore
setState(STATE_RESULT_RESP_WAIT);
} else{
CWTPEvent p = new CWTPEvent(pdu.getPayload(), CWTPEvent.TR_RESULT_CNF);
upperLayer.tr_process(p);
setState(STATE_LISTEN);
}
}
break;
///////////////////// STATE WAIT TIMEOUT /////////////////////////////////
case 0x05:
if(pdu.getPDUType() == CWTPPDU.PDU_TYPE_INVOKE){
CWTPInvoke invokepdu = (CWTPInvoke)pdu;
if(invokepdu.getRID()){
CWTPAck ackpdu = new CWTPAck(sendTID);
/** @todo input exitInfo TPI if available seite 56 */
wtpSocket.send(ackpdu);
setState(STATE_WAIT_TIMEOUT);
}
else {
// ignore
setState(STATE_WAIT_TIMEOUT);
}
}
else if(pdu.getPDUType() == CWTPPDU.PDU_TYPE_ACK){
CWTPAck acki = (CWTPAck)pdu;
if(acki.getTve_tok() &&
acki.getRID()){
CWTPAck ackpdu = new CWTPAck(sendTID);
/** @todo input exitInfo TPI if available seite 56 */
wtpSocket.send(ackpdu);
setState(STATE_WAIT_TIMEOUT);
}
}
else if(pdu.getPDUType() == CWTPPDU.PDU_TYPE_ABORT){
short abortReason = ((CWTPAbort)pdu).getAbortReason();
close(abortReason);
upperLayer.tr_abort(abortReason);
setState(STATE_LISTEN);
}
break;
}
}
/**
* Invoked by higher layers to process given service primitives
* according to state machine described in section 9.5.<br>
* <b>Notice:</b> Only WTP Initiator is implemented!
*
* @param p the Service Primitive to be processed
*/
public synchronized void process(CWTPEvent p) throws EWTPAbortedException{
if (aborted){
throw new EWTPAbortedException(abortCode);
}
switch (state){
///////////////////// STATE LISTEN ///////////////////////////////////////
//case 0x00:
//not possible
//////////////////// STATE TIDOK WAIT ////////////////////////////////////
//case 0x01:
//not possible
///////////////////// STATE INVOKE RESP WAIT /////////////////////////////
case 0x02:
if(p.getType() == CWTPEvent.TR_INVOKE_RES){
if (classType == CLASS_TYPE_1){
/** @todo input exitinfo tpi if availabe */
CWTPAck ack = new CWTPAck(sendTID);
wtpSocket.send(ack);
w_timer.restart();
setState(STATE_WAIT_TIMEOUT);
}
else if(classType == CLASS_TYPE_2){
a_timer.restart();
setState(STATE_RESULT_WAIT);
}
}
else if(p.getType() == CWTPEvent.TR_RESULT_REQ){
rcr = 0;
sentPDU = new CWTPResult(p.getUserData(), sendTID);
wtpSocket.send(sentPDU);
r_timer.restart();
setState(STATE_RESULT_RESP_WAIT);
}
break;
///////////////////// STATE RESULT WAIT //////////////////////////////////
case 0x03:
if(p.getType() == CWTPEvent.TR_RESULT_REQ){
rcr = 0;
sentPDU = new CWTPResult(p.getUserData(), sendTID);
wtpSocket.send(sentPDU);
r_timer.restart();
setState(STATE_RESULT_RESP_WAIT);
}
break;
///////////////////// STATE RESULT RESP WAIT /////////////////////////////
//case 0x04:
//not possible
///////////////////// STATE WAIT TIMEOUT /////////////////////////////////
//case 0x05:
//not possible
}
}
/**
* RcvErrorPDU
* @param e exception thrown by CWTPFactory
*/
public void process(EWTPCorruptPDUException e){
CWTPAbort abort = new CWTPAbort(sendTID);
abort.setAbortReason(CWTPAbort.ABORT_REASON_PROTOERR);
wtpSocket.send(abort);
if (state != STATE_LISTEN){
if (state != STATE_TIDOK_WAIT){
upperLayer.tr_abort(CWTPAbort.ABORT_REASON_PROTOERR);
}
close(CWTPAbort.ABORT_REASON_PROTOERR);
setState(STATE_LISTEN);
}
}
/**
* use this method to invoke a TR-ABORT.REQ by the upper Layer
*/
public void abort(){
abort(CWTPAbort.ABORT_REASON_UNKNOWN);
}
/**
* use this method to invoke a TR-ABORT.REQ by the upper Layer
*/
public void abort(short abortReason){
if (state == STATE_INVOKE_RESP_WAIT ||
state == STATE_RESULT_WAIT ||
state == STATE_RESULT_RESP_WAIT ||
state == STATE_WAIT_TIMEOUT){
close(abortReason);
CWTPAbort abort = new CWTPAbort(sendTID);
abort.setAbortReason(abortReason);
setState(STATE_LISTEN);
}
}
public void close(short reasonCode){
abortCode = reasonCode;
aborted = true;
r_timer.stop();
w_timer.stop();
a_timer.stop();
setState(STATE_LISTEN);
wtpSocket.removeTransaction(this);
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//XXXXXXXXXXXXXXXXXXXXXX SET/GET XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
public int getTID(){
return sendTID;
}
public void setClassType(byte classType) throws IllegalArgumentException{
if (classType == 1 |classType == 2 | classType == 0){
this.classType = classType;
return;
} else{
throw new IllegalArgumentException("Class Type has to be 1, 2 or 3");
}
}
public byte getClassType(){
return classType;
}
private void setState(byte state){
logger.debug(">>> WTP Responder: " + states[state] + "<<<");
}
public boolean isAborted(){
return aborted;
}
public short getAbortCode(){
return abortCode;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -