package se.sics.gvod.common.msgs; import io.netty.buffer.ByteBuf; import se.sics.gvod.common.UtilityVod; import se.sics.gvod.net.msgs.DirectMsg; import se.sics.gvod.net.util.UserTypesDecoderFactory; import se.sics.gvod.timer.TimeoutId; import se.sics.gvod.timer.UUID; public class DataMsgFactory { public static class Request extends DirectMsgNettyFactory.Request { private Request() { } public static DataMsg.Request fromBuffer(ByteBuf buffer) throws MessageDecodingException { return (DataMsg.Request) new DataMsgFactory.Request().decode(buffer); } @Override protected DataMsg.Request process(ByteBuf buffer) throws MessageDecodingException { TimeoutId ackId = new UUID(buffer.readInt()); int piece = buffer.readInt(); int subpiece = buffer.readInt(); long delay = buffer.readLong(); return new DataMsg.Request(vodSrc, vodDest, ackId, piece, subpiece, delay); } } public static class Response extends DirectMsgNettyFactory.Response { private Response() { } public static DataMsg.Response fromBuffer(ByteBuf buffer) throws MessageDecodingException { return (DataMsg.Response) new DataMsgFactory.Response().decode(buffer); } @Override protected DataMsg.Response process(ByteBuf buffer) throws MessageDecodingException { // TimeoutId ack = UserTypesDecoderFactory.readTimeoutId(buffer); TimeoutId ack = new UUID(buffer.readInt()); byte[] sp = UserTypesDecoderFactory.readArrayBytes(buffer); int nb = buffer.readInt(); int p = buffer.readInt(); int cwSz = buffer.readInt(); long t = buffer.readLong(); return new DataMsg.Response(vodSrc, vodDest, timeoutId, ack, sp, nb, p, cwSz, t); } } public static class PieceNotAvailable extends DirectMsgNettyFactory.Oneway { private PieceNotAvailable() { } public static DataMsg.PieceNotAvailable fromBuffer(ByteBuf buffer) throws MessageDecodingException { return (DataMsg.PieceNotAvailable) new DataMsgFactory.PieceNotAvailable().decode(buffer); } @Override protected DataMsg.PieceNotAvailable process(ByteBuf buffer) throws MessageDecodingException { byte[] availableChunks = UserTypesDecoderFactory.readArrayBytes(buffer); UtilityVod utility = (UtilityVod) UserTypesDecoderFactory.readUtility(buffer); int piece = buffer.readInt(); byte[][] availablePieces = UserTypesDecoderFactory.readArrayArrayBytes(buffer); return new DataMsg.PieceNotAvailable(vodSrc, vodDest, availableChunks, utility, piece, availablePieces); } } public static class Saturated extends DirectMsgNettyFactory.Oneway { private Saturated() { } public static DataMsg.Saturated fromBuffer(ByteBuf buffer) throws MessageDecodingException { return (DataMsg.Saturated) new DataMsgFactory.Saturated().decode(buffer); } @Override protected DataMsg.Saturated process(ByteBuf buffer) throws MessageDecodingException { int subpiece = buffer.readInt(); int comWindowSize = buffer.readInt(); return new DataMsg.Saturated(vodSrc, vodDest, subpiece, comWindowSize); } } public static class HashRequest extends DirectMsgNettyFactory.Request { private HashRequest() { } public static DataMsg.HashRequest fromBuffer(ByteBuf buffer) throws MessageDecodingException { return (DataMsg.HashRequest) new DataMsgFactory.HashRequest().decode(buffer); } @Override protected DataMsg.HashRequest process(ByteBuf buffer) throws MessageDecodingException { int chunk = UserTypesDecoderFactory.readUnsignedIntAsTwoBytes(buffer); int part = UserTypesDecoderFactory.readUnsignedIntAsOneByte(buffer); return new DataMsg.HashRequest(vodSrc, vodDest, chunk, part); } } public static class HashResponse extends DirectMsgNettyFactory.Response { private HashResponse() { } public static DataMsg.HashResponse fromBuffer(ByteBuf buffer) throws MessageDecodingException { return (DataMsg.HashResponse) new DataMsgFactory.HashResponse().decode(buffer); } @Override protected DataMsg.HashResponse process(ByteBuf buffer) throws MessageDecodingException { int chunk = UserTypesDecoderFactory.readUnsignedIntAsTwoBytes(buffer); byte[] hashes = UserTypesDecoderFactory.readArrayBytes(buffer); int part = UserTypesDecoderFactory.readUnsignedIntAsOneByte(buffer); int numParts = UserTypesDecoderFactory.readUnsignedIntAsOneByte(buffer); return new DataMsg.HashResponse(vodSrc, vodDest, timeoutId, chunk, hashes, part, numParts); } } public static class Ack extends DirectMsgNettyFactory.Response { private Ack() { } public static DataMsg.Ack fromBuffer(ByteBuf buffer) throws MessageDecodingException { return (DataMsg.Ack) new DataMsgFactory.Ack().decode(buffer); } @Override protected DataMsg.Ack process(ByteBuf buffer) throws MessageDecodingException { long delay = buffer.readLong(); return new DataMsg.Ack(vodSrc, vodDest, timeoutId, delay); } } };