All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.yandex.disk.rest.RequestBodyProgress Maven / Gradle / Ivy

Go to download

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); } } }; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy