From cf55a4392fa0252154eba565ca184c1a582fb7f1 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Tue, 12 Apr 2022 19:58:45 +0100 Subject: [PATCH 01/29] Fix: tiny typo --- .editorconfig | 19 ++++++++++++ .gitignore | 42 ++++++++++++++++++++++++++ LibreMetaverse/InternalDictionary.cs | 31 ++++++++++--------- LibreMetaverse/ObservableDictionary.cs | 39 ++++++++++++------------ README.md | 2 +- 5 files changed, 98 insertions(+), 35 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..3adc7245 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +charset = utf-8 +indent_style = tab +indent_size = tab +tab_width = 2 +trim_trailing_whitespace = true + +# The property below is not yet universally supported +[*.md] +max_line_length = 108 +word_wrap = true +# Markdown sometimes uses two spaces at the end to +# mark soft line breaks +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore index ea09b491..1a2d6eb8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,45 @@ +~* +# Stupid macOS temporary files + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +Icon? + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Stuff from the Nova editor +.nova +node_modules +package.json +package-lock.json +.eslintrc.yml +.prettierrc.json + +# Original LibreMetaverse .gitignore follows compile.bat *.user *.userprefs diff --git a/LibreMetaverse/InternalDictionary.cs b/LibreMetaverse/InternalDictionary.cs index a9c1cd40..1679151c 100644 --- a/LibreMetaverse/InternalDictionary.cs +++ b/LibreMetaverse/InternalDictionary.cs @@ -31,10 +31,10 @@ namespace OpenMetaverse { /// /// The InternalDictionary class is used through the library for storing key/value pairs. - /// It is intended to be a replacement for the generic Dictionary class and should + /// It is intended to be a replacement for the generic Dictionary class and should /// be used in its place. It contains several methods for allowing access to the data from /// outside the library that are read only and thread safe. - /// + /// /// /// Key /// Value @@ -57,7 +57,7 @@ namespace OpenMetaverse public int Count { get { lock (Dictionary) return Dictionary.Count; } } /// - /// Initializes a new instance of the Class + /// Initializes a new instance of the Class /// with the specified key/value, has the default initial capacity. /// /// @@ -72,8 +72,8 @@ namespace OpenMetaverse } /// - /// Initializes a new instance of the Class - /// with the specified key/value, has its initial valies copied from the specified + /// Initializes a new instance of the Class + /// with the specified key/value, has its initial valies copied from the specified /// /// /// @@ -82,12 +82,12 @@ namespace OpenMetaverse /// /// // initialize a new InternalDictionary named testAvName with a UUID as the key and an string as the value. /// // populates with copied values from example KeyNameCache Dictionary. - /// + /// /// // create source dictionary /// Dictionary<UUID, string> KeyNameCache = new Dictionary<UUID, string>(); /// KeyNameCache.Add("8300f94a-7970-7810-cf2c-fc9aa6cdda24", "Jack Avatar"); /// KeyNameCache.Add("27ba1e40-13f7-0708-3e98-5819d780bd62", "Jill Avatar"); - /// + /// /// // Initialize new dictionary. /// public InternalDictionary<UUID, string> testAvName = new InternalDictionary<UUID, string>(KeyNameCache); /// @@ -98,13 +98,13 @@ namespace OpenMetaverse } /// - /// Initializes a new instance of the Class + /// Initializes a new instance of the Class /// with the specified key/value, With its initial capacity specified. /// /// Initial size of dictionary /// /// - /// // initialize a new InternalDictionary named testDict with a string as the key and an int as the value, + /// // initialize a new InternalDictionary named testDict with a string as the key and an int as the value, /// // initially allocated room for 10 entries. /// public InternalDictionary<string, int> testDict = new InternalDictionary<string, int>(10); /// @@ -115,7 +115,7 @@ namespace OpenMetaverse } /// - /// Try to get entry from with specified key + /// Try to get entry from with specified key /// /// Key to use for lookup /// Value returned @@ -176,7 +176,7 @@ namespace OpenMetaverse /// Vector3 pos = prim.Position; /// return ((prim.ParentID == 0) && (pos != Vector3.Zero) && (Vector3.Distance(pos, location) < radius)); /// } - /// ); + /// ); /// /// public List FindAll(Predicate match) @@ -203,7 +203,7 @@ namespace OpenMetaverse /// delegate(UUID id) { /// return myOtherDict.ContainsKey(id); /// } - /// ); + /// ); /// /// public List FindAll(Predicate match) @@ -230,7 +230,7 @@ namespace OpenMetaverse /// { /// if (prim.Text != null) /// { - /// Console.WriteLine("NAME={0} ID = {1} TEXT = '{2}'", + /// Console.WriteLine("NAME={0} ID = {1} TEXT = '{2}'", /// prim.PropertiesFamily.Name, prim.ID, prim.Text); /// } /// }); @@ -292,7 +292,7 @@ namespace OpenMetaverse } /// - /// Adds the specified key to the dictionary, dictionary locking is not performed, + /// Adds the specified key to the dictionary, dictionary locking is not performed, /// /// /// The key @@ -300,7 +300,8 @@ namespace OpenMetaverse internal void Add(TKey key, TValue value) { lock (Dictionary) - Dictionary.Add(key, value); +// Dictionary.Add(key, value); + Dictionary[key] = value; } /// diff --git a/LibreMetaverse/ObservableDictionary.cs b/LibreMetaverse/ObservableDictionary.cs index 80061b9b..645a39d1 100644 --- a/LibreMetaverse/ObservableDictionary.cs +++ b/LibreMetaverse/ObservableDictionary.cs @@ -32,26 +32,26 @@ namespace OpenMetaverse { /// - /// + /// /// public enum DictionaryEventAction { /// - /// + /// /// Add, /// - /// + /// /// Remove, /// - /// + /// /// Change } /// - /// + /// /// /// /// @@ -80,7 +80,7 @@ namespace OpenMetaverse { if (Delegates.ContainsKey(action)) { - Delegates[action].Add(callback); + Delegates[action].Add(callback); } else { @@ -105,13 +105,13 @@ namespace OpenMetaverse } /// - /// + /// /// /// /// private void FireChangeEvent(DictionaryEventAction action, DictionaryEntry entry) { - + if(Delegates.ContainsKey(action)) { foreach(DictionaryChangeCallback handler in Delegates[action]) @@ -133,7 +133,7 @@ namespace OpenMetaverse public int Count { get { return Dictionary.Count; } } /// - /// Initializes a new instance of the Class + /// Initializes a new instance of the Class /// with the specified key/value, has the default initial capacity. /// /// @@ -149,13 +149,13 @@ namespace OpenMetaverse } /// - /// Initializes a new instance of the Class + /// Initializes a new instance of the Class /// with the specified key/value, With its initial capacity specified. /// /// Initial size of dictionary /// /// - /// // initialize a new ObservableDictionary named testDict with a string as the key and an int as the value, + /// // initialize a new ObservableDictionary named testDict with a string as the key and an int as the value, /// // initially allocated room for 10 entries. /// public ObservableDictionary<string, int> testDict = new ObservableDictionary<string, int>(10); /// @@ -167,7 +167,7 @@ namespace OpenMetaverse } /// - /// Try to get entry from the with specified key + /// Try to get entry from the with specified key /// /// Key to use for lookup /// Value returned @@ -222,13 +222,13 @@ namespace OpenMetaverse /// Vector3 pos = prim.Position; /// return ((prim.ParentID == 0) && (pos != Vector3.Zero) && (Vector3.Distance(pos, location) < radius)); /// } - /// ); + /// ); /// /// public List FindAll(Predicate match) { List found = new List(); - + foreach (KeyValuePair kvp in Dictionary) { if (match(kvp.Value)) @@ -247,19 +247,19 @@ namespace OpenMetaverse /// delegate(UUID id) { /// return myOtherDict.ContainsKey(id); /// } - /// ); + /// ); /// /// public List FindAll(Predicate match) { List found = new List(); - + foreach (KeyValuePair kvp in Dictionary) { if (match(kvp.Key)) found.Add(kvp.Key); } - + return found; } @@ -280,14 +280,15 @@ namespace OpenMetaverse } /// - /// Adds the specified key to the dictionary, dictionary locking is not performed, + /// Adds the specified key to the dictionary, dictionary locking is not performed, /// /// /// The key /// The value public void Add(TKey key, TValue value) { - Dictionary.Add(key, value); + // Dictionary.Add(key, value); + Dictionary[key] = value; FireChangeEvent(DictionaryEventAction.Add, new DictionaryEntry(key, value)); } diff --git a/README.md b/README.md index 3921957c..b5d442cb 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ LibreMetaverse =============================================================================== LibreMetaverse is a fork of libOpenMetaverse which in turn was a fork of libSecondLife, a library for developing Second Life-compatible virtual world -clients. LibreMetavrse returns the focus to up-to-date Second Life and OpenSim +clients. LibreMetaverse returns the focus to up-to-date Second Life and OpenSim compatibility with an eye to performance, multi-threading, and memory management. The canonical source for LibreMetaverse can be found at: From 5b5fe3ce1ef0fc0306edf7f6bd46859879540984 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Tue, 12 Apr 2022 20:31:56 +0100 Subject: [PATCH 02/29] Feat: attempt to use net6.0 for compilation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... because I *need* it! 😭 --- LibreMetaverse.GUI/LibreMetaverse.GUI.csproj | 4 ++-- LibreMetaverse.LslTools/LibreMetaverse.LslTools.csproj | 4 ++-- .../LibreMetaverse.Rendering.Meshmerizer.csproj | 4 ++-- .../LibreMetaverse.Rendering.Simple.csproj | 4 ++-- .../LibreMetaverse.StructuredData.csproj | 4 ++-- LibreMetaverse.Tests/LibreMetaverse.Tests.csproj | 4 ++-- LibreMetaverse.Types/LibreMetaverse.Types.csproj | 4 ++-- LibreMetaverse.Utilities/LibreMetaverse.Utilities.csproj | 4 ++-- LibreMetaverse.Voice/LibreMetaverse.Voice.csproj | 4 ++-- LibreMetaverse/LibreMetaverse.csproj | 2 +- PrimMesher/LibreMetaverse.PrimMesher.csproj | 4 ++-- Programs/Baker/Baker.csproj | 4 ++-- Programs/GridProxy/GridProxy.csproj | 4 ++-- Programs/VoiceTest/VoiceTest.csproj | 4 ++-- Programs/examples/GridAccountant/GridAccountant.csproj | 4 ++-- Programs/examples/IRCGateway/IRCGateway.csproj | 4 ++-- Programs/examples/PacketDump/PacketDump.csproj | 4 ++-- Programs/examples/TestClient/TestClient.csproj | 2 +- Programs/mapgenerator/mapgenerator.csproj | 4 ++-- 19 files changed, 36 insertions(+), 36 deletions(-) diff --git a/LibreMetaverse.GUI/LibreMetaverse.GUI.csproj b/LibreMetaverse.GUI/LibreMetaverse.GUI.csproj index b3d2f8fd..a1db7183 100644 --- a/LibreMetaverse.GUI/LibreMetaverse.GUI.csproj +++ b/LibreMetaverse.GUI/LibreMetaverse.GUI.csproj @@ -1,6 +1,6 @@ - + - net471;net48;netcoreapp3.1;net5.0-windows + net471;net48;netcoreapp3.1;net5.0;net6.0-windows;net6.0-windows net471;netcoreapp3.1 diff --git a/LibreMetaverse.LslTools/LibreMetaverse.LslTools.csproj b/LibreMetaverse.LslTools/LibreMetaverse.LslTools.csproj index 64a00680..2b4c2389 100644 --- a/LibreMetaverse.LslTools/LibreMetaverse.LslTools.csproj +++ b/LibreMetaverse.LslTools/LibreMetaverse.LslTools.csproj @@ -1,6 +1,6 @@ - + - netstandard2.0;netstandard2.1;net5.0 + netstandard2.0;netstandard2.1;net5.0;net6.0 LibreMetaverse.LslTools LibreMetaverse.LslTools Lexer for LSL scrripting language diff --git a/LibreMetaverse.Rendering.Meshmerizer/LibreMetaverse.Rendering.Meshmerizer.csproj b/LibreMetaverse.Rendering.Meshmerizer/LibreMetaverse.Rendering.Meshmerizer.csproj index 1f57e152..45a19e72 100644 --- a/LibreMetaverse.Rendering.Meshmerizer/LibreMetaverse.Rendering.Meshmerizer.csproj +++ b/LibreMetaverse.Rendering.Meshmerizer/LibreMetaverse.Rendering.Meshmerizer.csproj @@ -1,10 +1,10 @@ - + LibreMetaverse.Rendering.Meshmerizer LibreMetaverse.Rendering.Meshmerizer Meshmerizer library for rendering mesh assets in LibreMetaverse LibreMetaverse.Rendering.Meshmerizer - netstandard2.0;netstandard2.1;net5.0 + netstandard2.0;netstandard2.1;net5.0;net6.0 Library true true diff --git a/LibreMetaverse.Rendering.Simple/LibreMetaverse.Rendering.Simple.csproj b/LibreMetaverse.Rendering.Simple/LibreMetaverse.Rendering.Simple.csproj index f27a8f68..4ffdebd1 100644 --- a/LibreMetaverse.Rendering.Simple/LibreMetaverse.Rendering.Simple.csproj +++ b/LibreMetaverse.Rendering.Simple/LibreMetaverse.Rendering.Simple.csproj @@ -1,9 +1,9 @@ - + LibreMetaverse.Rendering.Simple Simple library for rendering mesh assets in LibreMetaverse LibreMetaverse.Rendering.Simple - netstandard2.0;netstandard2.1;net5.0 + netstandard2.0;netstandard2.1;net5.0;net6.0 Library LibreMetaverse.Rendering.Simple true diff --git a/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.csproj b/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.csproj index 03797b90..2ea118af 100644 --- a/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.csproj +++ b/LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.csproj @@ -1,9 +1,9 @@ - + LibreMetaverse.StructuredData LibreMetaverse structured data library LibreMetaverse.StructuredData - netstandard2.0;netstandard2.1;net5.0 + netstandard2.0;netstandard2.1;net5.0;net6.0 Library LibreMetaverse.StructuredData true diff --git a/LibreMetaverse.Tests/LibreMetaverse.Tests.csproj b/LibreMetaverse.Tests/LibreMetaverse.Tests.csproj index a8967bcc..5d5eb72a 100644 --- a/LibreMetaverse.Tests/LibreMetaverse.Tests.csproj +++ b/LibreMetaverse.Tests/LibreMetaverse.Tests.csproj @@ -1,7 +1,7 @@ - + LibreMetaverse.Tests - netcoreapp3.1;net5.0 + netcoreapp3.1;net5.0;net6.0 Library LibreMetaverse.Tests true diff --git a/LibreMetaverse.Types/LibreMetaverse.Types.csproj b/LibreMetaverse.Types/LibreMetaverse.Types.csproj index eae1dd21..98fe6a8f 100644 --- a/LibreMetaverse.Types/LibreMetaverse.Types.csproj +++ b/LibreMetaverse.Types/LibreMetaverse.Types.csproj @@ -1,9 +1,9 @@ - + LibreMetaverse.Types LibreMetaverse.Types LibreMetaverse type library - netstandard2.0;netstandard2.1;net5.0 + netstandard2.0;netstandard2.1;net5.0;net6.0 Library LibreMetaverse true diff --git a/LibreMetaverse.Utilities/LibreMetaverse.Utilities.csproj b/LibreMetaverse.Utilities/LibreMetaverse.Utilities.csproj index e7c6489f..b5137570 100644 --- a/LibreMetaverse.Utilities/LibreMetaverse.Utilities.csproj +++ b/LibreMetaverse.Utilities/LibreMetaverse.Utilities.csproj @@ -1,9 +1,9 @@ - + LibreMetaverse.Utilities LibreMetaverse.Utilities LibreMetaverse utility library - netstandard2.0;netstandard2.1;net5.0 + netstandard2.0;netstandard2.1;net5.0;net6.0 Library LibreMetaverse.Utilities true diff --git a/LibreMetaverse.Voice/LibreMetaverse.Voice.csproj b/LibreMetaverse.Voice/LibreMetaverse.Voice.csproj index 5f978daa..f263c4c6 100644 --- a/LibreMetaverse.Voice/LibreMetaverse.Voice.csproj +++ b/LibreMetaverse.Voice/LibreMetaverse.Voice.csproj @@ -1,4 +1,4 @@ - + LibreMetaverse.Voice LibreMetaverse.Voice @@ -9,7 +9,7 @@ true snupkg 0419,1574,1591 - netstandard2.0;netstandard2.1;net5.0 + netstandard2.0;netstandard2.1;net5.0;net6.0 x64;x86;AnyCPU ..\bin\ diff --git a/LibreMetaverse/LibreMetaverse.csproj b/LibreMetaverse/LibreMetaverse.csproj index 8422941d..ef801ed4 100644 --- a/LibreMetaverse/LibreMetaverse.csproj +++ b/LibreMetaverse/LibreMetaverse.csproj @@ -11,7 +11,7 @@ true snupkg 0419,1574,1591 - netstandard2.0;netstandard2.1;net5.0 + netstandard2.0;netstandard2.1;net5.0;net6.0 x64;x86;AnyCPU ..\bin\ diff --git a/PrimMesher/LibreMetaverse.PrimMesher.csproj b/PrimMesher/LibreMetaverse.PrimMesher.csproj index 3e42971f..20e7d806 100644 --- a/PrimMesher/LibreMetaverse.PrimMesher.csproj +++ b/PrimMesher/LibreMetaverse.PrimMesher.csproj @@ -1,10 +1,10 @@ - + LibreMetaverse.PrimMesher LibreMetaverse.PrimMesher LibreMetaverse.PrimMesher Library - netstandard2.0;netstandard2.1;net5.0 + netstandard2.0;netstandard2.1;net5.0;net6.0 Dhalia Trimble, Sjofn LLC, OpenMetaverse Developers true true diff --git a/Programs/Baker/Baker.csproj b/Programs/Baker/Baker.csproj index c8c40e08..ef9d42a1 100644 --- a/Programs/Baker/Baker.csproj +++ b/Programs/Baker/Baker.csproj @@ -1,6 +1,6 @@ - + - net471;net48;netcoreapp3.1;net5.0-windows + net471;net48;netcoreapp3.1;net5.0;net6.0-windows;net6.0-windows netcoreapp3.1 diff --git a/Programs/GridProxy/GridProxy.csproj b/Programs/GridProxy/GridProxy.csproj index de9112d5..2e0e7e7c 100644 --- a/Programs/GridProxy/GridProxy.csproj +++ b/Programs/GridProxy/GridProxy.csproj @@ -1,11 +1,11 @@ - + GridProxy GridProxy Library GridProxy true - netcoreapp3.1;net5.0 + netcoreapp3.1;net5.0;net6.0 x64;x86 ..\..\bin\ false diff --git a/Programs/VoiceTest/VoiceTest.csproj b/Programs/VoiceTest/VoiceTest.csproj index 644935e1..40b40a4c 100644 --- a/Programs/VoiceTest/VoiceTest.csproj +++ b/Programs/VoiceTest/VoiceTest.csproj @@ -1,10 +1,10 @@ - + VoiceTest Exe true ..\..\bin\ - netcoreapp3.1;net5.0 + netcoreapp3.1;net5.0;net6.0 x64;x86;AnyCPU false diff --git a/Programs/examples/GridAccountant/GridAccountant.csproj b/Programs/examples/GridAccountant/GridAccountant.csproj index 1307a2a3..c3488660 100644 --- a/Programs/examples/GridAccountant/GridAccountant.csproj +++ b/Programs/examples/GridAccountant/GridAccountant.csproj @@ -1,6 +1,6 @@ - + - net471;net48;netcoreapp3.1;net5.0-windows + net471;net48;netcoreapp3.1;net5.0;net6.0-windows;net6.0-windows netcoreapp3.1 diff --git a/Programs/examples/IRCGateway/IRCGateway.csproj b/Programs/examples/IRCGateway/IRCGateway.csproj index c1a4cd43..c1c22617 100644 --- a/Programs/examples/IRCGateway/IRCGateway.csproj +++ b/Programs/examples/IRCGateway/IRCGateway.csproj @@ -1,11 +1,11 @@ - + IrcGateway IrcGateway true Exe ..\..\..\bin\ - netcoreapp3.1;net5.0 + netcoreapp3.1;net5.0;net6.0 x64;x86 false diff --git a/Programs/examples/PacketDump/PacketDump.csproj b/Programs/examples/PacketDump/PacketDump.csproj index 379bc26e..309428ee 100644 --- a/Programs/examples/PacketDump/PacketDump.csproj +++ b/Programs/examples/PacketDump/PacketDump.csproj @@ -1,11 +1,11 @@ - + PacketDump PacketDump Exe true ..\..\..\bin\ - netcoreapp3.1;net5.0 + netcoreapp3.1;net5.0;net6.0 AnyCPU true snupkg diff --git a/Programs/examples/TestClient/TestClient.csproj b/Programs/examples/TestClient/TestClient.csproj index 0df1f59f..3819a590 100644 --- a/Programs/examples/TestClient/TestClient.csproj +++ b/Programs/examples/TestClient/TestClient.csproj @@ -4,7 +4,7 @@ Exe true ..\..\..\bin\ - netcoreapp3.1;net5.0 + netcoreapp3.1;net5.0;net6.0 x64;x86 true snupkg diff --git a/Programs/mapgenerator/mapgenerator.csproj b/Programs/mapgenerator/mapgenerator.csproj index b00377f3..06456fbe 100644 --- a/Programs/mapgenerator/mapgenerator.csproj +++ b/Programs/mapgenerator/mapgenerator.csproj @@ -1,11 +1,11 @@ - + MapGenerator Exe true ..\..\bin\ LibreMetaverse.MapGenerator - netcoreapp3.1;net5.0 + netcoreapp3.1;net5.0;net6.0 AnyCPU true snupkg From 4069bae698d5e4a1ebc7101be548b8d0c995e938 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Tue, 12 Apr 2022 21:13:55 +0100 Subject: [PATCH 03/29] Docs: Added a simple installation procedure --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index b5d442cb..e2886482 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,17 @@ compatibility with an eye to performance, multi-threading, and memory management The canonical source for LibreMetaverse can be found at: https://github.com/cinderblocks/libremetaverse +## Simple installation procedure + +(Linux/macOS only) + +- Make sure you have at least `dotnet` installed, with a valid net5.0/net6.0 SDK _and_ runtime available! +- From the root, run `dotnet restore`. You should get some errors regarding missing Windows libraries; that's ok, you can ignore those, they're to be expected since Linux/macOS do _not_ include such libraries. Some test applications are Windows-only. +If all goes well, you should now have all dependent packages properly installed. +- From the root, run `dotnet msbuild`, and enjoy the superfast Roslyn compiler at work 😄 It should finish after a few minutes, depending on the speed of your machine. +- Your binaries will be under `../bin/net5.0` or `../bin/net6.0` (there might be a few more directories under `../bin`), depending on what runtimes you have installed on your system. Make sure you `cd` to the correct directory depending on the runtime you have, and then search for all your binaries there: they should be normal-looking executable files (with the `x` attribute set) and having the name of the appropriate test application (e.g. `TestClient` for the interactive testing tool). +- Unlike OpenSimulator, you don't need to launch the binaries with Mono, they're _directly_ executable; the `dotnet` chain already embeds the small runtime that allows .NET apps to run natively on whatever operating system you've got. + [![LibreMetaverse NuGet-Release](https://img.shields.io/nuget/v/libremetaverse.svg?label=LibreMetaverse)](https://www.nuget.org/packages/LibreMetaverse/) [![NuGet Downloads](https://img.shields.io/nuget/dt/LibreMetaverse?label=NuGet%20downloads)](https://www.nuget.org/packages/LibreMetaverse/) [![Build status](https://ci.appveyor.com/api/projects/status/pga5w0qken2k2nnl?svg=true)](https://ci.appveyor.com/project/cinderblocks57647/libremetaverse-ksbcr) From c28579892251ffe8e7aa06638726aa83af46dfe4 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Wed, 13 Apr 2022 01:22:48 +0100 Subject: [PATCH 04/29] Bumping package version on Directory.Build.props I have no idea if this is the 'approved' workflow or not... --- Directory.Build.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 0ce1c555..2443969d 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 0.10.0.0 + 1.9.20.451-gwyn LibreMetaverse Sjofn LLC, OpenMetaverse Developers Copyright © OpenMetaverse Developers 2008, 2017. Copyright © Sjofn LLC 2018-2022. All rights reserved. @@ -8,7 +8,7 @@ Sjofn LLC - 0.10.0.0 + 1.9.20.451-gwyn logo.png README.md BSD-3-Clause From 455542b91a62bab7650297f4f0e0d2b691f230b7 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Wed, 13 Apr 2022 01:23:22 +0100 Subject: [PATCH 05/29] Fix: deal with 499 and InternalServerError See comments in code. This is where actually the whole code gets fixed! --- .../Capabilities/EventQueueClient.cs | 38 +++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/LibreMetaverse/Capabilities/EventQueueClient.cs b/LibreMetaverse/Capabilities/EventQueueClient.cs index 596db752..ed613d41 100644 --- a/LibreMetaverse/Capabilities/EventQueueClient.cs +++ b/LibreMetaverse/Capabilities/EventQueueClient.cs @@ -132,7 +132,7 @@ namespace OpenMetaverse.Http if (error is WebException webException) { - // Filter out some of the status requests to skip handling + // Filter out some of the status requests to skip handling switch (webException.Status) { case WebExceptionStatus.RequestCanceled: @@ -153,7 +153,13 @@ namespace OpenMetaverse.Http _Running = false; _Dead = true; break; - case (HttpStatusCode)499: // weird error returned occasionally, ignore for now + case (HttpStatusCode)499: // weird error returned occasionally, ignore for now + // I believe this is the timeout error invented by LL for LSL HTTP-out requests (gwyneth 20220413) + Logger.Log("Possible HTTP-out timeout error, no need to continue)", Helpers.LogLevel.Info); + + _Running = false; + _Dead = true; + break; case HttpStatusCode.BadGateway: // This is not good (server) protocol design, but it's normal. // The EventQueue server is a proxy that connects to a Squid @@ -167,14 +173,32 @@ namespace OpenMetaverse.Http // Try to log a meaningful error message if (code != HttpStatusCode.OK) { - Logger.Log($"Unrecognized caps connection problem from {_Address}: {code}", + Logger.Log($"Unrecognized caps connection problem from {_Address}: {code}", Helpers.LogLevel.Warning); } else if (error.InnerException != null) - { - Logger.Log( - $"Unrecognized internal caps exception from {_Address}: {error.InnerException.Message}", - Helpers.LogLevel.Warning); + { + // There is a situation where the InnerException contains + // InternalServerError (the 500 HTTP code) although the + // code _is_ HttpStatusCode.OK. Keeping this open will + // leak memory massively!! + // As per LL's instructions, we ought to consider this a + // 'request to close client' even though it's improperly + // formatted... (gwyneth 202204139) + if (error.InnerException.Message == "InternalServerError") + { + Logger.Log("Grid sent us back an Internal Server Error, but HTTP code was 200, not 500 -- closing connection", + Helpers.LogLevel.Warning); + + _Running = false; + _Dead = true; + break; + } + else + { + Logger.Log($"Unrecognized internal caps exception from {_Address}: {error.InnerException.Message}", + Helpers.LogLevel.Warning); + } } else { From ddc8dc8bc76a4cc5286be06b1e2107caec5b1dca Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Wed, 13 Apr 2022 03:00:09 +0100 Subject: [PATCH 06/29] Fix wrong global search and replace During the process of adding net6.0 and net6.0-windows, I failed to correct these target frameworks. Done, manually. --- LibreMetaverse.GUI/LibreMetaverse.GUI.csproj | 6 +++--- Programs/Baker/Baker.csproj | 6 +++--- Programs/examples/GridAccountant/GridAccountant.csproj | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/LibreMetaverse.GUI/LibreMetaverse.GUI.csproj b/LibreMetaverse.GUI/LibreMetaverse.GUI.csproj index a1db7183..a11f5a4b 100644 --- a/LibreMetaverse.GUI/LibreMetaverse.GUI.csproj +++ b/LibreMetaverse.GUI/LibreMetaverse.GUI.csproj @@ -1,12 +1,12 @@ - net471;net48;netcoreapp3.1;net5.0;net6.0-windows;net6.0-windows + net471;net48;netcoreapp3.1;net5.0;net6.0;net5.0-windows;net6.0-windows - net471;netcoreapp3.1 + net471;netcoreapp3.1;net5.0;net6.0 - net471;netcoreapp3.1 + net471;netcoreapp3.1;net5.0;net6.0 LibreMetaverse.GUI diff --git a/Programs/Baker/Baker.csproj b/Programs/Baker/Baker.csproj index ef9d42a1..1f698f46 100644 --- a/Programs/Baker/Baker.csproj +++ b/Programs/Baker/Baker.csproj @@ -1,12 +1,12 @@ - net471;net48;netcoreapp3.1;net5.0;net6.0-windows;net6.0-windows + net471;net48;netcoreapp3.1;net5.0;net6.0;net5.0-windows;net6.0-windows - netcoreapp3.1 + netcoreapp3.1;net5.0;net6.0 - netcoreapp3.1 + netcoreapp3.1;net5.0;net6.0 Baker diff --git a/Programs/examples/GridAccountant/GridAccountant.csproj b/Programs/examples/GridAccountant/GridAccountant.csproj index c3488660..37a46d5c 100644 --- a/Programs/examples/GridAccountant/GridAccountant.csproj +++ b/Programs/examples/GridAccountant/GridAccountant.csproj @@ -1,12 +1,12 @@ - net471;net48;netcoreapp3.1;net5.0;net6.0-windows;net6.0-windows + net471;net48;netcoreapp3.1;net5.0;net6.0;net5.0-windows;net6.0-windows - netcoreapp3.1 + netcoreapp3.1;net5.0;net6.0 - netcoreapp3.1 + netcoreapp3.1;net5.0;net6.0 GridAccountant From affb8b887d1513d61d9286cea1ee5f045639da74 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Wed, 13 Apr 2022 03:01:51 +0100 Subject: [PATCH 07/29] Feat: new sln for non-Windows builds In order to get successful builds under Linux/macOS, as well as properly packaging, this new solutions file was created. I'll update the instructions shortly. --- LibreMetaverse.ReleaseNoGui.sln | 360 ++++++++++++++++++++++++++++++++ 1 file changed, 360 insertions(+) create mode 100644 LibreMetaverse.ReleaseNoGui.sln diff --git a/LibreMetaverse.ReleaseNoGui.sln b/LibreMetaverse.ReleaseNoGui.sln new file mode 100644 index 00000000..58da55ac --- /dev/null +++ b/LibreMetaverse.ReleaseNoGui.sln @@ -0,0 +1,360 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32002.261 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GridProxy", "Programs\GridProxy\GridProxy.csproj", "{79B51DAA-0000-0000-0000-000000000000}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRCGateway", "Programs\examples\IRCGateway\IRCGateway.csproj", "{89049BBC-0000-0000-0000-000000000000}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse", "LibreMetaverse\LibreMetaverse.csproj", "{27C70F3A-0000-0000-0000-000000000000}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse.Rendering.Meshmerizer", "LibreMetaverse.Rendering.Meshmerizer\LibreMetaverse.Rendering.Meshmerizer.csproj", "{95479B1D-0000-0000-0000-000000000000}" + ProjectSection(ProjectDependencies) = postProject + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6} = {2E2B643F-F18B-4791-BA4B-6E82D0E794B6} + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse.Rendering.Simple", "LibreMetaverse.Rendering.Simple\LibreMetaverse.Rendering.Simple.csproj", "{29E206AC-0000-0000-0000-000000000000}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse.StructuredData", "LibreMetaverse.StructuredData\LibreMetaverse.StructuredData.csproj", "{89D7A3E5-0000-0000-0000-000000000000}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse.Tests", "LibreMetaverse.Tests\LibreMetaverse.Tests.csproj", "{0CCC2C3D-0000-0000-0000-000000000000}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse.Utilities", "LibreMetaverse.Utilities\LibreMetaverse.Utilities.csproj", "{1266CE08-0000-0000-0000-000000000000}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse.Types", "LibreMetaverse.Types\LibreMetaverse.Types.csproj", "{B37B02AD-0000-0000-0000-000000000000}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PacketDump", "Programs\examples\PacketDump\PacketDump.csproj", "{58443010-0000-0000-0000-000000000000}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestClient", "Programs\examples\TestClient\TestClient.csproj", "{9F71FDB3-0000-0000-0000-000000000000}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VoiceTest", "Programs\VoiceTest\VoiceTest.csproj", "{EE4EA934-0000-0000-0000-000000000000}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse.PrimMesher", "PrimMesher\LibreMetaverse.PrimMesher.csproj", "{2E2B643F-F18B-4791-BA4B-6E82D0E794B6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mapgenerator", "Programs\mapgenerator\mapgenerator.csproj", "{2867B4B3-0000-0000-0000-000000000000}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F8CE4DE6-82E5-49D1-BCDF-BB3E63A52867}" + ProjectSection(SolutionItems) = preProject + Directory.Build.props = Directory.Build.props + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "utilities", "utilities", "{6EF29E7F-FC69-4269-BDCF-4780D54E299D}" + ProjectSection(SolutionItems) = preProject + .appveyor.yml = .appveyor.yml + util\InstallRemotePfx.ps1 = util\InstallRemotePfx.ps1 + util\SignPackages.ps1 = util\SignPackages.ps1 + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse.LslTools", "LibreMetaverse.LslTools\LibreMetaverse.LslTools.csproj", "{989E5E15-D99B-4CF1-AF64-90C568FC979A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreMetaverse.Voice", "LibreMetaverse.Voice\LibreMetaverse.Voice.csproj", "{FB07C6DE-F791-4336-B6E2-B32EEAC34792}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + ReleaseNoGui|Any CPU = ReleaseNoGui|Any CPU + ReleaseNoGui|x64 = ReleaseNoGui|x64 + ReleaseNoGui|x86 = ReleaseNoGui|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {79B51DAA-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|x64 + {79B51DAA-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|x64 + {79B51DAA-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 + {79B51DAA-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 + {79B51DAA-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 + {79B51DAA-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 + {79B51DAA-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|x64 + {79B51DAA-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|x64 + {79B51DAA-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 + {79B51DAA-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 + {79B51DAA-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 + {79B51DAA-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 + {79B51DAA-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|x64 + {79B51DAA-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|x64 + {79B51DAA-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 + {79B51DAA-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 + {79B51DAA-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 + {79B51DAA-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 + {89049BBC-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|x64 + {89049BBC-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|x64 + {89049BBC-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 + {89049BBC-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 + {89049BBC-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 + {89049BBC-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 + {89049BBC-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|x64 + {89049BBC-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|x64 + {89049BBC-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 + {89049BBC-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 + {89049BBC-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 + {89049BBC-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 + {89049BBC-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|x64 + {89049BBC-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|x64 + {89049BBC-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 + {89049BBC-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 + {89049BBC-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 + {89049BBC-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 + {27C70F3A-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 + {27C70F3A-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 + {27C70F3A-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|Any CPU + {27C70F3A-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|Any CPU + {95479B1D-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {95479B1D-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {95479B1D-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|Any CPU + {95479B1D-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|Any CPU + {95479B1D-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 + {95479B1D-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 + {95479B1D-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {95479B1D-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {95479B1D-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|Any CPU + {95479B1D-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|Any CPU + {95479B1D-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|Any CPU + {95479B1D-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|Any CPU + {95479B1D-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU + {95479B1D-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU + {95479B1D-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|Any CPU + {95479B1D-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|Any CPU + {95479B1D-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|Any CPU + {95479B1D-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|Any CPU + {29E206AC-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {29E206AC-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {29E206AC-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|Any CPU + {29E206AC-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|Any CPU + {29E206AC-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 + {29E206AC-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 + {29E206AC-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {29E206AC-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {29E206AC-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|Any CPU + {29E206AC-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|Any CPU + {29E206AC-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|Any CPU + {29E206AC-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|Any CPU + {29E206AC-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU + {29E206AC-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU + {29E206AC-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|Any CPU + {29E206AC-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|Any CPU + {29E206AC-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|Any CPU + {29E206AC-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 + {89D7A3E5-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 + {89D7A3E5-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|Any CPU + {89D7A3E5-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|Any CPU + {0CCC2C3D-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0CCC2C3D-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0CCC2C3D-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 + {0CCC2C3D-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 + {0CCC2C3D-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 + {0CCC2C3D-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 + {0CCC2C3D-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0CCC2C3D-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {0CCC2C3D-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 + {0CCC2C3D-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 + {0CCC2C3D-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 + {0CCC2C3D-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 + {0CCC2C3D-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU + {0CCC2C3D-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU + {0CCC2C3D-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 + {0CCC2C3D-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 + {0CCC2C3D-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 + {0CCC2C3D-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 + {1266CE08-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1266CE08-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1266CE08-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|Any CPU + {1266CE08-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|Any CPU + {1266CE08-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 + {1266CE08-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 + {1266CE08-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1266CE08-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {1266CE08-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|Any CPU + {1266CE08-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|Any CPU + {1266CE08-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|Any CPU + {1266CE08-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|Any CPU + {1266CE08-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU + {1266CE08-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU + {1266CE08-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|Any CPU + {1266CE08-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|Any CPU + {1266CE08-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|Any CPU + {1266CE08-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 + {B37B02AD-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 + {B37B02AD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|Any CPU + {B37B02AD-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|Any CPU + {58443010-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58443010-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58443010-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|Any CPU + {58443010-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|Any CPU + {58443010-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 + {58443010-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 + {58443010-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58443010-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {58443010-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|Any CPU + {58443010-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|Any CPU + {58443010-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|Any CPU + {58443010-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|Any CPU + {58443010-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU + {58443010-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU + {58443010-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 + {58443010-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 + {58443010-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|Any CPU + {58443010-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|Any CPU + {9F71FDB3-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|x64 + {9F71FDB3-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|x64 + {9F71FDB3-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 + {9F71FDB3-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 + {9F71FDB3-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 + {9F71FDB3-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 + {9F71FDB3-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|x64 + {9F71FDB3-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|x64 + {9F71FDB3-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 + {9F71FDB3-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 + {9F71FDB3-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 + {9F71FDB3-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 + {9F71FDB3-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|x64 + {9F71FDB3-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|x64 + {9F71FDB3-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 + {9F71FDB3-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 + {9F71FDB3-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 + {9F71FDB3-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 + {EE4EA934-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE4EA934-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE4EA934-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|x64 + {EE4EA934-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|x64 + {EE4EA934-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 + {EE4EA934-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 + {EE4EA934-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE4EA934-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {EE4EA934-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|x64 + {EE4EA934-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|x64 + {EE4EA934-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|x86 + {EE4EA934-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|x86 + {EE4EA934-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU + {EE4EA934-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU + {EE4EA934-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 + {EE4EA934-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 + {EE4EA934-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|x86 + {EE4EA934-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|x86 + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Debug|x64.ActiveCfg = Debug|Any CPU + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Debug|x64.Build.0 = Debug|Any CPU + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Debug|x86.ActiveCfg = Debug|x86 + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Debug|x86.Build.0 = Debug|x86 + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Release|Any CPU.Build.0 = Release|Any CPU + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Release|x64.ActiveCfg = Release|Any CPU + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Release|x64.Build.0 = Release|Any CPU + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Release|x86.ActiveCfg = Release|Any CPU + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.Release|x86.Build.0 = Release|Any CPU + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.ReleaseNoGui|x64.ActiveCfg = Release|Any CPU + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.ReleaseNoGui|x64.Build.0 = Release|Any CPU + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.ReleaseNoGui|x86.ActiveCfg = Release|Any CPU + {2E2B643F-F18B-4791-BA4B-6E82D0E794B6}.ReleaseNoGui|x86.Build.0 = Release|Any CPU + {2867B4B3-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2867B4B3-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2867B4B3-0000-0000-0000-000000000000}.Debug|x64.ActiveCfg = Debug|Any CPU + {2867B4B3-0000-0000-0000-000000000000}.Debug|x64.Build.0 = Debug|Any CPU + {2867B4B3-0000-0000-0000-000000000000}.Debug|x86.ActiveCfg = Debug|x86 + {2867B4B3-0000-0000-0000-000000000000}.Debug|x86.Build.0 = Debug|x86 + {2867B4B3-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2867B4B3-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU + {2867B4B3-0000-0000-0000-000000000000}.Release|x64.ActiveCfg = Release|Any CPU + {2867B4B3-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|Any CPU + {2867B4B3-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|Any CPU + {2867B4B3-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|Any CPU + {2867B4B3-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU + {2867B4B3-0000-0000-0000-000000000000}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU + {2867B4B3-0000-0000-0000-000000000000}.ReleaseNoGui|x64.ActiveCfg = Release|x64 + {2867B4B3-0000-0000-0000-000000000000}.ReleaseNoGui|x64.Build.0 = Release|x64 + {2867B4B3-0000-0000-0000-000000000000}.ReleaseNoGui|x86.ActiveCfg = Release|Any CPU + {2867B4B3-0000-0000-0000-000000000000}.ReleaseNoGui|x86.Build.0 = Release|Any CPU + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.Debug|x64.ActiveCfg = Debug|Any CPU + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.Debug|x64.Build.0 = Debug|Any CPU + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.Debug|x86.ActiveCfg = Debug|x86 + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.Debug|x86.Build.0 = Debug|x86 + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.Release|Any CPU.Build.0 = Release|Any CPU + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.Release|x64.ActiveCfg = Release|Any CPU + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.Release|x64.Build.0 = Release|Any CPU + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.Release|x86.ActiveCfg = Release|Any CPU + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.Release|x86.Build.0 = Release|Any CPU + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.ReleaseNoGui|x64.ActiveCfg = Release|Any CPU + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.ReleaseNoGui|x64.Build.0 = Release|Any CPU + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.ReleaseNoGui|x86.ActiveCfg = Release|Any CPU + {989E5E15-D99B-4CF1-AF64-90C568FC979A}.ReleaseNoGui|x86.Build.0 = Release|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.Debug|x64.ActiveCfg = Debug|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.Debug|x64.Build.0 = Debug|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.Debug|x86.ActiveCfg = Debug|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.Debug|x86.Build.0 = Debug|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.Release|Any CPU.Build.0 = Release|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.Release|x64.ActiveCfg = Release|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.Release|x64.Build.0 = Release|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.Release|x86.ActiveCfg = Release|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.Release|x86.Build.0 = Release|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.ReleaseNoGui|Any CPU.ActiveCfg = Release|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.ReleaseNoGui|Any CPU.Build.0 = Release|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.ReleaseNoGui|x64.ActiveCfg = Release|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.ReleaseNoGui|x64.Build.0 = Release|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.ReleaseNoGui|x86.ActiveCfg = Release|Any CPU + {FB07C6DE-F791-4336-B6E2-B32EEAC34792}.ReleaseNoGui|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {39A7E333-AFC1-4BA8-9EBC-9298791FDC78} + EndGlobalSection +EndGlobal From c18fc46445e7691698ede1eaedb81214fbdf8598 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Wed, 13 Apr 2022 12:26:22 +0100 Subject: [PATCH 08/29] Docs: informing about different compilation modes A `LibreMetaverse.ReleaseNoGUI.sln` was included at the root to allow Linux/macOS compilations to succeed, without worrying about the GUI apps. To-do: create a more complex dependency logic so that Windows users automatically get the GUI apps compiled by default, while these are skipped under macOS/Linux. Currently, you need to explicitly use a different solution file. Also: added information regarding upcoming obsolescence of .NET 5.0 --- README.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e2886482..8f3b0f83 100644 --- a/README.md +++ b/README.md @@ -16,15 +16,28 @@ https://github.com/cinderblocks/libremetaverse ## Simple installation procedure -(Linux/macOS only) +### Linux/macOS - Make sure you have at least `dotnet` installed, with a valid net5.0/net6.0 SDK _and_ runtime available! -- From the root, run `dotnet restore`. You should get some errors regarding missing Windows libraries; that's ok, you can ignore those, they're to be expected since Linux/macOS do _not_ include such libraries. Some test applications are Windows-only. +- This update includes a solution file to skip the GUI applications (which will run only under Windows anyway). Use `LibreMetaverse.ReleaseNoGUI.sln` instead +- From the root, run `dotnet restore LibreMetaverse.ReleaseNoGUI.sln`. You should get some errors regarding missing Windows libraries; that's ok, you can ignore those, they're to be expected since Linux/macOS do _not_ include such libraries. Some test applications are Windows-only. If all goes well, you should now have all dependent packages properly installed. -- From the root, run `dotnet msbuild`, and enjoy the superfast Roslyn compiler at work 😄 It should finish after a few minutes, depending on the speed of your machine. +- From the root, run `dotnet msbuild LibreMetaverse.ReleaseNoGUI.sln`, and enjoy the superfast Roslyn compiler at work 😄 It should finish after a few minutes, depending on the speed of your machine. - Your binaries will be under `../bin/net5.0` or `../bin/net6.0` (there might be a few more directories under `../bin`), depending on what runtimes you have installed on your system. Make sure you `cd` to the correct directory depending on the runtime you have, and then search for all your binaries there: they should be normal-looking executable files (with the `x` attribute set) and having the name of the appropriate test application (e.g. `TestClient` for the interactive testing tool). - Unlike OpenSimulator, you don't need to launch the binaries with Mono, they're _directly_ executable; the `dotnet` chain already embeds the small runtime that allows .NET apps to run natively on whatever operating system you've got. +### Windows + +For Windows, you should use the default `LibreMetaverse.sln`, just as before (untested). For command-line compilation under Windows, if you wish to skip the GUI applications, the instructions are the same as above. Use the default `LibreMetaverse.sln` if you wish to install those as well. + +### GUI support under Linux/macOS + +Currently unavailable, although there are some reports that this might be possible using a Windows emulator, such as Mono itself, or possibly Wine. This will require some project configuration changes, and was _not_ tested! + +## Note: end-of-life support for .NET 5.0 + +Microsoft is [dropping support for .NET 5.0](https://devblogs.microsoft.com/dotnet/dotnet-5-end-of-support-update/) as of May 2022, so you should consider using .NET 6.0 instead (or, if you're wild, you can test the prerelease of .NET 7.0). The code runs flawlessly on .NET 6.0 as well (Windows GUI version untested) + [![LibreMetaverse NuGet-Release](https://img.shields.io/nuget/v/libremetaverse.svg?label=LibreMetaverse)](https://www.nuget.org/packages/LibreMetaverse/) [![NuGet Downloads](https://img.shields.io/nuget/dt/LibreMetaverse?label=NuGet%20downloads)](https://www.nuget.org/packages/LibreMetaverse/) [![Build status](https://ci.appveyor.com/api/projects/status/pga5w0qken2k2nnl?svg=true)](https://ci.appveyor.com/project/cinderblocks57647/libremetaverse-ksbcr) From 7130620f27500cd8da06522ec4acafca880f6bee Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Wed, 13 Apr 2022 12:35:37 +0100 Subject: [PATCH 09/29] Chore: bumping SDK version --- global.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global.json b/global.json index ef236746..4253be01 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "5.0.101", + "version": "6.0.202", "rollForward": "latestMajor" } } \ No newline at end of file From a28014bc299bd3477a336981a708969e94731e4e Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Thu, 14 Apr 2022 16:29:40 +0100 Subject: [PATCH 10/29] Fix: handling HttpStatusCode.InternalServerError After all, it seems that all that was needed was to properly process HttpStatusCode.InternalServerError ... --- Directory.Build.props | 4 +- .../Capabilities/EventQueueClient.cs | 75 +++++++++++++------ 2 files changed, 54 insertions(+), 25 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 2443969d..63bd7e7e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 1.9.20.451-gwyn + 1.9.20.453-gwyn LibreMetaverse Sjofn LLC, OpenMetaverse Developers Copyright © OpenMetaverse Developers 2008, 2017. Copyright © Sjofn LLC 2018-2022. All rights reserved. @@ -8,7 +8,7 @@ Sjofn LLC - 1.9.20.451-gwyn + 1.9.20.453-gwyn logo.png README.md BSD-3-Clause diff --git a/LibreMetaverse/Capabilities/EventQueueClient.cs b/LibreMetaverse/Capabilities/EventQueueClient.cs index ed613d41..587c594c 100644 --- a/LibreMetaverse/Capabilities/EventQueueClient.cs +++ b/LibreMetaverse/Capabilities/EventQueueClient.cs @@ -24,7 +24,8 @@ * POSSIBILITY OF SUCH DAMAGE. */ -using System; +using System; +using System.Collections; using System.Net; using System.Threading; using OpenMetaverse.StructuredData; @@ -155,7 +156,37 @@ namespace OpenMetaverse.Http break; case (HttpStatusCode)499: // weird error returned occasionally, ignore for now // I believe this is the timeout error invented by LL for LSL HTTP-out requests (gwyneth 20220413) - Logger.Log("Possible HTTP-out timeout error, no need to continue)", Helpers.LogLevel.Info); + Logger.Log($"Possible HTTP-out timeout error from {_Address}, no need to continue", Helpers.LogLevel.Debug); + + _Running = false; + _Dead = true; + break; + case HttpStatusCode.InternalServerError: + // As per LL's instructions, we ought to consider this a + // 'request to close client' (gwyneth 20220413) + Logger.Log($"Grid sent a {code} at {_Address}, closing connection", Helpers.LogLevel.Debug); + + // ... but do we happen to have an InnerException? Log it! + if (error.InnerException != null) + { + // unravel the whole inner error message, so we finally figure out what it is! + // (gwyneth 20220414) + Logger.Log($"Unrecognized internal caps exception from {_Address}: '{error.InnerException.Message}'", Helpers.LogLevel.Warning); + Logger.Log("\nMessage ---\n{error.Message}", Helpers.LogLevel.Warning); + Logger.Log("\nHelpLink ---\n{ex.HelpLink}", Helpers.LogLevel.Warning); + Logger.Log("\nSource ---\n{error.Source}", Helpers.LogLevel.Warning); + Logger.Log("\nStackTrace ---\n{error.StackTrace}", Helpers.LogLevel.Warning); + Logger.Log("\nTargetSite ---\n{error.TargetSite}", Helpers.LogLevel.Warning); + if (error.Data.Count > 0) + { + Logger.Log(" Extra details:", Helpers.LogLevel.Warning); + foreach (DictionaryEntry de in error.Data) + Logger.Log(String.Format(" Key: {0,-20} Value: {1}", + "'" + de.Key.ToString() + "'", de.Value), + Helpers.LogLevel.Warning); + } + // but we'll nevertheless close this connection (gwyneth 20220414) + } _Running = false; _Dead = true; @@ -165,7 +196,11 @@ namespace OpenMetaverse.Http // The EventQueue server is a proxy that connects to a Squid // cache which will time out periodically. The EventQueue server // interprets this as a generic error and returns a 502 to us - // that we ignore + // that we ignore + // + // Note: if this condition persists, it _might_ be the grid trying to request + // that the client closes the connection, as per LL's specs (gwyneth 20220414) + Logger.Log($"Grid sent a Bad Gateway Error at {_Address}; probably a time-out from the grid's EventQueue server (normal) -- ignoring and continuing", Helpers.LogLevel.Debug); break; default: ++_errorCount; @@ -178,26 +213,20 @@ namespace OpenMetaverse.Http } else if (error.InnerException != null) { - // There is a situation where the InnerException contains - // InternalServerError (the 500 HTTP code) although the - // code _is_ HttpStatusCode.OK. Keeping this open will - // leak memory massively!! - // As per LL's instructions, we ought to consider this a - // 'request to close client' even though it's improperly - // formatted... (gwyneth 202204139) - if (error.InnerException.Message == "InternalServerError") + // see comment above (gwyneth 20220414) + Logger.Log($"Unrecognized internal caps exception from {_Address}: '{error.InnerException.Message}'", Helpers.LogLevel.Warning); + Logger.Log("\nMessage ---\n{error.Message}", Helpers.LogLevel.Warning); + Logger.Log("\nHelpLink ---\n{ex.HelpLink}", Helpers.LogLevel.Warning); + Logger.Log("\nSource ---\n{error.Source}", Helpers.LogLevel.Warning); + Logger.Log("\nStackTrace ---\n{error.StackTrace}", Helpers.LogLevel.Warning); + Logger.Log("\nTargetSite ---\n{error.TargetSite}", Helpers.LogLevel.Warning); + if (error.Data.Count > 0) { - Logger.Log("Grid sent us back an Internal Server Error, but HTTP code was 200, not 500 -- closing connection", - Helpers.LogLevel.Warning); - - _Running = false; - _Dead = true; - break; - } - else - { - Logger.Log($"Unrecognized internal caps exception from {_Address}: {error.InnerException.Message}", - Helpers.LogLevel.Warning); + Logger.Log(" Extra details:", Helpers.LogLevel.Warning); + foreach (DictionaryEntry de in error.Data) + Logger.Log(String.Format(" Key: {0,-20} Value: {1}", + "'" + de.Key.ToString() + "'", de.Value), + Helpers.LogLevel.Warning); } } else @@ -206,7 +235,7 @@ namespace OpenMetaverse.Http Helpers.LogLevel.Warning); } break; - } + } // end switch #endregion Error handling } From b2991324df38a20b146e019717701accbfc83053 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Thu, 14 Apr 2022 16:39:52 +0100 Subject: [PATCH 11/29] Style: fixing lack of CRLF and wrong spacing That's the great thing about having tools that autpmate these chores! --- .editorconfig | 5 +- Directory.Build.props | 44 +++---- .../Capabilities/EventQueueClient.cs | 118 +++++++++--------- 3 files changed, 84 insertions(+), 83 deletions(-) diff --git a/.editorconfig b/.editorconfig index 3adc7245..93790e1f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,13 +1,14 @@ # top-most EditorConfig file root = true -# Unix-style newlines with a newline ending every file +# Windows-style newlines with a newline ending every file +# Tab width seems to be 4 spaces, not 2 [*] end_of_line = lf charset = utf-8 indent_style = tab indent_size = tab -tab_width = 2 +tab_width = 4 trim_trailing_whitespace = true # The property below is not yet universally supported diff --git a/Directory.Build.props b/Directory.Build.props index 63bd7e7e..5f1c6dba 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,22 +1,22 @@ - - - 1.9.20.453-gwyn - LibreMetaverse - Sjofn LLC, OpenMetaverse Developers - Copyright © OpenMetaverse Developers 2008, 2017. Copyright © Sjofn LLC 2018-2022. All rights reserved. - LibreMetaverse is a trademark of Sjofn LLC. - Sjofn LLC - - - 1.9.20.453-gwyn - logo.png - README.md - BSD-3-Clause - https://github.com/cinderblocks/libremetaverse - false - LMV OMV OpenMetaverse OpenSim Halcyon OpenMetaverseFoundation VirtualWorld VirtualReality 3D Radegast MEGAbolt SecondLife - https://github.com/cinderblocks/libremetaverse - git - master - - + + + 1.9.20.453-gwyn + LibreMetaverse + Sjofn LLC, OpenMetaverse Developers + Copyright © OpenMetaverse Developers 2008, 2017. Copyright © Sjofn LLC 2018-2022. All rights reserved. + LibreMetaverse is a trademark of Sjofn LLC. + Sjofn LLC + + + 1.9.20.453-gwyn + logo.png + README.md + BSD-3-Clause + https://github.com/cinderblocks/libremetaverse + false + LMV OMV OpenMetaverse OpenSim Halcyon OpenMetaverseFoundation VirtualWorld VirtualReality 3D Radegast MEGAbolt SecondLife + https://github.com/cinderblocks/libremetaverse + git + master + + diff --git a/LibreMetaverse/Capabilities/EventQueueClient.cs b/LibreMetaverse/Capabilities/EventQueueClient.cs index 587c594c..3b58c652 100644 --- a/LibreMetaverse/Capabilities/EventQueueClient.cs +++ b/LibreMetaverse/Capabilities/EventQueueClient.cs @@ -24,7 +24,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ -using System; +using System; using System.Collections; using System.Net; using System.Threading; @@ -154,53 +154,53 @@ namespace OpenMetaverse.Http _Running = false; _Dead = true; break; - case (HttpStatusCode)499: // weird error returned occasionally, ignore for now - // I believe this is the timeout error invented by LL for LSL HTTP-out requests (gwyneth 20220413) - Logger.Log($"Possible HTTP-out timeout error from {_Address}, no need to continue", Helpers.LogLevel.Debug); - - _Running = false; - _Dead = true; - break; - case HttpStatusCode.InternalServerError: - // As per LL's instructions, we ought to consider this a - // 'request to close client' (gwyneth 20220413) - Logger.Log($"Grid sent a {code} at {_Address}, closing connection", Helpers.LogLevel.Debug); - - // ... but do we happen to have an InnerException? Log it! - if (error.InnerException != null) - { - // unravel the whole inner error message, so we finally figure out what it is! - // (gwyneth 20220414) - Logger.Log($"Unrecognized internal caps exception from {_Address}: '{error.InnerException.Message}'", Helpers.LogLevel.Warning); - Logger.Log("\nMessage ---\n{error.Message}", Helpers.LogLevel.Warning); - Logger.Log("\nHelpLink ---\n{ex.HelpLink}", Helpers.LogLevel.Warning); - Logger.Log("\nSource ---\n{error.Source}", Helpers.LogLevel.Warning); - Logger.Log("\nStackTrace ---\n{error.StackTrace}", Helpers.LogLevel.Warning); - Logger.Log("\nTargetSite ---\n{error.TargetSite}", Helpers.LogLevel.Warning); - if (error.Data.Count > 0) - { - Logger.Log(" Extra details:", Helpers.LogLevel.Warning); - foreach (DictionaryEntry de in error.Data) - Logger.Log(String.Format(" Key: {0,-20} Value: {1}", - "'" + de.Key.ToString() + "'", de.Value), - Helpers.LogLevel.Warning); - } - // but we'll nevertheless close this connection (gwyneth 20220414) - } - - _Running = false; - _Dead = true; - break; + case (HttpStatusCode)499: // weird error returned occasionally, ignore for now + // I believe this is the timeout error invented by LL for LSL HTTP-out requests (gwyneth 20220413) + Logger.Log($"Possible HTTP-out timeout error from {_Address}, no need to continue", Helpers.LogLevel.Debug); + + _Running = false; + _Dead = true; + break; + case HttpStatusCode.InternalServerError: + // As per LL's instructions, we ought to consider this a + // 'request to close client' (gwyneth 20220413) + Logger.Log($"Grid sent a {code} at {_Address}, closing connection", Helpers.LogLevel.Debug); + + // ... but do we happen to have an InnerException? Log it! + if (error.InnerException != null) + { + // unravel the whole inner error message, so we finally figure out what it is! + // (gwyneth 20220414) + Logger.Log($"Unrecognized internal caps exception from {_Address}: '{error.InnerException.Message}'", Helpers.LogLevel.Warning); + Logger.Log("\nMessage ---\n{error.Message}", Helpers.LogLevel.Warning); + Logger.Log("\nHelpLink ---\n{ex.HelpLink}", Helpers.LogLevel.Warning); + Logger.Log("\nSource ---\n{error.Source}", Helpers.LogLevel.Warning); + Logger.Log("\nStackTrace ---\n{error.StackTrace}", Helpers.LogLevel.Warning); + Logger.Log("\nTargetSite ---\n{error.TargetSite}", Helpers.LogLevel.Warning); + if (error.Data.Count > 0) + { + Logger.Log(" Extra details:", Helpers.LogLevel.Warning); + foreach (DictionaryEntry de in error.Data) + Logger.Log(String.Format(" Key: {0,-20} Value: {1}", + "'" + de.Key.ToString() + "'", de.Value), + Helpers.LogLevel.Warning); + } + // but we'll nevertheless close this connection (gwyneth 20220414) + } + + _Running = false; + _Dead = true; + break; case HttpStatusCode.BadGateway: // This is not good (server) protocol design, but it's normal. // The EventQueue server is a proxy that connects to a Squid // cache which will time out periodically. The EventQueue server // interprets this as a generic error and returns a 502 to us - // that we ignore - // - // Note: if this condition persists, it _might_ be the grid trying to request - // that the client closes the connection, as per LL's specs (gwyneth 20220414) - Logger.Log($"Grid sent a Bad Gateway Error at {_Address}; probably a time-out from the grid's EventQueue server (normal) -- ignoring and continuing", Helpers.LogLevel.Debug); + // that we ignore + // + // Note: if this condition persists, it _might_ be the grid trying to request + // that the client closes the connection, as per LL's specs (gwyneth 20220414) + Logger.Log($"Grid sent a Bad Gateway Error at {_Address}; probably a time-out from the grid's EventQueue server (normal) -- ignoring and continuing", Helpers.LogLevel.Debug); break; default: ++_errorCount; @@ -212,22 +212,22 @@ namespace OpenMetaverse.Http Helpers.LogLevel.Warning); } else if (error.InnerException != null) - { - // see comment above (gwyneth 20220414) - Logger.Log($"Unrecognized internal caps exception from {_Address}: '{error.InnerException.Message}'", Helpers.LogLevel.Warning); - Logger.Log("\nMessage ---\n{error.Message}", Helpers.LogLevel.Warning); - Logger.Log("\nHelpLink ---\n{ex.HelpLink}", Helpers.LogLevel.Warning); - Logger.Log("\nSource ---\n{error.Source}", Helpers.LogLevel.Warning); - Logger.Log("\nStackTrace ---\n{error.StackTrace}", Helpers.LogLevel.Warning); - Logger.Log("\nTargetSite ---\n{error.TargetSite}", Helpers.LogLevel.Warning); - if (error.Data.Count > 0) - { - Logger.Log(" Extra details:", Helpers.LogLevel.Warning); - foreach (DictionaryEntry de in error.Data) - Logger.Log(String.Format(" Key: {0,-20} Value: {1}", - "'" + de.Key.ToString() + "'", de.Value), - Helpers.LogLevel.Warning); - } + { + // see comment above (gwyneth 20220414) + Logger.Log($"Unrecognized internal caps exception from {_Address}: '{error.InnerException.Message}'", Helpers.LogLevel.Warning); + Logger.Log("\nMessage ---\n{error.Message}", Helpers.LogLevel.Warning); + Logger.Log("\nHelpLink ---\n{ex.HelpLink}", Helpers.LogLevel.Warning); + Logger.Log("\nSource ---\n{error.Source}", Helpers.LogLevel.Warning); + Logger.Log("\nStackTrace ---\n{error.StackTrace}", Helpers.LogLevel.Warning); + Logger.Log("\nTargetSite ---\n{error.TargetSite}", Helpers.LogLevel.Warning); + if (error.Data.Count > 0) + { + Logger.Log(" Extra details:", Helpers.LogLevel.Warning); + foreach (DictionaryEntry de in error.Data) + Logger.Log(String.Format(" Key: {0,-20} Value: {1}", + "'" + de.Key.ToString() + "'", de.Value), + Helpers.LogLevel.Warning); + } } else { From 11c291728b9043f3fa3ee41beccdba3761bff69d Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Fri, 15 Apr 2022 18:22:05 +0100 Subject: [PATCH 12/29] Style: ToString() redundant here Detected by Appveyor --- LibreMetaverse/Capabilities/EventQueueClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LibreMetaverse/Capabilities/EventQueueClient.cs b/LibreMetaverse/Capabilities/EventQueueClient.cs index 3b58c652..35abdf16 100644 --- a/LibreMetaverse/Capabilities/EventQueueClient.cs +++ b/LibreMetaverse/Capabilities/EventQueueClient.cs @@ -225,7 +225,7 @@ namespace OpenMetaverse.Http Logger.Log(" Extra details:", Helpers.LogLevel.Warning); foreach (DictionaryEntry de in error.Data) Logger.Log(String.Format(" Key: {0,-20} Value: {1}", - "'" + de.Key.ToString() + "'", de.Value), + "'" + de.Key + "'", de.Value), Helpers.LogLevel.Warning); } } From 4cc1e04e305d4d741d104ea563313ce4ddec94d1 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Fri, 15 Apr 2022 18:22:59 +0100 Subject: [PATCH 13/29] Style: no commented code Appveyor dislikes commented-out code. Also fixed some extra whitespace. --- LibreMetaverse/InternalDictionary.cs | 3 +-- LibreMetaverse/ObservableDictionary.cs | 7 +++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/LibreMetaverse/InternalDictionary.cs b/LibreMetaverse/InternalDictionary.cs index 1679151c..144a11f4 100644 --- a/LibreMetaverse/InternalDictionary.cs +++ b/LibreMetaverse/InternalDictionary.cs @@ -300,8 +300,7 @@ namespace OpenMetaverse internal void Add(TKey key, TValue value) { lock (Dictionary) -// Dictionary.Add(key, value); - Dictionary[key] = value; + Dictionary[key] = value; } /// diff --git a/LibreMetaverse/ObservableDictionary.cs b/LibreMetaverse/ObservableDictionary.cs index 645a39d1..ec4e2c8f 100644 --- a/LibreMetaverse/ObservableDictionary.cs +++ b/LibreMetaverse/ObservableDictionary.cs @@ -268,7 +268,7 @@ namespace OpenMetaverse /// if found, otherwise public bool ContainsKey(TKey key) { - return Dictionary.ContainsKey(key); + return Dictionary.ContainsKey(key); } /// Check if Value exists in Dictionary @@ -276,7 +276,7 @@ namespace OpenMetaverse /// if found, otherwise public bool ContainsValue(TValue value) { - return Dictionary.ContainsValue(value); + return Dictionary.ContainsValue(value); } /// @@ -287,8 +287,7 @@ namespace OpenMetaverse /// The value public void Add(TKey key, TValue value) { - // Dictionary.Add(key, value); - Dictionary[key] = value; + Dictionary[key] = value; FireChangeEvent(DictionaryEventAction.Add, new DictionaryEntry(key, value)); } From 5de2aea81325907e551d641e0bb7f7d74e98ab39 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Fri, 15 Apr 2022 18:24:03 +0100 Subject: [PATCH 14/29] Style: using remark to reformat Appveyor uses `remark` to throw a few warnings about lack of consistency when writing Markdown text; this README.md is now rewritten according to `remark`'s guidelines. --- README.md | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 8f3b0f83..77f95082 100644 --- a/README.md +++ b/README.md @@ -14,27 +14,32 @@ compatibility with an eye to performance, multi-threading, and memory management The canonical source for LibreMetaverse can be found at: https://github.com/cinderblocks/libremetaverse -## Simple installation procedure +# Simple installation procedure -### Linux/macOS +## Linux/macOS -- Make sure you have at least `dotnet` installed, with a valid net5.0/net6.0 SDK _and_ runtime available! -- This update includes a solution file to skip the GUI applications (which will run only under Windows anyway). Use `LibreMetaverse.ReleaseNoGUI.sln` instead -- From the root, run `dotnet restore LibreMetaverse.ReleaseNoGUI.sln`. You should get some errors regarding missing Windows libraries; that's ok, you can ignore those, they're to be expected since Linux/macOS do _not_ include such libraries. Some test applications are Windows-only. +- Make sure you have at least `dotnet` installed, with a valid net5.0/net6.0 SDK _and_ runtime available! + +- This update includes a solution file to skip the GUI applications (which will run only under Windows anyway). Use `LibreMetaverse.ReleaseNoGUI.sln` instead + +- From the root, run `dotnet restore LibreMetaverse.ReleaseNoGUI.sln`. You should get some errors regarding missing Windows libraries; that's ok, you can ignore those, they're to be expected since Linux/macOS do _not_ include such libraries. Some test applications are Windows-only. If all goes well, you should now have all dependent packages properly installed. -- From the root, run `dotnet msbuild LibreMetaverse.ReleaseNoGUI.sln`, and enjoy the superfast Roslyn compiler at work 😄 It should finish after a few minutes, depending on the speed of your machine. -- Your binaries will be under `../bin/net5.0` or `../bin/net6.0` (there might be a few more directories under `../bin`), depending on what runtimes you have installed on your system. Make sure you `cd` to the correct directory depending on the runtime you have, and then search for all your binaries there: they should be normal-looking executable files (with the `x` attribute set) and having the name of the appropriate test application (e.g. `TestClient` for the interactive testing tool). -- Unlike OpenSimulator, you don't need to launch the binaries with Mono, they're _directly_ executable; the `dotnet` chain already embeds the small runtime that allows .NET apps to run natively on whatever operating system you've got. -### Windows +- From the root, run `dotnet msbuild LibreMetaverse.ReleaseNoGUI.sln`, and enjoy the superfast Roslyn compiler at work 😄 It should finish after a few minutes, depending on the speed of your machine. + +- Your binaries will be under `../bin/net5.0` or `../bin/net6.0` (there might be a few more directories under `../bin`), depending on what runtimes you have installed on your system. Make sure you `cd` to the correct directory depending on the runtime you have, and then search for all your binaries there: they should be normal-looking executable files (with the `x` attribute set) and having the name of the appropriate test application (e.g. `TestClient` for the interactive testing tool). + +- Unlike OpenSimulator, you don't need to launch the binaries with Mono, they're _directly_ executable; the `dotnet` chain already embeds the small runtime that allows .NET apps to run natively on whatever operating system you've got. + +## Windows For Windows, you should use the default `LibreMetaverse.sln`, just as before (untested). For command-line compilation under Windows, if you wish to skip the GUI applications, the instructions are the same as above. Use the default `LibreMetaverse.sln` if you wish to install those as well. -### GUI support under Linux/macOS +## GUI support under Linux/macOS Currently unavailable, although there are some reports that this might be possible using a Windows emulator, such as Mono itself, or possibly Wine. This will require some project configuration changes, and was _not_ tested! -## Note: end-of-life support for .NET 5.0 +# Note: end-of-life support for .NET 5.0 Microsoft is [dropping support for .NET 5.0](https://devblogs.microsoft.com/dotnet/dotnet-5-end-of-support-update/) as of May 2022, so you should consider using .NET 6.0 instead (or, if you're wild, you can test the prerelease of .NET 7.0). The code runs flawlessly on .NET 6.0 as well (Windows GUI version untested) From bb377928fe9b239548008dc4848d806013d48485 Mon Sep 17 00:00:00 2001 From: Alex McArdle Date: Sun, 17 Apr 2022 21:52:26 -0500 Subject: [PATCH 15/29] Update codeql-analysis.yml --- .github/workflows/codeql-analysis.yml | 42 +++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 09743197..8c905d85 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -52,8 +52,8 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v1 + # - name: Autobuild + # uses: github/codeql-action/autobuild@v1 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -62,9 +62,41 @@ jobs: # and modify them (or add more) to build your code if your project # uses a compiled language - #- run: | - # make bootstrap - # make release + - name: Build cross-platform projects + run: | + dotnet build PrimMesher/LibreMetaverse.PrimMesher.csproj + dotnet build LibreMetaverse.LslTools/LibreMetaverse.LslTools.csproj + dotnet build LibreMetaverse.Types/LibreMetaverse.Types.csproj + dotnet build LibreMetaverse.StructuredData/LibreMetaverse.StructuredData.csproj + dotnet build LibreMetaverse/LibreMetaverse.csproj + dotnet build LibreMetaverse.Rendering.Simple/LibreMetaverse.Rendering.Simple.csproj + dotnet build LibreMetaverse.Rendering.Meshmerizer/LibreMetaverse.Rendering.Meshmerizer.csproj + dotnet build LibreMetaverse.Voice/LibreMetaverse.Voice.csproj + dotnet build LibreMetaverse.Utilities/LibreMetaverse.Utilities.csproj + + - name: Build cross-platform example projects + run: | + dotnet build Programs/examples/IRCGateway/IRCGateway.csproj + dotnet build Programs/examples/PacketDump/PacketDump.csproj + dotnet build Programs/examples/TestClient/TestClient.csproj + dotnet build Programs/mapgenerator/mapgenerator.csproj + dotnet build Programs/VoiceTest/VoiceTest.csproj + # These GUI projects fail to build. Disabled for now. + # - name: Build GUI projects + # run: | + # dotnet build LibreMetaverse.GUI/LibreMetaverse.GUI.csproj + # dotnet build Programs/Baker/Baker.csproj + # dotnet build Programs/examples/Dashboard/Dashboard.csproj + # dotnet build Programs/examples/GridAccountant/GridAccountant.csproj + # dotnet build Programs/examples/groupmanager/groupmanager.csproj + # dotnet build Programs/examples/Heightmap/Heightmap.csproj + + # These projects also have issues. + # - name: Build GridProxy projects + # run: | + # dotnet build Programs/GridProxy/GridProxy.csproj + # dotnet build Programs/GridProxy/GridProxyApp.csproj + - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v1 From a333663200f0cea38421a854525043c53fdb650c Mon Sep 17 00:00:00 2001 From: Alex McArdle Date: Sun, 17 Apr 2022 23:45:20 -0500 Subject: [PATCH 16/29] Fix platform targets for GUI projects. --- LibreMetaverse.GUI/LibreMetaverse.GUI.csproj | 6 +++--- Programs/Baker/Baker.csproj | 6 +++--- Programs/examples/GridAccountant/GridAccountant.csproj | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/LibreMetaverse.GUI/LibreMetaverse.GUI.csproj b/LibreMetaverse.GUI/LibreMetaverse.GUI.csproj index a11f5a4b..b3995295 100644 --- a/LibreMetaverse.GUI/LibreMetaverse.GUI.csproj +++ b/LibreMetaverse.GUI/LibreMetaverse.GUI.csproj @@ -1,12 +1,12 @@ - net471;net48;netcoreapp3.1;net5.0;net6.0;net5.0-windows;net6.0-windows + net471;net48;netcoreapp3.1;net5.0-windows;net6.0-windows - net471;netcoreapp3.1;net5.0;net6.0 + net471;netcoreapp3.1;net5.0-linux;net6.0-linux - net471;netcoreapp3.1;net5.0;net6.0 + net471;netcoreapp3.1;net5.0-linux;net6.0-linux LibreMetaverse.GUI diff --git a/Programs/Baker/Baker.csproj b/Programs/Baker/Baker.csproj index 1f698f46..452e95c1 100644 --- a/Programs/Baker/Baker.csproj +++ b/Programs/Baker/Baker.csproj @@ -1,12 +1,12 @@ - net471;net48;netcoreapp3.1;net5.0;net6.0;net5.0-windows;net6.0-windows + net471;net48;netcoreapp3.1;net5.0-windows;net6.0-windows - netcoreapp3.1;net5.0;net6.0 + net471;netcoreapp3.1;net5.0-linux;net6.0-linux - netcoreapp3.1;net5.0;net6.0 + net471;netcoreapp3.1;net5.0-osx;net6.0-osx Baker diff --git a/Programs/examples/GridAccountant/GridAccountant.csproj b/Programs/examples/GridAccountant/GridAccountant.csproj index 37a46d5c..f43f18c3 100644 --- a/Programs/examples/GridAccountant/GridAccountant.csproj +++ b/Programs/examples/GridAccountant/GridAccountant.csproj @@ -1,12 +1,12 @@ - net471;net48;netcoreapp3.1;net5.0;net6.0;net5.0-windows;net6.0-windows + net471;netcoreapp3.1;net5.0-windows;net6.0-windows - netcoreapp3.1;net5.0;net6.0 + net471;netcoreapp3.1;net5.0-linux;net6.0-linux - netcoreapp3.1;net5.0;net6.0 + net471;netcoreapp3.1;net5.0-osx;net6.0-osx GridAccountant From 369f2b4163c459dbd462c4698309241cc8bab6f7 Mon Sep 17 00:00:00 2001 From: Alex McArdle Date: Mon, 18 Apr 2022 00:02:37 -0500 Subject: [PATCH 17/29] Update global.json --- global.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global.json b/global.json index 4253be01..1b8195c4 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "6.0.202", - "rollForward": "latestMajor" + "version": "6.0.100", + "rollForward": "latestMinor" } -} \ No newline at end of file +} From 9dbedec389815ab95f37fbb38d617e06c0e2d5c0 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Mon, 18 Apr 2022 15:39:28 +0100 Subject: [PATCH 18/29] Chore: Adding CodeQL badge and merging upstream --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 77f95082..c26a2dbd 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ Microsoft is [dropping support for .NET 5.0](https://devblogs.microsoft.com/dotn [![Build status](https://ci.appveyor.com/api/projects/status/pga5w0qken2k2nnl?svg=true)](https://ci.appveyor.com/project/cinderblocks57647/libremetaverse-ksbcr) [![Test status](https://img.shields.io/appveyor/tests/cinderblocks57647/libremetaverse-ksbcr?compact_message&svg=true)](https://ci.appveyor.com/project/cinderblocks57647/libremetaverse-ksbcr) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/1cb97cd799c64ba49e2721f2ddda56ab)](https://www.codacy.com/gh/cinderblocks/libremetaverse/dashboard?utm_source=github.com&utm_medium=referral&utm_content=cinderblocks/libremetaverse&utm_campaign=Badge_Grade) +[![CodeQL](https://github.com/GwynethLlewelyn/libremetaverse/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/GwynethLlewelyn/libremetaverse/actions/workflows/codeql-analysis.yml) [![BSD Licensed](https://img.shields.io/github/license/cinderblocks/libremetaverse)](https://github.com/cinderblocks/libremetaverse/blob/master/LICENSE.txt) [![Commits per month](https://img.shields.io/github/commit-activity/m/cinderblocks/libremetaverse/master)](https://www.github.com/cinderblocks/libremetaverse/) [![ZEC](https://img.shields.io/keybase/zec/cinder)](https://keybase.io/cinder) [![BTC](https://img.shields.io/keybase/btc/cinder)](https://keybase.io/cinder) From 94349440fc4eb6ebceb829814ec89a1053602035 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Mon, 18 Apr 2022 16:41:14 +0100 Subject: [PATCH 19/29] CI: use dotnet.yml to see if this works On a different project, adding the dotnet.yml framework and specifying a version of .NET to run (6.0.X in this case) managed to get the automated scripts to finish with success. Let's see if the same 'magic' happens here. --- .github/workflows/dotnet.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/dotnet.yml diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml new file mode 100644 index 00000000..e8c12323 --- /dev/null +++ b/.github/workflows/dotnet.yml @@ -0,0 +1,25 @@ +name: .NET + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Setup .NET + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 6.0.x + - name: Restore dependencies + run: dotnet restore + - name: Build + run: dotnet build --no-restore + - name: Test + run: dotnet test --no-build --verbosity normal From 3f8bad89ab37f632765b3f92197263bf6975d737 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Mon, 18 Apr 2022 16:47:20 +0100 Subject: [PATCH 20/29] CI style fixes: spaces, NEVER tabs! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Due to an intermediate merger with upstream code, I lost my .editorconfig configuration; this meant that new YAML files were included with TABs, not the required spaces (arrrgh!!) and that required manual fixing, too. I also restored .editorconfig and tweaked it to guarantee uniformity in spaces/indents — this might be useful for others running editors/IDEs that comply with .editorconfig (and even GitHub will comply with the .editorconfig rules when editing files online!) --- .editorconfig | 12 +++++++++--- .github/workflows/dotnet.yml | 30 +++++++++++++++--------------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/.editorconfig b/.editorconfig index 93790e1f..29af8c97 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,14 +1,13 @@ # top-most EditorConfig file root = true -# Windows-style newlines with a newline ending every file -# Tab width seems to be 4 spaces, not 2 +# Unix-style newlines with a newline ending every file [*] end_of_line = lf charset = utf-8 indent_style = tab indent_size = tab -tab_width = 4 +tab_width = 2 trim_trailing_whitespace = true # The property below is not yet universally supported @@ -18,3 +17,10 @@ word_wrap = true # Markdown sometimes uses two spaces at the end to # mark soft line breaks trim_trailing_whitespace = false + +[*.yml] +end_of_line = lf +charset = utf-8 +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true \ No newline at end of file diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index e8c12323..cbe35f55 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -2,24 +2,24 @@ name: .NET on: push: - branches: [ master ] + branches: [ master ] pull_request: - branches: [ master ] + branches: [ master ] jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Setup .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 6.0.x - - name: Restore dependencies - run: dotnet restore - - name: Build - run: dotnet build --no-restore - - name: Test - run: dotnet test --no-build --verbosity normal + steps: + - uses: actions/checkout@v2 + - name: Setup .NET + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 6.0.x + - name: Restore dependencies + run: dotnet restore + - name: Build + run: dotnet build --no-restore + - name: Test + run: dotnet test --no-build --verbosity normal From a974932e7f40c0d2741070b070e4c3503553e290 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Mon, 18 Apr 2022 16:52:52 +0100 Subject: [PATCH 21/29] CI: resubmitting some files ... because I believe I deleted them on GitHub by mistake (although locally they were fine) --- .github/workflows/codeql-analysis.yml | 4 ++-- .github/workflows/dotnet.yml | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 8c905d85..4b35f456 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -73,7 +73,7 @@ jobs: dotnet build LibreMetaverse.Rendering.Meshmerizer/LibreMetaverse.Rendering.Meshmerizer.csproj dotnet build LibreMetaverse.Voice/LibreMetaverse.Voice.csproj dotnet build LibreMetaverse.Utilities/LibreMetaverse.Utilities.csproj - + - name: Build cross-platform example projects run: | dotnet build Programs/examples/IRCGateway/IRCGateway.csproj @@ -97,6 +97,6 @@ jobs: # run: | # dotnet build Programs/GridProxy/GridProxy.csproj # dotnet build Programs/GridProxy/GridProxyApp.csproj - + - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v1 diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index cbe35f55..5d35918f 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -1,3 +1,5 @@ +# A test workflow, which seems to get good results sometimes. +# (gwyneth 20220418) name: .NET on: From 226c7d9bd85058132e284943079c333e440476b5 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Mon, 18 Apr 2022 17:03:04 +0100 Subject: [PATCH 22/29] CI: for .NET, force using the ReleaseNoGui .sln Forcing using the LibreMetaverse.ReleaseNoGui.sln solution file --- .github/workflows/dotnet.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 5d35918f..2ef68a2c 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -22,6 +22,6 @@ jobs: - name: Restore dependencies run: dotnet restore - name: Build - run: dotnet build --no-restore + run: dotnet build --no-restore LibreMetaverse.ReleaseNoGui.sln - name: Test - run: dotnet test --no-build --verbosity normal + run: dotnet test --no-build --verbosity normal LibreMetaverse.ReleaseNoGui.sln From fe2992ef7a7bec12762b8859f47ff1e89143267e Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Mon, 18 Apr 2022 19:19:32 +0100 Subject: [PATCH 23/29] CI: reading the Microsoft docs When all else fails, RTFM... --- .github/workflows/dotnet.yml | 13 ++++++++++--- README.md | 3 ++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 2ef68a2c..598f0462 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -1,17 +1,24 @@ # A test workflow, which seems to get good results sometimes. # (gwyneth 20220418) +# See https://docs.microsoft.com/en-us/dotnet/devops/dotnet-test-github-action name: .NET on: push: - branches: [ master ] pull_request: branches: [ master ] + paths: + - '**.cs' + - '**.csproj' jobs: build: - runs-on: ubuntu-latest + name: dotnet-${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest] steps: - uses: actions/checkout@v2 @@ -20,7 +27,7 @@ jobs: with: dotnet-version: 6.0.x - name: Restore dependencies - run: dotnet restore + run: dotnet restore LibreMetaverse.ReleaseNoGui.sln - name: Build run: dotnet build --no-restore LibreMetaverse.ReleaseNoGui.sln - name: Test diff --git a/README.md b/README.md index c26a2dbd..3bc59be3 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,8 @@ Microsoft is [dropping support for .NET 5.0](https://devblogs.microsoft.com/dotn [![Build status](https://ci.appveyor.com/api/projects/status/pga5w0qken2k2nnl?svg=true)](https://ci.appveyor.com/project/cinderblocks57647/libremetaverse-ksbcr) [![Test status](https://img.shields.io/appveyor/tests/cinderblocks57647/libremetaverse-ksbcr?compact_message&svg=true)](https://ci.appveyor.com/project/cinderblocks57647/libremetaverse-ksbcr) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/1cb97cd799c64ba49e2721f2ddda56ab)](https://www.codacy.com/gh/cinderblocks/libremetaverse/dashboard?utm_source=github.com&utm_medium=referral&utm_content=cinderblocks/libremetaverse&utm_campaign=Badge_Grade) -[![CodeQL](https://github.com/GwynethLlewelyn/libremetaverse/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/GwynethLlewelyn/libremetaverse/actions/workflows/codeql-analysis.yml) +[![.NET](https://github.com/cinderblocks/libremetaverse/actions/workflows/dotnet.yml/badge.svg)](https://github.com/cinderblocks/libremetaverse/actions/workflows/dotnet.yml) +[![CodeQL](https://github.com/cinderblocks/libremetaverse/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/cinderblocks/libremetaverse/actions/workflows/codeql-analysis.yml) [![BSD Licensed](https://img.shields.io/github/license/cinderblocks/libremetaverse)](https://github.com/cinderblocks/libremetaverse/blob/master/LICENSE.txt) [![Commits per month](https://img.shields.io/github/commit-activity/m/cinderblocks/libremetaverse/master)](https://www.github.com/cinderblocks/libremetaverse/) [![ZEC](https://img.shields.io/keybase/zec/cinder)](https://keybase.io/cinder) [![BTC](https://img.shields.io/keybase/btc/cinder)](https://keybase.io/cinder) From 5c97f1ef324a04249dc7a752c1cf533623f3af2e Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Mon, 18 Apr 2022 20:29:29 +0100 Subject: [PATCH 24/29] CI: try to deal with testing framework MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I didn't even notice that there _was_ a testing framework, which uses a 'special' SL account to log in, etc. Sadly, the way the login information is passed to GitHub Actions is anything but obvious; as such, this will be my last experiment — I'll skip the testing part if this doesn't work. After all, AppVeyor will run all the tests properly... --- .github/workflows/dotnet.yml | 9 +++++++++ LibreMetaverse.Tests/LibreMetaverse.Tests.csproj | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 598f0462..53888a69 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -11,6 +11,11 @@ on: - '**.cs' - '**.csproj' +env: + # We'll stick to net6.0, as 5.0 seems not to work as well as it should + # - at least for testing purposes (gwyneth 20220418) + DOTNET_VERSION: '6.0.4' + jobs: build: @@ -32,3 +37,7 @@ jobs: run: dotnet build --no-restore LibreMetaverse.ReleaseNoGui.sln - name: Test run: dotnet test --no-build --verbosity normal LibreMetaverse.ReleaseNoGui.sln + env: + LMVTestAgentUsername: SecretAgentTest Resident + LMVTestAgentPassword: + secure: bOoXrGfLiHjZlCG1tJ+nDQ== diff --git a/LibreMetaverse.Tests/LibreMetaverse.Tests.csproj b/LibreMetaverse.Tests/LibreMetaverse.Tests.csproj index 5d5eb72a..16723d5f 100644 --- a/LibreMetaverse.Tests/LibreMetaverse.Tests.csproj +++ b/LibreMetaverse.Tests/LibreMetaverse.Tests.csproj @@ -1,7 +1,8 @@ LibreMetaverse.Tests - netcoreapp3.1;net5.0;net6.0 + + net6.0 Library LibreMetaverse.Tests true From e38e5b632e1efc238be329c9a8c9528f83f8dbc7 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Mon, 18 Apr 2022 20:32:27 +0100 Subject: [PATCH 25/29] CI: ok, let's try something different... Maybe GitHub Actions dislikes passing this weird base64-encoded password directly on the jobs?... We'll try to set it up above, to see what happens. --- .github/workflows/dotnet.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 53888a69..9a047b6d 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -15,6 +15,9 @@ env: # We'll stick to net6.0, as 5.0 seems not to work as well as it should # - at least for testing purposes (gwyneth 20220418) DOTNET_VERSION: '6.0.4' + LMVTestAgentUsername: SecretAgentTest Resident + LMVTestAgentPassword: + secure: bOoXrGfLiHjZlCG1tJ+nDQ== jobs: build: @@ -37,7 +40,4 @@ jobs: run: dotnet build --no-restore LibreMetaverse.ReleaseNoGui.sln - name: Test run: dotnet test --no-build --verbosity normal LibreMetaverse.ReleaseNoGui.sln - env: - LMVTestAgentUsername: SecretAgentTest Resident - LMVTestAgentPassword: - secure: bOoXrGfLiHjZlCG1tJ+nDQ== + From 00ffe907cb03309f462aa0a8237003fe46bb8658 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Mon, 18 Apr 2022 20:54:00 +0100 Subject: [PATCH 26/29] CI: giving up on GridClientTests Probably there is a better way of doing this. --- .github/workflows/dotnet.yml | 9 ++++----- LibreMetaverse.Tests/LibreMetaverse.Tests.csproj | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 9a047b6d..bb440220 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -15,9 +15,6 @@ env: # We'll stick to net6.0, as 5.0 seems not to work as well as it should # - at least for testing purposes (gwyneth 20220418) DOTNET_VERSION: '6.0.4' - LMVTestAgentUsername: SecretAgentTest Resident - LMVTestAgentPassword: - secure: bOoXrGfLiHjZlCG1tJ+nDQ== jobs: build: @@ -38,6 +35,8 @@ jobs: run: dotnet restore LibreMetaverse.ReleaseNoGui.sln - name: Build run: dotnet build --no-restore LibreMetaverse.ReleaseNoGui.sln - - name: Test - run: dotnet test --no-build --verbosity normal LibreMetaverse.ReleaseNoGui.sln +# I have no idea how to pass the avatar password for the GridClientTests, so I'll have to skip this +# or, alternatively, set up a different account for testing purposes (gwyneth 20220418) +# - name: Test +# run: dotnet test --no-build --verbosity normal LibreMetaverse.ReleaseNoGui.sln diff --git a/LibreMetaverse.Tests/LibreMetaverse.Tests.csproj b/LibreMetaverse.Tests/LibreMetaverse.Tests.csproj index 16723d5f..0d88b65a 100644 --- a/LibreMetaverse.Tests/LibreMetaverse.Tests.csproj +++ b/LibreMetaverse.Tests/LibreMetaverse.Tests.csproj @@ -1,8 +1,8 @@ LibreMetaverse.Tests - - net6.0 + netcoreapp3.1;net5.0;net6.0 + Library LibreMetaverse.Tests true From c37f58a1412f04a4ec59cd43aad9b164721116a7 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Mon, 18 Apr 2022 21:15:51 +0100 Subject: [PATCH 27/29] Fix: curly braces (Codacy) Ok, now it's Codacy complaining about a lot of things. This will require a _lot_ more work; there are a gazillion outstanding 'issues', most of which might be safe to ignore, others could improve performance and/or security, and a few are indeed critical and require being addressed... which is for another PR. --- LibreMetaverse.LslTools/Tools/ParserReduce.cs | 2 ++ LibreMetaverse.Types/Utils.cs | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/LibreMetaverse.LslTools/Tools/ParserReduce.cs b/LibreMetaverse.LslTools/Tools/ParserReduce.cs index e64f9825..1bebfbe1 100644 --- a/LibreMetaverse.LslTools/Tools/ParserReduce.cs +++ b/LibreMetaverse.LslTools/Tools/ParserReduce.cs @@ -73,7 +73,9 @@ namespace LibreMetaverse.LslTools Console.WriteLine("about to pop {0} count is {1}", (object) this.m_depth, (object) yyps.m_stack.Count); yyps.Pop(ref top, this.m_depth, ns); if (ns.pos == 0) + { ns.pos = top.m_value.pos; + } top.m_value = ns; } diff --git a/LibreMetaverse.Types/Utils.cs b/LibreMetaverse.Types/Utils.cs index 1f54b75a..d4e7431c 100644 --- a/LibreMetaverse.Types/Utils.cs +++ b/LibreMetaverse.Types/Utils.cs @@ -212,13 +212,19 @@ namespace OpenMetaverse double sSquared = s * s; if (amount == 0f) + { result = value1; + } else if (amount == 1f) + { result = value2; + } else + { result = (2d * v1 - 2d * v2 + t2 + t1) * sCubed + (3d * v2 - 3d * v1 - 2d * t1 - t2) * sSquared + t1 * s + v1; + } return (float)result; } @@ -431,7 +437,7 @@ namespace OpenMetaverse { return Platform.Windows; } - return System.IO.File.Exists(OSX_CHECK_FILE) + return System.IO.File.Exists(OSX_CHECK_FILE) ? Platform.OSX : Platform.Linux; } From b3370d45258845649e4946edb5f50a6cc3787d12 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Mon, 18 Apr 2022 21:30:49 +0100 Subject: [PATCH 28/29] Fix: ToString() redundant I was pretty sure I had already fixed this! --- LibreMetaverse/Capabilities/EventQueueClient.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LibreMetaverse/Capabilities/EventQueueClient.cs b/LibreMetaverse/Capabilities/EventQueueClient.cs index 35abdf16..fcd58092 100644 --- a/LibreMetaverse/Capabilities/EventQueueClient.cs +++ b/LibreMetaverse/Capabilities/EventQueueClient.cs @@ -181,8 +181,8 @@ namespace OpenMetaverse.Http { Logger.Log(" Extra details:", Helpers.LogLevel.Warning); foreach (DictionaryEntry de in error.Data) - Logger.Log(String.Format(" Key: {0,-20} Value: {1}", - "'" + de.Key.ToString() + "'", de.Value), + Logger.Log(String.Format(" Key: {0,-20} Value: '{1}'", + de.Key, de.Value), Helpers.LogLevel.Warning); } // but we'll nevertheless close this connection (gwyneth 20220414) From 1fa28615c365d9c07d6921176b3bd27bb600adcf Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Mon, 18 Apr 2022 21:34:48 +0100 Subject: [PATCH 29/29] Fix: Codacy complains about headers I _also_ thought this had been fixed; but Codacy is _still_ bothering me with the details. Note: my local `remark` currently doesn't complain about any other issues, so I'm re-submitting, to see if Codacy's `remark` still finds any excuse for complaining... --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 3bc59be3..74b96e0b 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ | | | '_ \ '_/ -_) |\/| | _| | |/ _ \ V /| _|| /\__ \ _| |_|_|_.__/_| \___|_| |_|___| |_/_/ \_\_/ |___|_|_\|___/___| ``` -LibreMetaverse -=============================================================================== +# LibreMetaverse + LibreMetaverse is a fork of libOpenMetaverse which in turn was a fork of libSecondLife, a library for developing Second Life-compatible virtual world clients. LibreMetaverse returns the focus to up-to-date Second Life and OpenSim @@ -14,9 +14,9 @@ compatibility with an eye to performance, multi-threading, and memory management The canonical source for LibreMetaverse can be found at: https://github.com/cinderblocks/libremetaverse -# Simple installation procedure +## Simple installation procedure -## Linux/macOS +### Linux/macOS - Make sure you have at least `dotnet` installed, with a valid net5.0/net6.0 SDK _and_ runtime available! @@ -31,15 +31,15 @@ If all goes well, you should now have all dependent packages properly installed. - Unlike OpenSimulator, you don't need to launch the binaries with Mono, they're _directly_ executable; the `dotnet` chain already embeds the small runtime that allows .NET apps to run natively on whatever operating system you've got. -## Windows +### Windows For Windows, you should use the default `LibreMetaverse.sln`, just as before (untested). For command-line compilation under Windows, if you wish to skip the GUI applications, the instructions are the same as above. Use the default `LibreMetaverse.sln` if you wish to install those as well. -## GUI support under Linux/macOS +### GUI support under Linux/macOS Currently unavailable, although there are some reports that this might be possible using a Windows emulator, such as Mono itself, or possibly Wine. This will require some project configuration changes, and was _not_ tested! -# Note: end-of-life support for .NET 5.0 +## Note: end-of-life support for .NET 5.0 Microsoft is [dropping support for .NET 5.0](https://devblogs.microsoft.com/dotnet/dotnet-5-end-of-support-update/) as of May 2022, so you should consider using .NET 6.0 instead (or, if you're wild, you can test the prerelease of .NET 7.0). The code runs flawlessly on .NET 6.0 as well (Windows GUI version untested)