package se.sics.gvod.video.msgs;
import io.netty.buffer.ByteBuf;
import se.sics.gvod.common.msgs.MessageEncodingException;
import se.sics.gvod.common.msgs.DirectMsgNetty;
import se.sics.gvod.net.Transport;
import se.sics.gvod.net.VodAddress;
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;
/**
*
*/
public class VideoConnectionMsg {
public enum Type {
STANDARD, RANDOM, PARENT, CHILD;
}
public static final class Request extends DirectMsgNetty.Request {
private boolean randomRequest;
public Request(VodAddress source, VodAddress destination,
boolean randomRequest) {
super(source, destination);
this.randomRequest = randomRequest;
}
@Override
public int getSize() {
return super.getHeaderSize()
+ 1 /*
* randomRequest
*/;
}
@Override
public RewriteableMsg copy() {
VideoConnectionMsg.Request vcmr = new VideoConnectionMsg.Request(vodSrc, vodDest, randomRequest);
vcmr.setTimeoutId(timeoutId);
return vcmr;
}
@Override
public ByteBuf toByteArray() throws MessageEncodingException {
ByteBuf buffer = createChannelBufferWithHeader();
UserTypesEncoderFactory.writeBoolean(buffer, randomRequest);
return buffer;
}
@Override
public byte getOpcode() {
return VodMsgFrameDecoder.VIDEO_CONNECTION_REQUEST;
}
public boolean isRandomRequest() {
return randomRequest;
}
}
public static final class Response extends DirectMsgNetty.Response {
private boolean randomRequest;
private boolean acceptConnection;
public Response(VideoConnectionMsg.Request request, boolean acceptConnection) {
this(request.getVodDestination(), request.getVodSource(), request.getTimeoutId(), request.isRandomRequest(), acceptConnection);
}
public Response(VodAddress source, VodAddress destination,
TimeoutId timeoutId, boolean randomRequest, boolean acceptConnection) {
super(source, destination, Transport.UDP, timeoutId);
this.randomRequest = randomRequest;
this.acceptConnection = acceptConnection;
}
@Override
public int getSize() {
return super.getHeaderSize()
+ 1 /*
* randomRequest
*/
+ 1 /*
* acceptConnection
*/;
}
@Override
public RewriteableMsg copy() {
return new Response(vodSrc, vodDest, timeoutId, randomRequest, acceptConnection);
}
@Override
public ByteBuf toByteArray() throws MessageEncodingException {
ByteBuf buffer = createChannelBufferWithHeader();
UserTypesEncoderFactory.writeBoolean(buffer, randomRequest);
UserTypesEncoderFactory.writeBoolean(buffer, acceptConnection);
return buffer;
}
@Override
public byte getOpcode() {
return VodMsgFrameDecoder.VIDEO_CONNECTION_RESPONSE;
}
public boolean wasRandomRequest() {
return randomRequest;
}
public boolean connectionAccepted() {
return acceptConnection;
}
}
public static final class RequestTimeout extends Timeout {
private final Request requestMsg;
public RequestTimeout(ScheduleTimeout st, Request requestMsg) {
super(st);
this.requestMsg = requestMsg;
}
public Request getRequestMsg() {
return requestMsg;
}
}
public static final class Disconnect extends DirectMsgNetty.Oneway {
private boolean randomConnection;
public Disconnect(VodAddress source, VodAddress destination, boolean randomConnection) {
super(source, destination, Transport.UDP);
this.randomConnection = randomConnection;
}
@Override
public int getSize() {
return super.getHeaderSize()
+ 1;
}
@Override
public RewriteableMsg copy() {
return new Disconnect(vodSrc, vodDest, randomConnection);
}
@Override
public ByteBuf toByteArray() throws MessageEncodingException {
ByteBuf buffer = createChannelBufferWithHeader();
UserTypesEncoderFactory.writeBoolean(buffer, randomConnection);
return buffer;
}
@Override
public byte getOpcode() {
return VodMsgFrameDecoder.VIDEO_CONNECTION_DISCONNECT;
}
public boolean wasRandomConnection() {
return randomConnection;
}
}
}