X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/390949b8323633b26d56b3a837e83941cbc24b4b..5fc7cd13e7e561ef528e12d2fa088b58e35e00d0:/src/eu/alefzero/webdav/FileRequestEntity.java diff --git a/src/eu/alefzero/webdav/FileRequestEntity.java b/src/eu/alefzero/webdav/FileRequestEntity.java index 70154ec0..0f774f77 100644 --- a/src/eu/alefzero/webdav/FileRequestEntity.java +++ b/src/eu/alefzero/webdav/FileRequestEntity.java @@ -1,53 +1,102 @@ 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 java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; import org.apache.commons.httpclient.methods.RequestEntity; +import eu.alefzero.webdav.OnDatatransferProgressListener; + +import android.util.Log; + + /** * A RequestEntity that represents a File. - * + * */ public class FileRequestEntity implements RequestEntity { - final File file; - final String contentType; - - public FileRequestEntity(final File file, final String contentType) { - super(); - if (file == null) { - throw new IllegalArgumentException("File may not be null"); - } - this.file = file; - this.contentType = contentType; - } - public long getContentLength() { - return this.file.length(); - } - - public String getContentType() { - return this.contentType; - } - - public boolean isRepeatable() { - return true; - } - - public void writeRequest(final OutputStream out) throws IOException { - byte[] tmp = new byte[4096]; - int i = 0; - InputStream instream = new FileInputStream(this.file); - try { - while ((i = instream.read(tmp)) >= 0) { - out.write(tmp, 0, i); - } - } finally { - instream.close(); - } - } + final File mFile; + final String mContentType; + Set mListeners = new HashSet(); + + public FileRequestEntity(final File file, final String contentType) { + super(); + this.mFile = file; + this.mContentType = contentType; + if (file == null) { + throw new IllegalArgumentException("File may not be null"); + } + } + + @Override + public long getContentLength() { + return mFile.length(); + } + + @Override + public String getContentType() { + return mContentType; + } + + @Override + public boolean isRepeatable() { + return true; + } + + public void addOnDatatransferProgressListener(OnDatatransferProgressListener listener) { + mListeners.add(listener); + } + + public void addOnDatatransferProgressListeners(Collection listeners) { + mListeners.addAll(listeners); + } + + public void removeOnDatatransferProgressListener(OnDatatransferProgressListener listener) { + mListeners.remove(listener); + } + + + @Override + public void writeRequest(final OutputStream out) throws IOException { + //byte[] tmp = new byte[4096]; + ByteBuffer tmp = ByteBuffer.allocate(4096); + int i = 0; + + // TODO(bprzybylski): each mem allocation can throw OutOfMemoryError we need to handle it + // globally in some fashionable manner + RandomAccessFile raf = new RandomAccessFile(mFile, "rw"); + FileChannel channel = raf.getChannel(); + FileLock lock = channel.tryLock(); + Iterator it = null; + try { + while ((i = channel.read(tmp)) >= 0) { + out.write(tmp.array(), 0, i); + tmp.clear(); + it = mListeners.iterator(); + while (it.hasNext()) { + it.next().onTransferProgress(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 { + lock.release(); + channel.close(); + raf.close(); + } + } } \ No newline at end of file