docs: public synchronized void wrap(byte[] item, int offset, int length)
     {
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.entry(this, tc, "wrap",
                                             new Object[]{item, offset, length});
  
        // First see if there is anything in the data list. If there is, complete that buffer so that
        // we can start a new one with our item backing it
        if (dataList.size() > 0)
        {
           WsByteBuffer lastBuffer = dataList.get(dataList.size() - 1);
           if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Last buffer:", lastBuffer);
  
           lastBuffer.flip();
        }
  
        // Now create a new buffer from the backing byte[]
        WsByteBuffer newBuffer = poolMan.wrap(item, offset, length);
        // If the offset is non-zero then the resulting buffer returned has the position set to the
        // offset. This is a bit crap, as clearly if we specified an offset to start at, we didn't
        // care about the data before it. We can get around this however by slicing the buffer which
        // causes the current position to becoming position 0 which means good things happen when
        // we later flip the buffer.
        newBuffer = newBuffer.slice();
  
        // We must ensure that the position is at the end of the buffer so that we can either continue
        // adding data to this JFapByteBuffer (i.e. we'll create a new buffer for the subsequent data)
        // or the right thing will happen when prepareForTransmission() is called.
        newBuffer.position(newBuffer.limit());
  
        // And add it to the data list
        dataList.add(newBuffer);
  
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(this, tc, "wrap");
     }