X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/22a789e8d2cecffc6b445f4487ddaada2d6f5e4a..6cfa24f55ab605770df08a6bed889bfccf0c0888:/src/com/owncloud/android/operations/SynchronizeFolderOperation.java diff --git a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java index bfff6800..849413fd 100644 --- a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java +++ b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java @@ -19,7 +19,14 @@ package com.owncloud.android.operations; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Vector; import org.apache.http.HttpStatus; @@ -73,6 +80,8 @@ public class SynchronizeFolderOperation extends RemoteOperation { private int mConflictsFound; private int mFailsInFavouritesFound; + + private Map mForgottenLocalFiles; public SynchronizeFolderOperation( String remotePath, @@ -87,6 +96,7 @@ public class SynchronizeFolderOperation extends RemoteOperation { mStorageManager = dataStorageManager; mAccount = account; mContext = context; + mForgottenLocalFiles = new HashMap(); } @@ -98,6 +108,10 @@ public class SynchronizeFolderOperation extends RemoteOperation { return mFailsInFavouritesFound; } + public Map getForgottenLocalFiles() { + return mForgottenLocalFiles; + } + /** * Returns the list of files and folders contained in the synchronized folder, if called after synchronization is complete. * @@ -113,6 +127,7 @@ public class SynchronizeFolderOperation extends RemoteOperation { RemoteOperationResult result = null; mFailsInFavouritesFound = 0; mConflictsFound = 0; + mForgottenLocalFiles.clear(); // code before in FileSyncAdapter.fetchData PropFindMethod query = null; @@ -149,6 +164,8 @@ public class SynchronizeFolderOperation extends RemoteOperation { if (oldFile != null) { file.setKeepInSync(oldFile.keepInSync()); file.setLastSyncDateForData(oldFile.getLastSyncDateForData()); + file.setModificationTimestampAtLastSyncForData(oldFile.getModificationTimestampAtLastSyncForData()); // must be kept unchanged when the file contents are not updated + checkAndFixForeignStoragePath(oldFile); file.setStoragePath(oldFile.getStoragePath()); } @@ -263,10 +280,74 @@ public class SynchronizeFolderOperation extends RemoteOperation { file.setCreationTimestamp(we.createTimestamp()); file.setFileLength(we.contentLength()); file.setMimetype(we.contentType()); - file.setModificationTimestamp(we.modifiedTimesamp()); + file.setModificationTimestamp(we.modifiedTimestamp()); file.setParentId(mParentId); return file; } + /** + * Checks the storage path of the OCFile received as parameter. If it's out of the local ownCloud folder, + * tries to copy the file inside it. + * + * If the copy fails, the link to the local file is nullified. The account of forgotten files is kept in + * {@link #mForgottenLocalFiles} + * + * @param file File to check and fix. + */ + private void checkAndFixForeignStoragePath(OCFile file) { + String storagePath = file.getStoragePath(); + String expectedPath = FileStorageUtils.getDefaultSavePathFor(mAccount.name, file); + if (storagePath != null && !storagePath.equals(expectedPath)) { + /// fix storagePaths out of the local ownCloud folder + File originalFile = new File(storagePath); + if (FileStorageUtils.getUsableSpace(mAccount.name) < originalFile.length()) { + mForgottenLocalFiles.put(file.getRemotePath(), storagePath); + file.setStoragePath(null); + + } else { + InputStream in = null; + OutputStream out = null; + try { + File expectedFile = new File(expectedPath); + File expectedParent = expectedFile.getParentFile(); + expectedParent.mkdirs(); + if (!expectedParent.isDirectory()) { + throw new IOException("Unexpected error: parent directory could not be created"); + } + expectedFile.createNewFile(); + if (!expectedFile.isFile()) { + throw new IOException("Unexpected error: target file could not be created"); + } + in = new FileInputStream(originalFile); + out = new FileOutputStream(expectedFile); + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) > 0){ + out.write(buf, 0, len); + } + file.setStoragePath(expectedPath); + + } catch (Exception e) { + Log.e(TAG, "Exception while copying foreign file " + expectedPath, e); + mForgottenLocalFiles.put(file.getRemotePath(), storagePath); + file.setStoragePath(null); + + } finally { + try { + if (in != null) in.close(); + } catch (Exception e) { + Log.d(TAG, "Weird exception while closing input stream for " + storagePath + " (ignoring)", e); + } + try { + if (out != null) out.close(); + } catch (Exception e) { + Log.d(TAG, "Weird exception while closing output stream for " + expectedPath + " (ignoring)", e); + } + } + } + } + } + + }