mConflictsFound = 0;
mForgottenLocalFiles.clear();
boolean fileChanged = false;
+ boolean dirChanged = true;
// code before in FileSyncAdapter.fetchData
PropFindMethod query = null;
// synchronize properties of the parent folder, if necessary
if (mParentId == DataStorageManager.ROOT_PARENT_ID) {
+ dirChanged = false;
WebdavEntry we = new WebdavEntry(resp.getResponses()[0], client.getBaseUri().getPath());
// Properties of server folder
OCFile parent = fillOCFile(we);
// Properties of local folder
OCFile localParent = mStorageManager.getFileById(1);
- if (parent.getEtag() != localParent.getEtag()) {
+ if (localParent == null || !(parent.getEtag().equalsIgnoreCase(localParent.getEtag()))) {
mStorageManager.saveFile(parent);
mParentId = parent.getFileId();
+ dirChanged = true;
}
+ }
+ else if (! mRemotePath.equalsIgnoreCase(OCFile.PATH_SEPARATOR)){
+ dirChanged = false;
+ WebdavEntry we = new WebdavEntry(resp.getResponses()[0], client.getBaseUri().getPath());
+
+ // Properties of server folder
+ OCFile parent = fillOCFile(we);
+ // Properties of local folder
+ OCFile localParent = mStorageManager.getFileByPath(mRemotePath);
+ if (localParent == null || !(parent.getEtag().equalsIgnoreCase(localParent.getEtag()))) {
+ dirChanged = true;
+ }
}
-
+ if (dirChanged) {
// read contents in folder
List<String> filesOnServer = new ArrayList<String> (); // Contains the lists of files on server
List<OCFile> updatedFiles = new Vector<OCFile>(resp.getResponses().length - 1);
fileChanged = false;
if (oldFile != null) {
if (!file.getEtag().equalsIgnoreCase(oldFile.getEtag())) {
- fileChanged = true;
+ fileChanged = true;
}
} else
fileChanged= true;
- if (fileChanged){
+ if (fileChanged){
+ if (file.isDirectory())
+ file.setEtag("");
if (oldFile != null) {
file.setKeepInSync(oldFile.keepInSync());
file.setLastSyncDateForData(oldFile.getLastSyncDateForData());
}
updatedFiles.add(file);
- //}
- //}
-
- // save updated contents in local database; all at once, trying to get a best performance in database update (not a big deal, indeed)
- mStorageManager.saveFiles(updatedFiles);
-
- // request for the synchronization of files AFTER saving last properties
- //SynchronizeFileOperation op = null;
- RemoteOperationResult contentsResult = null;
- for (SynchronizeFileOperation op: filesToSyncContents) {//int i=0; i < filesToSyncContents.size(); i++) {
- //op = filesToSyncContents.get(i);
- contentsResult = op.execute(client); // returns without waiting for upload or download finishes
- if (!contentsResult.isSuccess()) {
- if (contentsResult.getCode() == ResultCode.SYNC_CONFLICT) {
- mConflictsFound++;
- } else {
- mFailsInFavouritesFound++;
- if (contentsResult.getException() != null) {
- Log_OC.d(TAG, "Error while synchronizing favourites : " + contentsResult.getLogMessage(), contentsResult.getException());
- } else {
- Log_OC.d(TAG, "Error while synchronizing favourites : " + contentsResult.getLogMessage());
- }
- }
- } // won't let these fails break the synchronization process
- }
-
+ }
+ }
- // removal of obsolete files
- mChildren = mStorageManager.getDirectoryContent(mStorageManager.getFileById(mParentId));
- //OCFile file;
- String currentSavePath = FileStorageUtils.getSavePath(mAccount.name);
- for (OCFile fileChild: mChildren) {
- //file = mChildren.get(i);
- //if (file.getLastSyncDateForProperties() != mCurrentSyncTime) {
- if (!filesOnServer.contains(fileChild.getRemotePath())) {
- Log_OC.d(TAG, "removing file: " + fileChild.getFileName());
- mStorageManager.removeFile(fileChild, (fileChild.isDown() && fileChild.getStoragePath().startsWith(currentSavePath)));
- mChildren.remove(fileChild); //.remove(i);
+ // save updated contents in local database; all at once, trying to get a best performance in database update (not a big deal, indeed)
+ mStorageManager.saveFiles(updatedFiles);
+
+ // request for the synchronization of files AFTER saving last properties
+ RemoteOperationResult contentsResult = null;
+ for (SynchronizeFileOperation op: filesToSyncContents) {//int i=0; i < filesToSyncContents.size(); i++) {
+ contentsResult = op.execute(client); // returns without waiting for upload or download finishes
+ if (!contentsResult.isSuccess()) {
+ if (contentsResult.getCode() == ResultCode.SYNC_CONFLICT) {
+ mConflictsFound++;
+ } else {
+ mFailsInFavouritesFound++;
+ if (contentsResult.getException() != null) {
+ Log_OC.e(TAG, "Error while synchronizing favourites : " + contentsResult.getLogMessage(), contentsResult.getException());
+ } else {
+ Log_OC.e(TAG, "Error while synchronizing favourites : " + contentsResult.getLogMessage());
}
- // } else {
- // i++;
- // }
}
+ } // won't let these fails break the synchronization process
+ }
+
+
+ // removal of obsolete files
+ mChildren = mStorageManager.getDirectoryContent(mStorageManager.getFileById(mParentId));
+ //OCFile file;
+ String currentSavePath = FileStorageUtils.getSavePath(mAccount.name);
+ for (OCFile fileChild: mChildren) {
+ if (!filesOnServer.contains(fileChild.getRemotePath())) {
+ Log_OC.d(TAG, "removing file: " + fileChild.getFileName());
+ mStorageManager.removeFile(fileChild, (fileChild.isDown() && fileChild.getStoragePath().startsWith(currentSavePath)));
+ // mChildren.remove(fileChild); //.remove(i);
}
}
-
+
} else {
client.exhaustResponse(query.getResponseBodyAsStream());
}
+ }
// prepare result object
- if (!fileChanged) {
+ if (!dirChanged) {
result = new RemoteOperationResult(ResultCode.OK_NO_CHANGES_ON_DIR);
-
+ mChildren = mStorageManager.getDirectoryContent(mStorageManager.getFileById(mParentId));
+
} else if (isMultiStatus(status)) {
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);
+ result = new RemoteOperationResult(true, status, query.getResponseHeaders());
}
} else {
- result = new RemoteOperationResult(false, status);
+ result = new RemoteOperationResult(false, status, query.getResponseHeaders());
}
Log_OC.i(TAG, "Synchronizing " + mAccount.name + ", folder " + mRemotePath + ": " + result.getLogMessage());
-
-
+
} catch (Exception e) {
result = new RemoteOperationResult(e);
- Log_OC.e(TAG, "Synchronizing " + mAccount.name + ", folder " + mRemotePath + ": " + result.getLogMessage(), result.getException());
+
} finally {
if (query != null)
query.releaseConnection(); // let the connection available for other methods
+ if (result.isSuccess()) {
+ Log_OC.i(TAG, "Synchronizing " + mAccount.name + ", folder " + mRemotePath + ": " + result.getLogMessage());
+ } else {
+ if (result.isException()) {
+ Log_OC.e(TAG, "Synchronizing " + mAccount.name + ", folder " + mRemotePath + ": " + result.getLogMessage(), result.getException());
+ } else {
+ Log_OC.e(TAG, "Synchronizing " + mAccount.name + ", folder " + mRemotePath + ": " + result.getLogMessage());
+ }
+ }
}
-
+
return result;
}
-
+
public boolean isMultiStatus(int status) {
return (status == HttpStatus.SC_MULTI_STATUS);