package com.owncloud.android.operations;
import java.io.File;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.oc_framework.network.webdav.OnDatatransferProgressListener;
-import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
-import com.owncloud.android.oc_framework.operations.RemoteFile;
-import com.owncloud.android.oc_framework.operations.RemoteOperation;
-import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
-import com.owncloud.android.oc_framework.operations.remote.DownloadRemoteFileOperation;
+import com.owncloud.android.lib.common.network.OnDatatransferProgressListener;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.operations.OperationCancelledException;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
+import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.lib.resources.files.DownloadRemoteFileOperation;
import com.owncloud.android.utils.FileStorageUtils;
-import com.owncloud.android.utils.Log_OC;
import android.accounts.Account;
import android.webkit.MimeTypeMap;
private Account mAccount;
private OCFile mFile;
- private OnDatatransferProgressListener mDatatransferProgressListener;
+ private Set<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<OnDatatransferProgressListener>();
private long mModificationTimestamp = 0;
+ private final AtomicBoolean mCancellationRequested = new AtomicBoolean(false);
private DownloadRemoteFileOperation mDownloadOperation;
- public DownloadFileOperation(Account account, OCFile file, OnDatatransferProgressListener listener) {
+ public DownloadFileOperation(Account account, OCFile file) {
if (account == null)
throw new IllegalArgumentException("Illegal null account in DownloadFileOperation creation");
if (file == null)
mAccount = account;
mFile = file;
- mDatatransferProgressListener = listener;
}
}
@Override
- protected RemoteOperationResult run(WebdavClient client) {
+ protected RemoteOperationResult run(OwnCloudClient client) {
RemoteOperationResult result = null;
File newFile = null;
boolean moved = true;
File tmpFile = new File(getTmpPath());
String tmpFolder = getTmpFolder();
- RemoteFile remoteFile = FileStorageUtils.fillRemoteFile(mFile);
/// perform the download
- mDownloadOperation = new DownloadRemoteFileOperation(remoteFile, tmpFolder);
- mDownloadOperation.addDatatransferProgressListener(mDatatransferProgressListener);
+ synchronized(mCancellationRequested) {
+ if (mCancellationRequested.get()) {
+ return new RemoteOperationResult(new OperationCancelledException());
+ }
+ }
+
+ mDownloadOperation = new DownloadRemoteFileOperation(mFile.getRemotePath(), tmpFolder);
+ Iterator<OnDatatransferProgressListener> listener = mDataTransferListeners.iterator();
+ while (listener.hasNext()) {
+ mDownloadOperation.addDatatransferProgressListener(listener.next());
+ }
result = mDownloadOperation.execute(client);
if (result.isSuccess()) {
+ mModificationTimestamp = mDownloadOperation.getModificationTimestamp();
newFile = new File(getSavePath());
newFile.getParentFile().mkdirs();
moved = tmpFile.renameTo(newFile);
}
public void cancel() {
- mDownloadOperation.cancel();
+ mCancellationRequested.set(true); // atomic set; there is no need of synchronizing it
+ if (mDownloadOperation != null) {
+ mDownloadOperation.cancel();
+ }
}
+ public void addDatatransferProgressListener (OnDatatransferProgressListener listener) {
+ synchronized (mDataTransferListeners) {
+ mDataTransferListeners.add(listener);
+ }
+ }
+
+ public void removeDatatransferProgressListener(OnDatatransferProgressListener listener) {
+ synchronized (mDataTransferListeners) {
+ mDataTransferListeners.remove(listener);
+ }
+ }
+
}