Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 5
0
        /// <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);
        }
    }