content: 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() {
  	}
  
  	public FramedataImpl1( Opcode op ) {
  		this.optcode = op;
  		unmaskedpayload = ByteBuffer.wrap( emptyarray );
  	}
  
  	/**
  	 * 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();
  	}
  
  	@Override
  	public boolean isFin() {
  		return fin;
  	}
  
  	@Override
  	public Opcode getOpcode() {
  		return optcode;
  	}
  
  	@Override
  	public boolean getTransfereMasked() {
  		return transferemasked;
  	}
  
  	@Override
  	public ByteBuffer getPayloadData() {
  		return unmaskedpayload;
  	}
  
  	@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 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 String toString() {
  		return "Framedata{ optcode:" + getOpcode() + ", fin:" + isFin() + ", payloadlength:[pos:" + unmaskedpayload.position() + ", len:" + unmaskedpayload.remaining() + "], payload:" + Arrays.toString( Charsetfunctions.utf8Bytes( new String( unmaskedpayload.array() ) ) ) + "}";
  	}
  
  }
  