/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package se.sics.gvod.common.msgs;
import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import java.util.List;
import se.sics.gvod.net.VodAddress;
import se.sics.gvod.common.UtilityVod;
import se.sics.gvod.net.VodMsgFrameDecoder;
import se.sics.gvod.net.msgs.RewriteableMsg;
import se.sics.gvod.net.util.UserTypesEncoderFactory;
import se.sics.gvod.timer.ScheduleTimeout;
import se.sics.gvod.timer.Timeout;
import se.sics.gvod.timer.TimeoutId;
/**
*
* @author jdowling
*/
public class ReferencesMsg {
public static class Request extends DirectMsgNetty.Request {
private final int ref;
private final UtilityVod utility;
private final List<VodAddress> children;
public Request(VodAddress source, VodAddress destination,
int ref, UtilityVod utility, List<VodAddress> children) {
super(source, destination);
this.ref = ref;
this.utility = new UtilityVod(utility.getChunk(), utility.getPiece(), utility.getOffset());
if (children == null) {
this.children = new ArrayList<VodAddress>();
} else {
this.children = children;
}
}
public int getRef() {
return ref;
}
public UtilityVod getUtility() {
return utility;
}
public List<VodAddress> getChildren() {
return children;
}
@Override
public byte getOpcode() {
return VodMsgFrameDecoder.REFERENCES_REQUEST;
}
@Override
public int getSize() {
return super.getHeaderSize()
+ 2 /*refs */
+ UserTypesEncoderFactory.UTILITY_LEN
+ UserTypesEncoderFactory.getListVodAddressSize(children);
}
@Override
public ByteBuf toByteArray() throws MessageEncodingException {
ByteBuf buf = createChannelBufferWithHeader();
UserTypesEncoderFactory.writeUnsignedintAsTwoBytes(buf, ref);
UserTypesEncoderFactory.writeUtility(buf, utility);
UserTypesEncoderFactory.writeListVodAddresses(buf, children);
return buf;
}
@Override
public RewriteableMsg copy() {
Request r = new Request(vodSrc, vodDest, ref, utility, children);
r.setTimeoutId(timeoutId);
return r;
}
}
public static class Response extends DirectMsgNetty.Response {
private final int ref;
private final UtilityVod utility;
private final List<VodAddress> children;
public Response(VodAddress source, VodAddress destination, TimeoutId timeoutId,
int ref, UtilityVod utility, List<VodAddress> children) {
super(source, destination, timeoutId);
this.ref = ref;
this.utility = new UtilityVod(utility.getChunk(), utility.getPiece(), utility.getOffset());
if (children == null) {
this.children = new ArrayList<VodAddress>();
} else {
this.children = children;
}
}
public int getRef() {
return ref;
}
public UtilityVod getUtility() {
return utility;
}
public List<VodAddress> getChildren() {
return children;
}
@Override
public byte getOpcode() {
return VodMsgFrameDecoder.REFERENCES_RESPONSE;
}
@Override
public int getSize() {
return super.getHeaderSize()
+ 2 /*refs */
+ UserTypesEncoderFactory.UTILITY_LEN
+ UserTypesEncoderFactory.getListVodAddressSize(children);
}
@Override
public ByteBuf toByteArray() throws MessageEncodingException {
ByteBuf buf = createChannelBufferWithHeader();
UserTypesEncoderFactory.writeUnsignedintAsTwoBytes(buf, ref);
UserTypesEncoderFactory.writeUtility(buf, utility);
UserTypesEncoderFactory.writeListVodAddresses(buf, children);
return buf;
}
@Override
public RewriteableMsg copy() {
return new Response(vodSrc, vodDest, timeoutId, ref, utility, children);
}
}
public static class RequestTimeout extends Timeout {
private final VodAddress peer;
public RequestTimeout(ScheduleTimeout timeout, VodAddress peer) {
super(timeout);
this.peer = peer;
}
public VodAddress getPeer() {
return peer;
}
}
}