Search in sources :

Example 1 with BigEndianBinaryWriter

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;
}
Also used : PField(net.morimekta.providence.descriptor.PField) BigEndianBinaryWriter(net.morimekta.util.io.BigEndianBinaryWriter) PUnion(net.morimekta.providence.PUnion)

Example 2 with BigEndianBinaryWriter

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();
}
Also used : Random(java.util.Random) BigEndianBinaryWriter(net.morimekta.util.io.BigEndianBinaryWriter) ByteArrayOutputStream(java.io.ByteArrayOutputStream) Before(org.junit.Before)

Example 3 with BigEndianBinaryWriter

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();
}
Also used : BigEndianBinaryWriter(net.morimekta.util.io.BigEndianBinaryWriter) ByteArrayOutputStream(java.io.ByteArrayOutputStream)

Example 4 with BigEndianBinaryWriter

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;
}
Also used : BigEndianBinaryWriter(net.morimekta.util.io.BigEndianBinaryWriter)

Example 5 with BigEndianBinaryWriter

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());
    }
}
Also used : ByteBufferOutputStream(net.morimekta.util.io.ByteBufferOutputStream) BigEndianBinaryWriter(net.morimekta.util.io.BigEndianBinaryWriter) BinaryWriter(net.morimekta.util.io.BinaryWriter) BigEndianBinaryWriter(net.morimekta.util.io.BigEndianBinaryWriter)

Aggregations

BigEndianBinaryWriter (net.morimekta.util.io.BigEndianBinaryWriter)5 ByteArrayOutputStream (java.io.ByteArrayOutputStream)2 Random (java.util.Random)1 PUnion (net.morimekta.providence.PUnion)1 PField (net.morimekta.providence.descriptor.PField)1 BinaryWriter (net.morimekta.util.io.BinaryWriter)1 ByteBufferOutputStream (net.morimekta.util.io.ByteBufferOutputStream)1 Before (org.junit.Before)1