public void Fire(RdTextChange change) { Assertion.Assert(Delegate.IsBound || BufferVersion == TextBufferVersion.InitVersion, "Delegate.IsBound || BufferVersion == TextBufferVersion.InitVersion"); if (Delegate.IsBound) { Proto.Scheduler.AssertThread(); } if (IsMaster && myActiveSession != null && myActiveSession.IsCommitting) { return; } IncrementBufferVersion(); var bufferChange = new RdTextBufferChange(BufferVersion, myLocalOrigin, change); if (change.Kind == RdTextChangeKind.Reset) { ClearState(); } else if (!IsMaster) { myChangesToConfirmOrRollback.Add(bufferChange); } myActiveSession?.TryPushLocalChange(change); Delegate.Changes.SetValue(bufferChange); }
private void ReceiveChange(RdTextBufferChange rdTextBufferChange) { var newVersion = rdTextBufferChange.Version; var change = rdTextBufferChange.Change; var side = rdTextBufferChange.Origin; 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) { Assertion.Assert(!IsMaster, "!IsMaster"); BufferVersion = newVersion; return; } else { if (IsMaster) { Assertion.Assert(myChangesToConfirmOrRollback.Count == 0, "changesToConfirmOrRollback.IsEmpty()"); 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; myTextChanged.SetValue(change); }
public bool TryPushRemoteChange(RdTextBufferChange change) { if (myState != State.Opened) { return(false); } if (change.Version.Master <= myVersionBeforeOpening.Master) { return(false); } myRemoteChanges.Add(change); return(true); }
public bool TryPushRemoteChange(RdTextBufferChange change) { if (myState != State.Opened) { return(false); } if (!myBuffer.IsMaster && change.Version.Master <= myVersionBeforeOpening.Master) { return(false); } if (myBuffer.IsMaster && CompareVersions(change.Version, myVersionBeforeOpening) <= 0) { return(false); } OnRemoteChange.Fire(change.Change); myRemoteChanges.Add(change); return(true); }