package serializers.capnproto;
import org.capnproto.*;
import serializers.*;
import serializers.capnproto.media.*;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class CapNProto {
public static void register(TestGroups groups) {
groups.media.add(JavaBuiltIn.mediaTransformer, new CPSerializer(),
new SerFeatures(
SerFormat.BIN_CROSSLANG,
SerGraph.FLAT_TREE,
SerClass.CLASSES_KNOWN,
""
)
);
}
static final class CPSerializer extends Serializer<data.media.MediaContent> {
//MessageBuilder message = new MessageBuilder();//TODO: no reset!?
ArrayOutputStream os;
public CPSerializer() {
os = new ArrayOutputStream(ByteBuffer.allocate(1024));
os.buf.order(ByteOrder.LITTLE_ENDIAN);
}
public String getName() { return "capnproto"; }
@Override
public data.media.MediaContent deserialize (byte[] array) throws Exception {
MessageReader message = Serialize.read(ByteBuffer.wrap(array));
Mediacontent.MediaContent.Reader mc = message.getRoot(Mediacontent.MediaContent.factory);
return reverse(mc);
}
@Override
public byte[] serialize(data.media.MediaContent content) throws Exception {
MessageBuilder message = new MessageBuilder();
Mediacontent.MediaContent.Builder builder = message.initRoot(Mediacontent.MediaContent.factory);
forward(content, builder);
os.buf.rewind();
Serialize.write(os, message);
return Arrays.copyOf(os.buf.array(), os.buf.position());
}
public void forward(data.media.MediaContent mc, Mediacontent.MediaContent.Builder builder) {
forwardMedia(mc.media, builder.initMedia());
StructList.Builder<Mediacontent.Image.Builder> images = builder.initImages(mc.images.size());
for (int i = 0; i < mc.images.size(); i++) {
forwardImage(mc.images.get(i), images.get(i));
}
}
private void forwardMedia(data.media.Media media, Mediacontent.Media.Builder builder) {
builder.setUri(media.uri);
if (media.title != null) builder.setTitle(media.title);
builder.setWidth(media.width);
builder.setHeight(media.height);
builder.setFormat(media.format);
builder.setDuration(media.duration);
builder.setSize(media.size);
builder.setBitrate(media.bitrate);
TextList.Builder persons = builder.initPersons(media.persons.size());
for (int i = 0; i < media.persons.size(); i++) {
persons.set(i, new Text.Reader(media.persons.get(i)));
}
builder.setPlayer(forwardPlayer(media.player));
if (media.copyright != null) builder.setCopyright(media.copyright);
}
public Mediacontent.Media.Player forwardPlayer(data.media.Media.Player p) {
switch (p) {
case JAVA: return Mediacontent.Media.Player.JAVA;
case FLASH: return Mediacontent.Media.Player.FLASH;
default:
throw new AssertionError("invalid case: " + p);
}
}
private void forwardImage(data.media.Image image, Mediacontent.Image.Builder builder) {
builder.setUri(image.uri);
if (image.title != null) builder.setTitle(image.title);
builder.setWidth(image.width);
builder.setHeight(image.height);
builder.setSize(forwardSize(image.size));
}
public Mediacontent.Image.Size forwardSize(data.media.Image.Size s) {
switch (s) {
case SMALL: return Mediacontent.Image.Size.SMALL;
case LARGE: return Mediacontent.Image.Size.LARGE;
default:
throw new AssertionError("invalid case: " + s);
}
}
public data.media.MediaContent reverse(Mediacontent.MediaContent.Reader reader) {
data.media.Media media = reverseMedia(reader.getMedia());
StructList.Reader<Mediacontent.Image.Reader> images = reader.getImages();
List<data.media.Image> list = new ArrayList<>(images.size());
for (int i = 0; i < images.size(); i++) {
list.add(reverseImage(images.get(i)));
}
return new data.media.MediaContent(media, list);
}
private data.media.Media reverseMedia(Mediacontent.Media.Reader media) {
return new data.media.Media(
media.getUri().toString(),
media.hasTitle() ? media.getTitle().toString() : null,
media.getWidth(),
media.getHeight(),
media.getFormat().toString(),
media.getDuration(),
media.getSize(),
media.getBitrate(),
media.getBitrate() != 0,
reversePersons(media.getPersons()),
reversePlayer(media.getPlayer()),
media.hasCopyright() ? media.getCopyright().toString() : null
);
}
public data.media.Media.Player reversePlayer(Mediacontent.Media.Player p) {
switch (p) {
case JAVA: return data.media.Media.Player.JAVA;
case FLASH: return data.media.Media.Player.FLASH;
default:
throw new AssertionError("invalid case: " + p);
}
}
private List<String> reversePersons(TextList.Reader reader) {
List<String> result = new ArrayList<>(reader.size());
for(int i = 0; i < reader.size(); i++) {
result.add(reader.get(i).toString());
}
return result;
}
private data.media.Image reverseImage(Mediacontent.Image.Reader reader) {
return new data.media.Image(
reader.getUri().toString(),
reader.hasTitle() ? reader.getTitle().toString() : null,
reader.getWidth(),
reader.getHeight(),
reverseSize(reader.getSize()));
}
public data.media.Image.Size reverseSize(Mediacontent.Image.Size s) {
switch (s) {
case SMALL: return data.media.Image.Size.SMALL;
case LARGE: return data.media.Image.Size.LARGE;
default:
throw new AssertionError("invalid case: " + s);
}
}
public data.media.MediaContent shallowReverse(Mediacontent.MediaContent.Reader mc) {
return new data.media.MediaContent(reverseMedia(mc.getMedia()), Collections.<data.media.Image>emptyList());
}
}
}