X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/b00957b5fa28651b588292b9696648af6dc52636..9aab2d26da38f26e7ff03a0b5db3bd01b51bce05:/src/com/owncloud/android/operations/ChunkedUploadFileOperation.java diff --git a/src/com/owncloud/android/operations/ChunkedUploadFileOperation.java b/src/com/owncloud/android/operations/ChunkedUploadFileOperation.java index 97d3eba6..67ff7ce7 100644 --- a/src/com/owncloud/android/operations/ChunkedUploadFileOperation.java +++ b/src/com/owncloud/android/operations/ChunkedUploadFileOperation.java @@ -22,70 +22,68 @@ import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.channels.FileChannel; -import java.nio.channels.FileLock; import java.util.Random; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.methods.PutMethod; +import com.owncloud.android.datamodel.OCFile; + +import android.accounts.Account; import android.util.Log; import eu.alefzero.webdav.ChunkFromFileChannelRequestEntity; -import eu.alefzero.webdav.OnDatatransferProgressListener; import eu.alefzero.webdav.WebdavClient; import eu.alefzero.webdav.WebdavUtils; public class ChunkedUploadFileOperation extends UploadFileOperation { - private static final long CHUNK_SIZE = 102400; + private static final long CHUNK_SIZE = 1024000; private static final String OC_CHUNKED_HEADER = "OC-Chunked"; private static final String TAG = ChunkedUploadFileOperation.class.getSimpleName(); - public ChunkedUploadFileOperation( String localPath, - String remotePath, - String mimeType, + public ChunkedUploadFileOperation( Account account, + OCFile file, boolean isInstant, - boolean forceOverwrite, - OnDatatransferProgressListener dataTransferProgressListener) { + boolean forceOverwrite) { - super(localPath, remotePath, mimeType, isInstant, forceOverwrite, dataTransferProgressListener); + super(account, file, isInstant, forceOverwrite); } @Override protected int uploadFile(WebdavClient client) throws HttpException, IOException { int status = -1; - PutMethod put = null; FileChannel channel = null; - FileLock lock = null; + RandomAccessFile raf = null; try { - File file = new File(getLocalPath()); - channel = new RandomAccessFile(file, "rw").getChannel(); - lock = channel.tryLock(); - ChunkFromFileChannelRequestEntity entity = new ChunkFromFileChannelRequestEntity(channel, getMimeType(), CHUNK_SIZE); - entity.setOnDatatransferProgressListener(getDataTransferListener()); + File file = new File(getStoragePath()); + raf = new RandomAccessFile(file, "r"); + channel = raf.getChannel(); + ChunkFromFileChannelRequestEntity entity = new ChunkFromFileChannelRequestEntity(channel, getMimeType(), CHUNK_SIZE, file); + entity.addOnDatatransferProgressListeners(getDataTransferListeners()); long offset = 0; String uriPrefix = client.getBaseUri() + WebdavUtils.encodePath(getRemotePath()) + "-chunking-" + Math.abs((new Random()).nextInt(9000)+1000) + "-" ; long chunkCount = (long) Math.ceil((double)file.length() / CHUNK_SIZE); for (int chunkIndex = 0; chunkIndex < chunkCount ; chunkIndex++, offset += CHUNK_SIZE) { - put = new PutMethod(uriPrefix + chunkCount + "-" + chunkIndex); - put.addRequestHeader(OC_CHUNKED_HEADER, OC_CHUNKED_HEADER); + mPutMethod = new PutMethod(uriPrefix + chunkCount + "-" + chunkIndex); + mPutMethod.addRequestHeader(OC_CHUNKED_HEADER, OC_CHUNKED_HEADER); entity.setOffset(offset); - put.setRequestEntity(entity); - status = client.executeMethod(put); - client.exhaustResponse(put.getResponseBodyAsStream()); - Log.d(TAG, "Upload of " + getLocalPath() + " to " + getRemotePath() + ", chunk index " + chunkIndex + ", count " + chunkCount + ", HTTP result status " + status); + mPutMethod.setRequestEntity(entity); + status = client.executeMethod(mPutMethod); + client.exhaustResponse(mPutMethod.getResponseBodyAsStream()); + Log.d(TAG, "Upload of " + getStoragePath() + " to " + getRemotePath() + ", chunk index " + chunkIndex + ", count " + chunkCount + ", HTTP result status " + status); if (!isSuccess(status)) break; } } finally { - if (lock != null) - lock.release(); if (channel != null) channel.close(); - if (put != null) - put.releaseConnection(); // let the connection available for other methods + if (raf != null) + raf.close(); + if (mPutMethod != null) + mPutMethod.releaseConnection(); // let the connection available for other methods } return status; }