No Description

RNFetchBlobDefaultResp.java 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package com.RNFetchBlob.Response;
  2. import com.RNFetchBlob.RNFetchBlobConst;
  3. import com.RNFetchBlob.RNFetchBlobProgressConfig;
  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 java.nio.charset.Charset;
  11. import okhttp3.MediaType;
  12. import okhttp3.ResponseBody;
  13. import okio.Buffer;
  14. import okio.BufferedSource;
  15. import okio.Okio;
  16. import okio.Source;
  17. import okio.Timeout;
  18. /**
  19. * Created by wkh237 on 2016/7/11.
  20. */
  21. public class RNFetchBlobDefaultResp extends ResponseBody {
  22. String mTaskId;
  23. ReactApplicationContext rctContext;
  24. ResponseBody originalBody;
  25. boolean isIncrement = false;
  26. public RNFetchBlobDefaultResp(ReactApplicationContext ctx, String taskId, ResponseBody body, boolean isIncrement) {
  27. this.rctContext = ctx;
  28. this.mTaskId = taskId;
  29. this.originalBody = body;
  30. this.isIncrement = isIncrement;
  31. }
  32. @Override
  33. public MediaType contentType() {
  34. return originalBody.contentType();
  35. }
  36. @Override
  37. public long contentLength() {
  38. return originalBody.contentLength();
  39. }
  40. @Override
  41. public BufferedSource source() {
  42. return Okio.buffer(new ProgressReportingSource(originalBody.source()));
  43. }
  44. private class ProgressReportingSource implements Source {
  45. BufferedSource mOriginalSource;
  46. long bytesRead = 0;
  47. ProgressReportingSource(BufferedSource originalSource) {
  48. mOriginalSource = originalSource;
  49. }
  50. @Override
  51. public long read(Buffer sink, long byteCount) throws IOException {
  52. long read = mOriginalSource.read(sink, byteCount);
  53. bytesRead += read > 0 ? read : 0;
  54. RNFetchBlobProgressConfig reportConfig = RNFetchBlobReq.getReportProgress(mTaskId);
  55. long cLen = contentLength();
  56. if(reportConfig != null && cLen != 0 && reportConfig.shouldReport(bytesRead/contentLength())) {
  57. WritableMap args = Arguments.createMap();
  58. args.putString("taskId", mTaskId);
  59. args.putString("written", String.valueOf(bytesRead));
  60. args.putString("total", String.valueOf(contentLength()));
  61. if(isIncrement) {
  62. args.putString("chunk", sink.readString(Charset.defaultCharset()));
  63. }
  64. else {
  65. args.putString("chunk", "");
  66. }
  67. rctContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
  68. .emit(RNFetchBlobConst.EVENT_PROGRESS, args);
  69. }
  70. return read;
  71. }
  72. @Override
  73. public Timeout timeout() {
  74. return null;
  75. }
  76. @Override
  77. public void close() throws IOException {
  78. }
  79. }
  80. }