void bytesTransferred(long alreadyTransferred,
alreadyTransferred - total of all attempts, not including currentWrite
If nonzero on the first call, a partial file of that length was found,
_and_ the server supports resume.
If zero on a subsequent call after some bytes are transferred
(and presumably after an attemptFailed), the server does _not_
support resume and we had to start over.
To track _actual_ transfer if the output file could already exist,
the listener should keep its own counter,
or subtract the initial alreadyTransferred value.
And watch out for alreadyTransferred resetting if a resume failed...
currentWrite - since last call to the listener
bytesTransferred - includes headers, retries, redirects, discarded partial downloads, ...
bytesRemaining - on this attempt only, currentWrite already subtracted -
or -1 if chunked encoding or server does not return a length
Total length should be == alreadyTransferred + currentWrite + bytesRemaining for all calls
void transferComplete(long alreadyTransferred,
void attemptFailed(String url,
void transferFailed(String url,