X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/be22e58b398f6bc6e47ecd1695ababa353e2ba3b..52bd01bcedf1b8f13c49b67ee40a848bae1a9d40:/src/eu/alefzero/webdav/FileRequestEntity.java diff --git a/src/eu/alefzero/webdav/FileRequestEntity.java b/src/eu/alefzero/webdav/FileRequestEntity.java index f8ba3204..a8f01d63 100644 --- a/src/eu/alefzero/webdav/FileRequestEntity.java +++ b/src/eu/alefzero/webdav/FileRequestEntity.java @@ -1,84 +1,133 @@ +/* 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 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 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + 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.nio.channels.OverlappingFileLockException; +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; /** * A RequestEntity that represents a File. * */ -public class FileRequestEntity implements RequestEntity { +public class FileRequestEntity implements RequestEntity, ProgressiveDataTransferer { - final File file; - final String contentType; - OnDatatransferProgressListener listener; + final File mFile; + final String mContentType; + Set mDataTransferListeners = 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"); } - this.file = file; - this.contentType = contentType; } + @Override public long getContentLength() { - return this.file.length(); + return mFile.length(); } + @Override public String getContentType() { - return this.contentType; + return mContentType; } + @Override public boolean isRepeatable() { return true; } + + @Override + public void addDatatransferProgressListener(OnDatatransferProgressListener listener) { + synchronized (mDataTransferListeners) { + mDataTransferListeners.add(listener); + } + } + + @Override + public void addDatatransferProgressListeners(Collection listeners) { + synchronized (mDataTransferListeners) { + mDataTransferListeners.addAll(listeners); + } + } - public void setOnDatatransferProgressListener(OnDatatransferProgressListener listener) { - this.listener = listener; + @Override + public void removeDatatransferProgressListener(OnDatatransferProgressListener listener) { + synchronized (mDataTransferListeners) { + 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; - - FileChannel channel = new RandomAccessFile(this.file, "rw").getChannel(); - FileLock lock = channel.tryLock(); - //InputStream instream = new FileInputStream(this.file); + 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, "r"); + FileChannel channel = raf.getChannel(); + 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 (listener != null) - listener.transferProgress(i); + transferred += readResult; + synchronized (mDataTransferListeners) { + it = mDataTransferListeners.iterator(); + while (it.hasNext()) { + it.next().onTransferProgress(readResult, transferred, size, mFile.getName()); + } + } } + } catch (IOException io) { - Log.e("FileRequestException", io.getMessage()); + Log_OC.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(); } } -} \ No newline at end of file +}