620 lines
24 KiB
Java
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());
|
|
}
|
|
}
|