Fixed lack of File#getUsableSpace() in Android versions previous to GINGERBREAD
[pub/Android/ownCloud.git] / src / com / owncloud / android / operations / UploadFileOperation.java
index 6f3cd9c..9c570ea 100644 (file)
@@ -143,7 +143,6 @@ public class UploadFileOperation extends RemoteOperation {
         mDataTransferListeners.add(listener);
     }
     
-
     @Override
     protected RemoteOperationResult run(WebdavClient client) {
         RemoteOperationResult result = null;
@@ -167,8 +166,7 @@ public class UploadFileOperation extends RemoteOperation {
             /// 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));
-                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
                         
@@ -177,15 +175,33 @@ public class UploadFileOperation extends RemoteOperation {
                     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);
+                        InputStream in = null;
+                        OutputStream out = null;
+                        try {
+                            in = new FileInputStream(originalFile);
+                            out = new FileOutputStream(temporalFile);
+                            byte[] buf = new byte[1024];
+                            int len;
+                            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);
+                            }
+                            try {
+                                if (out != null) out.close();
+                            } catch (Exception e) {
+                                Log.d(TAG, "Weird exception while closing output stream for " + expectedPath + " (ignoring)", e);
+                            }
                         }
-                        in.close();
-                        out.close();
                     }
                 }
             }
@@ -217,8 +233,11 @@ public class UploadFileOperation extends RemoteOperation {
                     }
                     expectedFile = new File(mFile.getStoragePath());
                     if (!expectedFile.equals(fileToMove) && !fileToMove.renameTo(expectedFile)) {
-                        result = new RemoteOperationResult(ResultCode.LOCAL_STORAGE_NOT_MOVED);
-                        return result;
+                        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;
                     }
                 } 
             }