X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/68ce2e7a381a19df737664755ff7ca4c026155fd..9aab2d26da38f26e7ff03a0b5db3bd01b51bce05:/src/eu/alefzero/webdav/FileRequestEntity.java diff --git a/src/eu/alefzero/webdav/FileRequestEntity.java b/src/eu/alefzero/webdav/FileRequestEntity.java index 0f774f77..292d88bf 100644 --- a/src/eu/alefzero/webdav/FileRequestEntity.java +++ b/src/eu/alefzero/webdav/FileRequestEntity.java @@ -1,3 +1,21 @@ +/* ownCloud Android client application + * Copyright (C) 2012 Bartek Przybylski + * + * 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. + * + * 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; @@ -6,7 +24,6 @@ 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; @@ -27,7 +44,7 @@ public class FileRequestEntity implements RequestEntity { final File mFile; final String mContentType; - Set mListeners = new HashSet(); + Set mDataTransferListeners = new HashSet(); public FileRequestEntity(final File file, final String contentType) { super(); @@ -54,15 +71,15 @@ public class FileRequestEntity 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); } @@ -70,21 +87,24 @@ public class FileRequestEntity implements RequestEntity { 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"); + RandomAccessFile raf = new RandomAccessFile(mFile, "r"); FileChannel channel = raf.getChannel(); - FileLock lock = channel.tryLock(); Iterator it = null; + long transferred = 0; + long size = mFile.length(); + if (size == 0) size = -1; try { - 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(); - it = mListeners.iterator(); + transferred += readResult; + it = mDataTransferListeners.iterator(); while (it.hasNext()) { - it.next().onTransferProgress(i); + it.next().onTransferProgress(readResult, transferred, size, mFile.getName()); } } @@ -93,10 +113,9 @@ public class FileRequestEntity implements RequestEntity { 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 +}