private void SyncNamesAndDates(IFileSystemInfo local, IFileableCmisObject remote, IMappedObject mappedObject) { DateTime?oldRemoteModificationDate = remote.LastModificationDate; DateTime oldLocalModificationDate = local.LastWriteTimeUtc; // Sync Names if (mappedObject.Name != local.Name && mappedObject.Name == remote.Name) { // local has been renamed => rename remote remote.Rename(local.Name, true); mappedObject.Name = local.Name; } else if (mappedObject.Name == local.Name && mappedObject.Name != remote.Name) { // remote has been renamed => rename local if (local is IFileInfo) { IFileInfo localFile = local as IFileInfo; localFile.MoveTo(Path.Combine(localFile.Directory.FullName, remote.Name)); } else if (local is IDirectoryInfo) { IDirectoryInfo localFolder = local as IDirectoryInfo; localFolder.MoveTo(Path.Combine(localFolder.Parent.FullName, remote.Name)); } else { throw new ArgumentException("Solved move conflict => invoke crawl sync to detect other changes"); } mappedObject.Name = remote.Name; } else if (mappedObject.Name != local.Name && mappedObject.Name != remote.Name) { // both are renamed => rename to the latest change DateTime localModification = local.LastWriteTimeUtc; DateTime remoteModification = (DateTime)remote.LastModificationDate; if (localModification > remoteModification) { // local modification is newer remote.Rename(local.Name, true); mappedObject.Name = local.Name; } else { // remote modification is newer if (local is IFileInfo) { IFileInfo localFile = local as IFileInfo; localFile.MoveTo(Path.Combine(localFile.Directory.FullName, remote.Name)); } else if (local is IDirectoryInfo) { IDirectoryInfo localFolder = local as IDirectoryInfo; localFolder.MoveTo(Path.Combine(localFolder.Parent.FullName, remote.Name)); } else { throw new ArgumentException("Solved move conflict => invoke crawl sync to detect other changes"); } local.LastWriteTimeUtc = (DateTime)remote.LastModificationDate; mappedObject.Name = remote.Name; } } // Sync modification dates if (oldRemoteModificationDate != null) { if (oldLocalModificationDate > oldRemoteModificationDate && this.ServerCanModifyDateTimes) { remote.UpdateLastWriteTimeUtc(oldLocalModificationDate); local.LastWriteTimeUtc = oldLocalModificationDate; } else if (oldLocalModificationDate < (DateTime)oldRemoteModificationDate) { local.LastWriteTimeUtc = (DateTime)oldRemoteModificationDate; } } mappedObject.LastLocalWriteTimeUtc = local.LastWriteTimeUtc; mappedObject.LastRemoteWriteTimeUtc = (DateTime)remote.LastModificationDate; mappedObject.ParentId = remote.Parents[0].Id; mappedObject.LastChangeToken = remote.ChangeToken; mappedObject.Ignored = remote.AreAllChildrenIgnored(); this.Storage.SaveMappedObject(mappedObject); }
private void SyncNamesAndDates(IFileSystemInfo local, IFileableCmisObject remote, IMappedObject mappedObject) { DateTime? oldRemoteModificationDate = remote.LastModificationDate; DateTime oldLocalModificationDate = local.LastWriteTimeUtc; // Sync Names if (mappedObject.Name != local.Name && mappedObject.Name == remote.Name) { // local has been renamed => rename remote remote.Rename(local.Name, true); mappedObject.Name = local.Name; } else if (mappedObject.Name == local.Name && mappedObject.Name != remote.Name) { // remote has been renamed => rename local if (local is IFileInfo) { IFileInfo localFile = local as IFileInfo; localFile.MoveTo(Path.Combine(localFile.Directory.FullName, remote.Name)); } else if (local is IDirectoryInfo) { IDirectoryInfo localFolder = local as IDirectoryInfo; localFolder.MoveTo(Path.Combine(localFolder.Parent.FullName, remote.Name)); } else { throw new ArgumentException("Solved move conflict => invoke crawl sync to detect other changes"); } mappedObject.Name = remote.Name; } else if (mappedObject.Name != local.Name && mappedObject.Name != remote.Name) { // both are renamed => rename to the latest change DateTime localModification = local.LastWriteTimeUtc; DateTime remoteModification = (DateTime)remote.LastModificationDate; if (localModification > remoteModification) { // local modification is newer remote.Rename(local.Name, true); mappedObject.Name = local.Name; } else { // remote modification is newer if (local is IFileInfo) { IFileInfo localFile = local as IFileInfo; localFile.MoveTo(Path.Combine(localFile.Directory.FullName, remote.Name)); } else if (local is IDirectoryInfo) { IDirectoryInfo localFolder = local as IDirectoryInfo; localFolder.MoveTo(Path.Combine(localFolder.Parent.FullName, remote.Name)); } else { throw new ArgumentException("Solved move conflict => invoke crawl sync to detect other changes"); } local.LastWriteTimeUtc = (DateTime)remote.LastModificationDate; mappedObject.Name = remote.Name; } } // Sync modification dates if (oldRemoteModificationDate != null) { if (oldLocalModificationDate > oldRemoteModificationDate && this.ServerCanModifyDateTimes) { remote.UpdateLastWriteTimeUtc(oldLocalModificationDate); local.LastWriteTimeUtc = oldLocalModificationDate; } else if (oldLocalModificationDate < (DateTime)oldRemoteModificationDate) { local.LastWriteTimeUtc = (DateTime)oldRemoteModificationDate; } } mappedObject.LastLocalWriteTimeUtc = local.LastWriteTimeUtc; mappedObject.LastRemoteWriteTimeUtc = (DateTime)remote.LastModificationDate; mappedObject.ParentId = remote.Parents[0].Id; mappedObject.LastChangeToken = remote.ChangeToken; mappedObject.Ignored = remote.AreAllChildrenIgnored(); this.Storage.SaveMappedObject(mappedObject); }