content: /*
   * Selling Partner API for Fulfillment By Amazon (FBA) Inbound v2024.
   * The Selling Partner API for FBA Inbound API enables building inbound workflows to create, manage, and send shipments into Amazon's fulfillment network.
   *
   * OpenAPI spec version: 2024-03-20
   * 
   *
   * NOTE: This class is auto generated by the swagger code generator program.
   * https://github.com/swagger-api/swagger-codegen.git
   * Do not edit the class manually.
   */
  
  
  package io.swagger.client;
  
  import com.squareup.okhttp.MediaType;
  import com.squareup.okhttp.ResponseBody;
  
  import java.io.IOException;
  
  import okio.Buffer;
  import okio.BufferedSource;
  import okio.ForwardingSource;
  import okio.Okio;
  import okio.Source;
  
  public class ProgressResponseBody extends ResponseBody {
  
      public interface ProgressListener {
          void update(long bytesRead, long contentLength, boolean done);
      }
  
      private final ResponseBody responseBody;
      private final ProgressListener progressListener;
      private BufferedSource bufferedSource;
  
      public ProgressResponseBody(ResponseBody responseBody, ProgressListener progressListener) {
          this.responseBody = responseBody;
          this.progressListener = progressListener;
      }
  
      @Override
      public MediaType contentType() {
          return responseBody.contentType();
      }
  
      @Override
      public long contentLength() throws IOException {
          return responseBody.contentLength();
      }
  
      @Override
      public BufferedSource source() throws IOException {
          if (bufferedSource == null) {
              bufferedSource = Okio.buffer(source(responseBody.source()));
          }
          return bufferedSource;
      }
  
      private Source source(Source source) {
          return new ForwardingSource(source) {
              long totalBytesRead = 0L;
  
              @Override
              public long read(Buffer sink, long byteCount) throws IOException {
                  long bytesRead = super.read(sink, byteCount);
                  // read() returns the number of bytes read, or -1 if this source is exhausted.
                  totalBytesRead += bytesRead != -1 ? bytesRead : 0;
                  progressListener.update(totalBytesRead, responseBody.contentLength(), bytesRead == -1);
                  return bytesRead;
              }
          };
      }
  }
  
  
  