/** * A static factory method. This method validates the arguments by {@link * ByteArrays#validateBounds(byte[], int, int)}, which may throw exceptions undocumented here. * * @param rawData rawData * @param offset offset * @param length length * @return the singleton instance of TcpNoOperationOption. * @throws IllegalRawDataException if parsing the raw data fails. */ public static TcpNoOperationOption newInstance(byte[] rawData, int offset, int length) throws IllegalRawDataException { ByteArrays.validateBounds(rawData, offset, length); if (rawData[offset] != kind.value()) { StringBuilder sb = new StringBuilder(100); sb.append("The kind must be: ") .append(kind.valueAsString()) .append(" rawData: ") .append(ByteArrays.toHexString(rawData, " ")) .append(", offset: ") .append(offset) .append(", length: ") .append(length); throw new IllegalRawDataException(sb.toString()); } return INSTANCE; }
/** * @param value value * @return a TcpOptionKind object. */ public static TcpOptionKind getInstance(Byte value) { if (registry.containsKey(value)) { return registry.get(value); } else { return new TcpOptionKind(value, "unknown"); } }
@Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!this.getClass().isInstance(obj)) { return false; } UnknownTcpOption other = (UnknownTcpOption) obj; return kind.equals(other.kind) && length == other.length && Arrays.equals(data, other.data); }
/** * @param type type * @return a TcpOptionKind object. */ public static TcpOptionKind register(TcpOptionKind type) { return registry.put(type.value(), type); }
/** * @param type type * @return a class which implements TcpOption for a specified type. */ public Class<? extends TcpOption> getTcpOptionClass(TcpOptionKind type) { StringBuilder sb = new StringBuilder(120); sb.append(TCP_OPTION_CLASS_KEY_BASE) .append(type.getClass().getName()) .append(".") .append(type.valueAsString()); return loader.<TcpOption>getClass(sb.toString(), getUnknownTcpOptionClass()); }
try { while (currentOffsetInHeader < headerLength) { TcpOptionKind kind = TcpOptionKind.getInstance(rawData[currentOffsetInHeader + offset]); TcpOption newOne; newOne = currentOffsetInHeader += newOne.length(); if (newOne.getKind().equals(TcpOptionKind.END_OF_OPTION_LIST)) { break;
@Override public int hashCode() { int result = 17; result = 31 * result + kind.hashCode(); result = 31 * result + Arrays.hashCode(rawData); return result; }
private IllegalTcpOption(byte[] rawData, int offset, int length) { this.kind = TcpOptionKind.getInstance(rawData[offset]); this.rawData = new byte[length]; System.arraycopy(rawData, offset, this.rawData, 0, length); }
/** */ @Override public String valueAsString() { return String.valueOf(value() & 0xFF); } }
/** * @param type type * @return a class which implements TcpOption for a specified type. */ public Class<? extends TcpOption> getTcpOptionClass(TcpOptionKind type) { StringBuilder sb = new StringBuilder(120); sb.append(TCP_OPTION_CLASS_KEY_BASE) .append(type.getClass().getName()) .append(".") .append(type.valueAsString()); return loader.<TcpOption>getClass(sb.toString(), getUnknownTcpOptionClass()); }
try { while (currentOffsetInHeader < headerLength) { TcpOptionKind kind = TcpOptionKind.getInstance(rawData[currentOffsetInHeader + offset]); TcpOption newOne; newOne = currentOffsetInHeader += newOne.length(); if (newOne.getKind().equals(TcpOptionKind.END_OF_OPTION_LIST)) { break;
@Override public int hashCode() { int result = 17; result = 31 * result + kind.hashCode(); result = 31 * result + length; result = 31 * result + Arrays.hashCode(data); return result; }
private UnknownTcpOption(byte[] rawData, int offset, int length) throws IllegalRawDataException { if (length < 2) { StringBuilder sb = new StringBuilder(100); sb.append("The raw data length must be more than 1. rawData: ") .append(ByteArrays.toHexString(rawData, " ")) .append(", offset: ") .append(offset) .append(", length: ") .append(length); throw new IllegalRawDataException(sb.toString()); } this.kind = TcpOptionKind.getInstance(rawData[offset]); this.length = rawData[1 + offset]; if (length < this.length) { StringBuilder sb = new StringBuilder(100); sb.append("The raw data is too short to build this option(") .append(this.length) .append("). data: ") .append(ByteArrays.toHexString(rawData, " ")) .append(", offset: ") .append(offset) .append(", length: ") .append(length); throw new IllegalRawDataException(sb.toString()); } if (this.length > 2) this.data = ByteArrays.getSubArray(rawData, 2 + offset, this.length - 2); else this.data = new byte[] {}; }
/** * A static factory method. This method validates the arguments by {@link * ByteArrays#validateBounds(byte[], int, int)}, which may throw exceptions undocumented here. * * @param rawData rawData * @param offset offset * @param length length * @return the singleton instance of TcpEndOfOptionList. * @throws IllegalRawDataException if parsing the raw data fails. */ public static TcpEndOfOptionList newInstance(byte[] rawData, int offset, int length) throws IllegalRawDataException { ByteArrays.validateBounds(rawData, offset, length); if (rawData[offset] != kind.value()) { StringBuilder sb = new StringBuilder(100); sb.append("The kind must be: ") .append(kind.valueAsString()) .append(" rawData: ") .append(ByteArrays.toHexString(rawData, " ")) .append(", offset: ") .append(offset) .append(", length: ") .append(length); throw new IllegalRawDataException(sb.toString()); } return INSTANCE; }
@Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!this.getClass().isInstance(obj)) { return false; } IllegalTcpOption other = (IllegalTcpOption) obj; return kind.equals(other.kind) && Arrays.equals(other.rawData, rawData); }
@Override public int hashCode() { int result = 17; result = 31 * result + kind.hashCode(); result = 31 * result + length; result = 31 * result + Arrays.hashCode(data); return result; }
private IllegalTcpOption(byte[] rawData, int offset, int length) { this.kind = TcpOptionKind.getInstance(rawData[offset]); this.rawData = new byte[length]; System.arraycopy(rawData, offset, this.rawData, 0, length); }
/** * @param value value * @return a TcpOptionKind object. */ public static TcpOptionKind getInstance(Byte value) { if (registry.containsKey(value)) { return registry.get(value); } else { return new TcpOptionKind(value, "unknown"); } }
private TcpWindowScaleOption(byte[] rawData, int offset, int length) throws IllegalRawDataException { if (length < 3) { StringBuilder sb = new StringBuilder(50); sb.append("The raw data length must be more than 2. rawData: ") .append(ByteArrays.toHexString(rawData, " ")) .append(", offset: ") .append(offset) .append(", length: ") .append(length); throw new IllegalRawDataException(sb.toString()); } if (rawData[offset] != kind.value()) { StringBuilder sb = new StringBuilder(100); sb.append("The kind must be: ") .append(kind.valueAsString()) .append(" rawData: ") .append(ByteArrays.toHexString(rawData, " ")) .append(", offset: ") .append(offset) .append(", length: ") .append(length); throw new IllegalRawDataException(sb.toString()); } this.length = rawData[1 + offset]; if (this.length != 3) { throw new IllegalRawDataException("The value of length field must be 3 but: " + this.length); } this.shiftCount = rawData[2 + offset]; }