Geen omschrijving

RNFetchBlobDefaultResp.java 2.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package com.RNFetchBlob.Response;
  2. import com.RNFetchBlob.RNFetchBlob;
  3. import com.RNFetchBlob.RNFetchBlobConst;
  4. import com.RNFetchBlob.RNFetchBlobReq;
  5. import com.facebook.react.bridge.Arguments;
  6. import com.facebook.react.bridge.ReactApplicationContext;
  7. import com.facebook.react.bridge.WritableMap;
  8. import com.facebook.react.modules.core.DeviceEventManagerModule;
  9. import java.io.IOException;
  10. import okhttp3.Call;
  11. import okhttp3.Callback;
  12. import okhttp3.MediaType;
  13. import okhttp3.Response;
  14. import okhttp3.ResponseBody;
  15. import okio.Buffer;
  16. import okio.BufferedSource;
  17. import okio.ForwardingSource;
  18. import okio.Okio;
  19. import okio.Source;
  20. import okio.Timeout;
  21. /**
  22. * Created by wkh237 on 2016/7/11.
  23. */
  24. public class RNFetchBlobDefaultResp extends ResponseBody {
  25. String mTaskId;
  26. ReactApplicationContext rctContext;
  27. ResponseBody originalBody;
  28. public RNFetchBlobDefaultResp(ReactApplicationContext ctx, String taskId, ResponseBody body) {
  29. this.rctContext = ctx;
  30. this.mTaskId = taskId;
  31. this.originalBody = body;
  32. }
  33. @Override
  34. public MediaType contentType() {
  35. return originalBody.contentType();
  36. }
  37. @Override
  38. public long contentLength() {
  39. return originalBody.contentLength();
  40. }
  41. @Override
  42. public BufferedSource source() {
  43. return Okio.buffer(new ProgressReportingSource(originalBody.source()));
  44. }
  45. private class ProgressReportingSource implements Source {
  46. BufferedSource mOriginalSource;
  47. long bytesRead = 0;
  48. ProgressReportingSource(BufferedSource originalSource) {
  49. mOriginalSource = originalSource;
  50. }
  51. @Override
  52. public long read(Buffer sink, long byteCount) throws IOException {
  53. long read = mOriginalSource.read(sink, byteCount);
  54. bytesRead += read > 0 ? read : 0;
  55. if(RNFetchBlobReq.isReportProgress(mTaskId)) {
  56. WritableMap args = Arguments.createMap();
  57. args.putString("taskId", mTaskId);
  58. args.putString("written", String.valueOf(bytesRead));
  59. args.putString("total", String.valueOf(contentLength()));
  60. rctContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
  61. .emit(RNFetchBlobConst.EVENT_PROGRESS, args);
  62. }
  63. return read;
  64. }
  65. @Override
  66. public Timeout timeout() {
  67. return null;
  68. }
  69. @Override
  70. public void close() throws IOException {
  71. }
  72. }
  73. }