package me.xcoding.opencdc.mysql.protocol; /** * * @author Teny Zh(zh.Teny.1@gmail.com) * FIXME 当 buffer超出 8192bytes 时,怎么办? -- 满则flush() */ public abstract class WritablePcaket implements BasicWriter { protected final byte[] buffer = new byte[8192]; protected int end = 8192; protected int offset = 4; @Override public void writeBytesVarLen(byte[] value) { int v = value.length; buffer[offset++] = (byte) (v & FF); if(v > 256) { buffer[offset++] = (byte) ((v >> 8) & FF); } if(v > 0x00FFFFFF) { buffer[offset++] = (byte) ((v >> 16) & FF); } assert !(v > 0x00FFFF); System.arraycopy(value, 0, buffer, offset, v); offset += v; } @Override public void writeBytesTermNul(byte[] value) { System.arraycopy(value, 0, buffer, offset, value.length); offset += value.length; buffer[offset++] = 0; } @Override public void writeBytesLenEnc(byte[] value) { int v = value.length; if(v < 0x000000FB) { buffer[offset++] = (byte) (v & FF); } else if(v < 0x00FC0000) { buffer[offset++] = (byte) 0xFC; buffer[offset++] = (byte) (v & FF); buffer[offset++] = (byte) ((v >> 8) & FF); } else if(v < 0xFD000000) { // FIXME buffer[offset++] = (byte) 0xFD; buffer[offset++] = (byte) (v & FF); buffer[offset++] = (byte) ((v >> 8) & FF); buffer[offset++] = (byte) ((v >> 16) & FF); } System.arraycopy(value, 0, buffer, offset++, v); offset += v; } @Override public void writeFixLenIntT1(int value) { buffer[offset++] = (byte) (value & FF); } @Override public void writeFixLenIntT2(int value) { buffer[offset++] = (byte) (value & FF); buffer[offset++] = (byte) ((value >> 8) & FF); } @Override public void writeFixLenIntT3(int value) { buffer[offset++] = (byte) (value & FF); buffer[offset++] = (byte) ((value >> 8) & FF); buffer[offset++] = (byte) ((value >> 16) & FF); } @Override public void writeFixLenIntT4(int value) { buffer[offset++] = (byte) (value & FF); buffer[offset++] = (byte) ((value >> 8) & FF); buffer[offset++] = (byte) ((value >> 16) & FF); buffer[offset++] = (byte) ((value >> 24) & FF); } @Override public void writeFixLenIntT6(long value) { int v1 = (int) (value & 0x00FFFFFF); int v2 = (int) (value >> 24) & 0x00FFFFFF; buffer[offset++] = (byte) (v1 & FF); buffer[offset++] = (byte) ((v1 >> 8) & FF); buffer[offset++] = (byte) ((v1 >> 16) & FF); buffer[offset++] = (byte) (v2 & FF); buffer[offset++] = (byte) ((v2 >> 8) & FF); buffer[offset++] = (byte) ((v2 >> 16) & FF); } @Override public void writeFixLenIntT8(long value) { int v1 = (int) (value & 0xFFFFFFFF); int v2 = (int) (value >> 32) & 0xFFFFFFFF; buffer[offset++] = (byte) (v1 & FF); buffer[offset++] = (byte) ((v1 >> 8) & FF); buffer[offset++] = (byte) ((v1 >> 16) & FF); buffer[offset++] = (byte) ((value >> 24) & FF); buffer[offset++] = (byte) (v2 & FF); buffer[offset++] = (byte) ((v2 >> 8) & FF); buffer[offset++] = (byte) ((v2 >> 16) & FF); buffer[offset++] = (byte) ((value >> 24) & FF); } @Override public void writeBytes(byte[] value) { System.arraycopy(value, 0, buffer, offset, value.length); offset += value.length; } @Override public void writeBytes(byte[] value, int length) { System.arraycopy(value, 0, buffer, offset, length); offset += length; } @Override public void writeBytes(byte[] value, int offset, int length) { System.arraycopy(value, offset, buffer, this.offset, length); this.offset += length; } public void setSequence(int sequence) { buffer[3] = (byte) (sequence & FF); } }