X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/5aaa4e10e8bad5d12d3f7cfa319ab59428c2fe7f..007ca522ecce66d5e346ecca1daae0a7144dd530:/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 450cc3ed..73daed3f 100644 --- a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java +++ b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java @@ -23,6 +23,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -30,7 +31,6 @@ import java.util.Vector; import org.apache.http.HttpStatus; import org.apache.jackrabbit.webdav.DavConstants; -import org.apache.jackrabbit.webdav.MultiStatus; import org.apache.jackrabbit.webdav.client.methods.PropFindMethod; import android.accounts.Account; @@ -46,6 +46,7 @@ import com.owncloud.android.oc_framework.operations.RemoteOperation; import com.owncloud.android.oc_framework.operations.RemoteOperationResult; import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode; import com.owncloud.android.oc_framework.operations.remote.ReadRemoteFileOperation; +import com.owncloud.android.oc_framework.operations.RemoteFile; import com.owncloud.android.syncadapter.FileSyncService; import com.owncloud.android.utils.FileStorageUtils; import com.owncloud.android.utils.Log_OC; @@ -248,8 +249,9 @@ public class SynchronizeFolderOperation extends RemoteOperation { Log_OC.d(TAG, "Synchronizing " + mAccount.name + remotePath); if (result.isSuccess()) { - MultiStatus dataInServer = ((ReadRemoteFileOperation) operation).getDataInServer(); - synchronizeData(dataInServer, client); + RemoteFile folder = result.getFile(); + ArrayList files = result.getData(); + synchronizeData(folder, files, client); if (mConflictsFound > 0 || mFailsInFavouritesFound > 0) { result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT); // should be different result, but will do the job } @@ -258,72 +260,9 @@ public class SynchronizeFolderOperation extends RemoteOperation { removeLocalFolder(); } -// RemoteOperationResult result = null; -// String remotePath = null; -// PropFindMethod query = null; -// try { -// remotePath = mLocalFolder.getRemotePath(); -// Log_OC.d(TAG, "Synchronizing " + mAccount.name + remotePath); -// -// // remote request -// query = new PropFindMethod(client.getBaseUri() + WebdavUtils.encodePath(remotePath), -// DavConstants.PROPFIND_ALL_PROP, -// DavConstants.DEPTH_1); -// int status = client.executeMethod(query); -// -// // check and process response -// if (isMultiStatus(status)) { -// synchronizeData(query.getResponseBodyAsMultiStatus(), client); -// if (mConflictsFound > 0 || mFailsInFavouritesFound > 0) { -// result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT); // should be different result, but will do the job -// } else { -// result = new RemoteOperationResult(true, status, query.getResponseHeaders()); -// } -// -// } else { -// // synchronization failed -// client.exhaustResponse(query.getResponseBodyAsStream()); -// if (status == HttpStatus.SC_NOT_FOUND) { -// removeLocalFolder(); -// } -// result = new RemoteOperationResult(false, status, query.getResponseHeaders()); -// } -// -// } catch (Exception e) { -// result = new RemoteOperationResult(e); -// -// -// } finally { -// if (query != null) -// query.releaseConnection(); // let the connection available for other methods -// if (result.isSuccess()) { -// Log_OC.i(TAG, "Synchronized " + mAccount.name + remotePath + ": " + result.getLogMessage()); -// } else { -// if (result.isException()) { -// Log_OC.e(TAG, "Synchronized " + mAccount.name + remotePath + ": " + result.getLogMessage(), result.getException()); -// } else { -// Log_OC.e(TAG, "Synchronized " + mAccount.name + remotePath + ": " + result.getLogMessage()); -// } -// } -// -// } return result; } - -// @Override -// public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) { -// if (operation instanceof ReadRemoteFileOperation) { -// if (result.isSuccess()) { -// MultiStatus dataInServer = ((ReadRemoteFileOperation) operation).getDataInServer(); -// synchronizeData(dataInServer, client) -// } else { -// -// } -// -// } -// -// } private void removeLocalFolder() { if (mStorageManager.fileExists(mLocalFolder.getFileId())) { @@ -338,26 +277,27 @@ public class SynchronizeFolderOperation extends RemoteOperation { * with the current data in the local database. * * Grants that mChildren is updated with fresh data after execution. - * - * @param dataInServer Full response got from the server with the data of the target - * folder and its direct children. + * + * @param folder Remote Folder to synchronize + * + * @param files Remote Files in Folder + * * @param client Client instance to the remote server where the data were * retrieved. * @return 'True' when any change was made in the local data, 'false' otherwise. */ - private void synchronizeData(MultiStatus dataInServer, WebdavClient client) { + private void synchronizeData(RemoteFile folder, ArrayList files, WebdavClient client) { // get 'fresh data' from the database mLocalFolder = mStorageManager.getFileByPath(mLocalFolder.getRemotePath()); // parse data from remote folder - WebdavEntry we = new WebdavEntry(dataInServer.getResponses()[0], client.getBaseUri().getPath()); - OCFile remoteFolder = fillOCFile(we); + OCFile remoteFolder = fillOCFile(folder); remoteFolder.setParentId(mLocalFolder.getParentId()); remoteFolder.setFileId(mLocalFolder.getFileId()); Log_OC.d(TAG, "Remote folder " + mLocalFolder.getRemotePath() + " changed - starting update of local data "); - List updatedFiles = new Vector(dataInServer.getResponses().length - 1); + List updatedFiles = new Vector(files.size()); List filesToSyncContents = new Vector(); // get current data about local contents of the folder to synchronize @@ -369,10 +309,9 @@ public class SynchronizeFolderOperation extends RemoteOperation { // loop to update every child OCFile remoteFile = null, localFile = null; - for (int i = 1; i < dataInServer.getResponses().length; ++i) { + for (RemoteFile file: files) { /// new OCFile instance with the data from the server - we = new WebdavEntry(dataInServer.getResponses()[i], client.getBaseUri().getPath()); - remoteFile = fillOCFile(we); + remoteFile = fillOCFile(file); remoteFile.setParentId(mLocalFolder.getFileId()); /// retrieve local data for the read file @@ -463,7 +402,7 @@ public class SynchronizeFolderOperation extends RemoteOperation { return (status == HttpStatus.SC_MULTI_STATUS); } - + /** * Creates and populates a new {@link OCFile} object with the data read from the server. * @@ -479,6 +418,22 @@ public class SynchronizeFolderOperation extends RemoteOperation { file.setEtag(we.etag()); return file; } + + /** + * Creates and populates a new {@link OCFile} object with the data read from the server. + * + * @param remote remote file read from the server (remote file or folder). + * @return New OCFile instance representing the remote resource described by we. + */ + private OCFile fillOCFile(RemoteFile remote) { + OCFile file = new OCFile(remote.getRemotePath()); + file.setCreationTimestamp(remote.getCreationTimestamp()); + file.setFileLength(remote.getLength()); + file.setMimetype(remote.getMimeType()); + file.setModificationTimestamp(remote.getModifiedTimestamp()); + file.setEtag(remote.getEtag()); + return file; + } /**