X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/6daaf70be850e630b243591c23ca75ace578702f..ec19a11a385ff21d3e85a94e618d48d8be9ef20d:/src/com/owncloud/android/operations/DownloadFileOperation.java?ds=inline diff --git a/src/com/owncloud/android/operations/DownloadFileOperation.java b/src/com/owncloud/android/operations/DownloadFileOperation.java index fbd9f66d..9f2bed72 100644 --- a/src/com/owncloud/android/operations/DownloadFileOperation.java +++ b/src/com/owncloud/android/operations/DownloadFileOperation.java @@ -18,16 +18,20 @@ 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; @@ -44,13 +48,14 @@ public class DownloadFileOperation extends RemoteOperation { private Account mAccount; private OCFile mFile; - private OnDatatransferProgressListener mDatatransferProgressListener; + private Set mDataTransferListeners = new HashSet(); 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) @@ -59,7 +64,6 @@ public class DownloadFileOperation extends RemoteOperation { mAccount = account; mFile = file; - mDatatransferProgressListener = listener; } @@ -117,7 +121,7 @@ public class DownloadFileOperation extends RemoteOperation { } @Override - protected RemoteOperationResult run(WebdavClient client) { + protected RemoteOperationResult run(OwnCloudClient client) { RemoteOperationResult result = null; File newFile = null; boolean moved = true; @@ -126,14 +130,23 @@ public class DownloadFileOperation extends RemoteOperation { 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 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); @@ -148,8 +161,23 @@ public class DownloadFileOperation extends RemoteOperation { } 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); + } + } + }