package org.glukit.dexcom.sync.requests; import com.google.common.base.Throwables; import com.google.inject.Inject; import org.glukit.dexcom.sync.DataOutputFactory; import org.glukit.dexcom.sync.model.ReceiverCommand; import java.io.ByteArrayOutputStream; import java.io.DataOutput; import java.io.IOException; import java.nio.ByteBuffer; import static org.glukit.dexcom.sync.DecodingUtils.getCrc16; /** * Base request class. * @author alexandre.normand */ public abstract class BaseCommand implements Command { protected DataOutputFactory dataOutputFactory; @Inject protected BaseCommand(DataOutputFactory dataOutputFactory) { this.dataOutputFactory = dataOutputFactory; } @Override public ByteBuffer asByteBuffer() { return ByteBuffer.wrap(asBytes()); } @Override public byte[] asBytes() { try { // Order is: SizeOfField, Size of packet, command id, and crc16 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(getSize()); DataOutput output = this.dataOutputFactory.create(outputStream); output.write(getSizeOfField()); output.writeShort(getSize()); output.write(getCommand().getId()); output.write(getContent()); int contentSize = outputStream.size(); output.writeShort(getCrc16(outputStream.toByteArray(), 0, contentSize)); return outputStream.toByteArray(); } catch (IOException e) { throw Throwables.propagate(e); } } protected abstract byte[] getContent(); public abstract ReceiverCommand getCommand(); public byte getSizeOfField() { return 1; } public short getSize() { return (short) (6 + getContent().length); } }