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

📄 cwspsession.java

📁 WAP协议栈的JAVA实现
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    // s_push.req not implemented in client
    private synchronized void s_connect_cnf() {
        logger.debug("s-connect.ind");
        upperlayer.s_connect_cnf();
    }

    private synchronized void s_suspend_ind(short reason) {
        logger.debug("s-suspend.ind");
        isSuspended = true;
        suspendCode = reason;
        upperlayer.s_suspend_ind(reason);
    }

    private synchronized void s_resume_cnf() {
        logger.debug("s-resume.ind");
        isSuspended = false;
        suspendCode = 0;
        upperlayer.s_resume_cnf();
    }

    private synchronized void s_disconnect_ind(short reason) {
        logger.debug("s-disconnect.ind");
        isDisconnected = true;
        disconnectCode = reason;
        upperlayer.s_disconnect_ind(reason);
        socket.close();
    }

    private synchronized void s_disconnect_ind(InetAddress[] redirectInfo) {
        logger.debug("s-disconnect.ind - redirected");
        isDisconnected = true;
        upperlayer.s_disconnect_ind(redirectInfo);
        socket.close();
    }
    
    private synchronized void s_disconnect_ind(CWSPSocketAddress[] redirectInfo) {
        logger.debug("s-disconnect.ind - redirected");
        isDisconnected = true;
        if (version == 2){
            ((IWSPUpperLayer2)upperlayer).s_disconnect_ind(redirectInfo);
        } else {
            InetAddress[] redirectInfo2 = new InetAddress[redirectInfo.length];
            for (int i = 0; i<redirectInfo.length; i++){
                redirectInfo2[i] = redirectInfo[i].getAddress();
            }
            upperlayer.s_disconnect_ind(redirectInfo2);
        }
        socket.close();
    }

    //////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////// implementing IWTPUpperLayer  - TR-*.*

    /**
     * process all TR-*.ind and TR-*.cnf service primitives except TR-Abort
     * (call tr-abort(short abortReason) to indicate a Abort by TR).
     * @param p The WTP Service primitive
     */
    public synchronized void tr_process(CWTPEvent p) {
        try {
            CWSPPDU pdu = null;

            if ((p.getUserData() != null) && (p.getUserData().length != 0)) {
                pdu = CWSPPDU.getPDU(p.getUserData());
            }

            if (logger.isDebugEnabled()) {
                logger.debug(CWTPEvent.types[p.getType()] + " in " +
                    states[state]);
            }

            switch (p.getType()) {
            case 0x01: //--------------------------------------------- TR-INVOKE.IND

                switch (state) {
                case STATE_CONNECTING:

                    if ((p.getTransaction().getClassType() == IWTPTransaction.CLASS_TYPE_1) &&
                            (pdu.getType() == CWSPPDU.PDU_TYPE_CONFIRMEDPUSH)) {
                        p.getTransaction().abort(ABORT_PROTOERR);
                    }

                    break;

                case STATE_CONNECTED:

                    if ((p.getTransaction().getClassType() == IWTPTransaction.CLASS_TYPE_0) &&
                            (pdu.getType() == CWSPPDU.PDU_TYPE_DISCONNECT)) {
                        abortAllMethods(ABORT_DISCONNECT);
                        abortAllPushes(ABORT_DISCONNECT);
                        s_disconnect_ind(ABORT_DISCONNECT);
                        setState(STATE_NULL);
                    } else if ((p.getTransaction().getClassType() == IWTPTransaction.CLASS_TYPE_0) &&
                            (pdu.getType() == CWSPPDU.PDU_TYPE_PUSH)) {
                        /** @todo s_push_ind() */
                    } else if ((p.getTransaction().getClassType() == IWTPTransaction.CLASS_TYPE_1) &&
                            (pdu.getType() == CWSPPDU.PDU_TYPE_CONFIRMEDPUSH)) {
                        /** @todo start new push transaction with this event */
                    }

                    break;

                case STATE_SUSPENDED:

                    if ((p.getTransaction().getClassType() == IWTPTransaction.CLASS_TYPE_0) &&
                            (pdu.getType() == CWSPPDU.PDU_TYPE_DISCONNECT)) {
                        s_disconnect_ind(ABORT_DISCONNECT);
                        setState(STATE_NULL);
                    } else if ((p.getTransaction().getClassType() == IWTPTransaction.CLASS_TYPE_1) &&
                            (pdu.getType() == CWSPPDU.PDU_TYPE_CONFIRMEDPUSH)) {
                        p.getTransaction().abort(ABORT_SUSPEND);
                    }

                    break;

                case STATE_RESUMING:

                    if ((p.getTransaction().getClassType() == IWTPTransaction.CLASS_TYPE_0) &&
                            (pdu.getType() == CWSPPDU.PDU_TYPE_DISCONNECT)) {
                        wtp.abort(ABORT_DISCONNECT);
                        abortAllMethods(ABORT_DISCONNECT);
                        s_disconnect_ind(ABORT_DISCONNECT);
                        setState(STATE_NULL);
                    } else if ((p.getTransaction().getClassType() == IWTPTransaction.CLASS_TYPE_1) &&
                            (pdu.getType() == CWSPPDU.PDU_TYPE_CONFIRMEDPUSH)) {
                        p.getTransaction().abort(ABORT_PROTOERR);
                    }
                }

                break;

            case 0x03: //--------------------------------------------- TR-INVOKE.CNF

                switch (state) {
                case STATE_CONNECTING:

                    //ignore
                    break;

                case STATE_CONNECTED:
                    break;

                case STATE_SUSPENDED:

                    // ignore
                    break;

                case STATE_RESUMING:
                    // ignore
                }

                break;

            case 0x05: //--------------------------------------------- TR-RESULT.IND

                switch (state) {
                case STATE_CONNECTING:

                    if (p.getUserData().length > MRU) {
                        wtp.abort(ABORT_MRUEXCEEDED);
                        abortAllMethods(ABORT_CONNECTERR);
                        s_disconnect_ind(ABORT_MRUEXCEEDED);
                        setState(STATE_NULL);
                    } else if (pdu.getType() == CWSPPDU.PDU_TYPE_CONNECTREPLY) {
                        CWSPConnectReply pdu2 = (CWSPConnectReply) pdu;
                        setState(STATE_CONNECTED);

                        CWTPEvent initPacket = new CWTPEvent(new byte[0],
                                CWTPEvent.TR_RESULT_RES);
                        wtp.process(initPacket);
                        session_id = pdu2.getServerSessionID();
                        s_connect_cnf();
                    } else if (pdu.getType() == CWSPPDU.PDU_TYPE_REDIRECT) {
                        CWTPEvent initPacket = new CWTPEvent(new byte[0],
                                CWTPEvent.TR_RESULT_RES);
                        wtp.process(initPacket);
                        abortAllMethods(ABORT_CONNECTERR);

                        CWSPRedirect pdu2 = (CWSPRedirect) pdu;
                        if (version == 2){
                            s_disconnect_ind(pdu2.getSocketAddresses());
                        } else{
                            s_disconnect_ind(pdu2.getInetAddresses());
                        }
                        setState(STATE_NULL);
                    } else if (pdu.getType() == CWSPPDU.PDU_TYPE_REPLY) {
                        CWTPEvent initPacket = new CWTPEvent(new byte[0],
                                CWTPEvent.TR_RESULT_RES);
                        wtp.process(initPacket);
                        abortAllMethods(ABORT_CONNECTERR);

                        CWSPReply pdu2 = (CWSPReply) pdu;
                        s_disconnect_ind(pdu2.getStatus());
                        setState(STATE_NULL);
                    } else {
                        wtp.abort(ABORT_PROTOERR);
                        abortAllMethods(ABORT_CONNECTERR);
                        s_disconnect_ind(ABORT_PROTOERR);
                        setState(STATE_NULL);
                    }

                    break;

                case STATE_CONNECTED:
                    break;

                case STATE_SUSPENDED:
                    break;

                case STATE_RESUMING:

                    if (p.getUserData().length > MRU) {
                        wtp.abort(ABORT_MRUEXCEEDED);
                        abortAllMethods(ABORT_SUSPEND);
                        s_suspend_ind(ABORT_MRUEXCEEDED);
                        setState(STATE_SUSPENDED);
                    } else if (pdu.getType() == CWSPPDU.PDU_TYPE_REPLY) {
                        CWSPReply pdu2 = (CWSPReply) pdu;

                        if (pdu2.getStatus() == CWSPReply._200_OK_Success) {
                            CWTPEvent initPacket = new CWTPEvent(new byte[0],
                                    CWTPEvent.TR_RESULT_RES);
                            wtp.process(initPacket);
                            s_resume_cnf();
                            setState(STATE_CONNECTED);
                        } else {
                            CWTPEvent initPacket = new CWTPEvent(new byte[0],
                                    CWTPEvent.TR_RESULT_RES);
                            wtp.process(initPacket);
                            abortAllMethods(ABORT_DISCONNECT);

                            CWSPReply pdu3 = (CWSPReply) pdu;
                            s_disconnect_ind(pdu3.getStatus());
                            setState(STATE_NULL);
                        }
                    } else {
                        wtp.abort(ABORT_PROTOERR);
                        abortAllMethods(ABORT_SUSPEND);
                        s_suspend_ind(ABORT_PROTOERR);
                        setState(STATE_SUSPENDED);
                    }
                }

                break;

            case 0x07: //--------------------------------------------- TR-RESULT.CNF

                switch (state) {
                case STATE_CONNECTING:
                    break;

                case STATE_CONNECTED:
                    break;

                case STATE_SUSPENDED:
                    break;

                case STATE_RESUMING:}

                break;
            }
        } catch (EWSPCorruptPDUException e) {
            logger.error("Corrupt PDU", e);
        } catch (EWTPAbortedException e2) {
            logger.error("Aborted", e2);
        }
    }

    /**
     * TR-Abort.ind
     * @param abortReason The abort reason
     */
    public void tr_abort(short abortReason) {
        if (logger.isDebugEnabled()) {
            logger.debug("WSP Session: TR-ABORT.REQ in " + states[state]);
        }

        if (state == STATE_CONNECTING) {
            abortAllMethods(ABORT_CONNECTERR);
            s_disconnect_ind(abortReason);
            setState(STATE_NULL);
        } else if (state == STATE_SUSPENDED) {
            // ignore
        } else if (state == STATE_RESUMING) {
            if (abortReason == ABORT_DISCONNECT) {
                abortAllMethods(ABORT_DISCONNECT);
                s_disconnect_ind(ABORT_DISCONNECT);
                setState(STATE_NULL);
            } else {
                abortAllMethods(ABORT_SUSPEND);
                s_suspend_ind(abortReason);
                setState(STATE_SUSPENDED);
            }
        }
    }

    //////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////// WSP pseudo events
    public void disconnect() {
        socket.close();

        if (state == STATE_CONNECTING) {
            wtp.abort(ABORT_DISCONNECT);
            abortAllMethods(ABORT_DISCONNECT);
            s_disconnect_ind(ABORT_DISCONNECT);
            setState(STATE_NULL);
        } else if (state == STATE_CONNECTED) {
            abortAllMethods(ABORT_DISCONNECT);
            abortAllPushes(ABORT_DISCONNECT);
            s_disconnect_ind(ABORT_DISCONNECT);
            setState(STATE_NULL);
        } else if (state == STATE_SUSPENDED) {
            s_disconnect_ind(ABORT_DISCONNECT);
            setState(STATE_NULL);
        } else if (state == STATE_RESUMING) {
            wtp.abort(ABORT_DISCONNECT);
            abortAllMethods(ABORT_DISCONNECT);
            s_disconnect_ind(ABORT_DISCONNECT);
            setState(STATE_NULL);
        }
    }

    public void suspend() {
        if (state == STATE_CONNECTING) {
            wtp.abort(ABORT_DISCONNECT);
            abortAllMethods(ABORT_DISCONNECT);
            s_disconnect_ind(ABORT_SUSPEND);
            setState(STATE_NULL);
        } else if (state == STATE_CONNECTED) {
            // resume facility enabled!
            abortAllMethods(ABORT_SUSPEND);
            abortAllPushes(ABORT_SUSPEND);
            s_disconnect_ind(ABORT_SUSPEND);
            setState(STATE_SUSPENDED);
        } else if (state == STATE_RESUMING) {
            wtp.abort(ABORT_SUSPEND);
            abortAllMethods(ABORT_SUSPEND);
            s_suspend_ind(ABORT_SUSPEND);
            setState(STATE_SUSPENDED);
        }
    }

    //////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////// HELPERS
    private void abortAllMethods(short reason) {
        for (int i = 0; i < methods.size(); i++) {
            ((CWSPMethodManager) methods.elementAt(i)).abort(reason);
        }
    }

    private void abortAllPushes(short reason) {
        for (int i = 0; i < pushes.size(); i++) {
            ((CWSPPushManager) pushes.elementAt(i)).abort(reason);
        }
    }

    /**
     * sets the state of the state machine
     * @param state the state to set
     */
    private void setState(short state) {
        if (logger.isDebugEnabled()) {
            logger.debug(states[this.state] + " >>> " + states[state]);
        }

        this.state = state;
    }

    public short getState() {
        return state;
    }

    public int getMRU() {
        return MRU;
    }

    public boolean isSuspended() {
        return isSuspended;
    }

    public short getSuspendedCode() {
        return suspendCode;
    }

    public boolean isDisonnected() {
        return isDisconnected;
    }

    public short getDisconnectCode() {
        return disconnectCode;
    }

    public CWTPSocket getWTPSocket() {
        return socket;
    }
}

⌨️ 快捷键说明

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