public void Fire(T value) { // AssertBound(); // todo: smart assert: fail if fired before bind; this allows bindless signals in UI if (!Async) { AssertThreading(); } AssertNullability(value); var wire = Parent?.Proto.Wire; if (wire == null && Async) { return; } //local change wire.NotNull(this).Send(RdId, SendContext.Of(SerializationContext, value, this), (sendContext, stream) => { var me = sendContext.This; if (LogSend.IsTraceEnabled()) { LogSend.Trace("signal `{0}` ({1}):: value = {2}", me.Location, me.RdId, sendContext.Event.PrintToString()); } me.myWriteValue(sendContext.SzrCtx, stream, sendContext.Event); }); using (UsingDebugInfo()) mySignal.Fire(value); }
public void Fire(T value) { // AssertBound(); // todo: smart assert: fail if fired before bind; this allows not bound signals in UI if (!Async) { AssertThreading(); } AssertNullability(value); var wire = Parent?.Proto.Wire; if (wire == null && Async) { return; } //local change wire.NotNull(this).Send(RdId, SendContext.Of(SerializationContext, value, this), (sendContext, stream) => { var me = sendContext.This; SendTrace?.Log($"{me} :: value = {sendContext.Event.PrintToString()}"); me.myWriteValue(sendContext.SzrCtx, stream, sendContext.Event); }); using (UsingDebugInfo()) mySignal.Fire(value); }
protected override void Init(Lifetime lifetime) { base.Init(lifetime); var serializationContext = SerializationContext; if (!OptimizeNested) { Change.Advise(lifetime, v => { if (IsLocalChange) { v.IdentifyPolymorphic(Proto.Identities, Proto.Identities.Next(RdId)); } }); } Advise(lifetime, v => { if (!IsLocalChange) { return; } if (IsMaster) { myMasterVersion++; } Wire.Send(RdId, SendContext.Of(serializationContext, v, this), (sendContext, writer) => { var sContext = sendContext.SzrCtx; var evt = sendContext.Event; var me = sendContext.This; writer.Write(me.myMasterVersion); me.WriteValueDelegate(sContext, writer, evt); if (LogSend.IsTraceEnabled()) { LogSend.Trace("property `{0}` ({1}):: ver = {2}, value = {3}", me.Location, me.RdId, me.myMasterVersion, me.Value.PrintToString()); } }); }); Wire.Advise(lifetime, this); if (!OptimizeNested) { this.View(lifetime, (lf, v) => { v.BindPolymorphic(lf, this, "$"); }); } }
protected override void Init(Lifetime lifetime) { base.Init(lifetime); var serializationContext = SerializationContext; using (UsingLocalChange()) { Advise(lifetime, it => { if (!IsLocalChange) { return; } if (!OptimizeNested && it.Kind != AddUpdateRemove.Remove) { it.NewValue.IdentifyPolymorphic(Proto.Identities, Proto.Identities.Next(RdId)); } Wire.Send(RdId, SendContext.Of(serializationContext, it, this), (sendContext, stream) => { var sContext = sendContext.SzrCtx; var evt = sendContext.Event; var me = sendContext.This; stream.Write((me.myNextVersion++ << versionedFlagShift) | (long)evt.Kind); stream.Write(evt.Index); if (evt.Kind != AddUpdateRemove.Remove) { me.WriteValueDelegate(sContext, stream, evt.NewValue); } if (LogSend.IsTraceEnabled()) { LogSend.Trace("list `{0}` ({1}) :: {2} :: index={3} :: version = {4}{5}", me.Location, me.RdId, evt.Kind, evt.Index , me.myNextVersion - 1 , evt.Kind != AddUpdateRemove.Remove ? " :: value = " + evt.NewValue.PrintToString() : ""); } }); }); } Wire.Advise(lifetime, this); if (!OptimizeNested) //means values must be bindable { this.View(lifetime, (lf, index, value) => { value.BindPolymorphic(lf, this, "[" + index + "]"); //todo name will be not unique when you add elements in the middle of the list }); } }
protected override void Init(Lifetime lifetime) { base.Init(lifetime); var serializationContext = SerializationContext; using (UsingLocalChange()) { Advise(lifetime, it => { if (!IsLocalChange) { return; } AssertNullability(it.Key); if (it.Kind != AddUpdateRemove.Remove) { AssertNullability(it.NewValue); } if (!OptimizeNested && it.Kind != AddUpdateRemove.Remove) { it.NewValue.IdentifyPolymorphic(Proto.Identities, Proto.Identities.Next(RdId)); } Wire.Send(RdId, SendContext.Of(serializationContext, it, this), (sendContext, stream) => { var sContext = sendContext.SzrCtx; var evt = sendContext.Event; var me = sendContext.This; var versionedFlag = me.IsMaster ? 1 << versionedFlagShift : 0; stream.Write(versionedFlag | (int)evt.Kind); var version = ++me.myNextVersion; if (me.IsMaster) { me.myPendingForAck[evt.Key] = version; stream.Write(version); } me.WriteKeyDelegate(sContext, stream, evt.Key); if (evt.Kind != AddUpdateRemove.Remove) { me.WriteValueDelegate(sContext, stream, evt.NewValue); } SendTrace?.Log($"{me} :: {evt.Kind} :: key = {evt.Key.PrintToString()}" + (me.IsMaster ? " :: version = " + version : "") + (evt.Kind != AddUpdateRemove.Remove ? " :: value = " + evt.NewValue.PrintToString() : "")); }); }); } Wire.Advise(lifetime, this); if (!OptimizeNested) //means values must be bindable { this.View(lifetime, (lf, k, v) => { v.BindPolymorphic(lf, this, "[" + k + "]"); }); } }