package com.novoda.downloadmanager.lib;
import java.io.IOException;
import java.io.OutputStream;
class CheckedWriter implements DataWriter {
private final SpaceVerifier spaceVerifier;
private final OutputStream outputStream;
public CheckedWriter(SpaceVerifier spaceVerifier, OutputStream outputStream) {
this.spaceVerifier = spaceVerifier;
this.outputStream = outputStream;
}
@Override
public DownloadTask.State write(DownloadTask.State state, byte[] buffer, int count) throws StopRequestException {
spaceVerifier.verifySpacePreemptively(count);
boolean forceVerified = false;
while (true) {
try {
state.gotData = true;
outputStream.write(buffer, 0, count);
state.currentBytes += count;
return state;
} catch (IOException ex) {
// TODO: better differentiate between DRM and disk failures
if (!forceVerified) {
// couldn't write to file. are we out of space? check.
spaceVerifier.verifySpace(count);
forceVerified = true;
} else {
throw new StopRequestException(
DownloadStatus.FILE_ERROR,
"Failed to write data: " + ex);
}
}
}
}
}