in rd-net/RdFramework/Text/Impl/RdTextBuffer.cs [85:144]
private void ReceiveChange(RdTextBufferChange rdTextBufferChange)
{
var newVersion = rdTextBufferChange.Version;
var change = rdTextBufferChange.Change;
var side = rdTextBufferChange.Origin;
if (Mode.IsAssertion) Assertion.Assert(side != myLocalOrigin, "side != mySide");
var masterVersionRemote = newVersion.Master;
var slaveVersionRemote = newVersion.Slave;
if (change.Kind == RdTextChangeKind.Reset)
{
ClearState();
}
else if (change.Kind == RdTextChangeKind.PromoteVersion)
{
if (Mode.IsAssertion) Assertion.Assert(!IsMaster);
BufferVersion = newVersion;
return;
}
else
{
if (IsMaster)
{
if (Mode.IsAssertion) Assertion.Assert(myChangesToConfirmOrRollback.Count == 0);
if (masterVersionRemote != BufferVersion.Master)
{
// reject the change. we've already sent overriding change.
return;
}
}
else
{
if (slaveVersionRemote != BufferVersion.Slave)
{
// rollback the changes and notify external subscribers
// don't need to update history here - all reverted changes were already stored before on 'fire' stage
foreach (var ch in Enumerable.Reverse(myChangesToConfirmOrRollback))
{
if (ch.Version.Slave <= slaveVersionRemote)
break;
myTextChanged.SetValue(ch.Change.Reverse());
}
myChangesToConfirmOrRollback.Clear();
}
else
{
// confirm the changes queue.
myChangesToConfirmOrRollback.Clear();
}
}
}
BufferVersion = newVersion;
if (!IsMaster || myActiveSession == null || !myActiveSession.IsCommitting)
{
myTextChanged.SetValue(change);
}
}