com.yandex.disk.rest.RequestBodyProgress Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of disk-restapi-sdk Show documentation
Show all versions of disk-restapi-sdk Show documentation
The Java SDK for Yandex.Disk REST API is intended for applications that work with the files of Yandex.Disk users or store their own files and settings on Yandex.Disk.
The newest version!
/*
* (C) 2015 Yandex LLC (https://yandex.com/)
*
* The source code of Java SDK for Yandex.Disk REST API
* is available to use under terms of Apache License,
* Version 2.0. See the file LICENSE for the details.
*/
package com.yandex.disk.rest;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.internal.Util;
import com.yandex.disk.rest.exceptions.CancelledUploadingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import okio.Buffer;
import okio.BufferedSink;
import okio.Okio;
import okio.Source;
/* package */ abstract class RequestBodyProgress {
private static final Logger logger = LoggerFactory.getLogger(RequestBodyProgress.class);
private static final int SIZE = 2048;
/**
* Returns a new request body that transmits the content of {@code file}.
*
* Based on {@link RequestBody#create(com.squareup.okhttp.MediaType, java.io.File)}
*
* @see RequestBody#create(com.squareup.okhttp.MediaType, java.io.File)
*/
/* package */ static RequestBody create(final MediaType contentType, final File file, final long startOffset,
final ProgressListener listener) {
if (file == null) {
throw new NullPointerException("content == null");
}
if (listener == null && startOffset == 0) {
return RequestBody.create(contentType, file);
}
return new RequestBody() {
private void updateProgress(long loaded)
throws CancelledUploadingException {
if (listener != null) {
if (listener.hasCancelled()) {
throw new CancelledUploadingException();
}
listener.updateProgress(loaded + startOffset, file.length());
}
}
@Override
public MediaType contentType() {
return contentType;
}
@Override
public long contentLength() {
return file.length() - startOffset;
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
Source source = null;
InputStream inputStream = new FileInputStream(file);
try {
if (startOffset > 0) {
long skipped = inputStream.skip(startOffset);
if (skipped != startOffset) {
throw new IOException("RequestBodyProgress: inputStream.skip() failed");
}
}
long loaded = 0;
updateProgress(loaded);
source = Okio.source(inputStream);
Buffer buffer = new Buffer();
for (long readCount; (readCount = source.read(buffer, SIZE)) != -1; ) {
sink.write(buffer, readCount);
loaded += readCount;
updateProgress(loaded);
}
logger.debug("loaded: " + loaded);
} finally {
Util.closeQuietly(source);
Util.closeQuietly(inputStream);
}
}
};
}
}