use of net.morimekta.util.io.BigEndianBinaryWriter in project providence by morimekta.
the class BinaryFormatUtils method writeMessage.
// --- WRITE METHODS ---
/**
* Write message to writer.
*
* @param writer The binary writer.
* @param message The message to write.
* @param <Message> The message type.
* @param <Field> The field type.
* @return The number of bytes written.
* @throws IOException If write failed.
*/
public static <Message extends PMessage<Message, Field>, Field extends PField> int writeMessage(BigEndianBinaryWriter writer, Message message) throws IOException {
if (message instanceof BinaryWriter) {
return ((BinaryWriter) message).writeBinary(writer);
}
int len = 0;
if (message instanceof PUnion) {
if (((PUnion) message).unionFieldIsSet()) {
PField field = ((PUnion) message).unionField();
len += writeFieldSpec(writer, forType(field.getDescriptor().getType()), field.getId());
len += writeFieldValue(writer, message.get(field.getId()), field.getDescriptor());
}
} else {
for (PField field : message.descriptor().getFields()) {
if (message.has(field.getId())) {
len += writeFieldSpec(writer, forType(field.getDescriptor().getType()), field.getId());
len += writeFieldValue(writer, message.get(field.getId()), field.getDescriptor());
}
}
}
len += writer.writeUInt8(BinaryType.STOP);
return len;
}
use of net.morimekta.util.io.BigEndianBinaryWriter in project providence by morimekta.
the class BinarySerializerTest method setUp.
@Before
public void setUp() throws IOException {
synchronized (SerializerTest.class) {
// Since these are immutable, we don't need to read for each test.
if (containers == null) {
containers = ProvidenceHelper.arrayListFromJsonResource("/compat/compact.json", Containers.kDescriptor);
}
}
json = new JsonSerializer();
lenient = new BinarySerializer(false);
strict = new BinarySerializer(true);
unversioned = new BinarySerializer(false, false);
tmp = new ByteArrayOutputStream();
writer = new BigEndianBinaryWriter(tmp);
random = new Random();
}
use of net.morimekta.util.io.BigEndianBinaryWriter in project providence by morimekta.
the class BinarySerializerTest method bytes.
private byte[] bytes(Object... values) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BigEndianBinaryWriter writer = new BigEndianBinaryWriter(baos);
for (Object o : values) {
if (o instanceof Byte) {
writer.writeByte((Byte) o);
} else if (o instanceof Short) {
writer.writeShort((Short) o);
} else if (o instanceof Integer) {
writer.writeInt((Integer) o);
} else if (o instanceof Long) {
writer.writeLong((Long) o);
} else if (o instanceof Double) {
writer.writeDouble((Double) o);
} else {
throw new IllegalArgumentException("");
}
}
return baos.toByteArray();
}
use of net.morimekta.util.io.BigEndianBinaryWriter in project providence by morimekta.
the class BinarySerializer method serialize.
@Override
public <Message extends PMessage<Message, Field>, Field extends PField> int serialize(@Nonnull OutputStream os, @Nonnull PServiceCall<Message, Field> call) throws IOException {
BigEndianBinaryWriter out = new BigEndianBinaryWriter(os);
byte[] method = call.getMethod().getBytes(UTF_8);
int len = method.length;
if (versioned) {
len += out.writeInt(VERSION_1 | call.getType().asInteger());
len += out.writeInt(method.length);
out.write(method);
} else {
len += out.writeInt(method.length);
out.write(method);
len += out.writeByte((byte) call.getType().asInteger());
}
len += out.writeInt(call.getSequence());
len += writeMessage(out, call.getMessage());
return len;
}
use of net.morimekta.util.io.BigEndianBinaryWriter in project providence by morimekta.
the class FramedBufferOutputStream method completeFrame.
/**
* Write the frame at the current state, and reset the buffer to be able to
* generate a new frame.
*
* @throws IOException On failed write.
*/
public void completeFrame() throws IOException {
int frameSize = buffer.position();
if (frameSize > 0) {
frameSizeBuffer.rewind();
try (ByteBufferOutputStream bos = new ByteBufferOutputStream(frameSizeBuffer);
BinaryWriter writer = new BigEndianBinaryWriter(bos)) {
writer.writeInt(frameSize);
bos.flush();
}
frameSizeBuffer.flip();
buffer.flip();
synchronized (out) {
out.write(frameSizeBuffer);
while (buffer.hasRemaining()) {
out.write(buffer);
}
}
buffer.rewind();
buffer.limit(buffer.capacity());
}
}
Aggregations