X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/2b6e05f3d2a48c8cd86702b7c384e6aa133c7457..08be3d3433b65d0858dc1503a82ed5a3ba655d36:/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 29a11c42..237c8469 100644 --- a/src/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -24,8 +24,10 @@ import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Set; import java.util.Vector; import android.accounts.Account; @@ -48,6 +50,8 @@ import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.files.FileUtils; import com.owncloud.android.lib.resources.shares.OCShare; import com.owncloud.android.lib.resources.shares.ShareType; +import com.owncloud.android.lib.resources.status.CapabilityBooleanType; +import com.owncloud.android.lib.resources.status.OCCapability; import com.owncloud.android.utils.FileStorageUtils; import java.io.FileInputStream; @@ -88,18 +92,10 @@ public class FileDataStorageManager { return mAccount; } - public void setContentResolver(ContentResolver cr) { - mContentResolver = cr; - } - public ContentResolver getContentResolver() { return mContentResolver; } - public void setContentProviderClient(ContentProviderClient cp) { - mContentProviderClient = cp; - } - public ContentProviderClient getContentProviderClient() { return mContentProviderClient; } @@ -160,12 +156,12 @@ public class FileDataStorageManager { public Vector getFolderImages(OCFile folder/*, boolean onlyOnDevice*/) { - Vector ret = new Vector(); + Vector ret = new Vector(); if (folder != null) { // TODO better implementation, filtering in the access to database instead of here // TODO Enable when "On Device" is recovered ? Vector tmp = getFolderContent(folder/*, onlyOnDevice*/); - OCFile current = null; + OCFile current = null; for (int i=0; i updatedFiles, Collection filesToRemove - ) { - - Log_OC.d(TAG, "Saving folder " + folder.getRemotePath() + " with " + updatedFiles.size() + ) { + + Log_OC.d(TAG, "Saving folder " + folder.getRemotePath() + " with " + updatedFiles.size() + " children and " + filesToRemove.size() + " files to remove"); - ArrayList operations = + ArrayList operations = new ArrayList(updatedFiles.size()); // prepare operations to insert or update files to save in the given folder @@ -289,8 +281,8 @@ public class FileDataStorageManager { ContentValues cv = new ContentValues(); cv.put(ProviderTableMeta.FILE_MODIFIED, file.getModificationTimestamp()); cv.put( - ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA, - file.getModificationTimestampAtLastSyncForData() + ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA, + file.getModificationTimestampAtLastSyncForData() ); cv.put(ProviderTableMeta.FILE_CREATION, file.getCreationTimestamp()); cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, file.getFileLength()); @@ -307,12 +299,14 @@ public class FileDataStorageManager { cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA, file.getLastSyncDateForData()); cv.put(ProviderTableMeta.FILE_KEEP_IN_SYNC, file.isFavorite() ? 1 : 0); cv.put(ProviderTableMeta.FILE_ETAG, file.getEtag()); - cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, file.isShareByLink() ? 1 : 0); + cv.put(ProviderTableMeta.FILE_SHARED_VIA_LINK, file.isSharedViaLink() ? 1 : 0); + cv.put(ProviderTableMeta.FILE_SHARED_WITH_SHAREE, file.isSharedWithSharee() ? 1 : 0); cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, file.getPublicLink()); cv.put(ProviderTableMeta.FILE_PERMISSIONS, file.getPermissions()); cv.put(ProviderTableMeta.FILE_REMOTE_ID, file.getRemoteId()); cv.put(ProviderTableMeta.FILE_UPDATE_THUMBNAIL, file.needsUpdateThumbnail()); cv.put(ProviderTableMeta.FILE_IS_DOWNLOADING, file.isDownloading()); + cv.put(ProviderTableMeta.FILE_ETAG_IN_CONFLICT, file.getEtagInConflict()); boolean existsByPath = fileExists(file.getRemotePath()); if (existsByPath || fileExists(file.getFileId())) { @@ -337,15 +331,14 @@ public class FileDataStorageManager { for (OCFile file : filesToRemove) { if (file.getParentId() == folder.getFileId()) { whereArgs = new String[]{mAccount.name, file.getRemotePath()}; - //Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, "" + file.getFileId()); if (file.isFolder()) { operations.add(ContentProviderOperation.newDelete( ContentUris.withAppendedId( ProviderTableMeta.CONTENT_URI_DIR, file.getFileId() ) ).withSelection(where, whereArgs).build()); - - File localFolder = + + File localFolder = new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, file)); if (localFolder.exists()) { removeLocalFolder(localFolder); @@ -370,8 +363,8 @@ public class FileDataStorageManager { ContentValues cv = new ContentValues(); cv.put(ProviderTableMeta.FILE_MODIFIED, folder.getModificationTimestamp()); cv.put( - ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA, - folder.getModificationTimestampAtLastSyncForData() + ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA, + folder.getModificationTimestampAtLastSyncForData() ); cv.put(ProviderTableMeta.FILE_CREATION, folder.getCreationTimestamp()); cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, 0); @@ -384,7 +377,8 @@ public class FileDataStorageManager { cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA, folder.getLastSyncDateForData()); cv.put(ProviderTableMeta.FILE_KEEP_IN_SYNC, folder.isFavorite() ? 1 : 0); cv.put(ProviderTableMeta.FILE_ETAG, folder.getEtag()); - cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, folder.isShareByLink() ? 1 : 0); + cv.put(ProviderTableMeta.FILE_SHARED_VIA_LINK, folder.isSharedViaLink() ? 1 : 0); + cv.put(ProviderTableMeta.FILE_SHARED_WITH_SHAREE, folder.isSharedWithSharee() ? 1 : 0); cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, folder.getPublicLink()); cv.put(ProviderTableMeta.FILE_PERMISSIONS, folder.getPermissions()); cv.put(ProviderTableMeta.FILE_REMOTE_ID, folder.getRemoteId()); @@ -434,43 +428,9 @@ public class FileDataStorageManager { } } - //updateFolderSize(folder.getFileId()); - } -// /** -// * -// * @param id -// */ -// private void updateFolderSize(long id) { -// if (id > FileDataStorageManager.ROOT_PARENT_ID) { -// Log_OC.d(TAG, "Updating size of " + id); -// if (getContentResolver() != null) { -// getContentResolver().update(ProviderTableMeta.CONTENT_URI_DIR, -// new ContentValues(), - // won't be used, but cannot be null; crashes in KLP -// ProviderTableMeta._ID + "=?", -// new String[] { String.valueOf(id) }); -// } else { -// try { -// getContentProviderClient().update(ProviderTableMeta.CONTENT_URI_DIR, -// new ContentValues(), - // won't be used, but cannot be null; crashes in KLP -// ProviderTableMeta._ID + "=?", -// new String[] { String.valueOf(id) }); -// -// } catch (RemoteException e) { -// Log_OC.e( -// TAG, "Exception in update of folder size through compatibility patch " + e.getMessage()); -// } -// } -// } else { -// Log_OC.e(TAG, "not updating size for folder " + id); -// } -// } - - public boolean removeFile(OCFile file, boolean removeDBData, boolean removeLocalCopy) { boolean success = true; if (file != null) { @@ -479,9 +439,12 @@ public class FileDataStorageManager { } else { if (removeDBData) { - //Uri file_uri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, ""+file.getFileId()); - Uri file_uri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, file.getFileId()); - String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?" + " AND " + ProviderTableMeta.FILE_PATH + "=?"; + //Uri file_uri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, + // ""+file.getFileId()); + Uri file_uri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, + file.getFileId()); + String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?" + " AND " + + ProviderTableMeta.FILE_PATH + "=?"; String[] whereArgs = new String[]{mAccount.name, file.getRemotePath()}; int deleted = 0; if (getContentProviderClient() != null) { @@ -505,6 +468,7 @@ public class FileDataStorageManager { // maybe unnecessary, but should be checked TODO remove if unnecessary file.setStoragePath(null); saveFile(file); + saveConflict(file, null); } } } @@ -529,7 +493,7 @@ public class FileDataStorageManager { private boolean removeFolderInDb(OCFile folder) { Uri folder_uri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, "" + folder.getFileId()); // URI for recursive deletion - String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?" + " AND " + + String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?" + " AND " + ProviderTableMeta.FILE_PATH + "=?"; String [] whereArgs = new String[]{mAccount.name, folder.getRemotePath()}; int deleted = 0; @@ -596,7 +560,7 @@ public class FileDataStorageManager { return success; } - + /** * Updates database and file system for a file or folder that was moved to a different location. * @@ -609,7 +573,8 @@ public class FileDataStorageManager { OCFile targetParent = getFileByPath(targetParentPath); if (targetParent == null) { - throw new IllegalStateException("Parent folder of the target path does not exist!!"); + throw new IllegalStateException( + "Parent folder of the target path does not exist!!"); } /// 1. get all the descendants of the moved element in a single QUERY @@ -666,12 +631,12 @@ public class FileDataStorageManager { // update link to downloaded content - but local move is not done here! String targetLocalPath = defaultSavePath + targetPath + child.getStoragePath().substring(lengthOfOldStoragePath); - + cv.put(ProviderTableMeta.FILE_STORAGE_PATH, targetLocalPath); - + originalPathsToTriggerMediaScan.add(child.getStoragePath()); newPathsToTriggerMediaScan.add(targetLocalPath); - + } if (child.getRemotePath().equals(file.getRemotePath())) { cv.put( @@ -702,7 +667,8 @@ public class FileDataStorageManager { } } catch (Exception e) { - Log_OC.e(TAG, "Fail to update " + file.getFileId() + " and descendants in database", e); + Log_OC.e(TAG, "Fail to update " + file.getFileId() + " and descendants in database", + e); } /// 4. move in local file system @@ -786,7 +752,7 @@ public class FileDataStorageManager { return ret; } - + private Vector getFolderContent(long parentId/*, boolean onlyOnDevice*/) { Vector ret = new Vector(); @@ -816,7 +782,7 @@ public class FileDataStorageManager { OCFile child = createFileInstance(c); // TODO Enable when "On Device" is recovered ? // if (child.isFolder() || !onlyOnDevice || onlyOnDevice && child.isDown()){ - ret.add(child); + ret.add(child); // } } while (c.moveToNext()); } @@ -933,8 +899,10 @@ public class FileDataStorageManager { file.setFavorite(c.getInt( c.getColumnIndex(ProviderTableMeta.FILE_KEEP_IN_SYNC)) == 1 ? true : false); file.setEtag(c.getString(c.getColumnIndex(ProviderTableMeta.FILE_ETAG))); - file.setShareByLink(c.getInt( - c.getColumnIndex(ProviderTableMeta.FILE_SHARE_BY_LINK)) == 1 ? true : false); + file.setShareViaLink(c.getInt( + c.getColumnIndex(ProviderTableMeta.FILE_SHARED_VIA_LINK)) == 1 ? true : false); + file.setShareWithSharee(c.getInt( + c.getColumnIndex(ProviderTableMeta.FILE_SHARED_WITH_SHAREE)) == 1 ? true : false); file.setPublicLink(c.getString(c.getColumnIndex(ProviderTableMeta.FILE_PUBLIC_LINK))); file.setPermissions(c.getString(c.getColumnIndex(ProviderTableMeta.FILE_PERMISSIONS))); file.setRemoteId(c.getString(c.getColumnIndex(ProviderTableMeta.FILE_REMOTE_ID))); @@ -942,44 +910,12 @@ public class FileDataStorageManager { c.getColumnIndex(ProviderTableMeta.FILE_UPDATE_THUMBNAIL)) == 1 ? true : false); file.setDownloading(c.getInt( c.getColumnIndex(ProviderTableMeta.FILE_IS_DOWNLOADING)) == 1 ? true : false); - - } - return file; - } + file.setEtagInConflict(c.getString(c.getColumnIndex(ProviderTableMeta.FILE_ETAG_IN_CONFLICT))); - /** - * Returns if the file/folder is shared by link or not - * - * @param path Path of the file/folder - * @return - */ - public boolean isShareByLink(String path) { - Cursor c = getCursorForValue(ProviderTableMeta.FILE_STORAGE_PATH, path); - OCFile file = null; - if (c.moveToFirst()) { - file = createFileInstance(c); } - c.close(); - return file.isShareByLink(); - } - - /** - * Returns the public link of the file/folder - * - * @param path Path of the file/folder - * @return - */ - public String getPublicLink(String path) { - Cursor c = getCursorForValue(ProviderTableMeta.FILE_STORAGE_PATH, path); - OCFile file = null; - if (c.moveToFirst()) { - file = createFileInstance(c); - } - c.close(); - return file.getPublicLink(); + return file; } - // Methods for Shares public boolean saveShare(OCShare share) { boolean overriden = false; @@ -994,15 +930,15 @@ public class FileDataStorageManager { cv.put(ProviderTableMeta.OCSHARES_EXPIRATION_DATE, share.getExpirationDate()); cv.put(ProviderTableMeta.OCSHARES_TOKEN, share.getToken()); cv.put( - ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME, - share.getSharedWithDisplayName() + ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME, + share.getSharedWithDisplayName() ); cv.put(ProviderTableMeta.OCSHARES_IS_DIRECTORY, share.isFolder() ? 1 : 0); cv.put(ProviderTableMeta.OCSHARES_USER_ID, share.getUserId()); cv.put(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, share.getIdRemoteShared()); cv.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER, mAccount.name); - if (shareExists(share.getIdRemoteShared())) { // for renamed files; no more delete and create + if (shareExists(share.getIdRemoteShared())) {// for renamed files; no more delete and create overriden = true; if (getContentResolver() != null) { getContentResolver().update(ProviderTableMeta.CONTENT_URI_SHARE, cv, @@ -1045,26 +981,29 @@ public class FileDataStorageManager { } - public OCShare getFirstShareByPathAndType(String path, ShareType type) { + public OCShare getFirstShareByPathAndType(String path, ShareType type, String shareWith) { Cursor c = null; + + String selection = ProviderTableMeta.OCSHARES_PATH + "=? AND " + + ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? AND " + + ProviderTableMeta.OCSHARES_SHARE_WITH + "=? AND " + + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?" ; + + String [] selectionArgs = new String[]{path, Integer.toString(type.getValue()), + shareWith, mAccount.name}; + if (getContentResolver() != null) { c = getContentResolver().query( ProviderTableMeta.CONTENT_URI_SHARE, null, - ProviderTableMeta.OCSHARES_PATH + "=? AND " - + ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? AND " - + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?", - new String[]{path, Integer.toString(type.getValue()), mAccount.name}, + selection, selectionArgs, null); } else { try { c = getContentProviderClient().query( ProviderTableMeta.CONTENT_URI_SHARE, null, - ProviderTableMeta.OCSHARES_PATH + "=? AND " - + ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? AND " - + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?", - new String[]{path, Integer.toString(type.getValue()), mAccount.name}, + selection, selectionArgs, null); } catch (RemoteException e) { @@ -1090,6 +1029,8 @@ public class FileDataStorageManager { .getColumnIndex(ProviderTableMeta.OCSHARES_ITEM_SOURCE))); share.setShareType(ShareType.fromValue(c.getInt(c .getColumnIndex(ProviderTableMeta.OCSHARES_SHARE_TYPE)))); + share.setShareWith(c.getString(c + .getColumnIndex(ProviderTableMeta.OCSHARES_SHARE_WITH))); share.setPermissions(c.getInt(c .getColumnIndex(ProviderTableMeta.OCSHARES_PERMISSIONS))); share.setSharedDate(c.getLong(c @@ -1103,7 +1044,8 @@ public class FileDataStorageManager { share.setIsFolder(c.getInt( c.getColumnIndex(ProviderTableMeta.OCSHARES_IS_DIRECTORY)) == 1); share.setUserId(c.getLong(c.getColumnIndex(ProviderTableMeta.OCSHARES_USER_ID))); - share.setIdRemoteShared(c.getLong(c.getColumnIndex(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED))); + share.setIdRemoteShared(c.getLong( + c.getColumnIndex(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED))); } return share; } @@ -1142,9 +1084,10 @@ public class FileDataStorageManager { return shareExists(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, String.valueOf(remoteId)); } - private void cleanSharedFiles() { + private void resetShareFlagsInAllFiles() { ContentValues cv = new ContentValues(); - cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, false); + cv.put(ProviderTableMeta.FILE_SHARED_VIA_LINK, false); + cv.put(ProviderTableMeta.FILE_SHARED_WITH_SHAREE, false); cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, ""); String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?"; String[] whereArgs = new String[]{mAccount.name}; @@ -1154,29 +1097,54 @@ public class FileDataStorageManager { } else { try { - getContentProviderClient().update(ProviderTableMeta.CONTENT_URI, cv, where, whereArgs); + getContentProviderClient().update(ProviderTableMeta.CONTENT_URI, cv, where, + whereArgs); } catch (RemoteException e) { - Log_OC.e(TAG, "Exception in cleanSharedFiles" + e.getMessage()); + Log_OC.e(TAG, "Exception in resetShareFlagsInAllFiles" + e.getMessage()); } } } - private void cleanSharedFilesInFolder(OCFile folder) { + private void resetShareFlagsInFolder(OCFile folder) { ContentValues cv = new ContentValues(); - cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, false); + cv.put(ProviderTableMeta.FILE_SHARED_VIA_LINK, false); + cv.put(ProviderTableMeta.FILE_SHARED_WITH_SHAREE, false); cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, ""); String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + ProviderTableMeta.FILE_PARENT + "=?"; String [] whereArgs = new String[] { mAccount.name , String.valueOf(folder.getFileId()) }; - + if (getContentResolver() != null) { getContentResolver().update(ProviderTableMeta.CONTENT_URI, cv, where, whereArgs); } else { try { - getContentProviderClient().update(ProviderTableMeta.CONTENT_URI, cv, where, whereArgs); + getContentProviderClient().update(ProviderTableMeta.CONTENT_URI, cv, where, + whereArgs); } catch (RemoteException e) { - Log_OC.e(TAG, "Exception in cleanSharedFilesInFolder " + e.getMessage()); + Log_OC.e(TAG, "Exception in resetShareFlagsInFolder " + e.getMessage()); + } + } + } + + private void resetShareFlagInAFile(String filePath){ + ContentValues cv = new ContentValues(); + cv.put(ProviderTableMeta.FILE_SHARED_VIA_LINK, false); + cv.put(ProviderTableMeta.FILE_SHARED_WITH_SHAREE, false); + cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, ""); + String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + + ProviderTableMeta.FILE_PATH+ "=?"; + String [] whereArgs = new String[] { mAccount.name , filePath }; + + if (getContentResolver() != null) { + getContentResolver().update(ProviderTableMeta.CONTENT_URI, cv, where, whereArgs); + + } else { + try { + getContentProviderClient().update(ProviderTableMeta.CONTENT_URI, cv, where, + whereArgs); + } catch (RemoteException e) { + Log_OC.e(TAG, "Exception in resetShareFlagsInFolder " + e.getMessage()); } } } @@ -1190,7 +1158,8 @@ public class FileDataStorageManager { } else { try { - getContentProviderClient().delete(ProviderTableMeta.CONTENT_URI_SHARE, where, whereArgs); + getContentProviderClient().delete(ProviderTableMeta.CONTENT_URI_SHARE, where, + whereArgs); } catch (RemoteException e) { Log_OC.e(TAG, "Exception in cleanShares" + e.getMessage()); } @@ -1200,7 +1169,7 @@ public class FileDataStorageManager { public void saveShares(Collection shares) { cleanShares(); if (shares != null) { - ArrayList operations = + ArrayList operations = new ArrayList(shares.size()); // prepare operations to insert or update files to save in the given folder @@ -1216,8 +1185,8 @@ public class FileDataStorageManager { cv.put(ProviderTableMeta.OCSHARES_EXPIRATION_DATE, share.getExpirationDate()); cv.put(ProviderTableMeta.OCSHARES_TOKEN, share.getToken()); cv.put( - ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME, - share.getSharedWithDisplayName() + ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME, + share.getSharedWithDisplayName() ); cv.put(ProviderTableMeta.OCSHARES_IS_DIRECTORY, share.isFolder() ? 1 : 0); cv.put(ProviderTableMeta.OCSHARES_USER_ID, share.getUserId()); @@ -1228,16 +1197,16 @@ public class FileDataStorageManager { // updating an existing file operations.add( ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI_SHARE). - withValues(cv). - withSelection(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?", - new String[]{String.valueOf(share.getIdRemoteShared())}) - .build()); + withValues(cv). + withSelection(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?", + new String[]{String.valueOf(share.getIdRemoteShared())}) + .build()); } else { // adding a new file operations.add( ContentProviderOperation.newInsert(ProviderTableMeta.CONTENT_URI_SHARE). - withValues(cv). - build() + withValues(cv). + build() ); } } @@ -1246,11 +1215,12 @@ public class FileDataStorageManager { if (operations.size() > 0) { @SuppressWarnings("unused") ContentProviderResult[] results = null; - Log_OC.d(TAG, "Sending " + operations.size() + + Log_OC.d(TAG, "Sending " + operations.size() + " operations to FileContentProvider"); try { if (getContentResolver() != null) { - results = getContentResolver().applyBatch(MainApp.getAuthority(), operations); + results = getContentResolver().applyBatch(MainApp.getAuthority(), + operations); } else { results = getContentProviderClient().applyBatch(operations); } @@ -1267,10 +1237,10 @@ public class FileDataStorageManager { } public void updateSharedFiles(Collection sharedFiles) { - cleanSharedFiles(); + resetShareFlagsInAllFiles(); if (sharedFiles != null) { - ArrayList operations = + ArrayList operations = new ArrayList(sharedFiles.size()); // prepare operations to insert or update files to save in the given folder @@ -1278,8 +1248,8 @@ public class FileDataStorageManager { ContentValues cv = new ContentValues(); cv.put(ProviderTableMeta.FILE_MODIFIED, file.getModificationTimestamp()); cv.put( - ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA, - file.getModificationTimestampAtLastSyncForData() + ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA, + file.getModificationTimestampAtLastSyncForData() ); cv.put(ProviderTableMeta.FILE_CREATION, file.getCreationTimestamp()); cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, file.getFileLength()); @@ -1293,40 +1263,42 @@ public class FileDataStorageManager { cv.put(ProviderTableMeta.FILE_ACCOUNT_OWNER, mAccount.name); cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE, file.getLastSyncDateForProperties()); cv.put( - ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA, - file.getLastSyncDateForData() + ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA, + file.getLastSyncDateForData() ); cv.put(ProviderTableMeta.FILE_KEEP_IN_SYNC, file.isFavorite() ? 1 : 0); cv.put(ProviderTableMeta.FILE_ETAG, file.getEtag()); - cv.put(ProviderTableMeta.FILE_SHARE_BY_LINK, file.isShareByLink() ? 1 : 0); + cv.put(ProviderTableMeta.FILE_SHARED_VIA_LINK, file.isSharedViaLink() ? 1 : 0); + cv.put(ProviderTableMeta.FILE_SHARED_WITH_SHAREE, file.isSharedWithSharee() ? 1 : 0); cv.put(ProviderTableMeta.FILE_PUBLIC_LINK, file.getPublicLink()); cv.put(ProviderTableMeta.FILE_PERMISSIONS, file.getPermissions()); cv.put(ProviderTableMeta.FILE_REMOTE_ID, file.getRemoteId()); cv.put( - ProviderTableMeta.FILE_UPDATE_THUMBNAIL, - file.needsUpdateThumbnail() ? 1 : 0 + ProviderTableMeta.FILE_UPDATE_THUMBNAIL, + file.needsUpdateThumbnail() ? 1 : 0 ); cv.put( ProviderTableMeta.FILE_IS_DOWNLOADING, file.isDownloading() ? 1 : 0 ); + cv.put(ProviderTableMeta.FILE_ETAG_IN_CONFLICT, file.getEtagInConflict()); boolean existsByPath = fileExists(file.getRemotePath()); if (existsByPath || fileExists(file.getFileId())) { // updating an existing file operations.add( ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI). - withValues(cv). - withSelection(ProviderTableMeta._ID + "=?", - new String[]{String.valueOf(file.getFileId())}) - .build()); + withValues(cv). + withSelection(ProviderTableMeta._ID + "=?", + new String[]{String.valueOf(file.getFileId())}) + .build()); } else { // adding a new file operations.add( ContentProviderOperation.newInsert(ProviderTableMeta.CONTENT_URI). - withValues(cv). - build() + withValues(cv). + build() ); } } @@ -1335,7 +1307,7 @@ public class FileDataStorageManager { if (operations.size() > 0) { @SuppressWarnings("unused") ContentProviderResult[] results = null; - Log_OC.d(TAG, "Sending " + operations.size() + + Log_OC.d(TAG, "Sending " + operations.size() + " operations to FileContentProvider"); try { if (getContentResolver() != null) { @@ -1358,8 +1330,8 @@ public class FileDataStorageManager { public void removeShare(OCShare share) { Uri share_uri = ProviderTableMeta.CONTENT_URI_SHARE; String where = ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?" + " AND " + - ProviderTableMeta.FILE_PATH + "=?"; - String [] whereArgs = new String[]{mAccount.name, share.getPath()}; + ProviderTableMeta._ID + "=?"; + String [] whereArgs = new String[]{mAccount.name, Long.toString(share.getId())}; if (getContentProviderClient() != null) { try { getContentProviderClient().delete(share_uri, where, whereArgs); @@ -1372,38 +1344,108 @@ public class FileDataStorageManager { } public void saveSharesDB(ArrayList shares) { - saveShares(shares); - - ArrayList sharedFiles = new ArrayList(); + ArrayList operations = new ArrayList(); - for (OCShare share : shares) { - // Get the path - String path = share.getPath(); - if (share.isFolder()) { - path = path + FileUtils.PATH_SEPARATOR; + // Reset flags & Remove shares for this files + String filePath = ""; + for (OCShare share: shares) { + if (filePath != share.getPath()){ + filePath = share.getPath(); + resetShareFlagInAFile(filePath); + operations = prepareRemoveSharesInFile(filePath, operations); } + } + + // Add operations to insert shares + operations = prepareInsertShares(shares, operations); + + // apply operations in batch + if (operations.size() > 0) { + Log_OC.d(TAG, "Sending " + operations.size() + " operations to FileContentProvider"); + try { + if (getContentResolver() != null) { + getContentResolver().applyBatch(MainApp.getAuthority(), operations); - // Update OCFile with data from share: ShareByLink and publicLink - OCFile file = getFileByPath(path); - if (file != null) { - if (share.getShareType().equals(ShareType.PUBLIC_LINK)) { - file.setShareByLink(true); - sharedFiles.add(file); + } else { + getContentProviderClient().applyBatch(operations); } + + } catch (OperationApplicationException e) { + Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage()); + + } catch (RemoteException e) { + Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage()); } } - updateSharedFiles(sharedFiles); +// // TODO: review if it is needed +// // Update shared files +// ArrayList sharedFiles = new ArrayList(); +// +// for (OCShare share : shares) { +// // Get the path +// String path = share.getPath(); +// if (share.isFolder()) { +// path = path + FileUtils.PATH_SEPARATOR; +// } +// +// // Update OCFile with data from share: ShareByLink, publicLink and +// OCFile file = getFileByPath(path); +// if (file != null) { +// if (share.getShareType().equals(ShareType.PUBLIC_LINK)) { +// file.setShareViaLink(true); +// sharedFiles.add(file); +// } +// } +// } +// +// // TODO: Review +// updateSharedFiles(sharedFiles); } public void saveSharesInFolder(ArrayList shares, OCFile folder) { - cleanSharedFilesInFolder(folder); + resetShareFlagsInFolder(folder); ArrayList operations = new ArrayList(); operations = prepareRemoveSharesInFolder(folder, operations); if (shares != null) { // prepare operations to insert or update files to save in the given folder + operations = prepareInsertShares(shares, operations); + } + + // apply operations in batch + if (operations.size() > 0) { + Log_OC.d(TAG, "Sending " + operations.size() + " operations to FileContentProvider"); + try { + if (getContentResolver() != null) { + getContentResolver().applyBatch(MainApp.getAuthority(), operations); + + } else { + getContentProviderClient().applyBatch(operations); + } + + } catch (OperationApplicationException e) { + Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage()); + + } catch (RemoteException e) { + + } + } + + } + + /** + * Prepare operations to insert or update files to save in the given folder + * @param shares List of shares to insert + * @param operations List of operations + * @return + */ + private ArrayList prepareInsertShares( + ArrayList shares, ArrayList operations) { + + if (shares != null) { + // prepare operations to insert or update files to save in the given folder for (OCShare share : shares) { ContentValues cv = new ContentValues(); cv.put(ProviderTableMeta.OCSHARES_FILE_SOURCE, share.getFileSource()); @@ -1416,58 +1458,23 @@ public class FileDataStorageManager { cv.put(ProviderTableMeta.OCSHARES_EXPIRATION_DATE, share.getExpirationDate()); cv.put(ProviderTableMeta.OCSHARES_TOKEN, share.getToken()); cv.put( - ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME, - share.getSharedWithDisplayName() + ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME, + share.getSharedWithDisplayName() ); cv.put(ProviderTableMeta.OCSHARES_IS_DIRECTORY, share.isFolder() ? 1 : 0); cv.put(ProviderTableMeta.OCSHARES_USER_ID, share.getUserId()); cv.put(ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED, share.getIdRemoteShared()); cv.put(ProviderTableMeta.OCSHARES_ACCOUNT_OWNER, mAccount.name); - /* - if (shareExists(share.getIdRemoteShared())) { - // updating an existing share resource - operations.add( - ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI_SHARE). - withValues(cv). - withSelection( ProviderTableMeta.OCSHARES_ID_REMOTE_SHARED + "=?", - new String[] { String.valueOf(share.getIdRemoteShared()) }) - .build()); - - } else { - */ // adding a new share resource operations.add( ContentProviderOperation.newInsert(ProviderTableMeta.CONTENT_URI_SHARE). - withValues(cv). - build() + withValues(cv). + build() ); - //} - } - } - - // apply operations in batch - if (operations.size() > 0) { - @SuppressWarnings("unused") - ContentProviderResult[] results = null; - Log_OC.d(TAG, "Sending " + operations.size() + " operations to FileContentProvider"); - try { - if (getContentResolver() != null) { - results = getContentResolver().applyBatch(MainApp.getAuthority(), operations); - - } else { - results = getContentProviderClient().applyBatch(operations); - } - - } catch (OperationApplicationException e) { - Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage()); - - } catch (RemoteException e) { - Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage()); } } - //} - + return operations; } private ArrayList prepareRemoveSharesInFolder( @@ -1479,55 +1486,75 @@ public class FileDataStorageManager { // TODO Enable when "On Device" is recovered ? Vector files = getFolderContent(folder /*, false*/); - + for (OCFile file : files) { whereArgs[0] = file.getRemotePath(); preparedOperations.add( ContentProviderOperation.newDelete(ProviderTableMeta.CONTENT_URI_SHARE). - withSelection(where, whereArgs). - build() + withSelection(where, whereArgs). + build() ); } } return preparedOperations; - - /* - if (operations.size() > 0) { - try { - if (getContentResolver() != null) { - getContentResolver().applyBatch(MainApp.getAuthority(), operations); - } else { - getContentProviderClient().applyBatch(operations); - } + } - } catch (OperationApplicationException e) { - Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage()); + private ArrayList prepareRemoveSharesInFile( + String filePath, ArrayList preparedOperations) { + + String where = ProviderTableMeta.OCSHARES_PATH + "=?" + " AND " + + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?"; + String[] whereArgs = new String[]{filePath, mAccount.name}; + + preparedOperations.add( + ContentProviderOperation.newDelete(ProviderTableMeta.CONTENT_URI_SHARE). + withSelection(where, whereArgs). + build() + ); + + return preparedOperations; + + } + + public ArrayList getSharesWithForAFile(String filePath, String accountName){ + // Condition + String where = ProviderTableMeta.OCSHARES_PATH + "=?" + " AND " + + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?"+ "AND" + + " (" + ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? OR " + + ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? ) "; + String [] whereArgs = new String[]{ filePath, accountName , + Integer.toString(ShareType.USER.getValue()), + Integer.toString(ShareType.GROUP.getValue()) }; + + Cursor c = null; + if (getContentResolver() != null) { + c = getContentResolver().query( + ProviderTableMeta.CONTENT_URI_SHARE, + null, where, whereArgs, null); + } else { + try { + c = getContentProviderClient().query( + ProviderTableMeta.CONTENT_URI_SHARE, + null, where, whereArgs, null); } catch (RemoteException e) { - Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage()); + Log_OC.e(TAG, "Could not get list of shares with: " + e.getMessage()); + c = null; } - } - */ - - /* - if (getContentResolver() != null) { - - getContentResolver().delete(ProviderTableMeta.CONTENT_URI_SHARE, - where, - whereArgs); - } else { - try { - getContentProviderClient().delete( ProviderTableMeta.CONTENT_URI_SHARE, - where, - whereArgs); + } + ArrayList shares = new ArrayList(); + OCShare share = null; + if (c.moveToFirst()) { + do { + share = createShareInstance(c); + shares.add(share); + // } + } while (c.moveToNext()); + } + c.close(); - } catch (RemoteException e) { - Log_OC.e(TAG, "Exception deleting shares in a folder " + e.getMessage()); - } - } - */ - //} + return shares; } public void triggerMediaScan(String path) { @@ -1578,4 +1605,317 @@ public class FileDataStorageManager { } + public void saveConflict(OCFile file, String etagInConflict) { + if (!file.isDown()) { + etagInConflict = null; + } + ContentValues cv = new ContentValues(); + cv.put(ProviderTableMeta.FILE_ETAG_IN_CONFLICT, etagInConflict); + int updated = 0; + if (getContentResolver() != null) { + updated = getContentResolver().update( + ProviderTableMeta.CONTENT_URI_FILE, + cv, + ProviderTableMeta._ID + "=?", + new String[] { String.valueOf(file.getFileId())} + ); + } else { + try { + updated = getContentProviderClient().update( + ProviderTableMeta.CONTENT_URI_FILE, + cv, + ProviderTableMeta._ID + "=?", + new String[]{String.valueOf(file.getFileId())} + ); + } catch (RemoteException e) { + Log_OC.e(TAG, "Failed saving conflict in database " + e.getMessage()); + } + } + + Log_OC.d(TAG, "Number of files updated with CONFLICT: " + updated); + + if (updated > 0) { + if (etagInConflict != null) { + /// set conflict in all ancestor folders + + long parentId = file.getParentId(); + Set ancestorIds = new HashSet(); + while (parentId != FileDataStorageManager.ROOT_PARENT_ID) { + ancestorIds.add(Long.toString(parentId)); + parentId = getFileById(parentId).getParentId(); + } + + if (ancestorIds.size() > 0) { + StringBuffer whereBuffer = new StringBuffer(); + whereBuffer.append(ProviderTableMeta._ID).append(" IN ("); + for (int i = 0; i < ancestorIds.size() - 1; i++) { + whereBuffer.append("?,"); + } + whereBuffer.append("?"); + whereBuffer.append(")"); + + if (getContentResolver() != null) { + updated = getContentResolver().update( + ProviderTableMeta.CONTENT_URI_FILE, + cv, + whereBuffer.toString(), + ancestorIds.toArray(new String[]{}) + ); + } else { + try { + updated = getContentProviderClient().update( + ProviderTableMeta.CONTENT_URI_FILE, + cv, + whereBuffer.toString(), + ancestorIds.toArray(new String[]{}) + ); + } catch (RemoteException e) { + Log_OC.e(TAG, "Failed saving conflict in database " + e.getMessage()); + } + } + } // else file is ROOT folder, no parent to set in conflict + + } else { + /// update conflict in ancestor folders + // (not directly unset; maybe there are more conflicts below them) + String parentPath = file.getRemotePath(); + if (parentPath.endsWith(OCFile.PATH_SEPARATOR)) { + parentPath = parentPath.substring(0, parentPath.length() - 1); + } + parentPath = parentPath.substring(0, parentPath.lastIndexOf(OCFile.PATH_SEPARATOR) + 1); + + Log_OC.d(TAG, "checking parents to remove conflict; STARTING with " + parentPath); + while (parentPath.length() > 0) { + + String where = + ProviderTableMeta.FILE_ETAG_IN_CONFLICT + " IS NOT NULL AND " + + ProviderTableMeta.FILE_CONTENT_TYPE + " != 'DIR' AND " + + ProviderTableMeta.FILE_ACCOUNT_OWNER + " = ? AND " + + ProviderTableMeta.FILE_PATH + " LIKE ?"; + Cursor descendentsInConflict = getContentResolver().query( + ProviderTableMeta.CONTENT_URI_FILE, + new String[]{ProviderTableMeta._ID}, + where, + new String[]{mAccount.name, parentPath + "%"}, + null + ); + if (descendentsInConflict == null || descendentsInConflict.getCount() == 0) { + Log_OC.d(TAG, "NO MORE conflicts in " + parentPath); + if (getContentResolver() != null) { + updated = getContentResolver().update( + ProviderTableMeta.CONTENT_URI_FILE, + cv, + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + + ProviderTableMeta.FILE_PATH + "=?", + new String[]{mAccount.name, parentPath} + ); + } else { + try { + updated = getContentProviderClient().update( + ProviderTableMeta.CONTENT_URI_FILE, + cv, + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + + ProviderTableMeta.FILE_PATH + "=?" + , new String[]{mAccount.name, parentPath} + ); + } catch (RemoteException e) { + Log_OC.e(TAG, "Failed saving conflict in database " + e.getMessage()); + } + } + + } else { + Log_OC.d(TAG, "STILL " + descendentsInConflict.getCount() + " in " + parentPath); + } + + if (descendentsInConflict != null) { + descendentsInConflict.close(); + } + + parentPath = parentPath.substring(0, parentPath.length() - 1); // trim last / + parentPath = parentPath.substring(0, parentPath.lastIndexOf(OCFile.PATH_SEPARATOR) + 1); + Log_OC.d(TAG, "checking parents to remove conflict; NEXT " + parentPath); + } + } + } + + } + + public OCCapability saveCapabilities(OCCapability capability){ + + // Prepare capabilities data + ContentValues cv = new ContentValues(); + cv.put(ProviderTableMeta.CAPABILITIES_ACCOUNT_NAME, mAccount.name); + cv.put(ProviderTableMeta.CAPABILITIES_VERSION_MAYOR, capability.getVersionMayor()); + cv.put(ProviderTableMeta.CAPABILITIES_VERSION_MINOR, capability.getVersionMinor()); + cv.put(ProviderTableMeta.CAPABILITIES_VERSION_MICRO, capability.getVersionMicro()); + cv.put(ProviderTableMeta.CAPABILITIES_VERSION_STRING, capability.getVersionString()); + cv.put(ProviderTableMeta.CAPABILITIES_VERSION_EDITION, capability.getVersionEdition()); + cv.put(ProviderTableMeta.CAPABILITIES_CORE_POLLINTERVAL, capability.getCorePollinterval()); + cv.put(ProviderTableMeta.CAPABILITIES_SHARING_API_ENABLED, capability.getFilesSharingApiEnabled().getValue()); + cv.put(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_ENABLED, + capability.getFilesSharingPublicEnabled().getValue()); + cv.put(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_PASSWORD_ENFORCED, + capability.getFilesSharingPublicPasswordEnforced().getValue()); + cv.put(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_EXPIRE_DATE_ENABLED, + capability.getFilesSharingPublicExpireDateEnabled().getValue()); + cv.put(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_EXPIRE_DATE_DAYS, + capability.getFilesSharingPublicExpireDateDays()); + cv.put(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_EXPIRE_DATE_ENFORCED, + capability.getFilesSharingPublicExpireDateEnforced().getValue()); + cv.put(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_SEND_MAIL, + capability.getFilesSharingPublicSendMail().getValue()); + cv.put(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_UPLOAD, + capability.getFilesSharingPublicUpload().getValue()); + cv.put(ProviderTableMeta.CAPABILITIES_SHARING_USER_SEND_MAIL, + capability.getFilesSharingUserSendMail().getValue()); + cv.put(ProviderTableMeta.CAPABILITIES_SHARING_RESHARING, capability.getFilesSharingResharing().getValue()); + cv.put(ProviderTableMeta.CAPABILITIES_SHARING_FEDERATION_OUTGOING, + capability.getFilesSharingFederationOutgoing().getValue()); + cv.put(ProviderTableMeta.CAPABILITIES_SHARING_FEDERATION_INCOMING, + capability.getFilesSharingFederationIncoming().getValue()); + cv.put(ProviderTableMeta.CAPABILITIES_FILES_BIGFILECHUNKING, capability.getFilesBigFileChuncking().getValue()); + cv.put(ProviderTableMeta.CAPABILITIES_FILES_UNDELETE, capability.getFilesUndelete().getValue()); + cv.put(ProviderTableMeta.CAPABILITIES_FILES_VERSIONING, capability.getFilesVersioning().getValue()); + + if (capabilityExists(mAccount.name)) { + if (getContentResolver() != null) { + getContentResolver().update(ProviderTableMeta.CONTENT_URI_CAPABILITIES, cv, + ProviderTableMeta.CAPABILITIES_ACCOUNT_NAME + "=?", + new String[]{mAccount.name}); + } else { + try { + getContentProviderClient().update(ProviderTableMeta.CONTENT_URI_CAPABILITIES, + cv, ProviderTableMeta.CAPABILITIES_ACCOUNT_NAME + "=?", + new String[]{mAccount.name}); + } catch (RemoteException e) { + Log_OC.e(TAG, + "Fail to insert insert file to database " + + e.getMessage()); + } + } + } else { + Uri result_uri = null; + if (getContentResolver() != null) { + result_uri = getContentResolver().insert( + ProviderTableMeta.CONTENT_URI_CAPABILITIES, cv); + } else { + try { + result_uri = getContentProviderClient().insert( + ProviderTableMeta.CONTENT_URI_CAPABILITIES, cv); + } catch (RemoteException e) { + Log_OC.e(TAG, + "Fail to insert insert capability to database " + + e.getMessage()); + } + } + if (result_uri != null) { + long new_id = Long.parseLong(result_uri.getPathSegments() + .get(1)); + capability.setId(new_id); + capability.setAccountName(mAccount.name); + } + } + + return capability; + } + + private boolean capabilityExists(String accountName) { + Cursor c = getCapabilityCursorForAccount(accountName); + boolean exists = false; + if (c != null) { + exists = c.moveToFirst(); + c.close(); + } + return exists; + } + + private Cursor getCapabilityCursorForAccount(String accountName){ + Cursor c = null; + if (getContentResolver() != null) { + c = getContentResolver() + .query(ProviderTableMeta.CONTENT_URI_CAPABILITIES, + null, + ProviderTableMeta.CAPABILITIES_ACCOUNT_NAME + "=? ", + new String[]{accountName}, null); + } else { + try { + c = getContentProviderClient().query( + ProviderTableMeta.CONTENT_URI_CAPABILITIES, + null, + ProviderTableMeta.CAPABILITIES_ACCOUNT_NAME + "=? ", + new String[]{accountName}, null); + } catch (RemoteException e) { + Log_OC.e(TAG, + "Couldn't determine capability existance, assuming non existance: " + + e.getMessage()); + } + } + + return c; + + } + public OCCapability getCapability(String accountName){ + OCCapability capability = null; + Cursor c = getCapabilityCursorForAccount(accountName); + + if (c.moveToFirst()) { + capability = createCapabilityInstance(c); + } + c.close(); + return capability; + } + + private OCCapability createCapabilityInstance(Cursor c) { + OCCapability capability = null; + if (c != null) { + capability = new OCCapability(); + capability.setId(c.getLong(c.getColumnIndex(ProviderTableMeta._ID))); + capability.setAccountName(c.getString(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_ACCOUNT_NAME))); + capability.setVersionMayor(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_VERSION_MAYOR))); + capability.setVersionMinor(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_VERSION_MINOR))); + capability.setVersionMicro(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_VERSION_MICRO))); + capability.setVersionString(c.getString(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_VERSION_STRING))); + capability.setVersionEdition(c.getString(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_VERSION_EDITION))); + capability.setCorePollinterval(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_CORE_POLLINTERVAL))); + capability.setFilesSharingApiEnabled(CapabilityBooleanType.fromValue(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_SHARING_API_ENABLED)))); + capability.setFilesSharingPublicEnabled(CapabilityBooleanType.fromValue(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_ENABLED)))); + capability.setFilesSharingPublicPasswordEnforced(CapabilityBooleanType.fromValue(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_PASSWORD_ENFORCED)))); + capability.setFilesSharingPublicExpireDateEnabled(CapabilityBooleanType.fromValue(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_EXPIRE_DATE_ENABLED)))); + capability.setFilesSharingPublicExpireDateDays(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_EXPIRE_DATE_DAYS))); + capability.setFilesSharingPublicExpireDateEnforced(CapabilityBooleanType.fromValue(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_EXPIRE_DATE_ENFORCED)))); + capability.setFilesSharingPublicSendMail(CapabilityBooleanType.fromValue(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_SEND_MAIL)))); + capability.setFilesSharingPublicUpload(CapabilityBooleanType.fromValue(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_SHARING_PUBLIC_UPLOAD)))); + capability.setFilesSharingUserSendMail(CapabilityBooleanType.fromValue(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_SHARING_USER_SEND_MAIL)))); + capability.setFilesSharingResharing(CapabilityBooleanType.fromValue(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_SHARING_RESHARING)))); + capability.setFilesSharingFederationOutgoing(CapabilityBooleanType.fromValue(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_SHARING_FEDERATION_OUTGOING)))); + capability.setFilesSharingFederationIncoming(CapabilityBooleanType.fromValue(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_SHARING_FEDERATION_INCOMING)))); + capability.setFilesBigFileChuncking(CapabilityBooleanType.fromValue(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_FILES_BIGFILECHUNKING)))); + capability.setFilesUndelete(CapabilityBooleanType.fromValue(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_FILES_UNDELETE)))); + capability.setFilesVersioning(CapabilityBooleanType.fromValue(c.getInt(c + .getColumnIndex(ProviderTableMeta.CAPABILITIES_FILES_VERSIONING)))); + + } + return capability; + } }