예제 #1
0
    /**
     * Assembles all the fragments into one buffer. Takes all Messages, and combines their buffers
     * into one buffer. This method does not check if the fragmentation is complete (use {@link
     * #isComplete()} to verify before calling this method)
     *
     * @return the complete message in one buffer
     */
    private Message assembleMessage() {
      Message retval;
      byte[] combined_buffer, tmp;
      int combined_length = 0, length, offset;
      int index = 0;

      for (Message fragment : fragments) combined_length += fragment.getLength();

      combined_buffer = new byte[combined_length];
      retval = fragments[0].copy(false); // doesn't copy the payload, but copies the headers

      for (int i = 0; i < fragments.length; i++) {
        Message fragment = fragments[i];
        fragments[i] = null; // help garbage collection a bit
        tmp = fragment.getRawBuffer();
        length = fragment.getLength();
        offset = fragment.getOffset();
        System.arraycopy(tmp, offset, combined_buffer, index, length);
        index += length;
      }

      retval.setBuffer(combined_buffer);
      return retval;
    }