From: David A. Velasco Date: Tue, 27 Nov 2012 14:15:17 +0000 (+0100) Subject: Some cleanup X-Git-Tag: oc-android-1.4.3~80^2~13 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/a1c538db20f10549b6665ae52582b850feb72e62?ds=inline Some cleanup --- diff --git a/src/com/owncloud/android/files/services/FileUploader.java b/src/com/owncloud/android/files/services/FileUploader.java index 9f3f1c42..31c9d675 100644 --- a/src/com/owncloud/android/files/services/FileUploader.java +++ b/src/com/owncloud/android/files/services/FileUploader.java @@ -86,6 +86,11 @@ public class FileUploader extends Service implements OnDatatransferProgressListe public static final String KEY_UPLOAD_TYPE = "UPLOAD_TYPE"; public static final String KEY_FORCE_OVERWRITE = "KEY_FORCE_OVERWRITE"; public static final String KEY_INSTANT_UPLOAD = "INSTANT_UPLOAD"; + public static final String KEY_LOCAL_BEHAVIOUR = "BEHAVIOUR"; + + public static final int LOCAL_BEHAVIOUR_COPY = 0; + public static final int LOCAL_BEHAVIOUR_MOVE = 1; + public static final int LOCAL_BEHAVIOUR_FORGET = 2; public static final int UPLOAD_SINGLE_FILE = 0; public static final int UPLOAD_MULTIPLE_FILES = 1; @@ -198,7 +203,8 @@ public class FileUploader extends Service implements OnDatatransferProgressListe FileDataStorageManager storageManager = new FileDataStorageManager(account, getContentResolver()); boolean forceOverwrite = intent.getBooleanExtra(KEY_FORCE_OVERWRITE, false); - boolean isInstant = intent.getBooleanExtra(KEY_INSTANT_UPLOAD, false); + boolean isInstant = intent.getBooleanExtra(KEY_INSTANT_UPLOAD, false); + int localAction = intent.getIntExtra(KEY_LOCAL_BEHAVIOUR, LOCAL_BEHAVIOUR_COPY); boolean fixed = false; if (isInstant) { fixed = checkAndFixInstantUploadDirectory(storageManager); // MUST be done BEFORE calling obtainNewOCFileToUpload @@ -237,9 +243,9 @@ public class FileUploader extends Service implements OnDatatransferProgressListe for (int i=0; i < files.length; i++) { uploadKey = buildRemoteName(account, files[i].getRemotePath()); if (chunked) { - newUpload = new ChunkedUploadFileOperation(account, files[i], isInstant, forceOverwrite, false); + newUpload = new ChunkedUploadFileOperation(account, files[i], isInstant, forceOverwrite, localAction); } else { - newUpload = new UploadFileOperation(account, files[i], isInstant, forceOverwrite, false); + newUpload = new UploadFileOperation(account, files[i], isInstant, forceOverwrite, localAction); } if (fixed && i==0) { newUpload.setRemoteFolderToBeCreated(); @@ -468,28 +474,6 @@ public class FileUploader extends Service implements OnDatatransferProgressListe if (mCurrentUpload.wasRenamed()) { OCFile oldFile = mCurrentUpload.getOldFile(); if (oldFile.fileExists()) { - // the upload was the result of a conflict resolved with 'Keep both' by the user - /*File localFile = new File(file.getStoragePath()); - File newLocalFile = new File(FileStorageUtils.getDefaultSavePathFor(mCurrentUpload.getAccount().name, file)); - boolean renameSuccessed = localFile.renameTo(newLocalFile); - if (renameSuccessed) { - file.setStoragePath(newLocalFile.getAbsolutePath()); - - } else { - // poor solution - Log.d(TAG, "DAMN IT: local rename failed after uploading a file with a new name already existing both in the remote account and the local database (should be due to a conflict solved with 'keep both'"); - file.setStoragePath(null); - // not so fine: - // - local file will be kept there as 'trash' until is download (and overwritten) again from the server; - // - user will see as 'not down' a file that was just upload - // BUT: - // - no loss of data happened - // - when the user downloads again the renamed and original file from the server, local file names and contents will be correctly synchronized with names and contents in server - }*/ - if (oldFile.isDown()) { - File oldLocalFile = new File(oldFile.getStoragePath()); - oldLocalFile.delete(); // the RemoteFileOperation copied and renamed it! // TODO launch the 'Keep both' option with mMove set 'ture' - } oldFile.setStoragePath(null); mStorageManager.saveFile(oldFile); diff --git a/src/com/owncloud/android/operations/ChunkedUploadFileOperation.java b/src/com/owncloud/android/operations/ChunkedUploadFileOperation.java index 4e71314a..413a76e2 100644 --- a/src/com/owncloud/android/operations/ChunkedUploadFileOperation.java +++ b/src/com/owncloud/android/operations/ChunkedUploadFileOperation.java @@ -46,9 +46,9 @@ public class ChunkedUploadFileOperation extends UploadFileOperation { OCFile file, boolean isInstant, boolean forceOverwrite, - boolean moveLocalFile) { + int localBehaviour) { - super(account, file, isInstant, forceOverwrite, moveLocalFile); + super(account, file, isInstant, forceOverwrite, localBehaviour); } @Override diff --git a/src/com/owncloud/android/operations/UploadFileOperation.java b/src/com/owncloud/android/operations/UploadFileOperation.java index 0cee73b8..6f3cd9cf 100644 --- a/src/com/owncloud/android/operations/UploadFileOperation.java +++ b/src/com/owncloud/android/operations/UploadFileOperation.java @@ -33,6 +33,7 @@ import org.apache.commons.httpclient.methods.PutMethod; import org.apache.http.HttpStatus; import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.files.services.FileUploader; import com.owncloud.android.operations.RemoteOperation; import com.owncloud.android.operations.RemoteOperationResult; import com.owncloud.android.operations.RemoteOperationResult.ResultCode; @@ -61,7 +62,7 @@ public class UploadFileOperation extends RemoteOperation { private boolean mIsInstant = false; private boolean mRemoteFolderToBeCreated = false; private boolean mForceOverwrite = false; - private boolean mMoveLocalFile = false; + private int mLocalBehaviour = FileUploader.LOCAL_BEHAVIOUR_COPY; private boolean mWasRenamed = false; PutMethod mPutMethod = null; private Set mDataTransferListeners = new HashSet(); @@ -72,7 +73,7 @@ public class UploadFileOperation extends RemoteOperation { OCFile file, boolean isInstant, boolean forceOverwrite, - boolean moveLocalFile) { + int localBehaviour) { if (account == null) throw new IllegalArgumentException("Illegal NULL account in UploadFileOperation creation"); if (file == null) @@ -86,7 +87,7 @@ public class UploadFileOperation extends RemoteOperation { mRemotePath = file.getRemotePath(); mIsInstant = isInstant; mForceOverwrite = forceOverwrite; - mMoveLocalFile = moveLocalFile; + mLocalBehaviour = localBehaviour; } @@ -147,8 +148,8 @@ public class UploadFileOperation extends RemoteOperation { protected RemoteOperationResult run(WebdavClient client) { RemoteOperationResult result = null; boolean localCopyPassed = false, nameCheckPassed = false; - File temporalFile = null, originalFile = null; String originalStoragePath = mFile.getStoragePath(); + File temporalFile = null, originalFile = new File(originalStoragePath), expectedFile = null; try { /// rename the file to upload, if necessary if (!mForceOverwrite) { @@ -160,35 +161,33 @@ public class UploadFileOperation extends RemoteOperation { } nameCheckPassed = true; - /// check location of local file, and copy to a temporal file to upload it if not in its corresponding directory - String targetLocalPath = FileStorageUtils.getDefaultSavePathFor(mAccount.name, mFile); - if (!originalStoragePath.equals(targetLocalPath)) { + String expectedPath = FileStorageUtils.getDefaultSavePathFor(mAccount.name, mFile); /// not before getAvailableRemotePath() !!! + 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) { + File ocLocalFolder = new File(FileStorageUtils.getSavePath(mAccount.name)); - originalFile = new File(originalStoragePath); - if (!mMoveLocalFile) { - // the file must be copied to the ownCloud local folder - - if (ocLocalFolder.getUsableSpace() < originalFile.length()) { - result = new RemoteOperationResult(ResultCode.LOCAL_STORAGE_FULL); - return result; + if (ocLocalFolder.getUsableSpace() < originalFile.length()) { + result = new RemoteOperationResult(ResultCode.LOCAL_STORAGE_FULL); + return result; // error condition when the file should be copied - } else { - String temporalPath = FileStorageUtils.getTemporalPath(mAccount.name) + mFile.getRemotePath(); - mFile.setStoragePath(temporalPath); - temporalFile = new File(temporalPath); - if (!originalStoragePath.equals(temporalPath)) { // preventing weird but possible situation - InputStream in = new FileInputStream(originalFile); - OutputStream out = new FileOutputStream(temporalFile); - byte[] buf = new byte[1024]; - int len; - while ((len = in.read(buf)) > 0){ - out.write(buf, 0, len); - } - in.close(); - out.close(); + } else { + String temporalPath = FileStorageUtils.getTemporalPath(mAccount.name) + mFile.getRemotePath(); + mFile.setStoragePath(temporalPath); + temporalFile = new File(temporalPath); + if (!originalStoragePath.equals(temporalPath)) { // preventing weird but possible situation + InputStream in = new FileInputStream(originalFile); + OutputStream out = new FileOutputStream(temporalFile); + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) > 0){ + out.write(buf, 0, len); } + in.close(); + out.close(); } - } // else - the file will be MOVED to the corresponding directory AFTER the upload finishes + } } localCopyPassed = true; @@ -205,26 +204,30 @@ public class UploadFileOperation extends RemoteOperation { /// move local temporal file or original file to its corresponding location in the ownCloud local folder if (isSuccess(status)) { - File fileToMove = null; - if (temporalFile != null) { - fileToMove = temporalFile; - } else if (originalFile != null) { - fileToMove = originalFile; - } - if (fileToMove != null) { - mFile.setStoragePath(FileStorageUtils.getDefaultSavePathFor(mAccount.name, mFile)); - File finalFile = new File(mFile.getStoragePath()); - if (!fileToMove.renameTo(finalFile)) { + if (mLocalBehaviour == FileUploader.LOCAL_BEHAVIOUR_FORGET) { + mFile.setStoragePath(null); + + } else { + mFile.setStoragePath(expectedPath); + File fileToMove = null; + if (temporalFile != null) { // FileUploader.LOCAL_BEHAVIOUR_COPY ; see where temporalFile was set + fileToMove = temporalFile; + } 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 (result == null) - result = new RemoteOperationResult(isSuccess(status), status); + result = new RemoteOperationResult(isSuccess(status), status); } catch (Exception e) { + // TODO something cleaner with cancellations if (mCancellationRequested.get()) { result = new RemoteOperationResult(new OperationCancelledException()); } else { diff --git a/src/com/owncloud/android/ui/activity/ConflictsResolveActivity.java b/src/com/owncloud/android/ui/activity/ConflictsResolveActivity.java index 8f008e74..d04d6cee 100644 --- a/src/com/owncloud/android/ui/activity/ConflictsResolveActivity.java +++ b/src/com/owncloud/android/ui/activity/ConflictsResolveActivity.java @@ -73,15 +73,15 @@ public class ConflictsResolveActivity extends SherlockFragmentActivity implement return; case OVERWRITE: i.putExtra(FileUploader.KEY_FORCE_OVERWRITE, true); - case KEEP_BOTH: // fallthrough + break; + case KEEP_BOTH: + i.putExtra(FileUploader.KEY_LOCAL_BEHAVIOUR, FileUploader.LOCAL_BEHAVIOUR_MOVE); break; default: Log.wtf(TAG, "Unhandled conflict decision " + decision); return; } i.putExtra(FileUploader.KEY_ACCOUNT, mOCAccount); - //i.putExtra(FileUploader.KEY_REMOTE_FILE, mRemotePath); - //i.putExtra(FileUploader.KEY_LOCAL_FILE, mLocalPath); i.putExtra(FileUploader.KEY_FILE, mFile); i.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_SINGLE_FILE);