[java]
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import org.apache.thrift.ShortStack;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.*;
import org.apache.thrift.transport.TTransport;
public class GBKCompactProtocol extends TProtocol {
private static final TStruct ANONYMOUS_STRUCT = new TStruct("");
private static final TField TSTOP = new TField("", (byte) 0, (short) 0);
private static final byte[] ttypeToCompactType = new byte[16];
private static final byte PROTOCOL_ID = -126;
private static final byte VERSION = 1;
private static final byte VERSION_MASK = 31;
private static final byte TYPE_MASK = -32;
private static final int TYPE_SHIFT_AMOUNT = 5;
private ShortStack lastField_ = new ShortStack(15);
private short lastFieldId_ = 0;
private TField booleanField_ = null;
private Boolean boolValue_ = null;
byte[] i32buf = new byte[5];
byte[] varint64out = new byte[10];
private byte[] byteDirectBuffer = new byte[1];
byte[] byteRawBuf = new byte[1];
public GBKCompactProtocol(TTransport transport) {
super(transport);
}
public void reset() {
this.lastField_.clear();
this.lastFieldId_ = 0;
}
public void writeMessageBegin(TMessage message)
throws TException {
writeByteDirect((byte) -126);
writeByteDirect(0x1 | message.type << 5 & 0xFFFFFFE0);
writeVarint32(message.seqid);
writeString(message.name);
}
public void writeStructBegin(TStruct struct)
throws TException {
this.lastField_.push(this.lastFieldId_);
this.lastFieldId_ = 0;
}
public void writeStructEnd()
throws TException {
this.lastFieldId_ = this.lastField_.pop();
}
public void writeFieldBegin(TField field)
throws TException {
if (field.type == 2) {
this.booleanField_ = field;
} else writeFieldBeginInternal(field, (byte) -1);
}
private void writeFieldBeginInternal(TField field, byte typeOverride)
throws TException {
byte typeToWrite = typeOverride == -1 getCompactType(field.type) : typeOverride;
if ((field.id > this.lastFieldId_) && (field.id - this.lastFieldId_ <= 15)) {
writeByteDirect(field.id - this.lastFieldId_ << 4 | typeToWrite);
} else {
writeByteDirect(typeToWrite);
writeI16(field.id);
}
this.lastFieldId_ = field.id;
}
public void writeFieldStop()
throws TException {
writeByteDirect((byte) 0);
}
public void writeMapBegin(TMap map)
throws TException {
if (map.size == 0) {
writeByteDirect(0);
} else {
writeVarint32(map.size);
writ