public void writeTo ( final OutputStream out , final HttpProgressListener progressListener ) throws IOException { // start final int size = size ( ) ; final int callbackSize = progressListener . callbackSize ( size ) ; int count = 0 ; // total count int step = 0 ; // step is offset in current chunk progressListener . transferred ( count ) ; // loop for ( Object o : list ) { if ( o instanceof FastByteBuffer ) { FastByteBuffer fastByteBuffer = ( FastByteBuffer ) o ; byte [ ] bytes = fastByteBuffer . toArray ( ) ; int offset = 0 ; while ( offset < bytes . length ) { // calc the remaining sending chunk size int chunk = callbackSize - step ; // check if this chunk size fits the bytes array if ( offset + chunk > bytes . length ) { chunk = bytes . length - offset ; } // writes the chunk out . write ( bytes , offset , chunk ) ; offset += chunk ; step += chunk ; count += chunk ; // listener if ( step >= callbackSize ) { progressListener . transferred ( count ) ; step -= callbackSize ; } } } else if ( o instanceof Uploadable ) { Uploadable uploadable = ( Uploadable ) o ; InputStream inputStream = uploadable . openInputStream ( ) ; int remaining = uploadable . getSize ( ) ; try { while ( remaining > 0 ) { // calc the remaining sending chunk size int chunk = callbackSize - step ; // check if this chunk size fits the remaining size if ( chunk > remaining ) { chunk = remaining ; } // writes remaining chunk StreamUtil . copy ( inputStream , out , chunk ) ; remaining -= chunk ; step += chunk ; count += chunk ; // listener if ( step >= callbackSize ) { progressListener . transferred ( count ) ; step -= callbackSize ; } } } finally { StreamUtil . close ( inputStream ) ; } } } // end if ( step != 0 ) { progressListener . transferred ( count ) ; } }
Writes content to the output stream using progress listener to track the sending progress .