X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/53b67429ea8c97b83602cec3446a10e0b6b7ff5e..52bd01bcedf1b8f13c49b67ee40a848bae1a9d40:/src/eu/alefzero/webdav/ChunkFromFileChannelRequestEntity.java diff --git a/src/eu/alefzero/webdav/ChunkFromFileChannelRequestEntity.java b/src/eu/alefzero/webdav/ChunkFromFileChannelRequestEntity.java index bcba3541..3f453968 100644 --- a/src/eu/alefzero/webdav/ChunkFromFileChannelRequestEntity.java +++ b/src/eu/alefzero/webdav/ChunkFromFileChannelRequestEntity.java @@ -1,10 +1,9 @@ /* ownCloud Android client application - * Copyright (C) 2012 Bartek Przybylski + * Copyright (C) 2012-2013 ownCloud Inc. * * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -18,16 +17,22 @@ package eu.alefzero.webdav; +import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; +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 com.owncloud.android.Log_OC; +import com.owncloud.android.network.ProgressiveDataTransferer; -import android.util.Log; +import eu.alefzero.webdav.OnDatatransferProgressListener; /** @@ -35,30 +40,34 @@ import android.util.Log; * * @author David A. Velasco */ -public class ChunkFromFileChannelRequestEntity implements RequestEntity { +public class ChunkFromFileChannelRequestEntity implements RequestEntity, ProgressiveDataTransferer { private static final String TAG = ChunkFromFileChannelRequestEntity.class.getSimpleName(); //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; - private OnDatatransferProgressListener mListener; + 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) { @@ -67,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; } } @@ -81,26 +90,51 @@ public class ChunkFromFileChannelRequestEntity implements RequestEntity { return true; } - public void setOnDatatransferProgressListener(OnDatatransferProgressListener listener) { - mListener = listener; + @Override + public void addDatatransferProgressListener(OnDatatransferProgressListener listener) { + synchronized (mDataTransferListeners) { + mDataTransferListeners.add(listener); + } + } + + @Override + public void addDatatransferProgressListeners(Collection listeners) { + synchronized (mDataTransferListeners) { + mDataTransferListeners.addAll(listeners); + } } + @Override + public void removeDatatransferProgressListener(OnDatatransferProgressListener listener) { + synchronized (mDataTransferListeners) { + mDataTransferListeners.remove(listener); + } + } + + public void writeRequest(final OutputStream out) throws IOException { int readCount = 0; + Iterator it = null; try { - //while ((i = instream.read(tmp)) >= 0) { mChannel.position(mOffset); - while (mChannel.position() < mOffset + mSize) { + 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(); - if (mListener != null) - mListener.transferProgress(readCount); + mTransferred += readCount; + synchronized (mDataTransferListeners) { + it = mDataTransferListeners.iterator(); + while (it.hasNext()) { + it.next().onTransferProgress(readCount, mTransferred, size, mFile.getName()); + } + } } } catch (IOException io) { - Log.e(TAG, io.getMessage()); + Log_OC.e(TAG, io.getMessage()); throw new RuntimeException("Ugly solution to workaround the default policy of retries when the server falls while uploading ; temporal fix; really", io); }