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

📄 cwspcapabilities.java

📁 WAP Gateway source code in JAVA:WAP网关的java源码
💻 JAVA
字号:
/**
 * JWAP - A Java Implementation of the WAP Protocols
 * Copyright (C) 2001-2004 Niko Bender
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
package net.sourceforge.jwap.wsp.pdu;

import net.sourceforge.jwap.util.*;

import java.util.*;


/**
 * Capabilities allow the client to negotiate characteristics
 * and extended behaviours of the protocol (see section 8.3 of the WSP spec.).
 */
public class CWSPCapabilities {
    /**
     * Table 37
     */
    public static final short TYPE_clientSDUSize = 0x00;
    public static final short TYPE_serverSDUSize = 0x01;
    public static final short TYPE_protocolOptions = 0x02;
    public static final short TYPE_methodMOR = 0x03;
    public static final short TYPE_pushMOR = 0x04;
    public static final short TYPE_extendedMethods = 0x05;
    public static final short TYPE_headerCodePages = 0x06;
    public static final short TYPE_aliases = 0x07;
    public static final short TYPE_clientMessageSize = 0x08;
    public static final short TYPE_serverMessageSize = 0x09;

    /**
     * section 8.3.2.3
     */
    public static final short OPTION_CONF_PUSH_FACILITY = 0x80;
    public static final short OPTION_PUSH_FACILITY = 0x40;
    public static final short OPTION_SESSION_RESUME_FACILITY = 0x20;
    public static final short OPTION_ACK_HEADERS = 0x10;
    public static final short OPTION_LARGE_DATA_TRANSFER = 0x08;

    /**
     * section 8.3.2.1
     * unintvar
     */
    private long clientSDUSize = 1400;
    private boolean bClientSDUSize = false;
    private long serverSDUSize = 1400;
    private boolean bServerSDUSize = false;

    /**
     * section 8.3.2.3
     * one octet
     */
    private long protocolOptions = 0x00;
    private boolean bProtocolOptions = false;

    /**
     * section 8.3.2.4
     * uint8
     */
    private long methodMOR = 1;
    private boolean bMethodMOR = false;
    private long pushMOR = 1;
    private boolean bPushMOR = false;

    /**
     * section 8.3.2.5
     * uint8
     * multiple octets
     */
    private Hashtable extendedMethods = new Hashtable();

    /**
     * section 8.3.2.6
     * uint8
     * multiple octets
     */
    private Hashtable headerCodePages = new Hashtable();

    /**
     * section 8.3.2.7
     * multiple octets
     * encoded as redirect address in sec. 8.2.2.3
     *
     * BearerTypeIncluded, PortNumberIncluded, AddressLength
     */
    Vector aliases = new Vector();

    /**
     * section 8.3.2.2
     * unintvar
     */
    private long clientMessageSize = 1400;
    private boolean bClientMessageSize = false;
    private long serverMessageSize = 1400;
    private boolean bServerMessageSize = false;

    /////////////////////////////////////////////////////////////////////////////
    //////////////////////////////// GET/SET ////////////////////////////////////
    public void setClientSDUSize(long clientSDUSize) {
        this.clientSDUSize = clientSDUSize;
        this.bClientSDUSize = true;
    }

    public long getClientSDUSize() {
        return clientSDUSize;
    }

    public void setServerSDUSize(long serverSDUSize) {
        this.serverSDUSize = serverSDUSize;
        this.bServerSDUSize = true;
    }

    public long getServerSDUSize() {
        return serverSDUSize;
    }

    /**
     * set a protocoloption
     * use constans in this class beginning with "OPTION_"
     */
    public void setProtocolOption(short option, boolean on_off) {
        if (on_off) {
            if (!getProtocolOption(option)) {
                this.bProtocolOptions = true;
                protocolOptions += option;
            }
        } else {
            if (getProtocolOption(option)) {
                protocolOptions -= option;
            }
        }
    }

    /**
     * is the Option <code>option</code> set?
     * use constants in this class beginnig with "OPTION_"
     */
    public boolean getProtocolOption(short option) {
        BitSet s = BitArrayOutputStream.getBitSet(getProtocolOptions());

        return s.get((int) (Math.log(option) / Math.log(2)));
    }

