private void Sync() {
// Get last change log token on server side.
this.session.Binding.GetRepositoryService().GetRepositoryInfos(null); // refresh
string lastTokenOnServer = this.session.Binding.GetRepositoryService().GetRepositoryInfo(this.session.RepositoryInfo.Id, null).LatestChangeLogToken;
// Get last change token that had been saved on client side.
string lastTokenOnClient = this.storage.ChangeLogToken;
if (lastTokenOnClient == null) {
// Token is null, which means no content change sync has ever happened yet, so just sync everything from remote.
// Force full sync
var fullsyncevent = new StartNextSyncEvent(true);
Queue.AddEvent(fullsyncevent);
return;
}
do {
// Check which files/folders have changed.
IChangeEvents changes = this.session.GetContentChanges(lastTokenOnClient, this.isPropertyChangesSupported, this.maxNumberOfContentChanges);
// Replicate each change to the local side.
bool first = true;
foreach (IChangeEvent change in changes.ChangeEventList) {
// ignore first event when lists overlapp
if (first) {
first = false;
if (this.lastChange != null &&
(this.lastChange.ChangeType == DotCMIS.Enums.ChangeType.Created
|| this.lastChange.ChangeType == DotCMIS.Enums.ChangeType.Deleted)) {
if (change != null && change.ChangeType == this.lastChange.ChangeType && change.ObjectId == this.lastChange.ObjectId) {
continue;
}
}
}
this.lastChange = change;
Queue.AddEvent(new ContentChangeEvent(change.ChangeType, change.ObjectId));
}
// Save change log token locally.
if (changes.HasMoreItems == true) {
lastTokenOnClient = changes.LatestChangeLogToken;
} else {
lastTokenOnClient = lastTokenOnServer;
}
this.storage.ChangeLogToken = lastTokenOnClient;
// refresh
this.session.Binding.GetRepositoryService().GetRepositoryInfos(null);
lastTokenOnServer = this.session.Binding.GetRepositoryService().GetRepositoryInfo(this.session.RepositoryInfo.Id, null).LatestChangeLogToken;
} while (!lastTokenOnServer.Equals(lastTokenOnClient));
}
}