📄 cwtppdu.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.wtp.pdu;
import java.util.Vector;
import net.sourceforge.jwap.util.BitArrayInputStream;
import net.sourceforge.jwap.util.Logger;
import net.sourceforge.jwap.wtp.CWTPInitiator;
public abstract class CWTPPDU {
// This is a class, that helps us with decoding bits
private static BitArrayInputStream bin = new BitArrayInputStream();
protected static Logger logger = Logger.getLogger(CWTPPDU.class);
public static final byte PDU_TYPE_INVOKE = 0x01;
public static final byte PDU_TYPE_RESULT = 0x02;
public static final byte PDU_TYPE_ACK = 0x03;
public static final byte PDU_TYPE_ABORT = 0x04;
public static final byte PDU_TYPE_SEGM_INVOKE = 0x05;
public static final byte PDU_TYPE_SEGM_RESULT = 0x06;
public static final byte PDU_TYPE_NEG_ACK = 0x07;
public static final String[] types = {
"", "PDU_TYPE_INVOKE", "PDU_TYPE_RESULT", "PDU_TYPE_ACK",
"PDU_TYPE_ABORT", "PDU_Type_SEGM_INVOKE", "PDU_TYPE_SEGM_RESULT",
"PDU_TYPE_NEG_ACK"
};
/////////////////////////////////////////////////////////////////////////////
///////////////////////// COMMON HEADER FIELDS //////////////////////////////
/**
* 1 TPIs (Transport Information Item) in variable part
* 0 NO TPIs (Transport Information Item) in variable part <---
*
* btw: TPIs:
* 0x00 Error
* 0x01 Info
* 0x02 Option
* 0x03 Packet Seqence Number (PSN) (N/A if segment. and re-ass. is implemented)
* 0x04 SDU Boundary (N/A if extended segment. and re-ass. is implemented)
* 0x05 Frame boundary (N/A if extended segment. and re-ass. is implemented)
*/
protected boolean CON; // 1 bit
/**
* Group Trailer and Transmission Trailer Flag
* GTR/TTR
* 0 0 Not last packet
* 0 1 Last packet
* 1 0 Last packet of packet group
* 1 1 segmentation and reassambly NOT supported
*/
protected boolean GTR; // 1 bit
protected boolean TTR; // 1 bit
/**
* @todo Packet Sequence number
* The position of the packet in a segmented message
* NOT available if GTR/TTR = 11 <---
*/
// packSeqNo
/**
* PDUType, 4 bit
* 0x01 Invoke
* 0x02 Result
* 0x03 Ack
* 0x04 Abort
*/
protected byte pduType;
/**
* Reserved
* 0 <---
*/
protected boolean RES1;
protected boolean RES2;
/**
* re-transmission indicator (RID)
* 0 <---
*/
protected boolean RID;
/**
* Transaction Identifier (TID)
* uint16
*/
protected int TID;
protected byte[] payload;
/**
* Maximum size of payload in bearer (UDP)
*/
protected final int MTU = 800; //556 mid, empirisch 1408 oder 912?
/**
* CWTPSegmInvokes (if payload > MTU)
*/
protected Vector segments = new Vector();
/////////////////////////////////////////////////////////////////////////////
//////////////////////////////// CONSTRUCTORS ///////////////////////////////
public CWTPPDU(byte[] payload, int TID, byte type) {
this(TID, type);
this.payload = payload;
}
public CWTPPDU(int TID, byte type) {
CON = false;
GTR = false; // when SAR is not supported by remote, we need to set this true! Niko
TTR = true;
RES1 = false;
RES2 = false;
RID = false;
this.TID = TID;
pduType = type;
//logger.debug("PDU constructed: " + types[type]);
}
/**
* decodes bytes in CWTPPDU objects
*
* @param length the actual number of bytes that are used in
* the byte buffer.
*/
public static CWTPPDU decode(byte[] bytes, int length)
throws EWTPCorruptPDUException {
//the PDU returned
CWTPPDU end = null;
//decode PDU type
byte pduType = bin.getByte(bytes[0], 1, 4);
int tid = 0;
byte[] payload = null;
switch (pduType) {
case CWTPPDU.PDU_TYPE_ABORT:
tid = bin.getShort(bytes[1], bytes[2], 0, 16);
CWTPAbort abort = new CWTPAbort(tid);
abort.setCON(bin.getBoolean(bytes[0], 0));
abort.setAbortType(bin.getByte(bytes[0], 5, 3));
abort.setAbortReason(bin.getByte(bytes[3], 0, 8));
end = abort;
break;
case CWTPPDU.PDU_TYPE_ACK:
tid = bin.getShort(bytes[1], bytes[2], 0, 16);
CWTPAck ack = new CWTPAck(tid);
ack.setTve_tok(bin.getBoolean(bytes[0], 5));
ack.setRES1(bin.getBoolean(bytes[0], 6));
ack.setRID(bin.getBoolean(bytes[0], 7));
end = ack;
break;
case CWTPPDU.PDU_TYPE_INVOKE:
tid = bin.getShort(bytes[1], bytes[2], 0, 16);
payload = new byte[length - 4];
for (int i = 0; i < (length - 4); i++) {
payload[i] = bytes[i + 4];
}
CWTPInvoke invoke = new CWTPInvoke(payload, tid,
CWTPInitiator.CLASS_TYPE_0);
invoke.setCON(bin.getBoolean(bytes[0], 0));
invoke.setGTR(bin.getBoolean(bytes[0], 5));
invoke.setTTR(bin.getBoolean(bytes[0], 6));
invoke.setRID(bin.getBoolean(bytes[0], 7));
invoke.setVersion(bin.getByte(bytes[3], 0, 2));
invoke.setTIDnew(bin.getBoolean(bytes[3], 2));
invoke.setU_P(bin.getBoolean(bytes[3], 3));
invoke.setRES1(bin.getBoolean(bytes[3], 4));
invoke.setRES2(bin.getBoolean(bytes[3], 5));
invoke.setTCL(bin.getByte(bytes[3], 6, 2));
end = invoke;
break;
case CWTPPDU.PDU_TYPE_RESULT:
tid = bin.getShort(bytes[1], bytes[2], 0, 16);
payload = new byte[length - 3];
for (int i = 0; i < (length - 3); i++) {
payload[i] = bytes[i + 3];
}
CWTPResult result = new CWTPResult(payload, tid);
result.setCON(bin.getBoolean(bytes[0], 0));
result.setGTR(bin.getBoolean(bytes[0], 5));
result.setTTR(bin.getBoolean(bytes[0], 6));
result.setRID(bin.getBoolean(bytes[0], 7));
end = result;
break;
case CWTPPDU.PDU_TYPE_SEGM_RESULT:
tid = bin.getShort(bytes[1], bytes[2], 0, 16);
payload = new byte[length - 4];
System.arraycopy(bytes,4,payload,0,payload.length);
CWTPSegmResult res = new CWTPSegmResult((short) (0xff & bytes[3]),
payload, tid);
res.setCON(bin.getBoolean(bytes[0], 0));
res.setGTR(bin.getBoolean(bytes[0], 5));
res.setTTR(bin.getBoolean(bytes[0], 6));
res.setRID(bin.getBoolean(bytes[0], 7));
end = res;
break;
default:
// unnown PDU types
logger.debug("Warning! Unknown PDU Type " + pduType);
throw new EWTPCorruptPDUException(
"Unknown PDU-Type! By the way: *is* it WTP?");
}
return end;
}
/////////////////////////////////////////////////////////////////////////////
//////////////////////////////// ABSTRACT METHOD ////////////////////////////
/**
* Encodes the PDU according to WAP-224-WTP-20010710-a
* @return encoded bytes
*/
public abstract byte[] toByteArray();
/////////////////////////////////////////////////////////////////////////////
//////////////////////////////// SET/GET ////////////////////////////////////
public boolean getCON() {
return CON;
}
public void setCON(boolean CON) {
this.CON = CON;
}
public boolean getGTR() {
return GTR;
}
public void setGTR(boolean GTR) {
this.GTR = GTR;
}
public boolean getTTR() {
return TTR;
}
public void setTTR(boolean TTR) {
this.TTR = TTR;
}
public byte getPDUType() {
return pduType;
}
public void setPDUType(byte PDUType) {
this.pduType = PDUType;
}
public boolean getRES1() {
return RES1;
}
public void setRES1(boolean RES) {
this.RES1 = RES;
}
public boolean getRES2() {
return RES2;
}
public void setRES2(boolean RES) {
this.RES2 = RES;
}
public boolean getRID() {
return RID;
}
public void setRID(boolean RID) {
this.RID = RID;
}
public int getTID() {
return TID;
}
public byte[] getPayload() {
return payload;
}
public void setPayload(byte[] payload) {
this.payload = payload;
}
public Vector getSegments() {
return segments;
}
public void setSegments(Vector segments) {
this.segments = segments;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -