protected byte[] DownloadChanges(IFileInfo target, IDocument remoteDocument, IMappedObject obj, IFileSystemInfoFactory fsFactory, ITransmissionManager transmissionManager, ILog logger) {
// Download changes
byte[] hash = null;
var cacheFile = fsFactory.CreateDownloadCacheFileInfo(target);
var transmission = transmissionManager.CreateTransmission(TransmissionType.DOWNLOAD_MODIFIED_FILE, target.FullName, cacheFile.FullName);
hash = this.DownloadCacheFile(cacheFile, remoteDocument, transmission, fsFactory);
obj.ChecksumAlgorithmName = "SHA-1";
try {
var backupFile = fsFactory.CreateFileInfo(target.FullName + ".bak.sync");
Guid? uuid = target.Uuid;
cacheFile.Replace(target, backupFile, true);
try {
target.Uuid = uuid;
} catch (RestoreModificationDateException e) {
logger.Debug("Failed to restore modification date of original file", e);
}
try {
backupFile.Uuid = null;
} catch (RestoreModificationDateException e) {
logger.Debug("Failed to restore modification date of backup file", e);
}
byte[] checksumOfOldFile = null;
using (var oldFileStream = backupFile.Open(FileMode.Open, FileAccess.Read, FileShare.None)) {
checksumOfOldFile = SHA1Managed.Create().ComputeHash(oldFileStream);
}
if (!obj.LastChecksum.SequenceEqual(checksumOfOldFile)) {
var conflictFile = fsFactory.CreateConflictFileInfo(target);
backupFile.MoveTo(conflictFile.FullName);
OperationsLogger.Info(string.Format("Updated local content of \"{0}\" with content of remote document {1} and created conflict file {2}", target.FullName, remoteDocument.Id, conflictFile.FullName));
} else {
backupFile.Delete();
OperationsLogger.Info(string.Format("Updated local content of \"{0}\" with content of remote document {1}", target.FullName, remoteDocument.Id));
}
} catch(Exception ex) {
transmission.FailedException = ex;
throw;
}
transmission.Status = TransmissionStatus.FINISHED;
return hash;
}