diff --git a/examples/AddressbookMain.java b/examples/AddressbookMain.java index 5fb9c3b..bb41c29 100644 --- a/examples/AddressbookMain.java +++ b/examples/AddressbookMain.java @@ -6,14 +6,49 @@ public class AddressbookMain { } public static void printAddressBook() throws java.io.IOException { - System.out.println("printing addressbook ..."); capnp.MessageReader message = capnp.InputStreamMessageReader.create(System.in); Addressbook.AddressBook.Reader addressbook = message.getRoot(Addressbook.AddressBook.Reader.factory); capnp.StructList.Reader people = addressbook.getPeople(); int size = people.size(); for(int ii = 0; ii < size; ++ii) { Addressbook.Person.Reader person = people.get(ii); - System.out.println(person.getName().toString() + ": "); + System.out.println(person.getName().toString() + ": " + person.getEmail().toString()); + + capnp.StructList.Reader phones = person.getPhones(); + for (int jj = 0; jj < phones.size(); ++jj) { + Addressbook.Person.PhoneNumber.Reader phone = phones.get(jj); + String typeName = "UNKNOWN"; + switch (phone.getType()) { + case MOBILE : + typeName = "mobile"; + break; + case HOME : + typeName = "home"; + break; + case WORK : + typeName = "work"; + break; + } + System.out.println(" " + typeName + " phone: " + phone.getNumber().toString()); + } + + Addressbook.Person.Employment.Reader employment = person.getEmployment(); + switch (employment.which()) { + case UNEMPLOYED : + System.out.println(" unemployed"); + break; + case EMPLOYER : + System.out.println(" employer: " + employment.getEmployer().toString()); + break; + case SCHOOL : + System.out.println(" student at: " + employment.getSchool().toString()); + break; + case SELF_EMPLOYED: + System.out.println(" self-employed"); + break; + default : + break; + } } } diff --git a/src/capnp/Text.java b/src/capnp/Text.java index 273dce2..c75e0a8 100644 --- a/src/capnp/Text.java +++ b/src/capnp/Text.java @@ -9,15 +9,20 @@ public class Text { public final int offset; // in bytes public final int size; // in bytes - public Reader(ListPointer ptr) { - this.buffer = ptr.ptr.buffer; - this.offset = ptr.ptr.buffer_offset * 8; - this.size = ptr.elementCount(); + public Reader(WordPointer ptr, int size) { + this.buffer = ptr.buffer; + this.offset = ptr.offset * 8; + this.size = size; } public String toString() { byte[] bytes = new byte[this.size]; - buffer.get(bytes, this.offset, this.size); + + // why is there no absolute get() method on ByteArray? + for (int ii = 0; ii < this.size; ++ii) { + bytes[ii] = this.buffer.get(this.offset + ii); + } + try { return new String(bytes, "UTF-8"); } catch(java.io.UnsupportedEncodingException e) { diff --git a/src/capnp/WireHelpers.java b/src/capnp/WireHelpers.java index e9244fb..cd7cb6c 100644 --- a/src/capnp/WireHelpers.java +++ b/src/capnp/WireHelpers.java @@ -72,6 +72,7 @@ class WireHelpers { WirePointer ref) { WordPointer ptr = ref.target(); ListPointer listPtr = new ListPointer(ref); - return new Text.Reader(listPtr); + int size = listPtr.elementCount(); + return new Text.Reader(ptr, size); } }