X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/53b67429ea8c97b83602cec3446a10e0b6b7ff5e..d38a69abc1ba78df70fee65fc2434fc80b6be93b:/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 18fc1efe..f48e8dde 100644 --- a/src/com/owncloud/android/operations/ChunkedUploadFileOperation.java +++ b/src/com/owncloud/android/operations/ChunkedUploadFileOperation.java @@ -1,10 +1,10 @@ /* 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 @@ -22,66 +22,75 @@ 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 eu.alefzero.webdav.ChunkFromFileChannelRequestEntity; -import eu.alefzero.webdav.OnDatatransferProgressListener; -import eu.alefzero.webdav.WebdavClient; -import eu.alefzero.webdav.WebdavUtils; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.oc_framework.network.ProgressiveDataTransferer; +import com.owncloud.android.oc_framework.network.webdav.ChunkFromFileChannelRequestEntity; +import com.owncloud.android.oc_framework.network.webdav.WebdavClient; +import com.owncloud.android.oc_framework.network.webdav.WebdavUtils; +import com.owncloud.android.utils.Log_OC; + + +import android.accounts.Account; +import android.content.Context; + public class ChunkedUploadFileOperation extends UploadFileOperation { - private static final long CHUNK_SIZE = 8192; + 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, + int localBehaviour, Context context) { - super(localPath, remotePath, mimeType, isInstant, forceOverwrite, dataTransferProgressListener); + super(account, file, isInstant, forceOverwrite, localBehaviour, context); } @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(); + mEntity = new ChunkFromFileChannelRequestEntity(channel, getMimeType(), CHUNK_SIZE, file); + ((ProgressiveDataTransferer)mEntity).addDatatransferProgressListeners(getDataTransferListeners()); long offset = 0; - String uriPrefix = client.getBaseUri() + WebdavUtils.encodePath(getRemotePath()) + "-chunking-" + Math.abs((new Random()).nextInt()) + "-" ; + 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 + chunkIndex + "-" + chunkCount); - put.addRequestHeader(OC_CHUNKED_HEADER, OC_CHUNKED_HEADER); - entity.setOffset(offset); - put.setRequestEntity(entity); - status = client.executeMethod(put); - client.exhaustResponse(put.getResponseBodyAsStream()); + if (mPutMethod != null) { + mPutMethod.releaseConnection(); // let the connection available for other methods + } + mPutMethod = new PutMethod(uriPrefix + chunkCount + "-" + chunkIndex); + mPutMethod.addRequestHeader(OC_CHUNKED_HEADER, OC_CHUNKED_HEADER); + ((ChunkFromFileChannelRequestEntity)mEntity).setOffset(offset); + mPutMethod.setRequestEntity(mEntity); + status = client.executeMethod(mPutMethod); + client.exhaustResponse(mPutMethod.getResponseBodyAsStream()); + Log_OC.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; }