X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/8a1e3f743e0ac0b1f8ea4fe2335ada60b4118339..c928626bfa96918cbcffeb44b371e9feca63da52:/src/com/owncloud/android/datamodel/FileDataStorageManager.java diff --git a/src/com/owncloud/android/datamodel/FileDataStorageManager.java b/src/com/owncloud/android/datamodel/FileDataStorageManager.java index c8c0d24d..fb570203 100644 --- a/src/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -612,6 +612,121 @@ public class FileDataStorageManager { } + public void moveLocalFile(OCFile file, String targetPath, String targetParentPath) { + + if (file != null && file.fileExists() && !OCFile.ROOT_PATH.equals(file.getFileName())) { + + OCFile targetParent = getFileByPath(targetParentPath); + if (targetParent == null) { + // TODO panic + } + + /// 1. get all the descendants of the moved element in a single QUERY + Cursor c = null; + if (getContentProviderClient() != null) { + try { + c = getContentProviderClient().query( + ProviderTableMeta.CONTENT_URI, + null, + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + + ProviderTableMeta.FILE_PATH + " LIKE ? ", + new String[] { + mAccount.name, + file.getRemotePath() + "%" + }, + ProviderTableMeta.FILE_PATH + " ASC " + ); + } catch (RemoteException e) { + Log_OC.e(TAG, e.getMessage()); + } + + } else { + c = getContentResolver().query( + ProviderTableMeta.CONTENT_URI, + null, + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + + ProviderTableMeta.FILE_PATH + " LIKE ? ", + new String[] { + mAccount.name, + file.getRemotePath() + "%" + }, + ProviderTableMeta.FILE_PATH + " ASC " + ); + } + + /// 2. prepare a batch of update operations to change all the descendants + ArrayList operations = + new ArrayList(c.getCount()); + String defaultSavePath = FileStorageUtils.getSavePath(mAccount.name); + if (c.moveToFirst()) { + int lengthOfOldPath = file.getRemotePath().length(); + int lengthOfOldStoragePath = defaultSavePath.length() + lengthOfOldPath; + do { + ContentValues cv = new ContentValues(); // keep construction in the loop + OCFile child = createFileInstance(c); + cv.put( + ProviderTableMeta.FILE_PATH, + targetPath + child.getRemotePath().substring(lengthOfOldPath) + ); + if (child.getStoragePath() != null && + child.getStoragePath().startsWith(defaultSavePath)) { + // update link to downloaded content - but local move is not done here! + cv.put( + ProviderTableMeta.FILE_STORAGE_PATH, + defaultSavePath + targetPath + + child.getStoragePath().substring(lengthOfOldStoragePath) + ); + } + if (child.getRemotePath().equals(file.getRemotePath())) { + cv.put( + ProviderTableMeta.FILE_PARENT, + targetParent.getFileId() + ); + } + operations.add( + ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI). + withValues(cv). + withSelection( + ProviderTableMeta._ID + "=?", + new String[] { String.valueOf(child.getFileId()) } + ) + .build()); + + } while (c.moveToNext()); + } + c.close(); + + /// 3. apply updates in batch + try { + if (getContentResolver() != null) { + getContentResolver().applyBatch(MainApp.getAuthority(), operations); + + } else { + getContentProviderClient().applyBatch(operations); + } + + } catch (Exception e) { + Log_OC.e( + TAG, + "Fail to update " + file.getFileId() + " and descendants in database", + e + ); + } + + /// 4. move in local file system + String localPath = FileStorageUtils.getDefaultSavePathFor(mAccount.name, file); + File localFile = new File(localPath); + boolean renamed = false; + if (localFile.exists()) { + renamed = localFile.renameTo(new File(defaultSavePath + targetPath)); + } + Log_OC.d(TAG, "Local file RENAMED : " + renamed); + + } + + } + + private Vector getFolderContent(long parentId) { Vector ret = new Vector(); @@ -1302,4 +1417,5 @@ public class FileDataStorageManager { */ //} } + }