X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/b0ab3ce0872d2702e82b5979dddaa5a897be340b..9aab2d26da38f26e7ff03a0b5db3bd01b51bce05:/src/eu/alefzero/webdav/ChunkFromFileChannelRequestEntity.java diff --git a/src/eu/alefzero/webdav/ChunkFromFileChannelRequestEntity.java b/src/eu/alefzero/webdav/ChunkFromFileChannelRequestEntity.java index b7ab2613..1316315d 100644 --- a/src/eu/alefzero/webdav/ChunkFromFileChannelRequestEntity.java +++ b/src/eu/alefzero/webdav/ChunkFromFileChannelRequestEntity.java @@ -18,6 +18,7 @@ package eu.alefzero.webdav; +import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; @@ -46,23 +47,27 @@ public class ChunkFromFileChannelRequestEntity implements RequestEntity { //private final File mFile; private final FileChannel mChannel; private final String mContentType; - private final long mSize; + private final long mChunkSize; + private final File mFile; private long mOffset; - Set mListeners = new HashSet(); + private long mTransferred; + Set mDataTransferListeners = new HashSet(); private ByteBuffer mBuffer = ByteBuffer.allocate(4096); - public ChunkFromFileChannelRequestEntity(final FileChannel channel, final String contentType, long size) { + public ChunkFromFileChannelRequestEntity(final FileChannel channel, final String contentType, long chunkSize, final File file) { super(); if (channel == null) { throw new IllegalArgumentException("File may not be null"); } - if (size <= 0) { - throw new IllegalArgumentException("Size must be greater than zero"); + if (chunkSize <= 0) { + throw new IllegalArgumentException("Chunk size must be greater than zero"); } mChannel = channel; mContentType = contentType; - mSize = size; + mChunkSize = chunkSize; + mFile = file; mOffset = 0; + mTransferred = 0; } public void setOffset(long offset) { @@ -71,9 +76,9 @@ public class ChunkFromFileChannelRequestEntity implements RequestEntity { public long getContentLength() { try { - return Math.min(mSize, mChannel.size() - mChannel.position()); + return Math.min(mChunkSize, mChannel.size() - mChannel.position()); } catch (IOException e) { - return mSize; + return mChunkSize; } } @@ -86,15 +91,15 @@ public class ChunkFromFileChannelRequestEntity implements RequestEntity { } public void addOnDatatransferProgressListener(OnDatatransferProgressListener listener) { - mListeners.add(listener); + mDataTransferListeners.add(listener); } public void addOnDatatransferProgressListeners(Collection listeners) { - mListeners.addAll(listeners); + mDataTransferListeners.addAll(listeners); } public void removeOnDatatransferProgressListener(OnDatatransferProgressListener listener) { - mListeners.remove(listener); + mDataTransferListeners.remove(listener); } @@ -104,13 +109,16 @@ public class ChunkFromFileChannelRequestEntity implements RequestEntity { try { mChannel.position(mOffset); - while (mChannel.position() < mOffset + mSize && mChannel.position() < mChannel.size()) { + long size = mFile.length(); + if (size == 0) size = -1; + while (mChannel.position() < mOffset + mChunkSize && mChannel.position() < mChannel.size()) { readCount = mChannel.read(mBuffer); out.write(mBuffer.array(), 0, readCount); mBuffer.clear(); - it = mListeners.iterator(); + mTransferred += readCount; + it = mDataTransferListeners.iterator(); while (it.hasNext()) { - it.next().onTransferProgress(readCount); + it.next().onTransferProgress(readCount, mTransferred, size, mFile.getName()); } }