jimu-decompiled/sources/com/liulishuo/filedownloader/download/DownloadLaunchRunnable.java
2025-05-13 19:24:51 +02:00

620 lines
24 KiB
Java

package com.liulishuo.filedownloader.download;
import com.liulishuo.filedownloader.IThreadPoolMonitor;
import com.liulishuo.filedownloader.connection.FileDownloadConnection;
import com.liulishuo.filedownloader.database.FileDownloadDatabase;
import com.liulishuo.filedownloader.download.ConnectTask;
import com.liulishuo.filedownloader.download.ConnectionProfile;
import com.liulishuo.filedownloader.download.DownloadRunnable;
import com.liulishuo.filedownloader.exception.FileDownloadGiveUpRetryException;
import com.liulishuo.filedownloader.exception.FileDownloadHttpException;
import com.liulishuo.filedownloader.exception.FileDownloadNetworkPolicyException;
import com.liulishuo.filedownloader.exception.FileDownloadOutOfSpaceException;
import com.liulishuo.filedownloader.exception.FileDownloadSecurityException;
import com.liulishuo.filedownloader.model.ConnectionModel;
import com.liulishuo.filedownloader.model.FileDownloadHeader;
import com.liulishuo.filedownloader.model.FileDownloadModel;
import com.liulishuo.filedownloader.stream.FileDownloadOutputStream;
import com.liulishuo.filedownloader.util.FileDownloadExecutors;
import com.liulishuo.filedownloader.util.FileDownloadHelper;
import com.liulishuo.filedownloader.util.FileDownloadLog;
import com.liulishuo.filedownloader.util.FileDownloadProperties;
import com.liulishuo.filedownloader.util.FileDownloadUtils;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicBoolean;
/* loaded from: classes.dex */
public class DownloadLaunchRunnable implements Runnable, ProcessCallback {
private static final ThreadPoolExecutor x = FileDownloadExecutors.a("ConnectionBlock");
private final DownloadStatusCallback a;
private final FileDownloadModel b;
private final FileDownloadHeader c;
private final boolean d;
private final boolean e;
private final FileDownloadDatabase f;
private final IThreadPoolMonitor g;
private boolean h;
int i;
private boolean j;
private final boolean k;
private final ArrayList<DownloadRunnable> l;
private DownloadRunnable m;
private boolean n;
private boolean o;
private boolean p;
private boolean q;
private final AtomicBoolean r;
private volatile boolean s;
private volatile boolean t;
private volatile Exception u;
private String v;
public static class Builder {
private FileDownloadModel a;
private FileDownloadHeader b;
private IThreadPoolMonitor c;
private Integer d;
private Integer e;
private Boolean f;
private Boolean g;
private Integer h;
public Builder a(FileDownloadModel fileDownloadModel) {
this.a = fileDownloadModel;
return this;
}
public Builder b(Boolean bool) {
this.g = bool;
return this;
}
public Builder c(Integer num) {
this.d = num;
return this;
}
public Builder a(FileDownloadHeader fileDownloadHeader) {
this.b = fileDownloadHeader;
return this;
}
public Builder b(Integer num) {
this.h = num;
return this;
}
public Builder a(IThreadPoolMonitor iThreadPoolMonitor) {
this.c = iThreadPoolMonitor;
return this;
}
public Builder a(Integer num) {
this.e = num;
return this;
}
public Builder a(Boolean bool) {
this.f = bool;
return this;
}
public DownloadLaunchRunnable a() {
IThreadPoolMonitor iThreadPoolMonitor;
Integer num;
FileDownloadModel fileDownloadModel = this.a;
if (fileDownloadModel != null && (iThreadPoolMonitor = this.c) != null && (num = this.d) != null && this.e != null && this.f != null && this.g != null && this.h != null) {
return new DownloadLaunchRunnable(fileDownloadModel, this.b, iThreadPoolMonitor, num.intValue(), this.e.intValue(), this.f.booleanValue(), this.g.booleanValue(), this.h.intValue());
}
throw new IllegalArgumentException();
}
}
class DiscardSafely extends Throwable {
DiscardSafely(DownloadLaunchRunnable downloadLaunchRunnable) {
}
}
class RetryDirectly extends Throwable {
RetryDirectly(DownloadLaunchRunnable downloadLaunchRunnable) {
}
}
private int b(long j) {
if (k()) {
return this.o ? this.b.getConnectionCount() : CustomComponentHolder.i().a(this.b.getId(), this.b.getUrl(), this.b.getPath(), j);
}
return 1;
}
private void c(long j) throws IOException, IllegalAccessException {
ConnectionProfile a;
if (this.p) {
a = ConnectionProfile.ConnectionProfileBuild.a(this.b.getSoFar(), this.b.getSoFar(), j - this.b.getSoFar());
} else {
this.b.setSoFar(0L);
a = ConnectionProfile.ConnectionProfileBuild.a(j);
}
DownloadRunnable.Builder builder = new DownloadRunnable.Builder();
builder.a(this.b.getId());
builder.a((Integer) (-1));
builder.a(this);
builder.c(this.b.getUrl());
builder.a(this.b.getETag());
builder.a(this.c);
builder.a(this.e);
builder.a(a);
builder.b(this.b.getTempFilePath());
this.m = builder.a();
this.b.setConnectionCount(1);
this.f.a(this.b.getId(), 1);
if (!this.s) {
this.m.run();
} else {
this.b.setStatus((byte) -2);
this.m.pause();
}
}
private void f() throws RetryDirectly, DiscardSafely {
int id = this.b.getId();
if (this.b.isPathAsDirectory()) {
String targetFilePath = this.b.getTargetFilePath();
int c = FileDownloadUtils.c(this.b.getUrl(), targetFilePath);
if (FileDownloadHelper.a(id, targetFilePath, this.d, false)) {
this.f.remove(id);
this.f.b(id);
throw new DiscardSafely(this);
}
FileDownloadModel e = this.f.e(c);
if (e != null) {
if (FileDownloadHelper.a(id, e, this.g, false)) {
this.f.remove(id);
this.f.b(id);
throw new DiscardSafely(this);
}
List<ConnectionModel> d = this.f.d(c);
this.f.remove(c);
this.f.b(c);
FileDownloadUtils.d(this.b.getTargetFilePath());
if (FileDownloadUtils.a(c, e)) {
this.b.setSoFar(e.getSoFar());
this.b.setTotal(e.getTotal());
this.b.setETag(e.getETag());
this.b.setConnectionCount(e.getConnectionCount());
this.f.a(this.b);
if (d != null) {
for (ConnectionModel connectionModel : d) {
connectionModel.a(id);
this.f.a(connectionModel);
}
}
throw new RetryDirectly(this);
}
}
if (FileDownloadHelper.a(id, this.b.getSoFar(), this.b.getTempFilePath(), targetFilePath, this.g)) {
this.f.remove(id);
this.f.b(id);
throw new DiscardSafely(this);
}
}
}
private void j() throws FileDownloadGiveUpRetryException {
if (this.e && !FileDownloadUtils.a("android.permission.ACCESS_NETWORK_STATE")) {
throw new FileDownloadGiveUpRetryException(FileDownloadUtils.a("Task[%d] can't start the download runnable, because this task require wifi, but user application nor current process has %s, so we can't check whether the network type connection.", Integer.valueOf(this.b.getId()), "android.permission.ACCESS_NETWORK_STATE"));
}
if (this.e && FileDownloadUtils.e()) {
throw new FileDownloadNetworkPolicyException();
}
}
private boolean k() {
return (!this.o || this.b.getConnectionCount() > 1) && this.p && this.k && !this.q;
}
private void l() throws IOException, RetryDirectly, IllegalAccessException, FileDownloadSecurityException {
FileDownloadConnection fileDownloadConnection = null;
try {
ConnectionProfile b = this.j ? ConnectionProfile.ConnectionProfileBuild.b() : ConnectionProfile.ConnectionProfileBuild.a();
ConnectTask.Builder builder = new ConnectTask.Builder();
builder.a(this.b.getId());
builder.b(this.b.getUrl());
builder.a(this.b.getETag());
builder.a(this.c);
builder.a(b);
ConnectTask a = builder.a();
fileDownloadConnection = a.a();
a(a.d(), a, fileDownloadConnection);
} finally {
if (fileDownloadConnection != null) {
fileDownloadConnection.d();
}
}
}
/* JADX WARN: Removed duplicated region for block: B:12:0x0068 */
/* JADX WARN: Removed duplicated region for block: B:15:? A[RETURN, SYNTHETIC] */
/* JADX WARN: Removed duplicated region for block: B:9:0x0061 */
/*
Code decompiled incorrectly, please refer to instructions dump.
To view partially-correct code enable 'Show inconsistent code' option in preferences
*/
void a(java.util.List<com.liulishuo.filedownloader.model.ConnectionModel> r11) {
/*
r10 = this;
com.liulishuo.filedownloader.model.FileDownloadModel r0 = r10.b
int r0 = r0.getConnectionCount()
com.liulishuo.filedownloader.model.FileDownloadModel r1 = r10.b
java.lang.String r1 = r1.getTempFilePath()
com.liulishuo.filedownloader.model.FileDownloadModel r2 = r10.b
java.lang.String r2 = r2.getTargetFilePath()
r3 = 0
r4 = 1
if (r0 <= r4) goto L18
r5 = 1
goto L19
L18:
r5 = 0
L19:
boolean r6 = r10.j
r7 = 0
if (r6 == 0) goto L21
L1f:
r5 = r7
goto L58
L21:
if (r5 == 0) goto L28
boolean r6 = r10.k
if (r6 != 0) goto L28
goto L1f
L28:
com.liulishuo.filedownloader.model.FileDownloadModel r6 = r10.b
int r6 = r6.getId()
com.liulishuo.filedownloader.model.FileDownloadModel r9 = r10.b
boolean r6 = com.liulishuo.filedownloader.util.FileDownloadUtils.a(r6, r9)
if (r6 == 0) goto L1f
boolean r6 = r10.k
if (r6 != 0) goto L44
java.io.File r11 = new java.io.File
r11.<init>(r1)
long r5 = r11.length()
goto L58
L44:
if (r5 == 0) goto L52
int r5 = r11.size()
if (r0 == r5) goto L4d
goto L1f
L4d:
long r5 = com.liulishuo.filedownloader.model.ConnectionModel.a(r11)
goto L58
L52:
com.liulishuo.filedownloader.model.FileDownloadModel r11 = r10.b
long r5 = r11.getSoFar()
L58:
com.liulishuo.filedownloader.model.FileDownloadModel r11 = r10.b
r11.setSoFar(r5)
int r11 = (r5 > r7 ? 1 : (r5 == r7 ? 0 : -1))
if (r11 <= 0) goto L62
r3 = 1
L62:
r10.o = r3
boolean r11 = r10.o
if (r11 != 0) goto L76
com.liulishuo.filedownloader.database.FileDownloadDatabase r11 = r10.f
com.liulishuo.filedownloader.model.FileDownloadModel r0 = r10.b
int r0 = r0.getId()
r11.b(r0)
com.liulishuo.filedownloader.util.FileDownloadUtils.a(r2, r1)
L76:
return
*/
throw new UnsupportedOperationException("Method not decompiled: com.liulishuo.filedownloader.download.DownloadLaunchRunnable.a(java.util.List):void");
}
public boolean d() {
return this.r.get() || this.a.b();
}
public void e() {
a(this.f.d(this.b.getId()));
this.a.f();
}
public void pause() {
this.s = true;
DownloadRunnable downloadRunnable = this.m;
if (downloadRunnable != null) {
downloadRunnable.pause();
}
Iterator it = ((ArrayList) this.l.clone()).iterator();
while (it.hasNext()) {
DownloadRunnable downloadRunnable2 = (DownloadRunnable) it.next();
if (downloadRunnable2 != null) {
downloadRunnable2.pause();
}
}
}
/* JADX WARN: Removed duplicated region for block: B:106:0x01c3 A[Catch: all -> 0x01f8, TryCatch #13 {all -> 0x01f8, blocks: (B:3:0x0003, B:6:0x0012, B:8:0x001a, B:10:0x001e, B:25:0x0030, B:26:0x008d, B:28:0x0091, B:30:0x0096, B:116:0x009a, B:118:0x009e, B:33:0x00c6, B:35:0x00e2, B:44:0x0100, B:56:0x0136, B:58:0x013a, B:69:0x015f, B:71:0x0165, B:85:0x0169, B:87:0x0172, B:88:0x0176, B:90:0x017a, B:91:0x018d, B:100:0x018e, B:104:0x01bd, B:106:0x01c3, B:109:0x01c8), top: B:2:0x0003, inners: #15, #12, #11 }] */
/* JADX WARN: Removed duplicated region for block: B:108:0x01c8 A[SYNTHETIC] */
/* JADX WARN: Removed duplicated region for block: B:74:0x01d4 */
/* JADX WARN: Removed duplicated region for block: B:77:0x01da */
@Override // java.lang.Runnable
/*
Code decompiled incorrectly, please refer to instructions dump.
To view partially-correct code enable 'Show inconsistent code' option in preferences
*/
public void run() {
/*
Method dump skipped, instructions count: 550
To view this dump change 'Code comments level' option to 'DEBUG'
*/
throw new UnsupportedOperationException("Method not decompiled: com.liulishuo.filedownloader.download.DownloadLaunchRunnable.run():void");
}
private DownloadLaunchRunnable(FileDownloadModel fileDownloadModel, FileDownloadHeader fileDownloadHeader, IThreadPoolMonitor iThreadPoolMonitor, int i, int i2, boolean z, boolean z2, int i3) {
this.j = false;
this.l = new ArrayList<>(5);
this.r = new AtomicBoolean(true);
this.s = false;
this.h = false;
this.b = fileDownloadModel;
this.c = fileDownloadHeader;
this.d = z;
this.e = z2;
this.f = CustomComponentHolder.i().a();
this.k = CustomComponentHolder.i().e();
this.g = iThreadPoolMonitor;
this.i = i3;
this.a = new DownloadStatusCallback(fileDownloadModel, i3, i, i2);
}
@Override // com.liulishuo.filedownloader.download.ProcessCallback
public void b(Exception exc) {
if (this.s) {
if (FileDownloadLog.a) {
FileDownloadLog.a(this, "the task[%d] has already been paused, so pass the retry callback", Integer.valueOf(this.b.getId()));
}
} else {
int i = this.i;
this.i = i - 1;
if (i < 0) {
FileDownloadLog.b(this, "valid retry times is less than 0(%d) for download task(%d)", Integer.valueOf(this.i), Integer.valueOf(this.b.getId()));
}
this.a.a(exc, this.i);
}
}
/* JADX WARN: Removed duplicated region for block: B:11:0x008a */
/* JADX WARN: Removed duplicated region for block: B:22:0x011b */
/*
Code decompiled incorrectly, please refer to instructions dump.
To view partially-correct code enable 'Show inconsistent code' option in preferences
*/
private void a(java.util.Map<java.lang.String, java.util.List<java.lang.String>> r18, com.liulishuo.filedownloader.download.ConnectTask r19, com.liulishuo.filedownloader.connection.FileDownloadConnection r20) throws java.io.IOException, com.liulishuo.filedownloader.download.DownloadLaunchRunnable.RetryDirectly, java.lang.IllegalArgumentException, com.liulishuo.filedownloader.exception.FileDownloadSecurityException {
/*
Method dump skipped, instructions count: 357
To view this dump change 'Code comments level' option to 'DEBUG'
*/
throw new UnsupportedOperationException("Method not decompiled: com.liulishuo.filedownloader.download.DownloadLaunchRunnable.a(java.util.Map, com.liulishuo.filedownloader.download.ConnectTask, com.liulishuo.filedownloader.connection.FileDownloadConnection):void");
}
public int b() {
return this.b.getId();
}
@Override // com.liulishuo.filedownloader.download.ProcessCallback
public boolean c(Exception exc) {
if (exc instanceof FileDownloadHttpException) {
int code = ((FileDownloadHttpException) exc).getCode();
if (this.n && code == 416 && !this.h) {
FileDownloadUtils.a(this.b.getTargetFilePath(), this.b.getTempFilePath());
this.h = true;
return true;
}
}
return this.i > 0 && !(exc instanceof FileDownloadGiveUpRetryException);
}
public String c() {
return this.b.getTempFilePath();
}
private void a(int i, List<ConnectionModel> list) throws InterruptedException {
if (i > 1 && list.size() == i) {
a(list, this.b.getTotal());
return;
}
throw new IllegalArgumentException();
}
private void a(long j, int i) throws InterruptedException {
long j2 = j / i;
int id = this.b.getId();
ArrayList arrayList = new ArrayList();
long j3 = 0;
int i2 = 0;
while (i2 < i) {
long j4 = i2 == i + (-1) ? -1L : (j3 + j2) - 1;
ConnectionModel connectionModel = new ConnectionModel();
connectionModel.a(id);
connectionModel.b(i2);
connectionModel.c(j3);
connectionModel.a(j3);
connectionModel.b(j4);
arrayList.add(connectionModel);
this.f.a(connectionModel);
j3 += j2;
i2++;
}
this.b.setConnectionCount(i);
this.f.a(id, i);
a(arrayList, j);
}
private void a(List<ConnectionModel> list, long j) throws InterruptedException {
long b;
int id = this.b.getId();
String eTag = this.b.getETag();
String str = this.v;
if (str == null) {
str = this.b.getUrl();
}
String tempFilePath = this.b.getTempFilePath();
if (FileDownloadLog.a) {
FileDownloadLog.a(this, "fetch data with multiple connection(count: [%d]) for task[%d] totalLength[%d]", Integer.valueOf(list.size()), Integer.valueOf(id), Long.valueOf(j));
}
boolean z = this.o;
long j2 = 0;
long j3 = 0;
for (ConnectionModel connectionModel : list) {
if (connectionModel.b() == -1) {
b = j - connectionModel.a();
} else {
b = (connectionModel.b() - connectionModel.a()) + 1;
}
long j4 = b;
j3 += connectionModel.a() - connectionModel.e();
if (j4 == j2) {
if (FileDownloadLog.a) {
FileDownloadLog.a(this, "pass connection[%d-%d], because it has been completed", Integer.valueOf(connectionModel.c()), Integer.valueOf(connectionModel.d()));
}
} else {
DownloadRunnable.Builder builder = new DownloadRunnable.Builder();
ConnectionProfile a = ConnectionProfile.ConnectionProfileBuild.a(connectionModel.e(), connectionModel.a(), connectionModel.b(), j4);
builder.a(id);
builder.a(Integer.valueOf(connectionModel.d()));
builder.a(this);
builder.c(str);
builder.a(z ? eTag : null);
builder.a(this.c);
builder.a(this.e);
builder.a(a);
builder.b(tempFilePath);
DownloadRunnable a2 = builder.a();
if (FileDownloadLog.a) {
FileDownloadLog.a(this, "enable multiple connection: %s", connectionModel);
}
if (a2 != null) {
this.l.add(a2);
} else {
throw new IllegalArgumentException("the download runnable must not be null!");
}
}
j2 = 0;
}
if (j3 != this.b.getSoFar()) {
FileDownloadLog.e(this, "correct the sofar[%d] from connection table[%d]", Long.valueOf(this.b.getSoFar()), Long.valueOf(j3));
this.b.setSoFar(j3);
}
ArrayList arrayList = new ArrayList(this.l.size());
Iterator<DownloadRunnable> it = this.l.iterator();
while (it.hasNext()) {
DownloadRunnable next = it.next();
if (this.s) {
next.pause();
} else {
arrayList.add(Executors.callable(next));
}
}
if (this.s) {
this.b.setStatus((byte) -2);
return;
}
List<Future> invokeAll = x.invokeAll(arrayList);
if (FileDownloadLog.a) {
for (Future future : invokeAll) {
FileDownloadLog.a(this, "finish sub-task for [%d] %B %B", Integer.valueOf(id), Boolean.valueOf(future.isDone()), Boolean.valueOf(future.isCancelled()));
}
}
}
private void a(long j, String str) throws IOException, IllegalAccessException {
FileDownloadOutputStream fileDownloadOutputStream = null;
if (j != -1) {
try {
fileDownloadOutputStream = FileDownloadUtils.c(this.b.getTempFilePath());
long length = new File(str).length();
long j2 = j - length;
long h = FileDownloadUtils.h(str);
if (h >= j2) {
if (!FileDownloadProperties.a().f) {
fileDownloadOutputStream.a(j);
}
} else {
throw new FileDownloadOutOfSpaceException(h, j2, length);
}
} finally {
if (0 != 0) {
fileDownloadOutputStream.close();
}
}
}
}
@Override // com.liulishuo.filedownloader.download.ProcessCallback
public void a(long j) {
if (this.s) {
return;
}
this.a.a(j);
}
@Override // com.liulishuo.filedownloader.download.ProcessCallback
public void a(DownloadRunnable downloadRunnable, long j, long j2) {
if (this.s) {
if (FileDownloadLog.a) {
FileDownloadLog.a(this, "the task[%d] has already been paused, so pass the completed callback", Integer.valueOf(this.b.getId()));
return;
}
return;
}
int i = downloadRunnable.h;
if (FileDownloadLog.a) {
FileDownloadLog.a(this, "the connection has been completed(%d): [%d, %d) %d", Integer.valueOf(i), Long.valueOf(j), Long.valueOf(j2), Long.valueOf(this.b.getTotal()));
}
if (!this.n) {
synchronized (this.l) {
this.l.remove(downloadRunnable);
}
} else {
if (j == 0 || j2 == this.b.getTotal()) {
return;
}
FileDownloadLog.b(this, "the single task not completed corrected(%d, %d != %d) for task(%d)", Long.valueOf(j), Long.valueOf(j2), Long.valueOf(this.b.getTotal()), Integer.valueOf(this.b.getId()));
}
}
@Override // com.liulishuo.filedownloader.download.ProcessCallback
public void a(Exception exc) {
this.t = true;
this.u = exc;
if (this.s) {
if (FileDownloadLog.a) {
FileDownloadLog.a(this, "the task[%d] has already been paused, so pass the error callback", Integer.valueOf(this.b.getId()));
}
} else {
Iterator it = ((ArrayList) this.l.clone()).iterator();
while (it.hasNext()) {
DownloadRunnable downloadRunnable = (DownloadRunnable) it.next();
if (downloadRunnable != null) {
downloadRunnable.a();
}
}
}
}
@Override // com.liulishuo.filedownloader.download.ProcessCallback
public void a() {
this.f.b(this.b.getId(), this.b.getSoFar());
}
}