/// <summary> /// Swaps values like references over to reference tokens to prevent issues. /// </summary> protected object?MakeValueNetSafe(object?value) { if (value == null) { return(null); } var valType = value.GetType(); if (!valType.IsValueType) { // TODO: More flexibility in which types can be sent here. if (valType != typeof(string)) { return(new ViewVariablesBlobMembers.ReferenceToken { Stringified = PrettyPrint.PrintUserFacing(value) }); } } else if (!Session.RobustSerializer.CanSerialize(valType)) { // Can't send this value type over the wire. return(new ViewVariablesBlobMembers.ServerValueTypeToken { Stringified = value.ToString() }); } return(value); }
protected override Control MakeUI(object?value) { if (value == null) { return(new Label { Text = "null", Align = Label.AlignMode.Right }); } _localValue = value; // NOTE: value is NOT always the actual object. // Only thing we can really rely on is that ToString works out correctly. // This is because of reference tokens, but due to simplicity the object ref is still passed. var toString = PrettyPrint.PrintUserFacing(value); var button = new Button { Text = $"Ref: {toString}", ClipText = true, HorizontalExpand = true, }; button.OnPressed += ButtonOnOnPressed; return(button); }
/// <summary> /// Swaps values like references over to reference tokens to prevent issues. /// </summary> protected object?MakeValueNetSafe(object?value) { if (value == null) { return(null); } var valType = value.GetType(); if (!valType.IsValueType) { // TODO: More flexibility in which types can be sent here. // We don't blindly send any prototypes, we ONLY send prototypes for valid, registered variants. if (typeof(IPrototype).IsAssignableFrom(valType) && IoCManager.Resolve <IPrototypeManager>().TryGetVariantFrom(valType, out var variant)) { return(new ViewVariablesBlobMembers.PrototypeReferenceToken() { Stringified = PrettyPrint.PrintUserFacing(value), ID = ((IPrototype)value).ID, Variant = variant }); } if (valType != typeof(string)) { return(new ViewVariablesBlobMembers.ReferenceToken { Stringified = PrettyPrint.PrintUserFacing(value) }); } } else if (!Session.RobustSerializer.CanSerialize(valType)) { // Handle KeyValuePair<,> if (valType.IsGenericType && valType.GetGenericTypeDefinition() == typeof(KeyValuePair <,>)) { dynamic kv = value; var key = kv.Key; var val = kv.Value; return(new ViewVariablesBlobMembers.ServerKeyValuePairToken { Key = MakeValueNetSafe(key), Value = MakeValueNetSafe(val) }); } // Can't send this value type over the wire. return(new ViewVariablesBlobMembers.ServerValueTypeToken { Stringified = value.ToString() }); } return(value); }
/// <summary> /// Swaps values like references over to reference tokens to prevent issues. /// </summary> protected object?MakeValueNetSafe(object?value) { if (value == null) { return(null); } var valType = value.GetType(); if (!valType.IsValueType) { // TODO: More flexibility in which types can be sent here. if (valType != typeof(string)) { return(new ViewVariablesBlobMembers.ReferenceToken { Stringified = PrettyPrint.PrintUserFacing(value) }); } } else if (!Session.RobustSerializer.CanSerialize(valType)) { // Handle KeyValuePair<,> if (valType.IsGenericType && valType.GetGenericTypeDefinition() == typeof(KeyValuePair <,>)) { dynamic kv = value; var key = kv.Key; var val = kv.Value; return(new ViewVariablesBlobMembers.ServerKeyValuePairToken { Key = MakeValueNetSafe(key), Value = MakeValueNetSafe(val) }); } // Can't send this value type over the wire. return(new ViewVariablesBlobMembers.ServerValueTypeToken { Stringified = value.ToString() }); } return(value); }
/// <summary> /// Swaps null values for net safe equivalents depending on type. /// Will return null for types where null is considered net safe. /// </summary> protected object?MakeNullValueNetSafe(Type type) { if (typeof(IPrototype).IsAssignableFrom(type)) { var protoMan = IoCManager.Resolve <IPrototypeManager>(); if (protoMan.TryGetVariantFrom(type, out var variant)) { return new ViewVariablesBlobMembers.PrototypeReferenceToken() { ID = null, Variant = variant, Stringified = PrettyPrint.PrintUserFacing(null), } } ; } return(null); } }