From 22a54fceaf0a9b7d024f4160de700751ca4ae4c6 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Sat, 24 May 2014 14:33:25 -0400 Subject: [PATCH] write some bytes to stdout. the bytes are wrong --- .../org/capnproto/examples/AddressbookMain.java | 14 +++++++++++--- .../src/main/java/org/capnproto/BuilderArena.java | 14 ++++++++++++-- .../main/java/org/capnproto/MessageBuilder.java | 4 +++- .../main/java/org/capnproto/SegmentBuilder.java | 2 +- .../src/main/java/org/capnproto/SegmentReader.java | 2 ++ 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/examples/src/main/java/org/capnproto/examples/AddressbookMain.java b/examples/src/main/java/org/capnproto/examples/AddressbookMain.java index 13bb43f..1e2ea88 100644 --- a/examples/src/main/java/org/capnproto/examples/AddressbookMain.java +++ b/examples/src/main/java/org/capnproto/examples/AddressbookMain.java @@ -1,17 +1,22 @@ package org.capnproto.examples; +import java.io.FileOutputStream; +import java.io.FileDescriptor; + import org.capnproto.MessageBuilder; import org.capnproto.MessageReader; -import org.capnproto.StructList; import org.capnproto.InputStreamMessageReader; +import org.capnproto.Serialize; +import org.capnproto.StructList; import org.capnproto.Text; import org.capnproto.examples.Addressbook.*; public class AddressbookMain { - public static void writeAddressBook() { - System.out.println("WARNING: writing is not yet fully implemented"); + public static void writeAddressBook() throws java.io.IOException { + System.err.println("WARNING: writing is not yet fully implemented"); + MessageBuilder message = new MessageBuilder(); AddressBook.Builder addressbook = message.initRoot(AddressBook.Builder.factory); StructList.Builder people = addressbook.initPeople(2); @@ -36,6 +41,9 @@ public class AddressbookMain { bobPhones.get(1).setNumber(new Text.Reader("555-7654")); bobPhones.get(1).setType(Person.PhoneNumber.Type.WORK); bob.getEmployment().setUnemployed(); + + Serialize.writeMessage((new FileOutputStream(FileDescriptor.out)).getChannel(), + message); } public static void printAddressBook() throws java.io.IOException { diff --git a/runtime/src/main/java/org/capnproto/BuilderArena.java b/runtime/src/main/java/org/capnproto/BuilderArena.java index 77f7fd7..ccfeb23 100644 --- a/runtime/src/main/java/org/capnproto/BuilderArena.java +++ b/runtime/src/main/java/org/capnproto/BuilderArena.java @@ -5,6 +5,8 @@ import java.nio.ByteOrder; import java.util.Vector; public final class BuilderArena implements Arena { + + // Maybe this should be ArrayList? public final Vector segments; public BuilderArena() { @@ -34,7 +36,15 @@ public final class BuilderArena implements Arena { throw new Error("unimplemented"); } - public final Vector getSegmentsForOutput() { - throw new Error(); + public final ByteBuffer[] getSegmentsForOutput() { + ByteBuffer[] result = new ByteBuffer[this.segments.size()]; + for (int ii = 0; ii < this.segments.size(); ++ii) { + SegmentBuilder segment = segments.get(ii); + segment.buffer.reset(); + ByteBuffer slice = segment.buffer.slice(); + slice.limit(segment.currentSize() * 8); + result[ii] = slice; + } + return result; } } diff --git a/runtime/src/main/java/org/capnproto/MessageBuilder.java b/runtime/src/main/java/org/capnproto/MessageBuilder.java index 347f59c..fa9f172 100644 --- a/runtime/src/main/java/org/capnproto/MessageBuilder.java +++ b/runtime/src/main/java/org/capnproto/MessageBuilder.java @@ -23,5 +23,7 @@ public final class MessageBuilder { return ptr.initAsStruct(factory); } - //public final getSegmentsForOutput() + public final java.nio.ByteBuffer[] getSegmentsForOutput() { + return this.arena.getSegmentsForOutput(); + } } diff --git a/runtime/src/main/java/org/capnproto/SegmentBuilder.java b/runtime/src/main/java/org/capnproto/SegmentBuilder.java index 3d19d6d..5b87aff 100644 --- a/runtime/src/main/java/org/capnproto/SegmentBuilder.java +++ b/runtime/src/main/java/org/capnproto/SegmentBuilder.java @@ -18,7 +18,7 @@ public final class SegmentBuilder extends SegmentReader { } // return how many words have already been allocated - private final int currentSize() { + public final int currentSize() { return this.pos; } diff --git a/runtime/src/main/java/org/capnproto/SegmentReader.java b/runtime/src/main/java/org/capnproto/SegmentReader.java index c55aafb..fcf5d3a 100644 --- a/runtime/src/main/java/org/capnproto/SegmentReader.java +++ b/runtime/src/main/java/org/capnproto/SegmentReader.java @@ -3,6 +3,8 @@ package org.capnproto; import java.nio.ByteBuffer; public class SegmentReader { + + // invariant: buffer's mark is at its beginning. final ByteBuffer buffer; public SegmentReader(ByteBuffer buffer) {