    public byte getProtocolOptions() {
        BitArrayOutputStream m = new BitArrayOutputStream();
        m.write(protocolOptions, 8);

        byte[] b = m.toByteArray();

        return b[0];
    }

    public void setMethodMOR(long methodMOR) {
        this.methodMOR = methodMOR;
        this.bMethodMOR = true;
    }

    public long getMethodMOR() {
        return methodMOR;
    }

    public void setPushMOR(long pushMOR) {
        this.pushMOR = pushMOR;
        this.bPushMOR = true;
    }

    public long getPushMOR() {
        return pushMOR;
    }

    public Hashtable getExtendedMethods() {
        return extendedMethods;
    }

    public boolean addExtendedMethod(long pduType, String name) {
        Long toAdd = new Long(pduType);
        Enumeration keys = extendedMethods.keys();

        while (keys.hasMoreElements()) {
            Long akt = (Long) (keys.nextElement());

            if (toAdd.equals(akt)) {
                return false;
            }
        }

        extendedMethods.put(new Long(pduType), name);

        return true;
    }

    public boolean removeExtendedMethod(long pduType) {
        Long search = new Long(pduType);
        Enumeration keys = extendedMethods.keys();

        while (keys.hasMoreElements()) {
            Long akt = (Long) (keys.nextElement());

            if (search.equals(akt)) {
                extendedMethods.remove(akt);

                return true;
            }
        }

        return false;
    }

    public Hashtable getHeaderCodePages() {
        return headerCodePages;
    }

    /**
     * add a header code page
     */
    public boolean addHeaderCodePage(long pageCode, String name) {
        Long toAdd = new Long(pageCode);
        Enumeration keys = headerCodePages.keys();

        while (keys.hasMoreElements()) {
            Long akt = (Long) (keys.nextElement());

            if (toAdd.equals(akt)) {
                return false;
            }
        }

        headerCodePages.put(toAdd, name);

        return true;
    }

    /**
     * remove a header code page if it exists.
     */
    public boolean removeHeaderCodePage(long pageCode) {
        Long search = new Long(pageCode);
        Enumeration keys = headerCodePages.keys();

        while (keys.hasMoreElements()) {
            Long akt = (Long) (keys.nextElement());

            if (search.equals(akt)) {
                headerCodePages.remove(akt);

                return true;
            }
        }

        return false;
    }

    public Vector getAliases() {
        return aliases;
    }

    /**
     * add a alias (alternate address of the sender)
     */
    public boolean addAlias(boolean bearerTypeIncluded,
        boolean portNumberIncluded, short bearerType, int portNumber,
        String bearerAddressToUse) {
        CWSPAddress toAdd = new CWSPAddress(bearerTypeIncluded,
                portNumberIncluded, bearerType, portNumber, bearerAddressToUse);

        for (int i = 0; i < aliases.size(); i++) {
            CWSPAddress search = (CWSPAddress) aliases.elementAt(i);

            if (search.equals(toAdd)) {
                return false;
            }
        }

        aliases.add(toAdd);

        return true;
    }

    /**
     * remove a alias using the values as given
     */
    public boolean removeAlias(boolean bearerTypeIncluded,
        boolean portNumberIncluded, short bearerType, int portNumber,
        String bearerAddressToUse) {
        CWSPAddress toRemove = new CWSPAddress(bearerTypeIncluded,
                portNumberIncluded, bearerType, portNumber, bearerAddressToUse);

        for (int i = 0; i < aliases.size(); i++) {
            CWSPAddress search = (CWSPAddress) aliases.elementAt(i);

            if (search.equals(toRemove)) {
                aliases.remove(search);

                return true;
            }
        }

        return false;
    }

    public long getClientMessageSize() {
        return clientMessageSize;
    }

    public void setClientMessageSize(long size) {
        clientMessageSize = size;
        this.bClientMessageSize = true;
    }

    public long getServerMessageSize() {
        return serverMessageSize;
    }

    public void setServerMessageSize(long size) {
        serverMessageSize = size;
        this.bServerMessageSize = true;
    }

