package ar.com.javacuriosities.nio.server.message.writer;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import ar.com.javacuriosities.nio.server.clients.ClientSocket;
import ar.com.javacuriosities.nio.server.message.Message;
/*
* Se encarga de mantener el mensaje en progreso y además tener mensajes encolados
*/
public class MessageWriter {
private int bytesWritten = 0;
private Message messageInProgress = null;
private List<Message> writeQueue = new ArrayList<>();
public MessageWriter() {
}
public void enqueue(Message message) {
if(this.messageInProgress == null){
this.messageInProgress = message;
} else {
this.writeQueue.add(message);
}
}
public void write(ClientSocket socket, ByteBuffer byteBuffer) throws IOException {
byteBuffer.put(this.messageInProgress.sharedBuffer, this.messageInProgress.offset + this.bytesWritten, this.messageInProgress.length - this.bytesWritten);
byteBuffer.flip();
this.bytesWritten += socket.write(byteBuffer);
byteBuffer.clear();
if(bytesWritten >= this.messageInProgress.length){
if(this.writeQueue.size() > 0){
this.messageInProgress = this.writeQueue.remove(0);
} else {
this.messageInProgress = null;
// TODO Unregister from selector
}
}
}
public boolean isEmpty() {
return this.writeQueue.isEmpty() && this.messageInProgress == null;
}
}