package org.java_websocket.framing;
import java.nio.ByteBuffer;
import java.util.Arrays;
import org.java_websocket.exceptions.InvalidDataException;
import org.java_websocket.exceptions.InvalidFrameException;
import org.java_websocket.util.Charsetfunctions;
public class FramedataImpl1 implements FrameBuilder {
protected static byte[] emptyarray = {};
protected boolean fin;
protected Opcode optcode;
private ByteBuffer unmaskedpayload;
protected boolean transferemasked;
public FramedataImpl1() {
}
/**
* Helper constructor which helps to create "echo" frames. The new object
* will use the same underlying payload data.
**/
public FramedataImpl1(Framedata f) {
fin = f.isFin();
optcode = f.getOpcode();
unmaskedpayload = f.getPayloadData();
transferemasked = f.getTransfereMasked();
}
public FramedataImpl1(Opcode op) {
this.optcode = op;
unmaskedpayload = ByteBuffer.wrap(emptyarray);
}
@Override
public void append(Framedata nextframe) throws InvalidFrameException {
ByteBuffer b = nextframe.getPayloadData();
if (unmaskedpayload == null) {
unmaskedpayload = ByteBuffer.allocate(b.remaining());
b.mark();
unmaskedpayload.put(b);
b.reset();
} else {
b.mark();
unmaskedpayload.position(unmaskedpayload.limit());
unmaskedpayload.limit(unmaskedpayload.capacity());
if (b.remaining() > unmaskedpayload.remaining()) {
ByteBuffer tmp = ByteBuffer.allocate(b.remaining()
+ unmaskedpayload.capacity());
unmaskedpayload.flip();
tmp.put(unmaskedpayload);
tmp.put(b);
unmaskedpayload = tmp;
} else {
unmaskedpayload.put(b);
}
unmaskedpayload.rewind();
b.reset();
}
fin = nextframe.isFin();
}
@Override
public Opcode getOpcode() {
return optcode;
}
@Override
public ByteBuffer getPayloadData() {
return unmaskedpayload;
}
@Override
public boolean getTransfereMasked() {
return transferemasked;
}
@Override
public boolean isFin() {
return fin;
}
@Override
public void setFin(boolean fin) {
this.fin = fin;
}
@Override
public void setOptcode(Opcode optcode) {
this.optcode = optcode;
}
@Override
public void setPayload(ByteBuffer payload) throws InvalidDataException {
unmaskedpayload = payload;
}
@Override
public void setTransferemasked(boolean transferemasked) {
this.transferemasked = transferemasked;
}
@Override
public String toString() {
return "Framedata{ optcode:"
+ getOpcode()
+ ", fin:"
+ isFin()
+ ", payloadlength:[pos:"
+ unmaskedpayload.position()
+ ", len:"
+ unmaskedpayload.remaining()
+ "], payload:"
+ Arrays.toString(Charsetfunctions.utf8Bytes(new String(
unmaskedpayload.array()))) + "/"+new String(
unmaskedpayload.array())+"}";
}
}