package ibis.ipl.impl.stacking.lrmc.io;
import ibis.ipl.impl.stacking.lrmc.LabelRoutingMulticast;
import ibis.ipl.impl.stacking.lrmc.util.Message;
import ibis.ipl.impl.stacking.lrmc.util.MessageCache;
import java.io.IOException;
import java.io.OutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LrmcOutputStream extends OutputStream {
private static final Logger logger = LoggerFactory
.getLogger(LrmcOutputStream.class);
private final LabelRoutingMulticast mcast;
private final MessageCache cache;
public int currentID = 1;
private int currentNUM = 0;
private boolean closed = false;
private boolean firstPacket = false;
private Message message;
public LrmcOutputStream(LabelRoutingMulticast mcast, MessageCache cache) {
this.mcast = mcast;
this.cache = cache;
message = cache.get();
}
public void reset() {
firstPacket = true;
}
public void close() {
closed = true;
}
public int getPrefferedBufferSize() {
return mcast.getPrefferedMessageSize();
}
public byte[] getBuffer() {
return message.buffer;
}
public byte[] write(int off, int len, boolean lastPacket) {
if (closed) {
logger.info("____ got write(" + len + ") while closed!");
return null;
}
if (firstPacket) {
firstPacket = false;
currentNUM = 0;
} else {
currentNUM++;
}
message.off = 0;
message.len = len;
if (lastPacket) {
message.num = currentNUM | Message.LAST_PACKET;
message.id = currentID++;
} else {
message.num = currentNUM;
message.id = currentID;
}
if (mcast.send(message)) {
return message.buffer;
}
message = cache.get();
return message.buffer;
}
public void write(int b) throws IOException {
// Ouch ... fortunately, it is never used...
write(new byte[] { (byte) (b & 0xff) }, 0, 1);
}
}