com.ibm.as400.util.commtrace.Header Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jt400 Show documentation
Show all versions of jt400 Show documentation
The Open Source version of the IBM Toolbox for Java
///////////////////////////////////////////////////////////////////////////////
//
// JTOpen (IBM Toolbox for Java - OSS version)
//
// Filename: Header.java
//
// The source code contained herein is licensed under the IBM Public License
// Version 1.0, which has been approved by the Open Source Initiative.
// Copyright (C) 2002 International Business Machines Corporation and
// others. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
package com.ibm.as400.util.commtrace;
import java.io.StringWriter;
import java.util.Properties;
/**
* Parent header class.
* Contains both the raw header and the raw payload.
* Maintains a pointer to the next header.
*/
public abstract class Header {
BitBuf rawheader;
BitBuf rawpayload;
Header next;
int type;
/** An ICMPv6 Header */
public static final int ICMP6 = 0x3a;
/** An IPv6 Header */
public static final int IP6 = 0x29;
/** An ICMPv4 Header */
public static final int ICMP4 = 0x01;
/** An IPv4 Header */
public static final int IP4 = 0x17;
/** A TCP Header */
public static final int TCP = 0x06;
/** An UDP Header */
public static final int UDP = 0x11;
/** An Extended Hop By Hop Header */
public static final int EXTHOPBYHOP = 0x00;
/** An Extended Routing Header */
public static final int EXTROUTE = 0x2b;
/** An Extended Fragment Header */
public static final int EXTFRAG = 0x2c;
/** An Extended ESP Header */
public static final int EXTESP = 0x32;
/** An Extended AH Header */
public static final int EXTAH = 0x33;
/** An Extended Destination Header */
public static final int EXTDEST = 0x3c;
/** An Unknown Header */
public static final int UNK = 0xFF;
/**
* Base constructor which slices the data into header and payload.
* Creates the next header in this packet.
* @param data BitBuf which represents the raw data of this packet.
*/
Header(BitBuf data) {
rawheader = data;
rawheader = data.slice(0, getHeaderLen());
rawpayload = data.slice(getHeaderLen());
next = getNextHeader();
}
/**
* Creates the correct header based on the input byte.
* @param p the protocol of this header.
* @param data the raw data of this header.
* @return The Header
*/
static Header createHeader(byte p, BitBuf data) {
int protocol = p & 0xFF;
if(data.getBitSize() == 0)
return null;
if (protocol == 0x3a)
return new ICMP6Header(data);
if (protocol == 0x29)
return new IP6Header(data);
if (protocol == 0x01)
return new ICMP4Header(data);
if (protocol == 0x17)
return new IP4Header(data);
if (protocol == 0x06)
return new TCPHeader(data);
if (protocol == 0x11)
return new UDPHeader(data);
// The following are Extension Headers
if (protocol == 0x00)
return new HopByHop(data);
if (protocol == 0x2b)
return new Routing(data);
if (protocol == 0x2c)
return new Fragmentation(data);
if (protocol == 0x32)
return new ESP(data);
if (protocol == 0x33)
return new AH(data);
if (protocol == 0x3b)
return null;
if (protocol == 0x3c)
return new Destination(data);
return new UnknownHeader(data);
}
/**
* Dumps the raw fields from this header.
* return String representing the raw fields of this header.
*/
String fielddump() {
StringWriter out = new StringWriter();
java.lang.reflect.Field[] fieldlist = getClass().getFields();
out.write("Fields from " + getName() + ":\n");
int i;
for (i = 0; i < fieldlist.length; i++) {
// Print the field if it is a Field subtype.
if (Field.class.isAssignableFrom(fieldlist[i].getType())) {
try {
out.write(
"\t" + fieldlist[i].getName() + ": " + fieldlist[i].get(this) + "\n");
} catch (Throwable x) {
out.write("\n\nfielddump: Caught exception: " + x.toString() + "\n");
}
}
}
return out.toString();
}
/**
* Returns the data of this header.
* @return byte[] containing the raw data.
*/
public byte[] getHeaderData() {
return rawheader.getBytes();
}
/**
* Returns the length of this header.
* @return Will always return 0.
*/
public int getHeaderLen() {
return 0;
}
/**
* The name of this header.
* @return The Name
*/
public String getName() {
return this.getClass().getName().substring(this.getClass().getName().lastIndexOf('.')+1);
}
/**
* Returns the next header in this packet.
* @return Will always return null.
*/
public Header getNextHeader() {
return null;
}
/**
* Returns a description of the header along with this header as a hexadecimal string.
* @return String containing this header as a hexadecimal string.
*/
public String printHexHeader() {
String name = getName();
int i;
if((i = name.indexOf("$"))!=-1) {
name = name.substring(i+1);
name += " Header";
}
Object[] args = {name,rawheader.toHexString(32,"\n\t\t\t ")};
return Formatter.jsprintf("\t {0} : {1}\n",args);
}
/**
* Returns this header's raw payload.
* @return byte[] containing this header's raw payload.
*/
public byte[] getPayLoad() {
return rawpayload.getBytes();
}
/**
* Returns the next header as a string.
* @return String the next header.
*/
String printnext() {
if(next == null)
return "";
return next.toString();
}
/**
* Returns the next header as a string.
* @param filter FormatProperties object for filtering of this header.
* @return String the next header.
*/
String printnext(FormatProperties filter) {
if(next == null)
return "";
return next.toString(filter);
}
/**
* Returns a printable representation of this header.
* Without any specific formatting for the particular type of Header.
* @return String this header.
*/
public String toString() {
return fielddump() + printnext();
}
/**
* Returns a printable representation of this header.
* @param filter FormatProperties object for filtering this header.
* @return Returns a string representation of this header.
*/
public String toString(FormatProperties filter) {
return fielddump() + printnext(filter);
}
/**
* Returns this header as a hexadecimal string.
* @return A hexadecimal representation of this header.
*/
public String toHexString() {
return rawheader.toHexString();
}
/**
* Returns this header's payload as a hexadecimal string.
* @return String a hexadecimal representation of this header's payload.
*/
public String getPayloadHexString() {
return rawpayload.toHexString();
}
/**
* Returns this header's payload as a byte array.
* @return byte[] containing this header's raw payload.
*/
public byte[] getPayloadBytes() {
return rawpayload.getBytes();
}
/**
* Returns this header's payload as an ascii and hexadecimal string.
* @return An ascii and hexadecimal representation of this header's payload.
*/
public String getPayload() {
return (new Data(rawpayload)).toString();
}
/**
* Returns this header's type.
* @return This header's type.
*/
public int getType() {
return type;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy