private void ReceiveChange()

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);
      }
    }