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

📄 cwtpinitiator.java

📁 WAP Gateway source code in JAVA:WAP网关的java源码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
                                upperLayer.tr_abort(CWTPAbort.ABORT_REASON_UNKNOWN);
                                rcr = 0;
                                setState(STATE_NULL);
                            }
                        }
                    }
                });

        // see declaration of w_timer above
        w_timer = new javax.swing.Timer(w,
                new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        w_timer.stop();

                        if (state == STATE_WAIT_TIMEOUT) {
                            logger.debug("wait timeout");
                            setState(STATE_NULL);
                            close((short) 0x00);
                        }
                    }
                });

        // see declaration of w_timer above
        s_timer = new javax.swing.Timer(s,
                new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        s_timer.stop();

                        if (segment_sended > segment_sended_max) {
                            if(logger.isDebugEnabled()) {
                                logger.debug("wait_ack timeout (" + segment_sended +
                                    "), abort.");
                            }
                            segment_sended = 1;
                            setState(STATE_NULL);
                            close((short) 0x00);
                        } else {
                            if (state == STATE_WAIT_ACK) {
                                if(logger.isDebugEnabled()) {
                                    logger.debug("wait_ack timeout (" +
                                        segment_sended + "), re-sending segment.");
                                }
                                segment.setRID(true);
                                wtpSocket.send(segment);
                                segment_sended++;
                                s_timer.restart();
                            }
                        }
                    }
                });
    }

    //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    /**
     * Invoked by the run()-Method of the Management-Entity CWTPManagement.
     * Processes given protocol data units
     * according to state machine described in section 9.5
     * <b>Notice:</b> Only WTP Initiator is implemented!
     *
     * @param pdu the pdu to be processed in the state machine
     */
    public synchronized void process(CWTPPDU pdu) throws EWTPAbortedException {
        if (aborted) {
            throw new EWTPAbortedException(abortCode);
        }

        if (logger.isDebugEnabled()) {
            logger.debug("" + sendTID + ": " + CWTPPDU.types[pdu.getPDUType()] +
                " in " + states[state] + " class " + classType + " holdOn " +
                holdOn);
        }

        switch (state) {
        ///////////////////// NULL //////////////////////////////////////////////
        case 0x00:

            // because only initiator is implemented,
            // we do not need to react on pdu-events in NULL state
            break;

        ///////////////////// RESULT WAIT ///////////////////////////////////////
        case 0x01:

            // RcvAck in RESULT WAIT
            if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_ACK) {
                if (((CWTPAck) pdu).getTve_tok() &&
                        ((classType == 1) || (classType == 2)) &&
                        (rcr < RCR_MAX)) {
                    CWTPAck send = new CWTPAck(((CWTPAck) pdu).getTID() &
                            0x7fff);
                    send.setTve_tok(true);
                    wtpSocket.send(send);
                    rcr++;
                    r_timer.restart();
                    setState(STATE_RESULT_WAIT);
                } else if (((CWTPAck) pdu).getTve_tok() &&
                        ((classType == 1) || (classType == 2))) {
                    setState(STATE_RESULT_WAIT);
                } else if ((classType == 2) && !holdOn) {
                    r_timer.stop();
                    upperLayer.tr_process(new CWTPEvent(pdu.getPayload(),
                            CWTPEvent.TR_INVOKE_CNF));
                    this.holdOn = true;
                    setState(CWTPInitiator.STATE_RESULT_WAIT);
                } else if ((classType == 2) && holdOn) {
                    setState(STATE_RESULT_WAIT);
                } else if (classType == 1) {
                    r_timer.stop();
                    upperLayer.tr_process(new CWTPEvent(pdu.getPayload(),
                            CWTPEvent.TR_INVOKE_CNF));
                    setState(STATE_NULL);
                }
            }
            // RcvAbort in RESULT WAIT
            else if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_ABORT) {
                short abortReason = ((CWTPAbort) pdu).getAbortReason();
                close(abortReason);
                upperLayer.tr_abort(abortReason);
                setState(STATE_NULL);
            }
            // RcvResult in RESULT WAIT
            else if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_RESULT && classType == 2) {
              CWTPResult res = (CWTPResult) pdu;
              byte nextState=STATE_RESULT_RESP_WAIT;
          
              // Stop timer
              r_timer.stop();
          
              // Check for segmentation indication
              if( !res.getTTR() )
              {
                logger.debug("Not last packet");
                segend = 0; seglast = 0;
                segdata = new  ByteArrayOutputStream(64*1024); // 64kbyte segs
                segTID = pdu.getTID();
                try {
                  segdata.write(res.getPayload());
                } catch (IOException e) {
                  logger.warn("Exception writing to ByteArrayOutputStream",e);
                }
                nextState=STATE_RESULT_WAIT; // We will wait for more to come
              }
              setState(nextState);

              // if !holdOn generate TR_Invoke.cnf
              if(!holdOn) {
                upperLayer.tr_process(
                  new CWTPEvent(pdu.getPayload(), CWTPEvent.TR_INVOKE_CNF));
              }
          
              if( !res.getTTR() && res.getGTR() ) {
                byte payload[] = new byte[2];
                CWTPAck ack = new CWTPAck(sendTID);
                payload[0] = (0x03 << 3) | 0x01; // psn, one byte length
                payload[1] = 0; // Implicit sequence number 0
                ack.setCON(true); // headers follow ;)
                ack.setPayload(payload);
                if(logger.isDebugEnabled()) {
                    logger.debug("sending ack:" + ack.toString());
                }
                wtpSocket.send(ack);
              }
              
              if( nextState != STATE_RESULT_WAIT ) { 
                // generate tr_result.ind
                upperLayer.tr_process(
                  new CWTPEvent(pdu.getPayload(), CWTPEvent.TR_RESULT_IND));
              }
              // restart ack timer
              a_timer.restart();
            } 
            else if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_SEGM_RESULT) {
              logger.debug("Segmented result");
              boolean sendAck = false;
              boolean sendToUpper = false;
              CWTPSegmResult sres = (CWTPSegmResult) pdu;

              w_timer.restart();
              a_timer.restart();

              if (sres.getTID() != segTID) {
                logger.warn("Dumping out-of sync segment from outer space!");
                return;
              }
              if (seglast + 1 == sres.getPSN()) {
                // we are in line with stuff
                seglast = sres.getPSN();
                try {
                  segdata.write(sres.getPayload());
                } catch (IOException e) {
                  logger.warn("Exception writing to ByteArrayOutputStream",e);
                }
                if (sres.getGTR()) {
                  logger.debug("Last packet of packet group");
                  // ==> ttr must be 0  -> end of group
                  sendAck = true;
                } else if (sres.getTTR()) {
                  logger.debug("Last packet of message");
                  // EOF :)
                  sendAck = true;
                  sendToUpper = true;
                  setState(STATE_RESULT_RESP_WAIT);
                } //else not last packet...
              } else {
                logger.warn(
                  "LOST PACKET - last "
                    + seglast
                    + " current psn "
                    + sres.getPSN());
                // @todo: send NACK
              }
              if (sendAck) {
                byte payload[] = new byte[2];
                CWTPAck send = new CWTPAck(sendTID);
                payload[0] = (0x03 << 3) | 0x01; // psn, one byte length
                payload[1] = (byte) (0x7f & sres.getPSN());
                send.setCON(true); // headers follow ;)
                send.setPayload(payload);

                if(logger.isDebugEnabled()) {
                    logger.debug("sending ack:" + send.toString());
                }
                wtpSocket.send(send);
              }
              if (sendToUpper) {
                byte[] payload = segdata.toByteArray();
                upperLayer.tr_process(new CWTPEvent(payload, CWTPEvent.TR_RESULT_IND));
                segdata = null;
                segend = 0;
              }
            }
            break;

        ///////////////////// RESULT RESP WAIT //////////////////////////////////
        case 0x02:

            // RcvAbort in RESULT RESP WAIT
            if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_ABORT) {
                short abortReason = ((CWTPAbort) pdu).getAbortReason();
                close(abortReason);
                upperLayer.tr_abort(abortReason);
                setState(STATE_NULL);
            }
            // RcvResult in RESULT RESP WAIT
            else if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_RESULT) {
                logger.debug("blp");
                setState(STATE_RESULT_RESP_WAIT);

                // RcvSegmResult in RESULT RESP WAIT
            } else if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_SEGM_RESULT) {
                logger.debug("XXXXXX blpseg");

                setState(STATE_RESULT_RESP_WAIT);
            }

            break;

        ///////////////////// WAIT TIMEOUT //////////////////////////////////////
        case 0x03:

            // RcvAbort in WAIT TIMEOUT
            if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_ABORT) {
                short abortReason = ((CWTPAbort) pdu).getAbortReason();
                close(abortReason);
                upperLayer.tr_abort(abortReason);
                setState(STATE_NULL);
            }
            // RcvResult in WAIT TIMEOUT
            else if (pdu.getPDUType() == CWTPPDU.PDU_TYPE_RESULT) {
                if (pdu.getRID()) {
                    /** @todo input TPI exitinfo if available - page 54 **/
                    CWTPAck send = new CWTPAck(sendTID);
                    wtpSocket.send(send);
                    setState(STATE_WAIT_TIMEOUT);
                } else {

⌨️ 快捷键说明

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