package me.xcoding.opencdc.mysql.protocol; import java.io.InputStream; import me.xcoding.opencdc.mysql.protocol.BasicReader; public abstract class ReadablePacket extends InputStream implements BasicReader { /** FIXME Splits the data into packets of size (224–1) bytes */ protected final byte[] buffer; //new byte[16 << 20]; protected int offset = 0; protected int end = 4; // FIXME public ReadablePacket(int batchSize) { this.buffer = new byte[batchSize]; } @Override public int readVarLenInt(int length) { int v = 0; for(int i=0; i<length; i++) { v |= ((buffer[offset++] & FF) << (i << 3)); } return v; } @Override public int readVarLenIntS(int length) { if(length == 0) { return 0; } int v = 0; for(int i=1; i<length; i++) { v = (v << 8) | (buffer[offset++] & FF); } v = (v << 8) | buffer[offset++]; return v; } @Override public int readVarLenIntU(int length) { int v = 0; for(int i=0; i<length; i++) { v = (v << 8) | (buffer[offset++] & FF); } return v; } @Override public long readVarLenLongS(int length) { if(length < 1) return 0; long v = 0; for(int i=1; i<length; i++) { v = (v << 8) | (buffer[offset++] & FF); } v = (v << 8) | buffer[offset++]; return v; } @Override public long readVarLenLongU(int length) { long v = 0; for(int i=0; i<length; i++) { System.out.print(Integer.toHexString(buffer[offset] & FF) + " "); v = (v << 8) | (buffer[offset++] & FF); } return v; } @Override public int readFixedIntT1() { return (buffer[offset++] & FF); } @Override public int readFixedIntS1() { return buffer[offset++]; } @Override public int readFixedIntT2() { return (buffer[offset++] & FF) | ((buffer[offset++] & FF) << 8); } @Override public int readFixedIntS2() { return (buffer[offset++] & FF) | ((buffer[offset++]) << 8); } @Override public int readFixedIntT3() { return (buffer[offset++] & FF) | ((buffer[offset++] & FF) << 8) | ((buffer[offset++] & FF) << 16); } @Override public int readFixedIntS3() { return (buffer[offset++] & FF) | ((buffer[offset++] & FF) << 8) | ((buffer[offset++]) << 16); } @Override public int readFixedIntT4() { return (buffer[offset++] & FF) | ((buffer[offset++] & FF) << 8) | ((buffer[offset++] & FF) << 16) | ((buffer[offset++] & FF) << 24); } @Override public long readFixedIntT6() { int v1 = (buffer[offset++] & FF) | ((buffer[offset++] & FF) << 8) | ((buffer[offset++] & FF) << 16); int v2 = (buffer[offset++] & FF) | ((buffer[offset++] & FF) << 8) | ((buffer[offset++] & FF) << 16); return v1 | (v2 << 24); } @Override public long readFixedIntS6() { int v1 = (buffer[offset++] & FF) | ((buffer[offset++] & FF) << 8) | ((buffer[offset++] & FF) << 16); int v2 = (buffer[offset++] & FF) | ((buffer[offset++] & FF) << 8) | ((buffer[offset++]) << 16); return v1 | (v2 << 24); } @Override public long readFixedIntT8() { int v1 = (buffer[offset++] & FF) | ((buffer[offset++] & FF) << 8) | ((buffer[offset++] & FF) << 16) | ((buffer[offset++] & FF) << 24); int v2 = (buffer[offset++] & FF) | ((buffer[offset++] & FF) << 8) | ((buffer[offset++] & FF) << 16) | ((buffer[offset++] & FF) << 24); return v1 | (v2 << 32); } @Override public long readLenEncInt() { int type = buffer[offset++] & FF; if(type < 0xFB) { return type; } else if(type < 0xFC) { return (buffer[offset++] & FF) | ((buffer[offset++] & FF) << 8); } else if(type < 0xFD) { return (buffer[offset++] & FF) | ((buffer[offset++] & FF) << 8) | ((buffer[offset++] & FF) << 16); } else if(type < 0xFE) { return this.readFixedIntT8(); } else { return -1; } } @Override public String readStringLenEnc() { int len = (int) readLenEncInt(); return readStringVarLen(len); } @Override public String readStringNull() { int start = offset; while(buffer[++offset] != 0); int l = offset - start; byte[] b = new byte[l]; System.arraycopy(buffer, start, b, 0, l); offset++; return new String(b); } @Override // FIXME EOF public String readStringEOF() { int len = end - offset; byte[] b = new byte[len]; System.arraycopy(buffer, offset, b, 0, len); offset = end; return new String(b); } @Override public String readStringFixLen(int length) { byte[] b = new byte[length]; System.arraycopy(buffer, offset, b, 0, length); offset = offset + length; return new String(b); } @Override public String readStringVarLen(int length) { byte[] b = new byte[length]; System.arraycopy(buffer, offset, b, 0, length); offset = offset + length; return new String(b); } @Override public byte[] readBytesEOF() { int len = end - offset; System.out.println("ReadablePacket.readBytesEOF()" + (end - offset)); byte[] b = new byte[len]; System.arraycopy(buffer, offset, b, 0, len); offset = end; return b; } @Override public byte[] readBytesNull() { int start = offset; while(buffer[++offset] != 0); int l = offset - start; byte[] b = new byte[l]; System.arraycopy(buffer, start, b, 0, l); offset++; return b; } @Override public byte[] readBytesLenEnc() { int len = (int) this.readLenEncInt(); byte[] b = new byte[len]; System.arraycopy(buffer, offset, b, 0, len); offset = offset + len; return b; } @Override public byte[] readBytesVarLen(int length) { byte[] b = new byte[length]; System.arraycopy(buffer, offset, b, 0, length); offset = offset + length; return b; } @Override public int skip(int off) { return offset += off; } }