X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/edd38b807da409ee833dbf293255ab27252e672a..eda724313028d60437c509d59fee7ebef8c6cfbf:/src/eu/alefzero/webdav/FileRequestEntity.java?ds=inline diff --git a/src/eu/alefzero/webdav/FileRequestEntity.java b/src/eu/alefzero/webdav/FileRequestEntity.java index ca16e89e..8ebdcbe2 100644 --- a/src/eu/alefzero/webdav/FileRequestEntity.java +++ b/src/eu/alefzero/webdav/FileRequestEntity.java @@ -1,14 +1,19 @@ package eu.alefzero.webdav; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; import org.apache.commons.httpclient.methods.RequestEntity; -import eu.alefzero.owncloud.files.interfaces.OnDatatransferProgressListener; +import eu.alefzero.webdav.OnDatatransferProgressListener; + +import android.util.Log; + /** * A RequestEntity that represents a File. @@ -44,19 +49,32 @@ public class FileRequestEntity implements RequestEntity { public void setOnDatatransferProgressListener(OnDatatransferProgressListener listener) { this.listener = listener; } - + public void writeRequest(final OutputStream out) throws IOException { - byte[] tmp = new byte[4096]; + //byte[] tmp = new byte[4096]; + ByteBuffer tmp = ByteBuffer.allocate(4096); int i = 0; - InputStream instream = new FileInputStream(this.file); + + FileChannel channel = new RandomAccessFile(this.file, "rw").getChannel(); + FileLock lock = channel.tryLock(); + //InputStream instream = new FileInputStream(this.file); + try { - while ((i = instream.read(tmp)) >= 0) { - out.write(tmp, 0, i); + //while ((i = instream.read(tmp)) >= 0) { + while ((i = channel.read(tmp)) >= 0) { + out.write(tmp.array(), 0, i); + tmp.clear(); if (listener != null) listener.transferProgress(i); } + } catch (IOException io) { + Log.e("FileRequestException", io.getMessage()); + throw new RuntimeException("Ugly solution to workaround the default policy of retries when the server falls while uploading ; temporal fix; really", io); + } finally { - instream.close(); + //instream.close(); + lock.release(); + channel.close(); } }