X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/ac646c657491e5a17d82118d5283b484d83f44de..32dadbcc6ca0de9924f216f81c6a124862ab3136:/src/com/owncloud/android/operations/UploadFileOperation.java diff --git a/src/com/owncloud/android/operations/UploadFileOperation.java b/src/com/owncloud/android/operations/UploadFileOperation.java index e7b5ba3d..512056ba 100644 --- a/src/com/owncloud/android/operations/UploadFileOperation.java +++ b/src/com/owncloud/android/operations/UploadFileOperation.java @@ -26,6 +26,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.nio.channels.FileChannel; import java.util.HashSet; import java.util.Iterator; import java.util.Set; @@ -332,7 +333,9 @@ public class UploadFileOperation extends RemoteOperation { if (result.isSuccess()) { if (mLocalBehaviour == FileUploader.LOCAL_BEHAVIOUR_FORGET) { mFile.setStoragePath(null); - + } else if (mLocalBehaviour == FileUploader.LOCAL_BEHAVIOUR_REMOVE){ + mFile.setStoragePath(null); + originalFile.delete(); } else { mFile.setStoragePath(expectedPath); File fileToMove = null; @@ -346,23 +349,42 @@ public class UploadFileOperation extends RemoteOperation { 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 very 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; + + if (expectedFolder.isDirectory()){ + if (!fileToMove.renameTo(expectedFile)){ + // try to copy and then delete + expectedFile.createNewFile(); + FileChannel inChannel = new FileInputStream(fileToMove).getChannel(); + FileChannel outChannel = new FileOutputStream(expectedFile).getChannel(); + + try { + inChannel.transferTo(0, inChannel.size(), outChannel); + fileToMove.delete(); + } catch (Exception e){ + 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 very 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; + } + finally { + if (inChannel != null) inChannel.close(); + if (outChannel != null) outChannel.close(); + } + } + + } else { + mFile.setStoragePath(null); } } - FileDataStorageManager.triggerMediaScan(originalFile.getAbsolutePath()); - FileDataStorageManager.triggerMediaScan(expectedFile.getAbsolutePath()); } - + FileDataStorageManager.triggerMediaScan(originalFile.getAbsolutePath()); + FileDataStorageManager.triggerMediaScan(expectedFile.getAbsolutePath()); } else if (result.getHttpCode() == HttpStatus.SC_PRECONDITION_FAILED ) { result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT); } @@ -374,6 +396,9 @@ public class UploadFileOperation extends RemoteOperation { if (temporalFile != null && !originalFile.equals(temporalFile)) { temporalFile.delete(); } + if (result == null){ + return new RemoteOperationResult(false, 404, null); + } if (result.isSuccess()) { Log_OC.i(TAG, "Upload of " + mOriginalStoragePath + " to " + mRemotePath + ": " + result.getLogMessage());