Sync most changes from May 9, 2020 libremetaverse into -core

This commit is contained in:
Madpeter 2020-05-09 20:30:21 +01:00
parent c3ff59a2b5
commit a3cb5c595c
18 changed files with 919 additions and 830 deletions

View file

@ -73,8 +73,10 @@ namespace LitJson
bool IDictionary.IsReadOnly => EnsureDictionary().IsReadOnly; bool IDictionary.IsReadOnly => EnsureDictionary().IsReadOnly;
ICollection IDictionary.Keys { ICollection IDictionary.Keys
get { {
get
{
EnsureDictionary(); EnsureDictionary();
IList<string> keys = object_list.Select(entry => entry.Key).ToList(); IList<string> keys = object_list.Select(entry => entry.Key).ToList();
@ -82,8 +84,10 @@ namespace LitJson
} }
} }
ICollection IDictionary.Values { ICollection IDictionary.Values
get { {
get
{
EnsureDictionary(); EnsureDictionary();
IList<JsonData> values = object_list.Select(entry => entry.Value).ToList(); IList<JsonData> values = object_list.Select(entry => entry.Value).ToList();
@ -121,12 +125,15 @@ namespace LitJson
#region IDictionary Indexer #region IDictionary Indexer
object IDictionary.this[object key] { object IDictionary.this[object key]
get { {
get
{
return EnsureDictionary()[key]; return EnsureDictionary()[key];
} }
set { set
{
if (!(key is String)) if (!(key is String))
throw new ArgumentException( throw new ArgumentException(
"The key has to be a string"); "The key has to be a string");
@ -140,13 +147,16 @@ namespace LitJson
#region IOrderedDictionary Indexer #region IOrderedDictionary Indexer
object IOrderedDictionary.this[int idx] { object IOrderedDictionary.this[int idx]
get { {
get
{
EnsureDictionary(); EnsureDictionary();
return object_list[idx].Value; return object_list[idx].Value;
} }
set { set
{
EnsureDictionary(); EnsureDictionary();
JsonData data = ToJsonData(value); JsonData data = ToJsonData(value);
var old_entry = object_list[idx]; var old_entry = object_list[idx];
@ -159,12 +169,15 @@ namespace LitJson
#region IList Indexer #region IList Indexer
object IList.this[int index] { object IList.this[int index]
get { {
get
{
return EnsureList()[index]; return EnsureList()[index];
} }
set { set
{
EnsureList(); EnsureList();
JsonData data = ToJsonData(value); JsonData data = ToJsonData(value);
@ -175,13 +188,16 @@ namespace LitJson
#region Public Indexers #region Public Indexers
public JsonData this[string prop_name] { public JsonData this[string prop_name]
get { {
get
{
EnsureDictionary(); EnsureDictionary();
return inst_object[prop_name]; return inst_object[prop_name];
} }
set { set
{
EnsureDictionary(); EnsureDictionary();
var entry = new KeyValuePair<string, JsonData>(prop_name, value); var entry = new KeyValuePair<string, JsonData>(prop_name, value);
if (inst_object.ContainsKey(prop_name)) if (inst_object.ContainsKey(prop_name))
@ -206,18 +222,22 @@ namespace LitJson
} }
} }
public JsonData this[int index] { public JsonData this[int index]
get { {
get
{
EnsureCollection(); EnsureCollection();
return type == JsonType.Array ? inst_array[index] : object_list[index].Value; return type == JsonType.Array ? inst_array[index] : object_list[index].Value;
} }
set { set
{
EnsureCollection(); EnsureCollection();
if (type == JsonType.Array) if (type == JsonType.Array)
inst_array[index] = value; inst_array[index] = value;
else { else
{
var entry = object_list[index]; var entry = object_list[index];
var new_entry = new KeyValuePair<string, JsonData>(entry.Key, value); var new_entry = new KeyValuePair<string, JsonData>(entry.Key, value);
@ -262,33 +282,38 @@ namespace LitJson
public JsonData(object obj) public JsonData(object obj)
{ {
if (obj is Boolean) { if (obj is bool b)
{
type = JsonType.Boolean; type = JsonType.Boolean;
inst_boolean = (bool) obj; inst_boolean = b;
return; return;
} }
if (obj is Double) { if (obj is double d)
{
type = JsonType.Double; type = JsonType.Double;
inst_double = (double) obj; inst_double = d;
return; return;
} }
if (obj is Int32) { if (obj is int i)
{
type = JsonType.Int; type = JsonType.Int;
inst_int = (int) obj; inst_int = i;
return; return;
} }
if (obj is Int64) { if (obj is long l)
{
type = JsonType.Long; type = JsonType.Long;
inst_long = (long) obj; inst_long = l;
return; return;
} }
if (obj is String) { if (obj is string s)
{
type = JsonType.String; type = JsonType.String;
inst_string = (string) obj; inst_string = s;
return; return;
} }
@ -422,8 +447,10 @@ namespace LitJson
{ {
EnsureDictionary().Remove(key); EnsureDictionary().Remove(key);
for (int i = 0; i < object_list.Count; i++) { for (int i = 0; i < object_list.Count; i++)
if (object_list[i].Key == (string) key) { {
if (object_list[i].Key == (string)key)
{
object_list.RemoveAt(i); object_list.RemoveAt(i);
break; break;
} }
@ -658,40 +685,46 @@ namespace LitJson
if (obj == null) if (obj == null)
return null; return null;
if (obj is JsonData) if (obj is JsonData data)
return (JsonData) obj; return data;
return new JsonData(obj); return new JsonData(obj);
} }
private static void WriteJson(IJsonWrapper obj, JsonWriter writer) private static void WriteJson(IJsonWrapper obj, JsonWriter writer)
{ {
if (obj.IsString) { if (obj.IsString)
{
writer.Write(obj.GetString()); writer.Write(obj.GetString());
return; return;
} }
if (obj.IsBoolean) { if (obj.IsBoolean)
{
writer.Write(obj.GetBoolean()); writer.Write(obj.GetBoolean());
return; return;
} }
if (obj.IsDouble) { if (obj.IsDouble)
{
writer.Write(obj.GetDouble()); writer.Write(obj.GetDouble());
return; return;
} }
if (obj.IsInt) { if (obj.IsInt)
{
writer.Write(obj.GetInt()); writer.Write(obj.GetInt());
return; return;
} }
if (obj.IsLong) { if (obj.IsLong)
{
writer.Write(obj.GetLong()); writer.Write(obj.GetLong());
return; return;
} }
if (obj.IsArray) { if (obj.IsArray)
{
writer.WriteArrayStart(); writer.WriteArrayStart();
foreach (object elem in (IList)obj) foreach (object elem in (IList)obj)
WriteJson((JsonData)elem, writer); WriteJson((JsonData)elem, writer);
@ -700,10 +733,12 @@ namespace LitJson
return; return;
} }
if (obj.IsObject) { if (obj.IsObject)
{
writer.WriteObjectStart(); writer.WriteObjectStart();
foreach (DictionaryEntry entry in ((IDictionary) obj)) { foreach (DictionaryEntry entry in ((IDictionary)obj))
{
writer.WritePropertyName((string)entry.Key); writer.WritePropertyName((string)entry.Key);
WriteJson((JsonData)entry.Value, writer); WriteJson((JsonData)entry.Value, writer);
} }
@ -724,7 +759,8 @@ namespace LitJson
public void Clear() public void Clear()
{ {
if (IsObject) { if (IsObject)
{
((IDictionary)this).Clear(); ((IDictionary)this).Clear();
} }
else if (IsArray) else if (IsArray)
@ -738,7 +774,8 @@ namespace LitJson
if (x?.type != type) if (x?.type != type)
return false; return false;
switch (this.type) { switch (this.type)
{
case JsonType.None: case JsonType.None:
return true; return true;
@ -777,7 +814,8 @@ namespace LitJson
if (this.type == type) if (this.type == type)
return; return;
switch (type) { switch (type)
{
case JsonType.None: case JsonType.None:
break; break;
@ -841,7 +879,8 @@ namespace LitJson
public override string ToString() public override string ToString()
{ {
switch (type) { switch (type)
{
case JsonType.Array: case JsonType.Array:
return "JsonData array"; return "JsonData array";
@ -876,8 +915,10 @@ namespace LitJson
public object Current => Entry; public object Current => Entry;
public DictionaryEntry Entry { public DictionaryEntry Entry
get { {
get
{
var curr = list_enumerator.Current; var curr = list_enumerator.Current;
return new DictionaryEntry(curr.Key, curr.Value); return new DictionaryEntry(curr.Key, curr.Value);
} }

View file

@ -34,8 +34,10 @@ namespace LitJson
private bool is_list; private bool is_list;
public Type ElementType { public Type ElementType
get { {
get
{
if (element_type == null) if (element_type == null)
return typeof(JsonData); return typeof(JsonData);
@ -45,12 +47,14 @@ namespace LitJson
set { element_type = value; } set { element_type = value; }
} }
public bool IsArray { public bool IsArray
{
get { return is_array; } get { return is_array; }
set { is_array = value; } set { is_array = value; }
} }
public bool IsList { public bool IsList
{
get { return is_list; } get { return is_list; }
set { is_list = value; } set { is_list = value; }
} }
@ -65,8 +69,10 @@ namespace LitJson
private IDictionary<string, PropertyMetadata> properties; private IDictionary<string, PropertyMetadata> properties;
public Type ElementType { public Type ElementType
get { {
get
{
if (element_type == null) if (element_type == null)
return typeof(JsonData); return typeof(JsonData);
@ -76,12 +82,14 @@ namespace LitJson
set { element_type = value; } set { element_type = value; }
} }
public bool IsDictionary { public bool IsDictionary
{
get { return is_dictionary; } get { return is_dictionary; }
set { is_dictionary = value; } set { is_dictionary = value; }
} }
public IDictionary<string, PropertyMetadata> Properties { public IDictionary<string, PropertyMetadata> Properties
{
get { return properties; } get { return properties; }
set { properties = value; } set { properties = value; }
} }
@ -173,7 +181,8 @@ namespace LitJson
if (type.GetInterface("System.Collections.IList") != null) if (type.GetInterface("System.Collections.IList") != null)
data.IsList = true; data.IsList = true;
foreach (PropertyInfo p_info in type.GetProperties ()) { foreach (PropertyInfo p_info in type.GetProperties())
{
if (p_info.Name != "Item") if (p_info.Name != "Item")
continue; continue;
@ -186,10 +195,14 @@ namespace LitJson
data.ElementType = p_info.PropertyType; data.ElementType = p_info.PropertyType;
} }
lock (array_metadata_lock) { lock (array_metadata_lock)
try { {
try
{
array_metadata.Add(type, data); array_metadata.Add(type, data);
} catch (ArgumentException) { }
catch (ArgumentException)
{
return; return;
} }
} }
@ -207,8 +220,10 @@ namespace LitJson
data.Properties = new Dictionary<string, PropertyMetadata>(); data.Properties = new Dictionary<string, PropertyMetadata>();
foreach (PropertyInfo p_info in type.GetProperties ()) { foreach (PropertyInfo p_info in type.GetProperties())
if (p_info.Name == "Item") { {
if (p_info.Name == "Item")
{
ParameterInfo[] parameters = p_info.GetIndexParameters(); ParameterInfo[] parameters = p_info.GetIndexParameters();
if (parameters.Length != 1) if (parameters.Length != 1)
@ -227,7 +242,8 @@ namespace LitJson
data.Properties.Add(p_info.Name, p_data); data.Properties.Add(p_info.Name, p_data);
} }
foreach (FieldInfo f_info in type.GetFields ()) { foreach (FieldInfo f_info in type.GetFields())
{
PropertyMetadata p_data = new PropertyMetadata(); PropertyMetadata p_data = new PropertyMetadata();
p_data.Info = f_info; p_data.Info = f_info;
p_data.IsField = true; p_data.IsField = true;
@ -236,10 +252,14 @@ namespace LitJson
data.Properties.Add(f_info.Name, p_data); data.Properties.Add(f_info.Name, p_data);
} }
lock (object_metadata_lock) { lock (object_metadata_lock)
try { {
try
{
object_metadata.Add(type, data); object_metadata.Add(type, data);
} catch (ArgumentException) { }
catch (ArgumentException)
{
return; return;
} }
} }
@ -252,7 +272,8 @@ namespace LitJson
IList<PropertyMetadata> props = new List<PropertyMetadata>(); IList<PropertyMetadata> props = new List<PropertyMetadata>();
foreach (PropertyInfo p_info in type.GetProperties ()) { foreach (PropertyInfo p_info in type.GetProperties())
{
if (p_info.Name == "Item") if (p_info.Name == "Item")
continue; continue;
@ -262,7 +283,8 @@ namespace LitJson
props.Add(p_data); props.Add(p_data);
} }
foreach (FieldInfo f_info in type.GetFields ()) { foreach (FieldInfo f_info in type.GetFields())
{
PropertyMetadata p_data = new PropertyMetadata(); PropertyMetadata p_data = new PropertyMetadata();
p_data.Info = f_info; p_data.Info = f_info;
p_data.IsField = true; p_data.IsField = true;
@ -270,10 +292,14 @@ namespace LitJson
props.Add(p_data); props.Add(p_data);
} }
lock (type_properties_lock) { lock (type_properties_lock)
try { {
try
{
type_properties.Add(type, props); type_properties.Add(type, props);
} catch (ArgumentException) { }
catch (ArgumentException)
{
return; return;
} }
} }
@ -292,10 +318,14 @@ namespace LitJson
var op = t1.GetMethod("op_Implicit", new[] { t2 }); var op = t1.GetMethod("op_Implicit", new[] { t2 });
lock (conv_ops_lock) { lock (conv_ops_lock)
try { {
try
{
conv_ops[t1].Add(t2, op); conv_ops[t1].Add(t2, op);
} catch (ArgumentException) { }
catch (ArgumentException)
{
return conv_ops[t1][t2]; return conv_ops[t1][t2];
} }
} }
@ -310,7 +340,8 @@ namespace LitJson
if (reader.Token == JsonToken.ArrayEnd) if (reader.Token == JsonToken.ArrayEnd)
return null; return null;
if (reader.Token == JsonToken.Null) { if (reader.Token == JsonToken.Null)
{
if (!inst_type.IsClass) if (!inst_type.IsClass)
throw new JsonException(String.Format( throw new JsonException(String.Format(
@ -324,7 +355,8 @@ namespace LitJson
reader.Token == JsonToken.Int || reader.Token == JsonToken.Int ||
reader.Token == JsonToken.Long || reader.Token == JsonToken.Long ||
reader.Token == JsonToken.String || reader.Token == JsonToken.String ||
reader.Token == JsonToken.Boolean) { reader.Token == JsonToken.Boolean)
{
Type json_type = reader.Value.GetType(); Type json_type = reader.Value.GetType();
@ -334,7 +366,8 @@ namespace LitJson
// If there's a custom importer that fits, use it // If there's a custom importer that fits, use it
if (custom_importers_table.ContainsKey(json_type) && if (custom_importers_table.ContainsKey(json_type) &&
custom_importers_table[json_type].ContainsKey( custom_importers_table[json_type].ContainsKey(
inst_type)) { inst_type))
{
ImporterFunc importer = ImporterFunc importer =
custom_importers_table[json_type][inst_type]; custom_importers_table[json_type][inst_type];
@ -345,7 +378,8 @@ namespace LitJson
// Maybe there's a base importer that works // Maybe there's a base importer that works
if (base_importers_table.ContainsKey(json_type) && if (base_importers_table.ContainsKey(json_type) &&
base_importers_table[json_type].ContainsKey( base_importers_table[json_type].ContainsKey(
inst_type)) { inst_type))
{
ImporterFunc importer = ImporterFunc importer =
base_importers_table[json_type][inst_type]; base_importers_table[json_type][inst_type];
@ -372,7 +406,8 @@ namespace LitJson
object instance = null; object instance = null;
if (reader.Token == JsonToken.ArrayStart) { if (reader.Token == JsonToken.ArrayStart)
{
AddArrayMetadata(inst_type); AddArrayMetadata(inst_type);
ArrayMetadata t_data = array_metadata[inst_type]; ArrayMetadata t_data = array_metadata[inst_type];
@ -385,15 +420,19 @@ namespace LitJson
IList list; IList list;
Type elem_type; Type elem_type;
if (! t_data.IsArray) { if (!t_data.IsArray)
{
list = (IList)Activator.CreateInstance(inst_type); list = (IList)Activator.CreateInstance(inst_type);
elem_type = t_data.ElementType; elem_type = t_data.ElementType;
} else { }
else
{
list = new ArrayList(); list = new ArrayList();
elem_type = inst_type.GetElementType(); elem_type = inst_type.GetElementType();
} }
while (true) { while (true)
{
object item = ReadValue(elem_type, reader); object item = ReadValue(elem_type, reader);
if (reader.Token == JsonToken.ArrayEnd) if (reader.Token == JsonToken.ArrayEnd)
break; break;
@ -401,23 +440,28 @@ namespace LitJson
list.Add(item); list.Add(item);
} }
if (t_data.IsArray) { if (t_data.IsArray)
{
int n = list.Count; int n = list.Count;
instance = Array.CreateInstance(elem_type, n); instance = Array.CreateInstance(elem_type, n);
for (int i = 0; i < n; i++) for (int i = 0; i < n; i++)
((Array)instance).SetValue(list[i], i); ((Array)instance).SetValue(list[i], i);
} else }
else
instance = list; instance = list;
} else if (reader.Token == JsonToken.ObjectStart) { }
else if (reader.Token == JsonToken.ObjectStart)
{
AddObjectMetadata(inst_type); AddObjectMetadata(inst_type);
ObjectMetadata t_data = object_metadata[inst_type]; ObjectMetadata t_data = object_metadata[inst_type];
instance = Activator.CreateInstance(inst_type); instance = Activator.CreateInstance(inst_type);
while (true) { while (true)
{
reader.Read(); reader.Read();
if (reader.Token == JsonToken.ObjectEnd) if (reader.Token == JsonToken.ObjectEnd)
@ -425,14 +469,18 @@ namespace LitJson
string property = (string)reader.Value; string property = (string)reader.Value;
if (t_data.Properties.ContainsKey (property)) { if (t_data.Properties.ContainsKey(property))
{
PropertyMetadata prop_data = PropertyMetadata prop_data =
t_data.Properties[property]; t_data.Properties[property];
if (prop_data.IsField) { if (prop_data.IsField)
{
((FieldInfo)prop_data.Info).SetValue( ((FieldInfo)prop_data.Info).SetValue(
instance, ReadValue(prop_data.Type, reader)); instance, ReadValue(prop_data.Type, reader));
} else { }
else
{
PropertyInfo p_info = PropertyInfo p_info =
(PropertyInfo)prop_data.Info; (PropertyInfo)prop_data.Info;
@ -445,7 +493,9 @@ namespace LitJson
ReadValue(prop_data.Type, reader); ReadValue(prop_data.Type, reader);
} }
} else { }
else
{
if (!t_data.IsDictionary) if (!t_data.IsDictionary)
throw new JsonException(String.Format( throw new JsonException(String.Format(
"The type {0} doesn't have the " + "The type {0} doesn't have the " +
@ -494,7 +544,8 @@ namespace LitJson
case JsonToken.ArrayStart: case JsonToken.ArrayStart:
instance.SetJsonType(JsonType.Array); instance.SetJsonType(JsonType.Array);
while (true) { while (true)
{
IJsonWrapper item = ReadValue(factory, reader); IJsonWrapper item = ReadValue(factory, reader);
if (item == null && reader.Token == JsonToken.ArrayEnd) if (item == null && reader.Token == JsonToken.ArrayEnd)
break; break;
@ -505,7 +556,8 @@ namespace LitJson
case JsonToken.ObjectStart: case JsonToken.ObjectStart:
instance.SetJsonType(JsonType.Object); instance.SetJsonType(JsonType.Object);
while (true) { while (true)
{
reader.Read(); reader.Read();
if (reader.Token == JsonToken.ObjectEnd) if (reader.Token == JsonToken.ObjectEnd)
break; break;
@ -571,78 +623,52 @@ namespace LitJson
private static void RegisterBaseImporters() private static void RegisterBaseImporters()
{ {
ImporterFunc importer; ImporterFunc importer = input => Convert.ToByte((int)input);
importer = delegate (object input) {
return Convert.ToByte ((int) input);
};
RegisterImporter(base_importers_table, typeof(int), RegisterImporter(base_importers_table, typeof(int),
typeof(byte), importer); typeof(byte), importer);
importer = delegate (object input) { importer = input => Convert.ToUInt64((int)input);
return Convert.ToUInt64 ((int) input);
};
RegisterImporter(base_importers_table, typeof(int), RegisterImporter(base_importers_table, typeof(int),
typeof(ulong), importer); typeof(ulong), importer);
importer = delegate (object input) { importer = input => Convert.ToSByte((int)input);
return Convert.ToSByte ((int) input);
};
RegisterImporter(base_importers_table, typeof(int), RegisterImporter(base_importers_table, typeof(int),
typeof(sbyte), importer); typeof(sbyte), importer);
importer = delegate (object input) { importer = input => Convert.ToInt16((int)input);
return Convert.ToInt16 ((int) input);
};
RegisterImporter(base_importers_table, typeof(int), RegisterImporter(base_importers_table, typeof(int),
typeof(short), importer); typeof(short), importer);
importer = delegate (object input) { importer = input => Convert.ToUInt16((int)input);
return Convert.ToUInt16 ((int) input);
};
RegisterImporter(base_importers_table, typeof(int), RegisterImporter(base_importers_table, typeof(int),
typeof(ushort), importer); typeof(ushort), importer);
importer = delegate (object input) { importer = input => Convert.ToUInt32((int)input);
return Convert.ToUInt32 ((int) input);
};
RegisterImporter(base_importers_table, typeof(int), RegisterImporter(base_importers_table, typeof(int),
typeof(uint), importer); typeof(uint), importer);
importer = delegate (object input) { importer = input => Convert.ToSingle((int)input);
return Convert.ToSingle ((int) input);
};
RegisterImporter(base_importers_table, typeof(int), RegisterImporter(base_importers_table, typeof(int),
typeof(float), importer); typeof(float), importer);
importer = delegate (object input) { importer = input => Convert.ToDouble((int)input);
return Convert.ToDouble ((int) input);
};
RegisterImporter(base_importers_table, typeof(int), RegisterImporter(base_importers_table, typeof(int),
typeof(double), importer); typeof(double), importer);
importer = delegate (object input) { importer = input => Convert.ToDecimal((double)input);
return Convert.ToDecimal ((double) input);
};
RegisterImporter(base_importers_table, typeof(double), RegisterImporter(base_importers_table, typeof(double),
typeof(decimal), importer); typeof(decimal), importer);
importer = delegate (object input) { importer = input => Convert.ToUInt32((long)input);
return Convert.ToUInt32 ((long) input);
};
RegisterImporter(base_importers_table, typeof(long), RegisterImporter(base_importers_table, typeof(long),
typeof(uint), importer); typeof(uint), importer);
importer = delegate (object input) { importer = input => Convert.ToChar((string)input);
return Convert.ToChar ((string) input);
};
RegisterImporter(base_importers_table, typeof(string), RegisterImporter(base_importers_table, typeof(string),
typeof(char), importer); typeof(char), importer);
importer = delegate (object input) { importer = input => Convert.ToDateTime((string)input, datetime_format);
return Convert.ToDateTime ((string) input, datetime_format);
};
RegisterImporter(base_importers_table, typeof(string), RegisterImporter(base_importers_table, typeof(string),
typeof(DateTime), importer); typeof(DateTime), importer);
} }
@ -667,49 +693,57 @@ namespace LitJson
"trying to export from type {0}", "trying to export from type {0}",
obj.GetType())); obj.GetType()));
if (obj == null) { if (obj == null)
{
writer.Write(null); writer.Write(null);
return; return;
} }
if (obj is IJsonWrapper) { if (obj is IJsonWrapper wrapper)
{
if (writer_is_private) if (writer_is_private)
writer.TextWriter.Write (((IJsonWrapper) obj).ToJson ()); writer.TextWriter.Write(wrapper.ToJson());
else else
((IJsonWrapper) obj).ToJson (writer); wrapper.ToJson(writer);
return; return;
} }
if (obj is String) { if (obj is string s)
writer.Write ((string) obj); {
writer.Write(s);
return; return;
} }
if (obj is Double) { if (obj is double d)
writer.Write ((double) obj); {
writer.Write(d);
return; return;
} }
if (obj is Int32) { if (obj is int i)
writer.Write ((int) obj); {
writer.Write(i);
return; return;
} }
if (obj is Boolean) { if (obj is bool b)
writer.Write ((bool) obj); {
writer.Write(b);
return; return;
} }
if (obj is Int64) { if (obj is long l)
writer.Write ((long) obj); {
writer.Write(l);
return; return;
} }
if (obj is Array) { if (obj is Array array)
{
writer.WriteArrayStart(); writer.WriteArrayStart();
foreach (object elem in (Array) obj) foreach (object elem in array)
WriteValue(elem, writer, writer_is_private, depth + 1); WriteValue(elem, writer, writer_is_private, depth + 1);
writer.WriteArrayEnd(); writer.WriteArrayEnd();
@ -717,18 +751,21 @@ namespace LitJson
return; return;
} }
if (obj is IList) { if (obj is IList list)
{
writer.WriteArrayStart(); writer.WriteArrayStart();
foreach (object elem in (IList) obj) foreach (object elem in list)
WriteValue(elem, writer, writer_is_private, depth + 1); WriteValue(elem, writer, writer_is_private, depth + 1);
writer.WriteArrayEnd(); writer.WriteArrayEnd();
return; return;
} }
if (obj is IDictionary) { if (obj is IDictionary dictionary)
{
writer.WriteObjectStart(); writer.WriteObjectStart();
foreach (DictionaryEntry entry in (IDictionary) obj) { foreach (DictionaryEntry entry in dictionary)
{
writer.WritePropertyName((string)entry.Key); writer.WritePropertyName((string)entry.Key);
WriteValue(entry.Value, writer, writer_is_private, WriteValue(entry.Value, writer, writer_is_private,
depth + 1); depth + 1);
@ -741,7 +778,8 @@ namespace LitJson
Type obj_type = obj.GetType(); Type obj_type = obj.GetType();
// See if there's a custom exporter for the object // See if there's a custom exporter for the object
if (custom_exporters_table.ContainsKey (obj_type)) { if (custom_exporters_table.ContainsKey(obj_type))
{
ExporterFunc exporter = custom_exporters_table[obj_type]; ExporterFunc exporter = custom_exporters_table[obj_type];
exporter(obj, writer); exporter(obj, writer);
@ -749,7 +787,8 @@ namespace LitJson
} }
// If not, maybe there's a base exporter // If not, maybe there's a base exporter
if (base_exporters_table.ContainsKey (obj_type)) { if (base_exporters_table.ContainsKey(obj_type))
{
ExporterFunc exporter = base_exporters_table[obj_type]; ExporterFunc exporter = base_exporters_table[obj_type];
exporter(obj, writer); exporter(obj, writer);
@ -757,7 +796,8 @@ namespace LitJson
} }
// Last option, let's see if it's an enum // Last option, let's see if it's an enum
if (obj is Enum) { if (obj is Enum)
{
Type e_type = Enum.GetUnderlyingType(obj_type); Type e_type = Enum.GetUnderlyingType(obj_type);
if (e_type == typeof(long) if (e_type == typeof(long)
@ -776,16 +816,20 @@ namespace LitJson
IList<PropertyMetadata> props = type_properties[obj_type]; IList<PropertyMetadata> props = type_properties[obj_type];
writer.WriteObjectStart(); writer.WriteObjectStart();
foreach (PropertyMetadata p_data in props) { foreach (PropertyMetadata p_data in props)
if (p_data.IsField) { {
if (p_data.IsField)
{
writer.WritePropertyName(p_data.Info.Name); writer.WritePropertyName(p_data.Info.Name);
WriteValue(((FieldInfo)p_data.Info).GetValue(obj), WriteValue(((FieldInfo)p_data.Info).GetValue(obj),
writer, writer_is_private, depth + 1); writer, writer_is_private, depth + 1);
} }
else { else
{
PropertyInfo p_info = (PropertyInfo)p_data.Info; PropertyInfo p_info = (PropertyInfo)p_data.Info;
if (p_info.CanRead) { if (p_info.CanRead)
{
writer.WritePropertyName(p_data.Info.Name); writer.WritePropertyName(p_data.Info.Name);
WriteValue(p_info.GetValue(obj, null), WriteValue(p_info.GetValue(obj, null),
writer, writer_is_private, depth + 1); writer, writer_is_private, depth + 1);
@ -799,7 +843,8 @@ namespace LitJson
public static string ToJson(object obj) public static string ToJson(object obj)
{ {
lock (static_writer_lock) { lock (static_writer_lock)
{
static_writer.Reset(); static_writer.Reset();
WriteValue(obj, static_writer, true, 0); WriteValue(obj, static_writer, true, 0);
@ -816,7 +861,7 @@ namespace LitJson
public static JsonData ToObject(JsonReader reader) public static JsonData ToObject(JsonReader reader)
{ {
return (JsonData)ToWrapper( return (JsonData)ToWrapper(
delegate { return new JsonData (); }, reader); () => new JsonData(), reader);
} }
public static JsonData ToObject(TextReader reader) public static JsonData ToObject(TextReader reader)
@ -824,13 +869,13 @@ namespace LitJson
JsonReader json_reader = new JsonReader(reader); JsonReader json_reader = new JsonReader(reader);
return (JsonData)ToWrapper( return (JsonData)ToWrapper(
delegate { return new JsonData (); }, json_reader); () => new JsonData(), json_reader);
} }
public static JsonData ToObject(string json) public static JsonData ToObject(string json)
{ {
return (JsonData)ToWrapper( return (JsonData)ToWrapper(
delegate { return new JsonData (); }, json); () => new JsonData(), json);
} }
public static T ToObject<T>(JsonReader reader) public static T ToObject<T>(JsonReader reader)
@ -880,9 +925,7 @@ namespace LitJson
ImporterFunc<TJson, TValue> importer) ImporterFunc<TJson, TValue> importer)
{ {
ImporterFunc importer_wrapper = ImporterFunc importer_wrapper =
delegate (object input) { input => importer((TJson)input);
return importer ((TJson) input);
};
RegisterImporter(custom_importers_table, typeof(TJson), RegisterImporter(custom_importers_table, typeof(TJson),
typeof(TValue), importer_wrapper); typeof(TValue), importer_wrapper);

View file

@ -425,7 +425,7 @@ namespace OpenMetaverse
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
return (obj is Color4) && this == (Color4)obj; return (obj is Color4 color4) && this == color4;
} }
public bool Equals(Color4 other) public bool Equals(Color4 other)

View file

@ -986,7 +986,7 @@ namespace OpenMetaverse
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
return (obj is Matrix4) ? this.Equals((Matrix4)obj) : false; return (obj is Matrix4 matrix4) && this.Equals(matrix4);
} }
public bool Equals(Matrix4 other) public bool Equals(Matrix4 other)

View file

@ -675,7 +675,7 @@ namespace OpenMetaverse
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
return (obj is Quaternion) ? this == (Quaternion)obj : false; return (obj is Quaternion quaternion) && this == quaternion;
} }
public bool Equals(Quaternion other) public bool Equals(Quaternion other)

View file

@ -344,7 +344,7 @@ namespace OpenMetaverse
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
return (obj is Vector2) ? this == ((Vector2)obj) : false; return (obj is Vector2 vector2) && this == vector2;
} }
public bool Equals(Vector2 other) public bool Equals(Vector2 other)

View file

@ -381,7 +381,7 @@ namespace OpenMetaverse
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
return (obj is Vector3d) ? this == (Vector3d)obj : false; return (obj is Vector3d v3d) && this == v3d;
} }
public bool Equals(Vector3d other) public bool Equals(Vector3d other)

View file

@ -425,7 +425,7 @@ namespace OpenMetaverse
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
return (obj is Vector4) ? this == (Vector4)obj : false; return (obj is Vector4 vector4) && this == vector4;
} }
public bool Equals(Vector4 other) public bool Equals(Vector4 other)

View file

@ -110,13 +110,13 @@ namespace OpenMetaverse.Assets
{ {
// Right now we're nastily obtaining the UUID from the filename // Right now we're nastily obtaining the UUID from the filename
string filename = assetPath.Remove(0, ArchiveConstants.ASSETS_PATH.Length); string filename = assetPath.Remove(0, ArchiveConstants.ASSETS_PATH.Length);
int i = filename.LastIndexOf(ArchiveConstants.ASSET_EXTENSION_SEPARATOR); int i = filename.LastIndexOf(ArchiveConstants.ASSET_EXTENSION_SEPARATOR, StringComparison.Ordinal);
if (i == -1) if (i == -1)
{ {
Logger.Log(String.Format( Logger.Log(
"[OarFile]: Could not find extension information in asset path {0} since it's missing the separator {1}. Skipping", $"[OarFile]: Could not find extension information in asset path {assetPath} since it's missing the separator " +
assetPath, ArchiveConstants.ASSET_EXTENSION_SEPARATOR), Helpers.LogLevel.Warning); $"{ArchiveConstants.ASSET_EXTENSION_SEPARATOR}. Skipping", Helpers.LogLevel.Warning);
return false; return false;
} }

View file

@ -83,7 +83,7 @@ namespace OpenMetaverse.Assets
String text = Utils.BytesToString(AssetData); String text = Utils.BytesToString(AssetData);
if (text.ToLower().Contains("callingcard version 2")) if (text.ToLower().Contains("callingcard version 2"))
{ {
AvatarID = new UUID(text.Substring(text.IndexOf("avatar_id") + 10, 36)); AvatarID = new UUID(text.Substring(text.IndexOf("avatar_id", StringComparison.Ordinal) + 10, 36));
return true; return true;
} }
return false; return false;

View file

@ -75,9 +75,9 @@ namespace OpenMetaverse.Assets
String text = Utils.BytesToString(AssetData); String text = Utils.BytesToString(AssetData);
if (text.ToLower().Contains("landmark version 2")) if (text.ToLower().Contains("landmark version 2"))
{ {
RegionID = new UUID(text.Substring(text.IndexOf("region_id") + 10, 36)); RegionID = new UUID(text.Substring(text.IndexOf("region_id", StringComparison.Ordinal) + 10, 36));
String vecDelim = " "; String vecDelim = " ";
String[] vecStrings = text.Substring(text.IndexOf("local_pos") + 10).Split(vecDelim.ToCharArray()); String[] vecStrings = text.Substring(text.IndexOf("local_pos", StringComparison.Ordinal) + 10).Split(vecDelim.ToCharArray());
if (vecStrings.Length == 3) if (vecStrings.Length == 3)
{ {
Position = new Vector3(float.Parse(vecStrings[0], System.Globalization.CultureInfo.InvariantCulture), float.Parse(vecStrings[1], System.Globalization.CultureInfo.InvariantCulture), float.Parse(vecStrings[2], System.Globalization.CultureInfo.InvariantCulture)); Position = new Vector3(float.Parse(vecStrings[0], System.Globalization.CultureInfo.InvariantCulture), float.Parse(vecStrings[1], System.Globalization.CultureInfo.InvariantCulture), float.Parse(vecStrings[2], System.Globalization.CultureInfo.InvariantCulture));

View file

@ -342,11 +342,11 @@ namespace OpenMetaverse.Assets
} }
else if (key == "name") else if (key == "name")
{ {
name = val.Remove(val.LastIndexOf("|")); name = val.Remove(val.LastIndexOf("|", StringComparison.Ordinal));
} }
else if (key == "desc") else if (key == "desc")
{ {
description = val.Remove(val.LastIndexOf("|")); description = val.Remove(val.LastIndexOf("|", StringComparison.Ordinal));
} }
else if (key == "creation_date") else if (key == "creation_date")
{ {
@ -388,7 +388,7 @@ namespace OpenMetaverse.Assets
{ {
BodyText += lines[i++] + "\n"; BodyText += lines[i++] + "\n";
} }
BodyText = BodyText.Remove(BodyText.LastIndexOf("}")); BodyText = BodyText.Remove(BodyText.LastIndexOf("}", StringComparison.Ordinal));
return true; return true;
} }
catch (Exception ex) catch (Exception ex)

View file

@ -129,8 +129,8 @@ namespace OpenMetaverse
/// <returns></returns> /// <returns></returns>
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
if (obj is GridRegion) if (obj is GridRegion region)
return Equals((GridRegion)obj); return Equals(region);
else else
return false; return false;
} }
@ -811,7 +811,8 @@ namespace OpenMetaverse
} }
// find stale entries (people who left the sim) // find stale entries (people who left the sim)
List<UUID> removedEntries = e.Simulator.avatarPositions.FindAll(delegate(UUID findID) { return !coarseEntries.ContainsKey(findID); }); List<UUID> removedEntries = e.Simulator.avatarPositions.FindAll(
findID => !coarseEntries.ContainsKey(findID));
// anyone who was not listed in the previous update // anyone who was not listed in the previous update
List<UUID> newEntries = new List<UUID>(); List<UUID> newEntries = new List<UUID>();

View file

@ -44,7 +44,7 @@ namespace OpenMetaverse.Messages
public static OSD FromIP(IPAddress address) public static OSD FromIP(IPAddress address)
{ {
if (address != null && address != IPAddress.Any) if (address != null && !Equals(address, IPAddress.Any))
return OSD.FromBinary(address.GetAddressBytes()); return OSD.FromBinary(address.GetAddressBytes());
else else
return new OSD(); return new OSD();

View file

@ -284,7 +284,8 @@ namespace OpenMetaverse
/// </summary> /// </summary>
/// <param name="e">A ParticleUpdateEventArgs object containing /// <param name="e">A ParticleUpdateEventArgs object containing
/// the data sent from the simulator</param> /// the data sent from the simulator</param>
protected virtual void OnParticleUpdate(ParticleUpdateEventArgs e) { protected virtual void OnParticleUpdate(ParticleUpdateEventArgs e)
{
EventHandler<ParticleUpdateEventArgs> handler = m_ParticleUpdate; EventHandler<ParticleUpdateEventArgs> handler = m_ParticleUpdate;
if (handler != null) if (handler != null)
handler(this, e); handler(this, e);
@ -305,7 +306,8 @@ namespace OpenMetaverse
#endregion AvatarUpdate event #endregion AvatarUpdate event
#region TerseObjectUpdate event #region TerseObjectUpdate event
public event EventHandler<ParticleUpdateEventArgs> ParticleUpdate { public event EventHandler<ParticleUpdateEventArgs> ParticleUpdate
{
add { lock (m_ParticleUpdateLock) { m_ParticleUpdate += value; } } add { lock (m_ParticleUpdateLock) { m_ParticleUpdate += value; } }
remove { lock (m_ParticleUpdateLock) { m_ParticleUpdate -= value; } } remove { lock (m_ParticleUpdateLock) { m_ParticleUpdate -= value; } }
} }
@ -1685,7 +1687,9 @@ namespace OpenMetaverse
{ {
ObjectMediaNavigateMessage req = new ObjectMediaNavigateMessage ObjectMediaNavigateMessage req = new ObjectMediaNavigateMessage
{ {
PrimID = primID, URL = newURL, Face = face PrimID = primID,
URL = newURL,
Face = face
}; };
request.OnComplete += (client, result, error) => request.OnComplete += (client, result, error) =>
@ -1759,13 +1763,11 @@ namespace OpenMetaverse
ObjectMediaMessage msg = new ObjectMediaMessage(); ObjectMediaMessage msg = new ObjectMediaMessage();
msg.Deserialize((OSDMap)result); msg.Deserialize((OSDMap)result);
if (msg.Request is ObjectMediaResponse) if (msg.Request is ObjectMediaResponse response)
{ {
ObjectMediaResponse response = (ObjectMediaResponse)msg.Request;
if (Client.Settings.OBJECT_TRACKING) if (Client.Settings.OBJECT_TRACKING)
{ {
Primitive prim = sim.ObjectsPrimitives.Find((Primitive p) => { return p.ID == primID; }); Primitive prim = sim.ObjectsPrimitives.Find((Primitive p) => p.ID == primID);
if (prim != null) if (prim != null)
{ {
prim.MediaVersion = response.Version; prim.MediaVersion = response.Version;
@ -2117,7 +2119,8 @@ namespace OpenMetaverse
{ handler(this, new PrimEventArgs(simulator, prim, update.RegionData.TimeDilation, isNewObject, attachment)); }); { handler(this, new PrimEventArgs(simulator, prim, update.RegionData.TimeDilation, isNewObject, attachment)); });
} }
//OnParticleUpdate handler replacing decode particles, PCode.Particle system appears to be deprecated this is a fix //OnParticleUpdate handler replacing decode particles, PCode.Particle system appears to be deprecated this is a fix
if (prim.ParticleSys.PartMaxAge != 0) { if (prim.ParticleSys.PartMaxAge != 0)
{
OnParticleUpdate(new ParticleUpdateEventArgs(simulator, prim.ParticleSys, prim)); OnParticleUpdate(new ParticleUpdateEventArgs(simulator, prim.ParticleSys, prim));
} }
@ -2626,7 +2629,7 @@ namespace OpenMetaverse
catch (IndexOutOfRangeException ex) catch (IndexOutOfRangeException ex)
{ {
Logger.Log("Error decoding an ObjectUpdateCompressed packet", Helpers.LogLevel.Warning, Client, ex); Logger.Log("Error decoding an ObjectUpdateCompressed packet", Helpers.LogLevel.Warning, Client, ex);
Logger.Log(block.ToString(), Helpers.LogLevel.Warning); // ? Might want to look into what .ToString here returns Logger.Log(block.ToString(), Helpers.LogLevel.Warning);
} }
} }
} }
@ -2808,7 +2811,7 @@ namespace OpenMetaverse
if (Client.Settings.OBJECT_TRACKING) if (Client.Settings.OBJECT_TRACKING)
{ {
Primitive findPrim = simulator.ObjectsPrimitives.Find( Primitive findPrim = simulator.ObjectsPrimitives.Find(
delegate(Primitive prim) { return prim.ID == props.ObjectID; }); prim => prim.ID == props.ObjectID);
if (findPrim != null) if (findPrim != null)
{ {
@ -2858,7 +2861,7 @@ namespace OpenMetaverse
if (Client.Settings.OBJECT_TRACKING) if (Client.Settings.OBJECT_TRACKING)
{ {
Primitive findPrim = simulator.ObjectsPrimitives.Find( Primitive findPrim = simulator.ObjectsPrimitives.Find(
delegate(Primitive prim) { return prim.ID == op.ObjectData.ObjectID; }); prim => prim.ID == op.ObjectData.ObjectID);
if (findPrim != null) if (findPrim != null)
{ {
@ -3472,7 +3475,8 @@ namespace OpenMetaverse
} }
} }
public class ParticleUpdateEventArgs : EventArgs { public class ParticleUpdateEventArgs : EventArgs
{
private readonly Simulator m_Simulator; private readonly Simulator m_Simulator;
private readonly Primitive.ParticleSystem m_ParticleSystem; private readonly Primitive.ParticleSystem m_ParticleSystem;
private readonly Primitive m_Source; private readonly Primitive m_Source;
@ -3490,7 +3494,8 @@ namespace OpenMetaverse
/// <param name="simulator">The simulator the packet originated from</param> /// <param name="simulator">The simulator the packet originated from</param>
/// <param name="particlesystem">The ParticleSystem data</param> /// <param name="particlesystem">The ParticleSystem data</param>
/// <param name="source">The Primitive source</param> /// <param name="source">The Primitive source</param>
public ParticleUpdateEventArgs(Simulator simulator, Primitive.ParticleSystem particlesystem, Primitive source) { public ParticleUpdateEventArgs(Simulator simulator, Primitive.ParticleSystem particlesystem, Primitive source)
{
this.m_Simulator = simulator; this.m_Simulator = simulator;
this.m_ParticleSystem = particlesystem; this.m_ParticleSystem = particlesystem;
this.m_Source = source; this.m_Source = source;

View file

@ -771,8 +771,8 @@ namespace OpenMetaverse.Packets
private static string DecodeNameValue(string fieldName, object fieldData) private static string DecodeNameValue(string fieldName, object fieldData)
{ {
NameValue[] nameValues = null; NameValue[] nameValues = null;
if (fieldData is NameValue[]) if (fieldData is NameValue[] data)
nameValues = fieldData as NameValue[]; nameValues = data;
else else
{ {
string nameValue = Utils.BytesToString((byte[])fieldData); string nameValue = Utils.BytesToString((byte[])fieldData);
@ -1024,12 +1024,12 @@ namespace OpenMetaverse.Packets
private static string DecodeTimeStamp(string fieldName, object fieldData) private static string DecodeTimeStamp(string fieldName, object fieldData)
{ {
if (fieldData is Int32 && (int) fieldData > 0) if (fieldData is int data && data > 0)
return return
$"{fieldName,30}: {fieldData,-10} {"(" + Utils.UnixTimeToDateTime((int) fieldData) + ")",-29} [{fieldData.GetType().Name}]"; $"{fieldName,30}: {data,-10} {"(" + Utils.UnixTimeToDateTime(data) + ")",-29} [{data.GetType().Name}]";
else if (fieldData is uint && (uint) fieldData > 0) else if (fieldData is uint u && u > 0)
return return
$"{fieldName,30}: {fieldData,-10} {"(" + Utils.UnixTimeToDateTime((uint) fieldData) + ")",-29} [{fieldData.GetType().Name}]"; $"{fieldName,30}: {u,-10} {"(" + Utils.UnixTimeToDateTime(u) + ")",-29} [{u.GetType().Name}]";
else else
return $"{fieldName,30}: {fieldData,-40} [{fieldData.GetType().Name}]"; return $"{fieldName,30}: {fieldData,-40} [{fieldData.GetType().Name}]";
} }
@ -1272,8 +1272,8 @@ namespace OpenMetaverse.Packets
private static string DecodeTextureEntry(string fieldName, object fieldData) private static string DecodeTextureEntry(string fieldName, object fieldData)
{ {
Primitive.TextureEntry te; Primitive.TextureEntry te;
if (fieldData is Primitive.TextureEntry) if (fieldData is Primitive.TextureEntry data)
te = (Primitive.TextureEntry) fieldData; te = data;
else else
{ {
byte[] tebytes = (byte[])fieldData; byte[] tebytes = (byte[])fieldData;
@ -1622,9 +1622,8 @@ namespace OpenMetaverse.Packets
string[] keyList = { decoderKey, decoderKey.Replace("Packet", ""), keys[1] + "." + keys[2], keys[2] }; string[] keyList = { decoderKey, decoderKey.Replace("Packet", ""), keys[1] + "." + keys[2], keys[2] };
foreach (string key in keyList) foreach (string key in keyList)
{ {
if (fieldData is byte[]) if (fieldData is byte[] fd)
{ {
byte[] fd = (byte[]) fieldData;
if (!(fd.Length > 0)) if (!(fd.Length > 0))
{ {
// bypass the decoder since we were passed an empty byte array // bypass the decoder since we were passed an empty byte array

View file

@ -145,7 +145,7 @@ namespace OpenMetaverse
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
return (obj is Permissions) && this == (Permissions)obj; return (obj is Permissions permissions) && this == permissions;
} }
public bool Equals(Permissions other) public bool Equals(Permissions other)

View file

@ -548,12 +548,12 @@ namespace OpenMetaverse.Rendering
/// <returns>A standard .Net string</returns> /// <returns>A standard .Net string</returns>
public static string TrimAt0(string s) public static string TrimAt0(string s)
{ {
int pos = s.IndexOf("\0"); int pos = s.IndexOf("\0", StringComparison.Ordinal);
if (pos >= 0) if (pos >= 0)
return s.Substring(0, pos); return s.Substring(0, pos);
return s; return pos >= 0 ? s.Substring(0, pos) : s;
} }
} }
} }