X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/2a913bfbeb13fc93ad0ec942d359dbcaa3ad3c1e..ce7f7fa48c5cce2070a8e42ec19d1954a18db090:/src/com/owncloud/android/operations/UploadFileOperation.java?ds=sidebyside diff --git a/src/com/owncloud/android/operations/UploadFileOperation.java b/src/com/owncloud/android/operations/UploadFileOperation.java index 2ced4bfc..55871eaf 100644 --- a/src/com/owncloud/android/operations/UploadFileOperation.java +++ b/src/com/owncloud/android/operations/UploadFileOperation.java @@ -30,10 +30,12 @@ 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; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.services.FileUploader; +import com.owncloud.android.network.ProgressiveDataTransferer; import com.owncloud.android.operations.RemoteOperation; import com.owncloud.android.operations.RemoteOperationResult; import com.owncloud.android.operations.RemoteOperationResult.ResultCode; @@ -64,10 +66,14 @@ public class UploadFileOperation extends RemoteOperation { private boolean mForceOverwrite = false; private int mLocalBehaviour = FileUploader.LOCAL_BEHAVIOUR_COPY; private boolean mWasRenamed = false; + private String mOriginalFileName = null; + private String mOriginalStoragePath = null; PutMethod mPutMethod = null; private Set mDataTransferListeners = new HashSet(); private final AtomicBoolean mCancellationRequested = new AtomicBoolean(false); + protected RequestEntity mEntity = null; + public UploadFileOperation( Account account, OCFile file, @@ -88,6 +94,8 @@ public class UploadFileOperation extends RemoteOperation { mIsInstant = isInstant; mForceOverwrite = forceOverwrite; mLocalBehaviour = localBehaviour; + mOriginalStoragePath = mFile.getStoragePath(); + mOriginalFileName = mFile.getFileName(); } @@ -95,6 +103,10 @@ public class UploadFileOperation extends RemoteOperation { return mAccount; } + public String getFileName() { + return mOriginalFileName; + } + public OCFile getFile() { return mFile; } @@ -103,6 +115,10 @@ public class UploadFileOperation extends RemoteOperation { return mOldFile; } + public String getOriginalStoragePath() { + return mOriginalStoragePath; + } + public String getStoragePath() { return mFile.getStoragePath(); } @@ -140,16 +156,28 @@ public class UploadFileOperation extends RemoteOperation { } public void addDatatransferProgressListener (OnDatatransferProgressListener listener) { - mDataTransferListeners.add(listener); + synchronized (mDataTransferListeners) { + mDataTransferListeners.add(listener); + } + if (mEntity != null) { + ((ProgressiveDataTransferer)mEntity).addDatatransferProgressListener(listener); + } + } + + public void removeDatatransferProgressListener(OnDatatransferProgressListener listener) { + synchronized (mDataTransferListeners) { + mDataTransferListeners.remove(listener); + } + if (mEntity != null) { + ((ProgressiveDataTransferer)mEntity).removeDatatransferProgressListener(listener); + } } - @Override protected RemoteOperationResult run(WebdavClient client) { RemoteOperationResult result = null; boolean localCopyPassed = false, nameCheckPassed = false; - String originalStoragePath = mFile.getStoragePath(); - File temporalFile = null, originalFile = new File(originalStoragePath), expectedFile = null; + File temporalFile = null, originalFile = new File(mOriginalStoragePath), expectedFile = null; try { /// rename the file to upload, if necessary if (!mForceOverwrite) { @@ -165,10 +193,9 @@ public class UploadFileOperation extends RemoteOperation { expectedFile = new File(expectedPath); /// check location of local file; if not the expected, copy to a temporal file before upload (if COPY is the expected behaviour) - if (!originalStoragePath.equals(expectedPath) && mLocalBehaviour == FileUploader.LOCAL_BEHAVIOUR_COPY) { + if (!mOriginalStoragePath.equals(expectedPath) && mLocalBehaviour == FileUploader.LOCAL_BEHAVIOUR_COPY) { - File ocLocalFolder = new File(FileStorageUtils.getSavePath(mAccount.name)); - if (ocLocalFolder.getUsableSpace() < originalFile.length()) { + if (FileStorageUtils.getUsableSpace(mAccount.name) < originalFile.length()) { result = new RemoteOperationResult(ResultCode.LOCAL_STORAGE_FULL); return result; // error condition when the file should be copied @@ -176,10 +203,19 @@ public class UploadFileOperation extends RemoteOperation { String temporalPath = FileStorageUtils.getTemporalPath(mAccount.name) + mFile.getRemotePath(); mFile.setStoragePath(temporalPath); temporalFile = new File(temporalPath); - if (!originalStoragePath.equals(temporalPath)) { // preventing weird but possible situation + if (!mOriginalStoragePath.equals(temporalPath)) { // preventing weird but possible situation InputStream in = null; OutputStream out = null; try { + File temporalParent = temporalFile.getParentFile(); + temporalParent.mkdirs(); + if (!temporalParent.isDirectory()) { + throw new IOException("Unexpected error: parent directory could not be created"); + } + temporalFile.createNewFile(); + if (!temporalFile.isFile()) { + throw new IOException("Unexpected error: target file could not be created"); + } in = new FileInputStream(originalFile); out = new FileOutputStream(temporalFile); byte[] buf = new byte[1024]; @@ -187,11 +223,16 @@ public class UploadFileOperation extends RemoteOperation { while ((len = in.read(buf)) > 0){ out.write(buf, 0, len); } + + } catch (Exception e) { + result = new RemoteOperationResult(ResultCode.LOCAL_STORAGE_NOT_COPIED); + return result; + } finally { try { if (in != null) in.close(); } catch (Exception e) { - Log.d(TAG, "Weird exception while closing input stream for " + originalStoragePath + " (ignoring)", e); + Log.d(TAG, "Weird exception while closing input stream for " + mOriginalStoragePath + " (ignoring)", e); } try { if (out != null) out.close(); @@ -228,10 +269,16 @@ public class UploadFileOperation extends RemoteOperation { } else { // FileUploader.LOCAL_BEHAVIOUR_MOVE fileToMove = originalFile; } - expectedFile = new File(mFile.getStoragePath()); - if (!expectedFile.equals(fileToMove) && !fileToMove.renameTo(expectedFile)) { - result = new RemoteOperationResult(ResultCode.LOCAL_STORAGE_NOT_MOVED); - return result; + if (!expectedFile.equals(fileToMove)) { + File expectedFolder = expectedFile.getParentFile(); + expectedFolder.mkdirs(); + if (!expectedFolder.isDirectory() || !fileToMove.renameTo(expectedFile)) { + mFile.setStoragePath(null); // forget the local file + // by now, treat this as a success; the file was uploaded; the user won't like that the local file is not linked, but this should be a veeery rare fail; + // the best option could be show a warning message (but not a fail) + //result = new RemoteOperationResult(ResultCode.LOCAL_STORAGE_NOT_MOVED); + //return result; + } } } } @@ -253,7 +300,7 @@ public class UploadFileOperation extends RemoteOperation { temporalFile.delete(); } if (result.isSuccess()) { - Log.i(TAG, "Upload of " + originalStoragePath + " to " + mRemotePath + ": " + result.getLogMessage()); + Log.i(TAG, "Upload of " + mOriginalStoragePath + " to " + mRemotePath + ": " + result.getLogMessage()); } else { if (result.getException() != null) { @@ -263,9 +310,9 @@ public class UploadFileOperation extends RemoteOperation { } else if (!localCopyPassed) { complement = " (while copying local file to " + FileStorageUtils.getSavePath(mAccount.name) + ")"; } - Log.e(TAG, "Upload of " + originalStoragePath + " to " + mRemotePath + ": " + result.getLogMessage() + complement, result.getException()); + Log.e(TAG, "Upload of " + mOriginalStoragePath + " to " + mRemotePath + ": " + result.getLogMessage() + complement, result.getException()); } else { - Log.e(TAG, "Upload of " + originalStoragePath + " to " + mRemotePath + ": " + result.getLogMessage()); + Log.e(TAG, "Upload of " + mOriginalStoragePath + " to " + mRemotePath + ": " + result.getLogMessage()); } } } @@ -281,6 +328,7 @@ public class UploadFileOperation extends RemoteOperation { newFile.setFileLength(mFile.getFileLength()); newFile.setMimetype(mFile.getMimetype()); newFile.setModificationTimestamp(mFile.getModificationTimestamp()); + newFile.setModificationTimestampAtLastSyncForData(mFile.getModificationTimestampAtLastSyncForData()); // newFile.setEtag(mFile.getEtag()) newFile.setKeepInSync(mFile.keepInSync()); newFile.setLastSyncDateForProperties(mFile.getLastSyncDateForProperties()); @@ -301,9 +349,11 @@ public class UploadFileOperation extends RemoteOperation { int status = -1; try { File f = new File(mFile.getStoragePath()); - FileRequestEntity entity = new FileRequestEntity(f, getMimeType()); - entity.addOnDatatransferProgressListeners(mDataTransferListeners); - mPutMethod.setRequestEntity(entity); + mEntity = new FileRequestEntity(f, getMimeType()); + synchronized (mDataTransferListeners) { + ((ProgressiveDataTransferer)mEntity).addDatatransferProgressListeners(mDataTransferListeners); + } + mPutMethod.setRequestEntity(mEntity); status = client.executeMethod(mPutMethod); client.exhaustResponse(mPutMethod.getResponseBodyAsStream());