mirror of
https://github.com/owncloud/android-library.git
synced 2025-06-07 16:06:08 +00:00
Added constructors to grant that upload operations only succeed if the remote copy keeps a given ETag
This commit is contained in:
parent
f61b466124
commit
eb4f8a7234
@ -46,12 +46,19 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation
|
||||
|
||||
public static final long CHUNK_SIZE = 1024000;
|
||||
private static final String OC_CHUNKED_HEADER = "OC-Chunked";
|
||||
private static final String OC_CHUNK_SIZE_HEADER = "OC-Chunk-Size";
|
||||
private static final String TAG = ChunkedUploadRemoteFileOperation.class.getSimpleName();
|
||||
|
||||
public ChunkedUploadRemoteFileOperation(String storagePath, String remotePath, String mimeType){
|
||||
super(storagePath, remotePath, mimeType);
|
||||
}
|
||||
|
||||
public ChunkedUploadRemoteFileOperation(
|
||||
String storagePath, String remotePath, String mimeType, String requiredEtag
|
||||
){
|
||||
super(storagePath, remotePath, mimeType, requiredEtag);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int uploadFile(OwnCloudClient client) throws IOException {
|
||||
int status = -1;
|
||||
@ -63,8 +70,6 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation
|
||||
raf = new RandomAccessFile(file, "r");
|
||||
channel = raf.getChannel();
|
||||
mEntity = new ChunkFromFileChannelRequestEntity(channel, mMimeType, CHUNK_SIZE, file);
|
||||
//((ProgressiveDataTransferer)mEntity).
|
||||
// addDatatransferProgressListeners(getDataTransferListeners());
|
||||
synchronized (mDataTransferListeners) {
|
||||
((ProgressiveDataTransferer)mEntity)
|
||||
.addDatatransferProgressListeners(mDataTransferListeners);
|
||||
@ -73,15 +78,25 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation
|
||||
long offset = 0;
|
||||
String uriPrefix = client.getWebdavUri() + WebdavUtils.encodePath(mRemotePath) +
|
||||
"-chunking-" + Math.abs((new Random()).nextInt(9000)+1000) + "-" ;
|
||||
long chunkCount = (long) Math.ceil((double)file.length() / CHUNK_SIZE);
|
||||
long totalLength = file.length();
|
||||
long chunkCount = (long) Math.ceil((double)totalLength / CHUNK_SIZE);
|
||||
String chunkSizeStr = String.valueOf(CHUNK_SIZE);
|
||||
String totalLengthStr = String.valueOf(file.length());
|
||||
for (int chunkIndex = 0; chunkIndex < chunkCount ; chunkIndex++, offset += CHUNK_SIZE) {
|
||||
if (chunkIndex == chunkCount - 1) {
|
||||
chunkSizeStr = String.valueOf(CHUNK_SIZE * chunkCount - totalLength);
|
||||
}
|
||||
if (mPutMethod != null) {
|
||||
mPutMethod.releaseConnection(); // let the connection available
|
||||
// for other methods
|
||||
}
|
||||
mPutMethod = new PutMethod(uriPrefix + chunkCount + "-" + chunkIndex);
|
||||
if (mRequiredEtag != null && mRequiredEtag.length() > 0) {
|
||||
mPutMethod.addRequestHeader(IF_MATCH_HEADER, "\"" + mRequiredEtag + "\"");
|
||||
}
|
||||
mPutMethod.addRequestHeader(OC_CHUNKED_HEADER, OC_CHUNKED_HEADER);
|
||||
mPutMethod.addRequestHeader(OC_TOTAL_LENGTH_HEADER, String.valueOf(file.length()));
|
||||
mPutMethod.addRequestHeader(OC_CHUNK_SIZE_HEADER, chunkSizeStr);
|
||||
mPutMethod.addRequestHeader(OC_TOTAL_LENGTH_HEADER, totalLengthStr);
|
||||
((ChunkFromFileChannelRequestEntity) mEntity).setOffset(offset);
|
||||
mPutMethod.setRequestEntity(mEntity);
|
||||
if (mCancellationRequested.get()) {
|
||||
|
@ -32,7 +32,6 @@ import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import org.apache.commons.httpclient.HttpException;
|
||||
import org.apache.commons.httpclient.methods.PutMethod;
|
||||
import org.apache.commons.httpclient.methods.RequestEntity;
|
||||
import org.apache.http.HttpStatus;
|
||||
@ -60,12 +59,14 @@ public class UploadRemoteFileOperation extends RemoteOperation {
|
||||
private static final String TAG = UploadRemoteFileOperation.class.getSimpleName();
|
||||
|
||||
protected static final String OC_TOTAL_LENGTH_HEADER = "OC-Total-Length";
|
||||
protected static final String IF_MATCH_HEADER = "If-Match";
|
||||
|
||||
protected String mLocalPath;
|
||||
protected String mRemotePath;
|
||||
protected String mMimeType;
|
||||
protected PutMethod mPutMethod = null;
|
||||
protected boolean mForbiddenCharsInServer = false;
|
||||
protected String mRequiredEtag = null;
|
||||
|
||||
protected final AtomicBoolean mCancellationRequested = new AtomicBoolean(false);
|
||||
protected Set<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<OnDatatransferProgressListener>();
|
||||
@ -78,6 +79,11 @@ public class UploadRemoteFileOperation extends RemoteOperation {
|
||||
mMimeType = mimeType;
|
||||
}
|
||||
|
||||
public UploadRemoteFileOperation(String localPath, String remotePath, String mimeType, String requiredEtag) {
|
||||
this(localPath, remotePath, mimeType);
|
||||
mRequiredEtag = requiredEtag;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected RemoteOperationResult run(OwnCloudClient client) {
|
||||
RemoteOperationResult result = null;
|
||||
@ -126,6 +132,9 @@ public class UploadRemoteFileOperation extends RemoteOperation {
|
||||
((ProgressiveDataTransferer)mEntity)
|
||||
.addDatatransferProgressListeners(mDataTransferListeners);
|
||||
}
|
||||
if (mRequiredEtag != null && mRequiredEtag.length() > 0) {
|
||||
mPutMethod.addRequestHeader(IF_MATCH_HEADER, "\"" + mRequiredEtag + "\"");
|
||||
}
|
||||
mPutMethod.addRequestHeader(OC_TOTAL_LENGTH_HEADER, String.valueOf(f.length()));
|
||||
mPutMethod.setRequestEntity(mEntity);
|
||||
status = client.executeMethod(mPutMethod);
|
||||
|
Loading…
x
Reference in New Issue
Block a user