    /**
     * encode all capabilities in a byte array
     * according to WAP-230-WSP-20010705-a section 8.3 "capability encoding"
     *
     * @return The encoded bytes
     */
    public byte[] getBytes() {
        BitArrayOutputStream result = new BitArrayOutputStream();
        BitArrayOutputStream tmp = new BitArrayOutputStream();
        byte[] tmp2;

        if (this.bClientSDUSize) {
            tmp.write(TYPE_clientSDUSize + 0x80, 8);
            tmp.writeUintVar(clientSDUSize);
            tmp2 = tmp.toByteArray();
            result.writeUintVar(tmp2.length);
            result.write(tmp2);
        }

        if (bServerSDUSize) {
            tmp.reset();
            tmp.write(TYPE_serverSDUSize + 0x80, 8);
            tmp.writeUintVar(serverSDUSize);
            tmp2 = tmp.toByteArray();
            result.writeUintVar(tmp2.length);
            result.write(tmp2);
        }

        if (bClientMessageSize) {
            tmp.reset();
            tmp.write(TYPE_clientMessageSize + 0x80, 8);
            tmp.writeUintVar(clientMessageSize);
            tmp2 = tmp.toByteArray();
            result.writeUintVar(tmp2.length);
            result.write(tmp2);
        }

        if (bServerMessageSize) {
            tmp.reset();
            tmp.write(TYPE_serverMessageSize + 0x80, 8);
            tmp.writeUintVar(serverMessageSize);
            tmp2 = tmp.toByteArray();
            result.writeUintVar(tmp2.length);
            result.write(tmp2);
        }

        if (bProtocolOptions) {
            tmp.reset();
            tmp.write(TYPE_protocolOptions + 0x80, 8);
            tmp.write(protocolOptions, 8);
            tmp2 = tmp.toByteArray();
            result.writeUintVar(tmp2.length);
            result.write(tmp2);
        }

        if (bMethodMOR) {
            tmp.reset();
            tmp.write(TYPE_methodMOR + 0x80, 8);
            tmp.writeUintVar(methodMOR);
            tmp2 = tmp.toByteArray();
            result.writeUintVar(tmp2.length);
            result.write(tmp2);
        }

        if (bPushMOR) {
            tmp.reset();
            tmp.write(TYPE_pushMOR + 0x80, 8);
            tmp.writeUintVar(pushMOR);
            tmp2 = tmp.toByteArray();
            result.writeUintVar(tmp2.length);
            result.write(tmp2);
        }

        if (!extendedMethods.isEmpty()) {
            Enumeration keys = extendedMethods.keys();

            while (keys.hasMoreElements()) {
                tmp.reset();

                Object key = keys.nextElement();
                tmp.write(TYPE_extendedMethods + 0x80, 8);
                tmp.write(((Long) key).longValue(), 8);

                String value = (String) (extendedMethods.get(key));
                tmp.write(value.getBytes());
                tmp.write(0x00, 8);
                tmp2 = tmp.toByteArray();
                result.writeUintVar(tmp2.length);
                result.write(tmp2);
            }
        }

        if (!headerCodePages.isEmpty()) {
            Enumeration keys = extendedMethods.keys();

            while (keys.hasMoreElements()) {
                tmp.reset();

                Object key = keys.nextElement();
                tmp.write(TYPE_headerCodePages + 0x80, 8);
                tmp.write(((Long) key).longValue(), 8);

                String value = (String) (extendedMethods.get(key));
                tmp.write(value.getBytes());
                tmp.write(0x00, 8);
                tmp2 = tmp.toByteArray();
                result.writeUintVar(tmp2.length);
                result.write(tmp2);
            }
        }

        if (!aliases.isEmpty()) {
            for (int i = 0; i < aliases.size(); i++) {
                tmp.reset();

                CWSPAddress address = (CWSPAddress) aliases.elementAt(i);
                tmp.write(TYPE_aliases + 0x80, 8);
                tmp.write(address.getBytes());
                tmp2 = tmp.toByteArray();
                result.writeUintVar(tmp2.length);
                result.write(tmp2);
            }
        }

        return result.toByteArray();
    }

    /**
     * Test method
     *
     * @param args ignored
     */
    public static void main(String[] args) {
        CWSPCapabilities c = new CWSPCapabilities();
        c.setProtocolOption(OPTION_PUSH_FACILITY, true);
        c.setProtocolOption(OPTION_LARGE_DATA_TRANSFER, true);

        byte b = c.getProtocolOptions();
        System.out.println(BitArrayOutputStream.getBitString(b));
    }
}

⌨️ 快捷键说明

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