X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/981bf05434e8b5aa81691b5a0b91fa573ab48d18..1192e036cee4d974576b005c833e9db64c6093a0:/src/eu/alefzero/webdav/FileRequestEntity.java?ds=sidebyside diff --git a/src/eu/alefzero/webdav/FileRequestEntity.java b/src/eu/alefzero/webdav/FileRequestEntity.java index df6bdff4..2924f452 100644 --- a/src/eu/alefzero/webdav/FileRequestEntity.java +++ b/src/eu/alefzero/webdav/FileRequestEntity.java @@ -7,6 +7,10 @@ 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; @@ -23,7 +27,7 @@ public class FileRequestEntity implements RequestEntity { final File mFile; final String mContentType; - OnDatatransferProgressListener mListener; + Set mDataTransferListeners = new HashSet(); public FileRequestEntity(final File file, final String contentType) { super(); @@ -49,37 +53,50 @@ public class FileRequestEntity implements RequestEntity { return true; } - public void setOnDatatransferProgressListener(OnDatatransferProgressListener listener) { - mListener = listener; + public void addOnDatatransferProgressListener(OnDatatransferProgressListener listener) { + mDataTransferListeners.add(listener); } + public void addOnDatatransferProgressListeners(Collection listeners) { + mDataTransferListeners.addAll(listeners); + } + + public void removeOnDatatransferProgressListener(OnDatatransferProgressListener listener) { + mDataTransferListeners.remove(listener); + } + + @Override public void writeRequest(final OutputStream out) throws IOException { //byte[] tmp = new byte[4096]; ByteBuffer tmp = ByteBuffer.allocate(4096); - int i = 0; + int readResult = 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(); - //InputStream instream = new FileInputStream(this.file); - + Iterator it = null; + long transferred = 0; + long size = mFile.length(); + if (size == 0) size = -1; try { - //while ((i = instream.read(tmp)) >= 0) { - while ((i = channel.read(tmp)) >= 0) { - out.write(tmp.array(), 0, i); + while ((readResult = channel.read(tmp)) >= 0) { + out.write(tmp.array(), 0, readResult); tmp.clear(); - if (mListener != null) - mListener.transferProgress(i); + transferred += readResult; + it = mDataTransferListeners.iterator(); + while (it.hasNext()) { + it.next().onTransferProgress(readResult, transferred, size, mFile.getName()); + } } + } 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(); lock.release(); channel.close(); raf.close();