package io.craft.atom.protocol.rpc.model;
import io.craft.atom.util.ByteUtil;
import java.io.Serializable;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* Represents a RPC header field.
* <p>
*
* The RPC header fields use the generic format as follows:
* <pre>
* 000-------------------------------------------------------------------015-------------------------------------------------------------------031
* | magic | header size |
* 032--------------------------------039-----------044----045----046----047--------------------------------055--------------------------------063
* | version | st | hb | ow | rp | status code | reserved |
* 064-----------------------------------------------------------------------------------------------------------------------------------------095
* | message id |
* | |
* 096-----------------------------------------------------------------------------------------------------------------------------------------127
* | body size |
* 128-----------------------------------------------------------------------------------------------------------------------------------------159
*
* st = serialization type.
* hb = heartbeat flag, set '0000 0100' means it is a heatbeat message.
* ow = one way flag, set '0000 0010' means it is one way message, the client doesn't wait for a response.
* rp = response flag, set '0000 0001' means it is response message, otherwise it's a request message.
* </pre>
*
* @author mindwind
* @version 1.0, Jul 18, 2014
*/
@ToString
@EqualsAndHashCode(of = { "magic", "headerSize", "version", "st", "hb", "ow", "rp", "statusCode", "reserved", "id", "bodySize" })
public class RpcHeader implements Serializable {
private static final long serialVersionUID = -67119913240566784L ;
private static final byte ST_MASK = (byte) 0x1f ;
private static final byte HB_MASK = (byte) 0x20 ;
private static final byte OW_MASK = (byte) 0x40 ;
private static final byte RP_MASK = (byte) 0x80 ;
public static final short MAGIC = (short) 0xcaf6 ;
public static final short HEADER_SIZE = (short) 20 ;
public static final byte MAGIC_0 = ByteUtil.short2bytes(MAGIC)[0];
public static final byte MAGIC_1 = ByteUtil.short2bytes(MAGIC)[1];
public static final byte VERSION = (byte) 1 ;
@Getter @Setter private short magic = MAGIC ;
@Getter @Setter private short headerSize = HEADER_SIZE;
@Getter @Setter private byte version = VERSION ;
@Getter private byte st = (byte) 1 ;
@Getter private byte hb = (byte) 0 ;
@Getter private byte ow = (byte) 0 ;
@Getter private byte rp = (byte) 0 ;
@Getter @Setter private byte statusCode = (byte) 0 ;
@Getter @Setter private byte reserved = (byte) 0 ;
@Getter @Setter private long id = (long) 0 ;
@Getter @Setter private int bodySize = (int) 0 ;
public void setSt(byte st) {
this.st = (byte) (st & ST_MASK);
}
public void setHb() {
this.hb = HB_MASK;
}
public void setHb(byte hb) {
this.hb = (byte) (hb & HB_MASK);
}
public boolean isHb() {
return hb == HB_MASK;
}
public void setOw() {
this.ow = OW_MASK;
}
public void setOw(byte ow) {
this.ow = (byte) (ow & OW_MASK);
}
public boolean isOw() {
return ow == OW_MASK;
}
public void setRp() {
this.rp = RP_MASK;
}
public void setRp(byte rp) {
this.rp = (byte) (rp & RP_MASK);
}
public boolean isRp() {
return rp == RP_MASK;
}
}